<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" 
  xmlns:content="http://purl.org/rss/1.0/modules/content/" 
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:atom="http://www.w3.org/2005/Atom" 
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
  xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Mark Zhu&#39;s Blog</title>
    <link>https://blog.mygraphql.com/en/notes/</link>
    <description>Recent content on Mark Zhu&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>labile.zhu@gmail.com (Mark Zhu)</managingEditor>
    <webMaster>labile.zhu@gmail.com (Mark Zhu)</webMaster>
    <copyright>Mark Zhu ©2026, All Rights Reserved</copyright>
    <lastBuildDate>Tue, 20 Jan 2026 08:12:15 +0800</lastBuildDate>
    
        <atom:link href="https://blog.mygraphql.com/en/notes/index.xml" rel="self" type="application/rss+xml" />
    

      
      <item>
        <title>Digital Zen: How I Tamed the Chaos of My Gadgets with Homebox</title>
        <link>https://blog.mygraphql.com/en/notes/lifehacker/homebox/</link>
        <pubDate>Tue, 20 Jan 2026 08:12:15 +0800</pubDate>
        <author>labile.zhu@gmail.com (Mark Zhu)</author>
        <atom:modified>Tue, 20 Jan 2026 08:12:15 +0800</atom:modified>
        <guid>https://blog.mygraphql.com/en/notes/lifehacker/homebox/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://blog.mygraphql.com/en/notes/lifehacker/homebox/index.assets/logo.png&#34; alt=&#34;ogo&#34;&gt;&lt;br /&gt;
As a software engineer, my life has always been a blend of the digital and the physical. By day, I build complex architectures for large corporations, helping them manage their vast digital assets and streamline operations. By night (and on weekends), I’m a tinkerer. Whether it’s writing a custom script to automate my lighting, setting up a cluster of Raspberry Pi servers in my basement, or performing a DIY oil change on my car, I find immense joy in hands-on projects.&lt;/p&gt;</description>
        
        <dc:creator>Mark Zhu</dc:creator>
        
        
        
        
          
            
              <category>self-hosting</category>
            
          
        
        
        
      </item>
      
      <item>
        <title>Linux: Everything is a file; peekfd: peek write/read of every file</title>
        <link>https://blog.mygraphql.com/en/notes/low-tec/trace/peekfd/</link>
        <pubDate>Sat, 06 Jul 2024 23:12:15 +0800</pubDate>
        <author>labile.zhu@gmail.com (Mark Zhu)</author>
        <atom:modified>Sat, 06 Jul 2024 23:12:15 +0800</atom:modified>
        <guid>https://blog.mygraphql.com/en/notes/low-tec/trace/peekfd/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://blog.mygraphql.com/en/notes/low-tec/trace/peekfd/index.assets/logo.jpeg&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Most of the data flows in Linux, including inter-process communication, sockets, etc., are implemented through file descriptors (fd) reading and writing. When troubleshooting, if you can peek at the flow of fd, many problems can be quickly proved/falsified. This article introduces an old tool &lt;code&gt;peekfd&lt;/code&gt;, which can complete this task in a certain environment.&lt;/p&gt;
&lt;h3 id=&#34;problems-i-encountered&#34;&gt;Problems I encountered&lt;/h3&gt;
&lt;p&gt;I talked about a scenario in &lt;a href=&#34;https://blog.mygraphql.com/zh/notes/low-tec/inter-process/child-process-wait-die-lock/&#34;&gt;《I Lost to AI - A Brief Note on a Parent-Child Process Interlocking Trap, I Digged It Myself》&lt;/a&gt;. The following is a diagram of the parent-child relationship of the process. I want to use &lt;code&gt;kill -QUIT $&lt;/code&gt; (Why not &lt;code&gt;jstack&lt;/code&gt;?) to view the jvm stack. Ideally, &lt;code&gt;kill -QUIT $test_case_jvm&lt;/code&gt; will make &lt;code&gt;test cases jvm&lt;/code&gt; print a stack dump to stdout, and then &lt;code&gt;maven jvm&lt;/code&gt; will also copy and print it out. But the reality is that &lt;code&gt;maven jvm&lt;/code&gt; eats the stack dump output of &lt;code&gt;test cases jvm&lt;/code&gt; and does not spit it out.&lt;/p&gt;</description>
        
        <dc:creator>Mark Zhu</dc:creator>
        
        
        
        
          
            
              <category>inter-process</category>
            
          
            
              <category>fd</category>
            
          
            
              <category>trace</category>
            
          
            
              <category>ptrace</category>
            
          
            
              <category>low-tec</category>
            
          
        
        
        
      </item>
      
      <item>
        <title>How an Asian Dad Keeps Learning English After a Layoff from an English-Speaking Workplace</title>
        <link>https://blog.mygraphql.com/en/notes/my-english/keep-learning-english/</link>
        <pubDate>Sat, 20 Jan 2024 08:12:15 +0800</pubDate>
        <author>labile.zhu@gmail.com (Mark Zhu)</author>
        <atom:modified>Sat, 20 Jan 2024 08:12:15 +0800</atom:modified>
        <guid>https://blog.mygraphql.com/en/notes/my-english/keep-learning-english/</guid>
        <description>&lt;p&gt;I&amp;rsquo;m an Asian Dad living in Mainland China. I was recently laid off from an English-speaking workplace due to geopolitical factors. However, I am determined to continue improving my English skills, even without the daily immersion of a professional English environment.&lt;/p&gt;
&lt;h2 id=&#34;why-keep-learning-english&#34;&gt;Why keep learning English?&lt;/h2&gt;
&lt;p&gt;English skills are crucial for my career growth and personal development for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global Job Opportunities&lt;/strong&gt;&lt;br /&gt;
English is the &lt;em&gt;lingua franca&lt;/em&gt; of the global tech industry. Proficiency opens doors to international teams, global job markets, and collaborative projects that span multiple countries.&lt;/p&gt;</description>
        
        <dc:creator>Mark Zhu</dc:creator>
        
        
        
        
          
            
              <category>english</category>
            
          
        
        
        
      </item>
      
      <item>
        <title>A Complete Guide of &#39;ss&#39; Command Output Metrics - TCP Connection Inspecting Tool</title>
        <link>https://blog.mygraphql.com/en/notes/low-tec/network/tcp-inspect/</link>
        <pubDate>Sun, 10 Sep 2023 01:12:15 +0800</pubDate>
        <author>labile.zhu@gmail.com (Mark Zhu)</author>
        <atom:modified>Sun, 10 Sep 2023 01:12:15 +0800</atom:modified>
        <guid>https://blog.mygraphql.com/en/notes/low-tec/network/tcp-inspect/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://blog.mygraphql.com/en/notes/low-tec/network/tcp-inspect/index.assets/image-20220801231018488.png&#34; alt=&#34;image-20220801231018488&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Understanding metrics from Linux ss command output.&lt;/p&gt;
&lt;p&gt;I am not a network expert, but after years of troubleshooting network problems in production and test environments, I no longer want to muddle through, so I record what I have learned. Due to limited understanding of TCP stack implementation, the content is for reference only.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ss&lt;/code&gt; is a perfect tool to inspect TCP connection level statistics. But it is not well-documented. This article tries to explain the output of &lt;code&gt;ss&lt;/code&gt; and how to read the metrics from the &lt;code&gt;ss&lt;/code&gt; output.&lt;/p&gt;</description>
        
        <dc:creator>Mark Zhu</dc:creator>
        
        
        
        
          
            
              <category>kernel</category>
            
          
            
              <category>TCP</category>
            
          
            
              <category>socket</category>
            
          
            
              <category>ss</category>
            
          
        
        
        
      </item>
      
      <item>
        <title>Envoy WASM Network Filter to fix illegal HTTP Header</title>
        <link>https://blog.mygraphql.com/en/notes/cloud/envoy/wasm/wasm-header-repairer/</link>
        <pubDate>Sat, 11 Jun 2022 23:12:15 +0800</pubDate>
        <author>labile.zhu@gmail.com (Mark Zhu)</author>
        <atom:modified>Sat, 11 Jun 2022 23:12:15 +0800</atom:modified>
        <guid>https://blog.mygraphql.com/en/notes/cloud/envoy/wasm/wasm-header-repairer/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://blog.mygraphql.com/en/notes/cloud/envoy/wasm/wasm-header-repairer/index.assets/image-20220529215423262.png&#34; alt=&#34;logo&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-story&#34;&gt;The story&lt;/h2&gt;
&lt;p&gt;The story takes place in the summer of 2022 AD. God (pseudonym) found that the normal HTTP request before the introduction of Istio was responded with HTTP status code &lt;code&gt;400&lt;/code&gt; after the introduction of Istio Gateway. The traffic in question has HTTP headers that do not comply to the HTTP 1.1 specification. For example, there is an extra &lt;strong&gt;space&lt;/strong&gt; before the colon:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-log&#34; data-lang=&#34;log&#34;&gt;GET /headers HTTP/1.1\r\n
Host: httpbin.org\r\n
User-Agent: curl/7.68.0\r\n
Accept: */*\r\n
SpaceSuffixHeader : normalVal\r\n
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After begging God to fix the problem, &amp;ldquo;innocent&amp;rdquo; programmers prepared for the worst, trying to build a Noah&amp;rsquo;s Ark.&lt;/p&gt;</description>
        
        <dc:creator>Mark Zhu</dc:creator>
        
        
        
        
          
            
              <category>cloud</category>
            
          
            
              <category>istio</category>
            
          
            
              <category>envoy</category>
            
          
            
              <category>wasm</category>
            
          
            
              <category>http</category>
            
          
        
        
        
      </item>
      

    
  </channel>
</rss>
