<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on 资深网民孙先生</title>
    <link>https://blog.sunpeiwen.com/posts/</link>
    <description>Recent content in Posts on 资深网民孙先生</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 18 Sep 2025 03:30:00 +0000</lastBuildDate>
    <atom:link href="https://blog.sunpeiwen.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用cloudflare workers&#43;R2 实现相册功能</title>
      <link>https://blog.sunpeiwen.com/posts/use-cloudflare-workers-r2-album/</link>
      <pubDate>Thu, 18 Sep 2025 03:30:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/use-cloudflare-workers-r2-album/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;白嫖cloudflare的R2存储图片，然后用workers实现一个简单的相册功能&lt;/p&gt;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;注册Cloudflare账号，创建R2存储桶（bucket）和Workers KV命名空间&lt;/li&gt;&#xA;&lt;li&gt;在R2存储桶中上传一些图片（支持jpg、jpeg、png、gif、webp格式）&lt;/li&gt;&#xA;&lt;li&gt;创建一个新的Cloudflare Workers脚本，复制以下代码并粘贴到脚本编辑器中&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;URL&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 相册主页&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;generateAlbumPage&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 搜索接口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/search&amp;#39;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;searchParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;searchImages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 图片代理（解决跨域问题）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;startsWith&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/image/&amp;#39;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; decodeURIComponent(&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;slice&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;serveImage&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Not Found&amp;#39;&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;404&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 提取文件名的基本部分（不含路径和扩展名）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getBaseName&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 去除路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filename&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lastIndexOf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 去除扩展名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filename&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;filename&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lastIndexOf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 计算相对时间&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;timeAgo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;timestamp&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;seconds&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Date() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Date(&lt;span style=&#34;color:#a6e22e&#34;&gt;timestamp&lt;/span&gt;)) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 定义时间间隔&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;intervals&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;31536000&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2592000&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;week&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;604800&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;86400&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;hour&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3600&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;minute&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 如果小于30秒&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;seconds&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;刚刚&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 计算时间差&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;intervals&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;seconds&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;intervals&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;前`&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// 1天前&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;counter&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;前`&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// 2天前&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;刚刚&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 生成相册页面&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;generateAlbumPage&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;listAllImages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;!DOCTYPE html&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;html&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;head&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;title&amp;gt;浪子的相册 - 且听风吟&amp;lt;/title&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;style&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        body { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-family: Arial, sans-serif; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          max-width: 1200px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          margin: 0 auto; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: #f5f5f5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .search { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          margin-bottom: 20px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: flex;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          gap: 10px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .search input {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          flex: 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 10px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border: 1px solid #ddd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border-radius: 4px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .search button {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 10px 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: #4CAF50;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border: none;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border-radius: 4px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          cursor: pointer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .search button:hover {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: #45a049;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .grid { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: grid; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          gap: 20px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border: 1px solid #ddd; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border-radius: 8px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          overflow: hidden; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          box-shadow: 0 2px 4px rgba(0,0,0,0.1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          transition: transform 0.3s ease;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          cursor: pointer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card:hover {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          transform: translateY(-5px);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          box-shadow: 0 4px 8px rgba(0,0,0,0.2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card img { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          width: 100%; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          height: 200px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          object-fit: cover; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card-info { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 10px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card-name { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-weight: bold; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          margin-bottom: 5px; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          word-break: break-word;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .card-meta {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-size: 0.9em;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: #666;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .time-ago {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: #4CAF50;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-weight: 500;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        /* 灯箱样式 */&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: none;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          position: fixed;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          top: 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          left: 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          width: 100%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          height: 100%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: rgba(0, 0, 0, 0.9);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          z-index: 1000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          text-align: center;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          box-sizing: border-box;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-content {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          position: relative;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          max-width: 90%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          max-height: 90%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          margin: 0 auto;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: inline-block;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox img {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          max-width: 100%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          max-height: 90vh;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          object-fit: contain;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border: 2px solid white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          box-shadow: 0 0 20px rgba(0,0,0,0.5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-caption {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          margin-top: 15px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-size: 18px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-close {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          position: absolute;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          top: 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          right: 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-size: 30px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          cursor: pointer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          z-index: 1001;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-nav {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          position: absolute;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          top: 50%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          width: 100%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          transform: translateY(-50%);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: flex;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          justify-content: space-between;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          padding: 0 20px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          box-sizing: border-box;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-nav button {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: rgba(255, 255, 255, 0.2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          color: white;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border: none;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          border-radius: 50%;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          width: 50px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          height: 50px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          font-size: 24px;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          cursor: pointer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          display: flex;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          align-items: center;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          justify-content: center;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          transition: background-color 0.3s;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        .lightbox-nav button:hover {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          background-color: rgba(255, 255, 255, 0.4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;/style&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;/head&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;body&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;h1&amp;gt;且听风吟&amp;lt;/h1&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;div class=&amp;#34;search&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;input type=&amp;#34;text&amp;#34; id=&amp;#34;searchInput&amp;#34; placeholder=&amp;#34;搜索&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;button onclick=&amp;#34;searchImages()&amp;#34;&amp;gt;Search&amp;lt;/button&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;div id=&amp;#34;imageGrid&amp;#34; class=&amp;#34;grid&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;) =&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;div class=&amp;#34;card&amp;#34; data-index=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; onclick=&amp;#34;openLightbox(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;lt;img src=&amp;#34;/image/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;encodeURIComponent(&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; alt=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;lt;div class=&amp;#34;card-info&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;div class=&amp;#34;card-name&amp;#34;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getBaseName&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;div class=&amp;#34;card-meta&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;               &amp;lt;!-- Size: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;formatBytes&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; | --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                &amp;lt;span class=&amp;#34;time-ago&amp;#34; data-timestamp=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;uploaded&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;timeAgo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;uploaded&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/span&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        `&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;!-- 灯箱 --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;div id=&amp;#34;lightbox&amp;#34; class=&amp;#34;lightbox&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;span class=&amp;#34;lightbox-close&amp;#34; onclick=&amp;#34;closeLightbox()&amp;#34;&amp;gt;&amp;amp;times;&amp;lt;/span&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;div class=&amp;#34;lightbox-content&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;img id=&amp;#34;lightbox-img&amp;#34; src=&amp;#34;&amp;#34; alt=&amp;#34;&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;div id=&amp;#34;lightbox-caption&amp;#34; class=&amp;#34;lightbox-caption&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;div class=&amp;#34;lightbox-nav&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;button id=&amp;#34;prev-btn&amp;#34; onclick=&amp;#34;changeImage(-1)&amp;#34;&amp;gt;&amp;amp;#10094;&amp;lt;/button&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;lt;button id=&amp;#34;next-btn&amp;#34; onclick=&amp;#34;changeImage(1)&amp;#34;&amp;gt;&amp;amp;#10095;&amp;lt;/button&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;script&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 提取文件名的基本部分（不含路径和扩展名）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function getBaseName(key) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 去除路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const filename = key.substring(key.lastIndexOf(&amp;#39;/&amp;#39;) + 1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 去除扩展名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          return filename.substring(0, filename.lastIndexOf(&amp;#39;.&amp;#39;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 计算相对时间&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function timeAgo(timestamp) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const seconds = Math.floor((new Date() - new Date(timestamp)) / 1000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 定义时间间隔&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const intervals = {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            year: 31536000,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            month: 2592000,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            week: 604800,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            day: 86400,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            hour: 3600,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            minute: 60&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 如果小于30秒&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (seconds &amp;lt; 30) return &amp;#39;刚刚&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 计算时间差&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          let counter;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          for (const i in intervals) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            counter = Math.floor(seconds / intervals[i]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            if (counter &amp;gt; 0) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              if (counter === 1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                return \`\${counter} \${i} Ago\`; // 1天前&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              } else {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                return \`\${counter} \${i} Ago\`; // 2天前&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          return &amp;#39;刚刚&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 更新所有时间显示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function updateTimeAgoElements() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const timeElements = document.querySelectorAll(&amp;#39;.time-ago&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          timeElements.forEach(element =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            const timestamp = element.getAttribute(&amp;#39;data-timestamp&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            element.textContent = timeAgo(timestamp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 存储所有图片信息&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        const allImages = &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        let currentImageIndex = 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 打开灯箱&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function openLightbox(index) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          currentImageIndex = index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          showImage(index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.getElementById(&amp;#39;lightbox&amp;#39;).style.display = &amp;#39;block&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.body.style.overflow = &amp;#39;hidden&amp;#39;; // 防止背景滚动&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 关闭灯箱&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function closeLightbox() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.getElementById(&amp;#39;lightbox&amp;#39;).style.display = &amp;#39;none&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.body.style.overflow = &amp;#39;auto&amp;#39;; // 恢复背景滚动&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 显示指定索引的图片&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function showImage(index) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (index &amp;lt; 0) index = allImages.length - 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (index &amp;gt;= allImages.length) index = 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          currentImageIndex = index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const img = allImages[index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.getElementById(&amp;#39;lightbox-img&amp;#39;).src = &amp;#39;/image/&amp;#39; + encodeURIComponent(img.key);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.getElementById(&amp;#39;lightbox-img&amp;#39;).alt = img.key;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          document.getElementById(&amp;#39;lightbox-caption&amp;#39;).innerHTML = &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;#39;&amp;lt;strong&amp;gt;&amp;#39; + getBaseName(img.key) + &amp;#39;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;#39; +&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;#39;Size: &amp;#39; + formatBytes(img.size) + &amp;#39; | &amp;#39; + &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;#39;&amp;lt;span class=&amp;#34;time-ago&amp;#34;&amp;gt;&amp;#39; + timeAgo(img.uploaded) + &amp;#39;&amp;lt;/span&amp;gt;&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 切换图片&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function changeImage(direction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          showImage(currentImageIndex + direction);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 搜索图片&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        async function searchImages() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const query = document.getElementById(&amp;#39;searchInput&amp;#39;).value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const response = await fetch(&amp;#39;/search?q=&amp;#39; + encodeURIComponent(query));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const images = await response.json();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const grid = document.getElementById(&amp;#39;imageGrid&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          grid.innerHTML = images.map((img, index) =&amp;gt; \`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;lt;div class=&amp;#34;card&amp;#34; data-index=&amp;#34;\${index}&amp;#34; onclick=&amp;#34;openLightbox(\${index})&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;img src=&amp;#34;/image/\${encodeURIComponent(img.key)}&amp;#34; alt=&amp;#34;\${img.key}&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;div class=&amp;#34;card-info&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                &amp;lt;div class=&amp;#34;card-name&amp;#34;&amp;gt;\${getBaseName(img.key)}&amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                &amp;lt;div class=&amp;#34;card-meta&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                  Size: \${formatBytes(img.size)} | &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                  &amp;lt;span class=&amp;#34;time-ago&amp;#34; data-timestamp=&amp;#34;\${img.uploaded}&amp;#34;&amp;gt;\${timeAgo(img.uploaded)}&amp;lt;/span&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            &amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          \`).join(&amp;#39;&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          // 更新全局图片列表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          allImages.length = 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          allImages.push(...images);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 格式化字节大小&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        function formatBytes(bytes) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (bytes === 0) return &amp;#39;0 Bytes&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const k = 1024;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const sizes = [&amp;#39;Bytes&amp;#39;, &amp;#39;KB&amp;#39;, &amp;#39;MB&amp;#39;, &amp;#39;GB&amp;#39;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          const i = Math.floor(Math.log(bytes) / Math.log(k));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + &amp;#39; &amp;#39; + sizes[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 键盘事件监听&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        document.addEventListener(&amp;#39;keydown&amp;#39;, function(e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (document.getElementById(&amp;#39;lightbox&amp;#39;).style.display === &amp;#39;block&amp;#39;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            if (e.key === &amp;#39;Escape&amp;#39;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              closeLightbox();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            } else if (e.key === &amp;#39;ArrowLeft&amp;#39;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              changeImage(-1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            } else if (e.key === &amp;#39;ArrowRight&amp;#39;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              changeImage(1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 点击灯箱背景关闭&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        document.getElementById(&amp;#39;lightbox&amp;#39;).addEventListener(&amp;#39;click&amp;#39;, function(e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if (e.target === this) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            closeLightbox();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 初始更新时间显示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        updateTimeAgoElements();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        // 每分钟更新一次时间显示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        setInterval(updateTimeAgoElements, 60000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;lt;/script&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;/body&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;/html&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  `&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;html&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;text/html&amp;#39;&lt;/span&gt; } });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 搜索图片&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;searchImages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;listAllImages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filtered&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt; =&amp;gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;img&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toLowerCase&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;includes&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toLowerCase&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;filtered&lt;/span&gt;), {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取所有图片列表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;listAllImages&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 尝试从KV缓存获取&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cacheKey&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;image-index&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cached&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ALBUM_KV&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cacheKey&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cached&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cached&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 从R2获取最新列表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;objects&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;limit&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt; };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;MY_R2_BUCKET&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;objects&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(...&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;objects&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; =&amp;gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;match&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;/\.(jpg|jpeg|png|gif|webp)$/i&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;truncated&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cursor&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 转换为需要的格式&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;objects&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; =&amp;gt; ({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;uploaded&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;uploaded&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 缓存结果（TTL 1小时）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;waitUntil&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ALBUM_KV&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cacheKey&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt;), { &lt;span style=&#34;color:#a6e22e&#34;&gt;expirationTtl&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3600&lt;/span&gt; }));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;images&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 代理图片服务&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;serveImage&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;MY_R2_BUCKET&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Not Found&amp;#39;&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;404&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Headers&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;writeHttpMetadata&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Cache-Control&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;public, max-age=31536000&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt; });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;formatBytes&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;bytes&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0 Bytes&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sizes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bytes&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;KB&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;MB&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GB&amp;#39;&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;(Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;bytes&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; parseFloat((&lt;span style=&#34;color:#a6e22e&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;pow&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;k&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;)).&lt;span style=&#34;color:#a6e22e&#34;&gt;toFixed&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sizes&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在脚本设置中，绑定R2存储桶和KV命名空间：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mastodon v4.4.0升级指南</title>
      <link>https://blog.sunpeiwen.com/posts/mastodon-4-4-0-upgrade-guide/</link>
      <pubDate>Thu, 04 Sep 2025 11:42:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/mastodon-4-4-0-upgrade-guide/</guid>
      <description>&lt;h2 id=&#34;升级指南&#34;&gt;升级指南&lt;/h2&gt;&#xA;&lt;p&gt;最最最最重要的莫过于先备份数据库了&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker exec mastodon-db-1 pg_dump -Fc -U postgres postgres &amp;gt; name_of_the_backup.dump&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;从43x-升级到-440&#34;&gt;从4.3.X 升级到 4.4.0&lt;/h3&gt;&#xA;&lt;p&gt;按照官方给出的提示 要求先升级到4.3.9版本&lt;/p&gt;&#xA;&lt;p&gt;然后再一次操作&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;通过设置环境变量 &lt;code&gt;SKIP_POST_DEPLOYMENT_MIGRATIONS&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt; 来运行预部署数据库迁移：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web bundle exec rails db:migrate&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;重启所有 Mastodon 进程。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;运行部署后的数据库迁移：&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker-compose run --rm web bundle exec rails db:migrate&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;如果您使用 &lt;code&gt;Elasticsearch&lt;/code&gt; 或 &lt;code&gt;OpenSearch&lt;/code&gt;，请使用&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker-compose run --rm web bin/tootctl search deploy --only-mapping -only=accounts&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重建账户搜索索引映射。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用Docker快速部署邮件服务器 Mailserver</title>
      <link>https://blog.sunpeiwen.com/posts/use-docker-deploy-mailserver/</link>
      <pubDate>Mon, 26 May 2025 03:30:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/use-docker-deploy-mailserver/</guid>
      <description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;&#xA;&lt;p&gt;想部署一个简单的邮件服务器 抛弃各种免费的企业邮局&lt;/p&gt;&#xA;&lt;p&gt;主要是因为有太多账号都已经忘记了,而找回账号又是一阵折腾.&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署&#34;&gt;部署&lt;/h2&gt;&#xA;&lt;h3 id=&#34;docker-compose-方式部署&#34;&gt;Docker Compose 方式部署&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;mailserver&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/docker-mailserver/docker-mailserver&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mailserver&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#env_file: ./.env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;retries&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ss --listening --tcp | grep -P &amp;#39;LISTEN.+:smtp&amp;#39; || exit 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mail.imsun.org&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;143&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;143&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;465&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;465&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;587&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;587&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;993&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;993&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;stop_grace_period&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1m&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data/dms/mail-data/:/var/mail/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data/dms/mail-state/:/var/mail-state/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data/dms/mail-logs/:/var/log/mail/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data/dms/config/:/tmp/docker-mailserver/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;务必开放以上端口 &lt;code&gt;25&lt;/code&gt; &lt;code&gt;143&lt;/code&gt; &lt;code&gt;465&lt;/code&gt; &lt;code&gt;587&lt;/code&gt; &lt;code&gt;993&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;如服务器端口被封禁则可以映射到其他端口&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;创建账户&#34;&gt;创建账户&lt;/h3&gt;&#xA;&lt;p&gt;启动容器之后&lt;/p&gt;&#xA;&lt;p&gt;在容器中执行&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setup email add admin@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入密码&#xA;重复确认密码&#xA;以&lt;code&gt;example.com&lt;/code&gt;域名为例&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用n8n自动同步Mastodon嘟文到博客说说</title>
      <link>https://blog.sunpeiwen.com/posts/mastodon-to-blog/</link>
      <pubDate>Fri, 18 Apr 2025 09:57:01 +0800</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/mastodon-to-blog/</guid>
      <description>&lt;h2 id=&#34;思路&#34;&gt;思路&lt;/h2&gt;&#xA;&lt;p&gt;从长毛象获取嘟文，然后使用n8n的webhook功能将嘟文推送到博客的github所在的仓库。&#xA;触发github的action，将备份的嘟文.md文件生成网页，然后推送到博客的gh-pages分支。&lt;/p&gt;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;安装n8n&lt;/li&gt;&#xA;&lt;li&gt;在mastodon设置webhook&lt;/li&gt;&#xA;&lt;li&gt;在github中创建action&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;n8n流程使用蜗牛大大的https://e5n.cc/@eallion/114184519111953516&#xA;在此基础上修改部分内容。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取 mix_content 和 createdAt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ID&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Fetch Latest Mastodon&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createdAt&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Fetch Latest Mastodon&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;created_at&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;URL&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Fetch Latest Mastodon&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mixContent&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Mix Content&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;mix_content&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 解析 created_at 时间戳&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Date(&lt;span style=&#34;color:#a6e22e&#34;&gt;createdAt&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getFullYear&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String(&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMonth&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;padStart&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 月份从0开始，需要加1，并补零&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String(&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDate&lt;/span&gt;()).&lt;span style=&#34;color:#a6e22e&#34;&gt;padStart&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 补零&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hours&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String(&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getHours&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;padStart&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 补零&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;minutes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String(&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMinutes&lt;/span&gt;()).&lt;span style=&#34;color:#a6e22e&#34;&gt;padStart&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 补零&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;seconds&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String(&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getSeconds&lt;/span&gt;()).&lt;span style=&#34;color:#a6e22e&#34;&gt;padStart&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 补零&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 格式化时间戳&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;formattedTimestamp&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;hours&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;minutes&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seconds&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 将时间戳添加到 mixContent 中&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;contentWithTimestamp&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`---\ntitle: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\ndate: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;formattedTimestamp&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\n\n--- \n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mixContent&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 拼接文件路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;githubFilePath&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`content/zh-cn/memo/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ID&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.md`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 返回结果&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;github_file_name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;githubFilePath&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;contentWithTimestamp&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;commit_message&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;URL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在获取内容的时候加入 &lt;code&gt;Front-matter&lt;/code&gt;, 然后将内容保存到 &lt;code&gt;content/zh-cn/memo/${ID}.md&lt;/code&gt; 中。&lt;/p&gt;</description>
    </item>
    <item>
      <title>清明节 · 香港一日游</title>
      <link>https://blog.sunpeiwen.com/posts/hongkong/</link>
      <pubDate>Wed, 02 Apr 2025 12:13:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/hongkong/</guid>
      <description>&lt;p&gt;清明节 · 香港一日游&#xA;作为一个在广东生活了十几年的人来说,没去过香港算不算得上是一件很稀罕的事儿呢?&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;e8a7bb79f9e1c1fa9b324c9c0787a213&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/693021633.jpeg&#34; alt=&#34;老板请客&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;老板请客&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;不得不说,香港的物价真的离谱.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;4309185ef3d5d1dfacbdb77fb815baa0&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/1497396378.jpeg&#34; alt=&#34;香港街头&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;香港街头&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;5754c260c33df08930651a5ca74511b0&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/669250697.jpeg&#34; alt=&#34;摩天轮&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;摩天轮&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;游客贼多,摩天轮都要排队两小时&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;c673f79df22f59159fe9c46714cdd201&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/4031624192.jpeg&#34; alt=&#34;菲佣节日聚会&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;菲佣节日聚会&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;天桥下,地下通道出入口很多菲律宾人&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;00d7854089290fd693bc6ae0442ac98a&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/3296055281.jpeg&#34; alt=&#34;摆渡轮&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;摆渡轮&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;坐摆渡轮也排队一个小时&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;317dfc68011d2cc3662186a8ed82a88d&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/85301130.jpeg&#34; alt=&#34;星光大道&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;星光大道&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;550465c69ea810618acfe5d2d7e90ed1&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/2798575111.jpeg&#34; alt=&#34;星光大道&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;星光大道&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://img.imsun.org/2025/04/4244190896.jpeg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;afb65659da73a6f2957d910a56a696a0&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/3247258633.jpeg&#34; alt=&#34;星光大道李小龙&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;星光大道李小龙&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://img.imsun.org/2025/04/3343019948.jpeg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;30e7644e67d473f9816eb7c549186d79&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2025/04/3592311540.jpeg&#34; alt=&#34;太空馆&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;太空馆&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用Github Action构建HTML时指定Hugo版本</title>
      <link>https://blog.sunpeiwen.com/posts/github-actions-hugo-version/</link>
      <pubDate>Wed, 20 Nov 2024 03:31:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/github-actions-hugo-version/</guid>
      <description>&lt;p&gt;使用Github Action构建HTML时指定Hugo版本，使用&lt;code&gt;peaceiris/actions-hugo@v2&lt;/code&gt;这个Action，指定版本号即可。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;HUGO-pages&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;push&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;branches&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#ae81ff&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# master 更新触发&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jobs&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;build-deploy&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/checkout@v3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;submodules&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;recursive&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;fetch-depth&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Setup Hugo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;peaceiris/actions-hugo@v2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;hugo-version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0.123.0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 使用指定的版本&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;extended&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Build&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;hugo --gc --minify --cleanDestinationDir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Deploy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;peaceiris/actions-gh-pages@v3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;personal_token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ secrets.hugoblog }}&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# personal_token 这里新建一个 https://github.com/settings/tokens&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;PUBLISH_BRANCH&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;gh-pages&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 推送到当前 gh-pages 分支&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;PUBLISH_DIR&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;./public&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# hugo 生成到 public 作为跟目录&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;commit_message&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ github.event.head_commit.message }}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Search&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jkjoy/hugo-algolia2@1.0.2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content/zh-cn/posts/**&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#f92672&#34;&gt;index&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blog&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#f92672&#34;&gt;apikey&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ secrets.ALGOLIA_WRITE_KEY }}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#f92672&#34;&gt;appid&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CIU4I6RWD0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解决了最近Hugo版本升级,而我没有升级的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>通过取子集的方式压缩霞鹜文楷字体</title>
      <link>https://blog.sunpeiwen.com/posts/yasuoziti/</link>
      <pubDate>Sat, 24 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/yasuoziti/</guid>
      <description>&lt;h2 id=&#34;使用python&#34;&gt;使用python&lt;/h2&gt;&#xA;&lt;p&gt;这里使用到的是Python 的库：&lt;code&gt;fonttools&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;使用最新版 &lt;code&gt;Python&lt;/code&gt; 的 pip 命令安装即可在 Shell 中使用：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install fonttools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常用汉字大约有3500字&lt;/p&gt;&#xA;&lt;p&gt;中文常用字库项目https://github.com/DavidSheh/CommonChineseCharacter&lt;/p&gt;&#xA;&lt;h2 id=&#34;取子集&#34;&gt;取子集&lt;/h2&gt;&#xA;&lt;p&gt;使用以下命令即可对字体文件取子集&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fonttools subset &amp;#34;$input_file&amp;#34; --text-file=&amp;#34;$text_file&amp;#34; --output-file=&amp;#34;$output_file&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中&#xA;&lt;code&gt;$input_file&lt;/code&gt;：输入的字体文件。&#xA;&lt;code&gt;$text_file&lt;/code&gt;：定义保留字符的纯文本文件路径。&#xA;&lt;code&gt;$output_file&lt;/code&gt;：输出的字体文件路径。&lt;/p&gt;&#xA;&lt;p&gt;取完子集完成之后字体从11M压缩到1.7M左右&lt;/p&gt;&#xA;&lt;h2 id=&#34;压缩&#34;&gt;压缩&lt;/h2&gt;&#xA;&lt;p&gt;安装模块&lt;code&gt;brotli&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install brotli&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用命令&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fonttools ttLib.woff2 compress &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$input_file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; -o &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&#xA;&lt;code&gt;$input_file&lt;/code&gt;：输入的字体文件。&#xA;&lt;code&gt;$output_file&lt;/code&gt;：输出的字体文件路径。&lt;/p&gt;&#xA;&lt;p&gt;再次压缩为 woff2 字体格式 大约840kb&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stack - 一个新的typecho主题</title>
      <link>https://blog.sunpeiwen.com/posts/stack/</link>
      <pubDate>Thu, 11 Jul 2024 13:46:56 +0800</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/stack/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;本主题 从Hugo主题&lt;code&gt;Stack&lt;/code&gt;移植而来.&lt;/p&gt;&#xA;&lt;p&gt;原项目&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://github.com/CaiJimmy/hugo-theme-stack&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://github.com/CaiJimmy/hugo-theme-stack&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&#xA;&lt;h3 id=&#34;站点-logo-地址&#34;&gt;站点 LOGO 地址&lt;/h3&gt;&#xA;&lt;p&gt;为左侧边栏头像&lt;/p&gt;&#xA;&lt;h3 id=&#34;站点-favicon-地址&#34;&gt;站点 Favicon 地址&lt;/h3&gt;&#xA;&lt;p&gt;Favicon&lt;/p&gt;&#xA;&lt;h3 id=&#34;归档页面地址&#34;&gt;归档页面地址&lt;/h3&gt;&#xA;&lt;p&gt;创建归档页面后,在此填入&lt;/p&gt;&#xA;&lt;h3 id=&#34;链接页面地址&#34;&gt;链接页面地址&lt;/h3&gt;&#xA;&lt;p&gt;使用&lt;code&gt;links&lt;/code&gt;插件&lt;/p&gt;&#xA;&lt;p&gt;创建链接页面后,在此填入&lt;/p&gt;&#xA;&lt;h3 id=&#34;关于页面地址&#34;&gt;关于页面地址&lt;/h3&gt;&#xA;&lt;p&gt;创建关于页面后,在此填入&lt;/p&gt;&#xA;&lt;h3 id=&#34;自定义菜单&#34;&gt;自定义菜单&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        &amp;lt;li &amp;gt;&#xA;            &amp;lt;a href=&amp;#39;/&amp;#39; &amp;gt;&#xA;                &amp;lt;svg xmlns=&amp;#34;http://www.w3.org/2000/svg&amp;#34; class=&amp;#34;icon icon-tabler icon-tabler-home&amp;#34; width=&amp;#34;24&amp;#34; height=&amp;#34;24&amp;#34; viewBox=&amp;#34;0 0 24 24&amp;#34; stroke-width=&amp;#34;2&amp;#34; stroke=&amp;#34;currentColor&amp;#34; fill=&amp;#34;none&amp;#34; stroke-linecap=&amp;#34;round&amp;#34; stroke-linejoin=&amp;#34;round&amp;#34;&amp;gt;&amp;lt;path stroke=&amp;#34;none&amp;#34; d=&amp;#34;M0 0h24v24H0z&amp;#34;/&amp;gt;&amp;lt;polyline points=&amp;#34;5 12 3 12 12 3 21 12 19 12&amp;#34; /&amp;gt;&amp;lt;path d=&amp;#34;M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7&amp;#34; /&amp;gt;&amp;lt;path d=&amp;#34;M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6&amp;#34; /&amp;gt;&amp;lt;/svg&amp;gt;&#xA;                &amp;lt;span&amp;gt;首页&amp;lt;/span&amp;gt;&#xA;            &amp;lt;/a&amp;gt;&#xA;        &amp;lt;/li&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;按照此格式填入&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用mastodon为自己的博客新建说说页面</title>
      <link>https://blog.sunpeiwen.com/posts/mastodon-html/</link>
      <pubDate>Fri, 31 May 2024 06:59:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/mastodon-html/</guid>
      <description>&lt;h2 id=&#34;项目&#34;&gt;项目&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://gitlab.com/idotj/mastodon-embed-feed-timeline&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://gitlab.com/idotj/mastodon-embed-feed-timeline&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;GoToSocial与mastodon适用&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现步骤&#34;&gt;实现步骤&lt;/h2&gt;&#xA;&lt;p&gt;新建页面把以下代码复制粘贴,更改其中的实例地址和user id即可&lt;/p&gt;&#xA;&lt;h2 id=&#34;设置&#34;&gt;设置&lt;/h2&gt;&#xA;&lt;p&gt;如何设置&lt;/p&gt;&#xA;&lt;h3 id=&#34;获取user_id的方法&#34;&gt;获取user_id的方法&lt;/h3&gt;&#xA;&lt;p&gt;右键点击自己的头像,新标签页打开 获得头像地址为 &#xA;&#xA;&#xA;&lt;a href=&#34;https://im.loliko.cn/accounts/avatars/111/363/033/003/475/492/original/f726dbce158df8b9.jpg&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://im.loliko.cn/accounts/avatars/111/363/033/003/475/492/original/f726dbce158df8b9.jpg&lt;/a&gt;&#xA; 从avatars/之后/original之前的一串数字111/363/033/003/475/492/去掉所有的/得到**111363033003475492**即是 &lt;code&gt;user_id&lt;/code&gt; \&lt;/p&gt;&#xA;&lt;h3 id=&#34;参数&#34;&gt;参数&lt;/h3&gt;&#xA;&lt;p&gt;// 默认: &amp;ldquo;&#xA;&#xA;&#xA;&lt;a href=&#34;https://mastodon.social&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://mastodon.social&lt;/a&gt;&#xA;&amp;rdquo;&#xA;instanceUrl: &amp;ldquo;实例地址&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 可选模式: &amp;rsquo;local&amp;rsquo;, &amp;lsquo;profile&amp;rsquo;, &amp;lsquo;hashtag&amp;rsquo; 默认为&amp;rsquo;local&amp;rsquo;&#xA;timelineType: &amp;ldquo;local&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 你的用户ID,默认为空&#xA;userId: &amp;ldquo;&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 你在实例中的用户名以&lt;code&gt;@&lt;/code&gt;开头&#xA;// 如果你没有选择 &amp;lsquo;profile&amp;rsquo; 作为时间轴,则留空,默认留空&#xA;profileName: &amp;ldquo;&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 标签名称 (不包含&lt;code&gt;#&lt;/code&gt;符号) 如果不选择 &lt;code&gt;hashtag&lt;/code&gt; 模式则留空,默认为空&#xA;hashtagName: &amp;ldquo;&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 可选风格样式: &amp;ldquo;light&amp;rdquo;, &amp;ldquo;dark&amp;rdquo; or &amp;ldquo;auto&amp;rdquo; 默认为: &amp;ldquo;auto&amp;rdquo;&#xA;defaultTheme: &amp;ldquo;auto&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 请求的帖子数量,默认: &amp;ldquo;20&amp;rdquo;&#xA;maxNbPostFetch: &amp;ldquo;20&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;// 在时间轴显示最大的帖子数量,默认 : &amp;ldquo;20&amp;rdquo;&#xA;maxNbPostShow: &amp;ldquo;20&amp;rdquo;,&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moments:一个仿微信朋友圈项目</title>
      <link>https://blog.sunpeiwen.com/posts/moments_as_wechat_friends/</link>
      <pubDate>Mon, 06 May 2024 19:42:55 +0800</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/moments_as_wechat_friends/</guid>
      <description>&lt;h2 id=&#34;项目简介&#34;&gt;项目简介&lt;/h2&gt;&#xA;&lt;p&gt;本项目是由&lt;code&gt;mblog&lt;/code&gt;的作者最新开发的仿微信朋友圈的微博,基于NEXTJS+SQLITE3.&#xA;目前正在快速迭代更新中..&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;支持匿名评论/点赞&lt;/li&gt;&#xA;&lt;li&gt;支持引入网易云音乐,b站视频,插入链接等&lt;/li&gt;&#xA;&lt;li&gt;支持自定义头图,个人头像,网站标题等&lt;/li&gt;&#xA;&lt;li&gt;支持上传图片到S3兼容的云存储,支持本地存储&lt;/li&gt;&#xA;&lt;li&gt;适配手机&lt;/li&gt;&#xA;&lt;li&gt;支持暗黑模式&lt;/li&gt;&#xA;&lt;li&gt;数据库采用sqlite,可随时备份&lt;/li&gt;&#xA;&lt;li&gt;支持引入豆瓣读书/豆瓣电影,样式来源于这里&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;项目地址&#34;&gt;项目地址&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://github.com/kingwrcy/moments&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://github.com/kingwrcy/moments&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;预览&#34;&gt;预览&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;837a5d1daee7ebeda7706d4ec8809aed&#34;&gt;&#xA;    &lt;img src=&#34;https://img.imsun.org/2024/04/27/662cd4cb6e4ee.png#vwid=1702&amp;amp;vhei=978&#34; alt=&#34;预览&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;预览&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署步骤&#34;&gt;部署步骤&lt;/h2&gt;&#xA;&lt;p&gt;建议使用Docker Compose方式部署&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir /home/moments&#xA;cd /home/moments&#xA;nano docker-compose.yaml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;复制以下内容粘贴&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;&#xA;services:&#xA;  moments:&#xA;    image: kingwrcy/moments:latest&#xA;    ports:&#xA;      - &amp;#34;3000:3000&amp;#34;&#xA;    volumes:&#xA;      - ./data:/app/data&#xA;      - /etc/localtime:/etc/localtime:ro&#xA;      - /etc/timezone:/etc/timezone:ro&#xA;      - ./config.properties:/app/data/config.properties:ro&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nano config.properties&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;把以下内容复制粘贴&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 站点url包括http/https&#xA;NUXT_PUBLIC_SITE_URL=&#xA;#是否启用评论&#xA;NUXT_PUBLIC_MOMENTS_COMMENT_ENABLE=true&#xA;#是否显示评论&#xA;NUXT_PUBLIC_MOMENTS_SHOW_COMMENT=true&#xA;#评论最大字数&#xA;NUXT_PUBLIC_MOMENTS_COMMENT_MAX_LENGTH=120&#xA;#评论的显示顺序,desc:倒序,asc:顺序&#xA;NUXT_PUBLIC_MOMENTS_COMMENT_ORDER_BY=desc&#xA;#是否显示引入豆瓣读书/视频按钮&#xA;NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_DOUBAN=true&#xA;#是否显示引入网易云音乐按钮&#xA;NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_MUSIC163=true&#xA;#是否显示引入youtube,b站,在线视频按钮&#xA;NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_VIDEO=true&#xA;#单条发言最大行数,最大10行&#xA;NUXT_PUBLIC_MOMENTS_MAX_LINE=4&#xA;#recaptchaV3代码中使用此网站密钥&#xA;NUXT_PUBLIC_GOOGLE_RECAPTCHA_SITE_KEY=&#xA;#分页大小&#xA;NUXT_PUBLIC_PAGE_SIZE=10&#xA;&#xA;#private&#xA;#recaptchaV3通信密钥&#xA;NUXT_GOOGLE_RECAPTCHA_SECRET_KEY=&#xA;&#xA;#是否启用评论通知&#xA;NUXT_PUBLIC_NOTIFY_BY_EMAIL_ENABLE=false&#xA;#管理员邮箱&#xA;NUXT_NOTIFY_MAIL=&#xA;#邮局服务器地址&#xA;NUXT_MAIL_HOST=&#xA;#邮局服务器端口465端口一般是加密的，587端口一般是不加密的&#xA;NUXT_MAIL_PORT=587&#xA;#邮局安全连接true/false&#xA;NUXT_MAIL_SECURE=false&#xA;#邮箱用户名&#xA;NUXT_MAIL_NAME=&#xA;#邮箱密码&#xA;NUXT_MAIL_PASSWORD=&#xA;#邮箱发件人&#xA;NUXT_MAIL_FROM=&#xA;#邮箱发件人名称&#xA;NUXT_MAIL_FROM_NAME=&#xA;&#xA;#是否启用阿里云文本审核(只针对评论)&#xA;NUXT_PUBLIC_ALIYUN_TEXT_JUDGE_ENABLE=false&#xA;#阿里云AccessKey ID&#xA;NUXT_ALIYUN_ACCESS_KEY_ID=&#xA;#阿里云AccessKey Secret&#xA;NUXT_ALIYUN_ACCESS_KEY_SECRET=&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;根据注释内容修改参数&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决Typecho博客全球通用头像Gravatar不显示方法</title>
      <link>https://blog.sunpeiwen.com/posts/typecho-gravatar-proxy/</link>
      <pubDate>Tue, 12 Dec 2023 04:49:39 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/typecho-gravatar-proxy/</guid>
      <description>&lt;p&gt;替换头像源 使用国内cdn加速&lt;/p&gt;&#xA;&lt;p&gt;在config中任意位置加入以下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;define(&amp;#39;__TYPECHO_GRAVATAR_PREFIX__&amp;#39;, &amp;#39;https://cdn.v2ex.com/avatar/&amp;#39;);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;https://cdn.v2ex.com/avatar/&lt;/code&gt;可更改为其他CDN头像源&lt;/p&gt;&#xA;&lt;p&gt;当然也可以通过vercel反向代理建立自己的镜像头像地址&lt;/p&gt;</description>
    </item>
    <item>
      <title>巨械师X99M&#43;RX5600XT黑苹果OC0.9.5引导</title>
      <link>https://blog.sunpeiwen.com/posts/hackintosh-oc-bootloader-for-x99m/</link>
      <pubDate>Tue, 05 Sep 2023 13:42:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/hackintosh-oc-bootloader-for-x99m/</guid>
      <description>&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;&#xA;&lt;p&gt;巨械师X99M&lt;/p&gt;&#xA;&lt;p&gt;E5 2680 V4&lt;/p&gt;&#xA;&lt;p&gt;三星DDR4 64G ECC内存&lt;/p&gt;&#xA;&lt;p&gt;梵想1TB SSD&lt;/p&gt;&#xA;&lt;p&gt;蓝宝石RX5600XT 6G&lt;/p&gt;&#xA;&lt;p&gt;机箱 鱼巢S5&lt;/p&gt;&#xA;&lt;p&gt;电源 长城700W金牌&lt;/p&gt;&#xA;&lt;p&gt;网卡 BCM94360CS2&lt;/p&gt;&#xA;&lt;h2 id=&#34;截图&#34;&gt;截图&lt;/h2&gt;&#xA;&lt;h2 id=&#34;下载地址&#34;&gt;下载地址&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pan.sunpeiwen.com/%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/X99%20%E5%B7%A8%E6%A2%B0%E5%B8%88/EFI.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://pan.sunpeiwen.com/%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98/%E9%BB%91%E8%8B%B9%E6%9E%9C/X99%20%E5%B7%A8%E6%A2%B0%E5%B8%88/EFI.zip&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>精粤h97i gaming&#43;e3 1231 v3&#43;rx560黑苹果引导</title>
      <link>https://blog.sunpeiwen.com/posts/jingyue-h97i-gaming-hackintosh/</link>
      <pubDate>Tue, 05 Sep 2023 10:32:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/jingyue-h97i-gaming-hackintosh/</guid>
      <description>&lt;h3 id=&#34;配置&#34;&gt;配置&lt;/h3&gt;&#xA;&lt;p&gt;主板 精粤h97i gaming&#xA;cpu e3 1231 v3&#xA;内存16g ddr3&#xA;显卡 rx560&#xA;硬盘 480ssd&#xA;网卡bcm943224&lt;/p&gt;&#xA;&lt;h3 id=&#34;截图&#34;&gt;截图&lt;/h3&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;2aa22bbcc1caf3c26339c2e744a5b21f&#34;&gt;&#xA;    &lt;img src=&#34;https://www.avnvu.com/usr/uploads/2023/09/1616514341.png&#34; alt=&#34;硬件参数.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;硬件参数.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;bios设置&#34;&gt;bios设置&lt;/h3&gt;&#xA;&lt;p&gt;禁止csm&lt;/p&gt;&#xA;&lt;p&gt;禁止cfg lock&lt;/p&gt;&#xA;&lt;p&gt;打开 above 4g&lt;/p&gt;&#xA;&lt;h3 id=&#34;引导下载&#34;&gt;引导下载&lt;/h3&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://blogcdn.asbid.cn/2023/09/05/1693920869.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;EFI.zip&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>在fly.io部署Gotosocial-一个 ActivityPub 联邦社交网络程序.</title>
      <link>https://blog.sunpeiwen.com/posts/deploy-gotosocial-an-activitypub-federated-social-networking-program/</link>
      <pubDate>Thu, 17 Aug 2023 03:21:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/deploy-gotosocial-an-activitypub-federated-social-networking-program/</guid>
      <description>&lt;h2 id=&#34;关于gotosocial&#34;&gt;关于Gotosocial&lt;/h2&gt;&#xA;&lt;p&gt;GoToSocial 是一个十分轻量（轻量到甚至没有用户界面，需要使用第三方程序登录、兼容 Mastodon 应用进行使用）的 ActivityPub 联邦社交网络程序，自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。&lt;/p&gt;&#xA;&lt;h2 id=&#34;准备&#34;&gt;准备&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注册 Fly.io 账号，并绑卡（避免滥用）；&lt;/li&gt;&#xA;&lt;li&gt;注册 Cloudflare 并启用 R2，启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;安装-flyctl&#34;&gt;安装 flyctl&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Linux&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -L https://fly.io/install.sh | sh&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;macOS&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -L https://fly.io/install.sh | sh&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;Windows，需要开启 RemoteSigned: 管理员运行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; Set-ExecutionPolicy -ExecutionPolicy RemoteSigned&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;powershell -Command &amp;#34;iwr https://fly.io/install.ps1 -useb | iex&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;登录&#34;&gt;登录&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl auth login&#xA;&#xA;# 若登录失败使用&#xA;# flyctl auth login -i &#xA;# 输入账号密码进行登录&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;创建app&#34;&gt;创建APP&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;YOURAPPNAME&lt;/code&gt;更改为自己希望设置的名称&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl launch --name YOURAPPNAME --image=superseriousbusiness/gotosocial:latest --region hkg --no-deploy&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;创建储存卷&#34;&gt;创建储存卷&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl volumes create social_data --region hkg --size 1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;编辑配置&#34;&gt;编辑配置&lt;/h2&gt;&#xA;&lt;p&gt;编辑根目录下的 &lt;code&gt;fly.toml&lt;/code&gt; 配置文件，参考下方&lt;/p&gt;</description>
    </item>
    <item>
      <title>在fly.io部署Memos并自动备份数据库</title>
      <link>https://blog.sunpeiwen.com/posts/deploying-memos-on-fly_io-and-automating-database-backups/</link>
      <pubDate>Tue, 15 Aug 2023 02:02:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/deploying-memos-on-fly_io-and-automating-database-backups/</guid>
      <description>&lt;h2 id=&#34;参考项目&#34;&gt;参考项目&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://github.com/hu3rror/memos-on-fly&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://github.com/hu3rror/memos-on-fly&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;准备工作&#34;&gt;准备工作&lt;/h2&gt;&#xA;&lt;p&gt;1.注册FLY.IO&#xA;用以部署memos&#xA;2.注册B2C&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.backblaze.com/cloud-storage&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://www.backblaze.com/cloud-storage&lt;/a&gt;&#xA;&#xA;用以同步备份memos数据库&#xA;新建BUCKET,并获取&lt;code&gt;&amp;lt;keyId&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;applicationKey&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装flyctl&#34;&gt;安装flyctl&lt;/h2&gt;&#xA;&lt;p&gt;Install flyctl&#xA;以WINDOWS为例&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pwsh -Command &amp;#34;iwr https://fly.io/install.ps1 -useb | iex&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其他系统请参照官方&lt;/p&gt;&#xA;&lt;h2 id=&#34;新建app&#34;&gt;新建APP&lt;/h2&gt;&#xA;&lt;p&gt;初始化&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl launch&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;按照提示选择会生成一个FLY.TOML文件&lt;/p&gt;&#xA;&lt;h2 id=&#34;编辑flytoml&#34;&gt;编辑FLY.TOML&lt;/h2&gt;&#xA;&lt;p&gt;添加以下内容&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[build]&#xA;  image = &amp;#34;ghcr.io/hu3rror/memos-litestream:latest&amp;#34;&#xA;#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest&#xA;#使用官方镜像可以删掉env的部分&#xA;[env]&#xA;  # Details see: https://litestream.io/guides/backblaze/&#xA;  LITESTREAM_REPLICA_BUCKET = &amp;#34;B2C桶名称&amp;#34;     # change to your litestream bucket name&#xA;  LITESTREAM_REPLICA_ENDPOINT = &amp;#34;s3.us-east-005.backblazeb2.com&amp;#34;     # change to your litestream endpoint url&#xA;  LITESTREAM_REPLICA_PATH = &amp;#34;memos_prod.db&amp;#34;     # keep the default or change to whatever path you want&#xA;&#xA;[[mounts]]&#xA;  source = &amp;#34;memos_data&amp;#34;&#xA;  destination = &amp;#34;/var/opt/memos&amp;#34;&#xA;&#xA;[http_service]&#xA;  internal_port = 5230&#xA;  force_https = true&#xA;  auto_stop_machines = false&#xA;  auto_start_machines = true&#xA;  min_machines_running = 0&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;添加1g存储空间&#34;&gt;添加1g存储空间&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl volumes create memos_data --region hkg --size 1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;添加密钥&#34;&gt;添加密钥&lt;/h2&gt;&#xA;&lt;p&gt;将B2存储的密钥添加到fly的密钥存储中,&#xA;使用官方镜像可以忽略此步骤&lt;/p&gt;</description>
    </item>
    <item>
      <title>在fly.io部署artalk评论系统</title>
      <link>https://blog.sunpeiwen.com/posts/on-fly_io-deploy-artalk/</link>
      <pubDate>Tue, 15 Aug 2023 01:37:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/on-fly_io-deploy-artalk/</guid>
      <description>&lt;p&gt;众所周知&lt;code&gt;Fly.io&lt;/code&gt;是一个免费的SAAS平台&#xA;提供三个内存为256MB,总3G硬盘空间.&#xA;为防止滥用,需要绑定信用卡.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Free allowances&#xA;Resources included for free on all plans:&#xA;&#xA;Up to 3 shared-cpu-1x 256mb VMs†&#xA;3GB persistent volume storage (total)&#xA;160GB outbound data transfer&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;准备&#34;&gt;准备&lt;/h2&gt;&#xA;&lt;p&gt;安装官方的命令行工具flyctl&lt;/p&gt;&#xA;&lt;h2 id=&#34;初始化&#34;&gt;初始化&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl launch&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;根据提示创建一个app&lt;/p&gt;&#xA;&lt;h2 id=&#34;创建一个1g的硬盘&#34;&gt;创建一个1G的硬盘&lt;/h2&gt;&#xA;&lt;p&gt;1G的硬盘用来储存评论数据绰绰有余了&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl volumes create artalk_data --region hkg --size 1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;编辑flytoml&#34;&gt;编辑FLY.TOML&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#根据自动生成的FLY.TOML文件修改&#xA;app = &amp;#34;atim&amp;#34;  &#xA;primary_region = &amp;#34;hkg&amp;#34;&#xA;&#xA;[build]&#xA;  image = &amp;#34;artalk/artalk-go&amp;#34;&#xA;&#xA;[http_service]&#xA;  internal_port = 23366&#xA;  force_https = true&#xA;  auto_stop_machines = true&#xA;  auto_start_machines = true&#xA;  min_machines_running = 0&#xA;  processes = [&amp;#34;app&amp;#34;]&#xA;&#xA;[[mounts]]&#xA;  source = &amp;#34;artalk_data&amp;#34;&#xA;  destination = &amp;#34;/data&amp;#34;&#xA;&#xA;[experimental]&#xA;  vm = true&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;在-flytoml-文件目录执行&#34;&gt;在 fly.toml 文件目录执行&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flyctl ssh console&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建一个管理员账号&lt;/p&gt;</description>
    </item>
    <item>
      <title>istoreos科学上网插件</title>
      <link>https://blog.sunpeiwen.com/posts/istoreos_ssr_ss_vless_vmess/</link>
      <pubDate>Thu, 13 Jul 2023 03:30:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/istoreos_ssr_ss_vless_vmess/</guid>
      <description>&lt;p&gt;OpenWRT应该也可以用&lt;/p&gt;&#xA;&lt;p&gt;可以支持SSR SS VLESS VMESS等&lt;/p&gt;&#xA;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://blogcdn.asbid.cn/2023/07/13/1689218891.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;SSR-Plus_x86_update.zip&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>迷思</title>
      <link>https://blog.sunpeiwen.com/posts/myth/</link>
      <pubDate>Tue, 04 Jul 2023 01:19:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/myth/</guid>
      <description>&lt;p&gt;你会觉得自己付出的不够多而陷入一种自我否定的情绪中.&lt;/p&gt;&#xA;&lt;p&gt;被偏爱的有恃无恐,这个是真的,普遍存在的真理.&#xA;不用我去论证,想必有很多人愿意分享自己的相同经历.&lt;/p&gt;&#xA;&lt;p&gt;我觉得自己是可以深爱她的&lt;/p&gt;&#xA;&lt;p&gt;她昨晚跟别人打游戏到深夜&lt;/p&gt;&#xA;&lt;p&gt;给她买了很多吃的,她连一句话都不屑与我说&lt;/p&gt;&#xA;&lt;p&gt;今天的第一句话就是责怪我&lt;/p&gt;&#xA;&lt;p&gt;我觉得自己是被PUA了&#xA;我有一瞬间觉得是自己的错&lt;/p&gt;&#xA;&lt;p&gt;付出的爱是及其卑微的&lt;/p&gt;&#xA;&lt;p&gt;所有的请求都得不到回应,如同一个伪神,只会贪婪的吸收人们的信仰,却得不到一点反馈,那就是一个剥削和压迫的阶级.&#xA;我们无产主义者应该打到这些牛鬼蛇神.&lt;/p&gt;&#xA;&lt;p&gt;你以为的爱是无私的.&#xA;其实是最自私的,&#xA;你以为得到的就是全世界&#xA;其实只是可怜的施舍&lt;/p&gt;&#xA;&lt;p&gt;我只是一个可憎的失败者,&#xA;不值得同情与怜悯&lt;/p&gt;</description>
    </item>
    <item>
      <title>为Memos增加twikoo评论</title>
      <link>https://blog.sunpeiwen.com/posts/memos-twikoo/</link>
      <pubDate>Sat, 17 Jun 2023 06:42:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/memos-twikoo/</guid>
      <description>&lt;h2 id=&#34;食用方法&#34;&gt;食用方法&lt;/h2&gt;&#xA;&lt;p&gt;适用于最新版本的memos 0.13&#xA;在Memos设置中加入以下&lt;/p&gt;&#xA;&lt;h2 id=&#34;自定义样式&#34;&gt;自定义样式&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#twikoo{padding: 1rem;background-color: rgb(63,63,70);margin: 1rem 0;border-radius: .5rem;color: #fff !important;}&#xA;.twicon{position: absolute;right: 1rem;}&#xA;.btns-container.space-x-2{margin-right:1.5rem;}&#xA;.action-button-container{color: #e5e7eb;}&#xA;.action-button-container a{display:none !important;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;自定义脚本&#34;&gt;自定义脚本&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//添加 twikoo 评论 v2023.06.10 适用于最新版本的memos&#xA;var twikooENV = &amp;#39;https://twikoo.loliko.cn/&amp;#39;&#xA;function addTwikooJS() { &#xA;  var memosTwikoo = document.createElement(&amp;#34;script&amp;#34;);&#xA;  memosTwikoo.src = `https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js`;&#xA;  var tws = document.getElementsByTagName(&amp;#34;script&amp;#34;)[0];&#xA;  tws.parentNode.insertBefore(memosTwikoo, tws);&#xA;};&#xA;function addComIcon(){&#xA;  var memoTwIcons = document.querySelectorAll(&amp;#39;.time-text&amp;#39;) || &amp;#39;&amp;#39;;&#xA;  if(memoTwIcons){&#xA;    for(var i=0;i &amp;lt; memoTwIcons.length;i++){&#xA;      //if(memoTwIcon[i].hasChildNodes == false){&#xA;        memoTwIcons[i].insertAdjacentHTML(&amp;#39;afterbegin&amp;#39;, &amp;#39;&amp;lt;div class=&amp;#34;twicon&amp;#34;&amp;gt;&amp;lt;svg class=&amp;#34;icon&amp;#34; viewBox=&amp;#34;0 0 1024 1024&amp;#34; xmlns=&amp;#34;http://www.w3.org/2000/svg&amp;#34; width=&amp;#34;16&amp;#34; height=&amp;#34;16&amp;#34;&amp;gt;&amp;lt;path d=&amp;#34;M896 138.667H128c-38.4 0-64 25.6-64 64v544c0 38.4 25.6 64 64 64h128v128c83.2 0 166.4-44.8 256-128h384c38.4 0 64-25.6 64-64v-544c0-38.4-25.6-64-64-64zm0 608H486.4l-19.2 19.2c-51.2 51.2-102.4 83.2-147.2 96v-115.2H128v-544h768v544z&amp;#34; fill=&amp;#34;#8a8a8a&amp;#34;/&amp;gt;&amp;lt;path d=&amp;#34;M256 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM448 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0zM640 477.867a64 64 0 1 0 128 0 64 64 0 1 0-128 0z&amp;#34; fill=&amp;#34;#8a8a8a&amp;#34;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;);&#xA;      //}&#xA;    }&#xA;  }&#xA;};&#xA;function startTwikoo() {&#xA;  start = setInterval(function(){&#xA;    var twikooDom = document.getElementById(&amp;#39;twikoo&amp;#39;) || &amp;#39;&amp;#39;;&#xA;    var memoTw = document.querySelector(&amp;#39;.memo-wrapper&amp;#39;) || &amp;#39;&amp;#39;;&#xA;    var memoLoading = document.querySelector(&amp;#39;.action-button-container&amp;#39;) || &amp;#39;&amp;#39;;&#xA;    var memoLoadingA = document.querySelector(&amp;#39;.action-button-container a&amp;#39;) || &amp;#39;&amp;#39;;&#xA;    var memoTwIcons = document.querySelectorAll(&amp;#39;.time-text .twicon&amp;#39;) || &amp;#39;&amp;#39;;&#xA;    var nowHref = window.location.href;&#xA;    if( nowHref.replace(/^.*\/(m)\/.*$/,&amp;#39;$1&amp;#39;) == &amp;#34;m&amp;#34; &amp;amp;&amp;amp; memoLoadingA){&#xA;      memoLoading.innerHTML = &amp;#34;评论加载中……&amp;#34;&#xA;    }&#xA;    if( nowHref.replace(/^.*\/(m)\/.*$/,&amp;#39;$1&amp;#39;) == &amp;#34;m&amp;#34; &amp;amp;&amp;amp; !twikooDom){&#xA;      addTwikooJS()&#xA;      if(memoTw){&#xA;        clearInterval(start)&#xA;        memoTw.insertAdjacentHTML(&amp;#39;afterend&amp;#39;, &amp;#39;&amp;lt;div id=&amp;#34;mtcomment&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;);&#xA;        setTimeout(function() {&#xA;          twikoo.init({&#xA;            envId: twikooENV,&#xA;            el: &amp;#39;#mtcomment&amp;#39;,&#xA;            path: nowHref.replace(/^(.*\/m\/[0-9]+).*$/,&amp;#39;$1&amp;#39;),&#xA;            onCommentLoaded: function () {&#xA;              //console.log(&amp;#39;评论加载完成&amp;#39;);&#xA;              memoLoading.innerHTML = &amp;#39;&amp;#39;&#xA;              startTwikoo()&#xA;            }&#xA;          })&#xA;        }, 1000)&#xA;      }&#xA;    }&#xA;    if(nowHref.replace(/^.*\/(explore).*$/,&amp;#39;$1&amp;#39;) == &amp;#34;explore&amp;#34; || nowHref.replace(/^.*\/(u).*$/,&amp;#39;$1&amp;#39;) == &amp;#34;u&amp;#34;){&#xA;      memoTwIcons.forEach(memoTwIcon =&amp;gt; {memoTwIcon.remove();});&#xA;      addComIcon()&#xA;      //console.log(&amp;#39;图标添加成功&amp;#39;);&#xA;    }&#xA;    //console.log(window.location.href);&#xA;  }, 1000)&#xA;}&#xA;startTwikoo();&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>群晖docker出现注册表无法访问的解决办法</title>
      <link>https://blog.sunpeiwen.com/posts/solution-for-synology-docker-registry-access-issue/</link>
      <pubDate>Tue, 06 Jun 2023 01:25:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/solution-for-synology-docker-registry-access-issue/</guid>
      <description>&lt;h2 id=&#34;问题出现&#34;&gt;问题出现&lt;/h2&gt;&#xA;&lt;p&gt;群晖docker升级到DSM7.2之后出现了新的问题,原本可以正常访问的群晖镜像仓库竟然无法访问了.&#xA;原本启用注册表镜像URL就可以解决这个问题&#xA;如今也无法使用这个解决方案了&#xA;经过排查发现原来是因为docker仓库的域名被墙了.&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决办法&#34;&gt;解决办法&lt;/h2&gt;&#xA;&lt;p&gt;使用魔法.&lt;/p&gt;&#xA;&lt;h3 id=&#34;准备工作&#34;&gt;准备工作&lt;/h3&gt;&#xA;&lt;p&gt;搭建一个代理服务,使用海外或者港台地区VPS&lt;/p&gt;&#xA;&lt;h3 id=&#34;开启群晖ssh&#34;&gt;开启群晖SSH&lt;/h3&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;fa898591be10f711f8b9646faf649c1b&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686013906.png&#34; alt=&#34;微信截图_20230606091022.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;微信截图_20230606091022.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;使用ssh登录&#34;&gt;使用SSH登录&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;ssh 用户名@群晖IP&lt;/code&gt;登录&#xA;例如&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh admin@192.168.31.100&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;输入密码,回车&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo -i&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;输入密码,回车&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d \&#xA;--restart=always \&#xA;--privileged \&#xA;--network=host \&#xA;--name v2raya \&#xA;-v /volume2/docker/v2raya:/etc/v2raya \  #此处/volume2/docker/v2raya为群晖目录改成自己的实际存放目录&#xA;mzz2017/v2raya&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用docker部署v2ray&#xA;部署成功就可以在docker的管理界面看到这个容器了.&#xA;使用IP+端口2017登录web管理界面&#xA;示例 192.168.31.100:2017&#xA;sock代理端口为20170&#xA;http代理端口为20171&lt;/p&gt;&#xA;&lt;h3 id=&#34;使用v2raya&#34;&gt;使用v2raya&lt;/h3&gt;&#xA;&lt;p&gt;进入web管理界面点击创建&#xA;填写代理资料&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;c70b8f493f7265d183c204e2842d42ff&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686014583.png&#34; alt=&#34;创建.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;创建.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;填写完毕点击这里测试一下是否连通&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;a8f15ff1b7000ecc52a320ea8cecf5e5&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686014582.jpg&#34; alt=&#34;photo_2023-06-06_09-22-32.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;photo_2023-06-06_09-22-32.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;2768e5d48d893a363814929669d3908a&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686014586.png&#34; alt=&#34;微信截图_20230606092047.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;微信截图_20230606092047.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;2e527332920ae0278ad78ee0e5da91bb&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686014585.png&#34; alt=&#34;设置.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;设置.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;设置完成后点击左上角的运行&lt;/p&gt;&#xA;&lt;h3 id=&#34;群晖设置&#34;&gt;群晖设置&lt;/h3&gt;&#xA;&lt;p&gt;打开控制面板-网络&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;03410dfd1b2be7b32714c61d845ba3f3&#34;&gt;&#xA;    &lt;img src=&#34;https://imsun-1251893119.cos.ap-guangzhou.myqcloud.com/2023/06/06/1686015169.png&#34; alt=&#34;群晖代理.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;群晖代理.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;保存即可&lt;/p&gt;</description>
    </item>
    <item>
      <title>宝塔面板数据库有时候自动停止用计划任务来解决的办法</title>
      <link>https://blog.sunpeiwen.com/posts/bt-panel-database-automatically-task/</link>
      <pubDate>Tue, 23 May 2023 06:59:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/bt-panel-database-automatically-task/</guid>
      <description>&lt;p&gt;创建计划任务,每分钟执行一次&#xA;脚本如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pgrep -x mysqld &amp;amp;&amp;gt; /dev/null&#xA;if [ $? -ne 0 ];then&#xA;/etc/init.d/mysqld start &#xA;fi&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检测数据库状态并自动启动&lt;/p&gt;</description>
    </item>
    <item>
      <title>解除typecho的最大字数限制</title>
      <link>https://blog.sunpeiwen.com/posts/unlimit-maximum-word-count-for-typecho/</link>
      <pubDate>Tue, 09 May 2023 06:36:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/unlimit-maximum-word-count-for-typecho/</guid>
      <description>&lt;p&gt;把contens表里的text字段类型设置为longtext&#xA;执行SQL&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;alter&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt; typecho_contents &lt;span style=&#34;color:#66d9ef&#34;&gt;modify&lt;/span&gt; text LONGTEXT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>精粤X99M-PLUS-D3&#43;rx580黑苹果opencore0.9.0引导</title>
      <link>https://blog.sunpeiwen.com/posts/jingyue-x99m-plus-d3-hackintosh/</link>
      <pubDate>Fri, 28 Apr 2023 03:56:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/jingyue-x99m-plus-d3-hackintosh/</guid>
      <description>&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CPU : E5 2673 V3&lt;/li&gt;&#xA;&lt;li&gt;主板 : JINGYUE X99M-PLUS-D3&lt;/li&gt;&#xA;&lt;li&gt;内存 : 三星 32G X4&lt;/li&gt;&#xA;&lt;li&gt;硬盘 :梵想 1TB&lt;/li&gt;&#xA;&lt;li&gt;网卡 : bcm94360CD&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;bios-设置&#34;&gt;BIOS 设置&lt;/h2&gt;&#xA;&lt;h3 id=&#34;关闭or禁用&#34;&gt;关闭or禁用:&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CSM&lt;/li&gt;&#xA;&lt;li&gt;CFG Lock&lt;/li&gt;&#xA;&lt;li&gt;Secure Boot&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;引导下载&#34;&gt;引导下载&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://github.com/i886/JGINYUE-X99M-PLUS-D3-Hackintosh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://github.com/i886/JGINYUE-X99M-PLUS-D3-Hackintosh&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>国内注册ChatGPT的方法</title>
      <link>https://blog.sunpeiwen.com/posts/regediter_chatgpt_china/</link>
      <pubDate>Mon, 03 Apr 2023 03:28:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/regediter_chatgpt_china/</guid>
      <description>&lt;h4 id=&#34;国内注册chatgpt的方法&#34;&gt;国内注册ChatGPT的方法&lt;/h4&gt;&#xA;&lt;p&gt;&lt;code&gt;ChatGPT&lt;/code&gt; 是由 &lt;code&gt;OpenAI &lt;/code&gt;开发的一个人工智能聊天机器人程序，于 2022 年 11 月推出，基于 GPT-3.5 架构的大型语言模型并通过强化学习进行训练，在这款软件中用户们可以与 AI 人工智能进行多种的对话工作，目前，有部分地区（例如&lt;code&gt;中国大陆&lt;/code&gt;、&lt;code&gt;香港&lt;/code&gt;）无法使用此项服务&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;ChatGPT&lt;/code&gt;技术开发商&lt;code&gt;OpenAI&lt;/code&gt;斥巨资买下&lt;code&gt;AI.com&lt;/code&gt;域名，现在访问&#xA;&#xA;&#xA;&lt;a href=&#34;https://ai.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;AI.com&lt;/a&gt;&#xA;直接跳转到ChatGPT官网。&lt;/p&gt;&#xA;&lt;h4 id=&#34;chatgpt功能&#34;&gt;ChatGPT功能&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ChatGPT 在搜索和写作上非常强大。&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 可以根据用户提供的信息，给出合理而有效的搜索结果，&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 写的短篇小说，&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 写的信件，内容通畅，用词准确。&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 撰写专业的电子邮件回复&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 为营销活动产生新的内容创意&lt;/li&gt;&#xA;&lt;li&gt;ChatGPT 解决任何编码问题或为获取代码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;国内用户注册chatgpt的方法&#34;&gt;国内用户注册ChatGPT的方法&lt;/h4&gt;&#xA;&lt;p&gt;国内用户想要注册 ChatGPT，首先需要有一个&lt;strong&gt;网络环境&lt;/strong&gt;，例如&lt;code&gt;美国&lt;/code&gt;；然后，需要一个可以接收短信验证码的手机号码，之后就可以打开 ChatGPT 的网站&lt;strong&gt;注册 ，邮件验证，电话号码验证&lt;/strong&gt;等等。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;如果出现如下的界面，则证明你的网络所在地区无法注册访问ChatGPT。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;注意：&lt;/code&gt;如果无法搞定上述必要条件的话，可以尝试&#xA;搭建一个梯子  &#xA;&#xA;&#xA;&lt;a href=&#34;https://www.sunpeiwen.com/archives/396.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;x-ui：支持多协议多用户的 xray 面板&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;h5 id=&#34;注册-openai-账号&#34;&gt;注册 OpenAI 账号&lt;/h5&gt;&#xA;&lt;p&gt;1、点击打开 &#xA;&#xA;&#xA;&lt;a href=&#34;https://chat.openai.com/auth/login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;https://chat.openai.com/auth/login&lt;/a&gt;&#xA; 页面中的 &lt;code&gt;Sign up &lt;/code&gt;进行相应的账号注册（注意网络环境不能是&lt;code&gt;香港&lt;/code&gt;，&lt;code&gt;澳门&lt;/code&gt;等地区，不然会提示不能在当前国家服务）。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;21036eac22bd9365c90a04436b6ce9d7&#34;&gt;&#xA;    &lt;img src=&#34;https://www.pythonthree.com/wp-content/uploads/2023/02/1676427587-%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7.png&#34; alt=&#34;注册&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;注册&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;2、在新的页面可选择注册 &lt;code&gt;ChatGPT&lt;/code&gt; 账号的方式，可以使用邮箱(国内邮箱也可以，建议使用国外邮箱)，，或者有谷歌账号的邮箱，或者用 Microsoft Account 注册也可以。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;58c7c8b9958d77d1ca503f94be5ae627&#34;&gt;&#xA;    &lt;img src=&#34;https://www.pythonthree.com/wp-content/uploads/2023/02/1676427844-%E9%80%89%E6%8B%A9%E5%88%9B%E5%BB%BAChatGPT%E8%B4%A6%E5%8F%B7%E7%9A%84%E6%96%B9%E5%BC%8F.png&#34; alt=&#34;选择创建ChatGPT账号的方式&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;选择创建ChatGPT账号的方式&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;strong&gt;使用邮箱注册ChatGPT时&lt;/strong&gt;，输入邮箱地址，点击&lt;code&gt;Continue&lt;/code&gt;，之后输入密码，进入下一步骤。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;293c8d2e10dad4ce244d4696a434bb44&#34;&gt;&#xA;    &lt;img src=&#34;https://www.pythonthree.com/wp-content/uploads/2023/02/1676428115-%E4%BD%BF%E7%94%A8%E9%82%AE%E7%AE%B1%E6%B3%A8%E5%86%8CChatGPT.png&#34; alt=&#34;使用邮箱注册ChatGPT&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;使用邮箱注册ChatGPT&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;strong&gt;使用 Microsoft Account 注册ChatGPT时&lt;/strong&gt;，可以使用Microsoft账号登录，如果有Github账号的话，可点击&lt;code&gt;登录选项&lt;/code&gt;，然后选择使用Github账号 注册。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git在windows下区分大小写</title>
      <link>https://blog.sunpeiwen.com/posts/windows-git/</link>
      <pubDate>Tue, 21 Mar 2023 11:03:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/windows-git/</guid>
      <description>&lt;p&gt;在&lt;code&gt;.deploy_git&lt;/code&gt;目录下运行&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config core.ignorecase false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可解决github pages 下CNAME被改为小写导致绑定域名失效的情况&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信键盘上线</title>
      <link>https://blog.sunpeiwen.com/posts/wechat-keyboard-online/</link>
      <pubDate>Mon, 19 Dec 2022 02:50:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/wechat-keyboard-online/</guid>
      <description>&lt;p&gt;微信键盘是微信官方推出的一款手机输入法软件。&#xA;就在昨天悄悄上架了各个平台的应用商店。&#xA;经过我的实际体验。总结出以下&lt;/p&gt;&#xA;&lt;h2 id=&#34;ios&#34;&gt;IOS&lt;/h2&gt;&#xA;&lt;p&gt;在苹果的APP STORE下载的微信键盘存在以下的问题&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;无法在微信等很多APP中唤醒，也就是说即便打开了 允许完全访问 也没用。&lt;/li&gt;&#xA;&lt;li&gt;测试只能在浏览器中使用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;安卓&#34;&gt;安卓&lt;/h2&gt;&#xA;&lt;p&gt;安卓端的使用则是另一个极端&#xA;非常丝滑，除了词库不太给力，打字体验也很好，没有搜狗那些华而不实的功能&#xA;显得相对简洁。但是我觉得微信键盘以后一定会变得臃肿。懂的都懂。&lt;/p&gt;</description>
    </item>
    <item>
      <title>centos7安装后没有网络</title>
      <link>https://blog.sunpeiwen.com/posts/linuxcentos7_installed_no_network/</link>
      <pubDate>Tue, 29 Nov 2022 01:56:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/linuxcentos7_installed_no_network/</guid>
      <description>&lt;p&gt;以&lt;code&gt;root&lt;/code&gt;账号登陆&#xA;用&lt;code&gt;ip addr&lt;/code&gt;命令查看网络参数。&#xA;打开&lt;code&gt;eth0&lt;/code&gt;网卡的配置文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vi /etc/sysconfig/network-scripts/ifcfg-eth0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把&lt;code&gt;NOBOOT&lt;/code&gt;参数&lt;code&gt;no&lt;/code&gt;，修改为&lt;code&gt;yes&lt;/code&gt;&#xA;重启网络或者重启服务器都可&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS一键安装homebrew国内镜像</title>
      <link>https://blog.sunpeiwen.com/posts/macos_install_homebrew_in_china/</link>
      <pubDate>Fri, 29 Jul 2022 07:33:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/macos_install_homebrew_in_china/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 国内镜像的一键安装脚本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;官方给出的一键安装由于墙的原因可能无法安装成功。&#xA;所以找到了一个国内镜像的一键安装脚本&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/bin/zsh -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Xcode 编译applealc出现签名错误的解决方法</title>
      <link>https://blog.sunpeiwen.com/posts/solution-to-signature-error-in-xcode-compiling-applealc/</link>
      <pubDate>Mon, 01 Nov 2021 02:08:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/solution-to-signature-error-in-xcode-compiling-applealc/</guid>
      <description>&lt;p&gt;##报错如下&lt;/p&gt;&#xA;&lt;p&gt;In subcomponent: /Users/admin/Library/Developer/Xcode/DerivedData/AppleALC-fqueikknxpxowubueomyyxuwlnmg/Build/Products/Debug/AppleALC.kext/Contents/PlugIns/PinConfigs.kext/Contents/Info.plist.md5&#xA;Command CodeSign failed with a nonzero exit code&lt;/p&gt;&#xA;&lt;p&gt;##解决方法&#xA;在Other Code Signing Flags添加参数&amp;ndash;deep&lt;/p&gt;</description>
    </item>
    <item>
      <title>父亲节快乐</title>
      <link>https://blog.sunpeiwen.com/posts/happy-fathers-day/</link>
      <pubDate>Mon, 17 Jun 2019 11:13:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/happy-fathers-day/</guid>
      <description>&lt;p&gt;我知道今天来说会有点迟了&#xA;但是今天中午突然看到别人的父亲节有点感慨&#xA;在我读书的时候我很少给家里打电话&#xA;那时每当钱要花完的时候才会想起打电话回去给我的父亲&#xA;现在想想真是不太懂事&#xA;因为那时家里的经济状况并不好&#xA;回想起自己曾经的所作所为甚是惭愧&#xA;此生怕是无以为报&#xA;以后一定要多关心一下日渐老迈的父亲&#xA;从打个电话开始吧&lt;/p&gt;&#xA;&lt;p&gt;在此祝愿我的老父亲，父亲节快乐&lt;/p&gt;</description>
    </item>
    <item>
      <title>中国式相亲之现状</title>
      <link>https://blog.sunpeiwen.com/posts/life_xiangqin_china/</link>
      <pubDate>Sun, 24 Feb 2019 09:54:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/life_xiangqin_china/</guid>
      <description>&lt;p&gt;最近芒果台在播的《我家那闺女》&lt;/p&gt;&#xA;&lt;p&gt;我有在看，我特别喜欢的就是焦俊艳，美丽大方，主要是素颜也非常耐看&lt;/p&gt;&#xA;&lt;p&gt;其中所有父亲都焦虑的一个问题&lt;/p&gt;&#xA;&lt;p&gt;儿女的婚事&lt;/p&gt;&#xA;&lt;p&gt;说到这里最常见的套路莫过于相亲。&lt;/p&gt;&#xA;&lt;p&gt;所谓的相亲呢就是原本八竿子打不到一起去的两个人由于媒人这个神奇的存在而有了交集。&lt;/p&gt;&#xA;&lt;p&gt;当然我不抗拒相亲，相亲的确是给很多人解决了社交圈子小的问题，但是相亲很多时候存在的意义就是门当户对的思想。&lt;/p&gt;&#xA;&lt;p&gt;转念一想也没错。&lt;/p&gt;&#xA;&lt;p&gt;不同的成长环境造成很多人的三观未必一致。&lt;/p&gt;&#xA;&lt;p&gt;降低风险。&lt;/p&gt;&#xA;&lt;p&gt;最让我不能容忍的网络上的个别思想。&lt;/p&gt;&#xA;&lt;p&gt;认为学历低就是别人挑剩下来的。&lt;/p&gt;&#xA;&lt;p&gt;这种人有种莫名的优越感认为自己就应该卖个价钱的感觉。&lt;/p&gt;&#xA;&lt;p&gt;就好像在说我是你用不起的女人。&lt;/p&gt;&#xA;&lt;p&gt;这奇葩的观点我真是不敢苟同。&lt;/p&gt;&#xA;&lt;p&gt;很多高学历的人反而会更加慎重的对待自己的婚姻。&lt;/p&gt;&#xA;&lt;p&gt;虽说婚姻与爱情不能混为一谈，但是爱情毕竟是基础。&lt;/p&gt;&#xA;&lt;p&gt;相亲中的男女就好似在做买卖。&lt;/p&gt;&#xA;&lt;p&gt;我有房有车有学历有工作有存款你有啥&lt;/p&gt;&#xA;&lt;p&gt;说难听点一个像货比三家另外一个像待价而沽&lt;/p&gt;&#xA;&lt;p&gt;真。买卖婚姻是也&lt;/p&gt;</description>
    </item>
    <item>
      <title>新年快乐！猪年吉祥</title>
      <link>https://blog.sunpeiwen.com/posts/happy-new-year-auspicious-year-of-the-pig/</link>
      <pubDate>Tue, 05 Feb 2019 03:31:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/happy-new-year-auspicious-year-of-the-pig/</guid>
      <description>&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;50f4a7244046899f033caff5a510802b&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2019/02/05/2119169825.jpg&#34; alt=&#34;IMG_20190204_141839.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;IMG_20190204_141839.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;80f63c5d0e8c021e65e8482665990cd9&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2019/02/05/2410152950.png&#34; alt=&#34;Screenshot_2019-02-05-11-23-52-667_com.tencent.mm.png&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;Screenshot_2019-02-05-11-23-52-667_com.tencent.mm.png&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;祝愿大家新的一年里身体健康万事如意学业进步天天开心&lt;/p&gt;</description>
    </item>
    <item>
      <title>一个时代终将落幕</title>
      <link>https://blog.sunpeiwen.com/posts/life%E4%B8%80%E4%B8%AA%E6%97%B6%E4%BB%A3%E7%BB%88%E5%B0%86%E8%90%BD%E5%B9%95/</link>
      <pubDate>Tue, 30 Oct 2018 17:18:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/life%E4%B8%80%E4%B8%AA%E6%97%B6%E4%BB%A3%E7%BB%88%E5%B0%86%E8%90%BD%E5%B9%95/</guid>
      <description>&lt;p&gt;惊闻金庸先生去世的消息。&lt;/p&gt;&#xA;&lt;p&gt;自此金古梁黄四大家代表的武侠时代落下帷幕。&#xA;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/682de8655140a4f918512469001bb2f3.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_1024,h_682&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ring给我发消息&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/10/Screenshot_2018-10-31-01-08-52-085_com.tencent.mm_.jpg?x-oss-process=image/quality,q_50/resize,m_fill,w_512,h_1024&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;她始终记得我最喜欢古龙&lt;/p&gt;&#xA;&lt;p&gt;但是她可能不知道金庸先生的小说我几乎都读过&lt;/p&gt;&#xA;&lt;p&gt;很少联系的我们以后怕是再难相见了吧。&lt;/p&gt;&#xA;&lt;p&gt;难忘记那曾陪伴我度过漫长青春岁月的武侠小说&lt;/p&gt;&#xA;&lt;p&gt;那也是我的青春&lt;/p&gt;&#xA;&lt;p&gt;飞雪连天射白鹿。 笑书神侠倚碧鸳。&lt;/p&gt;&#xA;&lt;p&gt;金庸先生千古！&lt;/p&gt;</description>
    </item>
    <item>
      <title>英雄联盟全球总决赛淘汰赛之后</title>
      <link>https://blog.sunpeiwen.com/posts/after-the-league-finals-of-the-league-finals/</link>
      <pubDate>Sun, 21 Oct 2018 12:26:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/after-the-league-finals-of-the-league-finals/</guid>
      <description>&lt;p&gt;昨天一开始，IG便战胜了号称宇宙超级无敌战舰的KT。打破了无敌神话。&#xA;让我对RNG的比赛更加充满信息。&#xA;结果让人大跌眼镜。&#xA;G2以3：2战胜了我心中的夺冠对象RNG。&#xA;虽然我没有完整看完一场比赛。&#xA;但是我仍然关注这场比赛。&#xA;五年了。&#xA;我从S3便一直关注着皇族。期望他夺冠。&#xA;一年又一年。，今年的他们气势如虹拿下了各大赛事的冠军。几乎所有人都认为这是最有希望的一年。结果却差强人意。&lt;/p&gt;&#xA;&lt;p&gt;我相信会有人指责他们。&#xA;但是我更想鼓励他们。&#xA;既然已经输了。&#xA;就不要把输的借口放在已经无法挽回的假如上去。&lt;/p&gt;&#xA;&lt;p&gt;今天的比赛EDG输给了FNC。&#xA;经历了昨天的失落反而对今天的结果看淡了许多。&lt;/p&gt;&#xA;&lt;p&gt;可能我们一直以为LCK很强大。一直引进外援。把LCK当作假想敌。忽视了其他的对手。LCS他们同样强大且一直在成长。今天的结果便是为了告诉我们要尊重对手，谁都不能被轻视。&lt;/p&gt;&#xA;&lt;p&gt;原本我会见到小组第二干翻小组第一的。结果很遗憾。&lt;/p&gt;</description>
    </item>
    <item>
      <title>关于英雄联盟S8八强对抗的预测</title>
      <link>https://blog.sunpeiwen.com/posts/s8-lol/</link>
      <pubDate>Fri, 19 Oct 2018 10:12:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/s8-lol/</guid>
      <description>&lt;p&gt;明天会有两场BO5的比赛 分别是12:00 KT VS IG 16:00 RNG VS G2. 对于RNG我还是有信心的。IG则不太好说了。胜率不高。大约KT3:1IG。RNG则大概率3:1 G2。 RNG的状态的确有点不太稳定。但是调节能力还是可以的。特别是这个赛季的气势如虹给了RNG足够的信心。 我希望明天IG可以爆冷击败KT。&lt;/p&gt;</description>
    </item>
    <item>
      <title>15级强台风山竹即将登陆广东</title>
      <link>https://blog.sunpeiwen.com/posts/shanzhu/</link>
      <pubDate>Sat, 15 Sep 2018 11:42:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/shanzhu/</guid>
      <description>&lt;p&gt;鉴于其带来的巨大危害，2006年12月第39次世界气象组织台风委员会会议决定把台风“榴莲”除名！&lt;/p&gt;&#xA;&lt;p&gt;但是对水果执着热爱的泰国人民毅然决定用另一种水果给台风“榴莲”补位，补位的台风名称正是——“山竹”。&lt;/p&gt;&#xA;&lt;p&gt;作为超强台风“榴莲”的补位者，“山竹”果然不辱前辈之名，早在9月11日08时就完成究极进化，成为超强台风！&lt;/p&gt;&#xA;&lt;p&gt;来了！超强台风“山竹”即将冲进南海！&lt;/p&gt;&#xA;&lt;p&gt;9月14日17时其位于距我市1291公里的菲律宾以东洋面，中心风力17级以上（65米/秒，相当于234公里/小时），中心最低气压910百帕，将以30公里/时的速度向西北方向移动。&#xA;然而超强台风“山竹”虽然强大，也不是没有敌手。&#xA;当它靠近南海的时候，庞大的副热带高压早已在此恭候多日，超强台风“山竹”将不可避免地与华南沿海的霸主副热带高压来一场正面“对抗”!&#xA;预计“山竹”将于14日夜间横穿菲律宾吕宋岛北部山地，15日上午进入南海东北部海面，强度减弱，趋向粤西和海南东部沿海，16日夜间在上述地区以强台风或超强台风登陆，16日中午前后距我市最近200-300公里。&#xA;不排除在阳江至茂名之间登陆、对深圳造成更大风雨影响的可能。&lt;/p&gt;&#xA;&lt;p&gt;深圳市气象台已于2018年09月14日12时30分在全市发布台风白色预警，预计“山竹”将可能在48小时内影响我市，全市进入台风注意状态，遵照海事、渔政部门的防风指令或通知，做好避风准备。&lt;/p&gt;&#xA;&lt;p&gt;风力预报：台风“山竹”7级大风圈半径将达到700公里左右!受台风“山竹”影响，15日后半夜我市风力逐渐加大，16日白天沿海和高地最大阵风11-13级，内陆8-11级，16日下半夜风力开始减弱。&lt;/p&gt;</description>
    </item>
    <item>
      <title>写在MSI季中冠军赛RNG夺冠之后</title>
      <link>https://blog.sunpeiwen.com/posts/msi-rng-championship/</link>
      <pubDate>Sun, 27 May 2018 16:37:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/msi-rng-championship/</guid>
      <description>&lt;p&gt;MSI决赛 RNG VS KZ 中韩两个赛区的战斗&#xA;当天的比赛我是有看的，虽然KZ当时的表现状态并不是很好，但是我仍然觉得没有十足的信息&lt;/p&gt;&#xA;&lt;p&gt;因为仿佛有一个魔咒 也许是因为关切所以有点患得患失&lt;/p&gt;&#xA;&lt;p&gt;关注皇族关注小狗已经有五年了 五年过去了 小狗仍然是那个最强的ADC&lt;/p&gt;&#xA;&lt;p&gt;他终于夺冠了 他的获奖感言也让我很感动&lt;/p&gt;&#xA;&lt;p&gt;经历了太多的失败 胜利的喜悦难以言表&lt;/p&gt;&#xA;&lt;p&gt;在夺冠的那一刻全场都在呼喊uzi uzi&lt;/p&gt;&#xA;&lt;p&gt;这一刻全世界都是狗吹 永远记住这一天吧&lt;/p&gt;&#xA;&lt;p&gt;2018年5月20日皇族RNG3:1KZ获得2018年英雄联盟季中冠军赛冠军 &amp;amp;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/1.jpg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/2.jpeg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/3.jpeg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://mrwen.oss-cn-shanghai.aliyuncs.com/2018/05/K.jpg&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>十年</title>
      <link>https://blog.sunpeiwen.com/posts/ten-years/</link>
      <pubDate>Sat, 17 Mar 2018 12:34:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/ten-years/</guid>
      <description>&lt;p&gt;人生能有多少个十年呢&#xA;我不知道&#xA;我只知道我已过完了三个十年&#xA;半个月前我已经八十岁的外公给我打电话说家里给我提了一个对象&#xA;这女子是隔壁村的比我要小上两岁&#xA;聊了几天&#xA;后来不了了之&#xA;可能是我的性格不讨喜&#xA;真是对不起外公&#xA;这么大年纪了还在为我的婚姻操心&#xA;我与ring是高中的同学&#xA;做过同桌&#xA;跟所有俗烂的二流青春小说一样&#xA;我喜欢她&#xA;给她写过情书&#xA;虽没有亲口表白&#xA;但她应该也知道&#xA;她不喜欢我这样的&#xA;我也知道&#xA;后来就毕业上了大学&#xA;还有联系&#xA;再后来毕了业&#xA;就渐渐的没有了联系&#xA;今年过年她在朋友圈里发动态说她回来了&#xA;我看到之后 马上就去找她&#xA;因为第二天我就要去广东&#xA;见到了她&#xA;ring她跟十年前一样&#xA;她见我的第一句话就是培文你怎么胖成这个样子&#xA;我无奈笑笑&#xA;你的性格还跟以前一样&#xA;她笑着对我说 她给我看他女儿的照片&#xA;恍然间&#xA;十年仿佛转瞬间消失的一样&#xA;情谊还在&#xA;只不过我们都长大了&#xA;有了各自的生活&#xA;许久不见得朋友啊&#xA;在彼此的心中可能就没那么重要了&lt;/p&gt;</description>
    </item>
    <item>
      <title>得之我幸失之我命</title>
      <link>https://blog.sunpeiwen.com/posts/if-i-gain-i-am-fortunate-if-i-lose-it-is-my-fate/</link>
      <pubDate>Wed, 27 Dec 2017 02:51:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/if-i-gain-i-am-fortunate-if-i-lose-it-is-my-fate/</guid>
      <description>&lt;p&gt;前些时候在相亲微博上认识了一个湖北的妹子。&lt;/p&gt;&#xA;&lt;p&gt;人很漂亮，是我喜欢的类型。&lt;/p&gt;&#xA;&lt;p&gt;可我总是感觉自己没有太大的动力去追求这个女孩子。&lt;/p&gt;&#xA;&lt;p&gt;我自己把原因归咎于自我认知良好。&lt;/p&gt;&#xA;&lt;p&gt;换而言之，不够自信。&lt;/p&gt;&#xA;&lt;p&gt;实在是觉得自己不够优秀。&lt;/p&gt;&#xA;&lt;p&gt;可又很喜欢这个女孩子。&lt;/p&gt;&#xA;&lt;p&gt;每天在微信上聊两句。&lt;/p&gt;&#xA;&lt;p&gt;总是感觉自己不应该这样。&lt;/p&gt;&#xA;&lt;p&gt;有点无所适从。&lt;/p&gt;&#xA;&lt;p&gt;我看过很多心灵鸡汤。&lt;/p&gt;&#xA;&lt;p&gt;有说如果爱她就给她自由。&lt;/p&gt;&#xA;&lt;p&gt;或者祝她幸福此类的。&lt;/p&gt;&#xA;&lt;p&gt;我觉得这都是屁话。&lt;/p&gt;&#xA;&lt;p&gt;爱是矛盾的。&lt;/p&gt;&#xA;&lt;p&gt;有占有，也有奉献。&lt;/p&gt;&#xA;&lt;p&gt;两情相悦这种事情是随缘的。&lt;/p&gt;&#xA;&lt;p&gt;一见钟情是看脸的。&lt;/p&gt;&#xA;&lt;p&gt;说到底我还是为自己不够主动追求女孩子找了个理由。&lt;/p&gt;</description>
    </item>
    <item>
      <title>圣诞节</title>
      <link>https://blog.sunpeiwen.com/posts/christmas/</link>
      <pubDate>Mon, 25 Dec 2017 01:52:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/christmas/</guid>
      <description>&lt;p&gt;又是一年的圣诞节，对于这种洋节日，我们这些80后接受度还是很高的。&#xA;特别是在高中时代。&#xA;我怀念那段时光。&#xA;有些在读书的小朋友可能会问，为什么这些大人怀念的都是当初上学时候的事情？&#xA;明明上学一点都不好玩。&#xA;我不会告诉他们，学生时代是最美好的时代。&#xA;有单纯，热血，没有功利，分是非对错，有理想，有梦想。&#xA;因为现实真的会教做人。&#xA;我学会了慢慢的丢了节操，忘记了梦想，分不清对错，只追逐利益。&#xA;我可能会借口说，都是为了生活。&#xA;我喜欢的歌手朴树，去参加综艺节目的时候，别人问他，你为什么要来参加这样的节目呢？&#xA;他回答，我最近比较需要钱。&#xA;就是这么直接简单的一个人。&#xA;当年也是红极一时的歌手，从来不参加综艺节目的他，也不得不妥协，向着现实低头。&#xA;很多评论家说，如今的社会越来越浮躁，丢失信仰，争名逐利。&#xA;一切向钱看。&#xA;这一切都是悲哀的。&#xA;却是无法改变的。&#xA;人总要生活的吧。&#xA;朴树这样说。&#xA;圣诞节里本不该说这样的话题。&#xA;是我跑偏了。&#xA;圣诞节快乐！我许久不见的朋友们！&lt;/p&gt;</description>
    </item>
    <item>
      <title>中秋节快乐</title>
      <link>https://blog.sunpeiwen.com/posts/happy-midautumn-day/</link>
      <pubDate>Tue, 03 Oct 2017 22:14:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/happy-midautumn-day/</guid>
      <description>&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;691fe8393535c81dad041b800719d2ae&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/10/05/11972046.jpg&#34; alt=&#34;7159de36244874ffff0613ad783e48f3.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;7159de36244874ffff0613ad783e48f3.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;今年没有月饼。没有走亲戚。&#xA;家人也没有团圆。&#xA;就这样随随便便就过了。&#xA;没有丝毫的仪式感&lt;/p&gt;</description>
    </item>
    <item>
      <title>杀不死</title>
      <link>https://blog.sunpeiwen.com/posts/undead/</link>
      <pubDate>Thu, 17 Aug 2017 06:14:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/undead/</guid>
      <description>&lt;p&gt;昨天看完了一部网剧&amp;lt;杀不死&amp;gt;.觉得异常精彩.迫不及待要推荐一发.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;《杀不死》是由河北优映文化传播有限公司、上海见独影视有限公司联合出品的悬疑类网剧，由李洪绸、邢冬冬执导，杨羽、安宁、邵庄等主演。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;以上来自百度百科.&lt;/p&gt;&#xA;&lt;p&gt;虽然这部剧很早就在腾讯开播了.但是由于之前没什么时间.&amp;lt;-因为沉迷网游.&amp;gt;&#xA;昨天突然的就发现了这部剧.据说是豆瓣高分剧&amp;lt;毛骗&amp;gt;的原班人马.&#xA;故事的开头是监控里的金店抢劫案.可镜头一转就画风就转变成了 老实木讷的主角因为喜欢一个女孩被损友教唆偷女孩钱包制造邂逅机会.结果卷入了离奇的事件里.杀人,埋尸,火拼,逃亡.各种翻转剧情让人欲罢不能.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;8e8a9fb548fbb57ed1c9da522a119301&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/08/17/3339139527.jpg&#34; alt=&#34;杀不死剧照&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;杀不死剧照&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;在看这部剧的时候我就在想 ,如果&amp;lt;杀不死&amp;gt;这是部电影, 按目前每集30分钟共12集,大概有3个小时通过各种剪辑,大约也是可以实现的.&#xA;每集的开头都会用另外一个视角来讲述另外一个故事,解开案情的一部分.如果拍成电影应该就不会有这样的效果了.&lt;/p&gt;</description>
    </item>
    <item>
      <title>深夜食堂</title>
      <link>https://blog.sunpeiwen.com/posts/midnight-diner/</link>
      <pubDate>Fri, 16 Jun 2017 12:57:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/midnight-diner/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;午夜12点，报时钟响起，城市的一隅，属于一家食堂的时间开始了。菜谱只有猪肉套餐，但你想吃的都可以点。这就是老板(小林薰 饰)的经营方针。特殊的风格和怀念的味道，招来了不少的客人。大家喝着小酒，吃着自己钟情的食物，卸下一天的疲惫，谈论着遇到的趣事，或是独自品味忧愁。在食物的香气里，在深夜特有的幽静和食堂内的袅袅暖意间，一出出充满人情味的故事被娓娓道来。有悲有喜，暗合着食物的酸甜苦辣。人生百味，尽在这四方食堂间。&lt;/p&gt;&#xA;&lt;p&gt;本剧改编自安倍夜郎的同名漫画《深夜食堂》。蔡康永推荐给小s的漫画书。风靡中国大陆，台湾和日本。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;电视剧《深夜食堂》中国版自开播以来，就引发了爆炸性的话题争论，口碑和评分低到差点打破记录，豆瓣评分跌至2.3分.&#xA;原因不外乎大量的广告植入，吴昕的夸张白眼的演技。&#xA;说实话我本来是很期待这部剧的，为此在开播之前还去看了日本原版电视剧。&#xA;可是，没有对比就没有伤害。&#xA;日剧本身就有夸张的情绪表现方法，譬如一样食物特别好吃，日本人会非常夸张的大叫。&#xA;但是大部分中国人性格决定了，就算是极美味的食物也不会大声说太好吃了之类的话。顶多说一句，好吃，然后埋头大吃完事。&#xA;在这部翻拍剧里一碗方便面就能好吃到大吼大叫，抱歉，恕我不能理解。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;导演蔡岳勋表示“我们买的是漫画版权，安倍夜郎只提了四点要求：第一，就是老板脸上那条疤不准动。第二，老板不能有任何的背景交代。第三，菜单里不能有大菜。第四，你可以写上流社会的人，但是最后一定要把它拉回素人的世界，从素人的世界解释一切。我觉得都可以遵守和理解。”&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;不过在昨天播出的剧集中赵又廷再现神演技!更令不少观众看了后直接泪奔。&#xA;感觉赵又廷的演技还是在线的，特别是饰演听障码头工人，独力扶养女儿，却被迫面对扶养权争夺的处境，他在法院中一段约2分30秒嘶声力竭的演技，感动不少观众，演技赢得满满好评。&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;75c117dee19ce3a156539eab41e31826&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/16/2810889746.jpg&#34; alt=&#34;1497597173604.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;1497597173604.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>求婚大作战</title>
      <link>https://blog.sunpeiwen.com/posts/the-great-proposal-battle/</link>
      <pubDate>Mon, 05 Jun 2017 13:57:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/the-great-proposal-battle/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;《求婚大作战》（プロポーズ大作戦）是日本富士电视台于2007年4月16日至6月25日播出的爱情电视剧。由山下智久、长泽雅美主演。&#xA;该剧讲述了主人公岩瀬健一直暗恋青梅竹马吉田礼却没能告白，在参加她婚礼之时，借助妖精之力回到过去来完成他告白之路的故事。&#xA;2008年3月25日，推出特别篇《求婚大作战SP》。 2012年2月8日，由韩国TV朝鲜电视台推出翻拍版。&#xA;2017年4月24日，由张艺兴、陈都灵等人主演中国大陆翻拍版。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;时隔十年，中国也翻拍了当时日本热播的电视剧《求婚大作战》，剧情和台词都神还原原版电视剧，中国版大概就是原版11集加上《求婚大作战SP》，再加上本土化自编的最后三集。&#xA;改编的大概也只有各个角色的名字，以及妖精变成了天使。&#xA;我看这部青春校园爱情题材的电视剧主要是因为很喜欢陈都灵。&#xA;今天看完这最后三集，只能说其是狗尾续貂。男主没有向女主求婚也就罢了，竟然还穿越回了未来，这让整个故事的逻辑全线崩盘。&#xA;我对此剧的解读原本以为是让我们追忆有亲情友情和爱情的青春，珍惜眼前的一切。穿越回过去是为了让自己成长改正自己的错误，&#xA;没想到故事开展到了穿越未来我就懵逼啦，这未来所发生的一切让我对未来完全没有憧憬和希望啊。那穿越回未来的意义何在呢，与求婚完全没有关系。编剧大可直接让他们结婚然后打上大字“四十年后”不更好吗？&#xA;这种开放式的结局设定我是拒绝的。男主和女主结婚，快快乐乐生活在一起不是一个很好的happy ending，又点题又有观众爱看，真无力吐槽后三集。&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;5973dcd5138102aa7d5101ae16a220bc&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/49406005.jpg&#34; alt=&#34;求婚大作战&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;求婚大作战&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;14eb24c6eeaac4826e489a9733cd819c&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2391225472.jpg&#34; alt=&#34;求婚大作战2&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;求婚大作战2&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;PS，我也看到很多弹幕评论说，男主这样是找不到对象的，等等诸如此类的话。&#xA;其实这也可以算是本剧翻拍的一个BUG，要知道早在十年前可不像如今的风气如此开放，那时的男女谈恋爱连牵手都会感觉到害羞，相信当时像男主角这样的男生不在少数，所以我们这代人看这部剧才特别的代入感，并没有丝毫的违和感。&#xA;相反现在的少男少女看这部剧的时候也就只是看出了男主角的内向胆怯&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;f582fc955afc526a076b0133d0e16444&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1478383849.jpg&#34; alt=&#34;67de513bly1feudbcquv6j20rs0ijk8j.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;67de513bly1feudbcquv6j20rs0ijk8j.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;593f39e971623a59a496332ae3704a66&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/2427022229.jpg&#34; alt=&#34;67de513bly1feudbdovpbj20v90kue81.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;67de513bly1feudbdovpbj20v90kue81.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;83a752107948896db81866419b8e2076&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/1255852638.jpg&#34; alt=&#34;67de513bly1feudbm64a8j21jk112x6p.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;67de513bly1feudbm64a8j21jk112x6p.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;b51aacf2fb4866b651520afdfc1ed39d&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/06/05/4189057228.jpg&#34; alt=&#34;67de513bly1feudbnd1y6j232e21o1kz.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;67de513bly1feudbnd1y6j232e21o1kz.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>端午节祝词之争</title>
      <link>https://blog.sunpeiwen.com/posts/duanwu/</link>
      <pubDate>Wed, 31 May 2017 08:29:29 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/duanwu/</guid>
      <description>&lt;p&gt;一个很有意思的现象，从前几年开始，不知为何就有了端午节祝词之争。&#xA;有人专门发了文章称端午节应祝端午安康。&#xA;为此便引发了争论，端午节到底能不能祝端午节快乐？&#xA;在此且不论端午节的起源到底是为了什么。&#xA;难道节日不应该快乐吗？就为了快乐还是安康竟有人上升到了没有文化不尊重传统节日的程度。&#xA;（原文地址http://www.sohu.com/a/82256700_374728）&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;从端午节的起源来讲最权威的说法是源自于祭祀活动，而祭祀活动在古时也是可以快乐的节日，而非只能沉痛悼念之类。&#xA;看看知乎大神是怎么说的https://www.zhihu.com/question/31458559?sort=created&#xA;生日是母亲的受难日，干脆以后也别说生日快乐，直接说你妈辛苦了。六一儿童节是纪念纳粹屠杀儿童的，也别说儿童节快乐了，对得起那些被纳粹残害的儿童吗？国庆节是建国的庆典可曾有人想过为了祖国牺牲了多少名族先烈？传统文化就是被这些人弄的怪风气，明明是喜庆的节日，人家快乐你非让人家安康。总之还是矫情，人家说端午快乐，你就回端午快乐，人家说端午安康你就回端午安康，哪来的那么多破事！&lt;/p&gt;&#xA;&lt;p&gt;作者：白衣染清酒 链接：https://www.zhihu.com/question/31458559/answer/176189194&#xA;来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;完全就是因为矫情，然后来绑架观念。我们没道理为了道一句安康而感觉沾沾自喜，也没必要对方说了一句快乐而感觉自己高人一等必须纠正。&#xA;虽然端午节已经过了。但是我还是祝愿大家端午节快乐。&#xA;&lt;figure class=&#34;grap--figure&#34; data-id=&#34;e8dfd895b761754a6cc3fcb8c962152f&#34;&gt;&#xA;    &lt;img src=&#34;https://xy07-1251893119.costj.myqcloud.com/2017/05/31/2009231206.jpg&#34; alt=&#34;a7c03363947f434bac13394e6cd8addc_th.jpg&#34;  /&gt;&#xA;    &lt;figcaption class=&#34;imageCaption&#34;&gt;a7c03363947f434bac13394e6cd8addc_th.jpg&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>让Typecho文章内的超链接在新窗口打开</title>
      <link>https://blog.sunpeiwen.com/posts/typecho-target_blank/</link>
      <pubDate>Sat, 27 May 2017 12:13:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/typecho-target_blank/</guid>
      <description>&lt;p&gt;Markdown支持两种形式的链接语法：行内式和参考式两种形式。&#xA;而我们打开所生产的超链接，默认是在本窗口打开的，为了有更好的阅读体验，我们往往希望在新窗口。&#xA;要想让Typecho的文章中链接加上&lt;code&gt;“_blank”&lt;/code&gt;，也有很多种方法，比如通过jQuery在网页搜索&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签，为其添加新窗口属性。&#xA;下面这种方式是直接修改Typecho程序源码，来实现：&#xA;在&lt;code&gt;\var\CommonMark\HtmlRenderer.php&lt;/code&gt; 搜索&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    case CommonMark_Element_InlineElement::TYPE_LINK:&#xA;    $attrs[&amp;#39;href&amp;#39;] = $this-&amp;gt;escape($inline-&amp;gt;getAttribute(&amp;#39;destination&amp;#39;), true);&#xA;    if ($title = $inline-&amp;gt;getAttribute(&amp;#39;title&amp;#39;)) {&#xA;        $attrs[&amp;#39;title&amp;#39;] = $this-&amp;gt;escape($title, true);&#xA;    }&#xA;    &#xA;    return $this-&amp;gt;inTags(&amp;#39;a&amp;#39;, $attrs, $this-&amp;gt;renderInlines($inline-&amp;gt;getAttribute(&amp;#39;label&amp;#39;)));&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在return前加上下面这段代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $attrs[&amp;#39;target&amp;#39;] = &amp;#39;_blank&amp;#39;; // 给链接增加_blank属性&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>关于网恋</title>
      <link>https://blog.sunpeiwen.com/posts/online-dating/</link>
      <pubDate>Fri, 23 Dec 2016 07:34:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/online-dating/</guid>
      <description>&lt;p&gt;随着年龄越来越大，变得越来越不相信爱情。&lt;/p&gt;&#xA;&lt;p&gt;网恋更是让人觉得是浪费时间与精力的事情。&lt;/p&gt;&#xA;&lt;p&gt;其中充满了大量无意义的对话，甚至大量的虚假的问候，让人充满了怀疑，与自我怀疑。&lt;/p&gt;&#xA;&lt;p&gt;这都是因为双方的不信任。&lt;/p&gt;&#xA;&lt;p&gt;这可能与年龄有关。&lt;/p&gt;&#xA;&lt;p&gt;在我读书的时候，QQ是最流行的通讯工具，他的成本比发短信要来的实惠太多。&lt;/p&gt;&#xA;&lt;p&gt;那时候没有微信，但是每次上线都会有提醒，都会有许久不见的问候，那时的我们都是真实的自己。&lt;/p&gt;&#xA;&lt;p&gt;我们会把自己的真心话讲给他们听。&lt;/p&gt;&#xA;&lt;p&gt;他们包括熟识的同学朋友，以及素未谋面的网络另一端的那个熟悉的陌生人。&lt;/p&gt;&#xA;&lt;p&gt;年级再大了些，走出校园，走进社会。开&lt;/p&gt;&#xA;&lt;p&gt;始渐渐的学会把真话藏起来，把假话说给众人听。_&lt;/p&gt;&#xA;&lt;p&gt;于是_开始怀疑他人甚至自己的话。&lt;/p&gt;&#xA;&lt;p&gt;这网恋就越发艰难，虽说现在网恋的成本没有以前那么高，但实在是感觉不到感情了。&lt;/p&gt;&#xA;&lt;p&gt;是我们越长大越冷漠了吧。&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信也出企业版了</title>
      <link>https://blog.sunpeiwen.com/posts/wechat-enterprise-version/</link>
      <pubDate>Wed, 14 Dec 2016 13:20:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/wechat-enterprise-version/</guid>
      <description>&lt;p&gt;相同的套路，与QQ如出一辙。&lt;/p&gt;&#xA;&lt;p&gt;微信终于也出企业版了。&lt;/p&gt;&#xA;&lt;p&gt;与传统的微信相比，企业微信专注同事交流，与企业QQ异曲同工。&lt;/p&gt;&#xA;&lt;p&gt;界面简洁，没有了朋友圈这样浮躁鸡汤攀比充满了负能量的功能，感觉企业微信清爽极了。&lt;/p&gt;&#xA;&lt;p&gt;界面如下&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.imsun.pw/wp-content/uploads/2016/12/wp-1481721357343.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;&#xA;&lt;img src=&#34;https://www.imsun.pw/wp-content/uploads/2016/12/wp-1481721357343.png&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/a&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.imsun.pw/wp-content/uploads/2016/12/wp-1481721376246.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;&#xA;&lt;img src=&#34;https://www.imsun.pw/wp-content/uploads/2016/12/wp-1481721376246.png&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;是不是感觉很简洁明快。&lt;/p&gt;&#xA;&lt;p&gt;其中企业邮箱提醒也是很贴心啊，可以让邮件多的商务人士不错过任何一个重要提醒。&lt;/p&gt;&#xA;&lt;p&gt;而且登录也很方便用原微信快捷登录，联系人不同步，信息也互不干扰，联系人需要重新邀请，确保是属于同事关系。&lt;/p&gt;&#xA;&lt;p&gt;but,我不是商务人士，对我并没有任何卵用&lt;/p&gt;</description>
    </item>
    <item>
      <title>我们是如何变得平庸</title>
      <link>https://blog.sunpeiwen.com/posts/life-mediocrity/</link>
      <pubDate>Wed, 30 Nov 2016 04:52:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/life-mediocrity/</guid>
      <description>&lt;p&gt;&lt;strong&gt;我们为何渐渐平庸&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我并不清楚别人是如何走向平庸，我只能说说自己。&lt;/p&gt;&#xA;&lt;p&gt;我觉得自己就是个平庸的人。&lt;/p&gt;&#xA;&lt;p&gt;高不成也低不就。&lt;/p&gt;&#xA;&lt;p&gt;始终厮混在社会的底层。&lt;/p&gt;&#xA;&lt;p&gt;我用“混”来形容现在的生活，就是因为自己得过且过的心态。&lt;/p&gt;&#xA;&lt;p&gt;我曾读过很多心灵鸡汤，也从书中看过很多历史事迹，从媒体上了解过很多成功人士的成功历程。&lt;/p&gt;&#xA;&lt;p&gt;而我发现自己不能功成名就只能默默无闻，只是因为自己缺乏毅力，遇事怯懦，而且对现实无能为力，缺少创想。&lt;/p&gt;&#xA;&lt;p&gt;我一直都是在走一条大道，大多数人选择亦或者被迫走的路。&lt;/p&gt;&#xA;&lt;p&gt;那一少部分人走的小路以及捷径我是没办法见识到。&lt;/p&gt;&#xA;&lt;p&gt;这跟生长的环境有关。无法改变。&lt;/p&gt;&#xA;&lt;p&gt;虽然我不相信王侯将相宁有种，可现实如此。&lt;/p&gt;&#xA;&lt;p&gt;我觉得向现实低头这是一种很悲观的心态。&lt;/p&gt;&#xA;&lt;p&gt;也可以理解为这是我为自己寻找的借口。&lt;/p&gt;&#xA;&lt;p&gt;我正是这样每天为自己的犯错甚至懒惰找各种借口所以自己才变得越来越平庸。&lt;/p&gt;&#xA;&lt;p&gt;谁人不想活得精彩。&lt;/p&gt;&#xA;&lt;p&gt;成功的人只不过是少数。&lt;/p&gt;&#xA;&lt;p&gt;大多数人只是想活着而已。&lt;/p&gt;&#xA;&lt;p&gt;嗯，这不过是我的借口罢了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>又是拳头</title>
      <link>https://blog.sunpeiwen.com/posts/about_fist/</link>
      <pubDate>Fri, 18 Nov 2016 04:56:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/about_fist/</guid>
      <description>&lt;p&gt;中午吃饭的时候就在想，人类最早的时候是先有语言呢还是先有文字。&lt;/p&gt;&#xA;&lt;p&gt;至于史学家这么考证暂且不管，说说我的思路。&lt;/p&gt;&#xA;&lt;p&gt;最早的人类因为吃到了好吃的熟食或者渴望温暖与光明，所以学会了用火。&lt;/p&gt;&#xA;&lt;p&gt;吃了熟食之后发现自己拳头特别有力量，可以号令其他人。（参考动物世界）&lt;/p&gt;&#xA;&lt;p&gt;这时候是没有语言的，大家都是瞎比划。（嗷嗷嗷，参考猩猩）&lt;/p&gt;&#xA;&lt;p&gt;人们学会了养殖。&lt;/p&gt;&#xA;&lt;p&gt;要计数，这才有了最早的算筹。&lt;/p&gt;&#xA;&lt;p&gt;历史书上写的应该是绳子，后来发现绳子太脆弱，就改成刻在石头上。&lt;/p&gt;&#xA;&lt;p&gt;这应该是最早的文字。&lt;/p&gt;&#xA;&lt;p&gt;中国大部分文字其实都是象形文字，大约就是像什么画下来表示。&lt;/p&gt;&#xA;&lt;p&gt;至于这个读音嘛，大概就是一个部落一种理解，每个部落的发音都不太一样。&lt;/p&gt;&#xA;&lt;p&gt;后来才有了多音字。&lt;/p&gt;&#xA;&lt;p&gt;就是因为发音不统一造成的。&lt;/p&gt;&#xA;&lt;p&gt;说道这里可能有人会以为我跑题了。&lt;/p&gt;&#xA;&lt;p&gt;其实并没有，这一切都是跟拳头有关的。&lt;/p&gt;&#xA;&lt;p&gt;因为拳头，造就了阶级。&lt;/p&gt;&#xA;&lt;p&gt;因为拳头强迫人们学习。&lt;/p&gt;&#xA;&lt;p&gt;以及统一。（秦始皇真的很伟大）&lt;/p&gt;&#xA;&lt;p&gt;现在的人都说秦始皇暴虐，其实他就是为了千秋万代的统治才这样做。&lt;/p&gt;&#xA;&lt;p&gt;说到这里，其实这一切都是为了便于统治。&lt;/p&gt;&#xA;&lt;p&gt;推广儒家的思想，君子动口不动手，大家都做了君子，只动口，不动手。&lt;/p&gt;&#xA;&lt;p&gt;都不反抗，都不惹是生非，岂不是就天下太平了。&lt;/p&gt;&#xA;&lt;p&gt;统治者不就最喜欢看到这样的结果么。&lt;/p&gt;&#xA;&lt;p&gt;还是那句话，拳头大的说了算。&lt;/p&gt;&#xA;&lt;p&gt;而文明也是如此。&lt;/p&gt;&#xA;&lt;p&gt;侠以武犯禁,但是和平从来都是武力争取来的.&lt;/p&gt;</description>
    </item>
    <item>
      <title>压力山大</title>
      <link>https://blog.sunpeiwen.com/posts/tremendous-pressure/</link>
      <pubDate>Fri, 04 Nov 2016 10:20:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/tremendous-pressure/</guid>
      <description>&lt;p&gt;说实在话年近三十的压力真的有点大，没有结婚，也没什么存款，买不起车也买不起房，虽然不啃老，但是日子过的也不大理想。&lt;/p&gt;&#xA;&lt;p&gt;家中的老人始终都觉得如果你不结婚那以后肯定就是娶不到老婆了。&lt;/p&gt;&#xA;&lt;p&gt;我曾经因为这个理由去相亲，去面试，让本来不是很擅长与人打交道的我很是尴尬。&lt;/p&gt;&#xA;&lt;p&gt;当然结果是显而易见的，都没成功。 最近小草莓要结婚了。&lt;/p&gt;&#xA;&lt;p&gt;小草莓与我相识已经有十年了吧，当初就是在我维护的论坛上认识的妹子。&lt;/p&gt;&#xA;&lt;p&gt;不由得感叹时间真的快。&lt;/p&gt;&#xA;&lt;p&gt;小草莓是个软妹子。&lt;/p&gt;&#xA;&lt;p&gt;二次元少女。&lt;/p&gt;&#xA;&lt;p&gt;呃，姑且还算是少女吧。&lt;/p&gt;&#xA;&lt;p&gt;我虽然宅，但是我不混二次元，所以我对动漫啊日语啊都不熟悉。&lt;/p&gt;&#xA;&lt;p&gt;有时候觉得这么一大把年纪了还在混二次元真的是件很羞耻的事情。&lt;/p&gt;&#xA;&lt;p&gt;国庆节小草莓约我去广州陪她玩耍，我内心是拒绝的，所以我就婉约的拒绝了，国庆节人山人海也就罢了，去广州的路上还塞车，根本不值得去，何况我也不想去打搅他们的二人世界，去做一个闪光的人。&lt;/p&gt;&#xA;&lt;p&gt;我对她的先生一点都不熟悉，准确来说只在图片上见到过，根本没有与其本人打过交道。&lt;/p&gt;&#xA;&lt;p&gt;这个也是我拒绝去的理由。&lt;/p&gt;&#xA;&lt;p&gt;这辈子也不太可能有交集。&lt;/p&gt;&#xA;&lt;p&gt;在我们堂兄弟之中目前除了我没有结婚意外也就只有几个很小的没有结婚了。&lt;/p&gt;&#xA;&lt;p&gt;大部分比我小的堂弟都已经生了二胎。&lt;/p&gt;&#xA;&lt;p&gt;对此我觉得我应该是比不赢的了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>我的梦想</title>
      <link>https://blog.sunpeiwen.com/posts/my-dream/</link>
      <pubDate>Mon, 05 Sep 2011 11:38:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/my-dream/</guid>
      <description>&lt;p&gt;我有一个很大的梦想，就是每天都可以睡觉睡到自然醒。&lt;/p&gt;&#xA;&lt;p&gt;我有一个小小的幸福，就是每天都可以和我心爱的人一起生活。&lt;/p&gt;&#xA;&lt;p&gt;没有烦恼没有争吵。&lt;/p&gt;&#xA;&lt;p&gt;我有一个很大的愿望，就是每天都可以听到你们的笑声。&lt;/p&gt;&#xA;&lt;p&gt;我有一个小小的心愿，就是每天都可以和我亲爱的人一起生活。&lt;/p&gt;&#xA;&lt;p&gt;没有隔阂没有纷扰。&lt;/p&gt;&#xA;&lt;p&gt;孟子说，鱼与熊掌不可兼得。&lt;/p&gt;&#xA;&lt;p&gt;于是我的梦想无法实现，幸福无法掌握，愿望彻底落空，心愿没有念想。&lt;/p&gt;&#xA;&lt;p&gt;我多希望自己可以做到完美。&lt;/p&gt;&#xA;&lt;p&gt;有钱有势有车有房。&lt;/p&gt;&#xA;&lt;p&gt;我想没有人不希望这样。&lt;/p&gt;&#xA;&lt;p&gt;这得付出多大的努力才可以？&lt;/p&gt;&#xA;&lt;p&gt;这得付出多少努力才可以从我这样的情况进化成那样完美的形态？&lt;/p&gt;&#xA;&lt;p&gt;估计就跟猴子变成人一样得需要漫长的几万年吧。&lt;/p&gt;&#xA;&lt;p&gt;我不可能夸夸其谈说努力努力。&lt;/p&gt;&#xA;&lt;p&gt;我没有那样锐利的锋芒，没有那冲破一切的精神。&lt;/p&gt;&#xA;&lt;p&gt;我只能成为《老男孩》中那平凡到渣的无数人中的其中之一。&lt;/p&gt;&#xA;&lt;p&gt;如此。而已。&lt;/p&gt;</description>
    </item>
    <item>
      <title>一周之始</title>
      <link>https://blog.sunpeiwen.com/posts/at_the_beginning_of_the_week/</link>
      <pubDate>Mon, 08 Aug 2011 11:44:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/at_the_beginning_of_the_week/</guid>
      <description>&lt;p&gt;今天8月8号，星期一。&lt;/p&gt;&#xA;&lt;p&gt;立秋。&lt;/p&gt;&#xA;&lt;p&gt;网络上有人称今天是爸爸节。&lt;/p&gt;&#xA;&lt;p&gt;清早起床去拱北转车。&lt;/p&gt;&#xA;&lt;p&gt;这时天还下着小雨。&lt;/p&gt;&#xA;&lt;p&gt;如同往常，会在拱北车站买一份炒河粉做早餐，然后在巴士站坐等31路。&lt;/p&gt;&#xA;&lt;p&gt;珠海的公交车一直都很多人，降价之后的公交车挤得更加密不透风。&lt;/p&gt;&#xA;&lt;p&gt;都是上班的人们。&lt;/p&gt;&#xA;&lt;p&gt;赶时间，拼命的往车上塞。&lt;/p&gt;&#xA;&lt;p&gt;就像自己家灌香肠一样，使劲往里塞肉。&lt;/p&gt;&#xA;&lt;p&gt;我喜欢看着这些行色匆匆的路人。&lt;/p&gt;&#xA;&lt;p&gt;尽管我觉得这样会很拥挤。&lt;/p&gt;&#xA;&lt;p&gt;八点二十到了站，天已经晴了。&lt;/p&gt;&#xA;&lt;p&gt;太阳有些晒人。 不得不顶着阳光去往公司的方向。&lt;/p&gt;&#xA;&lt;p&gt;颇有段距离。&lt;/p&gt;&#xA;&lt;p&gt;刚好在八点半的时候到达公司打卡。&lt;/p&gt;&#xA;&lt;p&gt;上班的环境的确不怎么样。&lt;/p&gt;&#xA;&lt;p&gt;一进实验室热浪扑面而来。&lt;/p&gt;&#xA;&lt;p&gt;这样的情况之下任谁都会抱怨。&lt;/p&gt;&#xA;&lt;p&gt;小公司就这点，爱斤斤计较。&lt;/p&gt;&#xA;&lt;p&gt;空调坏了能用就行，也不修。&lt;/p&gt;&#xA;&lt;p&gt;一点都不制冷。也不管。&lt;/p&gt;&#xA;&lt;p&gt;热。闷热。&lt;/p&gt;&#xA;&lt;p&gt;热的我实在都懒得动了。&lt;/p&gt;&#xA;&lt;p&gt;边插科打诨的聊天打屁，边动动手打印几张图片，调几个墨水上机测试一下，然后写打印测试报告。&lt;/p&gt;&#xA;&lt;p&gt;好了。&lt;/p&gt;&#xA;&lt;p&gt;就这样一天过去了。&lt;/p&gt;&#xA;&lt;p&gt;多么充实的一天啊。&lt;/p&gt;&#xA;&lt;p&gt;过的真他妈有意义。&lt;/p&gt;&#xA;&lt;p&gt;PS 今天是爸爸节的话，我就祝我老爸身体健康长命百岁。&lt;/p&gt;&#xA;&lt;p&gt;虽然儿子不太听话经常惹你生气。&lt;/p&gt;&#xA;&lt;p&gt;可儿子长大了。&lt;/p&gt;&#xA;&lt;p&gt;您能别管的事就尽量别管了吧。&lt;/p&gt;&#xA;&lt;p&gt;气坏了身子，儿子也愧疚。&lt;/p&gt;</description>
    </item>
    <item>
      <title>现实就是这么现实</title>
      <link>https://blog.sunpeiwen.com/posts/that-is-just-how-reality-is/</link>
      <pubDate>Sat, 06 Aug 2011 09:20:00 +0000</pubDate>
      <guid>https://blog.sunpeiwen.com/posts/that-is-just-how-reality-is/</guid>
      <description>&lt;p&gt;我今年24了，属于大龄未婚青年了。&lt;/p&gt;&#xA;&lt;p&gt;在我们村子里这都属于奇闻轶事了。&lt;/p&gt;&#xA;&lt;p&gt;就是在那样一个仍然有封建思想残留的小村子里，我已然年迈的父亲找人说媒给我安排了相亲。&lt;/p&gt;&#xA;&lt;p&gt;相亲不是今年才流行来的，而是一直从遥远到不知道什么朝代流传下来的。&lt;/p&gt;&#xA;&lt;p&gt;我的老一辈，我的同辈，甚至我的小辈都注定要把这个模式延续下去。&lt;/p&gt;&#xA;&lt;p&gt;在父母的催说下我开始了我纠结的相亲之路。&lt;/p&gt;&#xA;&lt;p&gt;相亲是现实的，他关系到婚姻，他关系到子孙后代，他关系到家族兴旺，他关系到历史更迭。&lt;/p&gt;&#xA;&lt;p&gt;是这样的。我没有任何夸张。&lt;/p&gt;&#xA;&lt;p&gt;相亲的过程是矛盾而纠结的，有新鲜刺激，有仓皇失措。&lt;/p&gt;&#xA;&lt;p&gt;我总得找一个我喜欢的人来相爱来相守来相伴到死吧。&lt;/p&gt;&#xA;&lt;p&gt;所以，尽管我相亲的数量在增加但成功率一直没有丝毫见涨。&lt;/p&gt;&#xA;&lt;p&gt;我很灰心。总结起来有如下几点我没有做到。&lt;/p&gt;&#xA;&lt;p&gt;第一、彩礼。如今的我没有积蓄没有任何突出的收入。如何能拿出近10W的礼金？&lt;/p&gt;&#xA;&lt;p&gt;第二、房子。我没有丝毫的信心在我死之前可以买到一套房。&lt;/p&gt;&#xA;&lt;p&gt;第三、车。四个轮子的车没有。车马炮的车倒是有。&lt;/p&gt;&#xA;&lt;p&gt;第四、事业。糊口可以富足就永远也谈不上。&lt;/p&gt;&#xA;&lt;p&gt;就是这样的现实。&lt;/p&gt;&#xA;&lt;p&gt;相亲就是在这样的问题问答当中开始又结束。&lt;/p&gt;&#xA;&lt;p&gt;仓促的见面又仓促的各奔东西，在各自的记忆中丝毫不会留下半分的印象。&lt;/p&gt;&#xA;&lt;p&gt;这个社会理想永远是遥远的不可实现的。&lt;/p&gt;&#xA;&lt;p&gt;就是这么的现实。&lt;/p&gt;&#xA;&lt;p&gt;今天是七夕。&lt;/p&gt;&#xA;&lt;p&gt;祝福大家有情人终究分手。有钱人终成眷属。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
