<?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 Trim21&#39;s Blog</title>
    <link>https://blog.trim21.me/posts/</link>
    <description>Recent content in posts on Trim21&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 11 Mar 2025 02:31:16 +0800</lastBuildDate>
    <atom:link href="https://blog.trim21.me/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>caddy在内网中无法更新证书</title>
      <link>https://blog.trim21.me/2019/12/caddy-not-working-in-nat/</link>
      <pubDate>Mon, 23 Dec 2019 15:31:10 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/12/caddy-not-working-in-nat/</guid>
      <description>&lt;p&gt;NAS 上面运行了一个 caddy 服务器，还设置了 https。最近突然遇到了证书过期的问题.&lt;/p&gt;&#xA;&lt;p&gt;检查 log 发现是证书申请失败 &lt;code&gt;SERVFAIL for _acme-challenge.my_domain.&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;大概搜索了一下, 是因为路由器的 dnsmasq 过滤掉了完成验证需要的 dns 查询&lt;/p&gt;&#xA;&lt;p&gt;只要在 dnsmasq 设置中把 filterwin2k 参数禁用即可, 不同版本的 dnsmasq 禁用方法有些不同&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用手头已有资源尽可能高配的搭一台nas</title>
      <link>https://blog.trim21.me/2019/12/build-a-nas/</link>
      <pubDate>Mon, 23 Dec 2019 00:00:00 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/12/build-a-nas/</guid>
      <description>&lt;p&gt;现成已有的 nas：一台蜗牛星际 B 口单百兆，现在放了四块 500G 的硬盘租了一个 raid6。除去硬盘成本 268（机器）+200（电源）, 硬盘是旧硬盘. 用了三四个月之后已经有三四块硬盘报警了.&lt;/p&gt;&#xA;&lt;p&gt;总是觉得有些不爽，主要是又不想把现有 nas 里面的数据都拷出来换硬盘，又觉得现在的百兆和 1T 容量不太能让人满意，所以想搞一个千兆的高性能 nas。&lt;/p&gt;&#xA;&lt;p&gt;看了看市面上 nas 的价格，感觉硬件配置又不太对的起价格，于是决定自己搞一个。正好自己现在还闲置着一台核显的 itx 小机器&lt;/p&gt;&#xA;&lt;h2 id=&#34;手头硬件&#34;&gt;手头硬件&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cpu-和主板&#34;&gt;CPU 和主板&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;四代 i3 主板 4 个 sata3, 一个 m2 接口, 一个 pci-e 16x 接口, 两个 ddr4 内存接口&lt;/li&gt;&#xA;&lt;li&gt;J1900, 主板两个 sata2 接口, 两个 ddr3 内存接口.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;内存&#34;&gt;内存&lt;/h3&gt;&#xA;&lt;p&gt;两条 4g 台式机 ddr4 内存&lt;/p&gt;&#xA;&lt;p&gt;一条 ddr3 内存接口&lt;/p&gt;&#xA;&lt;h3 id=&#34;硬盘&#34;&gt;硬盘&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;闪迪 Sata3 256G SSD&lt;/li&gt;&#xA;&lt;li&gt;两条杂牌 M2 128G SSD&lt;/li&gt;&#xA;&lt;li&gt;两块 2.5 寸机械硬盘 500G 1T&lt;/li&gt;&#xA;&lt;li&gt;五块 3.5 寸机械硬盘 均 500G, 目前看来是不够的, 还会再买.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;购入 256g nvme ssd 一条, 牌子就不说了&lt;/p&gt;</description>
    </item>
    <item>
      <title>用pyenv安装python</title>
      <link>https://blog.trim21.me/2019/12/pyenv-build-python/</link>
      <pubDate>Mon, 23 Dec 2019 00:00:00 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/12/pyenv-build-python/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/pyenv/pyenv&#34;&gt;pyenv&lt;/a&gt;是用来安装多个版本的 python&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://cdn.jsdelivr.net/gh/pyenv/pyenv-installer/bin/pyenv-installer | bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(用 jsdeliver 是因为 raw.githubusercontent.com 现在访问不通了)&lt;/p&gt;&#xA;&lt;p&gt;启用 cache，用于缓存下载的 python 源代码:&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p .pyenv/cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 ccache, 可以缓存编译中产生的中间文件，不是必需，但是在多次构建统一版本的 python 时可以有效加速。&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/yyuu/pyenv-ccache.git $(pyenv root)/plugins/pyenv-ccache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install ccache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装过程中会出现的错误&lt;/p&gt;&#xA;&lt;p&gt;zipimport.ZipImportError: can&amp;rsquo;t decompress data; zlib not available&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install zlib1g-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install libbz2-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?&lt;/p&gt;</description>
    </item>
    <item>
      <title>输入法切换到Rime</title>
      <link>https://blog.trim21.me/2019/10/migrate-to-rime/</link>
      <pubDate>Wed, 23 Oct 2019 00:00:00 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/10/migrate-to-rime/</guid>
      <description>&lt;p&gt;QQ 拼音终于也开始弹广告了，所以一怒之下准备删了。&lt;/p&gt;&#xA;&lt;p&gt;又不能没输入法用，就用上了小狼毫。记录一下这中间遇到的若干坑。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.trim21.me/static/rime-preview.jpg&#34; alt=&#34;最终设置的效果&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&#xA;&lt;p&gt;一路下一步，唯一的坑在于&lt;code&gt;自定义用户文件夹&lt;/code&gt;这个功能。&lt;strong&gt;不要设置自定义用户文件夹&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;如果是为了 rime 的多平台同步，rime 有另一个同步功能可以进行同步，而不需要同步整个用户文件夹。&lt;/p&gt;&#xA;&lt;p&gt;rime 有一个包管理器，但是这个包管理器在 windows 上并不能正确的识别用户文件夹：无论用户怎么设置，包管理器都会认为用户文件夹在默认的 &lt;code&gt;%APPDATA%/rime&lt;/code&gt;。包管理器也只会把下载到文件安装到这个路径里面，但小狼毫只从用户设置的文件夹中加载配置。这样一来，包管理器完全无法工作。&lt;/p&gt;&#xA;&lt;h2 id=&#34;同步&#34;&gt;同步&lt;/h2&gt;&#xA;&lt;p&gt;同步 rime 有一个自带的同步功能，也就是安装完后看到的&lt;code&gt;【小狼毫】用戶資料同步&lt;/code&gt;开始菜单选项。&lt;/p&gt;&#xA;&lt;p&gt;首先打开用户文件夹中的&lt;code&gt;installtion.yaml&lt;/code&gt;（我就不介绍 yaml 语法了）&#xA;，添加一个&lt;code&gt;sync_dir&lt;/code&gt;选项指向你想要同步的位置，比如我设置的是&lt;code&gt;$OneDrive/rime&lt;/code&gt;，那么在点击同步之后，rime 会在&lt;code&gt;$sync_dir&lt;/code&gt;文件夹下新建一个文件夹，名为这个文件里面的&lt;code&gt;id&lt;/code&gt;一项（这一项你也是可以改的，比如我改成了&lt;code&gt;windows&lt;/code&gt;），然后把你这台机器里面的所有配置和和词库同步过去。&lt;/p&gt;&#xA;&lt;p&gt;如果 rime 在这个文件夹下面还找到了其他机器的同步结果，他还会合并其他机器的词库，所以只要定时的让小狼毫自动同步，就能解决多台机器的同步问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;设置&#34;&gt;设置&lt;/h2&gt;&#xA;&lt;p&gt;Rime 所有的设置（除了词库文件）都是 yaml，为了能合并不同的 YAML 中的，rime 用到了一些关键词比如&lt;code&gt;patch&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;小狼毫的配置文件在&lt;code&gt;$RIME_CONFIG_DIR/weasel.custom.yaml&lt;/code&gt;中。&lt;/p&gt;&#xA;&lt;h3 id=&#34;设置外观&#34;&gt;设置外观&lt;/h3&gt;&#xA;&lt;h4 id=&#34;设置候选词数量&#34;&gt;设置候选词数量&lt;/h4&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;-webkit-text-size-adjust:none;&#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;patch&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;&amp;#34;menu/page_size&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;设置主题&#34;&gt;设置主题&lt;/h4&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;-webkit-text-size-adjust:none;&#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;patch&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;&amp;#34;style/color_scheme&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;steam&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;&amp;#34;style/font_face&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft YaHei&amp;#34;&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;&amp;#34;style/font_point&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;14&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;&amp;#34;style/horizontal&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;style/layout/margin_x&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&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;&amp;#34;style/layout/margin_y&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&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;&amp;#34;style/layout/spacing&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;style/layout/candidate_spacing&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;style/layout/round_corner&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&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;# 还有一些额外的设置，这不是完整的列表，只是我用到的&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;style/color_scheme&lt;/code&gt; 设置了内置的配色方案，完整的列表可以在这里找到 &lt;a href=&#34;https://github.com/rime-aca/color_schemes&#34;&gt;https://github.com/rime-aca/color_schemes&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>给win10应用商店设置代理</title>
      <link>https://blog.trim21.me/2019/06/set-proxy-for-win10-store/</link>
      <pubDate>Wed, 26 Jun 2019 21:32:31 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/06/set-proxy-for-win10-store/</guid>
      <description>&lt;p&gt;最近网络状况实在是不好,用 win10 应用商店下载应用怎么也不成功.修改系统代理也不管用.&#xA;参照&lt;a href=&#34;https://sspai.com/post/41137&#34;&gt;少数派的这篇文章&lt;/a&gt;设置了代理,总算是解决了问题.&lt;/p&gt;&#xA;&lt;p&gt;其中,最麻烦的是找到对应 uwp 应用的 sid,因为是要在表里一项一项的去找.&lt;/p&gt;&#xA;&lt;p&gt;win10 商店对应的应用在注册表中的&lt;code&gt;DisplayName&lt;/code&gt;是&lt;code&gt;Microsoft.WindowsStore&lt;/code&gt;,&#xA;所以遍历&lt;code&gt;HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings&lt;/code&gt;的所有子 key,找到对应&lt;code&gt;DisplayName&lt;/code&gt;中包含&lt;code&gt;Microsoft.WindowsStore&lt;/code&gt;的一项就可以了.&lt;/p&gt;&#xA;&lt;p&gt;因为手动一项一项的去找效率实在是太低,就直接写了个 python 脚本来遍历.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; winreg&#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;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;iterkeys&lt;/span&gt;(key):&#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;# 获取该键的所有子键，因为没有方法可以获取子键的个数，所以只能用这种方法进行遍历&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;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i &lt;span style=&#34;color:#f92672&#34;&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;while&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;            &lt;span style=&#34;color:#75715e&#34;&gt;# EnumValue方法用来枚举键值，EnumKey用来枚举子键&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;yield&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;EnumKey(key, i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            i &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;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WindowsError&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;&#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;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;itervalues&lt;/span&gt;(key):&#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;# 获取该键的所有键值，因为没有方法可以获取键值的个数，所以只能用这种方法进行遍历&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d &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;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i &lt;span style=&#34;color:#f92672&#34;&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;while&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;            &lt;span style=&#34;color:#75715e&#34;&gt;# EnumValue方法用来枚举键值，EnumKey用来枚举子键&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name, value, _ &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;EnumValue(key, i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            d[name] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            i &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;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WindowsError&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; d&#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;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    base_key &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:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Software\Classes\Local Settings\Software&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:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\Microsoft\Windows\CurrentVersion\AppContainer\Mappings&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#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;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;    mappings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;OpenKey(winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HKEY_CURRENT_USER, base_key)&#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; key &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; iterkeys(mappings):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;OpenKey(winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HKEY_CURRENT_USER, base_key &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        info &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; itervalues(k)&#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:#e6db74&#34;&gt;&amp;#39;WindowsStore&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DisplayName&amp;#39;&lt;/span&gt;]:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DisplayName&amp;#39;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(key)&#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;break&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;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接保存成 py 文件,然后运行,控制台的第二行会输出类似&lt;code&gt;S-1-15-2-****&lt;/code&gt;的一个 SID,就是在&lt;code&gt;CheckNetIsolation.exe loopbackexempt -a -p=${SID}&lt;/code&gt;中要用到的 SID.&lt;/p&gt;</description>
    </item>
    <item>
      <title>用PyInstaller打包python应用</title>
      <link>https://blog.trim21.me/2019/06/build-python-package-with-pyinstaller/</link>
      <pubDate>Sun, 02 Jun 2019 23:47:34 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/06/build-python-package-with-pyinstaller/</guid>
      <description>&lt;p&gt;那天突然好奇，&lt;code&gt;docker-compose&lt;/code&gt;是用什么语言写的。然后一看，发现居然是用 python2 写的。&lt;/p&gt;&#xA;&lt;p&gt;但想到我安装的时候从来没在乎过机器上有没有安装 python，或者我的 python 版本是多少，而是按照官网的文档，直接下载一个二进制文件来安装的。突然眼前一亮。看了一下对应的构建代码，发现他是用&lt;a href=&#34;https://github.com/pyinstaller/pyinstaller&#34;&gt;&lt;code&gt;PyInstaller&lt;/code&gt;&lt;/a&gt;来进行打包的，把一个 python 应用打包成单个的二进制文件。&lt;/p&gt;&#xA;&lt;p&gt;一般来说，正常的 python 包的分发会基于 pip 的，发布到 pypi 和用户下载的都是代码文件（和其他语言编译的二进制文件），如果依赖于其他的 package 会在安装的时候再进行下载。&lt;/p&gt;&#xA;&lt;p&gt;但用&lt;code&gt;PyInstaller&lt;/code&gt;，打包出来的可执行文件中包含了所有用到的依赖和 python 解释器，并不需要本机安装了 python 或者 pip，像 docker-compose 这样的工具，打包之后成一个单文件，对于用户在安装和使用的时候都会方便许多，而对于我们开发者来说，就不用考虑兼容旧的 python 版本，可以直接使用 python3.6 的新语法如 type annotation 等，使用某些只有 python3.6 以上版本才能用的依赖库，自然也比原来爽了许多。&lt;/p&gt;&#xA;&lt;p&gt;首先，PyInstaller 的工作原理是从一个 py 文件出发在静态分析出所有用到的依赖，然后把所有的依赖打包起来，在用户使用二进制的时候释放到一个临时文件夹中，用 Python 解释器来运行。&lt;/p&gt;&#xA;&lt;p&gt;PyInstaller 入门的文章已经有很多了，就不再重复写一遍了，主要遇到的坑有这么几个。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用到的非-py-文件要手动指定路径一起打包&#34;&gt;用到的非 py 文件要手动指定路径一起打包&lt;/h2&gt;&#xA;&lt;p&gt;我的程序中用到了一些模板文件，是在程序运行起来之后才根据需要加载决定是否渲染的。这些文件因为不是 python 文件，所以 PyInstaller 在分析的时候也不会知道是程序的一部分，就不会打包在二进制中。&lt;/p&gt;&#xA;&lt;p&gt;在程序运行的时候，如果用到了对应的文件，因为没有被打包进来的缘故，程序就会报错。&lt;/p&gt;&#xA;&lt;p&gt;如果用命令行来指定要一起打包的文件效率过低，所以可以编写一个 spec 文件来告诉 PyInstaller 要如何打包。&lt;/p&gt;&#xA;&lt;p&gt;（这是我之前尝试打包我的程序是用到的 spec 文件，但是因为不支持&lt;code&gt;entry_points&lt;/code&gt;的原因，所以我最后放弃了使用这个办法，但是打包出来的程序在不用到&lt;code&gt;entry_points&lt;/code&gt;的情况下是跟直接使用 pip 安装行为一致的。）&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;bgmi.spec&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -*- mode: python -*-&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;from&lt;/span&gt; PyInstaller.building.api &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; EXE, PYZ&#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;from&lt;/span&gt; PyInstaller.building.build_main &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Analysis&#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;import&lt;/span&gt; os&#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;import&lt;/span&gt; os.path&#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;import&lt;/span&gt; importlib&#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;bindata_dir &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:#e6db74&#34;&gt;&amp;#39;bgmi/front/templates&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:#e6db74&#34;&gt;&amp;#39;bgmi/lib/models/migrations&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:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_bindata&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; dir_path &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; bindata_dir:&#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; file &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(dir_path):&#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;yield&lt;/span&gt; (os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(dir_path, file), dir_path)&#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;block_cipher &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;package_imports &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;peewee_migrate&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;template.txt&amp;#39;&lt;/span&gt;]]]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;datas &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; list(get_bindata())&#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;for&lt;/span&gt; package, files &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; package_imports:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    proot &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dirname(importlib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;import_module(package)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__file__)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    datas&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;extend((os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(proot, f), package) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; files)&#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;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Analysis([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bgmi/__main__.py&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             pathex&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;             hiddenimports&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;             hookspath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             datas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;datas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             runtime_hooks&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             cipher&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;block_cipher)&#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;pyz &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; PYZ(a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pure, cipher&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;block_cipher)&#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;exe &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; EXE(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pyz,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;scripts,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;binaries,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;zipfiles,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;datas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bgmi&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    debug&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    strip&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    upx&lt;span style=&#34;color:#f92672&#34;&gt;=&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;    console&lt;span style=&#34;color:#f92672&#34;&gt;=&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;    bootloader_ignore_signals&lt;span style=&#34;color:#f92672&#34;&gt;=&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;a = Analysis([&#39;bgmi/__main__.py&#39;],&lt;/code&gt;为程序的入口就是原本如果使用命令行的话，在 PyInstaller 后面跟的那个 py 文件路径。&lt;/p&gt;</description>
    </item>
    <item>
      <title>参与python文档的中文翻译</title>
      <link>https://blog.trim21.me/2019/03/join-python-zh-cn-translaters/</link>
      <pubDate>Sun, 31 Mar 2019 01:28:36 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/03/join-python-zh-cn-translaters/</guid>
      <description>&lt;p&gt;今天看到这个帖子&lt;a href=&#34;https://www.v2ex.com/t/550164&#34;&gt;别开心太早， Python 官方文档的翻译差远了 - V2EX&lt;/a&gt; 发现参与 python 文档翻译的门槛还挺低的，就尝试了一下翻译了两段文档.&lt;/p&gt;&#xA;&lt;h2 id=&#34;参与翻译的方法&#34;&gt;参与翻译的方法&lt;/h2&gt;&#xA;&lt;p&gt;按照 &lt;a href=&#34;https://www.python.org/dev/peps/pep-0545/&#34;&gt;pep-545&lt;/a&gt;的说法, 有三步需要做:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;注册一个 &lt;a href=&#34;https://bugs.python.org&#34;&gt;https://bugs.python.org&lt;/a&gt; 的账号, 这个用户名在签 license 的时候会用到.&lt;/li&gt;&#xA;&lt;li&gt;签 license &lt;a href=&#34;https://www.python.org/psf/contrib/&#34;&gt;介绍&lt;/a&gt; 具体签署是在&lt;a href=&#34;https://www.python.org/psf/contrib/contrib-form/&#34;&gt;这个页面上&lt;/a&gt; 用的 adobe sign, 填完那个 iframe 里面的几个框就能提交了.&lt;/li&gt;&#xA;&lt;li&gt;注册 transifex, 选择自己的语言, 并且&lt;a href=&#34;https://www.transifex.com/python-doc/python-newest/&#34;&gt;申请加入&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;然后等待被允许加入团队, 然后就可以开始翻译了.&lt;/p&gt;&#xA;&lt;p&gt;翻译是以每段为单位进行的&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.trim21.me/static/bd69bf14ly1g1l2x2j9x2j20yh0po7fd.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/python/python-docs-zh-cn&#34;&gt;python/python-docs-zh-cn: zh_CN translation of the Python documentation&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;中文的 po 文件在这个仓库里, 每个小时会有一个 bot 会自动把 transifex 上面的翻译同步到仓库里面去, 但是自己的名字并不会出现在这个仓库的 contributors 里面, 233&lt;/p&gt;</description>
    </item>
    <item>
      <title>golang笔记</title>
      <link>https://blog.trim21.me/2018/11/learning-golang/</link>
      <pubDate>Thu, 01 Nov 2018 17:25:15 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/11/learning-golang/</guid>
      <description>&lt;h2 id=&#34;一些约定&#34;&gt;一些约定&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用驼峰命名法&lt;/li&gt;&#xA;&lt;li&gt;首字母小写的变量/函数只能在包内使用(多按一次 shift 我要累死了, 虽然编辑器有时在小写输入的情况下也会自动补全大写内容, 但有时不是那么聪明)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;数据类型&#34;&gt;数据类型&lt;/h2&gt;&#xA;&lt;h3 id=&#34;bool&#34;&gt;bool&lt;/h3&gt;&#xA;&lt;p&gt;布尔, &lt;code&gt;true&lt;/code&gt;或者&lt;code&gt;false&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;string&#34;&gt;string&lt;/h3&gt;&#xA;&lt;p&gt;字符串, 使用双引号 比如&lt;code&gt;&amp;quot;hello world&amp;quot;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;rune&#34;&gt;rune&lt;/h3&gt;&#xA;&lt;p&gt;类似于字符, 在使用&lt;code&gt;for _, char := range string&lt;/code&gt;迭代 string 的时候, char 的类型就是 rune&lt;/p&gt;&#xA;&lt;h3 id=&#34;int&#34;&gt;int&lt;/h3&gt;&#xA;&lt;p&gt;未分 int8, int16, int32 等等, 可能有些 api 返回的是 uint 类型, 使用&lt;code&gt;int()&lt;/code&gt;转化为 int&lt;/p&gt;&#xA;&lt;h3 id=&#34;byte&#34;&gt;byte&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;[]byte&lt;/code&gt;可以跟 string 互相转化, &lt;code&gt;len(string)&lt;/code&gt;的长度实际上就是 string 转化为&lt;code&gt;[]byte&lt;/code&gt;之后的长度. 每个 unicode 的长度为 3. 比如说&lt;code&gt;len(&amp;quot;hello world&amp;quot;)==11&lt;/code&gt;, 但是&lt;code&gt;len(&amp;quot;你好 世界&amp;quot;)&lt;/code&gt;的长度为 3+3+1=7. 每个汉字因为是 unicode 所以为 3.&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;/p&gt;&#xA;&lt;h4 id=&#34;slice&#34;&gt;slice&lt;/h4&gt;&#xA;&lt;p&gt;可变长度&lt;/p&gt;</description>
    </item>
    <item>
      <title>在UserScript中使用Vue</title>
      <link>https://blog.trim21.me/2018/10/use-vue-in-userscript/</link>
      <pubDate>Thu, 11 Oct 2018 15:26:00 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/10/use-vue-in-userscript/</guid>
      <description>&lt;p&gt;之前写了一个用户脚本, &lt;a href=&#34;https://github.com/Trim21/bgm-tv-auto-tracker&#34;&gt;在站外一键点 bgm 格子&lt;/a&gt; 为了添加一个 UI, 但又不想用 jQuery 手动绑一堆事件, 就直接上了 Vue. 所以需要用 Webpack 打包对应的 vue 文件到 userscript 里.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.trim21.me/static/bd69bf14ly1fw4c4bspy5j20b10cagmq.jpg&#34; alt=&#34;效果图&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;按钮和弹出框都是 Vue 做的.&lt;/p&gt;&#xA;&lt;p&gt;因为之前一直用的是&lt;code&gt;vue-cli&lt;/code&gt;提供的 webpack 模板, 所以不太熟悉 webpack, 踩了不少坑.&lt;/p&gt;&#xA;&lt;p&gt;参考&lt;a href=&#34;https://vue-loader.vuejs.org/guide/&#34;&gt;vue-loader&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先在 webpack 的设置中添加一个&lt;code&gt;loader&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// webpack.config.js&#xA;&lt;/span&gt;&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;VueLoaderPlugin&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vue-loader/lib/plugin&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:#a6e22e&#34;&gt;module&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&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;module&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;rules&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:#75715e&#34;&gt;// ... other rules&#xA;&lt;/span&gt;&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;test&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/\.vue$/&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;loader&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vue-loader&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:#a6e22e&#34;&gt;options&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;loaders&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;scss&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vue-style-loader!css-loader!postcss-loader!sass-loader&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:#75715e&#34;&gt;// &amp;lt;style lang=&amp;#34;scss&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;          },&#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;  },&#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;plugins&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:#75715e&#34;&gt;// make sure to include the plugin!&#xA;&lt;/span&gt;&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;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;VueLoaderPlugin&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;然后在代码里, 参照 Vue 官方的模板, 只要初始化一个实例就能正常显示内容了.&lt;/p&gt;</description>
    </item>
    <item>
      <title>生成bgm.tv关联条目网络</title>
      <link>https://blog.trim21.me/2018/10/bgm.tv-ip-viewer/</link>
      <pubDate>Thu, 11 Oct 2018 10:50:36 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/10/bgm.tv-ip-viewer/</guid>
      <description>&lt;p&gt;本项目已弃坑。&lt;/p&gt;&#xA;&lt;p&gt;在 bgm 上看到有人说现在的关联图只有一层, 看起来不太方便, 就爬了全站数据做了这么个东西.&lt;/p&gt;&#xA;&lt;h1 id=&#34;爬取数据并生成关联条目网络&#34;&gt;爬取数据并生成关联条目网络&lt;/h1&gt;&#xA;&lt;h2 id=&#34;爬取数据&#34;&gt;爬取数据&lt;/h2&gt;&#xA;&lt;p&gt;爬数据用的是&lt;code&gt;scrapy&lt;/code&gt;, 因为本站有请求速度的限制, 所以数据源是镜像站.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;scrapy&lt;/code&gt;的流程是这样的, 首先继承&lt;code&gt;scrapy.Item&lt;/code&gt;来定义你自己爬到的数据的模型.&lt;/p&gt;&#xA;&lt;p&gt;比如我定义了条目 item&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; scrapy&#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;from&lt;/span&gt; scrapy &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Field&#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;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SubjectItem&lt;/span&gt;(scrapy&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Item):&#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;# define the fields for your item here like:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subject_type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name_cn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tags &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    info &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#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;    score &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#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;    score_details &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#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;    wishes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    done &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    doings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    on_hold &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dropped &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Field()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每个&lt;code&gt;Field()&lt;/code&gt;中保存的的数据类型可以是 &lt;code&gt;str&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;等基础的数据类型, 也可以是&lt;code&gt;list&lt;/code&gt;, &lt;code&gt;dict&lt;/code&gt;这种组合类型.&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于asyncio的web框架aiohttp</title>
      <link>https://blog.trim21.me/2018/10/python-aiohttp/</link>
      <pubDate>Fri, 05 Oct 2018 17:42:21 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/10/python-aiohttp/</guid>
      <description>&lt;p&gt;本来想扯一通标准库里添加了&lt;code&gt;asyncio&lt;/code&gt;的意义, 什么统一了异步框架, 什么方便代码前移之类的了.&#xA;然后发现原来大家也都是用装饰器+生成器来写的, 好像也没啥区别&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;迁移的主要阻力也不是各个框架实现异步的方式不同, 而是用到了框架的某些特性, 在其他框架里可能没有, &lt;code&gt;asyncio&lt;/code&gt;成为标准库也改变不了这一点.&lt;/p&gt;&#xA;&lt;p&gt;不过 python3.4 3.5 3.6 添加了很多新功能,语言层面的异步支持越来越好了&lt;/p&gt;&#xA;&lt;p&gt;在 3.4 就是上面说的, 引入了&lt;code&gt;asyncio&lt;/code&gt;的标准库.&lt;/p&gt;&#xA;&lt;p&gt;3.5 有了一系列的 bug fix ,可以见&lt;a href=&#34;https://aiohttp.readthedocs.io/en/stable/faq.html#why-is-python-3-5-3-the-lowest-supported-version&#34;&gt;why-is-python-3-5-3-the-lowest-supported-version&lt;/a&gt;, 还支持了&lt;code&gt;async/await&lt;/code&gt;语法.&lt;/p&gt;&#xA;&lt;p&gt;不过 3.5 的时候&lt;code&gt;async/await&lt;/code&gt;还不是关键字, 还可以给&lt;code&gt;async&lt;/code&gt;赋值, 所以到了 python3.7 的时候挂了一堆库, 因为他们用了&lt;code&gt;async&lt;/code&gt;当变量&amp;hellip;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; asyncio&#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;import&lt;/span&gt; sys&#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;print(sys&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;version_info) &lt;span style=&#34;color:#75715e&#34;&gt;# 3.5.4&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;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hello&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello world!&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:#75715e&#34;&gt;# 异步调用asyncio.sleep(1):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sleep(&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;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello again!&amp;#34;&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;async&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;print(&lt;span style=&#34;color:#66d9ef&#34;&gt;async&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;# 获取EventLoop:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_event_loop()&#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;# 执行coroutine&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run_until_complete(hello())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#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;-webkit-text-size-adjust:none;&#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;&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;Hello world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello again!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是如果到了 python3.7, 会报错&lt;code&gt;SyntaxError&lt;/code&gt;, 也因为这个原因挂了一堆库.&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用webpack打包userscript</title>
      <link>https://blog.trim21.me/2018/10/webpack-userscript/</link>
      <pubDate>Wed, 03 Oct 2018 11:15:35 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/10/webpack-userscript/</guid>
      <description>&lt;p&gt;原本用的是 grunt 来打包 webpack, 但是 grunt 只是依赖于简单的字符串替换和拼接, 效率过低.&lt;/p&gt;&#xA;&lt;p&gt;既然 webpack 可以用来打包别的 js 文件, 那么打包一个 userscript 肯定也没什么问题, 甚至大材小用了.&lt;/p&gt;&#xA;&lt;p&gt;所以自己写了一个模板&lt;a href=&#34;https://github.com/Trim21/webpack-userscript-template&#34;&gt;webpack-userscript-template&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;因为找了一下, 发现相应的工具还是有些缺陷的.&lt;/p&gt;&#xA;&lt;p&gt;主要有两个问题:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;生成 userscript 的 meta 注释&lt;/li&gt;&#xA;&lt;li&gt;没有一个好用的 http client 库.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;所以为了自己写 userscript 爽一点, 写了两个库解决了这个问题.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/Trim21/userscript-metadata-webpack-plugin&#34;&gt;userscript-metadata-webpack-plugin&lt;/a&gt;用来解决生成 meta 的问题&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/Trim21/axios-userscript-adapter&#34;&gt;axios-userscript-adapter&lt;/a&gt;是 axios 的一个 adapter, 用来解决进行 http 请求的问题.&lt;/p&gt;&#xA;&lt;p&gt;本来 github 上是有一个 webpack-userscript 项目的, 但是里面不知道为什么, 打包用到的是 bash, 理解不了&amp;hellip;就自己写了一个&lt;a href=&#34;https://github.com/Trim21/webpack-userscript-template&#34;&gt;webpack-userscript-template&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;使用 axios 的时候不要忘了加入 connect 的 meta&lt;/p&gt;</description>
    </item>
    <item>
      <title>bash和zsh的自动补全</title>
      <link>https://blog.trim21.me/2017/12/bash-zsh-autocompltion/</link>
      <pubDate>Sat, 09 Dec 2017 09:58:46 +0800</pubDate>
      <guid>https://blog.trim21.me/2017/12/bash-zsh-autocompltion/</guid>
      <description>&lt;p&gt;最近在给一个开源项目贡献代码,想要给他加上相应的自动补全功能&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/BGmi/BGmi&#34;&gt;BGmi&lt;/a&gt;起初只是个 cli 程序,前端单纯的展示已经下载的剧集,后来给前端加了一些订阅功能,但是 cli 的使用频率还是很高,cli 没有自动补全功能总是说不过去,所以就花了一些时间加上了这个功能.&lt;/p&gt;&#xA;&lt;h2 id=&#34;分析一下需求&#34;&gt;分析一下需求&lt;/h2&gt;&#xA;&lt;p&gt;BGmi 的命令都是同样的结构,&lt;code&gt;bgmi action1 --opt1 arg1 --opt2 arg2&lt;/code&gt;,那么我们需要补全的就是所有的 action 和每个 action 相应的选项了.在此之前,是直接&lt;code&gt;add_parser&lt;/code&gt;和&lt;code&gt;add_argument&lt;/code&gt;相应的 action 和选项.这样是没法进行下一步的,所以首先花了一些时间,所以首先把所有的&lt;code&gt;action&lt;/code&gt;和相应的&lt;code&gt;opts&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;actions_and_arguments &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;    {&#xA;&lt;/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;action&amp;#39;&lt;/span&gt;: ACTION_ADD,&#xA;&lt;/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;help&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Subscribe bangumi.&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:#e6db74&#34;&gt;&amp;#39;arguments&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:#e6db74&#34;&gt;&amp;#39;dest&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&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:#e6db74&#34;&gt;&amp;#39;kwargs&amp;#39;&lt;/span&gt;: dict(metavar&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;unicode_, nargs&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;                            help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bangumi name&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:#e6db74&#34;&gt;&amp;#39;dest&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--episode&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:#e6db74&#34;&gt;&amp;#39;kwargs&amp;#39;&lt;/span&gt;: dict(metavar&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;episode&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Add bangumi and mark it as specified episode.&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;int), },&#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:#e6db74&#34;&gt;&amp;#39;action&amp;#39;&lt;/span&gt;: ACTION_DELETE,&#xA;&lt;/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;help&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Unsubscribe bangumi.&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:#e6db74&#34;&gt;&amp;#39;arguments&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:#e6db74&#34;&gt;&amp;#39;dest&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--name&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:#e6db74&#34;&gt;&amp;#39;kwargs&amp;#39;&lt;/span&gt;: dict(metavar&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, nargs&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;, type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;unicode_,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Bangumi name to unsubscribe.&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:#e6db74&#34;&gt;&amp;#39;dest&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--batch&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:#e6db74&#34;&gt;&amp;#39;kwargs&amp;#39;&lt;/span&gt;: dict(action&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;No confirmation.&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个&lt;code&gt;list&lt;/code&gt;中储存了多个&lt;code&gt;dict&lt;/code&gt;,每个&lt;code&gt;dict&lt;/code&gt;对应一个&lt;code&gt;action&lt;/code&gt;,每个&lt;code&gt;action&lt;/code&gt;的选项存在&lt;code&gt;arguments&lt;/code&gt;字段中.这里的命名可能有些混乱,写的时候没太注意.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ubuntu使用命令重启进入BIOS</title>
      <link>https://blog.trim21.me/2017/05/ubuntu-reboot-to-bios/</link>
      <pubDate>Fri, 19 May 2017 02:20:20 +0800</pubDate>
      <guid>https://blog.trim21.me/2017/05/ubuntu-reboot-to-bios/</guid>
      <description>&lt;p&gt;今天一不小心开了 BIOS 里的快速启动,导致进不去 BIOS 设置也无法选择启动项(我还把 ubuntu 设置成了第一启动项&amp;hellip;)百度搜索无果,google 发现了结果&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;-webkit-text-size-adjust:none;&#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;sudo systemctl reboot --firmware-setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会直接重启进入 BIOS&lt;/p&gt;</description>
    </item>
    <item>
      <title>自动重新构建部署博客</title>
      <link>https://blog.trim21.me/2017/05/auto-deploy-with-webhook/</link>
      <pubDate>Sun, 14 May 2017 04:57:28 +0800</pubDate>
      <guid>https://blog.trim21.me/2017/05/auto-deploy-with-webhook/</guid>
      <description>&lt;p&gt;想折腾这个很久了,终于把这个折腾好了.&lt;/p&gt;&#xA;&lt;p&gt;现在写博客的流程是,我在本机维护一个 git repo,里面是我所有的文章.然后我写完一篇文章或者修改了文章之后 push 到 github 上去,相应的 github pages 就会根据用来保存文章的 repo 自动最新的状态.&lt;/p&gt;&#xA;&lt;p&gt;原本是在自己的 vps 上开了一个服务器处理 webhook, 现在换成了&lt;a href=&#34;https://travis-ci.org/&#34;&gt;travis-ci&lt;/a&gt;来自动部署.&lt;/p&gt;&#xA;&lt;p&gt;不得不说&lt;a href=&#34;https://travis-ci.org/&#34;&gt;travis-ci&lt;/a&gt;是个好东西. 如果你是开源项目, 是可以免费使用的, 只有 private 的仓库才需要付费.&lt;/p&gt;&#xA;&lt;p&gt;写个博客, 自然所有的东西都是公开的, 用他来构建也没什么问题.&lt;/p&gt;&#xA;&lt;p&gt;唯一的问题是, 构建之后的部署需要密钥, travis 自然也考虑到了这种问题, 可以在&lt;code&gt;more options&lt;/code&gt;- &lt;code&gt;settings&lt;/code&gt; - &lt;code&gt;Environment Variables&lt;/code&gt;中添加保密的环境变量, 这样一来我们只要去 github 生成一个可以 push 的 token, 用这个 token 又可以避免泄露凭证个第三方, 又可以利用公有服务操作我们的个人仓库.&lt;/p&gt;&#xA;&lt;p&gt;首先生成一个 token, 这个比较简单&lt;/p&gt;&#xA;&lt;p&gt;因为 github pages 要求 push 到&lt;code&gt;${username}.github.io&lt;/code&gt;的仓库中, 比如我的用户名是&lt;code&gt;trim21&lt;/code&gt;, 我就需要把文件 push 到&lt;code&gt;trim21.github.io&lt;/code&gt;去, 所以我们需要告诉&lt;code&gt;hexo&lt;/code&gt;他要操作的部署的仓库地址.&lt;/p&gt;&#xA;&lt;p&gt;而&lt;code&gt;_config.yml&lt;/code&gt;里面又不能使用环境变量, 只能每次部署的时候把对应的仓库链接给 echo 进去, 避免泄漏.&lt;/p&gt;&#xA;&lt;p&gt;我的&lt;code&gt;_config.yml&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Deployment&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;## Docs: https://hexo.io/docs/deployment.html&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;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;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;git&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;branch&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;master&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后 echo 到&lt;code&gt;_config.yml&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>树莓派控制步进电机</title>
      <link>https://blog.trim21.me/2016/08/rasberrypi-and-stepping-motor/</link>
      <pubDate>Sat, 13 Aug 2016 21:53:02 +0800</pubDate>
      <guid>https://blog.trim21.me/2016/08/rasberrypi-and-stepping-motor/</guid>
      <description>&lt;p&gt;有一个题目需要用步进电机控制转速,而且需要控制转动特定的角度,所以找到了步进电机这种东西来拍照.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ubuntu安装matplotlib</title>
      <link>https://blog.trim21.me/2016/07/matplotlib/</link>
      <pubDate>Mon, 25 Jul 2016 19:26:07 +0800</pubDate>
      <guid>https://blog.trim21.me/2016/07/matplotlib/</guid>
      <description>&lt;p&gt;(可恶,git 用的不熟练,把 commit 丢了&amp;hellip;重写文章)&lt;/p&gt;&#xA;&lt;p&gt;总结一下,在安装了&lt;code&gt;NumPy&lt;/code&gt;之后还需要安装&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;freetype&lt;/li&gt;&#xA;&lt;li&gt;libpng&lt;/li&gt;&#xA;&lt;li&gt;libffi&lt;/li&gt;&#xA;&lt;li&gt;cairocffi&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;freetype 下载地址 &lt;a href=&#34;http://download.savannah.gnu.org/releases/freetype/&#34;&gt;http://download.savannah.gnu.org/releases/freetype/&lt;/a&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;-webkit-text-size-adjust:none;&#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;wget http://download.savannah.gnu.org/releases/freetype/freetype-2.6.5.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xvf freetype-2.6.5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;libpng 和 libffi 都在 apt 上有&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;-webkit-text-size-adjust:none;&#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;➜  artic git:&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ✗ search libffi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libffi-dev - Foreign Function Interface library &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;development files&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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;-webkit-text-size-adjust:none;&#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;➜  artic git:&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ✗ search libpng&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libpng12-0 - PNG library - runtime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libpng12-dev - PNG library - development&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接 apt-get 安装即可&lt;/p&gt;&#xA;&lt;p&gt;调用&lt;code&gt;matplotlib&lt;/code&gt;的时候图像式全黑的,提示我安装&lt;code&gt;cairocffi&lt;/code&gt;,是 pip 上的包,安装了第三个之后直接&lt;code&gt;pip&lt;/code&gt;安装这个就可以了.&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用hexo和GitHub pages服务搭建博客</title>
      <link>https://blog.trim21.me/2016/04/build-blog-whith-hexo-and-github-pages/</link>
      <pubDate>Sat, 16 Apr 2016 01:03:39 +0800</pubDate>
      <guid>https://blog.trim21.me/2016/04/build-blog-whith-hexo-and-github-pages/</guid>
      <description>&lt;p&gt;使用 GitHub actions 自动部属博客到 GitHub pages。&lt;/p&gt;&#xA;&lt;h2 id=&#34;github-pages-介绍&#34;&gt;GitHub Pages 介绍&lt;/h2&gt;&#xA;&lt;p&gt;github pages 是 github 提供的服务，github 会为特定仓库的默认分支（比如 &lt;code&gt;${username}.github.io&lt;/code&gt; ）或者其他仓库的 &lt;code&gt;gh-pages&lt;/code&gt; 分支提供静态文件服务。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;${username}.github.io&lt;/code&gt; 仓库的文件会直接放在 &lt;code&gt;${username}.github.io&lt;/code&gt; 域名的根目录下，其他的仓库则会放在&lt;code&gt;/${repo_name}/&lt;/code&gt; 子目录下。&lt;/p&gt;&#xA;&lt;p&gt;比如，我在 &lt;code&gt;blog&lt;/code&gt; 仓库下创建 &lt;code&gt;gh-pages&lt;/code&gt; 分支，在根目录创建一个 &lt;code&gt;index.html&lt;/code&gt; 文件。以我的用户名&lt;code&gt;trim21&lt;/code&gt;为例，访问 &lt;code&gt;https://trim21.github.io/blog/index.html&lt;/code&gt; 就可以正常看到文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;github-actions&#34;&gt;GitHub Actions&lt;/h2&gt;&#xA;&lt;p&gt;2019 年 GitHub 上线了自己的 CI，&lt;a href=&#34;https://docs.github.com/cn/actions&#34;&gt;GitHub Actions&lt;/a&gt;，在此之前大家一般会使用 travis CI 或者 circle CI 等。但是直接用 github actions 可以避免额外注册账号，设置 github access token 等等权限问题。&lt;/p&gt;&#xA;&lt;p&gt;有了 github actions 之后就不再需要博客提供的各种部属插件了，只需要在 github actions 中构建博客，并且把生成的&lt;code&gt;public/&lt;/code&gt;文件夹推到&lt;code&gt;gh-pages&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;-webkit-text-size-adjust:none;&#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;build&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;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;main&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;&#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 node&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/setup-node@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;node-version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16&amp;#34;&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;install&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;yarn&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;yarn build&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;publish_dir&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;./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;deploy ${{ github.ref }}&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;cname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;blog.trim21.me&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;github_token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
