<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web on 孤筝の温暖小家</title><link>https://www.guzhengsvt.cn/en/tags/web/</link><description>Recent content from 孤筝の温暖小家</description><generator>Hugo</generator><language>en</language><managingEditor>lvbowen040427@163.com (孤筝)</managingEditor><webMaster>lvbowen040427@163.com (孤筝)</webMaster><copyright>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</copyright><lastBuildDate>Sat, 19 Apr 2025 16:56:24 +0800</lastBuildDate><atom:link href="https://www.guzhengsvt.cn/en/tags/web/index.xml" rel="self" type="application/rss+xml"/><item><title>Typecho Comments Import to Waline</title><link>https://www.guzhengsvt.cn/en/post/othernotes/typecho%E8%AF%84%E8%AE%BA%E5%AF%BC%E5%85%A5waline/</link><pubDate>Sat, 19 Apr 2025 16:56:24 +0800</pubDate><author>lvbowen040427@163.com (孤筝)</author><guid>https://www.guzhengsvt.cn/en/post/othernotes/typecho%E8%AF%84%E8%AE%BA%E5%AF%BC%E5%85%A5waline/</guid><description>
<![CDATA[<h1>Typecho Comments Import to Waline</h1><p>Author: 孤筝(lvbowen040427@163.com)</p>
        
          <p>A couple of days ago, I migrated my blog posts from Typecho to Hugo. Just setting up the Front Matter parameters and reconfiguring image links took considerable effort.<br>
The value of a blog lies first in its articles, followed closely by its comments. Comments are proof that the blog has made an impact in both the digital and real worlds, carrying the interactions between people. More personally, comments from all corners of the globe are precious memories and a part of what makes &ldquo;me&rdquo;.<br>
Thus, it&rsquo;s essential to copy the original comments to the corresponding articles on the new site.</p>
<h2 id="configuring-waline">
<a class="header-anchor" href="#configuring-waline"></a>
Configuring Waline
</h2><p>Unlike dynamic blogs like WordPress or Typecho, static blogs can only rely on external comment systems. There are many options, each with its pros and cons. After referring to <a href="https://cloud.tencent.com/developer/article/2196035">this article</a> and checking the official websites of various comment systems, I ultimately chose <a href="https://waline.js.org">Waline</a>.<br>
Waline&rsquo;s <a href="https://waline.js.org/guide/get-started/">Chinese documentation</a> is detailed and comprehensive. After setting up the <a href="https://leancloud.app">LeanCloud</a> database and <a href="https://vercel.com/">Vercel</a> server, you can access the comment management dashboard at <code>https://&lt;your-server-domain&gt;/ui/</code>. Register as an administrator for the first time, where you can manage comments and users.</p>
<h2 id="exporting-typecho-comments">
<a class="header-anchor" href="#exporting-typecho-comments"></a>
Exporting Typecho Comments
</h2><p>Typecho is quite old, with a smaller user base compared to more active communities like Hexo or WordPress. There&rsquo;s also very little documentation available online.<br>
The only solution I found was a plugin called <a href="https://github.com/lizheming/typecho-export-valine">Export2Valine</a> (also mentioned in Waline&rsquo;s documentation) by <a href="https://imnerd.org">Yi Hong Yuan Luo</a>, which exports Typecho comments to Valine.<br>
However, it hasn&rsquo;t been updated in three years, and testing showed it only imports the first comment. Looking at the exported <code>jsonl</code> file, it&rsquo;s clear that all comment data was fully exported.</p>
<p>First, install the plugin in Typecho (make sure to rename the plugin folder to &ldquo;Export2Valine&rdquo;!).</p>
<p>Referencing <a href="https://www.imwxz.com/posts/74f52ab0.html">this article</a> about migrating from Typecho to Hexo, the plugin is outdated and requires some modifications.<br>
Locate <code>Action.php</code> in the plugin folder and modify lines 42 onwards as follows (to track parent comments):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nv">$arr</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;objectId&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;coid&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;QQAvatar&#34;</span> <span class="o">=&gt;</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;comment&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;text&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;insertedAt&#34;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;__type&#34;</span> <span class="o">=&gt;</span> <span class="s2">&#34;Date&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;iso&#34;</span> <span class="o">=&gt;</span> <span class="nv">$time</span>
</span></span><span class="line"><span class="cl">  <span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;createdAt&#34;</span> <span class="o">=&gt;</span> <span class="nv">$time</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;updatedAt&#34;</span> <span class="o">=&gt;</span> <span class="nv">$time</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;ip&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;ip&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;link&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;url&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;mail&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;mail&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;nick&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;author&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;ua&#34;</span> <span class="o">=&gt;</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;agent&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;url&#34;</span> <span class="o">=&gt;</span> <span class="s2">&#34;/</span><span class="si">{</span><span class="nv">$slug</span><span class="si">}</span><span class="s2">.html&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;parent&#34;</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$arr</span><span class="p">[</span><span class="s2">&#34;pid&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;parent&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$arr</span><span class="p">[</span><span class="s2">&#34;rid&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getRootId</span><span class="p">(</span><span class="nv">$comment</span><span class="p">[</span><span class="s2">&#34;coid&#34;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>No other changes are needed.<br>
Next, go to Typecho&rsquo;s admin panel → Console → Export Comments. Open the downloaded <code>jsonl</code> file and delete the header line:<br>
<code>#filetype:JSON-streaming {&quot;type&quot;:&quot;Class&quot;,&quot;class&quot;:&quot;Comment&quot;}\n\n</code>.<br>
Save the file, close it, and change the file extension to <code>.json</code>.</p>
<h2 id="fixing-the-json-format">
<a class="header-anchor" href="#fixing-the-json-format"></a>
Fixing the JSON Format
</h2><p>The exported <code>jsonl</code> file contains escaped Chinese characters and is a single line, making it hard to read.<br>
To convert it into a more readable, editable, and importable <code>json</code> format, use your editor&rsquo;s <strong>Find and Replace</strong> feature to replace <code>}\n{</code> with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="err">},</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span></code></pre></div><p>In Xcode, you can insert line breaks by clicking the small magnifying glass icon on the left.</p>
<p>Now, each line represents one comment object.</p>
<p>Similarly, to separate the fields within each comment object, replace <code>&quot;,&quot;</code> with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;</span>
</span></span></code></pre></div><p>Now, each comment object contains multiple data fields, structured like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;objectId&#34;</span><span class="p">:</span><span class="s2">&#34;3&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;QQAvatar&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;comment&#34;</span><span class="p">:</span><span class="s2">&#34;\u6d4b\u8bd5\u4e00\u4e0b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;insertedAt&#34;</span><span class="p">:{</span><span class="nt">&#34;__type&#34;</span><span class="p">:</span><span class="s2">&#34;Date&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;iso&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:37:07.000Z&#34;</span><span class="p">},</span><span class="nt">&#34;createdAt&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:37:07.000Z&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;updatedAt&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:37:07.000Z&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;ip&#34;</span><span class="p">:</span><span class="s2">&#34;223.104.150.16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;link&#34;</span><span class="p">:</span><span class="kc">null</span><span class="p">,</span><span class="nt">&#34;mail&#34;</span><span class="p">:</span><span class="s2">&#34;2868301418@qq.com&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;nick&#34;</span><span class="p">:</span><span class="s2">&#34;2868301418&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;ua&#34;</span><span class="p">:</span><span class="s2">&#34;Mozilla\/5.0 (Linux; Android 13; V2171A Build\/TP1A.220624.014; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/109.0.5414.86 MQQBrowser\/6.2 TBS\/046605 Mobile Safari\/537.36 V1_AND_SQ_8.9.63_4190_HDBM_T QQ\/8.9.63.11380 NetType\/4G WebP\/0.3.0 Ap&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;url&#34;</span><span class="p">:</span><span class="s2">&#34;\/\u4ea4\u53cb\u6807\u51c6-\u548c\u5e73\u5171\u5904\u4e94\u9879\u539f\u5219.html&#34;</span><span class="p">}</span><span class="err">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="nt">&#34;objectId&#34;</span><span class="p">:</span><span class="s2">&#34;4&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;QQAvatar&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;comment&#34;</span><span class="p">:</span><span class="s2">&#34;\u600e\u4e48ip\u4e0d\u5bf9&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;insertedAt&#34;</span><span class="p">:{</span><span class="nt">&#34;__type&#34;</span><span class="p">:</span><span class="s2">&#34;Date&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;iso&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:38:15.000Z&#34;</span><span class="p">},</span><span class="nt">&#34;createdAt&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:38:15.000Z&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;updatedAt&#34;</span><span class="p">:</span><span class="s2">&#34;2023-06-27T09:38:15.000Z&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;ip&#34;</span><span class="p">:</span><span class="s2">&#34;223.104.150.16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;link&#34;</span><span class="p">:</span><span class="kc">null</span><span class="p">,</span><span class="nt">&#34;mail&#34;</span><span class="p">:</span><span class="s2">&#34;2868301418@qq.com&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;nick&#34;</span><span class="p">:</span><span class="s2">&#34;2868301418&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;ua&#34;</span><span class="p">:</span><span class="s2">&#34;Mozilla\/5.0 (Linux; Android 13; V2171A Build\/TP1A.220624.014; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/109.0.5414.86 MQQBrowser\/6.2 TBS\/046605 Mobile Safari\/537.36 V1_AND_SQ_8.9.63_4190_HDBM_T QQ\/8.9.63.11380 NetType\/4G WebP\/0.3.0 Ap&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;url&#34;</span><span class="p">:</span><span class="s2">&#34;\/\u4ea4\u53cb\u6807\u51c6-\u548c\u5e73\u5171\u5904\u4e94\u9879\u539f\u5219.html&#34;</span><span class="p">}</span><span class="err">,</span>
</span></span></code></pre></div><h3 id="common-field-descriptions">
<a class="header-anchor" href="#common-field-descriptions"></a>
Common Field Descriptions
</h3><ol>
<li><strong>objectId</strong>: Unique identifier for the comment (e.g., &ldquo;4&rdquo; or &ldquo;5&rdquo;)</li>
<li><strong>QQAvatar</strong>: QQ avatar link (currently empty)</li>
<li><strong>comment</strong>: Comment content (contains Unicode escape sequences, e.g., <code>\u600e\u4e48</code> means &ldquo;how&rdquo;)</li>
<li><strong>insertedAt/createdAt/updatedAt</strong>: Timestamp (ISO 8601 format)</li>
<li><strong>ip</strong>: Commenter&rsquo;s IP address</li>
<li><strong>link</strong>: Link provided by the commenter (may be <code>null</code>)</li>
<li><strong>mail</strong>: Commenter&rsquo;s email address</li>
<li><strong>nick</strong>: Commenter&rsquo;s nickname</li>
<li><strong>ua</strong>: User agent (browser/device info)</li>
<li><strong>url</strong>: Relative path of the commented post</li>
</ol>
<h3 id="special-fields">
<a class="header-anchor" href="#special-fields"></a>
Special Fields
</h3><ol start="11">
<li><strong>pid</strong>: Parent comment ID</li>
<li><strong>rid</strong>: Root comment ID</li>
</ol>
<p>If <code>&quot;link&quot;</code> is <code>null</code>, there&rsquo;s no line break between <code>&quot;link&quot;</code> and <code>&quot;mail&quot;</code>. JSON is insensitive to line breaks, so this can be ignored.<br>
Now, wrap the entire content in <code>[ ]</code> at the beginning and end of the file, then save it.</p>
<h2 id="modifying-comment-attributes">
<a class="header-anchor" href="#modifying-comment-attributes"></a>
Modifying Comment Attributes
</h2><p>The file can now be imported into LeanCloud, but some adjustments are still needed.</p>
<p><code>Export2Valine</code> sets the URL for comment associations as <code>\/slug</code>, e.g., <code>&quot;url&quot;: &quot;\/Summary-of-the-First-Semester-of-Junior-Year.html&quot;</code>, where <code>\/</code> is an escaped <code>/</code>.</p>
<p>To link comments to the new blog&rsquo;s posts, manually update the <code>url</code> to match the new blog&rsquo;s post links.</p>
<p>For example, my Hugo-generated site has folders like <code>zh-cn</code>, <code>zh-tw</code>, <code>en</code>, and <code>ja</code> (due to multi-language support). Chinese posts are under <code>/zh-cn/post/category/</code>.<br>
In my local blog source files, posts are organized into folders by category, e.g., <code>/content/post/Thoughts/最近写的诗.md</code> generates a relative URL like <code>zh-cn/post/thoughts/最近写的诗</code>.</p>
<p>If your new blog&rsquo;s posts are in the root directory with unchanged names, no URL modifications are needed.<br>
If they&rsquo;re all under <code>/post/</code>, use Find and Replace to change:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;url&#34;</span><span class="err">:&#34;\/</span>
</span></span></code></pre></div><p>to:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;url&#34;</span><span class="err">:&#34;\/post\/</span>
</span></span></code></pre></div><p>For my case, I temporarily replaced it with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;url&#34;</span><span class="err">:&#34;\/zh-cn\/post\/</span>
</span></span></code></pre></div><p>Similarly, comments on standalone pages like &ldquo;Friends&rdquo; or &ldquo;Thoughts&rdquo; should be updated to their new relative URLs.<br>
For example, the Friends page:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;url&#34;</span><span class="err">:&#34;\/links.html</span>
</span></span></code></pre></div><p>should be replaced with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="s2">&#34;url&#34;</span><span class="err">:&#34;\/zh-cn\/friend\/</span>
</span></span></code></pre></div><p>First, apply bulk replacements for <code>post</code> and standalone pages where possible. Otherwise, it&rsquo;ll be tedious to modify them after import.</p>
<p>When using Find and Replace, try to target the largest common segments to avoid accidental changes.<br>
<em><strong>Remember to escape <code>\/</code>!!!</strong></em></p>
<h2 id="importing-to-leancloud">
<a class="header-anchor" href="#importing-to-leancloud"></a>
Importing to LeanCloud
</h2><p>In LeanCloud&rsquo;s console → Data Storage → Import &amp; Export, select the modified JSON file, set <code>Class</code> to <code>Comment</code>, and import.</p>
<p><em><strong>Note</strong></em>: If you&rsquo;ve previously tested Waline comments or attempted to import <code>Comment</code>, Waline may have already created the <code>Comment</code> class. Subsequent imports will fail silently (LeanCloud may claim success, but no new data appears).</p>
<p>To fix this, go to the console → Structured Data, delete the <code>Comment</code> class, and try importing again. The LeanCloud page may not refresh immediately—use <code>Ctrl+F5</code> to force a cache refresh.</p>
<p>After a successful import, manually adjust the <code>url</code> for each comment.<br>
For example, my posts need to be categorized under <code>&quot;url&quot;:&quot;\/zh-cn\/post\/category\/</code>. Use LeanCloud&rsquo;s <strong>batch operations</strong> and <strong>filtering</strong> features to streamline this process.</p>
<h2 id="afterword">
<a class="header-anchor" href="#afterword"></a>
Afterword
</h2><p>Organizing comments didn&rsquo;t take too long—120 comments, mostly my own musings on the &ldquo;Thoughts&rdquo; page, allowed for bulk URL fixes. The handful of reader comments were scattered across just a few posts, making them easy to update via filtering. Whether that&rsquo;s a good or bad thing, I’m not sure (laughs).</p>
<p>Whether they&rsquo;re my soliloquies or others&rsquo; remarks, each comment holds unique significance. Revisiting them periodically brings new reflections.<br>
As I said at the beginning, they&rsquo;re traces of my growth, proof of my existence, and part of &ldquo;me&rdquo;.</p>
<p>And you, dear reader, are the one who gives me value.</p>
<p>If you have time, please leave a comment—it’ll genuinely make my day (as long as it’s kind, of course).</p>
        
        <hr><p>Published on 2025-04-19 at <a href='https://www.guzhengsvt.cn/'>孤筝の温暖小家</a>, last modified on 2025-04-19</p><p>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</p>]]></description><category>OtherNotes</category></item><item><title>Hello World</title><link>https://www.guzhengsvt.cn/en/post/thoughts/hello-world/</link><pubDate>Sun, 13 Apr 2025 11:00:00 +0800</pubDate><author>lvbowen040427@163.com (孤筝)</author><guid>https://www.guzhengsvt.cn/en/post/thoughts/hello-world/</guid><description>
<![CDATA[<h1>Hello World</h1><p>Author: 孤筝(lvbowen040427@163.com)</p>
        
          <h2 id="20250413">
<a class="header-anchor" href="#20250413"></a>
2025.04.13
</h2><p>After two days of tinkering, I finally set up my Hugo blog using the <a href="https://github.com/D-Sketon/hexo-theme-reimu">reimu</a> theme.</p>
<p>Unsatisfied with the response speed of my previous <a href="https://guzhengsvt.top/">Typecho blog</a>, I decided to migrate my blog again. (Although Typecho is already quite lightweight, the poor cloud server and bandwidth severely limited access and article loading speeds.)</p>
<p>After abandoning dynamic solutions, the static options available were essentially Hexo, Hugo, Jekyll, etc. I chose Hugo simply because of its slogan: <em><strong>The world’s fastest framework for building websites</strong></em>.</p>
<p>I’ll gradually move the content from my old blog over here during this time. I looked up some Typecho-to-Hugo conversion methods, but most were outdated and unusable (Typecho and PHP are too old, which is another reason for my switch). I’ll have to resort to the tedious method of manually exporting articles, editing them, and importing them into Hugo.</p>
<p>I also need to figure out how to replicate comments and &ldquo;shuoshuo&rdquo; (microblogging). Hugo requires an external commenting system.</p>
<p>Then, to speed up image loading, I’ll need to set up an image hosting service and replace the image links in previous articles.</p>
<p>To avoid irreversible impacts on the old blog, Hugo is currently hosted on GitHub Pages. However, GitHub is unstable in China, so once I’ve fully migrated the content and completed the setup, I’ll copy it to my cloud virtual host.</p>
<p>Why is there so much to do? Damn.</p>
<h2 id="test">
<a class="header-anchor" href="#test"></a>
Test
</h2><p>Testing the new blog.</p>
<p>markdown</p>
<h2 id="level-2-heading">
<a class="header-anchor" href="#level-2-heading"></a>
Level 2 Heading
</h2><h3 id="level-3-heading">
<a class="header-anchor" href="#level-3-heading"></a>
Level 3 Heading
</h3><h4 id="level-4-heading">
<a class="header-anchor" href="#level-4-heading"></a>
Level 4 Heading
</h4><h5 id="level-5-heading">
<a class="header-anchor" href="#level-5-heading"></a>
Level 5 Heading
</h5><h6 id="level-6-heading">
<a class="header-anchor" href="#level-6-heading"></a>
Level 6 Heading
</h6><ol>
<li>Item</li>
<li>Item</li>
</ol>
<ul>
<li>Item</li>
</ul>
<p><del>Strikethrough</del></p>
<p><strong>Bold</strong></p>
<p><em>Italic</em></p>
<p>KaTex test</p>
<p>$\frac{1}{2}$</p>
$$
\frac{520}{1314}
$$<p>code test</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>icon: <!-- raw HTML omitted --><!-- raw HTML omitted --> A cup of coffee</p>

        
        <hr><p>Published on 2025-04-13 at <a href='https://www.guzhengsvt.cn/'>孤筝の温暖小家</a>, last modified on 2025-04-13</p><p>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</p>]]></description><category>Thoughts</category></item><item><title>New Domain</title><link>https://www.guzhengsvt.cn/en/post/thoughts/%E6%96%B0%E5%A2%9E%E5%9F%9F%E5%90%8D/</link><pubDate>Sat, 25 Nov 2023 18:59:05 +0800</pubDate><author>lvbowen040427@163.com (孤筝)</author><guid>https://www.guzhengsvt.cn/en/post/thoughts/%E6%96%B0%E5%A2%9E%E5%9F%9F%E5%90%8D/</guid><description>
<![CDATA[<h1>New Domain</h1><p>Author: 孤筝(lvbowen040427@163.com)</p>
        
          <p>I purchased a new domain, guzhengsvt.cn, on Alibaba Cloud.</p>
<p>(Used a coupon for 29￥ the first year, with a renewal fee of 39￥ annually).</p>
<p>Originally, I intended to use it temporarily for WeChat Mini Program development, but it wasn&rsquo;t needed, so I ended up pointing it to my blog instead.</p>
<p>Since multi-domain SSL certificates are too expensive, I used the <a href="https://www.mfpad.com/">MiFa</a> domain redirection service to redirect guzhengsvt.cn to guzhengsvt.top.</p>
<p>I already had an Alibaba Cloud-signed SSL certificate for the .top domain, expiring in August 2024. However, on November 14 this year, Alibaba Cloud updated its free SSL certificate policy—now allowing only single-domain SSL certificates with a maximum validity of 3 months per application. This means I’d have to frequently renew the certificate for the newly purchased .cn domain (though I don’t really need it right now anyway).</p>
<p>I reviewed the steps for domain resolution and SSL certificate application/configuration, and I must thank <a href="https://www.vpsor.cn/">VPSor</a> for how easy their SSL certificate setup is.<br>
<del>I was going to praise Alibaba Cloud’s SSL certificate service too, but&hellip; well, emmm.</del></p>
        
        <hr><p>Published on 2023-11-25 at <a href='https://www.guzhengsvt.cn/'>孤筝の温暖小家</a>, last modified on 2023-11-25</p><p>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</p>]]></description><category>Thoughts</category></item><item><title>Blog Setup Summary (Hexo + GitHub Version)</title><link>https://www.guzhengsvt.cn/en/post/thoughts/blog%E5%BB%BA%E6%88%90%E6%80%BB%E7%BB%93hexo+github%E7%89%88/</link><pubDate>Sat, 10 Sep 2022 09:30:52 +0800</pubDate><author>lvbowen040427@163.com (孤筝)</author><guid>https://www.guzhengsvt.cn/en/post/thoughts/blog%E5%BB%BA%E6%88%90%E6%80%BB%E7%BB%93hexo+github%E7%89%88/</guid><description>
<![CDATA[<h1>Blog Setup Summary (Hexo + GitHub Version)</h1><p>Author: 孤筝(lvbowen040427@163.com)</p>
        
          <p><strong>Early Website Record (Inactive, Preserved for Commemoration)</strong></p>
<p><a href="https://guzhengsvt.github.io">https://guzhengsvt.github.io</a></p>
<p>A personal blog built with GitHub+Hexo. The main functionalities have been completed.</p>
<p>After two days of intense work, I’ve finally realized a two-year dream—creating my own personal website (blog). In this noisy era of conformity and silence, this serves as a small piece of internet territory I can call my own.</p>
<p>The idea of building a blog originated two years ago when I stumbled upon beautifully crafted blogs by experts while surfing the web for resources. In the early stages, I was groping in the dark—knowing nothing, with poor English skills, and no money to buy a domain or server. Due to academic pressures in my senior year of high school, the project was paused for a year, and the domain I bought on Alibaba Cloud even expired.</p>
<p>I’m grateful to all the individuals, platforms, companies, and communities who helped me along the way.</p>
<p>Here’s the acknowledgments list (in no particular order):</p>
<p>Special thanks to the expert from USTC for helping me troubleshoot the issue where only Git Bash could reliably control operations across multiple terminals;</p>
<p>Thanks to GitHub for providing an open-source platform;</p>
<p>Thanks to GitHub and Sanfengyun for offering free servers;</p>
<p>Thanks to Fuukei Sakurairo and NexT for theme support;</p>
<p>Thanks to mukes for the Git installation tutorial (<a href="https://blog.csdn.net/mukes%29;">https://blog.csdn.net/mukes);</a></p>
<p>Thanks to He Xin for the Hexo environment setup guide (<a href="https://www.simon96.online/%29;">https://www.simon96.online/);</a></p>
<p>Thanks to Snail Not Ox for the NexT theme beautification methods (<a href="https://blog.csdn.net/qq_34003239?type=blog%29;">https://blog.csdn.net/qq_34003239?type=blog);</a></p>
<p>Thanks to siriyang for the Git study notes (<a href="https://blog.siriyang.cn/%29;">https://blog.siriyang.cn/);</a></p>
<p>Thanks to ookamiAntD for the foundational tutorial on building a personal blog with Hexo+Github+Coding (<a href="https://yangbingdong.com/%29;">https://yangbingdong.com/);</a></p>
<p>Thanks to reuixiy for the in-depth optimization guide for Hexo + NexT + GitHub Pages (<a href="https://io-oi.me/%29">https://io-oi.me/)</a>.</p>
<p>Some references could no longer be traced to their authors, or the authors’ blogs were closed for various reasons. I apologize for not listing them all.</p>
<p>Feel free to bookmark and share my blog. I’ll update it periodically with content including but not limited to:</p>
<p>Improvements to the blog’s functionalities</p>
<p>Personal musings/rants</p>
<p>All kinds of serious and not-so-serious learning materials</p>
<p>Technical guides</p>
<p>Poems and articles I’ve written in the past</p>
<p>Lastly, happy Mid-Autumn Festival to everyone, and happy Teachers’ Day to all educators and those who aspire to become teachers.</p>
<p>That’s all.</p>
<p>Saturday, September 10, 2022</p>
        
        <hr><p>Published on 2022-09-10 at <a href='https://www.guzhengsvt.cn/'>孤筝の温暖小家</a>, last modified on 2022-09-10</p><p>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</p>]]></description><category>Thoughts</category></item></channel></rss>