<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Blog on YHY Study Website</title><link>https://ryan.0412.online/en/blog/</link><description>Recent content in Blog on YHY Study Website</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Wed, 30 Sep 2026 23:51:06 +0800</lastBuildDate><atom:link href="https://ryan.0412.online/en/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>How Hugo and Oink Integrate Giscus Comments</title><link>https://ryan.0412.online/en/blog/hugo-oink-giscus-comments/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/hugo-oink-giscus-comments/</guid><description>&lt;p&gt;Hugo produces static HTML. It does not provide a server that accepts comments, a database, or a user system. Adding comments to a Hugo site with Oink therefore means delegating the comment interface to Giscus and storing the data in GitHub Discussions.&lt;/p&gt;
&lt;p&gt;When I added comments to the site, I wanted one conversation for everyone—whether they opened the Chinese or English page, on Vercel or GitHub Pages. Here&amp;rsquo;s how the pieces work together to bring a comment onto a static blog page.&lt;/p&gt;</description></item><item><title>Installing a Custom Linux Kernel in a Virtual Machine</title><link>https://ryan.0412.online/en/blog/custom-linux-kernel-in-vm/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/custom-linux-kernel-in-vm/</guid><description>&lt;p&gt;This article has one goal: &lt;strong&gt;compile and install a custom kernel in Ubuntu running inside VMware, then load a .ko module I wrote myself&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Compilation and kernel replacement both happen in that virtual machine. They consume CPU, memory, and disk space and involve GRUB. Unstable networking can interrupt long builds or SSH sessions; without booting the new kernel, the module will not match the running version. The order is therefore static IP first, custom kernel second, and module last.&lt;/p&gt;</description></item><item><title>DNS Notes: Domain Lookups, Resource Records, and HTTPS Certificates</title><link>https://ryan.0412.online/en/blog/dns-cname-notes/</link><pubDate>Sat, 12 Sep 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/dns-cname-notes/</guid><description>&lt;p&gt;When connecting a personal site to a custom domain, the console presents CNAME, A, and sometimes TXT records. These notes follow the process from the browser finding an IP address, through the purpose of each record type, to the point where HTTPS certificates enter the chain.&lt;/p&gt;
&lt;figure class="td-figure"&gt;
 &lt;img src="https://ryan.0412.online/blog/dns-cname-notes/cover.png" alt="DNS translates a name before reaching a locked server" width="1280" height="720" loading="lazy" decoding="async"&gt;&lt;figcaption&gt; &lt;span class="td-fig-caption"&gt;Name → DNS records → machine; TLS proves that the name belongs to the server&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;&lt;div class="td-callout td-callout--note" role="note"&gt;
 &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;About the examples&lt;/span&gt;&lt;/div&gt;
 &lt;div class="td-callout__body"&gt;
&lt;p&gt;&lt;code&gt;0412.online&lt;/code&gt; and &lt;code&gt;ryan.0412.online&lt;/code&gt; are this site&amp;rsquo;s public domains. The CNAME target, verification string, and mail hostname are &lt;strong&gt;illustrative&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>SSH Login and Security Hardening on Linux Servers</title><link>https://ryan.0412.online/en/blog/linux-ssh-security-notes/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/linux-ssh-security-notes/</guid><description>&lt;p&gt;My recent SSH experiments on a VPS involved public-network timeouts, private-key permission errors, and port changes that systemd did not pick up. This article combines several Obsidian notes in the order of getting connected, hardening access, and coordinating firewall rules.&lt;/p&gt;
&lt;figure class="td-figure"&gt;
 &lt;img src="https://ryan.0412.online/blog/linux-ssh-security-notes/ssh-security-fun-cover.png" alt="SSH login and security hardening diagram" width="1536" height="1024" loading="lazy" decoding="async"&gt;&lt;figcaption&gt; &lt;span class="td-fig-caption"&gt;From client to server: allowing traffic through the cloud security group, UFW, and sshd&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;&lt;div class="td-callout td-callout--note" role="note"&gt;
 &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Illustrative placeholders&lt;/span&gt;&lt;/div&gt;
 &lt;div class="td-callout__body"&gt;
&lt;p&gt;IPs are represented by &lt;code&gt;ip1&lt;/code&gt;, &lt;code&gt;ip2&lt;/code&gt;, and similar placeholders, for example &lt;code&gt;ip1&lt;/code&gt; for the server and &lt;code&gt;ip2&lt;/code&gt; for an allowed source. The domain &lt;code&gt;xxx.xxx.com&lt;/code&gt;, ports such as &lt;code&gt;22222&lt;/code&gt;, and &lt;code&gt;username&lt;/code&gt; are also &lt;strong&gt;example placeholders&lt;/strong&gt;, not a real environment. Replace them with your own values.&lt;/p&gt;</description></item><item><title>Building a Personal Site with Oink, from Setup to Publication</title><link>https://ryan.0412.online/en/blog/oink-site-setup-notes/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/oink-site-setup-notes/</guid><description>&lt;p&gt;The &lt;a href="https://oink.pgsty.com/zh/book/"&gt;official Oink tutorial&lt;/a&gt; is comprehensive, but connecting the folders, configuration, and commands can still be confusing the first time, especially without much frontend experience. These notes from building &lt;a href="https://ryanyhy.github.io/YHY-Website/"&gt;YHY Study Website&lt;/a&gt; follow one path: understand Oink, learn how &lt;code&gt;content/&lt;/code&gt; is organized, and then write and publish a blog post.&lt;/p&gt;
&lt;figure class="td-figure"&gt;
 &lt;img src="https://ryan.0412.online/blog/oink-site-setup-notes/oink-site-setup-cover.png" alt="Oink site setup diagram" width="1536" height="1024" loading="lazy" decoding="async"&gt;&lt;figcaption&gt; &lt;span class="td-fig-caption"&gt;Markdown → Hugo → the Oink theme → a deployable static site&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2 id="stack"&gt;What Hugo and Oink each do
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt; is a static site generator: it reads Markdown and configuration and produces HTML.
&lt;strong&gt;Oink&lt;/strong&gt; is a Hugo theme: it controls the appearance of sidebars, cards, callouts, code blocks, and other components.&lt;/p&gt;</description></item><item><title>Migrating and Consolidating ROS Workspaces</title><link>https://ryan.0412.online/en/blog/ros-workspace-migration/</link><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><guid>https://ryan.0412.online/en/blog/ros-workspace-migration/</guid><description>&lt;p&gt;When moving a ROS robot to a new computer or disk, or sharing one codebase across several robots, the easiest trap is not copying the files: it is &lt;strong&gt;leaving the old workspace source chain in the shell&lt;/strong&gt;. When several catkin workspaces overlap on the same machine, especially with identically named packages, you may not discover which copy is actually running until something fails.&lt;/p&gt;
&lt;p&gt;These are my notes from consolidating and migrating workspaces: understand how catkin finds packages, simplify the source chain in order, and finally restore hardware bindings such as udev rules.&lt;/p&gt;</description></item></channel></rss>