<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Margrop Blog</title>
    <link>https://blog.margrop.net/en/</link>
    <description>Recent content on Margrop Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <lastBuildDate>Tue, 21 Jul 2026 07:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/en/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Open Specific Ports on Ubuntu 22.04 with UFW or iptables</title>
      <link>https://blog.margrop.net/en/post/ubuntu-add-port-filter-using-iptables/</link>
      <pubDate>Sun, 26 Feb 2023 20:04:53 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-add-port-filter-using-iptables/</guid>
      <description>&lt;h1 id=&#34;add-firewall-rules-on-ubuntu-2204&#34;&gt;Add firewall rules on Ubuntu 22.04&lt;/h1&gt;&#xA;&lt;h2 id=&#34;check-firewall-status&#34;&gt;Check firewall status&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ufw status&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;open-port-22&#34;&gt;Open port 22&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ufw allow 22&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;check-firewall-status-again&#34;&gt;Check firewall status again&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ufw status&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Proxmox VE 9.0 Daily Maintenance: Remove the No-Subscription Notice and Use China Mirrors (Updated 2025-08-06)</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-daily-maintain/</link>
      <pubDate>Sun, 26 Feb 2023 20:00:19 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-daily-maintain/</guid>
      <description>&lt;p&gt;This article collects the most common maintenance tasks for PVE 6.x / 7.x / 8.x / 9.x and fixes duplicated sections and obvious errors from older revisions.&lt;/p&gt;&#xA;&lt;p&gt;Check the current version first, then follow the instructions that match that version. Do not mix repository settings across different PVE releases.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pveversion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>China&#39;s Coding Plan Shake-Up: GLM Is Unavailable, Kimi Is Closed—What Is Still Worth Buying?</title>
      <link>https://blog.margrop.net/en/post/domestic-coding-plan-2026/</link>
      <pubDate>Tue, 21 Jul 2026 07:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/domestic-coding-plan-2026/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Domestic Coding Plan hero&#34; src=&#34;https://blog.margrop.net/post-images/domestic-coding-plan-2026/hero.svg&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; as of &lt;strong&gt;July 20, 2026&lt;/strong&gt;, the market has split sharply: GLM is a timed, limited flash sale that is practically impossible to buy; Kimi has closed the current membership subscription entry; MiniMax TokenPlan is currently buyable without a purchase cap but delivers a weaker coding experience than scarce plans; Qwen AI has just launched qwen3.8, is currently open with usage discounts, and is one of the better choices to try now, although future restrictions remain possible; Volcengine Ark CodingPlan/AgentPlan are limited but still obtainable in some cases.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Can You Still Buy a Coding Plan? A July 2026 Reality Check on Limits, Quotas, and Lockouts</title>
      <link>https://blog.margrop.net/en/post/coding-plan-market-2026/</link>
      <pubDate>Mon, 20 Jul 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/coding-plan-market-2026/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Coding Plan hero&#34; src=&#34;https://blog.margrop.net/post-images/coding-plan-market-2026/hero.svg&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; as of &lt;strong&gt;July 20, 2026&lt;/strong&gt;, most mainstream AI coding plans are still purchasable. The confusing part is that “available to buy,” “available in my region,” and “available for heavy coding” are no longer the same statement. Some products have a live checkout but tight quotas; others are visible in marketing pages but not offered to every account; some individual coding experiences have been paused or reshaped during product transitions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>How Did AI Learn to Use Its Hands? From Chatting to Checking, Writing, and Acting</title>
      <link>https://blog.margrop.net/en/post/ai-tool-calling-mcp/</link>
      <pubDate>Sun, 19 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-tool-calling-mcp/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AI did not suddenly grow hands. It learned a very practical loop: &lt;strong&gt;decide which tool is needed, request that tool with structured arguments, wait for a real result, and then explain the result in human language.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is usually called &lt;strong&gt;Tool Calling&lt;/strong&gt;. You may also see Function Calling or a Tools API. MCP, the Model Context Protocol, is closer to a universal socket: different AI applications can discover and call files, databases, search engines, ticket systems, browsers, and other capabilities through a common protocol.&lt;/p&gt;&#xA;&lt;p&gt;This article opens the loop and examines every moving part: what the model does, who actually performs the action, why MCP matters, where permissions belong, and why “can call a tool” does not mean “should receive the keys to everything.” Screenshots come from official OpenAI and MCP pages; the terminal-style evidence images are generated from the real invocation flow. No real private network address or hostname is included.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Installing Another PC Cleaner: What Desktop Software Can an AI Agent Actually Replace?</title>
      <link>https://blog.margrop.net/en/post/ai-agent-replace-desktop-software/</link>
      <pubDate>Sun, 19 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-agent-replace-desktop-software/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;An AI Agent can replace many desktop utilities whose main job is clicking the same buttons over and over. It does not turn every application into a chat box, and it is not a magical “computer doctor.” Its real advantage is orchestration: it can inspect the machine, understand the goal, combine built-in tools, execute a sequence, and explain the evidence.&lt;/p&gt;&#xA;&lt;p&gt;Across five categories—file conversion, junk scanning, performance optimization, configuration changes, and computer repair—the replacement level is different. File conversion and reporting are highly automatable. Performance work and configuration changes are semi-automatic. Hardware repair remains a human job, with the Agent acting as a diagnostic assistant.&lt;/p&gt;&#xA;&lt;p&gt;The safety rule for every script in this article is simple: &lt;strong&gt;read first, write second; back up first, change second; verify before claiming success.&lt;/strong&gt; All three scripts are local-only and start in report mode. Destructive actions require an explicit flag and a second confirmation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Why Does AI Lie So Confidently? — It Is Not Thinking, It Is Playing Supercharged Word Association</title>
      <link>https://blog.margrop.net/en/post/ai-hallucination-super-chengyu/</link>
      <pubDate>Sun, 19 Jul 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-hallucination-super-chengyu/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AI hallucination is not simply an occasional bug. It is a predictable risk of a system whose basic job is to generate the next likely token from context. The model can produce a fluent, confident, highly structured answer without having verified that every claim is supported by evidence.&lt;/p&gt;&#xA;&lt;p&gt;The easiest analogy is this: &lt;strong&gt;a large language model is a supercharged word-association player. It is exceptionally good at continuing a sentence. It is not automatically a fact-checker.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Why Does AI Keep Saying ‘I Forgot’? Tokens, Context Windows, and the Sticky Notes It Must Throw Away</title>
      <link>https://blog.margrop.net/en/post/ai-token-context-window-sticky-notes/</link>
      <pubDate>Sun, 19 Jul 2026 18:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-token-context-window-sticky-notes/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AI often appears to have a bad memory because only a limited amount of material can be carried into the model for the current request. Think of a context window as a stack of sticky notes with finite capacity. New questions and tool outputs keep adding notes. Once the stack is full, the system must summarize, truncate, filter, or remove older notes. If a note is removed from the current context, the model may no longer be able to use it.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Have you ever told an AI, “Use Python for every code example,” only to receive JavaScript fifteen turns later? Or supplied a long document that the model can summarize accurately at the beginning and end, but cannot answer about the important restriction buried in the middle?&lt;/p&gt;&#xA;&lt;p&gt;It is tempting to say that the AI “forgot.” A more precise explanation is this: &lt;strong&gt;the model can only see what fits inside the current context window, and seeing a piece of text does not guarantee that every part of it receives equal attention.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This article explains tokens and context windows without turning them into intimidating mathematics. The main analogy is a stack of sticky notes. We will look at what tokens are, how a request is assembled, why long conversations become unreliable, why agents fill their context quickly, and how to make AI forget less through simple information management.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TCP Ruled for 40 Years. Why Did HTTP/3 “Dump” It?</title>
      <link>https://blog.margrop.net/en/post/why-http3-ditched-tcp-quic/</link>
      <pubDate>Sat, 18 Jul 2026 19:40:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/why-http3-ditched-tcp-quic/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s fact-check the title first: TCP has &lt;em&gt;not&lt;/em&gt; been abandoned — file downloads, video, email, and SSH still run on it today. But the &lt;strong&gt;Web really did change drivers&lt;/strong&gt;: in June 2022, HTTP/3 became an official standard (RFC 9114), and it no longer uses TCP — web traffic is handed to QUIC, running over UDP.&lt;/p&gt;&#xA;&lt;p&gt;TCP got &amp;ldquo;replaced&amp;rdquo; because of three incurable midlife conditions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Head-of-line blocking&lt;/strong&gt;: TCP is a byte stream that must be delivered in order — lose one parcel, and every parcel behind it stands at attention;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Expensive handshakes&lt;/strong&gt;: before any data flows, 2-3 round trips of &amp;ldquo;small talk&amp;rdquo; (TCP handshake + TLS handshake) — half a second gone on intercontinental links;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;A protocol welded shut&lt;/strong&gt;: TCP lives inside the OS kernel, and middleboxes only recognize the &amp;ldquo;classic model&amp;rdquo; — improving it is nearly impossible.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;QUIC&amp;rsquo;s fix is beautifully blunt: &lt;strong&gt;rebuild all of TCP&amp;rsquo;s wisdom on top of UDP, where nobody interferes.&lt;/strong&gt; This is the finale of our networking trilogy — part one covered &lt;em&gt;how to use the network&lt;/em&gt;, part two &lt;em&gt;why TCP/IP was designed so well&lt;/em&gt;, and this one &lt;em&gt;how even the mighty TCP got replaced by its own heirs&lt;/em&gt;. All screenshots come from real systems; IPs and hostnames are masked.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>A 1974 Design Still Rules the Internet. Why? The 6 Design Philosophies of TCP/IP</title>
      <link>https://blog.margrop.net/en/post/tcpip-design-philosophy/</link>
      <pubDate>Sat, 18 Jul 2026 09:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/tcpip-design-philosophy/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;TCP/IP is almost 50 years old. Every one of its rivals — the phone companies&amp;rsquo; X.25, IBM&amp;rsquo;s SNA, the standards body&amp;rsquo;s OSI — is in a museum, yet it still carries every page you load today. It didn&amp;rsquo;t win by being the most advanced. It won through six design choices:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Packet switching&lt;/strong&gt;: no private trains — everyone shares the highway. Cheap, and hard to kill;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layering&lt;/strong&gt;: each layer does one job and can be swapped out like a LEGO brick;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The end-to-end principle&lt;/strong&gt;: keep the network dumb and put the smarts at the edges — so innovation never requires rewiring the network;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Best effort&lt;/strong&gt;: the core promises nothing, reliability is bought à la carte — simple scales globally;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rough consensus and running code&lt;/strong&gt;: no kings, no voting — standards grow by working, not by decree;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Room for the future&lt;/strong&gt;: from IPv4 to IPv6, from HTTP/1 to HTTP/3 — the foundation stays while everything above is rebuilt.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;One sentence: &lt;strong&gt;good design doesn&amp;rsquo;t predict the future; it leaves room for it.&lt;/strong&gt; This is the companion piece to &lt;em&gt;Why Is Your WiFi Lagging?&lt;/em&gt; — that article explained &lt;em&gt;what&lt;/em&gt; the network is and how to use it; this one explains &lt;em&gt;why&lt;/em&gt; it was designed this way and how it survived half a century. All screenshots come from real systems and real protocol documents; IPs and hostnames are masked.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Why Is Your WiFi Lagging? Networks, TCP vs UDP, and the Two “5Gs” — Explained So a Kid Gets It</title>
      <link>https://blog.margrop.net/en/post/network-basics-tcp-udp-wifi-5g/</link>
      <pubDate>Sat, 18 Jul 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/network-basics-tcp-udp-wifi-5g/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A &lt;strong&gt;network&lt;/strong&gt; is a delivery service for computers: data is chopped into &amp;ldquo;parcels&amp;rdquo; (packets), labeled with &amp;ldquo;addresses&amp;rdquo; (IPs), and relayed by &amp;ldquo;sorting centers&amp;rdquo; (routers) hop by hop to the recipient.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TCP is a phone call&lt;/strong&gt;: connect first, talk later, repeat anything that wasn&amp;rsquo;t heard — reliable but fussy. &lt;strong&gt;UDP is a postcard&lt;/strong&gt;: drop it in the mailbox and hope — fast, but no delivery guarantee. Live video and games prefer UDP; files and web pages prefer TCP.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;strong&gt;three-way handshake&lt;/strong&gt; is just the opening of a phone call: &amp;ldquo;Hello, can you hear me?&amp;rdquo; — &amp;ldquo;I can. Can you hear me?&amp;rdquo; — &amp;ldquo;I can too. Let&amp;rsquo;s talk.&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Wired&lt;/strong&gt; is a private water pipe; &lt;strong&gt;WiFi&lt;/strong&gt; is shouting in a crowded square — when everyone shouts at once, nobody is heard clearly. That is the number-one reason WiFi lags.&lt;/li&gt;&#xA;&lt;li&gt;WiFi&amp;rsquo;s &amp;ldquo;5G&amp;rdquo; means the &lt;strong&gt;5GHz frequency band&lt;/strong&gt; (a wider lane). Your phone carrier&amp;rsquo;s &amp;ldquo;5G&amp;rdquo; means the &lt;strong&gt;5th generation&lt;/strong&gt; of mobile networks (a whole standard). They share a name and nothing else.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;No jargon without an everyday analogy, but every number below comes from real measurements on real machines (all IPs and hostnames are masked). A kid can follow most of it; an adult won&amp;rsquo;t find it shallow.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker Pulls Keep Timing Out? How to Choose, Configure, and Verify Chinese Registry Mirrors</title>
      <link>https://blog.margrop.net/en/post/docker-mirror-source-selection-guide/</link>
      <pubDate>Wed, 15 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-mirror-source-selection-guide/</guid>
      <description>The short answer&#xA;When Docker image pulls fail on a mainland China network, the image is not necessarily missing and DNS is not always the culprit. More often, the public registry path is congested, a mirror is temporarily unavailable, or the configuration was edited but Docker was never restarted.&#xA;My practical recommendation is simple: open status.anye.xyz first and treat it as a “weather report” for Docker mirrors; select a recently healthy HTTPS endpoint; edit the correct daemon configuration for your operating system; validate the JSON; restart Docker; and finally verify with a real pull of a small image.</description>
    </item>
    <item>
      <title>Superpowers 6: What Actually Changed, and Why Your Agent Got Harder to Fool</title>
      <link>https://blog.margrop.net/en/post/superpowers-6-whats-new/</link>
      <pubDate>Mon, 13 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/superpowers-6-whats-new/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you already write code with Claude Code, OpenCode, or Codex, you have probably heard of Superpowers. It is not another &amp;ldquo;magic prompt.&amp;rdquo; It is a skill framework that makes your agent &lt;strong&gt;work by process&lt;/strong&gt; — turning the habits of a good engineer (&amp;ldquo;think before you act&amp;rdquo;, &amp;ldquo;write the test before the code&amp;rdquo;, &amp;ldquo;collect evidence before fixing the bug&amp;rdquo;) into operating procedures the agent must follow.&lt;/p&gt;&#xA;&lt;p&gt;From v6.0.0 to the latest v6.1.1, Superpowers shipped a dense run of upgrades: &lt;strong&gt;Subagent-Driven Development (SDD) lost half its reviewers but got stricter; plans gained a Global Constraints block and per-task Interfaces; the brainstorming companion got a one-time key; Codex can install from the marketplace; and Gemini CLI was dropped after Google EOLed it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This article unpacks the wave, what you actually get, and why it makes your agent&amp;rsquo;s output steadier.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Four Hard Resets in One Weekend—and Two Cards: When Tokens Stop Being Scarce, What Are We Actually Missing?</title>
      <link>https://blog.margrop.net/en/post/codex-four-resets-token-abundance-creativity/</link>
      <pubDate>Mon, 13 Jul 2026 07:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/codex-four-resets-token-abundance-creativity/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Codex users spent the weekend inside a restaurant that would not stop refilling the buffet. There was one hard quota reset early Friday morning Beijing time, two more on Saturday, and another waiting on Monday morning. A bankable reset card also appeared. As Tibo celebrated Codex reaching six million active users, he previewed another card for everyone the following day.&lt;/p&gt;&#xA;&lt;p&gt;At the same time, the &lt;strong&gt;five-hour limit was temporarily removed for Codex subscribers, leaving only the weekly limit&lt;/strong&gt;. I also had a substantial pool of GLM-5.2 quota expiring on Sunday. The old problem was saving tokens. The new problem was stranger: &lt;strong&gt;how do I spend them on work that deserves them?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After a weekend that felt busy, surprising, and slightly absurd, my conclusion is simple: the scarce resource in the AI era may not be tokens. It may be worthwhile questions, distinctive ideas, and the ability to turn those ideas into reality quickly.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Running rsync Blindly: Preview Differences Before a Safe Incremental Sync</title>
      <link>https://blog.margrop.net/en/post/rsync-diff-incremental-sync/</link>
      <pubDate>Sat, 11 Jul 2026 13:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/rsync-diff-incremental-sync/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The best rsync habit is not memorizing more switches. It is separating every risky job into two stages: &lt;strong&gt;generate a dry-run plan first, review it, and only then perform the real incremental sync&lt;/strong&gt;. Deletion should be a separate, explicit permission rather than a hidden default.&lt;/p&gt;&#xA;&lt;p&gt;The common &lt;code&gt;rsync -n -avz --delete --out-format=&amp;quot;%n&amp;quot;&lt;/code&gt; pattern can list paths that may change, but &lt;code&gt;%n&lt;/code&gt; only preserves the name. A safer machine-readable plan uses &lt;code&gt;--itemize-changes&lt;/code&gt; together with &lt;code&gt;%i&lt;/code&gt;, so each line identifies an addition, update, deletion, or metadata change.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>You Bought an Overseas VPS and a Domain. Now What? 12 Things That Make a Public IP Worth Owning</title>
      <link>https://blog.margrop.net/en/post/vps-domain-personal-internet-infrastructure/</link>
      <pubDate>Sat, 11 Jul 2026 13:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/vps-domain-personal-internet-infrastructure/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;An overseas VPS by itself is a powered, connected room without a memorable street address. A top-level domain by itself is only a sign. Put the domain on Cloudflare DNS and point carefully chosen records at the VPS, and you finally own the sign, the map, the storefront, and a standards-based public entrance.&lt;/p&gt;&#xA;&lt;p&gt;The result is much more useful than “a place to host a blog.” It is a small, always-on piece of Internet infrastructure where you control the code and the migration path: websites, APIs, webhooks, status pages, monitoring, controlled file sharing, password management, remote-access relays, automation jobs, and a personal AI gateway can all grow from the same foundation.&lt;/p&gt;&#xA;&lt;p&gt;A public IP is also a door facing a busy street. Automated scanners may try the handle shortly after the server appears. This guide therefore covers both the useful projects and the services that should never be exposed directly.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>RAID Is Not Backup: How to Choose the Right NAS Layout for Synology, fnOS, and Unraid</title>
      <link>https://blog.margrop.net/en/post/nas-raid-selection-guide/</link>
      <pubDate>Sat, 11 Jul 2026 12:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/nas-raid-selection-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RAID primarily keeps a NAS available when one or more drives fail. Backup restores data after deletion, ransomware, filesystem damage, theft, fire, or a failed NAS. You normally need both.&lt;/p&gt;&#xA;&lt;p&gt;On Synology, SHR-1 is the practical default for many homes, while larger and more critical arrays deserve SHR-2 consideration. On fnOS, choose the filesystem, storage mode, drive count, and backup destination as one design. On Unraid, understand that the classic Array is not a conventional striped RAID: data disks keep independent filesystems while one or two parity disks provide failure recovery.&lt;/p&gt;&#xA;&lt;p&gt;A useful starting rule is: mirror two-drive systems; use single-drive redundancy when capacity matters and a separate backup exists; seriously consider dual-drive redundancy as drive count and individual drive capacity grow. Anything irreplaceable still needs an offline or off-site copy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Letting AI Guess: Connect MySQL, Prometheus, Loki and Grafana to an Agent, Step by Step</title>
      <link>https://blog.margrop.net/en/post/mysql-prometheus-loki-grafana-ai-agent-hands-on/</link>
      <pubDate>Sat, 11 Jul 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mysql-prometheus-loki-grafana-ai-agent-hands-on/</guid>
      <description>Many teams already run MySQL, Prometheus, Loki and Grafana. Yet when an alert fires, the on-call engineer still jumps between four windows: inspect a dashboard, write a PromQL query, search logs for a trace ID, and finally connect to the database to confirm the business record.&#xA;It is like a hospital that owns a thermometer, medical records, laboratory reports and a monitoring wall, while the doctor still has to visit four rooms and copy every number by hand.</description>
    </item>
    <item>
      <title>The Password Was Right—So Why Did Synology Reject It? Rebuilding DSM’s RSA &#43; AES WebAPI Login</title>
      <link>https://blog.margrop.net/en/post/synology-webapi-login-encryption-deep-dive/</link>
      <pubDate>Sat, 11 Jul 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-webapi-login-encryption-deep-dive/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Some Synology WebAPI clients do more than post &lt;code&gt;account&lt;/code&gt; and &lt;code&gt;passwd&lt;/code&gt; to &lt;code&gt;auth.cgi&lt;/code&gt;. The implementation preserved in OpenStack Cinder first calls &lt;code&gt;SYNO.API.Encryption.getinfo&lt;/code&gt;, receives an RSA public modulus, server time, and two dynamic field names, then generates a one-use passphrase. RSA PKCS#1 v1.5 encrypts that passphrase; an OpenSSL-compatible AES-256-CBC envelope encrypts the URL-encoded login parameters; both Base64 values are finally placed inside the server-provided &lt;code&gt;cipherkey&lt;/code&gt; field.&lt;/p&gt;&#xA;&lt;p&gt;This is an authorized WebAPI compatibility technique—not a password bypass. A SID for &lt;code&gt;session=DSM&lt;/code&gt; is also not automatically the same thing as a complete browser UI login state. Parameter encryption does not replace HTTPS, because TLS still authenticates the server and protects integrity against an active intermediary.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Original cover: an RSA outer envelope and AES inner envelope protect a NAS login&#34; src=&#34;https://blog.margrop.net/post-images/synology-webapi-login-encryption-deep-dive/00-cover-original.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t Let Your Mac mini Gather Dust: Run Agents 24/7 from Windows</title>
      <link>https://blog.margrop.net/en/post/windows-remote-desktop-mac-realvnc/</link>
      <pubDate>Sat, 11 Jul 2026 04:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-remote-desktop-mac-realvnc/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If Windows is your everyday platform but a low-power Mac mini stays on to run OpenClaw, HermesAgent, or macOS-only automation, you do not need to dedicate another monitor, keyboard, and mouse to it. Treat the Mac mini as a quiet Agent server. macOS already includes Screen Sharing, and RealVNC Viewer on Windows can take over the desktop whenever configuration, upgrades, or troubleshooting require a GUI.&lt;/p&gt;&#xA;&lt;p&gt;This is especially useful in a Windows-first home or studio where the Mac mini runs continuously at relatively low power while the Windows machines remain the daily workstations. The installation is rarely the difficult part. Most failures come from Screen Sharing, user authorization, VNC credentials, network reachability, sleep behavior, or services that do not recover after a restart.&lt;/p&gt;&#xA;&lt;p&gt;One rule matters more than every convenience tweak in this guide: &lt;strong&gt;do not expose TCP port 5900 directly to the public Internet.&lt;/strong&gt; A same-LAN connection is the simplest starting point. For access across networks, first join a self-hosted VPN or another controlled private network, and only then connect to the Mac.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Reading Logs by Hand: A Practical ELK-to-AI-Agent Guide from Deployment to Assisted Troubleshooting</title>
      <link>https://blog.margrop.net/en/post/elk-ai-agent-hands-on/</link>
      <pubDate>Sat, 11 Jul 2026 03:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/elk-ai-agent-hands-on/</guid>
      <description>The traditional incident-response ritual is familiar: open Kibana, choose a time range, write a query, scan pages of logs, copy a few stack traces, and manually assemble a theory. Once several services are involved, the job feels like finding one screw in a warehouse with no clerk.&#xA;A better design keeps ELK responsible for dependable ingestion, normalization, search, and visualization, then adds an MCP bridge that lets an AI Agent retrieve evidence through tools.</description>
    </item>
    <item>
      <title>Couldn’t Get the GLM Coding Plan? Volcengine’s ¥9.9 Offer Can Drop to About ¥9.4 with an Invitation</title>
      <link>https://blog.margrop.net/en/post/volcengine-coding-plan-9-9-glm-5-2/</link>
      <pubDate>Sat, 11 Jul 2026 03:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/volcengine-coding-plan-9-9-glm-5-2/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If the GLM Coding Plan is unavailable when you need it, refreshing the purchase page is not your only option. Volcengine Ark currently advertises the Coding Plan Lite subscription at &lt;strong&gt;¥9.9 per month for the first two months&lt;/strong&gt;. The same page lists a regular monthly price of ¥40, making the introductory price roughly &lt;strong&gt;25% of the regular price&lt;/strong&gt;, or “2.5 zhe” in Chinese discount terminology. The plan page also lists &lt;strong&gt;GLM-5.2&lt;/strong&gt; and says selected popular models receive a temporary four-times quota boost.&lt;/p&gt;&#xA;&lt;p&gt;Read the fine print before buying: ¥9.9 is not a permanent price, the third month returns to the displayed ¥40 monthly rate, and Coding Plan quota is intended for supported coding tools rather than arbitrary general-purpose API traffic. This article and its screenshots were prepared on July 11, 2026. The official campaign page displayed an end date of August 7, 2026; always trust the live checkout page if the rules change.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Clicking Through VMs: A Hands-On Guide to Connecting Proxmox VE to an AI Agent Safely</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-ai-agent-guide/</link>
      <pubDate>Sat, 11 Jul 2026 02:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-ai-agent-guide/</guid>
      <description>Connecting an AI agent to Proxmox VE sounds like giving a robot administrator the keys to your datacenter. That is exactly what you should not do. The safe starting point is a dedicated, revocable, read-only API token, a locally running MCP server, and a clear approval boundary for every write operation. This guide explains the architecture, shows manual and agent-assisted setup, and provides one-click installers for Windows 11, Ubuntu 26.</description>
    </item>
    <item>
      <title>Take Back Your Remote Desktop: Deploying an All-in-One RustDesk Server Safely</title>
      <link>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</link>
      <pubDate>Fri, 10 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RustDesk is an open-source remote desktop application designed with self-hosting in mind. When two clients can reach each other directly, screen and input traffic can use a peer-to-peer path. When that direct path fails, a relay server forwards the encrypted traffic. Hosting the server yourself does not eliminate servers; it puts device registration, relay routing, keys, accounts, and logs back under your control.&lt;/p&gt;&#xA;&lt;p&gt;This guide uses the community-maintained &lt;code&gt;lejianwen/rustdesk-server-s6&lt;/code&gt; image to place the RustDesk OSS &lt;code&gt;hbbs&lt;/code&gt; and &lt;code&gt;hbbr&lt;/code&gt; services together with a community API and web administration layer in one container. It is a convenient option for homes, labs, and small teams, but it is &lt;strong&gt;not an official RustDesk all-in-one distribution&lt;/strong&gt;. Evaluate the community image, pin a tested tag or digest, back up its persistent data, and rehearse upgrades and rollbacks before treating it as production infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;Every address in this article uses &lt;code&gt;example.com&lt;/code&gt;. No real IP address, private domain, hostname, device ID, account, key, token, cookie, or private registry is shown. The screenshots come from public official or community project pages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>I Put Docker in a Control Room: Portainer CE 2.39.4 Deployment, Daily Use, and Real Traps</title>
      <link>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Portainer does not replace Docker. It is a control room for a Docker host. Docker Engine remains the machinery; Portainer organizes containers, images, networks, volumes, and Compose stacks into a web dashboard.&lt;/p&gt;&#xA;&lt;p&gt;I ran an isolated deployment of &lt;code&gt;portainer/portainer-ce:2.39.4&lt;/code&gt;, initialized it, connected the local Docker environment, inspected the dashboard, filtered a disposable container, and created a demonstration stack. The installation is one &lt;code&gt;docker run&lt;/code&gt; command. The important lessons are broader: persist &lt;code&gt;/data&lt;/code&gt;, understand that &lt;code&gt;/var/run/docker.sock&lt;/code&gt; is highly privileged, and never expose the management interface to an untrusted network without protection.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no complete IP address, real host name, private domain, administrator password, token, cookie, private registry address, or production container name. The screenshots use disposable names, and the container address is redacted.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Sprinkling API Keys Everywhere: My Self-Hosted NewAPI Relay Station</title>
      <link>https://blog.margrop.net/en/post/newapi-self-hosted-relay-station/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/newapi-self-hosted-relay-station/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;NewAPI is not a free-model trick and it is not a mysterious proxy. In my setup, it is the front desk for AI usage: every app talks to one endpoint, while the gateway routes requests to authorized upstream providers and handles tokens, quotas, groups, model limits, logs, and usage accounting. For a personal deployment, the big win is not “one more dashboard”; it is no longer scattering upstream keys across every client, script, and agent.&lt;/p&gt;&#xA;&lt;p&gt;This post explains why I wanted a self-hosted model relay, what people usually misunderstand, how to deploy a minimal Docker Compose version, why I add persistent storage, and how to use one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. It also includes an agent-driven setup prompt with strict boundaries. No private address, complete machine name, private domain, or real secret is included.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Self-Hosted Web Clipboard I Kept Is Just One Text Box</title>
      <link>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After trying many cross-device clipboard and note tools, the one I kept for personal use is almost embarrassingly small: &lt;code&gt;minimalist-web-notepad&lt;/code&gt;. When you open it, there is essentially one text box. It supports plain text only. There is no account system, no rich text editor, no image upload, no folder tree, no dashboard, and no collaboration layer.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly why it works as a lightweight self-hosted web clipboard. It is good for moving a short command from one device to another, dropping a temporary note into a browser, reading or writing a tiny text value with &lt;code&gt;curl&lt;/code&gt;, or keeping a disposable piece of text for a few minutes. It is not a knowledge base. It is not a password vault. It is a piece of scratch paper on the network.&lt;/p&gt;&#xA;&lt;p&gt;This post uses the &lt;code&gt;ahfeil/minimalist-web-notepad:latest&lt;/code&gt; image with Docker Compose. It also includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus two operating modes: manual automatic execution and agent-driven configuration. No private network address, private domain, full machine name, or real secret is shown in this article.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>One Missing operator.write Took Down the Gateway: The OpenClaw Fallback Failure That Wasn&#39;t a Model Problem</title>
      <link>https://blog.margrop.net/en/post/openclaw-missing-operator-write-scope/</link>
      <pubDate>Fri, 10 Jul 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-missing-operator-write-scope/</guid>
      <description>&lt;p&gt;This incident looked like a model-provider outage at first. OpenClaw had just received three NewAPI-backed fallback models, but gateway-based model calls started failing with a provider authentication error. After peeling back the outer message, the real error was much more specific:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;missing scope: operator.write&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That string changed the direction of the investigation. The provider key was not the root problem. The NewAPI endpoint was not the root problem. The model names were not the root problem either. The failure lived inside OpenClaw&amp;rsquo;s gateway authorization path: when a model override was used, the gateway call switched into a backend/gateway-client mode, but did not force the request to use the already paired stored device identity. The device had &lt;code&gt;operator.write&lt;/code&gt;; the request simply did not carry the identity that could prove it.&lt;/p&gt;&#xA;&lt;p&gt;The shortest version is this: &lt;strong&gt;the badge existed, but this entrance did not scan it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;AI-generated cover showing a gateway protected by two authorization locks&#34; src=&#34;https://blog.margrop.net/post-images/openclaw-missing-operator-write-scope/cover.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop Buying the Wrong Alibaba Cloud Load Balancer: SLB, ALB, NLB, and CLB Explained</title>
      <link>https://blog.margrop.net/en/post/aliyun-slb-alb-nlb-clb-explained/</link>
      <pubDate>Thu, 09 Jul 2026 21:40:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/aliyun-slb-alb-nlb-clb-explained/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;On Alibaba Cloud, do not treat &lt;code&gt;SLB&lt;/code&gt; as one single instance type anymore. The more accurate mental model is this: &lt;strong&gt;SLB is the Server Load Balancer product family, and the concrete choices are mainly ALB, NLB, and CLB.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;ALB&lt;/strong&gt; is the Application Load Balancer for Layer 7 traffic such as HTTP, HTTPS, QUIC, gRPC, and SSE. If you need routing by domain, path, header, cookie, method, or query string, start here.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NLB&lt;/strong&gt; is the Network Load Balancer for Layer 4 traffic such as TCP, UDP, and TCPSSL. If you need massive connections, low latency, long-lived sessions, IoT, audio/video, or a message-service entry point, start here.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CLB&lt;/strong&gt; is the Classic Load Balancer. It supports TCP, UDP, HTTP, and HTTPS, with solid Layer 4 capability and basic Layer 7 features. It is still useful for existing systems, but new designs should usually evaluate ALB or NLB first.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;A simple analogy: &lt;strong&gt;ALB is a receptionist who understands business rules, NLB is a high-speed toll gate, CLB is an older all-in-one service counter, and SLB is the name of the whole building.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Do Not Just Copy QingLong Into BaiHu: A Real Safe Migration Drill</title>
      <link>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</link>
      <pubDate>Thu, 09 Jul 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Migrating from QingLong Panel to BaiHu Panel is not a directory-copy exercise. I ran a real migration drill in an isolated Docker environment: a fresh QingLong instance with sample environment variables, scripts, labels, and cron jobs; then a fresh BaiHu instance; then an actual conversion and verification pass.&lt;/p&gt;&#xA;&lt;p&gt;The reliable migration unit is not the whole QingLong data directory. It is a set of assets: script files, environment variables, scheduled tasks, tags, enabled/disabled state, and task-variable relations. QingLong uses numeric IDs; BaiHu uses string IDs and relation tables. QingLong commands such as &lt;code&gt;task daily_check.py&lt;/code&gt; also need to become executable BaiHu commands such as &lt;code&gt;python /app/data/scripts/qinglong-migrated/daily_check.py&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no full private IP address, private registry address, host name, token, cookie, or production secret. The screenshots come from a disposable lab, and the variables are redacted sample data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Do Not Buy the “Btrfs Drive” Blind: Cheap HM-SMR HDDs Are the 996 Version of Storage</title>
      <link>https://blog.margrop.net/en/post/smr-cmr-btrfs-disk-trap/</link>
      <pubDate>Thu, 09 Jul 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/smr-cmr-btrfs-disk-trap/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A hard drive is not just capacity divided by price. CMR behaves like normal lanes on a road: random rewrites are relatively predictable. SMR behaves like roof shingles: tracks overlap, density improves, but changing one small area may require rewriting a larger zone. The most dangerous detail is that SMR is not one thing. Some SMR drives hide the complexity in firmware. Some expose zone controls. Some are &lt;strong&gt;host-managed SMR&lt;/strong&gt;, where the operating system and software stack must obey zone write rules. Recently, some very cheap large HDDs have been marketed as “Feiniu drives” or “Btrfs drives” on PDD-like listings. In many cases, the real risk is that these are host-managed SMR enterprise drives, not ordinary NAS drives.&lt;/p&gt;&#xA;&lt;p&gt;My buying rule is simple: &lt;strong&gt;no exact model, no purchase; no vendor datasheet, no purchase; Linux reports &lt;code&gt;host-managed&lt;/code&gt;, normal users should walk away; if the seller talks about Btrfs or Feiniu but avoids the SMR type, walk away.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Should QingLong Panel Still Face the Public Internet? After the 2026 Bypass, I Would Start With BaiHu</title>
      <link>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</link>
      <pubDate>Thu, 09 Jul 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;QingLong Panel used to be the default answer for many self-hosted scheduled-script setups. It can run scripts, manage environment variables, show logs, synchronize repositories, and wrap crontab-like workflows in a friendly web UI. But the critical QingLong issues publicly discussed in early 2026 changed the risk calculation: &lt;strong&gt;a task scheduler panel is not just another web admin page. It often holds scripts, secrets, notification tokens, and execution privileges. If authentication can be bypassed, the attacker is not merely viewing a dashboard; they may be standing in front of a machine that can run jobs.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;For new lightweight deployments, I would now evaluate BaiHu Panel first. BaiHu is a Go + Vue3 automation task scheduling platform focused on low overhead and high performance. Its public README describes Docker / Docker Compose deployment, Mise-based runtime management, repository task synchronization, logs, notifications, and secret handling. It is not a perfect one-to-one replacement for every QingLong workflow, but it is a better starting point for many personal script-hosting cases.&lt;/p&gt;&#xA;&lt;p&gt;If you must keep using QingLong temporarily because of old jobs, migration cost, or compatibility constraints, do not expose it directly to the public Internet. Put a protection layer in front of it: VPN, zero-trust access, reverse-proxy Basic Auth, an allowlist, WAF rules, or equivalent access control. This article includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. They deploy BaiHu by default, require an explicit switch to deploy QingLong, and put either panel behind Caddy Basic Auth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Hunting for YOLO Flags: One Launcher for 6 AI Agent Tools</title>
      <link>https://blog.margrop.net/en/post/ai-agent-yolo-one-command/</link>
      <pubDate>Mon, 06 Jul 2026 09:50:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-agent-yolo-one-command/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In AI Agent tools, &lt;code&gt;yolo&lt;/code&gt; does not mean “the model is smarter.” It means “ask me fewer questions.” It reduces or skips approval prompts so the Agent can run more like an unattended automation script. The annoying part is that every tool names this differently. Codex exposes a dangerous approval-and-sandbox bypass. Claude Code has a dangerous permission-skip mode and a permission mode. Gemini CLI and Qwen Code use &lt;code&gt;--approval-mode=yolo&lt;/code&gt;. OpenCode uses &lt;code&gt;--auto&lt;/code&gt; plus permission rules. Aider uses &lt;code&gt;--yes-always&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;My recommendation is not to overwrite &lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;claude&lt;/code&gt;, or &lt;code&gt;gemini&lt;/code&gt; with risky aliases. Install an explicit &lt;code&gt;agent-yolo&lt;/code&gt; launcher instead. When you really want high autonomy, type &lt;code&gt;agent-yolo codex&lt;/code&gt;, &lt;code&gt;agent-yolo claude&lt;/code&gt;, or &lt;code&gt;agent-yolo gemini&lt;/code&gt;. This article provides Windows 11, Ubuntu 26.04, and macOS 26 scripts. They do not depend on third-party services, do not install missing Agent tools, and do not contain private addresses, full computer names, private domains, tokens, or keys.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Fresh Ubuntu 26.04 Without Snap: A Clean, Reversible Removal Guide</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-remove-snap-cleanly/</link>
      <pubDate>Mon, 06 Jul 2026 09:45:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-remove-snap-cleanly/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you are setting up a fresh Ubuntu 26.04 system and you know you do not want Snap, remove it in the right order: inspect installed snaps, save anything important, remove snaps with &lt;code&gt;snap remove --purge&lt;/code&gt;, purge the &lt;code&gt;snapd&lt;/code&gt; package with APT, clean the remaining Snap directories, and optionally block accidental reinstall.&lt;/p&gt;&#xA;&lt;p&gt;This guide explains the background, symptoms, root cause of messy removals, manual execution, AI Agent execution, and three one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. The scripts default to dry-run mode, require an explicit execution switch, depend only on built-in OS tools, and do not include private IP addresses, hostnames, private domains, tokens, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Fighting Over the Remote: Use DSM Scheduled Tasks to Lock a Kids&#39; Video Folder Automatically</title>
      <link>https://blog.margrop.net/en/post/synology-kid-video-acl-curfew/</link>
      <pubDate>Sun, 05 Jul 2026 06:50:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-kid-video-acl-curfew/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not an account lockout guide. The goal is narrower and cleaner: lock one kids&amp;rsquo; video folder on a Synology DSM 7.2.1 NAS during selected hours, while leaving the account, password, homework folders, photo folders, and other shares alone. The script inserts one temporary &lt;code&gt;deny&lt;/code&gt; ACL entry with &lt;code&gt;synoacltool&lt;/code&gt;, removes that entry during open windows, backs up the ACL before each change, and verifies the result after each operation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Original cover: the kids&amp;rsquo; video folder is locked by schedule&#34; src=&#34;https://blog.margrop.net/post-images/synology-kid-video-acl-curfew/00-ai-cover.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cross-Border VPS Feels Glacial? One Kernel Sysctl Speeds International Links 20×</title>
      <link>https://blog.margrop.net/en/post/bbr-fix-china-us-vps-slow-network/</link>
      <pubDate>Thu, 02 Jul 2026 20:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/bbr-fix-china-us-vps-slow-network/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;re accessing your overseas VPS from within China. SSH feels snappy. &lt;code&gt;curl&lt;/code&gt; on a small JSON endpoint returns instantly. But downloading a 2 MB HTML file takes over a minute. Convinced it&amp;rsquo;s &amp;ldquo;peak-hour international link congestion&amp;rdquo;? Probably not — you&amp;rsquo;re being sabotaged by Linux&amp;rsquo;s default CUBIC congestion control. CUBIC treats every packet loss as &amp;ldquo;the road ahead is jammed&amp;rdquo; and immediately backs off. But international links have baseline 5–15% loss from physical-layer imperfections, not congestion. So your TCP flow gets permanently stuck in slow-mo. Switch to Google&amp;rsquo;s &lt;strong&gt;BBR&lt;/strong&gt; algorithm and the exact same physical path, same moment, same loss rate delivers &lt;strong&gt;15–24× more throughput&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This post walks through a real mesh-VPN investigation: pulling a 2.3 MB page from a US VPS across a Chinese home connection went from &lt;strong&gt;30 KB/s to 500–1000 KB/s&lt;/strong&gt; after four shell commands. It ships three one-shot scripts (Windows 11 / Ubuntu 26.04 / macOS 26), covering both manual execution and AI-agent-driven deployment. All internal IPs, hostnames, and public IPs have been redacted.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker Container Crash Loop After v3.7.0? You&#39;re Missing One Word: serve</title>
      <link>https://blog.margrop.net/en/post/siyuan-v370-docker-restart-loop-fix/</link>
      <pubDate>Thu, 02 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/siyuan-v370-docker-restart-loop-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After upgrading Siyuan (SiYuan Note) from v3.6.x to v3.7.0, the Docker container entered an infinite restart loop. &lt;code&gt;docker logs&lt;/code&gt; showed &lt;code&gt;Error: unknown flag: --accessAuthCode&lt;/code&gt;. The root cause: v3.7.0 introduced a CLI subcommand architecture. The old top-level flags now require a &lt;code&gt;serve&lt;/code&gt; subcommand. The fix is adding one word — &lt;code&gt;&#39;serve&#39;&lt;/code&gt; — to the beginning of the &lt;code&gt;command&lt;/code&gt; array in docker-compose.yml. Seven characters. From crash loop to running.&lt;/p&gt;&#xA;&lt;p&gt;This article covers the complete troubleshooting process, one-command fix scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus both manual and AI Agent approaches. All scripts use only Docker CLI and SSH — no third-party services required.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Treating Passkeys as SSH Passwords: The Right Way to Use SSH Keys and Phone/Desktop Passkeys</title>
      <link>https://blog.margrop.net/en/post/ssh-passwordless-login-passkeys-correct-use/</link>
      <pubDate>Tue, 30 Jun 2026 09:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ssh-passwordless-login-passkeys-correct-use/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;SSH passwordless login and passkeys on phones, Macs, and Windows PCs both use the public-key idea, but they are not the same tool. SSH keys are for logging in to servers, Git remotes, jump boxes, and automation endpoints. Passkeys are for signing in to websites, apps, and account systems. They are like two modern key rings: one opens the machine-room door, the other opens your online account door. The cryptographic idea is related, but the locks are different.&lt;/p&gt;&#xA;&lt;p&gt;The practical rule is simple: generate a separate SSH key on each client device, keep the private key only on that device or inside a hardware security key, and put only the public key on the server. Verify public-key login before disabling password login. Use passkeys through iPhone, Android, macOS 26, Windows 11, system password managers, or hardware security keys for website and app sign-in. Do not try to paste a phone passkey into &lt;code&gt;authorized_keys&lt;/code&gt;. This post includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus a manual automation path and an Agent-driven configuration path. The examples do not depend on any third-party service and do not contain real internal addresses, full computer names, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Clicking Update One App at a Time: Let an Agent Upgrade Common Software on Windows 11, Ubuntu 26.04, and macOS 26</title>
      <link>https://blog.margrop.net/en/post/agent-upgrade-common-software-windows11-ubuntu2604-macos26/</link>
      <pubDate>Sun, 28 Jun 2026 08:58:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/agent-upgrade-common-software-windows11-ubuntu2604-macos26/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Updating everyday software is painful not because the commands are impossible, but because the update sources are scattered across several worlds. Windows 11 has WinGet, Microsoft Store, and vendor installers. Ubuntu 26.04 has apt, snap, flatpak, and service restarts. macOS 26 has Software Update, App Store, Homebrew, and applications downloaded outside the store. A human can easily miss something. An AI Agent can help, but only if you give it boundaries.&lt;/p&gt;&#xA;&lt;p&gt;My recommendation is to treat the Agent as an update operator: inventory first, dry-run second, execute third, verify last. This article provides three one-command scripts for Windows 11, Ubuntu 26.04, and macOS 26. They do not depend on third-party update assistants or cloud services. They call only built-in update tools and package managers already installed and configured on the machine. The examples contain no real private address, full computer name, private domain, token, or key.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Is Your Computer Always Full? Use an AI Agent to Safely Clean Junk Files on Windows 11, Ubuntu 26.04, and macOS 26</title>
      <link>https://blog.margrop.net/en/post/ai-agent-cleanup-windows11-ubuntu2604-macos26/</link>
      <pubDate>Sun, 28 Jun 2026 07:15:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-agent-cleanup-windows11-ubuntu2604-macos26/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Junk cleanup is risky not because it is hard to delete files, but because it is easy to delete too much. On Windows 11, Ubuntu 26.04, and macOS 26, the safe cleanup targets are usually temporary directories, package caches, old logs, recycle bin or trash contents, and files that can be regenerated. A cleanup script should not casually touch documents, photos, browser profiles, keys, certificates, virtual machine images, or application data.&lt;/p&gt;&#xA;&lt;p&gt;This article gives you two paths: &lt;strong&gt;manual automation&lt;/strong&gt;, where you run the scripts yourself, inspect the dry-run output, and then explicitly enable deletion; and &lt;strong&gt;Agent-driven automation&lt;/strong&gt;, where Codex, Claude, OpenClaw, HermesAgent, or another AI Agent performs the same scan, review, execution, and verification flow for you. The three scripts cover Windows 11, Ubuntu 26.04, and macOS 26. They do not depend on third-party services, do not download cleanup utilities, and do not contain real private addresses, computer names, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Chrome Ate 4GB of Disk Space? Delete the Local AI Model and Stop It Coming Back</title>
      <link>https://blog.margrop.net/en/post/chrome-disable-local-ai-model-4gb/</link>
      <pubDate>Sat, 27 Jun 2026 23:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/chrome-disable-local-ai-model-4gb/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Some Google Chrome installations now download several gigabytes of local generative AI model data in the background. This is usually not malware and not a broken cache. It is Chrome preparing on-device AI models for browser and web features. Deleting the folder only frees disk space temporarily. The durable fix is to &lt;strong&gt;disable the local GenAI foundational model download with Chrome policy, then remove the already downloaded model folders&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This guide covers Windows 11, Ubuntu 26.04, and macOS 26. It includes one-click scripts, manual steps, and an agent prompt you can hand to Codex, Claude, OpenClaw, Gemini CLI, or another local operator. The scripts use native OS policy mechanisms and Chrome&amp;rsquo;s documented policy. They do not depend on third-party services and do not include real IP addresses, hostnames, internal domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>macOS 26 Boot Daemons: Put frp and EasyTier in LaunchDaemons, Not Login Items</title>
      <link>https://blog.margrop.net/en/post/macos-26-launchdaemon-boot-service-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:12:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-26-launchdaemon-boot-service-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on macOS 26, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On macOS 26, a daemon that must start before user login belongs in /Library/LaunchDaemons. Login items and LaunchAgents are tools opened after a person enters the room. LaunchDaemons are more like the building&amp;rsquo;s elevator or water pump: they should run as the machine comes up.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows 11/10 Background Autostart: Run frp and EasyTier Unattended Without Third-Party Wrappers</title>
      <link>https://blog.margrop.net/en/post/windows-11-10-background-service-autostart-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:11:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-11-10-background-service-autostart-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on Windows 11/10, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On Windows, the first decision is whether the executable is a real Windows Service. Common command-line daemons such as frp and EasyTier are usually better handled by Task Scheduler at system startup, because it is built in and does not require NSSM, WinSW, or another wrapper.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 Boot Services Done Right: Let systemd Run frp and EasyTier for You</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-systemd-boot-service-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-systemd-boot-service-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on Ubuntu 26.04, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On Ubuntu 26.04, the standard answer for a background daemon is not a shell startup hack. It is a systemd unit. systemd can wait for the network, start the process before login, collect logs, restart on failure, and stop it in order during shutdown.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows Finally Gets Native Linux Commands: Microsoft Coreutils Replaces WSL, Cygwin, and Git Bash</title>
      <link>https://blog.margrop.net/en/post/windows-native-linux-commands-microsoft-coreutils/</link>
      <pubDate>Sat, 27 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-native-linux-commands-microsoft-coreutils/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Let me ask you something:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Have you ever tried to &lt;code&gt;grep&lt;/code&gt; a log file in Windows Terminal, only to be told that &lt;code&gt;grep&lt;/code&gt; is not a recognized command? Tried to use &lt;code&gt;find&lt;/code&gt; to locate files, only to discover that Windows&amp;rsquo; &lt;code&gt;find&lt;/code&gt; is a completely different beast from Linux&amp;rsquo;s &lt;code&gt;find&lt;/code&gt;? Written a cross-platform script that works perfectly on Linux, then falls apart the moment it touches Windows?&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not your fault. It&amp;rsquo;s the &amp;ldquo;Berlin Wall&amp;rdquo; between Windows and Linux command lines.&lt;/p&gt;&#xA;&lt;p&gt;The good news? Microsoft just tore that wall down. In late 2025, Microsoft open-sourced &lt;strong&gt;coreutils&lt;/strong&gt; on GitHub — a native Windows port of the essential Linux command set. No WSL. No Cygwin. No Git Bash. Just one &lt;code&gt;winget install&lt;/code&gt; command, and your Windows terminal suddenly speaks fluent &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, and &lt;code&gt;awk&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker Images, No More Begging: Build Your Own 13 GB Private Registry From Scratch</title>
      <link>https://blog.margrop.net/en/post/build-private-docker-registry-without-hassle/</link>
      <pubDate>Fri, 26 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/build-private-docker-registry-without-hassle/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;My home server runs a single &lt;code&gt;registry:2&lt;/code&gt; container that currently holds &lt;strong&gt;13 GB of cached blobs across 95 repositories&lt;/strong&gt;. Every NAS, Proxmox node, Mac, and Windows machine on my LAN pulls through it. A cold start of &lt;code&gt;alpine:3.19&lt;/code&gt; finishes in under a second, with zero traffic going out to the public Docker Hub.&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t a one-line &amp;ldquo;install Docker and run a container&amp;rdquo; tutorial. I&amp;rsquo;ll show you the &lt;strong&gt;production-grade deployment script I actually run&lt;/strong&gt;, walk through the Docker v2 auth flow, and call out the four reverse-proxy pitfalls that turn every &lt;code&gt;docker login&lt;/code&gt; into a 401 mystery. You&amp;rsquo;ll leave able to: ① bring up an authenticated registry in 10 minutes; ② explain why the &lt;code&gt;WWW-Authenticate&lt;/code&gt; header is sacred; ③ describe the whole thing to a non-technical family member without losing accuracy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Letting Agents Burn Tokens: Wiring Headroom into NewAPI, OpenClaw, and HermesAgent</title>
      <link>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</link>
      <pubDate>Sat, 20 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I did not replace NewAPI, and I did not point OpenClaw or HermesAgent at an unproven gateway. The actual design is simpler: place Headroom in front of NewAPI, then move only the already validated OpenAI-compatible providers to &lt;code&gt;http://&amp;lt;headroom-host&amp;gt;:8787/v1&lt;/code&gt;. The original NewAPI endpoint stays available. Long agent context now goes through Headroom first, gets compressed, then continues to NewAPI for the same routing and model management as before.&lt;/p&gt;&#xA;&lt;p&gt;The rule that kept the rollout boring was: &lt;strong&gt;test first, edit second; migrate only OpenAI-compatible providers that pass; leave non-OpenAI fallbacks alone.&lt;/strong&gt; This post is both a write-up and a runbook you can hand to an Agent or follow manually.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>One sentence let Claude upgrade Ubuntu 22.04 to 24.04: a near-zero-screen-time cross-LTS run</title>
      <link>https://blog.margrop.net/en/post/upgrade-ubuntu-via-agent/</link>
      <pubDate>Fri, 19 Jun 2026 10:58:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/upgrade-ubuntu-via-agent/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A remote home-lab box had been sitting on Ubuntu 22.04.4 LTS (jammy, kernel 5.15) for a long time. After one sentence — &amp;ldquo;upgrade the box at 192.168.103.182 to Ubuntu 24.04&amp;rdquo; — Claude opened a tmux session to babysit the run, brought up a fallback sshd on port 1022 so a mid-upgrade sshd restart would not strand me, then drove &lt;code&gt;do-release-upgrade -f DistUpgradeViewNonInteractive&lt;/code&gt; end to end. Twenty-five minutes later the host came back: kernel 6.8.0-124, every service still listening.&lt;/p&gt;&#xA;&lt;p&gt;This is not a tutorial on &lt;code&gt;do-release-upgrade&lt;/code&gt;; the Ubuntu docs already cover that. This is about what an Agent does once it gets an SSH handle on a box, why it does each step, and which pitfalls you have to clear out of the way before letting it loose.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Ubuntu shutdown stuck for 90 seconds? A Python asyncio service that won&#39;t honour SIGTERM, and how to fix it</title>
      <link>https://blog.margrop.net/en/post/ubuntu-shutdown-stuck/</link>
      <pubDate>Fri, 19 Jun 2026 10:58:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-shutdown-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After upgrading my home proxy box to Ubuntu 24.04, &lt;code&gt;systemctl reboot&lt;/code&gt; stopped being fast: SSH would hang on for &lt;strong&gt;90 seconds&lt;/strong&gt; before the box actually shut down. &lt;code&gt;journalctl&lt;/code&gt; made it obvious: &lt;code&gt;smart-proxy.service: State &#39;stop-sigterm&#39; timed out. Killing.&lt;/code&gt; — systemd sent SIGTERM, waited 90 seconds, nobody reacted, and SIGKILL was the only option left.&lt;/p&gt;&#xA;&lt;p&gt;The root cause is not systemd&amp;rsquo;s fault and not Ubuntu&amp;rsquo;s fault. It is &lt;strong&gt;Python&amp;rsquo;s asyncio runtime not actually ending its child tasks when SIGTERM arrives&lt;/strong&gt; — it is parked on a &lt;code&gt;socket.recv&lt;/code&gt; and never voluntarily looks at the signal queue.&lt;/p&gt;&#xA;&lt;p&gt;The fix has two halves, both required: &lt;strong&gt;(1)&lt;/strong&gt; a systemd drop-in that lowers &lt;code&gt;TimeoutStopSec&lt;/code&gt; from the default 90s down to 20s on the affected Python units; &lt;strong&gt;(2)&lt;/strong&gt; inside the Python service itself, walk &lt;code&gt;asyncio.all_tasks()&lt;/code&gt;, &lt;code&gt;.cancel()&lt;/code&gt; the in-flight connection handlers on SIGTERM, and wrap &lt;code&gt;self.stop()&lt;/code&gt; in &lt;code&gt;asyncio.wait_for(..., timeout=10)&lt;/code&gt; as a safety net. After both halves, the same &lt;code&gt;reboot&lt;/code&gt; drops from 90 seconds to one second.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Synology locked root behind three doors — I spent twenty minutes teaching it how to let me back in</title>
      <link>https://blog.margrop.net/en/post/synology-root-and-ssh-key/</link>
      <pubDate>Thu, 18 Jun 2026 16:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-root-and-ssh-key/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Synology DSM, by design, ships with SSH &lt;strong&gt;disabled&lt;/strong&gt; and root login &lt;strong&gt;prohibited&lt;/strong&gt; — both sensible defaults. This guide walks you through &amp;ldquo;doing it the right way&amp;rdquo;:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control Panel → Terminal &amp;amp; SNMP → Enable SSH&lt;/strong&gt; (open the gate)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Log in as a normal user, then &lt;code&gt;sudo -i&lt;/code&gt; to become root&lt;/strong&gt; (borrow the landlord&amp;rsquo;s key first)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Edit &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; and set &lt;code&gt;PermitRootLogin yes&lt;/code&gt;&lt;/strong&gt; (tell the bouncer &amp;ldquo;root is family&amp;rdquo;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;synouser --setpw root xxx&lt;/code&gt; to set a root password, and append your public key to &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/strong&gt; (hand back a key that can never be lost)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Total time: about twenty minutes. I&amp;rsquo;ll explain &lt;em&gt;why&lt;/em&gt; every step exists using a &amp;ldquo;key and lock&amp;rdquo; metaphor, give you a 3-second vi crash course, list the error messages you&amp;rsquo;ll see, and answer the seven most common questions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>I dockerized AnythingLLM and the container turned into a wound-up squirrel — restarting forever until I handed it that magic 1000:1000</title>
      <link>https://blog.margrop.net/en/post/anythingllm-docker-deploy/</link>
      <pubDate>Wed, 17 Jun 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/anythingllm-docker-deploy/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AnythingLLM, Mintplex Labs&amp;rsquo; &amp;ldquo;stuff-anything-in-a-LLM&amp;rdquo; desktop, ships an official Docker image. In the happy path one &lt;code&gt;docker run&lt;/code&gt; is all you need. But the in-container user &lt;code&gt;anythingllm&lt;/code&gt; is picky: the host directory you bind-mount has to be owned by &lt;code&gt;1000:1000&lt;/code&gt;, otherwise it can&amp;rsquo;t write its own SQLite file, the Prisma migration step on startup crashes, and the container enters a &lt;em&gt;restart-crash-restart&lt;/em&gt; loop. The fix takes under a minute: &lt;code&gt;chown -R 1000:1000 /your/data/dir&lt;/code&gt;, then &lt;code&gt;docker compose up -d&lt;/code&gt; again, and it dutifully listens on &lt;code&gt;3001&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll also explain why Prisma&amp;rsquo;s &lt;code&gt;file:../storage/anythingllm.db&lt;/code&gt; relative path is a footgun, give you a Portainer-ready stack file, and finish with a Q&amp;amp;A on the most common gotchas.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Moving Bedtime Out of the Living Room: Letting macOS launchd Disable Your Kids&#39; Synology Accounts at 22:00 and Quietly Re-enable Them at 08:00</title>
      <link>https://blog.margrop.net/en/post/synology-mykid-curfew-launchd/</link>
      <pubDate>Sun, 14 Jun 2026 08:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-mykid-curfew-launchd/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Synology DSM has a &amp;ldquo;disable this account&amp;rdquo; checkbox in the Control Panel, but it does not run on a schedule. With macOS&amp;rsquo;s built-in &lt;code&gt;launchd&lt;/code&gt; and a 50-line bash script, you can flip the &lt;code&gt;expired&lt;/code&gt; flag on two local accounts at 22:00 every night and flip it back at 08:00. The script does a before-query, a change, an after-query, and &lt;code&gt;exit 1&lt;/code&gt; the moment the after state does not match expectations. &lt;code&gt;launchd&lt;/code&gt; writes stdout and stderr to dedicated log files. The interesting part is that the word &amp;ldquo;parent&amp;rdquo; quietly leaves the conversation: you no longer have to remind anyone to go to bed, the machine does it for you, on time, every day.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is not a comprehensive &amp;ldquo;family NAS management&amp;rdquo; guide. It is about one specific thing: turning a manual button click that depends on human memory into a system-level event that just happens on time.&lt;/p&gt;&#xA;&lt;p&gt;If you only want the picture, the overview diagram in Section 2 is the whole article in one frame.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Lights out at 22:00, lights on at 08:00&#34; src=&#34;https://blog.margrop.net/post-images/synology-mykid-curfew-launchd/05-curfew-overview.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PhotoPrism Stuck for 5 Minutes on First Boot? A Postmortem on PHOTOPRISM_INIT=intel</title>
      <link>https://blog.margrop.net/en/post/photoprism-init-intel-stuck/</link>
      <pubDate>Sat, 13 Jun 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/photoprism-init-intel-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR (The Short Version)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;PHOTOPRISM_INIT: &amp;quot;intel&amp;quot;&lt;/code&gt; line in PhotoPrism&amp;rsquo;s Plus Docker image is &lt;strong&gt;not&lt;/strong&gt; just a flag to enable Intel hardware acceleration at runtime — it&amp;rsquo;s a one-shot &lt;strong&gt;system-level installer&lt;/strong&gt; that runs &lt;code&gt;apt-get dist-upgrade&lt;/code&gt; against &lt;code&gt;archive.ubuntu.com&lt;/code&gt; and then installs 8 Intel/VA-API packages before the main process is allowed to start. On a fresh container this takes &lt;strong&gt;5–10 minutes&lt;/strong&gt; (sometimes more), during which nothing inside the container listens on port &lt;code&gt;2342&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile: &lt;code&gt;docker ps&lt;/code&gt; says &lt;code&gt;Up&lt;/code&gt;, Portainer is green, &lt;code&gt;ss -ltn&lt;/code&gt; on the host shows &lt;code&gt;:2342&lt;/code&gt; LISTEN — but your browser gets &lt;code&gt;ERR_CONNECTION_RESET&lt;/code&gt; / &lt;code&gt;Connection reset by peer&lt;/code&gt;. Because host-side &lt;code&gt;docker-proxy&lt;/code&gt; accepts the connection and then tries to forward to a port inside the container that has no listener, the kernel sends back an RST.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; just remove or empty that one line. If you already pass &lt;code&gt;/dev/dri/renderD128&lt;/code&gt; via &lt;code&gt;devices:&lt;/code&gt;, the host&amp;rsquo;s drivers and userland libraries are perfectly usable from the container — there&amp;rsquo;s nothing to &amp;ldquo;install&amp;rdquo; in there.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Portainer 500 Error That Wasn&#39;t the YAML — A Two-librespeed_default-Network Story</title>
      <link>https://blog.margrop.net/en/post/portainer-500-duplicate-compose-network-enigma/</link>
      <pubDate>Sat, 13 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/portainer-500-duplicate-compose-network-enigma/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You update a stack in Portainer. The browser slaps you with a red &lt;code&gt;500 Internal Server Error&lt;/code&gt;. You assume the YAML is wrong, fix the indentation, swap the quotes, drop the image tag. You hit Update again. Same 500. And again. And again.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The real culprit is buried at the deepest level of the HTTP response body: &lt;code&gt;network librespeed_default is ambiguous (2 matches found on name)&lt;/code&gt;.&lt;/strong&gt; Two networks with the same name exist in the same Docker engine—two IDs, two &lt;code&gt;Created&lt;/code&gt; timestamps, two &lt;code&gt;com.docker.compose.config-hash&lt;/code&gt; labels, but a single shared name. Compose asks the engine to look up that name; the engine refuses to pick between them; &lt;code&gt;compose up&lt;/code&gt; fails; Portainer wraps the error as a 500 and returns it to your browser.&lt;/p&gt;&#xA;&lt;p&gt;The fix is embarrassingly simple: &lt;strong&gt;delete one of the two orphan networks&lt;/strong&gt; (&lt;code&gt;docker network rm &amp;lt;id&amp;gt;&lt;/code&gt; or click Remove in Portainer&amp;rsquo;s Networks page), then re-run Update the stack with the exact same content. It just works.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is a real debugging session: a stack update that was supposed to be a 30-second mount-path change turned into a 1-hour investigation. All private details (internal addresses, registry URLs, volume paths, container names, credentials) have been replaced with &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt;. Only public source code, official docs, and the error text itself are preserved.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When a Seagate IronWolf Pro Throws a SMART Alert: My Full Path from Diagnosis to a Free RMA</title>
      <link>https://blog.margrop.net/en/post/seagate-ironwolf-pro-rma-rescue-flow/</link>
      <pubDate>Sat, 13 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/seagate-ironwolf-pro-rma-rescue-flow/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A single line in a Synology alert — &amp;ldquo;Bad sector count on Drive 10 has increased&amp;rdquo; — was the starting point. The drive that triggered the alert wasn&amp;rsquo;t the one that actually scared me, and the drive that did turn out to be in trouble turned out to be a Taiwan-boxed IronWolf Pro still under Seagate&amp;rsquo;s 5-year warranty. This post walks through the entire path I took: SMART triage, fault classification, identifying a hidden link-layer problem on a different drive, the international region-transfer request, the email I actually sent, and the packaging lessons you only learn by reading Seagate&amp;rsquo;s return policy. If you ever get a similar alert, this is the playbook I wish I had on hand.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;A bit of context first: my home NAS is a Synology DS3617xs running DSM 10, up 7x24 with four 10 TB drives — two WD helium &amp;ldquo;white-label&amp;rdquo; drives, an HGST Ultrastar He10, and a Seagate IronWolf Pro 10 TB. The day the alert came in, everything had been quietly humming for almost three years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Docker Container Is Running, the Port Is Dead: A Complete Walkthrough of a Silent Host-Bind Failure</title>
      <link>https://blog.margrop.net/en/post/docker-port-bind-half-silent/</link>
      <pubDate>Sat, 13 Jun 2026 07:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-port-bind-half-silent/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; says everything is fine. &lt;code&gt;docker inspect&lt;/code&gt;&amp;rsquo;s &lt;code&gt;HostConfig.PortBindings&lt;/code&gt; clearly says &lt;code&gt;203.0.113.14:3001:3000&lt;/code&gt;. But on the host, &lt;strong&gt;no &lt;code&gt;docker-proxy&lt;/code&gt; is listening&lt;/strong&gt;, the iptables &lt;code&gt;nat/DOCKER&lt;/code&gt; chain has &lt;strong&gt;no DNAT rule&lt;/strong&gt;, and &lt;code&gt;NetworkSettings.Networks&lt;/code&gt; and &lt;code&gt;Ports&lt;/code&gt; are both &lt;strong&gt;empty &lt;code&gt;{}&lt;/code&gt;&lt;/strong&gt;. This &amp;ldquo;container alive, port dead&amp;rdquo; state is what happens when libnetwork silently rolls back the endpoint creation because the target interface wasn&amp;rsquo;t up at attach time — and Docker doesn&amp;rsquo;t bother to tell you that the port publish never actually happened. &lt;strong&gt;The fix is a single 30-second command&lt;/strong&gt;: &lt;code&gt;docker network connect &amp;lt;net&amp;gt; &amp;lt;ctr&amp;gt;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>From 5m14s to 0.6s: How I Rebuilt My Docker Hub Mirror After Hitting Three Walls</title>
      <link>https://blog.margrop.net/en/post/docker-registry-mirror-rebuild-2026/</link>
      <pubDate>Sat, 13 Jun 2026 07:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-registry-mirror-rebuild-2026/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;My home lab had a &lt;code&gt;registry:2&lt;/code&gt; pull-through cache fronting Docker Hub for years, and it was fine. Then one day pulling a 5 MB &lt;code&gt;alpine:3.19&lt;/code&gt; took 5 minutes and 14 seconds. This post is the full forensic log of how I traced the slowdown, evaluated 8 candidate mirrors with real measurements (not vibes), and finished with a 5-line bash script on cron that &lt;strong&gt;auto-fails-over&lt;/strong&gt; when the primary mirror goes down. Every number in this article was captured on my own hardware, in my own network, at one specific moment in time.&lt;/p&gt;&#xA;&lt;p&gt;If you also self-host a Docker Hub mirror, or your team runs an internal registry, the Q&amp;amp;A at the bottom will probably save you 3 hours of pain.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Markdown Throne Falls: When AI Agents Step Out of the Chat Box, HTML Becomes the New Answer</title>
      <link>https://blog.margrop.net/en/post/markdown-throne-falls-ai-agent-html-output/</link>
      <pubDate>Wed, 10 Jun 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/markdown-throne-falls-ai-agent-html-output/</guid>
      <description>If 2023 was the &amp;ldquo;chatbox era&amp;rdquo; of ChatGPT and Markdown, then 2026 is heralding the arrival of a new phase: AI no longer merely &amp;ldquo;answers&amp;rdquo; you—it is set to &amp;ldquo;take over&amp;rdquo; your interface. As Agents begin directly controlling browsers, operating SaaS, and building interactive application prototypes, Markdown—long the de facto standard for LLM output, that elegant format prized for its simplicity, readability, and token-friendliness—is rapidly revealing its fatal shortcoming as the &amp;ldquo;last mile.</description>
    </item>
    <item>
      <title>OpenClaw TUI Keeps Repeating Itself? A Temporary Patch for Duplicate Thinking and Replies</title>
      <link>https://blog.margrop.net/en/post/openclaw-tui-duplicate-thinking-stream-patch/</link>
      <pubDate>Tue, 02 Jun 2026 10:42:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-tui-duplicate-thinking-stream-patch/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If OpenClaw TUI shows the same thinking block twice and repeats the final answer, do not immediately delete every session or rebuild every model provider. In many OpenAI-compatible setups, the real issue is a streaming compatibility edge case: the upstream stream emits normal &lt;code&gt;delta&lt;/code&gt; chunks and then an extra full &lt;code&gt;message&lt;/code&gt; tail. Some OpenClaw paths may aggregate both, so the TUI and the persisted session both end up with duplicated content.&lt;/p&gt;&#xA;&lt;p&gt;The practical temporary fix is to back up the local OpenClaw installation, add a conservative dedupe guard in the OpenClaw aggregation layer, restart the gateway, and verify with a unique marker that both the visible reply and the session file contain only one copy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This is a privacy-safe incident note. All endpoints, model names, tokens, internal addresses, and session identifiers are replaced by placeholders. Use your own installation path and model identifiers when applying the workaround.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MiniMax M3 Officially Released: Demystifying the MSA Sparse Attention Architecture, Plus a Look Inside the Mavis Sandbox</title>
      <link>https://blog.margrop.net/en/post/minimax-m3-launch-and-sandbox-architecture/</link>
      <pubDate>Mon, 01 Jun 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/minimax-m3-launch-and-sandbox-architecture/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;On June 1st, MiniMax (Xiyu Technology) officially released its next-generation general-purpose model, MiniMax M3. It simultaneously maxes out three traditionally hard pillars — frontier coding, ultra-long context, and native multimodality — and it is the &lt;strong&gt;only fully open-source model&lt;/strong&gt; in the world to do so. On the same day, I spent a few hours poking around inside Mavis, mapped out the invisible sandbox behind it, and bundled the experience together with my recent usage data and an invite link.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: &lt;strong&gt;This article is 100% written and generated by MiniMax-M3&lt;/strong&gt; (including all code blocks, technical diagrams, and structure), without any manual edits or changes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update (2026-06-01 22:00)&lt;/strong&gt;: A few hours after this post went live, the team published a follow-up announcement acknowledging that the original Token Plan migration was communicated poorly and that weekly-quota handling for long-time users wasn&amp;rsquo;t done right. They&amp;rsquo;ve laid out compensation, more quota, and a refund channel. I&amp;rsquo;ve added &lt;strong&gt;Section 9 — &amp;ldquo;Token Plan Revamp: Latest Announcement&amp;rdquo;&lt;/strong&gt; at the bottom of this post. If you&amp;rsquo;re on Token Plan, or about to subscribe, read it before you spend another yuan.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>VPN Connected, But Internal Hostnames Won&#39;t Resolve? A Complete macOS Routing Table Walkthrough</title>
      <link>https://blog.margrop.net/en/post/macos-routing-table-vpn-troubleshooting/</link>
      <pubDate>Mon, 01 Jun 2026 18:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-routing-table-vpn-troubleshooting/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When two VPNs run side-by-side on macOS (e.g. &lt;code&gt;utun0&lt;/code&gt; and &lt;code&gt;utun15&lt;/code&gt;), an aggregate &lt;code&gt;10.0.0.0/8&lt;/code&gt; route pushed by one of them can silently &amp;ldquo;swallow&amp;rdquo; every address in the 10.x.x.x range — including the one you actually wanted to reach on the other VPN. DNS resolves fine; TCP/ICMP just hangs. &lt;strong&gt;&lt;code&gt;route -n get&lt;/code&gt; is the first knife you should reach for.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Your Mac App Is Not Broken: Gatekeeper May Just Distrust an Unsigned Tool</title>
      <link>https://blog.margrop.net/en/post/macos-gatekeeper-unsigned-app-fix/</link>
      <pubDate>Mon, 01 Jun 2026 07:35:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-gatekeeper-unsigned-app-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When a macOS utility refuses to launch after being downloaded, the first conclusion should not be “the app is broken.” A very common cause is a combination of two facts: the app still has the &lt;code&gt;com.apple.quarantine&lt;/code&gt; extended attribute that marks it as downloaded from the internet, and the app bundle does not have a usable signature that Gatekeeper can trust. For first launch, “downloaded from the web + no usable signature” is enough for macOS to block it.&lt;/p&gt;&#xA;&lt;p&gt;For a tool whose source you understand and trust, the smallest local repair is straightforward: inspect the quarantine attribute, verify the signing state, apply a local ad-hoc signature to that one app bundle, remove quarantine from that one app, and then verify the result. The point is not to turn off macOS security globally. The point is to fix one known local tool while keeping the safety boundary clear.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is based on a real local troubleshooting session, but all private details have been removed. There are no real internal addresses, usernames, tokens, private download locations, hostnames, or machine-specific paths. The examples use placeholders such as &lt;code&gt;/Applications/&amp;lt;App&amp;gt;.app&lt;/code&gt; and &lt;code&gt;&amp;lt;App&amp;gt;&lt;/code&gt;. The goal is to share a repeatable diagnostic method, not to expose an environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your Background Process Keeps Dying After Shell Exit? Stop Blaming nohup — Understand setsid and Unix Process Lifecycle</title>
      <link>https://blog.margrop.net/en/post/setsid-daemon-process-survival/</link>
      <pubDate>Mon, 01 Jun 2026 07:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/setsid-daemon-process-survival/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You launched a background service. You used &lt;code&gt;nohup&lt;/code&gt;. You added &lt;code&gt;&amp;amp;&lt;/code&gt;. You redirected output. Everything looked fine. But when you closed the terminal, disconnected SSH, or—more insidiously—when an automation tool finished executing its script, the process silently vanished. You checked &lt;code&gt;ps&lt;/code&gt;—nothing. You checked the port—nothing. No error in the logs. If this has happened to you, you&amp;rsquo;re not alone.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The root cause isn&amp;rsquo;t SIGHUP—at least, not entirely. The real issue is process group and session membership.&lt;/strong&gt; &lt;code&gt;nohup&lt;/code&gt; merely tells the process to ignore the SIGHUP signal, but the process still belongs to the same session and process group as the parent shell. When the shell exits and sends SIGHUP to the entire process group, &lt;code&gt;nohup&lt;/code&gt; helps—but only if the signal delivery chain stops there. If the controlling terminal is destroyed, if stdin/stdout pipes break, or if the parent&amp;rsquo;s process group is collectively reaped, the process can still die. The proper fix is &lt;code&gt;setsid&lt;/code&gt;: it creates a brand-new session, detaches from the controlling terminal, and places the process in its own process group—so SIGHUP from the parent shell never reaches it in the first place.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is based on a real debugging session of the CLIProxyAPI service. The service was started with &lt;code&gt;nohup&lt;/code&gt; but kept disappearing every time an automation script finished. The management panel kept showing &amp;ldquo;connection failed.&amp;rdquo; The culprit turned out to be a subtle Unix process lifecycle issue. This class of problem is common in cloud dev machines, CI runners, SSH jump hosts, and containerized workflows, but it&amp;rsquo;s often misdiagnosed because the underlying process model is poorly understood.&lt;/p&gt;&#xA;&lt;p&gt;All private details have been removed. No real internal addresses, tokens, or paths appear in this article.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Double-Consumed Streaming: Debugging a NewAPI v1.0.0-rc.10 MiniMax Proxy Bug</title>
      <link>https://blog.margrop.net/en/post/newapi-streaming-duplicate-content-debugging/</link>
      <pubDate>Sun, 31 May 2026 18:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/newapi-streaming-duplicate-content-debugging/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;An AI Agent was producing duplicated replies in DingTalk — not two separate messages, but a single message whose content appeared twice. The root cause traced back to a streaming bug in NewAPI (the QuantumNous fork of OneAPI) v1.0.0-rc.10: when proxying MiniMax through the OpenAI Chat Completions protocol, the finish chunk contained &lt;strong&gt;both &lt;code&gt;delta.content&lt;/code&gt; and &lt;code&gt;message.content&lt;/code&gt;&lt;/strong&gt; with identical values. The Agent&amp;rsquo;s stream handler consumed both as &amp;ldquo;visible text,&amp;rdquo; concatenating the content twice. The fix was straightforward: switch the OpenClaw provider protocol from &lt;code&gt;openai-completions&lt;/code&gt; to &lt;code&gt;anthropic-messages&lt;/code&gt;, which OneAPI natively supports and where streaming behaves correctly.&lt;/p&gt;&#xA;&lt;p&gt;No internal IPs, tokens, model IDs, or private paths appear in this article. All configuration snippets have been sanitized.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Why HermesAgent Would Not Reply in WeChat or WeCom: The Real Culprit Was a Local Relay With a 3-Second Timeout</title>
      <link>https://blog.margrop.net/en/post/hermesagent-wechat-wecom-relay-timeout-debugging/</link>
      <pubDate>Sun, 31 May 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/hermesagent-wechat-wecom-relay-timeout-debugging/</guid>
      <description>The short version This incident looked like a model problem or a broken messaging channel, but the real failure happened one layer lower: my local relay cut the upstream request off after 3 seconds. That was fine for quick health checks, but it was wrong for real WeChat and WeCom turns, which often take longer to produce a complete answer from the NewAPI gateway. Once the relay disconnected too early, HermesAgent could only see Connection error, RemoteProtocolError, and then exhausted fallback attempts.</description>
    </item>
    <item>
      <title>Mystery: Where Did That http_proxy Come From in My New Tmux Session?</title>
      <link>https://blog.margrop.net/en/post/tmux-zsh-http-proxy-mystery/</link>
      <pubDate>Sat, 30 May 2026 16:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/tmux-zsh-http-proxy-mystery/</guid>
      <description>&lt;h1 id=&#34;preface&#34;&gt;Preface&lt;/h1&gt;&#xA;&lt;p&gt;Today I ran into a truly bizarre problem: in a freshly created tmux session, &lt;code&gt;echo $http_proxy&lt;/code&gt; showed a valid proxy address. But I distinctly remember that my &lt;code&gt;.zshrc&lt;/code&gt; only defines two aliases — &lt;code&gt;proxy_on&lt;/code&gt; and &lt;code&gt;proxy_off&lt;/code&gt; — both of which require manual invocation and don&amp;rsquo;t run automatically.&lt;/p&gt;&#xA;&lt;p&gt;The weirdest part: my main shell shows &lt;code&gt;http_proxy&lt;/code&gt; as empty, but as soon as I enter tmux, it&amp;rsquo;s there. I spent nearly an hour tracking this down, so I&amp;rsquo;m documenting it for posterity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>You Can SSH Out, but Not Back In: A Fail2Ban False Positive That Broke Reverse Access</title>
      <link>https://blog.margrop.net/en/post/reverse-ssh-fail2ban-vpn-gateway-investigation/</link>
      <pubDate>Sat, 30 May 2026 15:45:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/reverse-ssh-fail2ban-vpn-gateway-investigation/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The symptom looked simple: I could SSH from the local machine into a remote internal host, but the reverse SSH path failed when the remote host tried to connect back. &lt;code&gt;sshd&lt;/code&gt; was listening, the route table looked fine, and the failure still happened.&lt;/p&gt;&#xA;&lt;p&gt;The real root cause was not a broken SSH daemon. &lt;code&gt;Fail2Ban&lt;/code&gt; had banned the &lt;strong&gt;VPN gateway address&lt;/strong&gt; that represented the return path. From the local machine&amp;rsquo;s point of view, the incoming SSH session did not appear to come directly from the remote host. It appeared to come from the gateway, so the ban cut off the whole reverse path.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Home Network 1000Mbps but Games Stutter? A Complete Guide to Diagnosing and Fixing Bufferbloat</title>
      <link>https://blog.margrop.net/en/post/bufferbloat-sqm-cake-home-network-fix/</link>
      <pubDate>Sat, 30 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/bufferbloat-sqm-cake-home-network-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The Short Version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Your router has a hidden enemy called &lt;strong&gt;Bufferbloat&lt;/strong&gt; — and it&amp;rsquo;s likely the reason your games lag even when your bandwidth test shows perfect speeds. When a router buffers too aggressively, download traffic fills up the queue and real-time traffic (games, video calls) gets stuck waiting behind thousands of buffered packets. Your speedtest stays at 950Mbps, but your game ping explodes from 50ms to 500ms.&lt;/p&gt;&#xA;&lt;p&gt;In this article, I walk through the complete diagnosis and resolution of a Bufferbloat problem in a real home network environment using a multi-WAN iKuai gateway + ImmortalWrt soft router setup. The fix: deploying &lt;strong&gt;SQM (Smart Queue Management) + Cake qdisc&lt;/strong&gt; on the ImmortalWrt layer, which reduced latency under full-speed download from ~300ms+ down to a stable ~12ms with zero configuration complexity.&lt;/p&gt;&#xA;&lt;p&gt;All internal IP addresses, device hostnames, and network topologies have been sanitized for privacy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Python App in macOS LaunchAgent Can&#39;t Reach the Internet? Here&#39;s the httpx Proxy Trap You Need to Know</title>
      <link>https://blog.margrop.net/en/post/macos-launchagent-python-httpx-proxy-no-route-to-host/</link>
      <pubDate>Sat, 30 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-launchagent-python-httpx-proxy-no-route-to-host/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When a Python application using httpx with &lt;code&gt;trust_env=True&lt;/code&gt; runs inside a macOS LaunchAgent, it silently picks up the system proxy settings from &lt;code&gt;scutil --proxy&lt;/code&gt;. But the LaunchAgent process may not be able to reach that proxy server at all — resulting in &lt;code&gt;All connection attempts failed&lt;/code&gt; or &lt;code&gt;No route to host&lt;/code&gt; errors.&lt;/p&gt;&#xA;&lt;p&gt;The fix is one line: add &lt;code&gt;NO_PROXY=*&lt;/code&gt; to the LaunchAgent&amp;rsquo;s plist &lt;code&gt;EnvironmentVariables&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This article documents the full debugging journey: from discovering that my AI Agent&amp;rsquo;s WeChat Enterprise (WeCom) messages weren&amp;rsquo;t being replied to, through methodical proxy troubleshooting, to finally pinning down the root cause — macOS system proxy + LaunchAgent network isolation. We&amp;rsquo;ll dive deep into Python httpx source code, macOS proxy architecture, and the many gotchas of LaunchAgent runtime environments.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Complete AI Agent Migration Guide: A Real-World Journey from Scratch with 9 Pitfalls and Fixes</title>
      <link>https://blog.margrop.net/en/post/ai-agent-complete-migration-guide-from-scratch/</link>
      <pubDate>Sat, 30 May 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-agent-complete-migration-guide-from-scratch/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Migrating from one AI Agent platform to another sounds like a &amp;ldquo;copy and paste&amp;rdquo; job. In reality, it&amp;rsquo;s a systems engineering challenge involving data migration, channel integration, scheduled tasks, auto-start configuration, proxy settings, and module compatibility.&lt;/p&gt;&#xA;&lt;p&gt;This article documents my complete migration journey: from installing the new platform, migrating memories and skills, configuring messaging channels, debugging mysterious failures, to achieving fully automated operation. 9 pitfalls encountered, 9 solutions found — all shared here.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Claude Code Upgrade Broke Every Model? Before You Rotate Keys, Check the Compatibility Gateway</title>
      <link>https://blog.margrop.net/en/post/claude-code-invalid-message-role-system/</link>
      <pubDate>Fri, 29 May 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/claude-code-invalid-message-role-system/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After a Claude Code upgrade, every model call failed with the same error: &lt;code&gt;API Error: 400 invalid params, chat content has invalid message role: system (2013)&lt;/code&gt;. At first glance this looks like a bad API key, a dead model, an exhausted account, a broken proxy, or a provider-wide outage. The root cause was different: a newer Claude Code request shape crossed an Anthropic-compatible model gateway that had not caught up with the client-side protocol behavior. The gateway, or a downstream chat validation layer behind it, rejected a &lt;code&gt;system&lt;/code&gt; role in a place where it did not expect one.&lt;/p&gt;&#xA;&lt;p&gt;The practical fix was not to randomly reinstall things. I reproduced the failure with the smallest possible prompt, tested adjacent Claude Code versions, and found the last known good version. &lt;code&gt;2.1.150&lt;/code&gt; returned &lt;code&gt;OK&lt;/code&gt;; &lt;code&gt;2.1.154&lt;/code&gt; and &lt;code&gt;2.1.156&lt;/code&gt; reproduced the 400. Pinning the global Claude Code installation back to &lt;code&gt;2.1.150&lt;/code&gt; restored the existing provider path.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is a troubleshooting write-up for a local Claude Code environment. The fix itself was small, but the incident is useful because it shows a pattern that is becoming common in AI agent tooling: the CLI, environment settings, model gateway, API compatibility layer, and actual model backend are often separate moving pieces. When one layer changes its request structure, the terminal may only show a vague 400.&lt;/p&gt;&#xA;&lt;p&gt;All private details have been removed. This article does not include real internal addresses, usernames, tokens, private provider names, local absolute paths, or private service domains. Configuration examples use placeholders such as &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;MODEL_GATEWAY&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;MODEL_NAME&amp;gt;&lt;/code&gt;. The goal is to document a reusable debugging method, not to expose a specific environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why My AI Assistant Repeated One Reply Four Times: Debugging an OpenClaw WeChat Channel Issue</title>
      <link>https://blog.margrop.net/en/post/openclaw-wechat-duplicate-reply-debugging/</link>
      <pubDate>Fri, 29 May 2026 11:24:29 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-wechat-duplicate-reply-debugging/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The symptom looked like a messaging-channel bug: an AI assistant connected to a personal chat channel appeared to repeat the same reply multiple times. The real bug was earlier in the chain. Before the reply ever reached the message-sending layer, the OpenClaw agent had already produced duplicated visible text. The useful fix was not to patch the chat sender blindly, but to split the path into transport, session, model-routing, and provider layers, then compare the OpenAI-compatible gateway path with the native provider path. Once the faulty compatible provider candidate was removed from the visible model set and the personal IM channel was pinned to the native provider, the same minimal prompt returned exactly once.&lt;/p&gt;&#xA;&lt;p&gt;This post is deliberately privacy-safe. It contains no real internal addresses, account IDs, tokens, session IDs, personal chat identifiers, or private file paths. Configuration examples use placeholders. The value is the debugging method, not the private environment.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>OpenClaw Upgrade Guide: From Beginner to Expert</title>
      <link>https://blog.margrop.net/en/post/openclaw-hermesagent-upgrade-guide/</link>
      <pubDate>Fri, 29 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-hermesagent-upgrade-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;OpenClaw is a powerful personal AI assistant that supports multiple messaging channels and AI models. Upgrading OpenClaw is actually very simple — the most recommended way is to use the &lt;code&gt;openclaw update&lt;/code&gt; command. This article will详细介绍 various upgrade methods, including switching from npm package installation to git source installation, as well as verification and rollback strategies after upgrading.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All examples in this article use public projects, public links, and placeholders. No real server addresses, accounts, tokens, business configuration, or private network details are included. The figures are taken from the official OpenClaw repository and documentation, and are referenced under the project&amp;rsquo;s MIT license.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating from OpenClaw to HermesAgent: A Smooth AI Agent Migration in Practice</title>
      <link>https://blog.margrop.net/en/post/openclaw-to-hermesagent-migration/</link>
      <pubDate>Fri, 29 May 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-to-hermesagent-migration/</guid>
      <description>&lt;h2 id=&#34;introduction-why-am-i-moving&#34;&gt;Introduction: Why Am I &amp;ldquo;Moving&amp;rdquo;?&lt;/h2&gt;&#xA;&lt;p&gt;In 2026, the AI agent landscape is evolving at an incredible pace. Tools that were cutting-edge six months ago might already be surpassed by more powerful alternatives. As someone who relies heavily on AI agents for daily work, I&amp;rsquo;ve been closely following the latest developments in this field.&lt;/p&gt;&#xA;&lt;p&gt;Recently, I completed a full migration from OpenClaw to HermesAgent. This wasn&amp;rsquo;t an impulsive decision, but a thoughtful choice made after experiencing the differences between the two tools in real-world usage.&lt;/p&gt;&#xA;&lt;p&gt;This article will share in detail:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Background&lt;/strong&gt;: What OpenClaw and HermesAgent are&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Migration Reasons&lt;/strong&gt;: Why I decided to migrate&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Migration Process&lt;/strong&gt;: Step-by-step guide to complete the migration&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pitfalls Encountered&lt;/strong&gt;: Problems and solutions during migration&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post-Migration Cleanup&lt;/strong&gt;: How to completely remove OpenClaw residuals&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post-Migration Experience&lt;/strong&gt;: New capabilities gained from HermesAgent&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;: Frequently asked questions&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Avoiding the Trap: Why Fail2Ban Fails on Ubuntu 26.04 &amp; PVE 9.2 (And How to Fix It)</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-pve-92-fail2ban-nftables-guide/</link>
      <pubDate>Tue, 26 May 2026 22:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-pve-92-fail2ban-nftables-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The Bottom Line&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;With the releases of Ubuntu 26.04 LTS and Proxmox VE (PVE) 9.2, many system administrators, DevOps engineers, and self-hosting enthusiasts have eagerly upgraded or clean-installed these latest systems. However, during the post-installation security hardening phase, you may encounter a highly frustrating scenario: &lt;strong&gt;simply copying over your legacy Fail2Ban configuration files from older versions (such as Ubuntu 20.04/22.04 or PVE 7.x/8.x) will either cause the Fail2Ban service to crash during startup or, worse, run silently in the background while completely failing to block external brute-force attacks!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This issue is not caused by a bug in Fail2Ban itself. Instead, it is the result of three &amp;ldquo;invisible bombs&amp;rdquo; hidden beneath the surface of these modern Linux distributions, namely changes in the logging architecture, service activation mechanisms, and firewall backends. This article provides an in-depth analysis of these three architectural shifts and introduces a modern, bulletproof Fail2Ban configuration guide fully integrated with &lt;code&gt;systemd-journald&lt;/code&gt; and &lt;code&gt;nftables&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Forget Bloated VPNs! Step-by-Step EasyTier Setup on Ubuntu 26.04 for a Decentralized Virtual LAN</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-install-latest-easytier-guide/</link>
      <pubDate>Tue, 26 May 2026 21:40:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-install-latest-easytier-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In today&amp;rsquo;s multi-device environment, virtual private networking has become an absolute necessity. While classic tools like ZeroTier and Tailscale are excellent, they are fundamentally constrained by centralized controllers and overseas relay servers, leading to slow handshakes and lower NAT hole-punching success rates. On the other hand, self-hosting frp or nps requires a public IP address, and all traffic must pass through the proxy server, severely limiting bandwidth.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;EasyTier&lt;/strong&gt; is a completely decentralized virtual LAN tool written in Rust. Its defining feature is &lt;strong&gt;peer symmetry (peer-to-peer equivalence)&lt;/strong&gt;. Once nodes are introduced, they maintain stable P2P communication even if the initial bootstrap/relay server goes offline. Even more exciting, it natively supports &lt;strong&gt;subnet proxying (network-to-network)&lt;/strong&gt; and a &lt;strong&gt;built-in WireGuard portal&lt;/strong&gt;. This step-by-step guide will walk you through installing, configuring, and managing the latest EasyTier via Systemd on the newly released &lt;strong&gt;Ubuntu 26.04 LTS&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All configurations, commands, and network topologies in this article use generic placeholders and do not contain any real private or sensitive information.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t Rush After Installing Ubuntu 26.04 LTS! Swiftly Configure Domestic Mirrors (Huawei &amp; Alibaba Cloud APT Sources DEB822 Tutorial)</title>
      <link>https://blog.margrop.net/en/post/ubuntu-26-apt-source-mirror-setup-guide/</link>
      <pubDate>Tue, 26 May 2026 21:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-26-apt-source-mirror-setup-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ubuntu 26.04 LTS (Resolute Raccoon) has officially been released. If you have just installed it, the very first thing you should do is replace the default APT sources with fast domestic mirror servers (such as Alibaba Cloud or Huawei Cloud). Note that starting from Ubuntu 24.04, the system has transitioned entirely to the new &lt;strong&gt;DEB822&lt;/strong&gt; format for APT source configurations (stored in &lt;code&gt;/etc/apt/sources.list.d/ubuntu.sources&lt;/code&gt;), making the traditional &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; inactive by default.&lt;/p&gt;&#xA;&lt;p&gt;This tutorial provides a step-by-step guide on how to safely change to Alibaba Cloud and Huawei Cloud mirrors in Ubuntu 26.04 LTS, along with deep troubleshooting analysis for potential pitfalls like dependency conflicts and version codename mismatches.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Seamless Homelab Networking: Deploying Tailscale on Ubuntu 26.04 for Effortless Remote Access</title>
      <link>https://blog.margrop.net/en/post/seamless-homelab-networking-deploy-tailscale-ubuntu-2604/</link>
      <pubDate>Tue, 26 May 2026 14:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/seamless-homelab-networking-deploy-tailscale-ubuntu-2604/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The Short Version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Cross-carrier connectivity, lack of public IPv4 addresses, and multi-device connection management have always been the ultimate pain points for Homelab enthusiasts and enterprise sysadmins alike. This article provides a comprehensive, step-by-step guide on how to cleanly and securely install and configure the latest version of Tailscale on the newly released Ubuntu 26.04 (Resolute Raccoon) using the modern APT Keyring standards. Beyond a clean command-line install walkthrough, we delve into the architectural design of Tailscale, Subnet Router routing, and Exit Node proxying to establish a seamless, encrypted mesh network linking your home Synology NAS, Proxmox VE hypervisors, remote laptops, and mobile devices.&lt;/p&gt;&#xA;&lt;p&gt;All setups and commands documented here have been rigorously tested on a clean Ubuntu 26.04 (Resolute Raccoon) environment. To prioritize safety and avoid leakage, all internal IP addresses, access tokens, routing tables, and server domains have been fully masked using generic placeholders.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Using Old Methods! Deploying the Latest Docker CE on Ubuntu 26.04 LTS with Ultra-fast Mirror Setup</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-docker-install-guide/</link>
      <pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-docker-install-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Foreword&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;With the official release of Ubuntu 26.04 LTS (Resolute Raccoon), developers and system administrators worldwide are upgrading their development, testing, and production environments to this long-term support version. However, setting up Docker—the cornerstone of modern containerization and microservices architecture—on a brand-new LTS release can sometimes present unexpected friction.&lt;/p&gt;&#xA;&lt;p&gt;If you are still relying on legacy commands like &lt;code&gt;apt-get install docker.io&lt;/code&gt;, or copy-pasting outdated tutorials meant for Ubuntu 20.04 or 22.04, you are likely to run into issues. These issues range from outdated software packages to APT repository format mismatches (especially with the widespread adoption of the new DEB822 format), or network timeouts when pulling images from container registries in restricted environments.&lt;/p&gt;&#xA;&lt;p&gt;This article provides a comprehensive, step-by-step, and highly detailed guide to installing Docker Community Edition (Docker CE) on Ubuntu 26.04 LTS. We will delve into modern DEB822 repository configurations, non-root system privilege separation, systemd service tweaks, and advanced network acceleration (both HTTP/HTTPS proxies and private registry mirrors).&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Do Not Waste Your Codex Quota Before the Reset: Meet Codex Reset Radar</title>
      <link>https://blog.margrop.net/en/post/codex-reset-radar-quota-reset-guide/</link>
      <pubDate>Sun, 24 May 2026 08:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/codex-reset-radar-quota-reset-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Codex resets have recently become more important to watch. Sometimes the reset is part of the normal usage cycle. Sometimes it is a compensation reset after an incident. Sometimes it follows a fix for abnormal limit consumption. For heavy Codex users, the painful part is not that the quota resets. The painful part is discovering that you still had useful weekly quota left, but you did not use it before the reset overwrote the old window.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Codex Reset Radar&lt;/code&gt; is a small public dashboard that turns scattered public signals into a practical warning: if a Codex quota reset window is likely or already open, it tells you to use your remaining weekly quota on valuable work before it expires.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article discusses only public pages, public status signals, and public references. It does not include private accounts, tokens, internal systems, private network details, or personal usage data. Any discussion of quota, reset windows, and early warnings is a user-side workflow analysis, not an official statement about OpenAI billing, subscription policy, or service guarantees.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop Worshipping Agent Frameworks: 12-Factor Agents as an Engineering Baseline</title>
      <link>https://blog.margrop.net/en/post/12-factor-agents-agent-principles/</link>
      <pubDate>Sat, 23 May 2026 14:50:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/12-factor-agents-agent-principles/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;12-Factor Agents&lt;/code&gt; is not an installable agent framework, and it is not a Skill for Codex, Claude, Cursor, or any other agent runtime. It is better understood as a set of engineering principles for the AI era. When a system made from a large model, a tool list, and a while loop reaches the familiar 70% or 80% quality bar but refuses to become production-grade, these principles tell you where to look: prompts, context, structured outputs, state, human approval, error compaction, control flow, and recovery.&lt;/p&gt;&#xA;&lt;p&gt;The best part is that it does not romanticize agents. It says, in effect, that reliable agents are mostly software. The LLM is powerful, but it should live inside a system that is observable, interruptible, recoverable, auditable, and testable.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All examples in this article use public projects, public links, and placeholders. No real server addresses, accounts, tokens, business configuration, or private network details are included. The figures are taken from the official &lt;code&gt;humanlayer/12-factor-agents&lt;/code&gt; repository and are referenced under the project author&amp;rsquo;s CC BY-SA 4.0 content license statement. Code license details should be checked in the upstream repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox VE 9.2 Is Out: Not Just a New Kernel, but a Cluster That Can Start Balancing Itself</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-9-2-dynamic-load-balancer-release/</link>
      <pubDate>Sat, 23 May 2026 12:46:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-9-2-dynamic-load-balancer-release/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Proxmox VE 9.2 was officially released on May 21, 2026. On the surface it is a platform refresh: Debian 13.5 Trixie, Linux kernel 7.0, QEMU 11.0, LXC 7.0, ZFS 2.4, and updated Ceph options. The more interesting story is operational: dynamic load balancing through CRS, safer HA maintenance with arm/disarm, a much stronger SDN fabric story, web-based custom CPU model management, and many smaller fixes around guests, storage, security, and automation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you run a single-node homelab, Proxmox VE 9.2 may not feel dramatic on day one. If you operate a multi-node cluster with HA resources, Ceph, software-defined networking, custom CPU compatibility requirements, Windows secure boot, external automation, or strict maintenance windows, this release deserves a careful read.&lt;/p&gt;&#xA;&lt;p&gt;This article summarizes the official Proxmox VE 9.2 release and adds an operator’s view: what changed, what problem each change addresses, what to test before upgrading, and when it is reasonable to wait. All hostnames, addresses, cluster names, accounts, and command outputs are placeholders. No private environment details are included.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your MCP Config Was Fine. The Server Died Before the Handshake.</title>
      <link>https://blog.margrop.net/en/post/codex-mcp-startup-swift-runtime-troubleshooting/</link>
      <pubDate>Sat, 23 May 2026 06:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/codex-mcp-startup-swift-runtime-troubleshooting/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The misleading part of this incident was the surface error. Codex reported that an MCP client could not initialize and that the MCP server handshake failed. That naturally pushes you toward MCP configuration, JSON-RPC initialization, plugin settings, authentication, network transport, or stale tool caches. But the root cause was lower than the MCP protocol: one local MCP server binary was killed by the macOS dynamic linker before it could answer the &lt;code&gt;initialize&lt;/code&gt; request. The client only saw a closed connection. The useful evidence was in the server stderr: &lt;code&gt;dyld: Symbol not found&lt;/code&gt;, pointing at a missing Swift Concurrency runtime symbol.&lt;/p&gt;&#xA;&lt;p&gt;In other words, MCP did not really get a chance to fail. The server process died first.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article walks through a real troubleshooting pattern around Codex, MCP clients, and MCP servers. The failure looked like a protocol startup problem, but the root cause lived in a native macOS binary and its Swift runtime compatibility.&lt;/p&gt;&#xA;&lt;p&gt;All private details have been removed. This article does not include real internal addresses, usernames, session IDs, full local paths, tokens, private repository names, or business system names. Paths use placeholders such as &lt;code&gt;~&lt;/code&gt;, &lt;code&gt;&amp;lt;USER_HOME&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;PLUGIN_DIR&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;PROJECT&amp;gt;&lt;/code&gt;. Log snippets keep only the technical fields needed to explain the diagnosis.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop Letting Agents Guess UI: Installing and Using UI UX Pro Max the Right Way</title>
      <link>https://blog.margrop.net/en/post/ui-ux-pro-max-agent-skill-guide/</link>
      <pubDate>Fri, 22 May 2026 22:50:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ui-ux-pro-max-agent-skill-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;UI UX Pro Max is not a magic prompt that suddenly gives an agent taste. It is a searchable UI/UX design intelligence Skill for AI coding assistants such as Claude Code, Codex, Cursor, Windsurf, Gemini, OpenCode, and similar tools. It packages product patterns, UI styles, color palettes, typography pairings, landing page structures, chart recommendations, UX guidelines, and stack-specific implementation advice into files and scripts that an agent can actually query.&lt;/p&gt;&#xA;&lt;p&gt;The right way to use it is not to install it and keep asking for “a beautiful page.” The right way is to make the agent generate a design system first, then query UX, chart, web, or stack-specific guidance, and only then implement the page. That workflow reduces generic AI gradients, weak contrast, crowded mobile layouts, decorative dashboards, missing focus states, and many other common agent-generated UI problems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article uses only public references, a public repository, and a clean temporary verification directory. Commands, paths, project names, and examples are generic. No private addresses, credentials, internal project names, account names, or personal configuration are included. Screenshots are taken from public reference pages and sanitized verification work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 After Install: Set Up Chinese Display and Chinese Input the Right Way</title>
      <link>https://blog.margrop.net/en/post/ubuntu2604-desktop-chinese-language-input-method/</link>
      <pubDate>Fri, 22 May 2026 16:05:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu2604-desktop-chinese-language-input-method/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After installing Ubuntu 26.04 Desktop, do not treat Chinese support as “just install one input method package.” The stable sequence is: update the system, install full Chinese language support, install CJK fonts, decide whether the desktop UI itself should be Chinese, add a Chinese input source, and only then choose between the GNOME-friendly IBus Intelligent Pinyin path and the more customizable Fcitx5 path.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Ubuntu 26.04 LTS is a very usable desktop system out of the box, but Chinese users usually hit the same three issues soon after installation: the interface is partly translated or not translated at all, Chinese text looks thin or falls back to poor fonts, and the input method either does not appear or cannot be switched reliably.&lt;/p&gt;&#xA;&lt;p&gt;Those issues should not be fixed separately. On Ubuntu Desktop, language support and input methods are connected. Language packages provide translations, regional formats, fonts, dictionaries, and related desktop resources. The input method framework converts keyboard events into Chinese candidates. GNOME Settings connects those engines to the active desktop session. If you only install &lt;code&gt;ibus-libpinyin&lt;/code&gt; or only install &lt;code&gt;fcitx5&lt;/code&gt;, you may end up with a system that can technically type Chinese but still feels unfinished.&lt;/p&gt;&#xA;&lt;p&gt;This article is for users who have just installed Ubuntu 26.04 Desktop, and also for people who routinely prepare Linux laptops or desktops for family, coworkers, or new machines. The goal is not to build the most complicated input method setup. The goal is a clean baseline: Chinese text displays correctly, Chinese input switches reliably, and the English desktop can remain available if you prefer it.&lt;/p&gt;&#xA;&lt;p&gt;All screenshots in this article are real operation screenshots from public references and are stored locally on this site. One screenshot was cropped before being included to remove an unrelated remote-desktop title bar. Ubuntu 26.04 daily images, final release images, OEM builds, and later point releases may use slightly different labels, but the workflow and troubleshooting logic are the same.&lt;/p&gt;</description>
    </item>
    <item>
      <title>After Buying a Domain, Use Cloudflare Tunnel to Turn Home Services into Public HTTPS</title>
      <link>https://blog.margrop.net/en/post/cloudflare-tunnel-public-https-no-public-ip/</link>
      <pubDate>Thu, 21 May 2026 11:38:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/cloudflare-tunnel-public-https-no-public-ip/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The previous two posts covered the cheap-domain part and the Cloudflare DNS part: buy a low-cost &lt;code&gt;.xyz&lt;/code&gt; domain for personal lab use, then move the domain to Cloudflare for nameservers, DNS, DDNS, email routing, and basic automation. This post continues with the next practical step: use Cloudflare Tunnel to expose an internal web service as a public &lt;code&gt;https://&lt;/code&gt; hostname. The important point is that visitors use standard HTTPS on port 443, while your home router does not need to forward ports 80 or 443 and your origin IP does not need to be exposed.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article follows these two posts:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;“Ten Years for 80 Yuan: Why I Prefer 6-Digit &lt;code&gt;.xyz&lt;/code&gt; Domains for Personal Sites”&lt;br&gt;&#xA;Original link: &lt;a href=&#34;https://mp.weixin.qq.com/s/tbefnWGFI0QBFlRVcYjVEw&#34;&gt;https://mp.weixin.qq.com/s/tbefnWGFI0QBFlRVcYjVEw&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;“Do Not Waste That 80-Yuan Ten-Year Domain: Put It on Cloudflare First”&lt;br&gt;&#xA;Original link: &lt;a href=&#34;https://mp.weixin.qq.com/s/h0o-vtGB_zj1aptaumBztQ&#34;&gt;https://mp.weixin.qq.com/s/h0o-vtGB_zj1aptaumBztQ&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Those posts already covered buying a cheap &lt;code&gt;.xyz&lt;/code&gt; domain, moving nameservers to Cloudflare, creating DNS records, using DDNS, and setting up email-related records. This post assumes that your domain is already active on Cloudflare. We will focus on one thing: publishing an internal web service through Cloudflare Tunnel with a clean public HTTPS hostname.&lt;/p&gt;&#xA;&lt;p&gt;All examples in this article use documentation placeholders such as &lt;code&gt;example.xyz&lt;/code&gt;, &lt;code&gt;nas.speedtest.example.xyz&lt;/code&gt;, &lt;code&gt;192.0.2.10&lt;/code&gt;, &lt;code&gt;localhost&lt;/code&gt;, and &lt;code&gt;&amp;lt;TUNNEL_TOKEN&amp;gt;&lt;/code&gt;. No real domain, account, token, zone ID, private network address, or personal information is included.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini 3.5 Is Not Just Faster: Google I/O Moves AI Into the Agent Era</title>
      <link>https://blog.margrop.net/en/post/google-io-2026-gemini-35-agent-era/</link>
      <pubDate>Wed, 20 May 2026 07:05:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/google-io-2026-gemini-35-agent-era/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The most important Google I/O 2026 announcement is not merely another chat model. Google is moving Gemini 3.5 into the action layer. The first public model, Gemini 3.5 Flash, is now part of the Gemini app, Search AI Mode, Google Antigravity, the Gemini API, Android Studio, Gemini Enterprise Agent Platform, and Gemini Enterprise. Google&amp;rsquo;s phrase is &lt;strong&gt;frontier intelligence with action&lt;/strong&gt;. In practical terms, the model is meant to do more than answer: it is expected to operate across tools, code, files, search, and enterprise workflows.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article is based on Google&amp;rsquo;s official public announcements and adds industry analysis on top of them. All images are from Google&amp;rsquo;s public blog posts. The article contains no private account information, internal network details, secrets, private system screenshots, or non-public data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shanghai Telecom Users: Claim 25 Million AI Tokens for Free, Valid for 1 Month</title>
      <link>https://blog.margrop.net/en/post/shanghai-telecom-free-25m-ai-token/</link>
      <pubDate>Mon, 18 May 2026 15:08:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/shanghai-telecom-free-25m-ai-token/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you are a Shanghai Telecom user, there is currently a 0-yuan offer to claim &lt;strong&gt;25 million tokens for the AI STORE Tianyi intelligent inference service quota edition&lt;/strong&gt;, valid for 31 days, roughly 1 month. The entry point comes from a public Shanghai Telecom WeChat article. I have personally verified the process and successfully claimed it. After a successful claim, China Telecom sends an SMS saying the &lt;code&gt;AI STORE Tianyi Intelligent Inference Service Quota Edition (one-time)&lt;/code&gt; has taken effect immediately.&lt;/p&gt;&#xA;&lt;p&gt;Claim link: &lt;a href=&#34;https://emall.sh.189.cn/stock/#/weChat/junior/handle/113238?cx=YUELIN&#34;&gt;https://emall.sh.189.cn/stock/#/weChat/junior/handle/113238?cx=YUELIN&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post only summarizes the public claim link, practical reminders, and source attribution. It does not include phone numbers, account information, private SMS details, internal addresses, or any private configuration. This is a time-sensitive offer, so the official Shanghai Telecom page you see at the time of access is the final reference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Chrome Could Not Log In to Bitwarden, but Old Machines Still Worked: A Vaultwarden Compatibility Trap</title>
      <link>https://blog.margrop.net/en/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</link>
      <pubDate>Mon, 18 May 2026 10:05:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The failure looked like a Chrome or Bitwarden extension problem: newly installed computers could not log in to a self-hosted Vaultwarden instance, while existing computers continued to work with the same Bitwarden &lt;code&gt;2026.4.1&lt;/code&gt; browser extension. The actual root cause was server-side compatibility: the clients were using a newer prelogin endpoint, while the Vaultwarden server was still running &lt;code&gt;vaultwarden/server:1.35.4-alpine&lt;/code&gt;, which did not provide &lt;code&gt;/identity/accounts/prelogin/password&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Existing machines were likely protected by an already established login state and local cache. They did not prove that the full first-login API path was still compatible. The correct fix was to back up the Vaultwarden data, upgrade the server image to &lt;code&gt;1.36.0&lt;/code&gt; or newer, and confirm from logs that the prelogin endpoint no longer returned 404.&lt;/p&gt;&#xA;&lt;p&gt;All domains, paths, usernames, and deployment details in this article are sanitized. Examples use placeholders such as &lt;code&gt;vault.example.com&lt;/code&gt; and &lt;code&gt;/opt/vaultwarden&lt;/code&gt;; no internal network or private information is included.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>[Clickbait Alert] Switching to a Chinese Mirror Nearly Broke My Ubuntu: A Real Story of apt Dependency Hell</title>
      <link>https://blog.margrop.net/en/post/ubuntu-26-apt-source-mirror-dependency-conflict-fix/</link>
      <pubDate>Sun, 17 May 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-26-apt-source-mirror-dependency-conflict-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I switched to a domestic Chinese mirror for Ubuntu and thought it would take 10 minutes. It took two hours. This article documents the entire journey from &amp;ldquo;mirror sync delay causing version mismatch&amp;rdquo; to &amp;ldquo;dpkg forced downgrade&amp;rdquo; to &amp;ldquo;apt fully restored.&amp;rdquo; The core lesson: switching a mirror is not a one-click fix—version consistency is everything. If you swap mirrors on a system that&amp;rsquo;s been running for months, you have a 99% chance of hitting dependency conflicts.&lt;/p&gt;&#xA;&lt;p&gt;All operations in this article are based on Ubuntu 26.04 (Plucky). All IPs, hostnames, and paths are sanitized examples and contain no internal network addresses or sensitive information.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Dragging Files Around: BaiduPCS-Go CLI and Agent Workflows for Baidu Netdisk</title>
      <link>https://blog.margrop.net/en/post/baidupcs-go-cli-agent-guide/</link>
      <pubDate>Sat, 16 May 2026 10:06:01 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/baidupcs-go-cli-agent-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you only download one or two files from Baidu Netdisk once in a while, the web UI and official desktop client are fine. Once you start doing batch downloads, remote server pulls, archive uploads, directory audits, or Agent-assisted workflows with Codex, Claude, OpenClaw, HermesAgent, or similar tools, the graphical UI becomes friction. &lt;code&gt;BaiduPCS-Go&lt;/code&gt; is useful not because it is a magic speed booster, but because it turns Baidu Netdisk into something scripts, terminals, and Agents can operate. This article walks through installation checks, BDUSS/STOKEN login, everyday commands, configuration, safety rules, and practical Agent integration.&lt;/p&gt;&#xA;&lt;p&gt;All accounts, cookies, paths, tasks, and settings in this article are sanitized examples. They do not contain real BDUSS, STOKEN, cookies, private directories, internal addresses, or business information.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>After Buying an 80-Yuan 10-Year Domain, Hand the Rest to Cloudflare</title>
      <link>https://blog.margrop.net/en/post/cloudflare-domain-dns-ddns-email-agent/</link>
      <pubDate>Wed, 13 May 2026 08:46:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/cloudflare-domain-dns-ddns-email-agent/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Buying a cheap domain is only the first step. The real value starts when you move authoritative DNS to Cloudflare: DNS records, dynamic DNS, business email verification, mail forwarding, certificate automation, and even Agent-assisted configuration through scoped API Tokens can all live behind one clean control plane. The previous article covered how to buy a low-cost &lt;code&gt;.xyz&lt;/code&gt; domain for roughly &lt;code&gt;80 RMB for 10 years&lt;/code&gt;. This one continues from there: how to connect that domain to Cloudflare, the generous infrastructure provider many people jokingly call a public good of the Internet, and how to use it efficiently without leaking secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All screenshots and examples in this article use safe placeholders such as &lt;code&gt;example.xyz&lt;/code&gt;, &lt;code&gt;203.0.113.10&lt;/code&gt;, and &lt;code&gt;2001:db8::10&lt;/code&gt;. They do not contain real domains, real IP addresses, Cloudflare account identifiers, Zone IDs, API Tokens, or private network information. Replace the placeholders with your own values when you follow the steps.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop Clicking Remote Desktop: Let AI Agents SSH into Windows Instead</title>
      <link>https://blog.margrop.net/en/post/agent-ssh-windows-openssh/</link>
      <pubDate>Wed, 13 May 2026 08:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/agent-ssh-windows-openssh/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;An AI agent does not need Remote Desktop, VNC, or a proprietary remote-control tool to operate a Windows machine. For many workstations, lab machines, development PCs, and internal servers, the cleanest path is to enable the built-in &lt;strong&gt;OpenSSH Server&lt;/strong&gt; on Windows and connect from Linux or macOS with a normal command: &lt;code&gt;ssh &amp;lt;user&amp;gt;@&amp;lt;windows-host&amp;gt;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;There are only three things to get right. First, install and enable OpenSSH Server on Windows 10 or Windows 11. Second, generate an SSH key on Linux or macOS and place the public key on Windows. Third, if the target account belongs to the Windows Administrators group, put the public key in &lt;code&gt;C:\ProgramData\ssh\administrators_authorized_keys&lt;/code&gt; and lock down the ACL with &lt;code&gt;icacls&lt;/code&gt;. After that, an AI agent can run PowerShell, copy scripts, collect logs, install tools, and perform repeatable maintenance through the same SSH workflow it already uses for Linux.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All hostnames, addresses, usernames, screenshots, and commands in this article use generic placeholders. No real internal addresses, usernames, machine names, tokens, keys, or private paths are included. Replace placeholders such as &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;windows-host&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;windows-ip&amp;gt;&lt;/code&gt; with values from your own environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ten Years for 80 Yuan: Why a 6-Digit .xyz Domain Is Good Enough for Personal Labs</title>
      <link>https://blog.margrop.net/en/post/low-cost-xyz-domain-for-personal-labs/</link>
      <pubDate>Tue, 12 May 2026 19:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/low-cost-xyz-domain-for-personal-labs/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If the domain is for a home lab, personal testing, temporary demos, API callbacks, development services, or other non-formal websites, I would first look at low-cost &lt;code&gt;.xyz&lt;/code&gt; domains. In China, Tencent Cloud often makes this especially convenient for domestic users. For some pure numeric &lt;code&gt;.xyz&lt;/code&gt; names with six or more digits, the checkout page may show a very low first-year and renewal price. If the price is 8 RMB per year, buying 10 years costs only 80 RMB.&lt;/p&gt;&#xA;&lt;p&gt;This is not a recommendation for company websites, public products, serious brands, payment systems, or long-term marketing pages. For those, a readable and trustworthy brand domain is still worth the money.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;When people start building a personal website, home lab, NAS callback endpoint, temporary API, reverse proxy, monitoring page, or small side project, they often overthink the domain name. Should it be a &lt;code&gt;.com&lt;/code&gt;? Should it be short? Should it look like a real company? Should it use pinyin, English words, initials, or a private nickname?&lt;/p&gt;&#xA;&lt;p&gt;My practical answer is: first decide what the domain is supposed to do.&lt;/p&gt;&#xA;&lt;p&gt;If it is a serious public identity, choose the name carefully. If it is just a personal utility domain, do not spend too much money or attention on the name. In that case, the domain is not a brand asset. It is a stable handle for DNS, HTTPS, reverse proxy rules, ACME certificates, third-party callbacks, object storage, and temporary services.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading PVE 8 to 9 Without Brute Force: Let an Agent Drive It, or Follow This Manual Checklist</title>
      <link>https://blog.margrop.net/en/post/pve8-to-pve9-agent-manual-upgrade-guide/</link>
      <pubDate>Tue, 12 May 2026 19:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve8-to-pve9-agent-manual-upgrade-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Upgrading Proxmox VE 8 to 9 is not just copying a few commands. It is a major system upgrade from Debian Bookworm to Trixie, from PVE 8.4 to PVE 9.x, with kernel, storage, networking, Ceph, and HA behavior in the blast radius. The fastest practical path is to let Codex, Claude, OpenClaw, HermesAgent, or a similar Agent handle checks, command sequencing, logging, and post-upgrade verification. The human operator still needs to approve repository changes, package removals, configuration prompts, reboot timing, and recovery decisions. If you prefer doing everything by hand, the second half of this article gives a concrete manual checklist.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article is for two groups of operators. The first group already uses Agents over SSH and wants a scoped one-sentence task for upgrading PVE. The second group prefers typing every command manually and wants a clear, ordered procedure with the main risk points called out.&lt;/p&gt;&#xA;&lt;p&gt;All hostnames, addresses, repositories, tokens, and accounts in this article are placeholders. Replace values such as &lt;code&gt;&amp;lt;PVE_NODE&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;BACKUP_TARGET&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;ADMIN_CONSOLE&amp;gt;&lt;/code&gt; with your own environment. Before touching a production host, read the official Proxmox documentation and verify that your backups are restorable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Codex 0.130 Removed /approvals? The Fix Is to Move Permissions to Startup Flags</title>
      <link>https://blog.margrop.net/en/post/codex-130-approval-flags/</link>
      <pubDate>Tue, 12 May 2026 18:50:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/codex-130-approval-flags/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you upgraded to Codex 0.130.0 and noticed that the old &lt;code&gt;/approvals&lt;/code&gt; habit no longer works, the practical fix is not to downgrade. Move the permission policy to launch time. Use &lt;code&gt;--ask-for-approval&lt;/code&gt; to control when Codex asks, &lt;code&gt;--sandbox&lt;/code&gt; to control what commands can touch, and reserve &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt; for environments that are already isolated outside Codex. The long flag can also be written directly as &lt;code&gt;--yolo&lt;/code&gt;, which is easier to remember, easier to type, and more consistent with command habits from tools such as Gemini.&lt;/p&gt;&#xA;&lt;p&gt;In other words, stop treating approval mode as an in-session toggle. Treat it as part of the way you start the agent.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article only discusses public Codex CLI flags and generic workflows. It does not include real hostnames, internal addresses, usernames, tokens, private paths, or project names. Commands use placeholders such as &lt;code&gt;&amp;lt;PROJECT&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;TASK&amp;gt;&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 Upgrade Guide: Let an Agent Do It, or Run It by Hand</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-upgrade-agent-manual-guide/</link>
      <pubDate>Tue, 12 May 2026 07:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-upgrade-agent-manual-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Upgrading Ubuntu 22.04 or 24.04 to Ubuntu 26.04 is not about memorizing one command. It is about following the supported upgrade path. Ubuntu 22.04 LTS should not be jumped directly to Ubuntu 26.04 LTS. Upgrade 22.04 LTS to 24.04 LTS first, then move from 24.04 LTS to 26.04 LTS. As of 2026-05-12, Ubuntu 26.04 LTS has already been released, but the normal LTS-to-LTS upgrade prompt from 24.04 LTS to 26.04 LTS is typically enabled after the first point release. The official 26.04 schedule lists the 26.04.1 point release on 2026-07-09. Production systems should usually wait for the regular upgrade path; test systems can evaluate an early upgrade only with explicit risk acceptance.&lt;/p&gt;&#xA;&lt;p&gt;If you already use agents such as Code, Claude, OpenClaw, HermesAgent, Codex, or OpenCode, this is a good task to delegate. But do not just say “upgrade Ubuntu.” Give the agent a bounded job: inspect first, back up, follow the supported path, keep logs, ask before risky choices, reboot, verify services, and report evidence. This article gives both a ready-to-copy agent prompt and a manual procedure.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All examples in this article are generic. No private hostnames, internal addresses, accounts, credentials, tokens, business system names, or personal paths are included. Replace placeholders such as &lt;code&gt;&amp;lt;HOST&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;SERVICE&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;BACKUP_DIR&amp;gt;&lt;/code&gt; with values from your own environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] Installing and Configuring an ImmortalWrt Bypass Router</title>
      <link>https://blog.margrop.net/en/post/zhuan-immortalwrt-pang-lu-you-install-config/</link>
      <pubDate>Mon, 11 May 2026 21:10:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-immortalwrt-pang-lu-you-install-config/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;This article is a full English translation of Egg Targaryen&amp;rsquo;s &amp;ldquo;ImmortalWrt旁路由安装与配置&amp;rdquo;. The original article is published under the &lt;code&gt;CC BY-NC-SA 4.0&lt;/code&gt; license. The operation order and screenshots are preserved, with minor formatting adjustments for this site.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Small Models Make Agents Drift. Superpowers Gives Them Rails.</title>
      <link>https://blog.margrop.net/en/post/agent-superpowers-stable-output/</link>
      <pubDate>Thu, 07 May 2026 16:43:10 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/agent-superpowers-stable-output/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;When an agent powered by a smaller or weaker model behaves unpredictably, the problem is not always solved by writing a longer prompt. Smaller models often struggle with long-horizon consistency, tool discipline, evidence tracking, and multi-step execution. Superpowers does not turn a weak model into a frontier model. What it does is more practical: it gives the agent an external engineering workflow made of reusable Skills, checkpoints, testing habits, debugging rules, review steps, and completion verification.&lt;/p&gt;&#xA;&lt;p&gt;For agents such as OpenClaw, HermesAgent, Codex, Claude, Gemini, OpenCode, Droid, Cursor, and similar tools, Superpowers is best understood as an engineering-discipline layer. It makes the agent less dependent on improvisation and more likely to follow a repeatable process.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article is about a very common failure mode in modern agent workflows: the model can talk fluently, but the agent does not behave reliably once the task becomes long, stateful, tool-heavy, or distributed across multiple agents.&lt;/p&gt;&#xA;&lt;p&gt;The issue becomes more visible when using smaller domestic models, local models, quantized models, or cost-optimized models. They may answer normal questions well enough, but once they need to read a repository, follow a constraint, modify files, run tests, interpret logs, preserve privacy, and report only verified results, the instability becomes obvious.&lt;/p&gt;&#xA;&lt;p&gt;All examples in this article are generic. No private hostnames, internal addresses, credentials, project names, or personal paths are included.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding Proxmox VE local-lvm Usage and Link-Speed Monitoring to Uptime Kuma</title>
      <link>https://blog.margrop.net/en/post/proxmoxve-lvm-link-speed-uptime-kuma/</link>
      <pubDate>Tue, 05 May 2026 17:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmoxve-lvm-link-speed-uptime-kuma/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Proxmox VE &lt;code&gt;local-lvm&lt;/code&gt; is usually an LVM-thin pool, not a normal mounted directory, so &lt;code&gt;df -h&lt;/code&gt; is not enough to catch it before it becomes full. Network link speed is another quiet failure mode: services may stay online while a NAS or router uplink falls back to 100 Mb/s and turns large file transfers into a crawl. A practical fix is to feed both checks into the Uptime Kuma you already use: expose a small HTTP health endpoint for &lt;code&gt;local-lvm&lt;/code&gt;, and push link-speed status from the Proxmox host with an &lt;code&gt;ethtool&lt;/code&gt; script.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article walks through the design, the problems in a naive implementation, improved scripts, systemd units, Uptime Kuma configuration, verification steps, and safety notes. All addresses, tokens, host names, and environment-specific values are placeholders. Replace &lt;code&gt;&amp;lt;PVE_HOST&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;KUMA_URL&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;PUSH_TOKEN&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;INTERFACE&amp;gt;&lt;/code&gt; with values from your own environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Prompt OpenClaw, HermesAgent, Codex, Claude, Gemini, OpenCode, and Droid to Write Articles and Publish WeChat Drafts</title>
      <link>https://blog.margrop.net/en/post/agent-prompt-wechat-draft-automation/</link>
      <pubDate>Tue, 05 May 2026 16:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/agent-prompt-wechat-draft-automation/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want an agent such as OpenClaw, HermesAgent, Codex, Claude, Gemini, OpenCode, or Droid to write an article, prepare a Hugo blog post, convert the Chinese version into WeChat-compatible HTML, preview it, fix layout issues, and create a WeChat Official Account draft, the prompt cannot simply say &amp;ldquo;write and publish an article.&amp;rdquo; A useful prompt must define the goal, source material, paths, account constraints, fixed-IP requirements, conversion steps, preview checks, failure recovery, privacy boundaries, and final verification evidence.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post describes a reusable prompting pattern for article automation. It explains how to prepare the WeChat draft API, why a Linux machine with a fixed public IP is often required, how to tell an agent to try local API access first and then fall back to a fixed-egress host, how to use a Markdown-to-WeChat-HTML converter, and how to make the agent check for invisible white text, strange indentation, broken images, and accidental leaks before declaring the job done.&lt;/p&gt;&#xA;&lt;p&gt;All examples are privacy-safe. They use placeholders rather than real secrets, private IP addresses, hostnames, repository URLs, tokens, cookies, or personal paths. Replace placeholders with your own values only in a protected runtime environment, never in a public article, public repository, or screenshot.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating Synology Operations as an OpenClaw / HermesAgent Skill: From One Sentence to Auditable NAS Automation</title>
      <link>https://blog.margrop.net/en/post/openclaw-hermesagent-synology-skill/</link>
      <pubDate>Tue, 05 May 2026 12:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-hermesagent-synology-skill/</guid>
      <description>&lt;p&gt;I have already written two Synology CLI references on this blog:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.margrop.net/en/post/synology-ssh-commands/&#34;&gt;Synology SSH Commands Cheatsheet&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.margrop.net/en/post/synology-diskstation-cli-administration-guide/&#34;&gt;Synology NAS CLI Administration Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Those posts answer the question: “What commands can a human run on a Synology NAS?” This article answers a different question: if I already use OpenClaw / HermesAgent, how can I turn those commands into an operations Skill so that I can ask the agent, in one sentence, to inspect the NAS, summarize evidence, prepare a maintenance plan, and execute approved commands only when the risk is acceptable?&lt;/p&gt;&#xA;&lt;p&gt;The short answer is: yes, but the Skill must not become an unrestricted root shell. The right design is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Make Synology SSH access controlled, testable, and revocable.&lt;/li&gt;&#xA;&lt;li&gt;Put common Synology CLI operations into a Skill, together with command categories, risk levels, and output rules.&lt;/li&gt;&#xA;&lt;li&gt;Allow read-only diagnostics by default.&lt;/li&gt;&#xA;&lt;li&gt;Require explicit approval for service restarts, permission changes, user changes, network changes, deletion, and storage operations.&lt;/li&gt;&#xA;&lt;li&gt;Preserve commands, output, and reasoning so each operation remains auditable.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;If you only want the big picture, the diagram below summarizes the whole article.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;OpenClaw / HermesAgent Synology Skill overview&#34; src=&#34;https://blog.margrop.net/post-images/openclaw-hermesagent-synology-skill/01-overview-handdrawn.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] Synology NAS CLI Administration Guide</title>
      <link>https://blog.margrop.net/en/post/synology-diskstation-cli-administration-guide/</link>
      <pubDate>Thu, 30 Apr 2026 18:20:04 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-diskstation-cli-administration-guide/</guid>
      <description>&lt;p&gt;This guide contains command tools that allow your applications to make use of the resources on Synology DiskStation and also includes a list of Synology Error Numbers for reference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] Synology DiskStation Administration CLI Guide: Reading Notes and Command Cheatsheet</title>
      <link>https://blog.margrop.net/en/post/zhuan-synology-diskstation-administration-cli-guide/</link>
      <pubDate>Thu, 30 Apr 2026 18:14:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-synology-diskstation-administration-cli-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Synology&amp;rsquo;s official CLI administration guide is not a beginner manual for the DSM web interface. It is a compact reference for scripting, automation, and system integration. The useful parts cover local users, local groups, shared folders, network configuration, service management, Windows workgroup or ADS domain settings, and DSM error numbers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is an English reading note and command cheatsheet based on Synology&amp;rsquo;s official PDF, &lt;em&gt;CLI Administrator Guide for Synology NAS&lt;/em&gt;. Because the original PDF is a copyrighted Synology document, this post does not reproduce or translate the full document verbatim. Instead, it reorganizes the material into a bilingual blog-friendly guide for quick reading and daily operations. For exact wording, parameter definitions, version-specific behavior, and legal notices, use the official PDF linked at the end.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Translation] Synology SSH Commands Cheatsheet</title>
      <link>https://blog.margrop.net/en/post/synology-ssh-commands/</link>
      <pubDate>Thu, 30 Apr 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-ssh-commands/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Warning: Running these SSH commands may damage your system/hard drive. Do not execute them if you don&amp;rsquo;t understand what they do!&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Best Home for OpenClaw / HermesAgent: Proxmox VE</title>
      <link>https://blog.margrop.net/en/post/openclaw-hermesagent-best-home-proxmoxve/</link>
      <pubDate>Wed, 29 Apr 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-hermesagent-best-home-proxmoxve/</guid>
      <description>&lt;h1 id=&#34;the-best-home-for-openclaw--hermesagent-proxmox-ve&#34;&gt;The Best Home for OpenClaw / HermesAgent: Proxmox VE&lt;/h1&gt;&#xA;&lt;p&gt;If you treat OpenClaw or HermesAgent as just another chatbot, the installation target looks unimportant. It can run on a physical machine, a VPS, a Docker host, or even a daily laptop.&lt;/p&gt;&#xA;&lt;p&gt;That changes the moment the agent starts receiving messages, running shell commands, reading and writing files, launching browser automation, storing long-term memory, and executing scheduled tasks. At that point, the question is no longer “where can it run?” The real question is: &lt;strong&gt;what boundary should contain it?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;My conclusion is simple: &lt;strong&gt;for long-running personal agents such as OpenClaw and HermesAgent, the most reliable home is not the physical host itself, but a dedicated virtual machine on Proxmox VE.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not because Proxmox VE is fashionable. It is because it solves the three problems that matter most for agent infrastructure: data isolation, compute isolation, and backup/restore.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debugging Chinese Text Turning into Underscores in tmux &#43; opencode: The Real Culprit Was client_utf8=0</title>
      <link>https://blog.margrop.net/en/post/tmux-opencode-chinese-underscore-fix/</link>
      <pubDate>Tue, 28 Apr 2026 18:40:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/tmux-opencode-chinese-underscore-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This was not an opencode Chinese rendering bug, and it was not a broken terminal font. The tmux client had been detected as not supporting UTF-8. The decisive evidence was &lt;code&gt;tmux display-message -p &#39;client_utf8=#{client_utf8}&#39;&lt;/code&gt;, which returned &lt;code&gt;client_utf8=0&lt;/code&gt;. In that state, tmux replaces non-ASCII output with underscores, so every Chinese character inside the opencode TUI appeared as &lt;code&gt;_&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post documents a small but very typical terminal debugging session. On the same Mac, running &lt;code&gt;opencode&lt;/code&gt; directly displayed Chinese text correctly. But after starting a tmux session first and then running &lt;code&gt;opencode&lt;/code&gt;, all Chinese text became underscores.&lt;/p&gt;&#xA;&lt;p&gt;This kind of problem is easy to misdiagnose. The first instinct is often to blame the font, the terminal emulator, the opencode version, a color theme, Nerd Font configuration, Unicode width handling, or a bug in the TUI framework. In this case, however, the key question was much narrower: &lt;strong&gt;does the current tmux client believe it can write UTF-8 back to the outer terminal?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;To avoid exposing private environment details, all examples below are generalized. They do not include real hostnames, private addresses, session names, credentials, usernames, or project paths. The only things preserved are the technical facts needed to understand the failure and the fix.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox VE VM Creation and Ubuntu 26.04 Unattended Installation: A Practical Guide</title>
      <link>https://blog.margrop.net/en/post/pve-vm-create-and-ubuntu-26-unattended-install/</link>
      <pubDate>Sat, 25 Apr 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-vm-create-and-ubuntu-26-unattended-install/</guid>
      <description>&lt;h1 id=&#34;proxmox-ve-vm-creation-and-ubuntu-2604-unattended-installation-a-practical-guide&#34;&gt;Proxmox VE VM Creation and Ubuntu 26.04 Unattended Installation: A Practical Guide&lt;/h1&gt;&#xA;&lt;p&gt;Creating virtual machines and installing operating systems are among the most fundamental and frequent tasks in server operations and maintenance. While traditional interactive installation via VNC or IPMI is intuitive, it is inefficient—especially when deploying multiple servers in batches. This article provides a detailed walkthrough of how to leverage Proxmox VE (PVE) combined with Cloud-init technology to achieve fully automated unattended installation of Ubuntu 26.04 Server.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why a NAS hostname with `speedtest` can sometimes be much faster</title>
      <link>https://blog.margrop.net/en/post/nas-speedtest-subdomain-acceleration/</link>
      <pubDate>Fri, 24 Apr 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/nas-speedtest-subdomain-acceleration/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If your NAS is painfully slow when accessed from outside your home, and you control both your domain name and your reverse-proxy entry, putting &lt;code&gt;speedtest&lt;/code&gt; into the subdomain can sometimes make a dramatic difference.&lt;br&gt;&#xA;This is not magic and it is not guaranteed, but it often appears to hit a more permissive carrier policy path for “speed-test-like” traffic.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post was inspired by a discussion on the fnNAS forum. The original thread makes a very direct claim: some home broadband lines seem to throttle ordinary NAS access quite aggressively, but once the hostname contains &lt;code&gt;speedtest&lt;/code&gt;, the connection can suddenly behave much better.&lt;/p&gt;&#xA;&lt;p&gt;I am not repeating the forum post word for word. Instead, I am turning the idea into a longer-lived technical note that answers three questions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Why this trick can work&lt;/li&gt;&#xA;&lt;li&gt;How to set it up with the least amount of moving parts&lt;/li&gt;&#xA;&lt;li&gt;When it will not work, or is not worth the effort&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>[Repost] Google Cloud Free VM, 2-core 1 GB RAM, 30 GB disk, 200 GB traffic/month</title>
      <link>https://blog.margrop.net/en/post/google-cloud-free-vm-repost/</link>
      <pubDate>Mon, 20 Apr 2026 08:28:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/google-cloud-free-vm-repost/</guid>
      <description>&lt;h1 id=&#34;repost-google-cloud-free-vm-2-core-1-gb-ram-30-gb-disk-200-gb-trafficmonth&#34;&gt;[Repost] Google Cloud Free VM, 2-core 1 GB RAM, 30 GB disk, 200 GB traffic/month&lt;/h1&gt;&#xA;&lt;section style=&#34;margin-bottom: 40px;line-height: 1.6em;&#34;&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;I have introduced several free cloud servers before. In fact, the three major overseas cloud providers (Google, Amazon, and Microsoft) all have free tiers. The latter two are time-limited and not very interesting. In addition to a three-month trial of regular-priced machines, Google also offers a permanent free server.&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;It comes with 2 cores, 1 GB of memory, 30 GB of disk, and 200 GB of traffic per month. That is still enough to play around with.&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&#34;margin-bottom: 24px;line-height: 1.6em;&#34;&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;font-size: 20px;letter-spacing: 0.5px;color: rgb(0, 128, 255);font-weight: bold;&#34;&gt;I. Google Cloud Trial &amp; Free&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&#34;margin-bottom: 24px;line-height: 1.6em;&#34;&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;Google Cloud, as the name suggests, is a cloud server made by Google. The current Google Cloud trial is only three months, and the quota seems to be 300 US dollars. If you buy a regular-price machine, it will be used up all at once, so it is better to use a free server.&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&#34;margin-bottom: 24px;line-height: 1.6em;&#34;&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;This article does not involve Google Cloud registration and trial use. Anyone with a Google account can register for this thing. It is not difficult. Moreover, I registered it several years ago. I don’t remember the specific details. If you don’t know, you can Google it yourself. Even if the new account is still on trial, it will not affect the trial of the free instance in this article.&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&#34;margin-bottom: 24px;line-height: 1.6em;&#34;&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;Mainly Google Cloud’s free servers. Google Cloud has given free quotas to corresponding regions.&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;Oregon, Iowa, South Carolina&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&#34;&#34;&gt;&lt;span textstyle=&#34;&#34; style=&#34;letter-spacing: 0.5px;&#34;&gt;e2-micro instance, 2-core CPU + 1g memory + 30g hard disk, with public network IPv4, 200g traffic per month. This traffic is not limited to regions. Some people will say that the picture does not say &#34;1 per month&#34; GB outbound traffic?&#34; Yes, first of all, Google Cloud only counts outbound traffic, not two-way traffic. Secondly, the free 1g traffic in the picture is &#34;advanced tier&#34;, not &#34;standard tier&#34; traffic. The advanced tier is a little better than the standard tier network quality, of course, it is only a little better (although it was not before), and the standard tier is global 200g traffic.&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;</description>
    </item>
    <item>
      <title>OpenClaw Backup Failure Investigation and Fix: From Two Broken Schedules to a Fully Restored Automation Pipeline</title>
      <link>https://blog.margrop.net/en/post/openclaw-backup-failure-investigation-and-fix/</link>
      <pubDate>Mon, 13 Apr 2026 09:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-backup-failure-investigation-and-fix/</guid>
      <description>&lt;p&gt;This post is a full incident review, not because the failure was dramatic, but because it was a very typical automation problem.&lt;/p&gt;&#xA;&lt;p&gt;Two machines lost their automatic OpenClaw backups at the same time: a local macOS machine and a remote VPS. Manual runs worked on both sides, and the archives could still be synchronized to the NAS, but the scheduled jobs were unreliable. At first glance it looked like &amp;ldquo;the scheduler did not fire.&amp;rdquo; In reality, the root cause was spread across scheduling, permissions, locking, logging, and even the way I validated the schedule.&lt;/p&gt;&#xA;&lt;p&gt;That combination is what makes these incidents annoying: every individual piece looks almost fine, yet the full pipeline still fails.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When Docker Networks Collide with the Home LAN: Moving Auto-Allocated Subnets Back to 172</title>
      <link>https://blog.margrop.net/en/post/docker-network-subnet-conflict-migration-record/</link>
      <pubDate>Mon, 13 Apr 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-network-subnet-conflict-migration-record/</guid>
      <description>&lt;p&gt;This post records a very practical Docker networking failure: the number of containers kept growing, Docker&amp;rsquo;s auto-assigned user-defined bridge networks eventually started landing in &lt;code&gt;192.168.x.x&lt;/code&gt;, and those networks began colliding with the real home LAN. The symptoms were not dramatic at first. Nothing looked “broken” in the usual sense. Containers were still running, the host was still alive, and the dashboard still looked normal. But parts of the home network became unreliable, and once I dug into it on my NAS, the root cause turned out to be the Docker network allocation strategy rather than any single bad container.&lt;/p&gt;&#xA;&lt;p&gt;The fix was straightforward in principle, but important in practice: I moved Docker&amp;rsquo;s automatic network pool to &lt;code&gt;172.16.0.0/12&lt;/code&gt;, migrated the existing &lt;code&gt;192.168.*&lt;/code&gt; networks onto the 172 private range, and made sure future networks created through Portainer, Dockhand, or plain &lt;code&gt;docker compose&lt;/code&gt; would follow the same rule.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using WoClaw to Solve Shared Memory for Multi-Agent Workflows: OpenClaw, Codex, Claude, and Gemini on the Same Table</title>
      <link>https://blog.margrop.net/en/post/woclaw-shared-memory-for-openclaw-codex-claude-gemini/</link>
      <pubDate>Sun, 05 Apr 2026 20:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/woclaw-shared-memory-for-openclaw-codex-claude-gemini/</guid>
      <description>&lt;p&gt;What matters most in a multi-agent system is often not &amp;ldquo;which model is smarter&amp;rdquo;, but &amp;ldquo;which agent still remembers what happened five minutes ago&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;When I put OpenClaw, OpenAI Codex, Claude, and Gemini into the same workflow, the most painful problem was not raw answer quality. It was context fragmentation:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;OpenClaw remembered scheduling decisions, Codex remembered implementation details, Claude remembered review conclusions, and Gemini remembered external references, but none of them knew what the others knew.&lt;/li&gt;&#xA;&lt;li&gt;Each tool had its own session lifecycle, so yesterday&amp;rsquo;s discussion was often gone by tomorrow.&lt;/li&gt;&#xA;&lt;li&gt;As soon as a project entered a multi-round, multi-tool stage, repeating the same background became more expensive than solving the problem itself.&lt;/li&gt;&#xA;&lt;li&gt;Without a shared memory layer, the final result was not collaboration, but several partial answers that looked similar and still failed to line up.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This post is about how I used WoClaw to place all of those tools on the same shared memory layer, so they could stop talking past each other and start working from the same state.&lt;/p&gt;&#xA;&lt;p&gt;To avoid leaking private information, all examples below are abstracted. They do not include real hostnames, account names, addresses, tokens, or internal project codes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clawd Code Quick Architecture Read: One Page to Understand the Python-First Rewrite Workspace</title>
      <link>https://blog.margrop.net/en/post/clawd-code-architecture-quick-read/</link>
      <pubDate>Tue, 31 Mar 2026 21:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/clawd-code-architecture-quick-read/</guid>
      <description>&lt;p&gt;The latest &lt;code&gt;margrop/clawd-code&lt;/code&gt; codebase is no longer just a preserved source archive. It is now a very explicit &lt;strong&gt;Python-first porting workspace&lt;/strong&gt;: &lt;code&gt;src/&lt;/code&gt; is the active implementation surface, &lt;code&gt;tests/&lt;/code&gt; is the verification layer, &lt;code&gt;archive/claude_code_ts_snapshot/&lt;/code&gt; is an optional local archive, and &lt;code&gt;src/reference_data/&lt;/code&gt; is the source of mirrored command and tool inventories.&lt;/p&gt;&#xA;&lt;p&gt;This short post answers one question only: &lt;strong&gt;how is the workspace organized right now?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/clawd-code-quick-overview.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clawd Code Latest Code Analysis: How a Python-First Claude Code Rewrite Organizes Commands, Tools, Sessions, and Audit</title>
      <link>https://blog.margrop.net/en/post/claude-code-daofa-tishu-source-code-analysis/</link>
      <pubDate>Tue, 31 Mar 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/claude-code-daofa-tishu-source-code-analysis/</guid>
      <description>&lt;p&gt;After reading the latest code in &lt;code&gt;margrop/clawd-code&lt;/code&gt;, the main change is obvious: this repository is no longer just an archive of the leaked Claude Code tree. It is now a &lt;strong&gt;Python-first porting workspace&lt;/strong&gt;. The tracked tree centers on &lt;code&gt;src/&lt;/code&gt; as active implementation, &lt;code&gt;tests/&lt;/code&gt; as verification, &lt;code&gt;archive/claude_code_ts_snapshot/&lt;/code&gt; as an optional local archive, and &lt;code&gt;src/reference_data/&lt;/code&gt; as the mirrored data source for commands, tools, and surface coverage.&lt;/p&gt;&#xA;&lt;p&gt;That changes the question. We are no longer asking only “what did the original source look like?” We are asking:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;can the old system be reorganized into a maintainable Python workspace?&lt;/li&gt;&#xA;&lt;li&gt;can commands, tools, sessions, permissions, and startup order be modeled explicitly?&lt;/li&gt;&#xA;&lt;li&gt;how much of the original surface is mirrored today?&lt;/li&gt;&#xA;&lt;li&gt;which parts are already runnable, and which parts are still skeletal?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;That is why I rewrote this post. The previous version still revolved around the leaked snapshot itself. This version needs to talk about the &lt;strong&gt;new engineering object&lt;/strong&gt;: the rewrite workspace.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/clawd-code-architecture-2026.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding Proxy Support to Antigravity and Claude on macOS: Safely Wrapping Electron Apps Without Patching Them</title>
      <link>https://blog.margrop.net/en/post/macos-electron-app-proxy-wrapper-for-antigravity-and-claude/</link>
      <pubDate>Wed, 25 Mar 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-electron-app-proxy-wrapper-for-antigravity-and-claude/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Before You Start&lt;/strong&gt;&#xA;This post documents a pattern that has already been validated in a real macOS environment: &lt;strong&gt;do not patch the original application bundle, and do not publish your real proxy endpoint. Instead, place a tiny wrapper app in front of the original Electron application.&lt;/strong&gt; That wrapper becomes the stable place where proxy settings, launch flags, and Node-side bootstrap logic live.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;When people first hit this problem, the instinct is usually to edit &lt;code&gt;/Applications/Claude.app&lt;/code&gt; or &lt;code&gt;/Applications/Antigravity.app&lt;/code&gt; directly. That can work once, but it is a poor long-term operational choice for three reasons:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;You may break code signing behavior and make future launches or permission prompts more fragile.&lt;/li&gt;&#xA;&lt;li&gt;Auto-updates can overwrite your local modifications at any time.&lt;/li&gt;&#xA;&lt;li&gt;If you hardcode a real proxy endpoint into the app bundle, screenshots, scripts, or a public post, you can leak private infrastructure details that never needed to be exposed.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The approach that proved much more stable was:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Leave the original &lt;code&gt;Claude.app&lt;/code&gt; and &lt;code&gt;Antigravity.app&lt;/code&gt; untouched.&lt;/li&gt;&#xA;&lt;li&gt;Create &lt;code&gt;Claude (Proxy).app&lt;/code&gt; and &lt;code&gt;Antigravity (Proxy).app&lt;/code&gt; under &lt;code&gt;~/Applications&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Let each wrapper app do only three things: load a private &lt;code&gt;proxy.env&lt;/code&gt;, export upper/lower-case proxy variables, and launch the original Electron binary with &lt;code&gt;--proxy-server&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;If the target app also uses Node/undici &lt;code&gt;fetch&lt;/code&gt;, inject a very small &lt;code&gt;NODE_OPTIONS=--require=...&lt;/code&gt; bootstrap so Node-side requests follow the same proxy path.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;All proxy endpoints in this article are intentionally redacted and replaced with placeholders such as:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http://127.0.0.1:PORT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace that value with your own local proxy entrypoint. &lt;strong&gt;Do not publish real proxy hosts, internal IP addresses, usernames, passwords, tokens, or internal domains in a public article, repository, or screenshot.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading OpenClaw to 2026.3.23-2: A Real Compatibility Upgrade Playbook</title>
      <link>https://blog.margrop.net/en/post/openclaw-upgrade-to-2026-3-23-compatibility-playbook/</link>
      <pubDate>Tue, 24 Mar 2026 21:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-upgrade-to-2026-3-23-compatibility-playbook/</guid>
      <description>&lt;p&gt;This post documents a real OpenClaw upgrade, not a laboratory demo. The goal was not simply to change a version string. The real goal was to move a small multi-node environment from &lt;code&gt;2026.3.8 / 2026.3.13&lt;/code&gt; to &lt;code&gt;2026.3.23-2&lt;/code&gt; while keeping message channels, external plugins, service startup behavior, and rollback paths under control.&lt;/p&gt;&#xA;&lt;p&gt;In practice, the most difficult part was not the OpenClaw core package. The hardest part was everything around it: plugin SDK compatibility, JIT cache reuse, mixed installation layouts, restricted outbound access on an edge node, and differences in bind mode that changed what health probes actually meant. If you do not identify those variables first, an upgrade can easily look successful while one or more production channels are already broken.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resize the disk of an Ubuntu VM in PVE — the complete workflow from Web UI to guest OS</title>
      <link>https://blog.margrop.net/en/post/pve-ubuntu-vm-disk-resize/</link>
      <pubDate>Mon, 23 Mar 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-ubuntu-vm-disk-resize/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Preface&lt;/strong&gt;&#xA;When you manage a virtualized environment with Proxmox VE, running out of disk space is only a matter of time. Maybe your Ubuntu VM keeps pulling more Docker images, or maybe database logs fill up the root partition. In short, disk expansion is a must-have skill for PVE operations. This article walks through the entire process, from resizing the virtual disk in the PVE Web UI to expanding LVM inside the Ubuntu guest, step by step.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-why-do-we-need-to-resize&#34;&gt;1 Why do we need to resize?&lt;/h2&gt;&#xA;&lt;p&gt;PVE usually allocates a fixed-size virtual disk when a VM is created, for example 32 GB. As the workload grows, that space may no longer be enough. Fortunately, PVE supports online disk expansion, and Ubuntu&amp;rsquo;s default LVM setup also supports dynamic logical volume expansion. Together, they make the process very convenient.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One Month with OpenClaw on MiniMax: Stable, Fast Enough, and Valuable Because It Lasts</title>
      <link>https://blog.margrop.net/en/post/minimax-openclaw-one-month-review/</link>
      <pubDate>Thu, 19 Mar 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/minimax-openclaw-one-month-review/</guid>
      <description>&lt;p&gt;Over the past month, I have kept MiniMax as the primary model behind OpenClaw and used it across a full set of automation tasks: routine inspections, connectivity troubleshooting, health checks, security hardening, scheduled-task cleanup, and even blog writing support. Looking back, the biggest gain was not &amp;ldquo;how much work AI can replace,&amp;rdquo; but a more practical conclusion: for a system like OpenClaw that needs to run continuously, cooperate with tools, and handle a large amount of Chinese context, the most important thing is not raw benchmark strength. It is the balance between stability, response speed, integration cost, and long-term maintainability.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Very Practical Trick: Export Yuque Documents to Markdown Without a Membership</title>
      <link>https://blog.margrop.net/en/post/yuque-url-export-markdown-without-member/</link>
      <pubDate>Fri, 06 Mar 2026 16:56:43 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/yuque-url-export-markdown-without-member/</guid>
      <description>&lt;p&gt;Many people use Yuque for technical notes, product documentation, or reading notes. But when it is time to move that content into a blog system such as Hugo, Hexo, or Jekyll, or sync it into a Git repository, the most annoying step is usually getting clean Markdown. If you have run into that problem, here is a small trick I have used for a long time: &lt;strong&gt;no paid membership, no plugin, just append a URL suffix and you get the full Markdown body directly&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/yuque-markdown-url-trick.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenAI GPT-5.4 Explained: Positioning, Capabilities, Cost, and Practical Adoption (As of 2026-03-06)</title>
      <link>https://blog.margrop.net/en/post/openai-gpt-5-4-introduction-2026/</link>
      <pubDate>Fri, 06 Mar 2026 08:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openai-gpt-5-4-introduction-2026/</guid>
      <description>&lt;p&gt;On March 5, 2026, OpenAI officially released GPT-5.4. The first question many people asked was simple: is this just another small point release, or is it a real shift in how much productive work the model can finish?&lt;/p&gt;&#xA;&lt;p&gt;If you only look at the version number, 5.4 looks like the next iteration after 5.2 and 5.3. But once you line up the official launch notes, model docs, API capability matrix, and the ChatGPT-side product updates, the core value of GPT-5.4 is not &amp;ldquo;how many more parameters it has.&amp;rdquo; The real change is that it pulls three lines of capability into a much more usable center point:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Reasoning&lt;/li&gt;&#xA;&lt;li&gt;Coding and engineering execution&lt;/li&gt;&#xA;&lt;li&gt;Tool ecosystem coordination, including computer use&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>The past and present life of SSH key algorithm Ed25519 and RSA, and how to use it today</title>
      <link>https://blog.margrop.net/en/post/ssh-ed25519-and-rsa-history-and-best-practices/</link>
      <pubDate>Mon, 02 Mar 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ssh-ed25519-and-rsa-history-and-best-practices/</guid>
      <description>Many people’s first contact with SSH starts with a line of commands:&#xA;There is nothing wrong with this command, but there is an often overlooked issue behind it: Are we talking about &amp;ldquo;RSA key type&amp;rdquo; or ssh-rsa &amp;ldquo;signature algorithm&amp;rdquo;?&#xA;These two concepts are used interchangeably in many old tutorials, leading many people to think that they are &amp;ldquo;still using old and unsafe solutions&amp;rdquo; and at the same time don&amp;rsquo;t know how to migrate, and even repeatedly step into pitfalls between new systems and old devices.</description>
    </item>
    <item>
      <title>Gitalk Broken After Migration from Gridea to Hugo: Complete Troubleshooting and Fix Log</title>
      <link>https://blog.margrop.net/en/post/gitalk-migration-from-gridea-to-hugo-complete-fix/</link>
      <pubDate>Sun, 01 Mar 2026 09:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/gitalk-migration-from-gridea-to-hugo-complete-fix/</guid>
      <description>&lt;h1 id=&#34;background&#34;&gt;Background&lt;/h1&gt;&#xA;&lt;p&gt;After migrating the blog entirely from &lt;code&gt;Gridea&lt;/code&gt; to &lt;code&gt;Hugo&lt;/code&gt;, pages load normally, but the comment section &lt;code&gt;Gitalk&lt;/code&gt; appears to be malfunctioning:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;No obvious errors are reported on the page, but the comment section doesn&amp;rsquo;t load or display historical comments.&lt;/li&gt;&#xA;&lt;li&gt;Historical articles are not associated with their original issues.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This article documents a complete troubleshooting and fix process for future reference when migrating similar sites.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Completely Migrate Gridea to Hugo (Including Pitfalls and Fixes)</title>
      <link>https://blog.margrop.net/en/post/how-to-migrate-gridea-to-hugo-completely/</link>
      <pubDate>Sat, 28 Feb 2026 21:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-migrate-gridea-to-hugo-completely/</guid>
      <description>&lt;p&gt;I recently migrated my blog from &lt;code&gt;Gridea&lt;/code&gt; to &lt;code&gt;Hugo&lt;/code&gt;. It might seem like a simple &amp;ldquo;static blog framework switch&amp;rdquo;, but there are quite a few pitfalls.&#xA;This post documents the entire process in full, especially those issues you only discover after migration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[2025-08-21 Emergency] Microsoft KB5063878 Patch May Cause Failures in Solid-State Drives (SSDs) and Hard Disk Drives (HDDs) Under Specific Circumstances</title>
      <link>https://blog.margrop.net/en/post/2025-08-2-mircosoft-kb5063878-hotfix-problems-windows-update/</link>
      <pubDate>Thu, 21 Aug 2025 16:40:49 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/2025-08-2-mircosoft-kb5063878-hotfix-problems-windows-update/</guid>
      <description>&lt;h1 id=&#34;microsoft-kb5063878-patch-may-cause-failures-in-solid-state-drives-ssds-and-hard-disk-drives-hdds-under-specific-circumstances&#34;&gt;Microsoft KB5063878 Patch May Cause Failures in Solid-State Drives (SSDs) and Hard Disk Drives (HDDs) Under Specific Circumstances&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: &lt;code&gt;Microsoft Windows 11&lt;/code&gt;&#xA;There are already many news reports on the internet about the Microsoft KB5063878 patch potentially causing failures in solid-state drives (SSDs) and hard disk drives (HDDs) under specific circumstances. For detailed information, please refer to the news links at the bottom; we won&amp;rsquo;t elaborate further here. The key question is: how do we solve this problem if we encounter it?&lt;/p&gt;&#xA;&lt;hr&gt;</description>
    </item>
    <item>
      <title>ProxmoxVE Upgrade from 8 to 9 How to upgrade to PVE9</title>
      <link>https://blog.margrop.net/en/post/proxmoxve-upgrade-from-8-to-9/</link>
      <pubDate>Wed, 06 Aug 2025 13:28:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmoxve-upgrade-from-8-to-9/</guid>
      <description>参考文档：https://pve.proxmox.com/wiki/Upgrade_from_8_to_9 Preparation before upgrading pve8to9 apt update apt dist-upgrade pveversion #reboot 建议更新完毕后重启1次 Operation step one (back up existing files) cp /etc/apt/sources.list /etc/apt/sources.list_202508_bak cp /etc/apt/sources.list.d/pve-install-repo.list /etc/apt/sources.list.d/pve-install-repo.list_202508_bak Operation step two (start upgrading) sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list.d/pve-install-repo.list apt update apt dist-upgrade Operation step three (remove unsubscribed prompts) sed -i_orig &amp;#34;s/data.status === &amp;#39;Active&amp;#39;/true/g&amp;#34; /usr/share/pve-manager/js/pvemanagerlib.js sed -i_orig &amp;#34;s/if (res === null || res === undefined || \!res || res/if(/g&amp;#34; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js sed -i_orig &amp;#34;s/.</description>
    </item>
    <item>
      <title>PVE disk inspection connected to UptimeKuma - the 404 pitfall and the final script</title>
      <link>https://blog.margrop.net/en/post/pve-host-virtual-machine-disk-space-monitor-experience-step-two/</link>
      <pubDate>Wed, 14 May 2025 22:16:48 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-host-virtual-machine-disk-space-monitor-experience-step-two/</guid>
      <description>Read first The previous article showed how to push the PVE host&amp;rsquo;s LVM-Thin usage to UptimeKuma. After following the instructions, some readers got a 404 when the script used curl. This article explains the cause, fixes the script, and provides an optional upgrade path. Follow along from scratch and you should succeed on the first try.&#xA;1 Phenomenon: curl ... 404 curl -fsS --retry 3 \ &amp;#34;${PUSH_URL}?status=up&amp;amp;msg=OK&amp;#34; \ -H &amp;#39;Content-Type: application/json&amp;#39; \ --data-raw &amp;#34;$result&amp;#34; # ↳ curl: (22) The requested URL returned error: 404 The same URL works in a browser or with curl GET:</description>
    </item>
    <item>
      <title>PVE host disk space monitoring - from pitfalls to UptimeKuma</title>
      <link>https://blog.margrop.net/en/post/pve-host-virtual-machine-lvm-disk-space-monitor-experience/</link>
      <pubDate>Wed, 14 May 2025 22:11:33 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-host-virtual-machine-lvm-disk-space-monitor-experience/</guid>
      <description>Target Reader This article is written for readers who have just started using Proxmox VE (referred to as PVE) and want to copy the steps and get it running. The article aims to:&#xA;explain why the problem happens provide the full command at each step give troubleshooting ideas when something goes wrong 0 Background - What went wrong? The official PVE installation wizard defaults to putting the VM disk into the LVM-Thin pool (commonly pve/data)</description>
    </item>
    <item>
      <title>Use LXC containers to build V2Ray and Caddy services on Alpine Linux to provide IPv6-based SSL WebSocket proxy</title>
      <link>https://blog.margrop.net/en/post/setting-up-v2ray-and-caddy-on-alpine-linux-lxc-container/</link>
      <pubDate>Wed, 03 Jul 2024 15:32:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/setting-up-v2ray-and-caddy-on-alpine-linux-lxc-container/</guid>
      <description>Preface In the modern Internet environment, proxy services are becoming more and more important, especially when it is necessary to break through geographical restrictions and improve privacy protection. This article will introduce in detail how to use V2Ray and Caddy to build an SSL WebSocket proxy service provided through IPv6 and domain name on the LXC container of the Alpine Linux 3.19 operating system.&#xA;Environment preparation Make sure your LXC container is running and has an IPv6 address assigned.</description>
    </item>
    <item>
      <title>A Python-based way to keep China Telecom Cloud PC awake</title>
      <link>https://blog.margrop.net/en/post/automating-connections-to-ctyun-desktop-using-python/</link>
      <pubDate>Tue, 18 Jun 2024 17:41:35 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/automating-connections-to-ctyun-desktop-using-python/</guid>
      <description>&lt;h4 id=&#34;principle-regularly-connect-to-china-telecom-cloud-desktop-interval-must-be-less-than-1-hour&#34;&gt;Principle: Regularly connect to China Telecom Cloud Desktop (interval must be less than 1 hour)&lt;/h4&gt;&#xA;&lt;h5 id=&#34;step-1-obtain-request-data&#34;&gt;Step 1: Obtain Request Data&lt;/h5&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Open Chrome browser&amp;rsquo;s Developer Tools&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In Chrome browser, press &lt;code&gt;F12&lt;/code&gt; or right-click and select &lt;code&gt;Inspect&lt;/code&gt; to open Developer Tools.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Visit and log in to China Telecom Cloud Desktop&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Visit &lt;code&gt;https://pc.ctyun.cn&lt;/code&gt; and log in to Cloud PC with your account.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Copy the curl command for the connect request&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In Developer Tools, select the &lt;code&gt;Network&lt;/code&gt; tab, find and click on the request named &lt;code&gt;connect&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Right-click on this request and select &lt;code&gt;Copy as cURL (cmd)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Obtain authData from localStorage&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In Developer Tools, select the &lt;code&gt;Application&lt;/code&gt; tab.&lt;/li&gt;&#xA;&lt;li&gt;In the left sidebar, find &lt;code&gt;Local Storage&lt;/code&gt; and select &lt;code&gt;https://pc.ctyun.cn&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Find the &lt;code&gt;authData&lt;/code&gt; key and copy its corresponding value.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>An Effective Method to Quickly Set Up Fail2ban in Proxmox VE to Prevent Multiple Failed Login Attempts</title>
      <link>https://blog.margrop.net/en/post/how-to-quickly-configure-fail2ban-in-proxmox-ve/</link>
      <pubDate>Tue, 18 Jun 2024 15:33:01 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-quickly-configure-fail2ban-in-proxmox-ve/</guid>
      <description>&lt;p&gt;This briefly introduces how to set up Fail2ban in Proxmox VE to temporarily block IP addresses with multiple failed login attempts.&lt;/p&gt;&#xA;&lt;h3 id=&#34;install-fail2ban&#34;&gt;Install Fail2ban&lt;/h3&gt;&#xA;&lt;p&gt;Execute the following commands as root on the Proxmox VE host:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install fail2ban&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;configure-basic-settings&#34;&gt;Configure Basic Settings&lt;/h3&gt;&#xA;&lt;p&gt;It is recommended to use the &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; file, whose settings take precedence over &lt;code&gt;jail.conf&lt;/code&gt;. Use the following command to copy the template:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>IPTV source collection from GitHub - updated on 2024/6/10</title>
      <link>https://blog.margrop.net/en/post/iptv-sources-from-github/</link>
      <pubDate>Mon, 10 Jun 2024 16:49:07 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/iptv-sources-from-github/</guid>
      <description>&lt;h1 id=&#34;iptv-source-collection&#34;&gt;IPTV source collection&lt;/h1&gt;&#xA;&lt;p&gt;Source lists:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://epg.pw/test_channel_page.html&#34;&gt;https://epg.pw/test_channel_page.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/iptv-org/iptv&#34;&gt;iptv.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/YueChan/Live&#34;&gt;YueChan/Live&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/YanG-1989/m3u&#34;&gt;YanG-1989/m3u&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/fanmingming/live&#34;&gt;fanmingming/live&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/qwerttvv/Beijing-IPTV&#34;&gt;qwerttvv/Beijing-IPTV&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/joevess/IPTV&#34;&gt;joevess/IPTV&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;del&gt;&lt;a href=&#34;https://github.com/Meroser/IPTV&#34;&gt;Meroser/IPTV&lt;/a&gt;&lt;/del&gt; The project content has been removed by Author&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;EPG sources:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/fanmingming/live&#34;&gt;fanmingming/live&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://diyp1.112114.xyz&#34;&gt;112114.xyz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://epg.51zmt.top:8000/&#34;&gt;epg.51zmt.top:8000&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For more source lists, see &lt;a href=&#34;https://m3u.ibert.me&#34;&gt;https://m3u.ibert.me&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Cloudflare to Build gh-proxy for GitHub Acceleration</title>
      <link>https://blog.margrop.net/en/post/cloudflare-accelerate-github-speed/</link>
      <pubDate>Mon, 10 Jun 2024 15:26:32 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/cloudflare-accelerate-github-speed/</guid>
      <description>&lt;p&gt;In previous episodes, I&amp;rsquo;ve experimented with Qinglong Panel. However, when trying to pull GitHub repositories, you may encounter network issues leading to pull failures. Regular GitHub file downloads are also extremely slow. So I used the free Cloudflare to build gh-proxy for GitHub acceleration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I. Prerequisites&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You need to prepare a Cloudflare account and a domain name (optional) in advance. For free domains, you can refer to the previous article &amp;lsquo;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzIxMjE1NDQxNA==&amp;mid=2247483945&amp;idx=1&amp;sn=abe651003c71d37c25b29cd6ea54a775&amp;chksm=974b2368a03caa7e8ccdab8d0d104076540990a643731bd60bb9c3bbb04dc81c83dba4eedad9&amp;scene=21#wechat_redirect&#34;&gt;免费申请注册eu.org二级域名&lt;/a&gt;&amp;rsquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Cloudflare Workers to Solve Docker Image Pull Issues</title>
      <link>https://blog.margrop.net/en/post/cloudflare-workers-slove-docker-mirrors-blocked/</link>
      <pubDate>Mon, 10 Jun 2024 14:16:26 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/cloudflare-workers-slove-docker-mirrors-blocked/</guid>
      <description>&lt;p&gt;Due to certain reasons, Docker images cannot be pulled normally in China. The method I wrote last year for accelerating image pulls is also no longer functional. Where there&amp;rsquo;s a will, there&amp;rsquo;s a way (not really). So I&amp;rsquo;ve written a new tutorial to solve the Docker image pull issue using Cloudflare Workers.&lt;/p&gt;&#xA;&lt;p&gt;This article uses Cloudflare Workers to solve the problem of being unable to pull images. I won&amp;rsquo;t go into too much detail about Cloudflare here, and Cloudflare Workers is also a free service. If you&amp;rsquo;re not familiar with it, you can check out previous articles like &amp;ldquo;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzIxMjE1NDQxNA==&amp;mid=2247484002&amp;idx=1&amp;sn=5cf3b8876df7d871774641c5f24261d7&amp;chksm=974b2323a03caa35e053659efda5e285635f83d011cadf54e7c05288f40a4df1811fcf0338ff&amp;scene=21#wechat_redirect&#34;&gt;cloudflare加快github下载&lt;/a&gt;&amp;rdquo;. &lt;strong&gt;If you don&amp;rsquo;t want to follow this guide, you can reply with &amp;ldquo;jsdc&amp;rdquo; in the background to get the public service address I&amp;rsquo;ve set up.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>China Telecom Cloud Computer Configuration and Never Sleep Method</title>
      <link>https://blog.margrop.net/en/post/ctyun-windows-never-sleep/</link>
      <pubDate>Tue, 04 Jun 2024 12:27:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ctyun-windows-never-sleep/</guid>
      <description>&lt;p&gt;Windows software download: &lt;a href=&#34;https://download.margrop.net/#/EXE&#34;&gt;https://download.margrop.net/#/EXE&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;China Telecom Cloud Computer: &lt;a href=&#34;https://desk.ctyun.cn/html/download/&#34;&gt;https://desk.ctyun.cn/html/download/&lt;/a&gt;&#xA;Scheduler software: &lt;a href=&#34;http://www.everauto.net/&#34;&gt;http://www.everauto.net/&lt;/a&gt;&#xA;China Telecom Cloud Computer default path: C:\Program Files (x86)\CtyunClouddeskUniversal\CtyunClouddeskUniversal.exe&#xA;BtPanel: &lt;a href=&#34;https://www.bt.cn/new/product_windows.html&#34;&gt;https://www.bt.cn/new/product_windows.html&lt;/a&gt;&#xA;BtPanel Legacy Version: &lt;a href=&#34;http://download.bt.cn/win/update/net/BtSoft-Win.zip&#34;&gt;http://download.bt.cn/win/update/net/BtSoft-Win.zip&lt;/a&gt;&#xA;frp: &lt;a href=&#34;https://github.com/fatedier/frp&#34;&gt;https://github.com/fatedier/frp&lt;/a&gt;&#xA;NSSM: &lt;a href=&#34;http://www.nssm.cc/download&#34;&gt;http://www.nssm.cc/download&lt;/a&gt;&#xA;Notepad++: &lt;a href=&#34;https://download.margrop.net/d/oneindex/EXE/npp.8.6.7.Installer.x64.exe&#34;&gt;https://download.margrop.net/d/oneindex/EXE/npp.8.6.7.Installer.x64.exe&lt;/a&gt;&#xA;RustDesk: &lt;a href=&#34;https://download.margrop.net/d/oneindex/EXE/rustdesk-1.2.3-2-x86_64.exe&#34;&gt;https://download.margrop.net/d/oneindex/EXE/rustdesk-1.2.3-2-x86_64.exe&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>N5105 Proxmox VE 8.2 version, solving the problem of frequent virtual machine crashes</title>
      <link>https://blog.margrop.net/en/post/n5105-in-promox-ve-frequently-dead/</link>
      <pubDate>Sat, 04 May 2024 07:55:22 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/n5105-in-promox-ve-frequently-dead/</guid>
      <description>1. Problem background Recently, major PT websites were developed and registered on May Day, so I registered several websites, and then downloaded and uploaded them like crazy in order to complete novice tasks. As soft routers, N5105 and iKuai, when under high load for a long time, the virtual machine crashed randomly, and the CPU remained at 100% for a long time. The virtual machine could only be killed and restarted, which greatly affected the completion of novice tasks.</description>
    </item>
    <item>
      <title>IDEA License Server Search Method</title>
      <link>https://blog.margrop.net/en/post/activate-jetbrains-intellij-idea/</link>
      <pubDate>Wed, 01 May 2024 13:34:09 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/activate-jetbrains-intellij-idea/</guid>
      <description>&lt;h1 id=&#34;please-search-for-yourself-using-the-search-engines-and-keywords-below&#34;&gt;Please search for yourself using the search engines and keywords below&lt;/h1&gt;&#xA;&lt;h2 id=&#34;fofahttpsenfofainfo&#34;&gt;&lt;a href=&#34;https://en.fofa.info/&#34;&gt;Fofa&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;header=&amp;#34;https://account.jetbrains.com/fls-auth&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;shodanhttpswwwshodanio&#34;&gt;&lt;a href=&#34;https://www.shodan.io/&#34;&gt;Shodan&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;Location&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://account.jetbrains.com/fls-auth&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;censyshttpscensyscom&#34;&gt;&lt;a href=&#34;https://censys.com/&#34;&gt;Censys&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services.http.response.headers.location&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;account.jetbrains.com/fls-auth&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>[Transfer] How to set up xiaoya’s docker and tvbox configuration</title>
      <link>https://blog.margrop.net/en/post/deploy-xiaoya-docker-and-tvbox/</link>
      <pubDate>Tue, 30 Apr 2024 21:18:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/deploy-xiaoya-docker-and-tvbox/</guid>
      <description>Article source: https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f&#xA;How to set up xiaoya&amp;rsquo;s docker To get the latest information about Xiaoya, please follow Xiaoya’s tg channel https://t.me/xiaoyaliu&#xA;If you have any difficulties in using it, you can come here to find me or others for help https://t.me/PlutoPlayer&#xA;Table of contents&#xA;What do you need to install xiaoya&amp;rsquo;s docker The soft routing box is similar to n1, etc., with openwrt environment (can be configured with one click on the terminal) NAS and other devices have docker plug-ins (it is impossible or difficult to log in to the terminal and requires graphical self-configuration) Cloud servers are also commonly known as vps (can be configured with one click on the terminal) How to install Install under openwrt or vps, call up the terminal command line The left side of the openwrt control panel (find &amp;ldquo;TTY Terminal&amp;rdquo; under &amp;ldquo;System&amp;rdquo; or &amp;ldquo;Services&amp;rdquo;)</description>
    </item>
    <item>
      <title>Ubuntu 24.04 LTS Noble Numbat Upgrade Guide</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2404-lts-noble-numbat-upgrade/</link>
      <pubDate>Tue, 30 Apr 2024 19:55:19 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2404-lts-noble-numbat-upgrade/</guid>
      <description>Thanks to ChatGPT for translating from the official website, 原文入口&#xA;IMPORTANT: Ubuntu 22.04 LTS目前无法直接升级到 Ubuntu 24.04 LTS，请等到2024年8月再进行升级操作&#xA;Ubuntu 24.04 LTS - &amp;ldquo;Noble Numbat&amp;rdquo; Upgrade Guide Ubuntu 24.04 LTS is the version of the Ubuntu operating system released in April 2024. The development code name for this version is &amp;ldquo;Noble Numbat&amp;rdquo;.&#xA;Before you begin You can upgrade directly to Ubuntu 24.04 LTS (&amp;ldquo;Noble Numbat&amp;rdquo;) from Ubuntu 22.04 LTS (&amp;ldquo;Jammy Jellyfish&amp;rdquo;) or Ubuntu 23.</description>
    </item>
    <item>
      <title>Installing minikube-dashboard &#43; Auto-start and External Network Access</title>
      <link>https://blog.margrop.net/en/post/install-minikube-dashboard-and-autorun-and-port-forward/</link>
      <pubDate>Tue, 30 Apr 2024 19:42:36 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/install-minikube-dashboard-and-autorun-and-port-forward/</guid>
      <description>&lt;h1 id=&#34;1-installing-minikube-dashboard&#34;&gt;1. Installing minikube-dashboard&lt;/h1&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Refer to the official documentation: &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/start/&#34;&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;&#xA;Execute the command &lt;code&gt;minikube dashboard&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;2-installing-the-minikube-background-service&#34;&gt;2. Installing the Minikube Background Service&lt;/h1&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;minikube&lt;/code&gt; to start only once under &lt;code&gt;systemctl&lt;/code&gt; management and exit automatically after successful startup, you can modify the service file for &lt;code&gt;systemctl&lt;/code&gt; to prevent automatic restart of &lt;code&gt;minikube&lt;/code&gt;. This can be achieved by setting &lt;code&gt;Restart=no&lt;/code&gt;, and ensuring the service is started manually only when needed.&lt;/p&gt;&#xA;&lt;p&gt;Below is a basic &lt;code&gt;systemctl&lt;/code&gt; service file example suitable for this scenario:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing a Minimal k8s Environment with Minikube</title>
      <link>https://blog.margrop.net/en/post/install-min-k8s-using-minikube-on-pve/</link>
      <pubDate>Tue, 30 Apr 2024 19:37:29 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/install-min-k8s-using-minikube-on-pve/</guid>
      <description>&lt;p&gt;Deploying Minikube on Proxmox VE (a Debian-based virtualization environment) requires consideration of Proxmox&amp;rsquo;s characteristics, as it is essentially a virtual machine and container management platform. You will need to create a virtual machine (VM) on Proxmox VE and then install Minikube within that VM. Below are the detailed steps:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrade ProxmoxVE 7.4 to 8.0, detailed steps</title>
      <link>https://blog.margrop.net/en/post/pve-7-upgrade-to-8/</link>
      <pubDate>Sat, 08 Jul 2023 10:25:13 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-7-upgrade-to-8/</guid>
      <description>Step 1: Read the official documentation in detail Notice: If you use ssh connection remotely, it is recommended to use the screen command first to avoid various problems caused by network instability and operation interruption.&#xA;Step 2: Upgrade to the latest version 7.4 The latest version is 7.4.15&#xA;apt update -y &amp;amp;&amp;amp; apt dist-upgrade -y sed -i_orig &amp;#34;s/data.status === &amp;#39;Active&amp;#39;/true/g&amp;#34; /usr/share/pve-manager/js/pvemanagerlib.js sed -i_orig &amp;#34;s/if (res === null || res === undefined || \!</description>
    </item>
    <item>
      <title>TVBOX long-term maintenance apk download address and interface</title>
      <link>https://blog.margrop.net/en/post/tvbox-apk-download-and-interface/</link>
      <pubDate>Mon, 03 Jul 2023 21:11:04 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/tvbox-apk-download-and-interface/</guid>
      <description>#TVBOX download address Download:https://www.lanzoul.com/iANk409bj7fc Password: 5q1m&#xA;The following interfaces are from Fat Cat Collection (Fat Cat official website) #fatcat​&#xA;The rice is too hard #云星&#xA;#artifact&#xA;#lenice&#xA;qiaoer #junge&#xA;#小雅</description>
    </item>
    <item>
      <title>TV Box TVBox takagen version 99, v20230307_2315 (with the latest interface address)</title>
      <link>https://blog.margrop.net/en/post/tvbox-takagen99-v20230307/</link>
      <pubDate>Mon, 03 Jul 2023 21:09:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/tvbox-takagen99-v20230307/</guid>
      <description>Open source, free, self-configured interface, used for both live broadcast and on-demand, Android devices.&#xA;The takagen99 version has a new UI appearance and richer functions. It supports mounting WebDav and local disks, player display resolution, network speed, time screen display and other functions. 2. TVbox usage tutorial Click &amp;ldquo;Settings&amp;rdquo; on the homepage, select &amp;ldquo;Configure Address&amp;rdquo;, enter the &amp;ldquo;Data Source Address&amp;rdquo;, enable storage permissions, select the data source after &amp;ldquo;OK&amp;rdquo;, and then you can use it.</description>
    </item>
    <item>
      <title>Using FFmpeg to Batch Remove Opening and Ending Sections from Audio and Video Files</title>
      <link>https://blog.margrop.net/en/post/ffmpeg-cut-video/</link>
      <pubDate>Sun, 02 Apr 2023 11:51:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ffmpeg-cut-video/</guid>
      <description>&lt;h1 id=&#34;steps&#34;&gt;Steps&lt;/h1&gt;&#xA;&lt;h2 id=&#34;1-download-ffmpeg&#34;&gt;1. Download FFmpeg&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Steps omitted&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2-edit-the-batch-script&#34;&gt;2. Edit the Batch Script&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bat&#34; data-lang=&#34;bat&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@&lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; off &amp;amp; &lt;span style=&#34;color:#66d9ef&#34;&gt;setlocal&lt;/span&gt; enabledelayedexpansion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;rem ===================需手动设置===================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;rem 设定片头片尾长度，格式为 HH:mm:ss.fff&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s1=00:01:07.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s2=00:01:30.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;rem ================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;/f&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tokens=1-4delims=:.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;a &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;%s2%&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;/a&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t2=(1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;a &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; 100 *3600 + 1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;b &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; 100 * 60 + 1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;c &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; 100) * 1000 + 1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;d &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; 1000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;md&lt;/span&gt; myvideo &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&amp;gt;nul&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;i &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; (*.avi *.mkv *.mp4 *.flv) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;/f&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tokens=2-5delims=:., &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;a &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ffmpeg -i &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;i&amp;#34; 2^&amp;gt;^&amp;amp;1 ^| find &amp;#34;Duration:&amp;#34;&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;/a&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t=(1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;100*3600+1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;100*60+1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;100)*1000+1&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;d0&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;1000,t-=t2,ms=t&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;1000,t/=1000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;/a&lt;/span&gt; h&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3600&lt;/span&gt;,m&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3600&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;,s&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;,h&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;,m&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;,s&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;,ms&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t=!h:~1!:!m:~1!:!s:~1!.!ms:~1!&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ffmpeg -ss !s1! -to !t! -accurate_seek -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;i&amp;#34;&lt;/span&gt;  -c copy -avoid_negative_ts 1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;myvideo\&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;i&amp;#34;&lt;/span&gt; -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pause&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>GitLab CI YML Configuration Guide (Official Documentation Translation)</title>
      <link>https://blog.margrop.net/en/post/gitlab-ci-variables/</link>
      <pubDate>Sun, 02 Apr 2023 09:02:29 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/gitlab-ci-variables/</guid>
      <description>&lt;h2 id=&#34;important-built-in-variables&#34;&gt;Important Built-in Variables&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;CI_COMMIT_REF_NAME&lt;/code&gt;: The branch or tag name for which project is built.&#xA;&lt;code&gt;CI_CONFIG_PATH&lt;/code&gt;: The path to the CI/CD configuration file. Defaults to .gitlab-ci.yml. Read-only inside a running pipeline.&#xA;&lt;code&gt;CI_PROJECT_PATH&lt;/code&gt;: The project namespace with the project name included.&#xA;&lt;code&gt;CI_BUILDS_DIR&lt;/code&gt;: The top-level directory where builds are executed.&#xA;&lt;code&gt;CI_PROJECT_DIR&lt;/code&gt;: The full path the repository is cloned to, and where the job runs from. If the GitLab Runner builds_dir parameter is set, this variable is set relative to the value of builds_dir. For more information, see the Advanced GitLab Runner configuration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Logback custom adds logstash field</title>
      <link>https://blog.margrop.net/en/post/logback-zi-ding-yi-tian-jia-logstash-zi-duan/</link>
      <pubDate>Sun, 02 Apr 2023 08:57:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/logback-zi-ding-yi-tian-jia-logstash-zi-duan/</guid>
      <description>steps If you want to add custom fields to the output JSON, you need to configure the arguments parameter. &amp;lt;encoder class=&amp;#34;net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder&amp;#34;&amp;gt; &amp;lt;providers&amp;gt; &amp;lt;pattern&amp;gt; &amp;lt;pattern&amp;gt; { &amp;#34;timestamp&amp;#34;: &amp;#34;%date{\&amp;#34;yyyy-MM-dd HH:mm:ss\&amp;#34;}&amp;#34;, &amp;#34;log_level&amp;#34;: &amp;#34;%level&amp;#34;, &amp;#34;class_name&amp;#34;: &amp;#34;%class&amp;#34;, &amp;#34;thread&amp;#34;: &amp;#34;%thread&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;%message&amp;#34;, &amp;#34;stack_trace&amp;#34;: &amp;#34;%exception{5}&amp;#34; } &amp;lt;/pattern&amp;gt; &amp;lt;/pattern&amp;gt; &amp;lt;arguments/&amp;gt; &amp;lt;/providers&amp;gt; &amp;lt;/encoder&amp;gt; Markers provided by Markers import static net.logstash.logback.marker.Markers.* /* * Add &amp;#34;name&amp;#34;:&amp;#34;value&amp;#34; to the JSON output. */ logger.info(append(&amp;#34;name&amp;#34;, &amp;#34;value&amp;#34;), &amp;#34;log message&amp;#34;); /* * Add &amp;#34;name1&amp;#34;:&amp;#34;value1&amp;#34;,&amp;#34;name2&amp;#34;:&amp;#34;value2&amp;#34; to the JSON output by using multiple markers.</description>
    </item>
    <item>
      <title>MySQL Online DDL: Add Indexes Without Locking</title>
      <link>https://blog.margrop.net/en/post/mysql-online-ddl-create-index-without-lock/</link>
      <pubDate>Sun, 02 Apr 2023 08:51:17 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mysql-online-ddl-create-index-without-lock/</guid>
      <description>&lt;h1 id=&#34;steps&#34;&gt;Steps&lt;/h1&gt;&#xA;&lt;p&gt;You can only use &lt;code&gt;ALTER TABLE&lt;/code&gt;, not &lt;code&gt;CREATE INDEX&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ALTER TABLE tbl_name ADD INDEX (column), ALGORITHM=INPLACE, LOCK=NONE;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Recommended GitHub Open Source Projects</title>
      <link>https://blog.margrop.net/en/post/github-project-stars/</link>
      <pubDate>Sat, 25 Mar 2023 18:29:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/github-project-stars/</guid>
      <description>&lt;h1 id=&#34;bbdown&#34;&gt;BBDown&lt;/h1&gt;&#xA;&lt;p&gt;A command-line downloader for Bilibili.&#xA;&lt;a href=&#34;https://github.com/nilaoda/BBDown&#34;&gt;https://github.com/nilaoda/BBDown&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;improved-ios-calendar-for-chinese-public-holidays-and-make-up-workdays&#34;&gt;Improved iOS calendar for Chinese public holidays and make-up workdays&lt;/h1&gt;&#xA;&lt;p&gt;Chinese holiday calendar.&#xA;&lt;a href=&#34;https://github.com/lanceliao/china-holiday-calender&#34;&gt;https://github.com/lanceliao/china-holiday-calender&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;cpu-single-core-benchmark-ranking&#34;&gt;CPU single-core benchmark ranking&lt;/h1&gt;&#xA;&lt;p&gt;This chart collects benchmark data for common CPU models, including Intel Core desktop processors, Intel Core mobile processors, and AMD Ryzen processors.&#xA;&lt;a href=&#34;https://github.com/mediv01/CPU-Single-Core-Benchmark&#34;&gt;https://github.com/mediv01/CPU-Single-Core-Benchmark&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;fast-homebrew-installer-for-users-in-mainland-china&#34;&gt;Fast Homebrew installer for users in mainland China&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ineo6/homebrew-install&#34;&gt;https://github.com/ineo6/homebrew-install&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use v2ray to configure intranet access based on a public IP</title>
      <link>https://blog.margrop.net/en/post/v2ray-visit-lan/</link>
      <pubDate>Sat, 25 Mar 2023 15:44:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/v2ray-visit-lan/</guid>
      <description>&lt;h1 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A public IP address&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Secure intranet access&lt;/li&gt;&#xA;&lt;li&gt;Encrypted traffic&lt;/li&gt;&#xA;&lt;li&gt;Support TCP/UDP&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Online expansion of Ubuntu/CentOS disk root directory &amp; modification of partition inode number</title>
      <link>https://blog.margrop.net/en/post/ubuntu-lv-extend-and-resize-inode/</link>
      <pubDate>Sat, 25 Mar 2023 13:42:44 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-lv-extend-and-resize-inode/</guid>
      <description>When Ubuntu is used as a server system, the system disk may not have enough space. If apt apt is used, the root directory will be full. Granted, adding a disk/partition and mounting it is a solution, but it doesn&amp;rsquo;t solve all problems (like apt). At the same time, some servers running on cloud platforms do not have good means of operating disks offline. At this time, online expansion is extremely necessary.</description>
    </item>
    <item>
      <title>Scheduled Reboot for a Specific VM on PVE</title>
      <link>https://blog.margrop.net/en/post/pve-corntab-restart-vm/</link>
      <pubDate>Sun, 12 Mar 2023 20:59:38 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-corntab-restart-vm/</guid>
      <description>&lt;h1 id=&#34;background&#34;&gt;Background&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It was observed that the &lt;code&gt;HomeAssistant&lt;/code&gt; VM&amp;rsquo;s memory usage kept increasing over time and eventually hit &lt;code&gt;OOM&lt;/code&gt;. This happened no matter how many versions were upgraded, so it is suspected that &lt;code&gt;HomeAssistant&lt;/code&gt; has a memory leak.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;Solution&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;At the VM layer, reboot the VM periodically (once a day)&lt;/li&gt;&#xA;&lt;li&gt;Log in to the server where &lt;code&gt;PVE&lt;/code&gt; is running&lt;/li&gt;&#xA;&lt;li&gt;Run &lt;code&gt;crontab -e&lt;/code&gt; and enter the following:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin&#xA;&#xA;0 12 * * * qm stop 2007 ; sleep 10 ; qm start 2007&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;Note: &lt;code&gt;2007&lt;/code&gt; in the command is the &lt;code&gt;vmid&lt;/code&gt;, the globally unique ID of the VM&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Persistent iptables Rules</title>
      <link>https://blog.margrop.net/en/post/persistent-iptables/</link>
      <pubDate>Sun, 12 Mar 2023 20:43:10 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/persistent-iptables/</guid>
      <description>&lt;h1 id=&#34;install-iptables-on-debian-if-needed&#34;&gt;Install iptables on Debian if Needed&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt-get install iptables&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;clear-existing-rules&#34;&gt;Clear Existing Rules&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;iptables -F;iptables -X;iptables -Z&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;open-ports&#34;&gt;Open Ports&lt;/h1&gt;&#xA;&lt;h3 id=&#34;allow-the-local-loopback-interface-that-is-allow-the-local-machine-to-access-itself-and-allow-established-or-related-connections&#34;&gt;Allow the local loopback interface (that is, allow the local machine to access itself) and allow established or related connections&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;iptables -A INPUT -i lo -j ACCEPT;iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>WOW TrinityCore installation tutorial (based on 10.0.2.47657)</title>
      <link>https://blog.margrop.net/en/post/wow-trinitycore-install-document/</link>
      <pubDate>Sun, 12 Mar 2023 20:28:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/wow-trinitycore-install-document/</guid>
      <description>WOW TrinityCore installation tutorial Related references Environment setup: Ubuntu 20.04 Switch apt to the Alibaba Cloud mirror: https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b11KR1TWB Change the root password: Run sudo passwd and enter the current user&amp;rsquo;s password when prompted. Press Enter, then type and confirm the new password. That password becomes the new root password. After that, run su root and log in with the new root password.&#xA;Set up passwordless SSH login: cd ~ mkdir .</description>
    </item>
    <item>
      <title>Baidu Netdisk Resource Collection for Talking Pens</title>
      <link>https://blog.margrop.net/en/post/kid-talking-pen-resources-in-baidupan/</link>
      <pubDate>Sun, 12 Mar 2023 20:26:01 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/kid-talking-pen-resources-in-baidupan/</guid>
      <description>&lt;p&gt;All Oxford resources&lt;/p&gt;&#xA;&lt;p&gt;Link: &lt;a href=&#34;https://pan.baidu.com/s/1LwytSBYw4ymiTeOchDw0aA&#34;&gt;https://pan.baidu.com/s/1LwytSBYw4ymiTeOchDw0aA&lt;/a&gt; Extract code: 4dm4&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing CORS Issues When Upgrading from Spring 2.3.x to a Newer Version</title>
      <link>https://blog.margrop.net/en/post/fix-spring2-allowed-origins-error/</link>
      <pubDate>Sun, 12 Mar 2023 20:20:01 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/fix-spring2-allowed-origins-error/</guid>
      <description>&lt;h1 id=&#34;exception-message&#34;&gt;Exception Message:&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;When allowCredentials is true, allowedOrigins cannot contain the special value &amp;#34;*&amp;#34; since that cannot be set on the &amp;#34;Access-Control-Allow-Origin&amp;#34; response header. To allow credentials to a set of origins, list them explicitly or consider using &amp;#34;allowedOriginPatterns&amp;#34; instead.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;solution&#34;&gt;Solution:&lt;/h1&gt;&#xA;&lt;p&gt;CORS configuration error, simply replace &lt;code&gt;.allowedOrigins&lt;/code&gt; with &lt;code&gt;.allowedOriginPatterns&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing SpringFox 3.0.0 Incompatibility with SpringBoot 2.6.4</title>
      <link>https://blog.margrop.net/en/post/fix-springfox-documentation-plugins-bootstrapper-npe/</link>
      <pubDate>Sun, 12 Mar 2023 17:56:57 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/fix-springfox-documentation-plugins-bootstrapper-npe/</guid>
      <description>&lt;h1 id=&#34;error-message&#34;&gt;Error Message:&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Failed to start bean &amp;#39;documentationPluginsBootstrapper&amp;#39;; nested exception is java.lang.NullPointerException&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;root-cause-analysis&#34;&gt;Root Cause Analysis:&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;SpringFox&lt;/code&gt; 3.0.0 is not compatible with &lt;code&gt;SpringBoot&lt;/code&gt; 2.6.4&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;Solution:&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reference Links&#xA;&lt;a href=&#34;https://stackoverflow.com/questions/40241843/failed-to-start-bean-documentationpluginsbootstrapper-in-spring-data-rest&#34;&gt;https://stackoverflow.com/questions/40241843/failed-to-start-bean-documentationpluginsbootstrapper-in-spring-data-rest&lt;/a&gt;&#xA;&lt;a href=&#34;https://github.com/springfox/springfox/issues/3462#issuecomment-1010721223&#34;&gt;https://github.com/springfox/springfox/issues/3462#issuecomment-1010721223&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Auto-Add N2N Route Table on CentOS 7 Boot</title>
      <link>https://blog.margrop.net/en/post/centos7-auto-add-route-table-for-n2n-edge/</link>
      <pubDate>Sun, 06 Feb 2022 19:50:38 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos7-auto-add-route-table-for-n2n-edge/</guid>
      <description>&lt;h1 id=&#34;1-edit-the-systemctl-auto-start-file&#34;&gt;1. Edit the &lt;code&gt;systemctl&lt;/code&gt; Auto-Start File&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vim /etc/systemd/system/n2route.service&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Transfer] The use of Mybatis-Plus general enumeration types</title>
      <link>https://blog.margrop.net/en/post/zhuan-mybatis-plus-tong-yong-mei-ju-lei-xing-de-shi-yong/</link>
      <pubDate>Wed, 02 Feb 2022 20:20:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-mybatis-plus-tong-yong-mei-ju-lei-xing-de-shi-yong/</guid>
      <description>Some fields, such as gender, marital status, and other iconic fields, are often stored in the database in the form of numbers, 0 or 1. The advantage of this is that it has high access efficiency and saves space. However, the front-end cannot be displayed directly during display. A judgment is required, but it is inappropriate to place the judgment logic on the front-end, so the back-end should convert the value in advance and return it to the front-end.</description>
    </item>
    <item>
      <title>Solutions for External 2K Display and Font Blurring/Aliasing on macOS Big Sur in 2021</title>
      <link>https://blog.margrop.net/en/post/2k-monitor-in-macos-hidpi-and-retina-display-menu/</link>
      <pubDate>Tue, 25 Jan 2022 21:45:33 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/2k-monitor-in-macos-hidpi-and-retina-display-menu/</guid>
      <description>&lt;h1 id=&#34;1-disable-system-sip&#34;&gt;1. Disable System SIP&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/343151907&#34;&gt;https://zhuanlan.zhihu.com/p/343151907&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before executing the command, you need to disable SIP (System Integrity Protection). The specific steps are:&#xA;Enter Recovery Mode (hold Command+R during startup), open the system terminal in the upper right corner, and enter the &lt;code&gt;csrutil disable&lt;/code&gt; (disable) command. After enabling HiDPI, you can use the &lt;code&gt;csrutil enable&lt;/code&gt; (enable) command again to re-enable it. For more details, refer to &amp;raquo;传送门&lt;/p&gt;</description>
    </item>
    <item>
      <title>One-click Installation of swagger2markup via Brew and Generating Markdown Documentation</title>
      <link>https://blog.margrop.net/en/post/brew-install-swagger2markup-and-generate-markdown/</link>
      <pubDate>Tue, 25 Jan 2022 21:43:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/brew-install-swagger2markup-and-generate-markdown/</guid>
      <description>&lt;h1 id=&#34;1-one-click-installation&#34;&gt;1. One-click Installation&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;brew install swagger2markup-cli&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>OpenCore&#39;s config.plist file, how to print logs?</title>
      <link>https://blog.margrop.net/en/post/opencore-configplist-file-enable-debug-verbose/</link>
      <pubDate>Tue, 14 Dec 2021 20:37:35 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/opencore-configplist-file-enable-debug-verbose/</guid>
      <description>Preparation start Use PlistEdit Pro to open the config.plist file Expand NVRAM -&amp;gt; ADD -&amp;gt; 7C436110-AB2A-4BBB-A880-FE41995C9F82 Modify the boot-args parameter and add -v at the end More parameter reference </description>
    </item>
    <item>
      <title>How to Edit GRUB2 Boot Parameters During Linux Startup</title>
      <link>https://blog.margrop.net/en/post/edit-grub2-during-the-boot-process/</link>
      <pubDate>Wed, 08 Dec 2021 09:29:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/edit-grub2-during-the-boot-process/</guid>
      <description>&lt;h1 id=&#34;to-edit-grub2-during-the-boot-process-try-the-following&#34;&gt;To edit Grub2 during the boot process try the following:&lt;/h1&gt;&#xA;&lt;h1 id=&#34;to-edit-grub2-during-boot-you-can-try-the-following-steps&#34;&gt;To edit GRUB2 during boot, you can try the following steps&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Immediately after the BIOS splash screen during boot, press and hold the &lt;code&gt;SHIFT&lt;/code&gt; button. This will display you &lt;code&gt;grub&lt;/code&gt; containing a list of kernels and recovery options&#xA;After the BIOS splash screen appears during the boot process, immediately press and hold the &lt;code&gt;SHIFT&lt;/code&gt; key.&#xA;This will display the &lt;code&gt;grub&lt;/code&gt; containing a list of kernels and recovery options.&#xA;&lt;img src=&#34;https://blog.margrop.net/post-images/ZlSUO.png&#34;&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Chrome Extension Download Links for China</title>
      <link>https://blog.margrop.net/en/post/chrome-kuo-zhan-guo-nei-xia-zai-di-zhi/</link>
      <pubDate>Sat, 04 Dec 2021 14:08:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/chrome-kuo-zhan-guo-nei-xia-zai-di-zhi/</guid>
      <description>&lt;p&gt;Due to some reasons, the official Chrome browser extension download center is also inaccessible. Fortunately, there are mirror service websites that can download extensions on your behalf by simply entering the name or URL, such as:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://crxextractor.com&#34;&gt;https://crxextractor.com&lt;/a&gt;&#xA;&lt;a href=&#34;https://www.crx4chrome.com&#34;&gt;https://www.crx4chrome.com&lt;/a&gt;&#xA;&lt;a href=&#34;https://yurl.sinaapp.com/crx.php&#34;&gt;https://yurl.sinaapp.com/crx.php&lt;/a&gt;&#xA;&lt;a href=&#34;https://yurl.sinaapp.com/crx2.php&#34;&gt;https://yurl.sinaapp.com/crx2.php&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use a Separate settings.xml for Maven with Aliyun Mirrors in China</title>
      <link>https://blog.margrop.net/en/post/maven-setting-xml-config-file-in-china-using-aliyun-mirror/</link>
      <pubDate>Sat, 04 Dec 2021 14:06:23 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/maven-setting-xml-config-file-in-china-using-aliyun-mirror/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;settings xmlns=&amp;#34;http://maven.apache.org/SETTINGS/1.0.0&amp;#34;&#xA;      xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&#xA;      xsi:schemaLocation=&amp;#34;http://maven.apache.org/SETTINGS/1.0.0&#xA;                          https://maven.apache.org/xsd/settings-1.0.0.xsd&amp;#34;&amp;gt;&#xA;&#xA;      &amp;lt;mirrors&amp;gt;&#xA;        &amp;lt;mirror&amp;gt;  &#xA;            &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt;  &#xA;            &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt;  &#xA;            &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/public&amp;lt;/url&amp;gt;&#xA;            &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;          &#xA;        &amp;lt;/mirror&amp;gt;  &#xA;      &amp;lt;/mirrors&amp;gt;&#xA;&amp;lt;/settings&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Shanghai Bell E-140W-P, optical modem configuration</title>
      <link>https://blog.margrop.net/en/post/shanghai-e-140w-p-modem-password-and-config/</link>
      <pubDate>Sat, 04 Dec 2021 13:46:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/shanghai-e-140w-p-modem-password-and-config/</guid>
      <description>Telnet telnet command: telnet 192.168.1.1 Telnet account password: telnetadmin / telnetadmin&#xA;#Default password telnet password&#xA;Hardware configuration BCM6838 chip supports the following interfaces and functions: 4 built-in Gigabit PHYs&#xA;Built-in GPON MAC, EPON MAC,&#xA;MIPS 32-bit processor, 400M dual core (64K×2 instruction cache, 32K data cache)&#xA;Built-in voip processor&#xA;2 channels support 802.11n WLAN PCIE interface, which can be connected to PCIE AP or USB AP&#xA;2 USB 2.0 interfaces, 1 can be used as HOST, and 1 can be configured as HOST or DEVICE.</description>
    </item>
    <item>
      <title>Gridea GitHub Sync Failure - Final Solution</title>
      <link>https://blog.margrop.net/en/post/gridea-sync-github-fail-solution/</link>
      <pubDate>Sat, 04 Dec 2021 11:36:32 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/gridea-sync-github-fail-solution/</guid>
      <description>&lt;h1 id=&#34;preface&#34;&gt;Preface&lt;/h1&gt;&#xA;&lt;p&gt;Enough chitchat. The core idea to solve this problem is to use a proxy. If you don&amp;rsquo;t have a circumvention tool, there&amp;rsquo;s no point in reading further. You might want to try &lt;code&gt;coding&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;important-notice&#34;&gt;Important Notice&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;Gridea&lt;/code&gt; official&amp;rsquo;s pinned &lt;code&gt;issue&lt;/code&gt; version &lt;a href=&#34;https://github.com/getgridea/gridea/issues/890&#34;&gt;&lt;code&gt;2021.10.23更新，关于检测远程链接成功，但同步错误的案例收集与修复测试包&lt;/code&gt;&lt;/a&gt; has a serious &lt;code&gt;BUG&lt;/code&gt; in the sync feature and cannot sync to &lt;code&gt;Github&lt;/code&gt; properly. The following is tested with the official &lt;code&gt;0.9.2&lt;/code&gt; version of &lt;code&gt;Gridea&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenWRT / LEDE set up cross-segment access method</title>
      <link>https://blog.margrop.net/en/post/openwrt-or-lede-visit-different-network-via-route/</link>
      <pubDate>Sat, 04 Dec 2021 11:17:47 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openwrt-or-lede-visit-different-network-via-route/</guid>
      <description>1. Static IPv4 routing, add routing table Visit the Network -&amp;gt; Static Routes page. Need to fill in Target network, IPv4 subnet mask, and IPv4 gateway. 2. Firewall, add firewall permission rules Visit the Network -&amp;gt; Firewall -&amp;gt; Communication Rules page. Need to fill in Name, Match rule, and Action. Name Just fill in the name as you like, for example ALLOW-LAN&#xA;Matching rules Forward IPv4 from lan to lan, IP {target network}.</description>
    </item>
    <item>
      <title>Compiling N2N Components SuperNode and Edge on Mac</title>
      <link>https://blog.margrop.net/en/post/compile-n2n-supernode-and-edge-in-mac/</link>
      <pubDate>Tue, 09 Nov 2021 20:21:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/compile-n2n-supernode-and-edge-in-mac/</guid>
      <description>&lt;h1 id=&#34;reference-httpswwwjianshucomp5021b70c3ff9&#34;&gt;Reference: &lt;a href=&#34;https://www.jianshu.com/p/5021b70c3ff9&#34;&gt;https://www.jianshu.com/p/5021b70c3ff9&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h1 id=&#34;installing-required-software-with-brew&#34;&gt;Installing Required Software with Brew&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;brew install openssl&#xA;brew tap homebrew/cask&#xA;brew install --cask tuntap&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Mac compiles N2N components SuperNode and Edge</title>
      <link>https://blog.margrop.net/en/post/mac-bian-yi-n2n-zu-jian-supernode-he-edge/</link>
      <pubDate>Tue, 09 Nov 2021 20:21:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mac-bian-yi-n2n-zu-jian-supernode-he-edge/</guid>
      <description>Reference: https://www.jianshu.com/p/5021b70c3ff9 Install required tools with Homebrew Tip: If the command line reports that tuntap failed to install, open Security &amp;amp; Privacy in System Settings and click Allow.&#xA;brew install openssl brew tap homebrew/cask brew install --cask tuntap Clone and build from GitHub cd ~ git clone https://github.com/ntop/n2n cd n2n git checkout 2.8-stable mkdir build cd build cmake .. make Copy Edge to /usr/local/bin/edge and make it executable cp edge /usr/local/bin/ chmod +x /usr/local/bin/edge Verify that it starts correctly .</description>
    </item>
    <item>
      <title>MacOS custom login and logout scripts</title>
      <link>https://blog.margrop.net/en/post/macos-lign/</link>
      <pubDate>Thu, 04 Nov 2021 10:44:50 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-lign/</guid>
      <description>Login and Logout Scripts 重要提示: There are many reasons to avoid using login and logout scripts:&#xA;Login and logout scripts are a deprecated technique. In most cases, you should use a launchd job instead, as described in Creating a Launch Daemon and Agent. Login and logout scripts run as root, which is a security risk. Only one of each script can be installed at a time. They are intended for system administrators; application developers should not use them in released software.</description>
    </item>
    <item>
      <title>How to Connect to the Host Machine&#39;s MySQL Server from Inside a Docker Container</title>
      <link>https://blog.margrop.net/en/post/docker-connect-mysql-in-host-machine/</link>
      <pubDate>Thu, 30 Sep 2021 13:08:50 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-connect-mysql-in-host-machine/</guid>
      <description>&lt;p&gt;The blogger recently encountered a situation where they copied a database from a server onto the host machine&amp;rsquo;s MySQL server, wanting to use the local database to test the correctness of their code. However, the project programs are all deployed with a single click via Docker, so it&amp;rsquo;s necessary to access the local database from within the Docker container. During the exploration, they encountered problems and found solutions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On the Importance of Mac Computers and TimeMachine</title>
      <link>https://blog.margrop.net/en/post/the-important-of-mac-and-timemachine/</link>
      <pubDate>Tue, 14 Sep 2021 16:55:10 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/the-important-of-mac-and-timemachine/</guid>
      <description>Today is September 14, 2021.&#xA;As of today, I have been using MacOS as my main system for about 2 years.&#xA;I have to say that I am deeply in love with MacOS now. If I need to buy my next laptop, I will definitely buy the MacBookPro high-end configuration.&#xA;#Main differences between MacOS and Windows&#xA;1. Shortcut keys Windows The well-known Ctrl + C and Ctrl + V below MacOS becomes Command(Win key) + C and Command(Win key) + V</description>
    </item>
    <item>
      <title>Hackintosh core graphics or non-core graphics processor, how to modify the OpenCore configuration file</title>
      <link>https://blog.margrop.net/en/post/hei-ping-guo-hackintoshhe-xian-huo-fei-he-xian-chu-li-qi-ru-he-xiu-gai-opencore-pei-zhi-wen-jian/</link>
      <pubDate>Mon, 13 Sep 2021 16:48:17 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/hei-ping-guo-hackintoshhe-xian-huo-fei-he-xian-chu-li-qi-ru-he-xiu-gai-opencore-pei-zhi-wen-jian/</guid>
      <description>Note: The following is only for models with similar configurations, that is, 9th generation Intel CPUs. Please avoid other models.&#xA;IMPORTANT NOTE The configuration in OpenCorebinary is in reverse order, such as the following platform-id. If you need to modify other models, you need to fill in platform-id in reverse order. Here is Coffee Lake帧缓冲区补丁及UHD630 Coffee Lake ig-platform-id数据整理 compiled by 黑果小兵 Here is 黑苹果必备：Intel核显platform ID整理及smbios速查表 compiled by 黑果小兵 General instructions: How to modify the three codes After downloading the entire package, if you have used the iMac19,1 model before in Clover, you can directly use the previous three codes, or use Clover Configurator (other tools are also available) to select the iMac19,1 model to generate a new three codes + ROM, use ProperTree to open the /EFI/OC/config.</description>
    </item>
    <item>
      <title>Analysis of sports events in the Provincial Games - Classification of sports events</title>
      <link>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-xiang-mu-fen-lei/</link>
      <pubDate>Sat, 11 Sep 2021 15:30:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-xiang-mu-fen-lei/</guid>
      <description>0. General requirements Provide RESTful interface and data files Specific data of competition events (historical records, historical results), Competition venue information Participating delegation information, athlete numbers, order list Results announcement, order sheet (finals), medal announcement, points announcement, record-breaking documents 1. Racing category In racing events, the order in which athletes pass the finish line is used as the main criterion to determine the ranking of athletes. The main racing events include: track and field (track events), swimming, cycling, rowing, canoeing, speed skating, short track speed skating, etc.</description>
    </item>
    <item>
      <title>Overview of home network architecture based on PVE &#43; soft routing &#43; NAS (for technical personnel)</title>
      <link>https://blog.margrop.net/en/post/home-network-architecture-based-pve-and-soft-route-and-nas/</link>
      <pubDate>Fri, 03 Sep 2021 09:50:49 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/home-network-architecture-based-pve-and-soft-route-and-nas/</guid>
      <description>Home Network Overview The home network will not separate the &amp;ldquo;business plane&amp;rdquo;, &amp;ldquo;management plane&amp;rdquo; and &amp;ldquo;data plane&amp;rdquo; like a regular virtualization platform. What home networks need is convenience, so the three planes mentioned above need to be integrated together to share the network in order to facilitate management. The security of the home network is also very important. No one wants the network door at home to be open to the outside world all the time.</description>
    </item>
    <item>
      <title>Use of Telecom Optical Cat HGU421N_V3</title>
      <link>https://blog.margrop.net/en/post/telecom-optical-modem-hgu421n_v3-usage/</link>
      <pubDate>Thu, 02 Sep 2021 10:59:03 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/telecom-optical-modem-hgu421n_v3-usage/</guid>
      <description>Note: Ethernet port 4: 1000Mb/s, others 10/100Mb/s Password of TTY might NOT be 以用户名：admin，密码：v2mprt 登录 Any powerful Route compatible with ChinaTelecom EPON and has 2 1000Mb/s ports at least? e8-C Terminal User Manual: Product technical specifications: Huaqin HGU421N v3.0 broadband modem crack: pplc #1 Old 2015-01-02, 17:39:43 Default new version of Huaqin HGU421N V3 optical cat crack Recently, I found some old version of HGU421N V3 cracking information on the Internet, and based on the reference, I cracked the new version of HGU421N V3, and it also has IPTV on it.</description>
    </item>
    <item>
      <title>Enable Version Control for Node-RED Flows</title>
      <link>https://blog.margrop.net/en/post/node-red-enable-version-control/</link>
      <pubDate>Sat, 28 Aug 2021 14:40:50 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/node-red-enable-version-control/</guid>
      <description>&lt;h1 id=&#34;problem-description&#34;&gt;Problem Description&lt;/h1&gt;&#xA;&lt;p&gt;I used to back up Node-RED flows by copying &lt;code&gt;~/.node-red/flows_xxx.json&lt;/code&gt; and keeping multiple versions. That was annoying, and even comparing unformatted JSON with tools like Beyond Compare was a mess.&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution-pretty-print-json&#34;&gt;Solution: Pretty-Print JSON&lt;/h1&gt;&#xA;&lt;p&gt;I found that by changing the setting in &lt;code&gt;~/.node-red/settings.js&lt;/code&gt;, the &lt;code&gt;flows_xxx.json&lt;/code&gt; file can be saved in a pretty-printed format.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Error deleting remote branch in git: remote ref does not exist</title>
      <link>https://blog.margrop.net/en/post/git-shan-chu-yuan-cheng-fen-zhi-bao-cuo-remote-ref-does-not-exist/</link>
      <pubDate>Fri, 27 Aug 2021 10:48:48 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/git-shan-chu-yuan-cheng-fen-zhi-bao-cuo-remote-ref-does-not-exist/</guid>
      <description>&lt;h1 id=&#34;problem-description&#34;&gt;Problem Description&lt;/h1&gt;&#xA;&lt;p&gt;When trying to delete a remote branch in the view, it displays: &lt;code&gt;remote ref does not exist&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;Solution&lt;/h1&gt;&#xA;&lt;p&gt;The solution is to first clear the local cache of the remote branch: &lt;code&gt;git fetch -p origin&lt;/code&gt;&#xA;As you can see, the remote branch we were trying to delete has actually already been deleted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Analysis of sports events in the Provincial Games - athletes and representative teams athletes &amp; nocs</title>
      <link>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-yuan-he-dai-biao-dui-athletes-and-nocs/</link>
      <pubDate>Tue, 24 Aug 2021 13:27:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-yuan-he-dai-biao-dui-athletes-and-nocs/</guid>
      <description>#athlete Name|Avatar|City|Team|Sport Type&#xA;#representativeteam Team name|Team logo</description>
    </item>
    <item>
      <title>Analysis of sports events in the Provincial Games - Schedule and results</title>
      <link>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-yuan-athletes/</link>
      <pubDate>Tue, 24 Aug 2021 13:27:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi-yun-dong-yuan-athletes/</guid>
      <description>01. Athletics 0111. Track and Field Schedule Start time|location|session|status&#xA;0112. Track and field appearance list Stages, Groups and Rounds | Track or Order | Player Number | Name</description>
    </item>
    <item>
      <title>Analysis of sports events in the Provincial Games - sports events</title>
      <link>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi/</link>
      <pubDate>Tue, 24 Aug 2021 13:27:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/sheng-yun-hui-de-yun-dong-xiang-mu-fen-xi/</guid>
      <description>Generic schedule Start time|location|session|status&#xA;#Universal appearance list one Stages, Groups and Rounds | Track or Order | Player Number | Name&#xA;General appearance list 2 General score one Ranking|Final Score&#xA;General Score 2 Game | Game 1 | Game 2 | Game 3 | Game 4 | Game 5 | Game 6 | Game 7&#xA;Detailed results Major events | Minor events | Olympic Games corresponding page | Detailed results 01 Athletics | - | https://olympics.</description>
    </item>
    <item>
      <title>Fix GitLab Push Failures After Repository Data Recovery: error: unpack failed: unable to create temporary object directory</title>
      <link>https://blog.margrop.net/en/post/jie-jue-gitlab-cang-ku-shu-ju-hui-fu-hou-jiu-cang-ku-wu-fa-ti-jiao-de-wen-ti-error-unpack-failed-unable-to-create-temporary-object-directory/</link>
      <pubDate>Tue, 24 Aug 2021 10:05:20 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/jie-jue-gitlab-cang-ku-shu-ju-hui-fu-hou-jiu-cang-ku-wu-fa-ti-jiao-de-wen-ti-error-unpack-failed-unable-to-create-temporary-object-directory/</guid>
      <description>&lt;h1 id=&#34;problem-description&#34;&gt;Problem Description&lt;/h1&gt;&#xA;&lt;p&gt;After the &lt;code&gt;GitLab&lt;/code&gt; server just finished a data recovery,&lt;/p&gt;&#xA;&lt;p&gt;all old repositories failed to accept &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The error message was &lt;code&gt;error: unpack failed: unable to create temporary object directory&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;However, newly created repositories could still accept &lt;code&gt;git push&lt;/code&gt; normally.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Synology Docker Gitlab suite update</title>
      <link>https://blog.margrop.net/en/post/qun-hui-synology-docker-gitlab-tao-jian-geng-xin/</link>
      <pubDate>Mon, 23 Aug 2021 17:30:14 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qun-hui-synology-docker-gitlab-tao-jian-geng-xin/</guid>
      <description>warn Environment settings will be cleared during upgrade Synology has a bit of this. . .&#xA;Basically just put Add it back&#xA;Then change the port number from 80 to 443&#xA;Install certificate The default path where the gitlab application is configured to look for SSL certificates is /home/git/data/certs, but this can be changed using the SSL_KEY_PATH, SSL_CERTIFICATE_PATH, and SSL_DHPARAM_PATH configuration options.&#xA;GITLAB_HTTPS=true SSL_SELF_SIGNED=true How to enable HTTPS support HTTPS support can be enabled by setting the GITLAB_HTTPS option to true.</description>
    </item>
    <item>
      <title>Solve the problem of PostgreSQL 10 to 11, Permissions should be u=rwx (0700)</title>
      <link>https://blog.margrop.net/en/post/jie-jue-postgresql-10-sheng-ji-zhi-11permissions-should-be-urwx-0700wen-ti/</link>
      <pubDate>Mon, 23 Aug 2021 16:45:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/jie-jue-postgresql-10-sheng-ji-zhi-11permissions-should-be-urwx-0700wen-ti/</guid>
      <description>#Problem description&#xA;Today I plan to upgrade Gitlab from version 11 to version 12. I have tried the default steps many times without success.&#xA;I was really unwilling to give it up. After searching for a long time, I finally found an error in the PostgreSQL log.&#xA;The key two lines of log are as follows:&#xA;Search questions Use Google to search &amp;ldquo;data directory has group or world access&amp;rdquo;&#xA;The first result is the solution, Postgres exits with &amp;ldquo;Permissions should be u=rwx (0700)&amp;rdquo; #45</description>
    </item>
    <item>
      <title>On the Importance of Backups and RAID 1</title>
      <link>https://blog.margrop.net/en/post/lun-bei-fen-he-raid-1-de-chong-yao-xing/</link>
      <pubDate>Mon, 23 Aug 2021 10:47:13 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/lun-bei-fen-he-raid-1-de-chong-yao-xing/</guid>
      <description>The first hard drive is damaged The first time I lost data due to a damaged hard drive was around 2010.&#xA;At that time, the price of BTC was about 7-8 dollars, which is equivalent to about 40-50 RMB.&#xA;At that time, many websites were giving away small amounts of BTC for free, and I also received 0.02 BTC at that time.&#xA;At that time, the laptop hard drive was suddenly damaged, and all the data, course materials, homework, and BTC were lost.</description>
    </item>
    <item>
      <title>How to Upgrade from Proxmox VE 6.4 to Proxmox VE 7.0</title>
      <link>https://blog.margrop.net/en/post/upgrade-from-pve-6.x-to-7.0/</link>
      <pubDate>Mon, 16 Aug 2021 14:52:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/upgrade-from-pve-6.x-to-7.0/</guid>
      <description>&lt;p&gt;I haven&amp;rsquo;t followed the official Proxmox VE site for a while.&lt;/p&gt;&#xA;&lt;p&gt;Until a few days ago, when I recommended PVE to a colleague, I suddenly realized there was another major version upgrade.&lt;/p&gt;&#xA;&lt;p&gt;As an upgrade obsessive, of course I chose to upgrade to the latest version immediately.&lt;/p&gt;&#xA;&lt;p&gt;I had already gone through the process of upgrading from PVE 5.x to 6.0 long ago, and now it was time for PVE 6.4 to 7.0.&lt;/p&gt;&#xA;&lt;p&gt;In short, just follow the official tutorial honestly.&lt;/p&gt;&#xA;&lt;h1 id=&#34;official-tutorials-for-each-major-pve-upgrade&#34;&gt;Official tutorials for each major PVE upgrade:&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0&#34;&gt;Upgrade from Proxmox VE 6.x to 7.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_5.x_to_6.0&#34;&gt;Upgrade from Proxmox VE 5.x to 6.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_4.x_to_5.0&#34;&gt;Upgrade from Proxmox VE 4.x to 5.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pve.proxmox.com/wiki/Upgrade_from_3.x_to_4.0&#34;&gt;Upgrade from Proxmox VE 3.x to 4.0&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Life Events - The Milestone</title>
      <link>https://blog.margrop.net/en/post/the-milestone/</link>
      <pubDate>Mon, 16 Aug 2021 14:40:52 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/the-milestone/</guid>
      <description>The day before yesterday, we finally reached a time point. According to the regulations, we took the number, queued up, paid the money, and received the certificate.&#xA;I finally got the book. Although I have been complaining about it, I have nothing to regret.</description>
    </item>
    <item>
      <title>[Transfer] Android implements the hiding and display function of the system status bar</title>
      <link>https://blog.margrop.net/en/post/zhuan-android-shi-xian-xi-tong-zhuang-tai-lan-de-yin-cang-he-xian-shi-gong-neng/</link>
      <pubDate>Fri, 09 Jul 2021 20:41:13 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-android-shi-xian-xi-tong-zhuang-tai-lan-de-yin-cang-he-xian-shi-gong-neng/</guid>
      <description>&lt;p&gt;#Problem description&#xA;Especially for video apps, it is necessary to hide the system status bar and display it in full screen after switching to horizontal screen, so that you can watch videos with a larger screen. when switching back to&#xA;After the screen is turned vertically, the status bar is displayed again. So how to achieve it?&lt;/p&gt;&#xA;&lt;h1 id=&#34;there-are-many-methods-circulating-on-the-internet&#34;&gt;There are many methods circulating on the Internet&lt;/h1&gt;&#xA;&lt;p&gt;for example&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Modify &lt;code&gt;theme&lt;/code&gt; in the &lt;code&gt;AndroidManifest.xml&lt;/code&gt; file to&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Execute the following code before the &lt;code&gt;setContentView&lt;/code&gt; method:&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Through the &lt;code&gt;setSystemUiVisibility&lt;/code&gt; method of &lt;code&gt;View&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Use the following code to hide and display the status bar:&#xA;In my project, I want to achieve the following requirements: in the current &lt;code&gt;Activity&lt;/code&gt;, after switching to landscape screen, &lt;code&gt;Activity&lt;/code&gt; cannot be destroyed and re-initialized, and the system status bar can be hidden and displayed in full screen; after switching back to vertical screen, the status bar can be displayed again. Also, I don&amp;rsquo;t need to hide the title bar.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Therefore, neither method 1 nor 2 is suitable for me. Method 3, which I have used, calls the &lt;code&gt;setSystemUiVisibility&lt;/code&gt; method. The parameters passed in by this method can be:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_VISIBLE: Display the status bar, and the Activity is not displayed in full screen (returning to the normal state with state).&lt;/li&gt;&#xA;&lt;li&gt;View.INVISIBLE: Hide the status bar and the Activity will stretch to full screen.&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_FULLSCREEN: Activity is displayed in full screen, and the status bar is hidden and covered.&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: The Activity is displayed in full screen, but the status bar will not be hidden and covered. The status bar is still visible, and the top layout part of the Activity will be covered by the status.&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION: The effect is the same as View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_LAYOUT_FLAGS: The effect is the same as View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_HIDE_NAVIGATION: Hide virtual buttons (navigation bar). Some mobile phones use virtual buttons instead of physical buttons.&lt;/li&gt;&#xA;&lt;li&gt;View.SYSTEM_UI_FLAG_LOW_PROFILE: The status bar display is in a low-power display state (low profile mode), and some icons on the status bar will be hidden.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;What I need to pass in here is &lt;code&gt;View.SYSTEM_UI_FLAG_FULLSCREEN&lt;/code&gt;, but when I pass in this parameter, the result is: just the status bar disappears, but the position is still there. (Test mobile phones: Huawei Honor 8 system is EMUI 5.0 based on Android 7.0; Samsung Galaxy S6 system is Android 6.0)&lt;/p&gt;&#xA;&lt;p&gt;Finally, use method 4 to successfully meet the needs.&lt;/p&gt;&#xA;&lt;h1 id=&#34;summarize&#34;&gt;Summarize&lt;/h1&gt;&#xA;&lt;p&gt;The above is the Android implementation of hiding and displaying the system status bar function introduced by the editor. I hope it will be helpful to you. If you have any questions, please leave me a message and the editor will reply to you in time. I would also like to thank everyone for your support of the ZaLou.Cn website!&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;android:theme=&amp;#34;@android:style/Theme.NoTitleBar.Fullscreen&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;requestWindowFeature(Window.FEATURE_NO_TITLE) &#xA; getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3、通过&lt;code&gt;View&lt;/code&gt;的&lt;code&gt;setSystemUiVisibility&lt;/code&gt;方法&lt;/p&gt;&#xA;&lt;p&gt;4、通过如下代码实现状态栏的隐藏和显示：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在我的项目中是要实现如下需求：在当前&lt;code&gt;Activity&lt;/code&gt;中，切换到横屏后，不能销毁&lt;code&gt;Activity&lt;/code&gt;再重新初始化，并且实现隐藏系统状态栏，全屏显示；当切换回竖屏后，又显示状态栏。另外，我不需要隐藏标题栏。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Issue where pip becomes unusable after pip install --upgrade pip on CentOS 7: ImportError: No module named typing</title>
      <link>https://blog.margrop.net/en/post/centos-7-no-module-named-typing-after-upgrade-pip/</link>
      <pubDate>Wed, 16 Jun 2021 11:13:46 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-7-no-module-named-typing-after-upgrade-pip/</guid>
      <description>&lt;h1 id=&#34;problem-description&#34;&gt;Problem Description&lt;/h1&gt;&#xA;&lt;p&gt;pip安装某第三方 SDK，提示升级 pip，按提示升级 pip 后报错&lt;/p&gt;&#xA;&lt;h2 id=&#34;pip-upgrade-command-that-causes-the-error&#34;&gt;pip Upgrade Command that Causes the Error&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install --upgrade pip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pip-error-message&#34;&gt;pip Error Message&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/pip&amp;#34;&lt;/span&gt;, line 9, in &amp;lt;module&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    load_entry_point&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pip==21.1.2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;console_scripts&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pip&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 378, in load_entry_point&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; get_distribution&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;dist&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.load_entry_point&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;group, name&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 2566, in load_entry_point&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ep.load&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 2260, in load&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    entry &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; __import__&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;self.module_name, globals&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;,globals&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__name__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pip/__init__.py&amp;#34;&lt;/span&gt;, line 1, in &amp;lt;module&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from typing import List, Optional&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ImportError: No module named typing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>The Great Event - The Great Event</title>
      <link>https://blog.margrop.net/en/post/the-great-event/</link>
      <pubDate>Mon, 07 Jun 2021 08:57:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/the-great-event/</guid>
      <description>There are very few opportunities in life to do big things.&#xA;I did one yesterday&#xA;As for the result, we have to wait for time to test it.</description>
    </item>
    <item>
      <title>Synology Chat download and installation address</title>
      <link>https://blog.margrop.net/en/post/synology-chat-download-address/</link>
      <pubDate>Mon, 07 Jun 2021 08:31:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-chat-download-address/</guid>
      <description>Due to well-known reasons, Chat has now disappeared&#xA;However, the international version of the Synology site can still be downloaded and used normally.&#xA;Use and cherish&#xA;DS3617xsInternational Version Download Center&#xA;Chat Kit download address&#xA;Chat Android version download address&#xA;*Chat Apple users must find an overseas iCloud account to install it.&#xA;The above Chat package and APK have been backed up to the download center of this site </description>
    </item>
    <item>
      <title>How to Install Homebrew on Mac OS X Lion 10.7.4</title>
      <link>https://blog.margrop.net/en/post/mac-os-x-lion-10-7-4-ru-he-an-zhuang-homebrew/</link>
      <pubDate>Sat, 29 May 2021 17:30:33 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mac-os-x-lion-10-7-4-ru-he-an-zhuang-homebrew/</guid>
      <description>&lt;p&gt;Reference articles:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How to Install Homebrew on Mac OS X Lion 10.7.4&#xA;&lt;a href=&#34;http://ocdman.github.io/2018/10/08/Mac-OS-X-Lion-10-7-4-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85Homebrew/&#34;&gt;http://ocdman.github.io/2018/10/08/Mac-OS-X-Lion-10-7-4-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85Homebrew/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;[macOS] brew installation&#xA;&lt;a href=&#34;https://www.jianshu.com/p/1e5e72089a84&#34;&gt;https://www.jianshu.com/p/1e5e72089a84&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;preparation&#34;&gt;Preparation&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Manually compile and install &lt;code&gt;OpenSSL 1.1.1k&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Manually compile and install the latest &lt;code&gt;curl&lt;/code&gt;, and note that compilation requires &lt;code&gt;OpenSSL&lt;/code&gt; and the &lt;code&gt;cacert.pem&lt;/code&gt; certificate&lt;/li&gt;&#xA;&lt;li&gt;Download and install the latest &lt;code&gt;git&lt;/code&gt; from &lt;code&gt;http://git-scm.com/&lt;/code&gt; yourself&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;important-special-steps&#34;&gt;Important Special Steps&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir -p /usr/local/opt/curl/bin&#xA;mkdir -p /usr/loca/opt/git/bin&#xA;ln -s /usr/local/bin/curl /usr/local/opt/curl/bin/curl&#xA;ln -s /usr/local/bin/git /usr/local/opt/git/bin/git&#xA;&#xA;mv /usr/bin/curl /usr/bin/curl_bak&#xA;cp /usr/local/bin/curl /usr/bin/curl&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>AppDaemon (HADashboard) Installation Guide</title>
      <link>https://blog.margrop.net/en/post/how-to-install-appdaemon-hadashboard/</link>
      <pubDate>Sat, 29 May 2021 14:22:56 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-appdaemon-hadashboard/</guid>
      <description>&lt;h1 id=&#34;installation-prerequisites&#34;&gt;Installation Prerequisites&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HomeAssistant access address and permanent Token&lt;/li&gt;&#xA;&lt;li&gt;Linux runtime environment&lt;/li&gt;&#xA;&lt;li&gt;Python3 runtime environment (the following is based on CentOS 7)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install python3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -U pip3 setuptools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Vim opens the file with Chinese garbled characters</title>
      <link>https://blog.margrop.net/en/post/vim-open-files-messy-code-solution/</link>
      <pubDate>Sat, 15 May 2021 16:27:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/vim-open-files-messy-code-solution/</guid>
      <description>Solution Edit the ~/.vimrc file (create it manually if it doesn’t exist) and add the following lines set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 </description>
    </item>
    <item>
      <title>Fix HAVCS Failing to Start on the Latest Home Assistant: AttributeError: &#39;ApiConfig&#39; object has no attribute &#39;base_url&#39;</title>
      <link>https://blog.margrop.net/en/post/homeassistant-attributeerror-apiconfig-object-has-no-attribute-base_url/</link>
      <pubDate>Wed, 12 May 2021 18:12:02 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/homeassistant-attributeerror-apiconfig-object-has-no-attribute-base_url/</guid>
      <description>&lt;h1 id=&#34;do-not-upgrade-ha-too-frequently-updated-may-15-2021&#34;&gt;Do Not Upgrade HA Too Frequently [Updated May 15, 2021]&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;I strongly do not recommend upgrading to core-2021.3.1 and later, including core-2021.5.3&lt;/code&gt;&#xA;&lt;code&gt;From core-2021.3.1 onward there are some strange bugs. The version that is currently stable for the author is still core-2021.2.3&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;problem-description&#34;&gt;Problem Description&lt;/h1&gt;&#xA;&lt;p&gt;After the author upgraded &lt;code&gt;Home Assistant&lt;/code&gt; to the latest version, &lt;code&gt;HAVCS&lt;/code&gt; could no longer start normally.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;Home Assistant&lt;/code&gt; version that can run &lt;code&gt;HAVCS&lt;/code&gt; normally: core-2021.2.3&#xA;&lt;code&gt;Home Assistant&lt;/code&gt; version that cannot run &lt;code&gt;HAVCS&lt;/code&gt;: core-2021.5.3&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Checking the &lt;code&gt;Home Assistant&lt;/code&gt; logs showed this error:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AttributeError: &amp;#39;ApiConfig&amp;#39; object has no attribute &amp;#39;base_url&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Home Assistant: Add a Custom IR Remote and Support Tmall Genie and Xiaodu</title>
      <link>https://blog.margrop.net/en/post/homeassistant-tian-jia-zi-ding-yi-de-hong-wai-yao-kong-qi-ji-yu-mi-jia-wan-neng-yao-kong-qi/</link>
      <pubDate>Wed, 12 May 2021 16:09:09 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/homeassistant-tian-jia-zi-ding-yi-de-hong-wai-yao-kong-qi-ji-yu-mi-jia-wan-neng-yao-kong-qi/</guid>
      <description>&lt;h1 id=&#34;preparation&#34;&gt;Preparation&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;An online &lt;code&gt;Mi Home universal remote&lt;/code&gt; already added to &lt;code&gt;Home Assistant&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;IP address&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt; of the &lt;code&gt;Mi Home universal remote&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How do you get the &lt;code&gt;IP address&lt;/code&gt;?&#xA;Open the &lt;code&gt;Mi Home app&lt;/code&gt; on your phone, select the device bound to your Xiaomi account, enter it, then tap the &lt;code&gt;...&lt;/code&gt; in the top right -&amp;gt; &lt;code&gt;More settings&lt;/code&gt; -&amp;gt; &lt;code&gt;Network information&lt;/code&gt; to view the device &lt;code&gt;IP address&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How do you get the &lt;code&gt;token&lt;/code&gt;?&#xA;Reference 1: &lt;a href=&#34;https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor&#34;&gt;Use an open-source tool to export Xiaomi Token&lt;/a&gt;&#xA;Reference 2: &lt;a href=&#34;https://www.home-assistant.io/integrations/xiaomi_miio/#retrieving-the-access-token&#34;&gt;Retrieving the Access Token&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Integrating HomeAssistant with Tmall Genie, 2021 Version</title>
      <link>https://blog.margrop.net/en/post/homeassistant-access-aligenie-aliyun/</link>
      <pubDate>Mon, 10 May 2021 22:19:34 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/homeassistant-access-aligenie-aliyun/</guid>
      <description>Avoid Frequent HA Upgrades [Updated May 15, 2021] 强烈不建议升级到 core-2021.3.1 以及之后的版本，包括 core-2021.5.3 从 core-2021.3.1 以后的版本有一些莫名的 bug，目前博主稳定使用的版本还是 core-2021.2.3&#xA;Tmall Genie Platform: https://iot.aligenie.com/skill/home&#xA;Alibaba Life IoT Platform: https://living.aliyun.com/</description>
    </item>
    <item>
      <title>Essential Chrome Plugins for Developers</title>
      <link>https://blog.margrop.net/en/post/chrome-plugins-that-developers-must-install/</link>
      <pubDate>Mon, 10 May 2021 09:18:24 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/chrome-plugins-that-developers-must-install/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Note: You will need to resolve the issue of being unable to access &lt;code&gt;chrome.google.com&lt;/code&gt; on your own.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Enable Automatic Startup for Docker Services and Containers After Reboot</title>
      <link>https://blog.margrop.net/en/post/reboot-docker-server-auto-start/</link>
      <pubDate>Tue, 06 Apr 2021 14:39:32 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/reboot-docker-server-auto-start/</guid>
      <description>&lt;p&gt;After rebooting the operating system, I found that the Docker service did not start and the containers did not start either. How do you make them start automatically after reboot?&lt;/p&gt;&#xA;&lt;h1 id=&#34;solve-two-problems&#34;&gt;Solve Two Problems&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enable automatic restart for the Docker service&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable docker.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/external/cd1b1425e8c3d0f4.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing and Using gperftools to Analyze Java Off-Heap Memory</title>
      <link>https://blog.margrop.net/en/post/gperftools-install-analysis-memory-out-of-heap/</link>
      <pubDate>Tue, 30 Mar 2021 09:54:54 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/gperftools-install-analysis-memory-out-of-heap/</guid>
      <description>&lt;h1 id=&#34;centos&#34;&gt;CentOS&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Install using yum&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install gperftools libunwind&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Optional, PDF support&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install graphviz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Set environment variables&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export LD_PRELOAD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/usr/lib64/libtcmalloc.so&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export HEAPPROFILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/DATA1/admin_tmp/gzip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Proxmox VE 6.4 daily upgrade commands</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-upgrade-software-command/</link>
      <pubDate>Mon, 29 Mar 2021 08:23:52 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-upgrade-software-command/</guid>
      <description>Remove unused Linux kernel pvekclean Update software: apt update -y &amp;amp;&amp;amp; apt dist-upgrade -y Remove the unsubscribed prompt and support PVE 6.3 / 6.4 sed -i_orig &amp;#34;s/data.status === &amp;#39;Active&amp;#39;/true/g&amp;#34; /usr/share/pve-manager/js/pvemanagerlib.js sed -i_orig &amp;#34;s/if (res === null || res === undefined || \!res || res/if(/g&amp;#34; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js sed -i_orig &amp;#34;s/.data.status.toLowerCase() !== &amp;#39;active&amp;#39;/false/g&amp;#34; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js systemctl restart pveproxy After confirming that everything is correct, restart the server. reboot Solve software upgrade problems Added Alibaba Cloud&amp;rsquo;s Debian image source</description>
    </item>
    <item>
      <title>Java Spring Boot JNI Native Library Loader</title>
      <link>https://blog.margrop.net/en/post/java-spring-boot-jni-java-native-interface-library-loader/</link>
      <pubDate>Sat, 27 Mar 2021 16:37:31 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/java-spring-boot-jni-java-native-interface-library-loader/</guid>
      <description>&lt;p&gt;Because Java needs to stay cross-platform, I wrote a cross-platform JNI native library loader.&lt;/p&gt;&#xA;&lt;h1 id=&#34;simple-implementation&#34;&gt;Simple Implementation&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Determine whether the current system is &lt;code&gt;Windows&lt;/code&gt;, &lt;code&gt;Linux&lt;/code&gt;, or &lt;code&gt;MacOS&lt;/code&gt; from the &lt;code&gt;os.name&lt;/code&gt; environment property.&lt;/li&gt;&#xA;&lt;li&gt;If it is &lt;code&gt;Linux&lt;/code&gt;, further determine whether it is &lt;code&gt;CentOS&lt;/code&gt; or &lt;code&gt;Debian&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Read the library files inside the jar package.&lt;/li&gt;&#xA;&lt;li&gt;Filter the matching platform library files by file suffix: &lt;code&gt;dll&lt;/code&gt;, &lt;code&gt;so&lt;/code&gt;, &lt;code&gt;jnilib&lt;/code&gt;, and &lt;code&gt;dylib&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Copy the current platform&amp;rsquo;s library file to the system temporary directory &lt;code&gt;java.io.tmpdir&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Load the library using &lt;code&gt;System.load&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Spring Boot &#43; Undertow upload file cannot find temporary directory</title>
      <link>https://blog.margrop.net/en/post/spring-boot-undertow-upload-file-not-found-temp-folder/</link>
      <pubDate>Sat, 27 Mar 2021 11:17:26 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/spring-boot-undertow-upload-file-not-found-temp-folder/</guid>
      <description>The problem occurs Two days ago, the company&amp;rsquo;s SpringBoot project suddenly had a problem of being unable to upload Excel files.&#xA;After checking the Java log, I found a large number of exceptions: java.nio.file.NoSuchFileException: /tmp/undertow.12020.9432679758080410942/undertow17157208698492118168upload&#xA;Detailed exception information is as follows:&#xA;org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: /tmp/undertow.12020.9432679758080410942/undertow17157208698492118168upload at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:124) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:115) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.&amp;lt;init&amp;gt;(StandardMultipartHttpServletRequest.java:88) at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:87) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1199) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1033) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.</description>
    </item>
    <item>
      <title>Troubleshooting a Network Storm in My Home Network</title>
      <link>https://blog.margrop.net/en/post/a-network-broadcast-flooding-solution-record/</link>
      <pubDate>Fri, 26 Mar 2021 09:37:21 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/a-network-broadcast-flooding-solution-record/</guid>
      <description>&lt;p&gt;March 7th, Sunday. It was supposed to be a day for rest and relaxation.&lt;/p&gt;&#xA;&lt;h1 id=&#34;around-10-am&#34;&gt;Around 10 AM&lt;/h1&gt;&#xA;&lt;p&gt;The XiaoAi speaker at home suddenly stopped working, showing &amp;ldquo;Network Connection Failed&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;I initially thought it was just a minor issue, but after some inspection, I discovered that all networked devices at home had lost connectivity???&lt;/p&gt;</description>
    </item>
    <item>
      <title>MySQL Date and DST Conversion Error HOUR_OF_DAY: 0 -&gt; 1 and How to Fix It</title>
      <link>https://blog.margrop.net/en/post/mysql-exception-hour-of-day-0-1-solution/</link>
      <pubDate>Thu, 25 Mar 2021 10:53:15 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mysql-exception-hour-of-day-0-1-solution/</guid>
      <description>&lt;h1 id=&#34;error-occurred-when-exporting-user-data-hour_of_day-0---1&#34;&gt;Error Occurred When Exporting User Data: HOUR_OF_DAY: 0 -&amp;gt; 1&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Exception in thread &amp;ldquo;main&amp;rdquo; java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -&amp;gt; 1&#xA;The full error message is as follows:&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>HomeAssistant: Common HACS, Github Third-party Support Library Repos</title>
      <link>https://blog.margrop.net/en/post/homeassistant-github-support-repo/</link>
      <pubDate>Mon, 15 Mar 2021 08:56:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/homeassistant-github-support-repo/</guid>
      <description>&lt;h1 id=&#34;hacs&#34;&gt;HACS&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HACS Official Website&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/hacs/integration&#34;&gt;https://github.com/hacs/integration&lt;/a&gt;&#xA;&lt;a href=&#34;https://hacs.xyz/&#34;&gt;https://hacs.xyz/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HACS Installation Documentation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://hacs.xyz/docs/installation/installation&#34;&gt;https://hacs.xyz/docs/installation/installation&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>HomeAssistant Configuration: Auto-Reminder When Security Door is Left Open for Extended Period</title>
      <link>https://blog.margrop.net/en/post/homeassistant-attation-master-when-door-is-open-too/</link>
      <pubDate>Tue, 09 Mar 2021 18:18:37 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/homeassistant-attation-master-when-door-is-open-too/</guid>
      <description>Required devices: 小米门窗传感器, 小米Aqara网关, 小米触屏音箱&#xA;When the door remains open for 1 minute and for 2 minutes, the speaker will automatically give a voice reminder to close the door&#xA;description: &amp;#39;&amp;#39; trigger: - type: opened platform: device device_id: 000000f29088665d7b820e7d4000000 entity_id: binary_sensor.door_window_sensor_158d0002000000 domain: binary_sensor for: hours: 0 minutes: 1 seconds: 0 milliseconds: 0 - type: opened platform: device device_id: 000000f29088665d7b820e7d4000000 entity_id: binary_sensor.door_window_sensor_158d0002000000 domain: binary_sensor for: hours: 0 minutes: 2 seconds: 0 milliseconds: 0 condition: [] action: - service: zhimsg.</description>
    </item>
    <item>
      <title>Feign usage examples: @Body annotation, http request body</title>
      <link>https://blog.margrop.net/en/post/feign-demo/</link>
      <pubDate>Fri, 05 Mar 2021 18:25:23 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/feign-demo/</guid>
      <description>&lt;p&gt;There is a situation where the interface uses the http request body to pass parameters, so I studied feign and found that the @Body annotation can generally be implemented.&#xA;Although it is said that the request body is used to pass parameters, in fact, the request body still contains data in json format. Of course, if you don&amp;rsquo;t want to be limited to the json format, you can set it to a universal format. See the end of the article for details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WeChat Old Version Installation Method - Version Too Low, Please Upgrade to the Latest Version</title>
      <link>https://blog.margrop.net/en/post/how-to-install-old-version-wechat/</link>
      <pubDate>Fri, 05 Mar 2021 11:22:11 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-old-version-wechat/</guid>
      <description>&lt;h1 id=&#34;first-install-the-latest-version-of-wechat-and-log-in&#34;&gt;First install the latest version of WeChat and log in.&lt;/h1&gt;&#xA;&lt;h1 id=&#34;uninstall-the-app-using-the-cmd-command-while-preserving-user-data&#34;&gt;Uninstall the app using the cmd command while preserving user data:&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adb shell pm uninstall -k com.tencent.mm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;restart-your-phone&#34;&gt;Restart your phone&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adb root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;This step is very important, otherwise you will get an error message &lt;code&gt;adb: failed to install xxxxxx Failure [INSTALL_FAILED_VERSION_DOWNGRADE]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;install-the-old-version-apk-using-the-cmd-command-followed-by-the-installation-package-path&#34;&gt;Install the old version APK using the cmd command (followed by the installation package path):&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adb install -r -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;log-into-your-wechat-account-on-the-old-version&#34;&gt;Log into your WeChat account on the old version.&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Python3 object-oriented programming</title>
      <link>https://blog.margrop.net/en/post/python3-oop/</link>
      <pubDate>Thu, 04 Mar 2021 22:23:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-oop/</guid>
      <description>Object-oriented programming Access restrictions Private variables start with __ class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print(&amp;#39;%s: %s&amp;#39; % (self.name, self.score)) Inheritance and polymorphism Inheritance: Dog inherits from Animal class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print(&amp;#39;%s: %s&amp;#39; % (self.__name, self.__score)) Get object information Basic object types Object type of a function or class Type checking Reflection: use dir() to get all properties and methods of an object Reflection: getattr(), setattr(), and hasattr() Interfaces and duck typing class Animal(object): def run(self): print(&amp;#39;Animal is running.</description>
    </item>
    <item>
      <title>The biggest pitfall of SpringBoot DevTools, none of them</title>
      <link>https://blog.margrop.net/en/post/springboot-devtools-terrible/</link>
      <pubDate>Wed, 03 Mar 2021 18:23:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/springboot-devtools-terrible/</guid>
      <description>Recently, a lot of changes have been added to the SpringBoot project, and then I encountered a very strange problem.&#xA;HibernateDatabase query error This is simply weird Expected type and actual value are exactly the same, but Hibernate thinks they are different. How can this be fixed?&#xA;After struggling with this strange problem for a day, I found that this only occurs on my local machine. The same code is completely normal on the test server.</description>
    </item>
    <item>
      <title>Python3 bugs, debugging and testing</title>
      <link>https://blog.margrop.net/en/post/python3-cuo-wu-diao-shi-he-ce-shi/</link>
      <pubDate>Mon, 01 Mar 2021 17:27:07 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-cuo-wu-diao-shi-he-ce-shi/</guid>
      <description>Error handling Common mistakes in inheritance relationships&#xA;Log errors&#xA;throw error&#xA;try: print(&amp;#39;try...&amp;#39;) r = 10 / 0 print(&amp;#39;result:&amp;#39;, r) except ZeroDivisionError as e: print(&amp;#39;except:&amp;#39;, e) finally: print(&amp;#39;finally...&amp;#39;) print(&amp;#39;END&amp;#39;) BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning import logging def foo(s): return 10 / int(s) def bar(s): return foo(s) * 2 def main(): try: bar(&amp;#39;0&amp;#39;) except Exception as e: logging.</description>
    </item>
    <item>
      <title>Three JavaScript Quirks Java/C Developers Should Know</title>
      <link>https://blog.margrop.net/en/post/three-javascript-quirks-java-c-developers-should-know/</link>
      <pubDate>Sun, 28 Feb 2021 22:28:36 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/three-javascript-quirks-java-c-developers-should-know/</guid>
      <description>JavaScript can be a deceptive language and can cause a lot of pain because it&amp;rsquo;s not 100% consistent. It is known that it does have some bad, confusing or redundant features: the infamous with statement, 隐式全局变量 and 不稳定的比较 are probably the most famous.&#xA;JavaScript is one of the most successful flame generators in history! Aside from its flaws (which are partially addressed in the new ECMAScript specification), most programmers hate JavaScript for two reasons:</description>
    </item>
    <item>
      <title>Python 3 I/O Programming</title>
      <link>https://blog.margrop.net/en/post/python3-io-programming/</link>
      <pubDate>Fri, 26 Feb 2021 10:29:31 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-io-programming/</guid>
      <description>&lt;h1 id=&#34;file-reading-and-writing&#34;&gt;File Reading and Writing&lt;/h1&gt;&#xA;&lt;h2 id=&#34;read-reads-the-entire-file-at-once&#34;&gt;&lt;code&gt;read()&lt;/code&gt;: reads the entire file at once&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;with&lt;/code&gt; is similar to &lt;code&gt;try...catch&lt;/code&gt;, but simpler, and it automatically calls &lt;code&gt;close&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/path/to/file&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>How to Run Multiple Python Scripts on Mac with One Command</title>
      <link>https://blog.margrop.net/en/post/one-command-in-mac-execute-mulit-python-scripts/</link>
      <pubDate>Thu, 25 Feb 2021 15:52:15 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/one-command-in-mac-execute-mulit-python-scripts/</guid>
      <description>&lt;p&gt;There are currently 4 Python scripts, and I want to execute all 4 scripts with a single command. How can I do that?&#xA;My current approach is rather crude. I used 5 shell scripts to achieve it, but I don&amp;rsquo;t know whether there is a better way.&lt;/p&gt;&#xA;&lt;h1 id=&#34;shell-script-runallsh&#34;&gt;shell script &lt;code&gt;runAll.sh&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;ls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run17688821.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run49763693.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run857413.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run856853.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python3 regular expressions</title>
      <link>https://blog.margrop.net/en/post/python3-zheng-ze-biao-da-shi/</link>
      <pubDate>Wed, 24 Feb 2021 08:38:22 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-zheng-ze-biao-da-shi/</guid>
      <description>re module s = r&amp;#39;ABC\-001&amp;#39; # Python的字符串 # 对应的正则表达式字符串不变： # &amp;#39;ABC\-001&amp;#39; Determine whether a regular expression matches &amp;gt;&amp;gt;&amp;gt; import re &amp;gt;&amp;gt;&amp;gt; re.match(r&amp;#39;^\d{3}\-\d{3,8}$&amp;#39;, &amp;#39;010-12345&amp;#39;) &amp;lt;_sre.SRE_Match object; span=(0, 9), match=&amp;#39;010-12345&amp;#39;&amp;gt; &amp;gt;&amp;gt;&amp;gt; re.match(r&amp;#39;^\d{3}\-\d{3,8}$&amp;#39;, &amp;#39;010 12345&amp;#39;) &amp;gt;&amp;gt;&amp;gt; Split a string Group &amp;gt;&amp;gt;&amp;gt; &amp;#39;a b c&amp;#39;.split(&amp;#39; &amp;#39;) [&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;c&amp;#39;] Greedy matching &amp;gt;&amp;gt;&amp;gt; m = re.match(r&amp;#39;^(\d{3})-(\d{3,8})$&amp;#39;, &amp;#39;010-12345&amp;#39;) &amp;gt;&amp;gt;&amp;gt; m &amp;lt;_sre.SRE_Match object; span=(0, 9), match=&amp;#39;010-12345&amp;#39;&amp;gt; &amp;gt;&amp;gt;&amp;gt; m.group(0) &amp;#39;010-12345&amp;#39; &amp;gt;&amp;gt;&amp;gt; m.group(1) &amp;#39;010&amp;#39; &amp;gt;&amp;gt;&amp;gt; m.group(2) &amp;#39;12345&amp;#39; Compile a regular expression &amp;gt;&amp;gt;&amp;gt; re.</description>
    </item>
    <item>
      <title>How to Install HACS in Home Assistant</title>
      <link>https://blog.margrop.net/en/post/install-hacs-in-home-assistant/</link>
      <pubDate>Fri, 19 Feb 2021 10:53:04 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/install-hacs-in-home-assistant/</guid>
      <description>&lt;h1 id=&#34;if-using-a-virtual-machine-environment-home-assistant-os&#34;&gt;If Using a Virtual Machine Environment (Home Assistant OS)&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Go to the &lt;code&gt;Supervisor&lt;/code&gt; panel&lt;/li&gt;&#xA;&lt;li&gt;Install an SSH add-on (enable advanced mode in your user profile first)&lt;/li&gt;&#xA;&lt;li&gt;Configure the selected SSH add-on&lt;/li&gt;&#xA;&lt;li&gt;Start the SSH add-on&lt;/li&gt;&#xA;&lt;li&gt;Connect to the SSH add-on&lt;/li&gt;&#xA;&lt;li&gt;Run the HACS installation script&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -q -O - https://hacs.xyz/install | bash -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>CentOS 7.4 NFS Auto-Mount</title>
      <link>https://blog.margrop.net/en/post/centos-nfs-mount-autofs/</link>
      <pubDate>Wed, 17 Feb 2021 21:15:19 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-nfs-mount-autofs/</guid>
      <description>&lt;h1 id=&#34;on-demand-auto-mount&#34;&gt;On-Demand Auto-Mount&lt;/h1&gt;&#xA;&lt;p&gt;Automatically mount NFS shared directory &lt;code&gt;/home/share&lt;/code&gt; to local path &lt;code&gt;/mnt/share&lt;/code&gt; upon user login&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y autofs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vi /etc/auto.master&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/mnt /etc/auto.conf（这个配置文件本身就没有要自己创建）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vi /etc/auto.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;share  192.168.1.22:/etc/letsencrypt/live/margrop.net-0001/（nfs服务器上共享文件）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service autofs restart &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Deploy Your Own Bitwarden Password Management Server</title>
      <link>https://blog.margrop.net/en/post/deploy-open-source-password-manager-bitwarden/</link>
      <pubDate>Wed, 17 Feb 2021 20:20:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/deploy-open-source-password-manager-bitwarden/</guid>
      <description>&lt;p&gt;Many people are not comfortable storing their passwords online with services like LastPass. Even though the official claim is that passwords are encrypted and the server cannot see user passwords, some still feel uneasy. In that case, you can deploy the open-source Bitwarden to set up your own password management server.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Prerequisites: A VPS server and a domain name with the IP address already resolved to the server.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>[Repost] Method to Export TOTP Tokens from Authy</title>
      <link>https://blog.margrop.net/en/post/export-topt-token-from-authy/</link>
      <pubDate>Wed, 17 Feb 2021 19:53:14 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/export-topt-token-from-authy/</guid>
      <description>&lt;p&gt;Based on Ubuntu 18.04 (regular user), other Linux systems are similar.&#xA;Golang official website: &lt;a href=&#34;https://golang.org/&#34;&gt;https://golang.org/&lt;/a&gt;&#xA;Github repository: &lt;a href=&#34;https://github.com/alexzorin/authy&#34;&gt;https://github.com/alexzorin/authy&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;download-and-install-golang-mac-system-using-brew&#34;&gt;Download and Install Golang (Mac System, Using Brew)&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python 3 Built-in Module: HTMLParser</title>
      <link>https://blog.margrop.net/en/post/python3-htmlparser/</link>
      <pubDate>Mon, 15 Feb 2021 11:07:02 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-htmlparser/</guid>
      <description>&lt;h1 id=&#34;htmlparser&#34;&gt;HTMLParser&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Python3 common string operations</title>
      <link>https://blog.margrop.net/en/post/python-string-opeation/</link>
      <pubDate>Sun, 14 Feb 2021 22:33:22 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python-string-opeation/</guid>
      <description>&lt;h1 id=&#34;python-print&#34;&gt;python print&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No line breaks (add, end=&amp;rsquo;&amp;rsquo; at the end)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;print(string,end=&amp;#39;&amp;#39;) &#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Update the rule address of KoolProxyR, updated on February 12, 2021</title>
      <link>https://blog.margrop.net/en/post/update-koolproxyr-rule-sh/</link>
      <pubDate>Fri, 12 Feb 2021 19:43:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/update-koolproxyr-rule-sh/</guid>
      <description>The KoolProxyR rule URLs had not been updated for a long time, so many ads could no longer be filtered. I had to change the update URLs myself.&#xA;Edit the update script Modify the URLs Update the url_koolproxy field to: Update the url_yhosts field to: Update the url_easylist field to:&#xA;Reference&#xA;cd /koolshare/scripts vim KoolProxyR_rule_update.sh Modify the URL Change the url_koolproxy field to:&#xA;url_koolproxy=&amp;#34;http://bobohome.f3322.net:8880/files/KoolProxyRules/koolproxy.txt&amp;#34; Change the url_yhosts field to:&#xA;url_yhosts=&amp;#34;https://github.com/VeleSila/yhosts/blob/master/hosts&amp;#34; Change the url_easylist field to:</description>
    </item>
    <item>
      <title>Python3 basics</title>
      <link>https://blog.margrop.net/en/post/python3-basic-learning/</link>
      <pubDate>Fri, 12 Feb 2021 14:28:13 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-basic-learning/</guid>
      <description>Python3 tutorial Python download Python3 built-in functions Base Use indentation instead of {} The end of the statement is not required; list=[&amp;hellip;] method len()/append()/insert() tuple=() immutable list map={key:value,key:value&amp;hellip;} method key in map/get(key,defaultValue)/pop(key) set=set([&amp;hellip;]) method add(key)/remove(key) function Data type: int(v), float(v), str(v), bool(v) Empty statement: pass Immutable object: None Variable parameters: *args, receives 1 tuple Keyword parameter: **kw, receives 1 dict </description>
    </item>
    <item>
      <title>Latest Synology 6.17: How to Gain Root Access, Set Root Password and Enable SSH Passwordless Login</title>
      <link>https://blog.margrop.net/en/post/dsm-grant-root-permission-and-set-password-and-ssh-login/</link>
      <pubDate>Wed, 10 Feb 2021 20:40:26 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/dsm-grant-root-permission-and-set-password-and-ssh-login/</guid>
      <description>&lt;h1 id=&#34;1-enable-ssh-function&#34;&gt;1. Enable SSH Function&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In &lt;code&gt;控制面板&lt;/code&gt;-&amp;gt;&lt;code&gt;终端机和SNMP&lt;/code&gt;, enable the &lt;code&gt;SSH&lt;/code&gt; function&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2-log-in-to-synology-via-ssh-using-the-default-system-user&#34;&gt;2. Log in to Synology via SSH Using the Default System User&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;My default user is &lt;code&gt;admin&lt;/code&gt;, so I enter the following command. Modify &lt;code&gt;admin&lt;/code&gt; and &lt;code&gt;IP地址&lt;/code&gt; to match your own settings.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh admin@192.168.1.5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Kodi IPTV live source m3u8 collection - 2021 edition</title>
      <link>https://blog.margrop.net/en/post/kodi-iptv-m3u8-live-source-url/</link>
      <pubDate>Mon, 08 Feb 2021 10:08:34 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/kodi-iptv-m3u8-live-source-url/</guid>
      <description>Because of copyright restrictions, many live TV apps stutter during playback and the picture quality is often poor. Today, most broadband providers offer IPTV services, so you can watch TV in high definition without lag and without installing cable TV. If you have not activated IPTV, you can still use live source URLs shared by other users and copy them to your computer, TV box, or other devices. If you are comfortable with packet capture, you can also collect the live source URLs yourself.</description>
    </item>
    <item>
      <title>Swagger-UI adds project dependencies and modifies index.html</title>
      <link>https://blog.margrop.net/en/post/swagger-ui-add-md5/</link>
      <pubDate>Sat, 06 Feb 2021 09:13:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/swagger-ui-add-md5/</guid>
      <description>swagger-bundle packaging First enter the swagger-ui directory&#xA;npm install npm run build How to modify The url in index.html is modified to:&#xA;and add functions&#xA;url: &amp;#34;/v2/api-docs?group=&amp;#34; + getUrlParam(&amp;#34;group&amp;#34;), function getUrlParam(name) { var reg = new RegExp(&amp;#34;(^|&amp;amp;)&amp;#34; + name + &amp;#34;=([^&amp;amp;]*)(&amp;amp;|$)&amp;#34;); //构造一个含有目标参数的正则表达式对象 var r = window.location.search.substr(1).match(reg); //匹配目标参数 if (r != null) return unescape(r[2]); return &amp;#34;&amp;#34;; //返回参数值 } </description>
    </item>
    <item>
      <title>How to add MD5 verification and project dependencies in Swagger-JS</title>
      <link>https://blog.margrop.net/en/post/swagger-js-add-md5/</link>
      <pubDate>Sat, 06 Feb 2021 09:05:25 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/swagger-js-add-md5/</guid>
      <description>swagger-bundle packaging First enter the swagger-js directory&#xA;npm install npm run build How to modify Add code to the src/execute.js file:&#xA;Add code before the export function buildRequest({ method class mergeInQueryOrForm(req) statement:&#xA;package.json needs to add support for cross-platform compilation&#xA;import md5 from &amp;#39;md5&amp;#39;; //calcSn for server var req = request console.log(req.body); if (req.body) { let bodyObj = JSON.parse(req.body); bodyObj[&amp;#39;header&amp;#39;][&amp;#39;token&amp;#39;] = req[&amp;#39;headers&amp;#39;][&amp;#39;token&amp;#39;]; bodyObj[&amp;#39;header&amp;#39;][&amp;#39;snTime&amp;#39;] = (new Date()).valueOf(); let allData = Object.assign(JSON.parse(JSON.stringify(bodyObj[&amp;#39;body&amp;#39;])), { token: bodyObj[&amp;#39;header&amp;#39;][&amp;#39;token&amp;#39;], snTime: bodyObj[&amp;#39;header&amp;#39;][&amp;#39;snTime&amp;#39;] }); bodyObj[&amp;#39;header&amp;#39;][&amp;#39;sn&amp;#39;] = calcSn(allData); req.</description>
    </item>
    <item>
      <title>How to Install Jike AC Virtual Machine in Proxmox VE Environment?</title>
      <link>https://blog.margrop.net/en/post/how-to-install-jika-ac-in-pve/</link>
      <pubDate>Wed, 03 Feb 2021 16:18:33 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-jika-ac-in-pve/</guid>
      <description>&lt;p&gt;According to &lt;a href=&#34;https://www.right.com.cn/forum/thread-1501038-1-1.html&#34;&gt;恩山的集客AC AP扫盲贴&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Q: Can I skip &lt;code&gt;AC&lt;/code&gt; and have two &lt;code&gt;AP&lt;/code&gt; connect directly to the main router for roaming?&#xA;A: Yes, but roaming works better with &lt;code&gt;AC&lt;/code&gt; than without it. With &lt;code&gt;ac&lt;/code&gt; present, roaming performance won&amp;rsquo;t disappoint. Jike&amp;rsquo;s roaming is not a simple weak-signal kick. With &lt;code&gt;ac&lt;/code&gt; in place, excellent roaming effects are achieved regardless of whether Jike &lt;code&gt;ap&lt;/code&gt; supports &lt;code&gt;kvr&lt;/code&gt;, because &lt;code&gt;ac+ap&lt;/code&gt; is proactive roaming, which does not rely on &lt;code&gt;kvr&lt;/code&gt; protocol and has very low requirements on clients. Micro &lt;code&gt;ac&lt;/code&gt; only handles configuration distribution and cannot perform proactive roaming; roaming effectiveness depends on the client.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Let&#39;s Encrypt automatically synchronizes Proxmox VE and DSM certificates after automatic renewal</title>
      <link>https://blog.margrop.net/en/post/lets-encrypt-sync-https-cert-to-pve-and-dsm/</link>
      <pubDate>Tue, 02 Feb 2021 19:19:38 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/lets-encrypt-sync-https-cert-to-pve-and-dsm/</guid>
      <description>Last time we talked about Let&amp;rsquo;s Encrypt通过DNS TXT记录来验证域名有效性, and the last part of the article was about how to use certbot renew for automatic renewal. Then the automatic renewal is successful, how to synchronize it to PVE and DSM?&#xA;Below we use a script to perform automatic synchronization.&#xA;Need to configure SSH password-free login on Proxmox VE and DSM servers Automatically synchronize Proxmox VE certificate Proxmox VE synchronized to this machine Proxmox VE synchronized to LAN cp /etc/letsencrypt/live/blog.</description>
    </item>
    <item>
      <title>How to Import a Third-Party VM Image into Proxmox VE</title>
      <link>https://blog.margrop.net/en/post/pve-kvm-import-vm-format-qcow2/</link>
      <pubDate>Mon, 01 Feb 2021 15:12:47 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-kvm-import-vm-format-qcow2/</guid>
      <description>&lt;p&gt;In the example below, the &lt;code&gt;VM ID&lt;/code&gt; is always &lt;code&gt;100&lt;/code&gt;; change it as needed.&lt;/p&gt;&#xA;&lt;h1 id=&#34;file-format-conversion&#34;&gt;File Format Conversion&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use &lt;code&gt;qemu-img&lt;/code&gt; to convert virtual disk files in other formats to &lt;code&gt;qcow2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;For example, the following converts &lt;code&gt;vmdk&lt;/code&gt; to &lt;code&gt;qcow2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>How to Install Node-RED with NPM</title>
      <link>https://blog.margrop.net/en/post/how-to-install-nodered-with-npm/</link>
      <pubDate>Mon, 01 Feb 2021 09:57:07 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-nodered-with-npm/</guid>
      <description>&lt;h1 id=&#34;what-is-node-red&#34;&gt;What Is &lt;code&gt;Node-RED&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;Node-RED&lt;/code&gt; is a low-code/no-code programming tool for connecting &lt;code&gt;hardware devices&lt;/code&gt;, &lt;code&gt;APIs&lt;/code&gt;, and &lt;code&gt;online services&lt;/code&gt; in a novel and interesting way. It is especially suitable for &lt;code&gt;smart home&lt;/code&gt; scenarios.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Node-RED&lt;/code&gt; provides a browser-based flow editor, making it easy to connect various nodes in the panel. You can then deploy the flow to runtime with a single click.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Build an Open Source Web Flowchart Tool Diagrams.net (formerly draw.io)</title>
      <link>https://blog.margrop.net/en/post/how-to-install-docker-drawio/</link>
      <pubDate>Sat, 30 Jan 2021 17:59:08 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-docker-drawio/</guid>
      <description>&lt;p&gt;&lt;code&gt;ProcessOn&lt;/code&gt; are now well-known web &lt;code&gt;流程图&lt;/code&gt;, &lt;code&gt;UML&lt;/code&gt; drawing tools. However, &lt;code&gt;ProcessOn&lt;/code&gt; is a paid service with too many free-tier restrictions. So, is there a free option available?&lt;/p&gt;&#xA;&lt;p&gt;Yes, it&amp;rsquo;s &lt;code&gt;Diagrams.net&lt;/code&gt;. &lt;strong&gt;Completely free with powerful features~&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Configure a Freshly Installed Ubuntu 20.04 Server VM on PVE</title>
      <link>https://blog.margrop.net/en/post/pve-how-to-config-brand-new-ubuntu-20.04-vm/</link>
      <pubDate>Sat, 30 Jan 2021 15:33:44 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-how-to-config-brand-new-ubuntu-20.04-vm/</guid>
      <description>&lt;h1 id=&#34;download-the-installation-iso&#34;&gt;Download the Installation ISO&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://mirrors.aliyun.com/ubuntu-releases/focal/ubuntu-20.04.2-live-server-amd64.iso&#34;&gt;Aliyun Ubuntu 20.04 live server download&lt;/a&gt;&#xA;&lt;a href=&#34;https://mirrors.aliyun.com/ubuntu-releases/bionic/ubuntu-18.04.5-live-server-amd64.iso&#34;&gt;Aliyun Ubuntu 18.04 live server download&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Map JSON Objects Using Generic Hibernate Types</title>
      <link>https://blog.margrop.net/en/post/how-to-map-json-collections-using-jpa-and-hibernate/</link>
      <pubDate>Fri, 29 Jan 2021 16:06:09 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-map-json-collections-using-jpa-and-hibernate/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;In this article, we&amp;rsquo;ll see how to map JSON columns to JPA entity attributes using the &lt;a href=&#34;http://www.google.com/&#34; title=&#34;Hibernate Types&#34;&gt;Hibernate Types&lt;/a&gt; open-source project.&lt;/p&gt;&#xA;&lt;p&gt;While you can create your own custom Hibernate type to map JSON column types on Oracle, SQL Server, PostgreSQL, or MySQL, you don&amp;rsquo;t need to implement your own Hibernate Type since the Hibernate Types project already provides this functionality.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading or Fresh Installing MariaDB 10.5 on CentOS 7 Using Aliyun Mirror</title>
      <link>https://blog.margrop.net/en/post/centos-7-upgrade-or-install-mariadb-10.x-aliyun-mirror/</link>
      <pubDate>Fri, 29 Jan 2021 15:42:20 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-7-upgrade-or-install-mariadb-10.x-aliyun-mirror/</guid>
      <description>&lt;h1 id=&#34;update-the-system-first&#34;&gt;Update the System First&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;edit-the-yum-configuration-file-using-aliyun-mirror&#34;&gt;Edit the yum Configuration File Using Aliyun Mirror&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Here MariaDB 10.5 is used as an example&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/yum.repos.d/MariaDB10.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#http://downloads.mariadb.org/mariadb/repositories/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;mariadb&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; MariaDB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;baseurl &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; https://mirrors.aliyun.com/mariadb/yum/10.5/centos7-amd64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gpgkey &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gpgcheck &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>How to run N2N using Windows-Run</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-windows-edge/</link>
      <pubDate>Fri, 29 Jan 2021 13:43:19 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-windows-edge/</guid>
      <description>Here I only talk about how to run the N2N client edge. In fact, it is easier to run the supernode, so I won’t repeat it here.&#xA;Download and unzip N2N Contains edge, supernode, openssl链接库 (necessary for n2n operation), tap-windows安装包 (necessary for n2n operation, Win7&amp;amp;Win10)&#xA;Install Tap-Windows Depending on your platform, select the installation file of Win10 or Win7 and use 一路回车法 to install it. Trial run edge service The following takes the decompression path as D:\TOOLS\ as an example.</description>
    </item>
    <item>
      <title>Installing Docker on CentOS 7 and Configuring Aliyun Mirror Source</title>
      <link>https://blog.margrop.net/en/post/centos-7-install-docker-ce-and-update-source/</link>
      <pubDate>Fri, 29 Jan 2021 11:40:18 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-7-install-docker-ce-and-update-source/</guid>
      <description>&lt;h1 id=&#34;docker-version&#34;&gt;Docker Version&lt;/h1&gt;&#xA;&lt;p&gt;Since Docker version 1.13, Docker has adopted a timeline-based versioning approach, dividing releases into Community Edition (CE) and Enterprise Edition (EE). Docker CE is the free community edition, while Docker EE is the paid enterprise version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Install a Certificate on iOS for HTTPS Packet Capture</title>
      <link>https://blog.margrop.net/en/post/ios-client-install-pem-for-https-packet-capture/</link>
      <pubDate>Thu, 28 Jan 2021 15:33:23 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ios-client-install-pem-for-https-packet-capture/</guid>
      <description>&lt;h1 id=&#34;download-the-certificate-on-ios&#34;&gt;Download the Certificate on iOS&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Export the PEM certificate from Charles and place it on any web server&lt;/li&gt;&#xA;&lt;li&gt;The PEM certificate I use below is only an example. Do not install it.&#xA;&lt;img src=&#34;https://blog.margrop.net/post-images/https_charles_1.png&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Installing the Latest Version of Node and NPM on CentOS 7</title>
      <link>https://blog.margrop.net/en/post/centos-7-install-node-and-npm-latest/</link>
      <pubDate>Wed, 27 Jan 2021 11:28:59 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-7-install-node-and-npm-latest/</guid>
      <description>&lt;h1 id=&#34;downloading-node&#34;&gt;Downloading Node:&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The download uses the Aliyun mirror&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/nodejs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/nodejs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://npm.taobao.org/mirrors/node/latest-v15.x/node-v15.7.0-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xvzf node-v15.7.0-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Bypassing the Firewall or Setting Up a Server Farm: V2Ray Configuration with WebSocket &#43; TLS &#43; Web &#43; CDN</title>
      <link>https://blog.margrop.net/en/post/fuckgfw-v2ray-websocket-tls-web-cdn/</link>
      <pubDate>Tue, 26 Jan 2021 13:44:36 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/fuckgfw-v2ray-websocket-tls-web-cdn/</guid>
      <description>&lt;p&gt;&lt;code&gt;v2ray&lt;/code&gt; The most secure configuration currently is &lt;code&gt;WebSocket + TLS + Web + CDN&lt;/code&gt;. It uses port &lt;code&gt;443&lt;/code&gt;: direct access shows a website, but after connecting with a client it becomes a proxy tool. From the outside it looks like an electric shaver, but it is actually a hair dryer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>China Telecom, How to Contact Customer Service to Apply for a Public IP</title>
      <link>https://blog.margrop.net/en/post/china-telecom-how-to-apply-a-public-ip-address/</link>
      <pubDate>Mon, 25 Jan 2021 22:12:32 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/china-telecom-how-to-apply-a-public-ip-address/</guid>
      <description>&lt;p&gt;Currently, among the three major carriers in China, China Telecom has the most abundant &lt;code&gt;公网IP&lt;/code&gt;.&#xA;However, as global &lt;code&gt;IPv4&lt;/code&gt; resources have been completely exhausted, even the wealthy families are running out of grain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recommendations and downloads of commonly used Windows software, no recommendations</title>
      <link>https://blog.margrop.net/en/post/windows-software-recommend-and-download/</link>
      <pubDate>Sun, 24 Jan 2021 22:22:47 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-software-recommend-and-download/</guid>
      <description>Here we recommend some software commonly used in the Windows environment of this site. There are no recommendations. If you don’t like it, please close the page.&#xA;This software is equivalent to Windows version 应用市场, but does not include any bundled software. *Tencent officially closed the download of this independent version of the software N years ago (N&amp;gt;3). For the application market, it is obviously not cost-effective to install an additional Tencent Computer Manager.</description>
    </item>
    <item>
      <title>Python3 web environment, including third-party and self-built</title>
      <link>https://blog.margrop.net/en/post/python3-web-runtime-environment/</link>
      <pubDate>Sun, 24 Jan 2021 13:07:30 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-web-runtime-environment/</guid>
      <description>I needed to use the Python3 Web environment because of some family matters, so I collected them. The environment of the third-party website is very simple to use, but the shortcomings are also obvious. The last Python code cannot be saved.&#xA;Python3 environment provided by third-party websites So I built an environment myself, and after struggling for a long time, I finally used Docker to build it, and it was done in just a few lines of code.</description>
    </item>
    <item>
      <title>Installing Frp Client on CentOS with SSH Access</title>
      <link>https://blog.margrop.net/en/post/centos-install-frp-client-for-ssh/</link>
      <pubDate>Sat, 23 Jan 2021 17:22:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/centos-install-frp-client-for-ssh/</guid>
      <description>&lt;h1 id=&#34;download-and-extract-frp&#34;&gt;Download and Extract Frp&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Latest Frp download address: &lt;a href=&#34;https://github.com/fatedier/frp/releases/&#34;&gt;https://github.com/fatedier/frp/releases/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/frp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/frp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xvzf frp_0.35.0_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Ubuntu installs Frp server, non-client</title>
      <link>https://blog.margrop.net/en/post/ubuntu-install-frp-server/</link>
      <pubDate>Sat, 23 Jan 2021 13:43:20 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-install-frp-server/</guid>
      <description>Download and extract FRP Latest FRP release: https://github.com/fatedier/frp/releases/ cd ~ mkdir frp cd frp wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_amd64.tar.gz tar -xvzf frp_0.35.0_linux_amd64.tar.gz cd frp_0.35.0_linux_amd64 Configure FRP Remove the default client configuration file&#xA;Create the server configuration file&#xA;cd ~/frp/frp_0.35.0_linux_amd64/ rm frpc rm frpc.ini rm frpc_full.ini ls -a sudo su rm frps.ini cat&amp;gt;/etc/frps.ini&amp;lt;&amp;lt;EOF [common] # FRP server bind port bind_port = 1000 # Set the HTTP access port to 1001 vhost_http_port = 1001 # Set the domain name (make sure it is reachable) subdomain_host = frp.</description>
    </item>
    <item>
      <title>Enable Intel GVT-g Graphics Virtualization on Proxmox VE</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-graphics-card-enable-intel-gvt-g/</link>
      <pubDate>Sat, 23 Jan 2021 11:23:04 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-graphics-card-enable-intel-gvt-g/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Note: Intel GVT-g is currently only supported by fifth, sixth, and seventh generation Intel Core processors and Xeon E3 v4/v5/v6 processors on PVE.&#xA;My tests show that 8th generation and newer CPUs are not supported for now -_-!&#xA;If this changes, feel free to contact me.&#xA;Reference: &lt;a href=&#34;https://pve.proxmox.com/wiki/PCI(e)_Passthrough&#34;&gt;https://pve.proxmox.com/wiki/PCI(e)_Passthrough&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Proxmox VE commonly used local paths, and how to modify hosts, host name, IP address and DNS configuration</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-url-and-modify-hosts-ip-dns/</link>
      <pubDate>Fri, 22 Jan 2021 17:02:01 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-url-and-modify-hosts-ip-dns/</guid>
      <description>PVE local ISO file directory: /var/lib/vz/template/iso PVE local OVZ file directory: /var/lib/vz/template/cache&#xA;Modify hosts file Effective after restart vi /etc/hosts Modify hostname Effective after restart vi /etc/hostname Modify IP address and DNS configuration Effective after restart Reference DNS configuration vi /etc/network/interfaces dns-nameservers 114.114.114.114,223.5.5.5 </description>
    </item>
    <item>
      <title>Initialization script after Proxmox VE installation</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-init-bash-script/</link>
      <pubDate>Fri, 22 Jan 2021 16:42:46 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-init-bash-script/</guid>
      <description>&lt;p&gt;In order to facilitate the installation of PVE, I compiled the relevant commands myself. Please modify them according to your own environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ProxmoxVE 6.3 uses commands to back up Synology virtual machines</title>
      <link>https://blog.margrop.net/en/post/proxmoxve-use-bash-to-backup-dsm-vm/</link>
      <pubDate>Thu, 21 Jan 2021 18:16:22 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmoxve-use-bash-to-backup-dsm-vm/</guid>
      <description>Since the Synology virtual machine in my ProxmoxVE runs on a LUN passthrough disk, I cannot click backup directly in the Web interface.&#xA;DSM virtual machine backup process: Stop the virtual machine -&amp;gt; Unmount the hard disk -&amp;gt; Back up the virtual machine -&amp;gt; Mount the hard disk -&amp;gt; Start the virtual machine It is really troublesome and error-prone to do this entirely through the Web interface. So I studied the command-line workflow.</description>
    </item>
    <item>
      <title>Does Synology DSM Support QEMU Guest Agent?</title>
      <link>https://blog.margrop.net/en/post/is-dsm-supported-qemu-agent/</link>
      <pubDate>Wed, 20 Jan 2021 13:19:28 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/is-dsm-supported-qemu-agent/</guid>
      <description>&lt;p&gt;Install the &lt;code&gt;Power Button Package&lt;/code&gt; in Synology DSM and disable the &lt;code&gt;qemu&lt;/code&gt; agent option in &lt;code&gt;PVE&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;where-to-download-the-power-button-package&#34;&gt;Where to Download the Power Button Package&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Note that &lt;code&gt;DSM 6.1&lt;/code&gt; and &lt;code&gt;DSM 6.2&lt;/code&gt; use different &lt;code&gt;spk&lt;/code&gt; packages&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>img2KVM, Convert IMG Format to KVM Format, Install DSM Synology Virtual Machine</title>
      <link>https://blog.margrop.net/en/post/img2kvm-convert-img-format-file-to-kvm/</link>
      <pubDate>Wed, 20 Jan 2021 08:32:25 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/img2kvm-convert-img-format-file-to-kvm/</guid>
      <description>&lt;h1 id=&#34;install-img2kvm&#34;&gt;Install img2kvm&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -c https://download.margrop.net/d/oneindex/network/PVE/img2kvm -O img2kvm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x img2kvm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>【Transfer】The latest method of half-washing Synology</title>
      <link>https://blog.margrop.net/en/post/synology-half-crack-way-docker-ddsm/</link>
      <pubDate>Tue, 19 Jan 2021 18:10:53 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-half-crack-way-docker-ddsm/</guid>
      <description>I recently built a new NAS. After installing it, I found that the semi-whitewashing solution provided before no longer worked. Previous Posthttp://blog.lixx.vip/黑群晖（synology）nas-6-22-折腾记-半洗白/ Mainly because Synology’s new version of Docker 18.09.0-0506 has closed the installation of DDSM&#xA;Download old version of Docker *Old version of Docker download address (Docker-x64-17.05.0-0401.spk):&#xA;DDSM’s PAT download address (DSM_VirtualDSM_15284.pat): It can also be downloaded at 我的网盘&#xA;You need to uninstall the newly installed Docker in the package center, and then install the downloaded old version</description>
    </item>
    <item>
      <title>Let&#39;s Encrypt verifies domain name validity through DNS TXT records</title>
      <link>https://blog.margrop.net/en/post/lets-encrypt-use-dns-txt-acme-challenge-domain-available/</link>
      <pubDate>Tue, 19 Jan 2021 10:39:58 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/lets-encrypt-use-dns-txt-acme-challenge-domain-available/</guid>
      <description>When we use letsencrypt to obtain the free HTTPS certificate, letsencrypt needs to verify the domain name. By default it authenticates like this:&#xA;The certbot program places a file in the root directory of the web directory. The server of letsencrypt accesses this file through the domain name to verify that the domain name you applied for belongs to you. But sometimes we want to set HTTPS for a certain host on the intranet.</description>
    </item>
    <item>
      <title>Activate Windows 10 with KMS, Including Third-Party and Self-Hosted Services</title>
      <link>https://blog.margrop.net/en/post/kms-activate-win10-slmgr/</link>
      <pubDate>Mon, 18 Jan 2021 22:12:43 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/kms-activate-win10-slmgr/</guid>
      <description>&lt;h1 id=&#34;third-party-service-activation&#34;&gt;Third-Party Service Activation&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use &lt;code&gt;Administrator&lt;/code&gt; privileges and run two commands:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;slmgr /skms kms.03k.org&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;slmgr /ato&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Solution to NumberFormatException when using SpringFox 3.0.0 version</title>
      <link>https://blog.margrop.net/en/post/java-springfox-number-format-exception/</link>
      <pubDate>Mon, 18 Jan 2021 16:39:34 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/java-springfox-number-format-exception/</guid>
      <description>I recently upgraded SpringFox to version 3.0.0, and a bunch of exceptions occurred when accessing the interface documentation.&#xA;The detailed exception stack is as follows&#xA;2021-01-18 16:25:35.824 WARN 62082 --- [ XNIO-2 task-1] i.s.m.p.AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer java.lang.NumberFormatException: For input string: &amp;#34;&amp;#34; at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Long.parseLong(Long.java:702) at java.base/java.lang.Long.valueOf(Long.java:1144) at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) at jdk.internal.reflect.GeneratedMethodAccessor220.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:689) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) at com.</description>
    </item>
    <item>
      <title>Install Frp client on Mac and use remote desktop</title>
      <link>https://blog.margrop.net/en/post/mac-frpc-install-for-remote-desktop-problem/</link>
      <pubDate>Mon, 18 Jan 2021 13:28:26 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/mac-frpc-install-for-remote-desktop-problem/</guid>
      <description>You can install it with Homebrew.&#xA;The following section shows the old manual extraction method. Keep reading if you want that approach.&#xA;brew install frpc vi /usr/local/etc/frp/frpc.ini brew services start frpc Download the Darwin package from FRP releases and unzip it omitted Copy the executable sudo mv ~/Downloads/frp_0.34.3_darwin_amd64/frpc /usr/local/bin/ Add the frpc configuration file Adjust server_addr, server_port, and remote_port as needed. Edit the auto-start configuration Commands related to auto-start sudo su cat&amp;gt;/etc/frpc.</description>
    </item>
    <item>
      <title>Install Frp client on Windows and use remote desktop</title>
      <link>https://blog.margrop.net/en/post/windows-frpc-install-for-remote-desktop/</link>
      <pubDate>Sun, 17 Jan 2021 19:36:38 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-frpc-install-for-remote-desktop/</guid>
      <description>As the usage restrictions of TeamViewer become more and more strict, it will be regarded as an enterprise user from time to time. After all, there is no free lunch in the world. The following is a method to use the Frp client for intranet penetration and remote control.&#xA;Please prepare your own Frp server and consider the security risks of exposing port 3389 to the public network.&#xA;Download Frp client #Configure Frp client</description>
    </item>
    <item>
      <title>Solution to PVE upgrade failure due to insufficient boot space</title>
      <link>https://blog.margrop.net/en/post/pve-boot-space-not-enough-fail-upgrade/</link>
      <pubDate>Sun, 17 Jan 2021 19:25:59 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-boot-space-not-enough-fail-upgrade/</guid>
      <description>During the default installation, the space allocated by proxmox to /boot is less than 300M. The iteration of proxmox is very fast, and /boot can easily be filled up. If you are not careful, the upgrade will fail. The only way is to manually delete the old kernel.&#xA;Delete old kernel proxmox is based on debian. Every time you use apt update &amp;amp;&amp;amp; apt dist-upgrade, debian&amp;rsquo;s linux-image and pve-kernel will be automatically installed.</description>
    </item>
    <item>
      <title>Common Git Commands</title>
      <link>https://blog.margrop.net/en/post/git-normal-commands/</link>
      <pubDate>Sun, 17 Jan 2021 12:59:53 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/git-normal-commands/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;git reflog&lt;/code&gt; Display recent Git operation records&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git reflog head@{0}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Proxy Only for GitHub git clone</title>
      <link>https://blog.margrop.net/en/post/github-git-clone-speed-up/</link>
      <pubDate>Sun, 17 Jan 2021 12:53:12 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/github-git-clone-speed-up/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global http.https://github.com.proxy socks5://127.0.0.1:1080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global https.https://github.com.proxy socks5://127.0.0.1:1080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>How to Run N2N on CentOS 7 — Edge Edition</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-centos-edge/</link>
      <pubDate>Sat, 16 Jan 2021 14:00:18 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-centos-edge/</guid>
      <description>&lt;p&gt;&lt;code&gt;边缘节点（node）&lt;/code&gt;：The node that will become part of the virtual network.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] Solve the problem that the Gridea client cannot be opened/opens very slowly and cannot be synchronized</title>
      <link>https://blog.margrop.net/en/post/slove-gridea-run-too-slow-problom/</link>
      <pubDate>Fri, 15 Jan 2021 16:48:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/slove-gridea-run-too-slow-problom/</guid>
      <description>Recently, the Gridea client has been very slow to open, and synchronization often fails.&#xA;In the upper left corner, edit&amp;ndash;&amp;gt;Developer Tools&amp;ndash;&amp;gt;console, you can see that widget.js cannot be loaded. This is because cdn.headwayapp.co is blocked, so you need to use magic or put widget.js on other CDNs.&#xA;If you switch to another CDN, you need to modify the client&#xA;Edit index.html&#xA;search Below is mine&#xA;\Gridea\resources\app\index.html https://cdn.headwayapp.co/widget.js https://cdn.jsdelivr.net/gh/XYZ1024-alt/CDN/widget.js </description>
    </item>
    <item>
      <title>Customize LEDE router KoolProxyR blocking advertising rules, 20200705</title>
      <link>https://blog.margrop.net/en/post/lede-router-koolproxyr-adblock-rules/</link>
      <pubDate>Fri, 15 Jan 2021 15:05:48 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/lede-router-koolproxyr-adblock-rules/</guid>
      <description>How to install KoolProxyR Refer to KoolProxyR项目官网 Execute the following code in SSH to implement online installation. (please copy all)&#xA;wget -4 -O /tmp/KoolProxyR_install.sh https://shaoxia1991.coding.net/p/koolproxyr/d/koolproxyr/git/raw/master/KoolProxyR_install.sh &amp;amp;&amp;amp; chmod 777 /tmp/KoolProxyR_install.sh &amp;amp;&amp;amp; sh /tmp/KoolProxyR_install.sh Ad blocking rules The following are the router ad blocking rules I use Used in custom rules based on soft routing LEDE, KoolProxyR.&#xA;! https://gist.github.com/itspig/e22bd240cff35fbb4b29fafd2539de27 api.ad.xiaomi.com sdkconfig.ad.xiaomi.com ad.mi.com ad.xiaomi.com ad1.xiaomi.com adv.sec.miui.com test.ad.xiaomi.com new.api.ad.xiaomi.com cdn.ad.xiaomi.com e.ad.xiaomi.com test.new.api.ad.xiaomi.com ssp.ad.xiaomi.com o2o.api.xiaomi.com !</description>
    </item>
    <item>
      <title>How to run N2N-compilation using Windows</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-windows-compile/</link>
      <pubDate>Fri, 15 Jan 2021 14:26:49 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-windows-compile/</guid>
      <description>According to Building说明 of N2N官方网站, the software required for Windows compilation is Visual Studio,Cmake,OpenSSL。&#xA;I got a headache when I saw Visual Studio. This software is very difficult to install. So I chose cross-compilation, that is, using the Linux environment to compile Windows exe and dll files.&#xA;#Compiled files&#xA;Compilation environment:&#xA;Contains edge, supernode, openssl链接库 (necessary for n2n operation), tap-windows安装包 (necessary for n2n operation, Win7&amp;amp;Win10)&#xA;Prepare the compilation environment Use yum to install necessary software, the following is the author&amp;rsquo;s reference document wget https://download.</description>
    </item>
    <item>
      <title>How to Run N2N on Synology (DSM) - Compilation Guide</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-dsm/</link>
      <pubDate>Fri, 15 Jan 2021 13:18:07 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-dsm/</guid>
      <description>&lt;p&gt;Synology (abbreviated as &lt;code&gt;DSM&lt;/code&gt; below) is currently the most famous &lt;code&gt;NAS&lt;/code&gt; system, bar none.&#xA;How to run &lt;code&gt;N2N&lt;/code&gt; directly on &lt;code&gt;DSM&lt;/code&gt;? Of course, cross-compilation is needed again 😂.&#xA;The following cross-compilation operations require a basic understanding of &lt;code&gt;Linux&lt;/code&gt; and proficiency in &lt;code&gt;vim&lt;/code&gt; operations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use CentOS 7 to run N2N—supernode</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-centos-supernode/</link>
      <pubDate>Fri, 15 Jan 2021 09:15:03 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-centos-supernode/</guid>
      <description>超级节点（supernode）: It allows edge nodes to announce and discover other nodes. It must have a port that is publicly accessible on the Internet.&#xA;First review the basic elements of n2n n2n is a lightweight VPN software that makes it easy to create virtual networks that bypass intervening firewalls. In order to start using n2n, two elements are required:&#xA;一个超级节点（supernode）: It allows edge nodes to announce and discover other nodes. It must have a port that is publicly accessible on the Internet.</description>
    </item>
    <item>
      <title>Jike AP and AC Firmware Download Links</title>
      <link>https://blog.margrop.net/en/post/jike-ac-ap-download-url/</link>
      <pubDate>Thu, 14 Jan 2021 21:28:52 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/jike-ac-ap-download-url/</guid>
      <description>&lt;h1 id=&#34;common-download-links&#34;&gt;Common Download Links&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;AP230EP&lt;/code&gt;:&#xA;&lt;code&gt;AP245P&lt;/code&gt;:&#xA;&lt;code&gt;AP246ND&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Links, Software, Mirrors, and Useful Chrome Extensions</title>
      <link>https://blog.margrop.net/en/post/favorites/</link>
      <pubDate>Thu, 14 Jan 2021 21:05:24 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/favorites/</guid>
      <description>Common Windows software downloads https://download.margrop.net/d/oneindex/EXE/&#xA;A very effective Microsoft activation script https://massgrave.dev/&#xA;# Run the following command in an elevated PowerShell session irm https://massgrave.dev/get | iex Common Android software downloads https://download.margrop.net/d/oneindex/APK/&#xA;Convert Google Play links into direct APK downloads https://apkcombo.com/apk-downloader/&#xA;Markdown learning https://xianbai.me/learn-md/index.html&#xA;String and regex tools https://regex101.com/ http://www.renrensousuo.com/quchuchongfu/ https://www.bejson.com/&#xA;Proxmox VE, an open source virtualization platform https://www.proxmox.com/en/downloads/category/iso-images-pve&#xA;Bitwarden, an open source cross-platform password manager with Docker support https://bitwarden.com/&#xA;Online diagram tools https://draw.</description>
    </item>
    <item>
      <title>[Transfer] Spring AOP intercepts classes or methods with specified annotation identifiers</title>
      <link>https://blog.margrop.net/en/post/spring-aop-annotation-and-within/</link>
      <pubDate>Thu, 14 Jan 2021 15:29:41 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/spring-aop-annotation-and-within/</guid>
      <description>Instructions for scanning specific annotations in AOP: (1) @annotation: intercepts all methods annotated with the target annotation. (2) @within: intercepts all classes annotated with the target annotation. (3) within: limits the package scope to scan.&#xA;Code Demo @Aspect @Component @Order(10) public class BidAuthorityProxy { /** * Scan classes under the specified package that are annotated with `@EnableRoleAuthority`. */ @Around(&amp;#34;@within(com.core.annotation.EnableRoleAuthority) &amp;amp;&amp;amp; within(com.bid..*)&amp;#34;) public Object verifyRoleExecuteCommand(ProceedingJoinPoint pjp) throws Throwable { // Get the intercepted method MethodSignature msig = (MethodSignature) pjp.</description>
    </item>
    <item>
      <title>How to Run N2N on CentOS 7 — Compilation Guide</title>
      <link>https://blog.margrop.net/en/post/how-to-use-n2n-centos-compile/</link>
      <pubDate>Thu, 14 Jan 2021 14:26:49 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-use-n2n-centos-compile/</guid>
      <description>&lt;p&gt;If you are interested in the complete compilation process, you can browse at your leisure. Of course, you can also directly download the pre-compiled files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://blog.margrop.net/en/post/about/</link>
      <pubDate>Wed, 13 Jan 2021 17:34:15 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/about/</guid>
      <description>Margrop Blog AI Infrastructure Engineer This site documents my long-term work across AI agents, cloud platforms, self-hosting, and engineering practice.&#xA;I care about whether a system can actually run, remain stable, and be diagnosed and repaired when it fails. The posts here therefore come from real deployments, migrations, incidents, automation work, and postmortems—not only from polished tutorials.&#xA;What I work on AI Agent: coding agents, MCP, shared memory, model gateways, and agent workflows Self-hosting: Docker, NAS, Proxmox VE, homelab systems, and networking Engineering: Linux, Java, Go, databases, performance, observability, and incidents Cloud Platform: deployment, automation, permissions, token management, and production practice These areas are connected.</description>
    </item>
    <item>
      <title>What is N2N?</title>
      <link>https://blog.margrop.net/en/post/what-is-n2n/</link>
      <pubDate>Wed, 13 Jan 2021 16:27:39 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/what-is-n2n/</guid>
      <description>N2N is an open source P2P encryption networking tool&#xA;The open source project address is: https://github.com/ntop/n2n&#xA;The latest version is 2.8-stable&#xA;The following introduction comes from the official website&#xA;n2n is a lightweight VPN software that makes it easy to create virtual networks that bypass intervening firewalls. In order to start using n2n, two elements are required:&#xA;一个超级节点（supernode）: It allows edge nodes to announce and discover other nodes. It must have a port that is publicly accessible on the Internet.</description>
    </item>
    <item>
      <title>Why use Github Page?</title>
      <link>https://blog.margrop.net/en/post/why-github-page/</link>
      <pubDate>Wed, 13 Jan 2021 13:24:27 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/why-github-page/</guid>
      <description>That was more than ten years ago. I used 163Blog more than ten years ago. Because the blog reposted several articles about building airports and airplanes, 163Blog was permanently banned.&#xA;All the articles on 163Blog were instantly wiped out, and I was also hit hard. It is true that once bitten by a snake, I will be afraid of well ropes for ten years.&#xA;Later, I used 有道云笔记 to accumulate technology, but 有道云笔记 was too closed.</description>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://blog.margrop.net/en/post/hello-world/</link>
      <pubDate>Wed, 13 Jan 2021 11:00:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/hello-world/</guid>
      <description>&lt;p&gt;After various preparations in terms of ideas and environment, my personal blog has finally officially opened for business.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello Gridea</title>
      <link>https://blog.margrop.net/en/post/hello-gridea/</link>
      <pubDate>Wed, 12 Dec 2018 00:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/hello-gridea/</guid>
      <description>&lt;p&gt;👏  Welcome to &lt;strong&gt;Gridea&lt;/strong&gt;!&lt;br&gt;&#xA;✍️  &lt;strong&gt;Gridea&lt;/strong&gt; - a static blog writing client. You can use it to record your life, thoughts, knowledge, notes, ideas&amp;hellip; &amp;hellip;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
