<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Q&#x27;s Blog</title>
    <subtitle>A CSer Personal Blog</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.qzydustin.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.qzydustin.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-22T00:00:00+00:00</updated>
    <id>https://blog.qzydustin.com/atom.xml</id>
    <entry xml:lang="en">
        <title>iPhone ICCID Unlock: Activation Ticket Backup and Restore</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/iphone-iccid-unlock/"/>
        <id>https://blog.qzydustin.com/posts/iphone-iccid-unlock/</id>
        
        <summary type="html">&lt;p&gt;ICCID activation was once a common workaround for carrier-locked iPhones. Apple patched it, so it cannot issue new unlocked tickets, but tickets created before the patch still work. To preserve an existing unlock through a reset, downgrade, or DFU restore, back up the activation ticket first and restore it afterward. The ticket is tied to one device and cannot be transferred. I use my iPhone 5s (A1453, au&#x2F;KDDI Japan) as the example.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Recovering a Bricked 360T7 via UART After a DDR3 RAM Upgrade</title>
        <published>2026-05-23T00:00:00+00:00</published>
        <updated>2026-05-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/360t7-uart-recovery/"/>
        <id>https://blog.qzydustin.com/posts/360t7-uart-recovery/</id>
        
        <summary type="html">&lt;p&gt;A memory-modded 360T7 had run for years until I flashed OpenWrt&#x27;s bl2 and fip. It then stopped at &lt;code&gt;dram size: 0MB&lt;&#x2F;code&gt;. Every rescue package I found failed for the same reason: OpenWrt&#x27;s official bl2 drives DDR3 at 2133MT&#x2F;s, while this router has a DDR3-1600 chip. DRAM initialization failed before the rest of the boot chain could load. I traced the settings in the ATF source, built a bl2 at 1866MT&#x2F;s, and recovered the router over UART.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Dual-Partition Sysupgrade on the 360V6 with OpenWrt</title>
        <published>2026-05-23T00:00:00+00:00</published>
        <updated>2026-05-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/360v6-sysupgrade/"/>
        <id>https://blog.qzydustin.com/posts/360v6-sysupgrade/</id>
        
        <summary type="html">&lt;p&gt;The 360V6 has A&#x2F;B dual-partition flash: two complete rootfs copies and a bootloader slot flag that selects one at boot. Updates write the inactive partition and leave the running one alone. If a write fails or is interrupted, the router can still boot the old system.&lt;&#x2F;p&gt;
&lt;p&gt;OpenWrt&#x27;s sysupgrade ignored the layout and wrote the running partition in place. A power loss or bad image mid-write left the device unbootable, recoverable only over TTL. I added proper A&#x2F;B support upstream, and it has merged.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Running BT and PT Behind CGNAT with WireGuard and a VPS</title>
        <published>2024-11-11T19:52:11+00:00</published>
        <updated>2024-11-11T19:52:11+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/bt-pt-wireguard-vps/"/>
        <id>https://blog.qzydustin.com/posts/bt-pt-wireguard-vps/</id>
        
        <summary type="html">&lt;p&gt;BitTorrent and private-tracker clients benefit from accepting inbound connections, but CGNAT prevents that. Your ISP places multiple subscribers behind one public IPv4 address, so there is no inbound mapping for the home server. Port forwarding on the home router does not help because the relevant NAT is upstream at the ISP.&lt;&#x2F;p&gt;
&lt;p&gt;A VPS with a public address and a WireGuard tunnel can relay the traffic. It receives torrent connections on a port range and forwards them through the tunnel to the home server. To peers, the home server is then reachable at the VPS&#x27;s public address.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Running Proxmox on a 2012 Mac Mini</title>
        <published>2024-11-11T19:29:42+00:00</published>
        <updated>2024-11-11T19:29:42+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/mac-mini-pve/"/>
        <id>https://blog.qzydustin.com/posts/mac-mini-pve/</id>
        
        <summary type="html">&lt;p&gt;The Late 2012 Mac Mini Server makes a cheap Proxmox VE node and is the last fully upgradeable Mac Mini. Its two SO-DIMM slots support 16GB of RAM, and its two 2.5-inch SATA bays can hold a boot disk and a datastore. Apple soldered the RAM in 2014 and moved the line to ARM in 2020, so newer Minis either cannot take more memory or cannot run x86 virtualization.&lt;&#x2F;p&gt;
&lt;p&gt;Its quad-core mobile Ivy Bridge i7 keeps power use modest for four cores. The whole machine is a 19cm-square box that fits on a shelf.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Optimizing Sony Digital Paper for Chinese</title>
        <published>2024-06-18T22:49:50+00:00</published>
        <updated>2024-06-18T22:49:50+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/sony-digital-paper-chinese/"/>
        <id>https://blog.qzydustin.com/posts/sony-digital-paper-chinese/</id>
        
        <summary type="html">&lt;p&gt;The Sony DPT-RP1 is a large-screen E Ink reader built for A4 PDFs. Sony ships the same firmware image in China, Japan, and the United States. A region identifier stored outside the firmware selects the UI language, the input methods, and the default font families, so flashing firmware cannot change the region.&lt;&#x2F;p&gt;
&lt;p&gt;The Japanese build has Japanese and English fonts. The American build has English only, while the Chinese build has Chinese and English. My Japanese unit rendered Chinese characters in a book&#x27;s table of contents with Japanese glyph variants, or did not render them at all. The Chinese and American builds did not have that problem. Their default font families differ.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Surviving the OOM Killer with Swap</title>
        <published>2024-01-13T03:27:26+00:00</published>
        <updated>2024-01-13T03:27:26+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/oom-killer-swap/"/>
        <id>https://blog.qzydustin.com/posts/oom-killer-swap/</id>
        
        <summary type="html">&lt;p&gt;The Linux OOM killer runs when the kernel can no longer reclaim memory. If anonymous memory exceeds RAM and has nowhere to go, the kernel scores processes and kills the one with the highest score. On a small VPS, that can be the application, database, or build job you meant to keep alive. A low-priority daemon with a large RSS can lose, but so can one large process when there is no swap.&lt;&#x2F;p&gt;
&lt;p&gt;Swap gives anonymous pages backing storage under memory pressure. The kernel can evict those pages instead of killing the owning process, at the cost of latency when it reads them back. On a VPS, that delay is often preferable to losing the process.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Converting .sas7bdat to CSV Without SAS</title>
        <published>2023-08-27T15:16:21+00:00</published>
        <updated>2023-08-27T15:16:21+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/sas7bdat-to-csv/"/>
        <id>https://blog.qzydustin.com/posts/sas7bdat-to-csv/</id>
        
        <summary type="html">&lt;p&gt;&lt;code&gt;.sas7bdat&lt;&#x2F;code&gt; is the binary format SAS uses to store data sets. SAS is commercial statistical software with a licensing cost that prices out most individual users. The format is proprietary and undocumented by SAS, so every reader outside it, including pyreadstat, is the product of reverse engineering.&lt;&#x2F;p&gt;
&lt;p&gt;A single &lt;code&gt;.sas7bdat&lt;&#x2F;code&gt; file holds the table itself, the column metadata, and enough type information to reconstruct rows. What it does not hold is the display layer. SAS stores human-readable value labels and formats in a separate catalog file, &lt;code&gt;.sas7bcat&lt;&#x2F;code&gt;. Converting to CSV throws that layer away, because CSV has no place to put it.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Creating a Bootable macOS USB Installer</title>
        <published>2023-07-19T17:06:26+00:00</published>
        <updated>2023-07-19T17:06:26+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/macos-usb-installer/"/>
        <id>https://blog.qzydustin.com/posts/macos-usb-installer/</id>
        
        <summary type="html">&lt;p&gt;Making a macOS USB installer becomes awkward when the host and target use different architectures or macOS generations. I ran into it while reinstalling macOS 10.7 Lion on a 2012 Mac Pro from an M1 MacBook Air. The M1 cannot run Lion&#x27;s installer, and Apple&#x27;s direct Lion download is packaged in a form that modern macOS refuses to open.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Disabling Automatic APT on a Low-Resource Debian VPS</title>
        <published>2023-06-10T17:30:54+00:00</published>
        <updated>2023-06-10T17:30:54+00:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/debian-disable-auto-apt/"/>
        <id>https://blog.qzydustin.com/posts/debian-disable-auto-apt/</id>
        
        <summary type="html">&lt;p&gt;I run two inexpensive OranMe VPS instances: one has 0.1 CPU and 128MB RAM, the other 0.5 CPU and 512MB. They are only suitable for light self-hosted work, so I installed Debian without a desktop environment.&lt;&#x2F;p&gt;
&lt;p&gt;The 0.1 CPU box kept shutting down. In the OranMe control panel, its CPU usage hit the limit shortly before each crash. That looked like the provider&#x27;s abuse protection killing the VM. &lt;code&gt;&#x2F;var&#x2F;log&#x2F;system.log&lt;&#x2F;code&gt; showed that the spikes matched apt&#x27;s periodic tasks.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting Up an Nginx Web Server</title>
        <published>2022-11-12T01:44:32-07:00</published>
        <updated>2022-11-12T01:44:32-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/nginx-web-server/"/>
        <id>https://blog.qzydustin.com/posts/nginx-web-server/</id>
        
        <summary type="html">&lt;p&gt;Nginx is an event-driven web server. Its worker pool multiplexes I&#x2F;O across many connections instead of assigning a thread to each one. It is commonly used for static sites, reverse proxies, and TLS termination.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Cell Phone Plans Worth Keeping and How to Get Them</title>
        <published>2022-10-08T16:20:35-07:00</published>
        <updated>2022-10-08T16:20:35-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/cell-phone-plans/"/>
        <id>https://blog.qzydustin.com/posts/cell-phone-plans/</id>
        
        <summary type="html">&lt;p&gt;The cheapest cell plans in America are not advertised. They are grandfathered prepaid lines T-Mobile no longer sells, a $10&#x2F;month unlimited tablet line, and a pay-per-use number you can keep alive for about a dollar a year.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Building Padavan Router Firmware</title>
        <published>2022-10-05T10:03:05-07:00</published>
        <updated>2022-10-05T10:03:05-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/padavan-firmware/"/>
        <id>https://blog.qzydustin.com/posts/padavan-firmware/</id>
        
        <summary type="html">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bitbucket.org&#x2F;padavan&#x2F;rt-n56u&#x2F;src&#x2F;master&#x2F;&quot;&gt;Padavan&lt;&#x2F;a&gt; is an open-source firmware derived from the GPL source ASUS released for the RT-N56U router. It targets MediaTek and Ralink SoCs: RT3883, MT7620, MT7621, and MT7628. The upstream repository on BitBucket last received updates in 2018. A fork on GitLab carries current development.&lt;&#x2F;p&gt;
&lt;p&gt;A prebuilt image targets one board and feature set. Building from source lets you match the device and select the features to compile. This post builds firmware for the MI-NANO router, whose official firmware is old and has no IPv6 support.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Kindle Jailbreaking: Unlocking Koreader and Custom Extensions</title>
        <published>2022-10-02T12:17:25-07:00</published>
        <updated>2022-10-02T12:17:25-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/kindle-jailbreaking/"/>
        <id>https://blog.qzydustin.com/posts/kindle-jailbreaking/</id>
        
        <summary type="html">&lt;p&gt;Amazon&#x27;s Kindle firmware locks you into the stock reader, which handles PDFs poorly and limits customization. Jailbreaking opens access to Koreader (a reader with PDF reflow and custom dictionaries), KUAL (a plugin launcher), and system-level tools like SSH. This guide covers the demo mode exploit for firmware 5.14.2 and earlier.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Flashing the Xiaomi Router Nano Bootloader</title>
        <published>2022-09-28T14:43:27-07:00</published>
        <updated>2022-09-28T14:43:27-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/xiaomi-nano-bootloader/"/>
        <id>https://blog.qzydustin.com/posts/xiaomi-nano-bootloader/</id>
        
        <summary type="html">&lt;p&gt;The Xiaomi Router Nano is a MediaTek MT7628 router. Stock MiWiFi accepts only signed updates and exposes no shell. Replacing the bootloader lets it run OpenWrt or Padavan.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Remote LAN Access with ZeroTier, Tailscale, and Cloudflare Tunnel</title>
        <published>2022-09-26T15:28:32-07:00</published>
        <updated>2022-09-26T15:28:32-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/remote-lan-access/"/>
        <id>https://blog.qzydustin.com/posts/remote-lan-access/</id>
        
        <summary type="html">&lt;p&gt;Remote LAN access lets devices reach a private network from anywhere. ZeroTier uses a virtual L2 network with P2P paths. Tailscale builds on WireGuard with NAT traversal. Cloudflare Tunnel uses a reverse proxy model.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Linux System and Network Tuning</title>
        <published>2022-07-28T15:02:35-07:00</published>
        <updated>2022-07-28T15:02:35-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/linux-system-tuning/"/>
        <id>https://blog.qzydustin.com/posts/linux-system-tuning/</id>
        
        <summary type="html">&lt;p&gt;Default Linux kernel parameters target general-purpose workloads. Servers handling high traffic, many connections, or heavy I&#x2F;O need tuning. This guide covers the sysctl parameters that matter and why.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting Up a Shadowsocks Proxy</title>
        <published>2022-07-28T14:45:05-07:00</published>
        <updated>2022-07-28T14:45:05-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/shadowsocks-proxy/"/>
        <id>https://blog.qzydustin.com/posts/shadowsocks-proxy/</id>
        
        <summary type="html">&lt;p&gt;Shadowsocks-libev is an encrypted SOCKS5 proxy. It does not tunnel a whole network stack the way a VPN does. The client exposes a local SOCKS5 port that applications point at, and the server relays each connection to its destination over an encrypted link. The stream carries no recognizable protocol handshake, which is why it appears as random bytes to an observer. The usual topology puts the client behind a censoring network and the server on an overseas VPS.&lt;&#x2F;p&gt;
&lt;p&gt;This post covers the libev implementation on Debian-family systems. The Chinese censor does more than watch traffic passively. It actively probes suspected servers, and a confirmed Shadowsocks server has its IP blocked in mainland China. Cipher choice determines how long a server lasts, not whether it is invulnerable.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Free Certificates with Certbot</title>
        <published>2022-07-18T17:12:32-07:00</published>
        <updated>2022-07-18T17:12:32-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/free-tls-certificates/"/>
        <id>https://blog.qzydustin.com/posts/free-tls-certificates/</id>
        
        <summary type="html">&lt;p&gt;ACME is the protocol for automated certificate management. Let&#x27;s Encrypt speaks ACME. Certbot is the official ACME client from EFF. This guide covers Certbot with Cloudflare DNS validation.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting Up a Trojan Proxy</title>
        <published>2022-07-18T16:58:55-07:00</published>
        <updated>2022-07-18T16:58:55-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/trojan-proxy/"/>
        <id>https://blog.qzydustin.com/posts/trojan-proxy/</id>
        
        <summary type="html">&lt;p&gt;Trojan, from the trojan-gfw project, is a proxy protocol that uses TLS with a valid certificate on a real domain. Its traffic resembles ordinary HTTPS browsing.&lt;&#x2F;p&gt;
&lt;p&gt;The server fronts a web server with ordinary content. A probe receives that website instead of a dead end.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Array Algorithms</title>
        <published>2022-07-12T12:25:04-07:00</published>
        <updated>2022-07-12T12:25:04-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/array-algorithms/"/>
        <id>https://blog.qzydustin.com/posts/array-algorithms/</id>
        
        <summary type="html">&lt;p&gt;Arrays store elements in contiguous memory. Access is O(1). Search and modification require iterating. This guide covers six algorithms that appear repeatedly in array problems: binary search, two pointers, sliding window, prefix sums, divide and conquer, and the Dutch national flag.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Recursion and Iteration</title>
        <published>2022-07-08T22:19:45-07:00</published>
        <updated>2022-07-08T22:19:45-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/recursion-and-iteration/"/>
        <id>https://blog.qzydustin.com/posts/recursion-and-iteration/</id>
        
        <summary type="html">&lt;p&gt;Recursion and iteration are interchangeable. Any loop can be rewritten as recursion, and any recursion can be rewritten as a loop using an explicit stack. The difference is cost. Recursion consumes the call stack and adds per-call overhead. Iteration does neither. The right choice depends on the problem structure and the language.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Docker and Containers: Security, Rootless Mode, and Podman</title>
        <published>2022-07-07T20:36:36-07:00</published>
        <updated>2022-07-07T20:36:36-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/docker-and-containers/"/>
        <id>https://blog.qzydustin.com/posts/docker-and-containers/</id>
        
        <summary type="html">&lt;p&gt;A container is not a virtual machine. VMs emulate hardware and run a full OS kernel. Containers share the host kernel and isolate processes using namespaces (which partition what a process sees: filesystem, network, PIDs, users) and cgroups (which cap what it uses: CPU, memory, I&#x2F;O).&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting Up a Jekyll Blog</title>
        <published>2022-07-06T16:29:28-07:00</published>
        <updated>2022-07-06T16:29:28-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/jekyll-blog/"/>
        <id>https://blog.qzydustin.com/posts/jekyll-blog/</id>
        
        <summary type="html">&lt;p&gt;Jekyll is a static site generator written in Ruby. It renders Markdown through Liquid templates into static HTML. The published site is a directory of files with no database and no server-side runtime at request time.&lt;&#x2F;p&gt;
&lt;p&gt;On Apple Silicon, the Ruby toolchain needs a little setup first: Homebrew, a Ruby version manager, and the gem path.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>First Blog</title>
        <published>2022-07-06T15:55:19-07:00</published>
        <updated>2022-07-06T15:55:19-07:00</updated>
        
        <author>
          <name>
            
              Zhenyu Qi
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.qzydustin.com/posts/first-blog/"/>
        <id>https://blog.qzydustin.com/posts/first-blog/</id>
        
        <summary type="html">&lt;blockquote&gt;
&lt;p&gt;业精于勤荒于嬉，行成于思毁于随。&lt;br &#x2F;&gt;
Achievements are reached by hard work rather than recreation. Actions are done after thorough consideration rather than casual decisions.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;</summary>
        
    </entry>
</feed>
