<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Heyjude&#39;s Blog</title>
    <link>https://heyjude.blog/</link>
    <description>Recent content on Heyjude&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 24 Dec 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://heyjude.blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>FreeConvert.cc - Your Free Online File Conversion Solution</title>
      <link>https://heyjude.blog/posts/introducing-freeconvert-free-online-file-converter/</link>
      <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/posts/introducing-freeconvert-free-online-file-converter/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;How many times have you faced this scenario: You need to share a photo from your iPhone, but the recipient can&amp;rsquo;t open HEIC files. Or you receive a PDF that needs to be edited, but you don&amp;rsquo;t have the right software. Maybe you just want to extract audio from a video without installing bulky desktop applications.&lt;/p&gt;&#xA;&lt;p&gt;File format conversion is one of those everyday frustrations in our digital lives. Traditional solutions often come with drawbacks:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Desktop software requires installation and updates&lt;/li&gt;&#xA;&lt;li&gt;Online converters upload your files to unknown servers (privacy concerns)&lt;/li&gt;&#xA;&lt;li&gt;Premium tools charge subscription fees for basic features&lt;/li&gt;&#xA;&lt;li&gt;Many platforms impose file size limits or watermarks&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;What if there was a better way? Enter &lt;strong&gt;FreeConvert.cc&lt;/strong&gt; - a free online file conversion platform that solves all these problems while keeping your data completely private.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Automatically Translate Your Hugo Blog Using AI</title>
      <link>https://heyjude.blog/posts/how-to-translate-hugo-blog-with-ai/</link>
      <pubDate>Sun, 22 Jun 2025 10:00:00 +0800</pubDate>
      <guid>https://heyjude.blog/posts/how-to-translate-hugo-blog-with-ai/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Once we have created our own blog, we would like it to support multiple languages. This not only expands our audience but also enhances the SEO performance of the blog. However, manually translating blog posts is a time-consuming and labor-intensive task, requiring professional translators. But with the development of AI, things are different now; using AI, you can easily translate your blog into any desired language. To facilitate this, I created a tool that utilizes AI to automate the translation of your blog posts, allowing you to effortlessly support multiple languages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Integrate Microsoft Clarity Analytics Tool into a Hugo Blog Website</title>
      <link>https://heyjude.blog/posts/hugo_clarity_integration/</link>
      <pubDate>Sat, 21 Jun 2025 22:00:00 +0800</pubDate>
      <guid>https://heyjude.blog/posts/hugo_clarity_integration/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Microsoft Clarity is a free website analytics tool that provides user behavior heatmaps, session recordings, and detailed analysis data to help webmasters better understand user behavior, optimize website content, and improve user experience. After setting up your own blog website, you might want to track user behavior, and this tool can help you analyze user actions. For static blog websites built with Hugo, integrating Clarity is straightforward and can be done in just a few steps.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Sync Hugo Blog to GitHub Profile</title>
      <link>https://heyjude.blog/posts/sync-hugo-blog-to-github-profile/</link>
      <pubDate>Sat, 21 Jun 2025 22:00:00 +0800</pubDate>
      <guid>https://heyjude.blog/posts/sync-hugo-blog-to-github-profile/</guid>
      <description>&lt;h2 id=&#34;how-to-sync-hugo-blog-to-github-profile&#34;&gt;How to Sync Hugo Blog to GitHub Profile&lt;/h2&gt;&#xA;&lt;p&gt;After we have deployed our blog, we want our GitHub profile to automatically update whenever there is a new blog post, so our profile can showcase our latest articles. We can achieve this with &lt;code&gt;GitHub Actions&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;Before you start, please ensure you have completed the following preparations:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hugo Blog&lt;/strong&gt;: A Hugo blog set up and hosted in a GitHub repository (such as &lt;code&gt;username/username.github.io&lt;/code&gt; or a custom repository).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: A repository for storing your blog source files (e.g., &lt;code&gt;username/blog&lt;/code&gt;) and a repository for GitHub Pages (e.g., &lt;code&gt;username/username.github.io&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Profile README&lt;/strong&gt;: The Profile README is enabled on GitHub (create a repository with the same name as your username, such as &lt;code&gt;username/username&lt;/code&gt;, e.g., &lt;a href=&#34;https://github.com/lxb1226/lxb1226&#34;&gt;My GitHub Profile&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Basic Git Knowledge&lt;/strong&gt;: Understanding how to commit code, configure &lt;code&gt;.gitignore&lt;/code&gt;, and use GitHub Actions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-is-blog-post-workflow&#34;&gt;What is blog-post-workflow?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;blog-post-workflow&lt;/code&gt; is a GitHub Action developed by Gautam Krishnar, designed to synchronize the latest blog posts to the GitHub Profile README or other specified locations. It supports multiple blogging frameworks (including Hugo) and retrieves the latest posts by parsing the RSS feed, automatically updating the target file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build a Blog with Hugo and Deploy it to Cloudflare Pages</title>
      <link>https://heyjude.blog/posts/deploy-hugo-to-cloudflare/</link>
      <pubDate>Mon, 16 Jun 2025 20:29:00 +0800</pubDate>
      <guid>https://heyjude.blog/posts/deploy-hugo-to-cloudflare/</guid>
      <description>&lt;h1 id=&#34;build-a-blog-with-hugo-and-deploy-it-to-cloudflare-pages&#34;&gt;Build a Blog with Hugo and Deploy it to Cloudflare Pages&lt;/h1&gt;&#xA;&lt;p&gt;In this article, I will guide you step by step through the complete process of building a personal blog using &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; and deploying it to &lt;a href=&#34;https://pages.cloudflare.com/&#34;&gt;Cloudflare Pages&lt;/a&gt;. Hugo is a fast and flexible static site generator, while Cloudflare Pages offers free static site hosting services with global CDN acceleration, allowing your blog to go live quickly and provide a good user experience. Whether you&amp;rsquo;re a technical novice or an experienced developer, this tutorial will help you quickly set up your own blog.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Easily Deploy Umami for Website Traffic Statistics on Vercel</title>
      <link>https://heyjude.blog/posts/how-to-depoly-umami-with-vercel/</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/posts/how-to-depoly-umami-with-vercel/</guid>
      <description>&lt;p&gt;Umami is a simple, fast, and privacy-focused open-source website statistics tool, making it an ideal alternative to Google Analytics. This article will guide you on how to deploy Umami on Vercel and create a Neon PostgreSQL database via Vercel Storage, to build a zero-cost, lightweight website traffic statistics system. This tutorial is specifically optimized for Hugo static site users, ensuring that the generated Markdown files are compatible with Hugo&amp;rsquo;s static site generation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrate Giscus Comment System into Hugo Blog</title>
      <link>https://heyjude.blog/posts/giscus-comments-hugo/</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/posts/giscus-comments-hugo/</guid>
      <description>&lt;p&gt;This is the third tutorial on building your own blog system, focusing on adding a comment system.&lt;/p&gt;&#xA;&lt;p&gt;During the blog setup process, a good comment system can greatly enhance interactivity. Today, I will introduce how to integrate &lt;a href=&#34;https://giscus.app/&#34;&gt;Giscus&lt;/a&gt;, an open-source comment system based on GitHub Discussions, into a Hugo blog.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-choose-giscus&#34;&gt;Why Choose Giscus?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🚀 No server required, based on GitHub Discussions&lt;/li&gt;&#xA;&lt;li&gt;🔒 Secure and reliable, comment data is stored on GitHub&lt;/li&gt;&#xA;&lt;li&gt;🧩 Supports dark mode and adaptive themes&lt;/li&gt;&#xA;&lt;li&gt;💬 Supports anonymous comments (optional)&lt;/li&gt;&#xA;&lt;li&gt;🌍 Multi-language interface support&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;preparation&#34;&gt;Preparation&lt;/h2&gt;&#xA;&lt;p&gt;Before you start, you need:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploy Your Blog Website to GitHub Pages in 10 Minutes</title>
      <link>https://heyjude.blog/posts/how-to-depoly-blog-to-github/</link>
      <pubDate>Sun, 18 May 2025 17:01:07 +0800</pubDate>
      <guid>https://heyjude.blog/posts/how-to-depoly-blog-to-github/</guid>
      <description>&lt;p&gt;Once we have built our blog website locally, the next step is to distribute the blog content online so that others can see it.&lt;/p&gt;&#xA;&lt;p&gt;I researched the current hosting websites and found the following options:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;: A free static site hosting service provided by GitHub, suitable for integration with code repositories.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Netlify&lt;/strong&gt;: Supports automatic building and deployment, rich features in free tier, with very good Hugo support.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Vercel&lt;/strong&gt;: Developed by the Next.js team, fast deployment, suitable for frontend projects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;: Static site hosting service provided by Cloudflare, comes with CDN and security acceleration.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Firebase Hosting&lt;/strong&gt;: A frontend hosting platform launched by Google, suitable for use with frontend applications.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Amazon S3 + CloudFront&lt;/strong&gt;: A high-performance hosting and distribution solution, suitable for professional deployments.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitLab Pages&lt;/strong&gt;: Static site hosting service provided by GitLab, automatically builds through CI configuration.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Render&lt;/strong&gt;: A streamlined full-stack hosting platform, supports automatic deployment of Hugo sites.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Surge.sh&lt;/strong&gt;: A minimalist static site hosting tool, simple and quick command line deployment.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DigitalOcean App Platform&lt;/strong&gt;: Cloud service platform that supports automatic deployment of static websites and backend services.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;These platforms each have their own characteristics, and I will introduce how to deploy on each one in upcoming articles. In this article, I will introduce how to deploy a blog website to GitHub Pages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Auto-fill SMS Verification Codes on Mac</title>
      <link>https://heyjude.blog/posts/how-to-use-mess-auto/</link>
      <pubDate>Wed, 07 May 2025 22:36:09 +0800</pubDate>
      <guid>https://heyjude.blog/posts/how-to-use-mess-auto/</guid>
      <description>&lt;h1 id=&#34;reason&#34;&gt;Reason&lt;/h1&gt;&#xA;&lt;p&gt;We know that iOS supports auto-filling SMS verification codes, and Safari on Mac also supports it. However, non-Safari browsers do not support this feature. Yet in domestic platforms, verification codes are something we cannot escape from, so I conducted some research and found some current solutions.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://apps.apple.com/cn/app/id6472872202&#34;&gt;AutoCode&lt;/a&gt;: This is a free app available on the App Store, supporting forwarding on iOS and Android.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/LeeeSe/MessAuto&#34;&gt;MessAuto&lt;/a&gt;: MessAuto is an application for macOS that automatically extracts SMS and email verification codes, developed in Rust and suitable for any app.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Since MessAuto is open-source, I chose this software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build Your Own Blog Website in 10 Minutes</title>
      <link>https://heyjude.blog/posts/how-to-create-blog-with-hugo/</link>
      <pubDate>Mon, 05 May 2025 20:28:24 +0800</pubDate>
      <guid>https://heyjude.blog/posts/how-to-create-blog-with-hugo/</guid>
      <description>&lt;h2 id=&#34;what-is-hugo&#34;&gt;What is Hugo&lt;/h2&gt;&#xA;&lt;p&gt;Hugo is one of the most popular open-source static site generators. Users can quickly build their own websites using Hugo.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setup-steps&#34;&gt;Setup Steps&lt;/h2&gt;&#xA;&lt;h3 id=&#34;install-hugo&#34;&gt;Install Hugo&lt;/h3&gt;&#xA;&lt;p&gt;On a Mac, you can use the following command to install Hugo:&lt;/p&gt;&#xA;&lt;div&#xA;  class=&#34;code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md&#34;&gt;&#xA;  &#xA;  &lt;div&#xA;    class=&#34;code-block-header bg-muted/30 border-border flex items-center justify-between border-b px-4 py-3&#34;&gt;&#xA;    &#xA;    &lt;div class=&#34;flex items-center gap-2&#34;&gt;&#xA;      &lt;div class=&#34;text-muted-foreground flex-shrink-0&#34;&gt;&#xA;        &#xA;  &lt;svg class=&#34;h-4 w-4&#34;&#xA;    fill=&#34;none&#34;&#xA;    stroke=&#34;currentColor&#34;&#xA;    viewBox=&#34;0 0 24 24&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; stroke-width=&#34;2&#34; d=&#34;M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;span class=&#34;text-muted-foreground text-sm font-medium&#34;&gt;&#xA;        BASH&#xA;      &lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;    &#xA;    &lt;div class=&#34;flex items-center gap-2&#34;&gt;&#xA;      &lt;button&#xA;          class=&#34;collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary/10 focus:ring-primary/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none&#34;&#xA;          data-code-id=&#34;code-0&#34;&#xA;          data-default-state=&#34;expanded&#34;&#xA;          data-collapsed=&#34;false&#34;&#xA;          data-auto-collapse-lines=&#34;30&#34;&#xA;          data-auto-collapse-height=&#34;400&#34;&#xA;          data-collapsed-height=&#34;120&#34;&#xA;          title=&#34;Collapse&#34;&#xA;          aria-label=&#34;Collapse&#34;&gt;&#xA;          &lt;span class=&#34;collapse-icon&#34;&gt;&#xA;            &#xA;  &lt;svg class=&#34;h-3 w-3&#34;&#xA;    fill=&#34;none&#34;&#xA;    stroke=&#34;currentColor&#34;&#xA;    viewBox=&#34;0 0 24 24&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z&#34;/&gt;&lt;/svg&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;collapse-text hidden sm:inline&#34;&#xA;            &gt;Collapse&lt;/span&#xA;          &gt;&#xA;        &lt;/button&gt;&#xA;      &lt;button&#xA;        class=&#34;copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary/10 focus:ring-primary/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none&#34;&#xA;        data-code-id=&#34;code-0&#34;&#xA;        title=&#34;Copy&#34;&#xA;        aria-label=&#34;Copy&#34;&gt;&#xA;        &lt;span class=&#34;copy-icon&#34;&gt;&#xA;          &#xA;  &lt;svg class=&#34;h-3 w-3&#34;&#xA;    fill=&#34;none&#34;&#xA;    stroke=&#34;currentColor&#34;&#xA;    viewBox=&#34;0 0 24 24&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; stroke-width=&#34;2&#34; d=&#34;M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;        &lt;/span&gt;&#xA;        &lt;span class=&#34;copy-text hidden sm:inline&#34;&#xA;          &gt;Copy&lt;/span&#xA;        &gt;&#xA;      &lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&#xA;  &#xA;  &lt;div class=&#34;code-block-content relative&#34; id=&#34;code-0&#34;&gt;&#xA;    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install hugo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;div&#xA;      class=&#34;collapse-overlay to-card/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300&#34;&gt;&#xA;      &lt;div&#xA;        class=&#34;text-muted-foreground bg-card/80 border-border/50 hover:bg-primary/10 hover:text-primary hover:border-primary/30 absolute bottom-4 left-1/2 -translate-x-1/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200&#34;&gt;&#xA;        Click to expand and view more&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;script&gt;&#xA;(function() {&#xA;  const codeId = &#39;code-0&#39;;&#xA;  const copyBtn = document.querySelector(&#39;.copy-code-btn[data-code-id=&#34;&#39; + codeId + &#39;&#34;]&#39;);&#xA;  const collapseBtn = document.querySelector(&#39;.collapse-code-btn[data-code-id=&#34;&#39; + codeId + &#39;&#34;]&#39;);&#xA;  const codeContainer = document.getElementById(codeId);&#xA;&#xA;  if (!codeContainer) return;&#xA;&#xA;  &#xA;  if (copyBtn) {&#xA;    const copyIcon = copyBtn.querySelector(&#39;.copy-icon&#39;);&#xA;    const copyText = copyBtn.querySelector(&#39;.copy-text&#39;);&#xA;&#xA;    copyBtn.addEventListener(&#39;click&#39;, async function() {&#xA;      try {&#xA;        &#xA;        let codeText = &#39;&#39;;&#xA;&#xA;        &#xA;        const codeTableCell = codeContainer.querySelector(&#39;.lntd:last-child code&#39;);&#xA;        if (codeTableCell) {&#xA;          codeText = codeTableCell.textContent || codeTableCell.innerText;&#xA;        } else {&#xA;          &#xA;          const codeElement = codeContainer.querySelector(&#39;code&#39;);&#xA;          if (codeElement) {&#xA;            &#xA;            const hasInlineLineNumbers = codeElement.querySelector(&#39;.ln&#39;);&#xA;            if (hasInlineLineNumbers) {&#xA;              &#xA;              const codeLines = codeElement.querySelectorAll(&#39;.cl&#39;);&#xA;              if (codeLines.length &gt; 0) {&#xA;                codeText = Array.from(codeLines)&#xA;                  .map(line =&gt; {&#xA;                    const text = line.textContent || line.innerText;&#xA;                    &#xA;                    return text.replace(/\n+$/, &#39;&#39;);&#xA;                  })&#xA;                  .join(&#39;\n&#39;)&#xA;                  .replace(/\n+$/, &#39;&#39;); &#xA;              } else {&#xA;                &#xA;                const allText = codeElement.textContent || codeElement.innerText;&#xA;                codeText = allText.replace(/^\d+/gm, &#39;&#39;).replace(/^\s+/gm, &#39;&#39;);&#xA;              }&#xA;            } else {&#xA;              &#xA;              codeText = codeElement.textContent || codeElement.innerText;&#xA;            }&#xA;          } else {&#xA;            &#xA;            codeText = codeContainer.textContent || codeContainer.innerText;&#xA;          }&#xA;        }&#xA;&#xA;        &#xA;        codeText = codeText.trim();&#xA;&#xA;        &#xA;        await navigator.clipboard.writeText(codeText);&#xA;&#xA;        &#xA;        copyIcon.innerHTML = `\n  \u003csvg class=\u0022h-3 w-3\u0022\n    fill=\u0022none\u0022\n    stroke=\u0022currentColor\u0022\n    viewBox=\u00220 0 24 24\u0022\u003e\u003cpath stroke-linecap=\u0022round\u0022 stroke-linejoin=\u0022round\u0022 stroke-width=\u00222\u0022 d=\u0022M5 13l4 4L19 7\u0022 \/\u003e\n\u003c\/svg\u003e`;&#xA;        if (copyText) {&#xA;          copyText.textContent = &#39;Copied&#39;;&#xA;        }&#xA;        copyBtn.classList.add(&#39;text-green-600&#39;);&#xA;&#xA;        &#xA;        setTimeout(() =&gt; {&#xA;          copyIcon.innerHTML = `\n  \u003csvg class=\u0022h-3 w-3\u0022\n    fill=\u0022none\u0022\n    stroke=\u0022currentColor\u0022\n    viewBox=\u00220 0 24 24\u0022\u003e\u003cpath stroke-linecap=\u0022round\u0022 stroke-linejoin=\u0022round\u0022 stroke-width=\u00222\u0022 d=\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\u0022 \/\u003e\n\u003c\/svg\u003e`;&#xA;          if (copyText) {&#xA;            copyText.textContent = &#39;Copy&#39;;&#xA;          }&#xA;          copyBtn.classList.remove(&#39;text-green-600&#39;);&#xA;        }, 2000);&#xA;&#xA;      } catch (err) {&#xA;        console.error(&#39;复制失败:&#39;, err);&#xA;&#xA;        &#xA;        const range = document.createRange();&#xA;        const codeElement = codeContainer.querySelector(&#39;code&#39;) || codeContainer;&#xA;        range.selectNodeContents(codeElement);&#xA;        const selection = window.getSelection();&#xA;        selection.removeAllRanges();&#xA;        selection.addRange(range);&#xA;&#xA;        &#xA;        if (copyText) {&#xA;          copyText.textContent = &#39;Selected&#39;;&#xA;        }&#xA;&#xA;        setTimeout(() =&gt; {&#xA;          if (copyText) {&#xA;            copyText.textContent = &#39;Copy&#39;;&#xA;          }&#xA;          selection.removeAllRanges();&#xA;        }, 2000);&#xA;      }&#xA;    });&#xA;  }&#xA;&#xA;  &#xA;  if (collapseBtn) {&#xA;    const collapseIcon = collapseBtn.querySelector(&#39;.collapse-icon&#39;);&#xA;    const collapseText = collapseBtn.querySelector(&#39;.collapse-text&#39;);&#xA;    const collapseOverlay = codeContainer.querySelector(&#39;.collapse-overlay&#39;);&#xA;&#xA;    &#xA;    let codeElement = codeContainer.querySelector(&#39;pre.chroma&#39;);&#xA;    if (!codeElement) {&#xA;      codeElement = codeContainer.querySelector(&#39;pre&#39;);&#xA;    }&#xA;&#xA;    const defaultState = collapseBtn.dataset.defaultState || &#39;expanded&#39;;&#xA;    const isCollapsedAttr = collapseBtn.dataset.collapsed === &#39;true&#39;;&#xA;    const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;&#xA;    const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;&#xA;    const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;&#xA;&#xA;    let isCollapsed = false;&#xA;&#xA;    &#xA;    function initCollapse() {&#xA;      &#xA;      const shouldCollapse = isCollapsedAttr ||&#xA;                           defaultState === &#39;collapsed&#39; ||&#xA;                           shouldAutoCollapse();&#xA;&#xA;      if (shouldCollapse) {&#xA;        setCollapsed(true, false); &#xA;      }&#xA;    }&#xA;&#xA;    function shouldAutoCollapse() {&#xA;      &#xA;      if (codeElement) {&#xA;        const lines = codeElement.querySelectorAll(&#39;.line, .cl&#39;);&#xA;        const height = codeElement.offsetHeight;&#xA;        return lines.length &gt; autoCollapseLines || height &gt; autoCollapseHeight;&#xA;      }&#xA;&#xA;      &#xA;      const containerHeight = codeContainer.offsetHeight;&#xA;      if (containerHeight &gt; autoCollapseHeight) {&#xA;        return true;&#xA;      }&#xA;&#xA;      &#xA;      const textContent = codeContainer.textContent || codeContainer.innerText || &#39;&#39;;&#xA;      const estimatedLines = textContent.split(&#39;\n&#39;).length;&#xA;      return estimatedLines &gt; autoCollapseLines;&#xA;    }&#xA;&#xA;    function setCollapsed(collapsed, animate = true) {&#xA;      if (!collapseOverlay) return;&#xA;&#xA;      isCollapsed = collapsed;&#xA;&#xA;      if (collapsed) {&#xA;        &#xA;        codeContainer.style.maxHeight = collapsedHeight + &#39;px&#39;;&#xA;        codeContainer.style.overflow = &#39;hidden&#39;;&#xA;        collapseOverlay.style.opacity = &#39;1&#39;;&#xA;        collapseOverlay.style.pointerEvents = &#39;auto&#39;;&#xA;&#xA;        &#xA;        collapseIcon.innerHTML = `\n  \u003csvg class=\u0022h-3 w-3\u0022\n    fill=\u0022none\u0022\n    stroke=\u0022currentColor\u0022\n    viewBox=\u00220 0 24 24\u0022\u003e\u003cpath stroke-linecap=\u0022round\u0022 stroke-linejoin=\u0022round\u0022 stroke-width=\u00222\u0022 d=\u0022M19 9l-7 7-7-7\u0022 \/\u003e\n\u003c\/svg\u003e`;&#xA;        if (collapseText) {&#xA;          collapseText.textContent = &#39;Expand&#39;;&#xA;        }&#xA;        collapseBtn.title = &#39;Expand&#39;;&#xA;&#xA;      } else {&#xA;        &#xA;        codeContainer.style.maxHeight = &#39;&#39;;&#xA;        codeContainer.style.overflow = &#39;&#39;;&#xA;        collapseOverlay.style.opacity = &#39;0&#39;;&#xA;        collapseOverlay.style.pointerEvents = &#39;none&#39;;&#xA;&#xA;        &#xA;        collapseIcon.innerHTML = `\n  \u003csvg class=\u0022h-3 w-3\u0022\n    fill=\u0022none\u0022\n    stroke=\u0022currentColor\u0022\n    viewBox=\u00220 0 24 24\u0022\u003e\u003cpath fill=\u0022currentColor\u0022 d=\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\u0022\/\u003e\u003c\/svg\u003e`;&#xA;        if (collapseText) {&#xA;          collapseText.textContent = &#39;Collapse&#39;;&#xA;        }&#xA;        collapseBtn.title = &#39;Collapse&#39;;&#xA;      }&#xA;&#xA;      &#xA;      if (animate) {&#xA;        codeContainer.style.transition = &#39;max-height 0.3s ease-out&#39;;&#xA;        setTimeout(() =&gt; {&#xA;          codeContainer.style.transition = &#39;&#39;;&#xA;        }, 300);&#xA;      }&#xA;    }&#xA;&#xA;    function toggleCollapse() {&#xA;      setCollapsed(!isCollapsed, true);&#xA;    }&#xA;&#xA;    &#xA;    collapseBtn.addEventListener(&#39;click&#39;, toggleCollapse);&#xA;&#xA;    &#xA;    if (collapseOverlay) {&#xA;      collapseOverlay.addEventListener(&#39;click&#39;, () =&gt; {&#xA;        if (isCollapsed) {&#xA;          setCollapsed(false, true);&#xA;        }&#xA;      });&#xA;    }&#xA;&#xA;    &#xA;    initCollapse();&#xA;  }&#xA;})();&#xA;&lt;/script&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;image-figure not-prose my-8&#34; &#xA;        data-lightbox-enabled=&#34;false&#34;&#xA;        data-gallery-type=&#34;auto&#34;&gt;&#xA;  &lt;div class=&#34;image-container&#34;&gt;&#xA;    &lt;img&#xA;    src=&#34;https://img.music-poster.art/2025/05/c9d27037a7d215ff8eaa14383cba62b6.png&#34;&#xA;    alt=&#34;install&#34;&#xA;    &#xA;    &#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    data-gallery-src=&#34;https://img.music-poster.art/2025/05/c9d27037a7d215ff8eaa14383cba62b6.png&#34;&#xA;    data-gallery-alt=&#34;install&#34;&#xA;    data-gallery-title=&#34;&#34; /&gt;&lt;/div&gt;&#xA;&#xA;  &lt;/figure&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>About Me</title>
      <link>https://heyjude.blog/about/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/about/</guid>
      <description>&lt;h2 id=&#34;about-me&#34;&gt;About Me&lt;/h2&gt;&#xA;&lt;p&gt;Hello! I&amp;rsquo;m Heyjude, a software engineer passionate about technology and innovation.&lt;/p&gt;&#xA;&lt;h3 id=&#34;blog-purpose&#34;&gt;Blog Purpose&lt;/h3&gt;&#xA;&lt;p&gt;I created this blog to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Share technical insights and experiences&lt;/li&gt;&#xA;&lt;li&gt;Document my learning journey&lt;/li&gt;&#xA;&lt;li&gt;Connect with like-minded individuals&lt;/li&gt;&#xA;&lt;li&gt;Discuss technology trends&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;interests&#34;&gt;Interests&lt;/h3&gt;&#xA;&lt;p&gt;Besides programming, I enjoy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Reading technical books&lt;/li&gt;&#xA;&lt;li&gt;Contributing to open-source projects&lt;/li&gt;&#xA;&lt;li&gt;Exploring new technologies&lt;/li&gt;&#xA;&lt;li&gt;Sharing technical experiences&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;contact-information&#34;&gt;Contact Information&lt;/h3&gt;&#xA;&lt;p&gt;Feel free to reach me through:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHub: &lt;a href=&#34;https://github.com/lxb1226&#34;&gt;lxb1226&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Twitter: &lt;a href=&#34;https://twitter.com/heyjude55555&#34;&gt;@heyjude55555&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Email: &lt;a href=&#34;mailto:heyjude1587@gmail.com&#34;&gt;heyjude1587@gmail.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;my-projects&#34;&gt;My Projects&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TmpMail: &lt;a href=&#34;https://tmpmail.online&#34;&gt;TmpMail&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;blog-subscription&#34;&gt;Blog Subscription&lt;/h3&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re interested in my blog content, you can:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact Me</title>
      <link>https://heyjude.blog/contact/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/contact/</guid>
      <description>&lt;h2 id=&#34;contact-information&#34;&gt;Contact Information&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m glad you want to get in touch! Here are several ways to reach me:&lt;/p&gt;&#xA;&lt;h3 id=&#34;social-media&#34;&gt;Social Media&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GitHub: &lt;a href=&#34;https://github.com/lxb1226&#34;&gt;lxb1226&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You can find my open-source projects and contributions here&lt;/li&gt;&#xA;&lt;li&gt;Feel free to follow and interact&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Twitter: &lt;a href=&#34;https://twitter.com/heyjude55555&#34;&gt;@heyjude55555&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I share technical insights and daily thoughts&lt;/li&gt;&#xA;&lt;li&gt;Welcome to follow each other&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;email&#34;&gt;Email&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Email: &lt;a href=&#34;mailto:heyjude1587@gmail.com&#34;&gt;heyjude1587@gmail.com&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This is the most direct way to contact me&lt;/li&gt;&#xA;&lt;li&gt;I check and reply to emails regularly&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;blog-interaction&#34;&gt;Blog Interaction&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Feel free to leave comments on blog posts&lt;/li&gt;&#xA;&lt;li&gt;Subscribe to RSS for latest updates&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;collaboration&#34;&gt;Collaboration&lt;/h3&gt;&#xA;&lt;p&gt;I welcome contact for:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Privacy Policy</title>
      <link>https://heyjude.blog/privacy/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://heyjude.blog/privacy/</guid>
      <description>&lt;h2 id=&#34;privacy-policy&#34;&gt;Privacy Policy&lt;/h2&gt;&#xA;&lt;p&gt;We value your privacy. This privacy policy explains how we collect, use, and protect your personal information.&lt;/p&gt;&#xA;&lt;h3 id=&#34;information-collection&#34;&gt;Information Collection&lt;/h3&gt;&#xA;&lt;p&gt;When you visit our blog, we may collect the following information:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Access logs (IP address, browser type, access time, etc.)&lt;/li&gt;&#xA;&lt;li&gt;Name and email address if you choose to comment&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;information-usage&#34;&gt;Information Usage&lt;/h3&gt;&#xA;&lt;p&gt;The information we collect is used for:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Improving website experience&lt;/li&gt;&#xA;&lt;li&gt;Analyzing visitor statistics&lt;/li&gt;&#xA;&lt;li&gt;Responding to your comments and inquiries&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;cookie-usage&#34;&gt;Cookie Usage&lt;/h3&gt;&#xA;&lt;p&gt;This website uses cookies to enhance user experience. You can choose to accept or decline cookies.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
