<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    
    <title>维燕的数字花园</title>
    <description>记录 Bio+IT 相关知识，沉淀生活，记录点滴。</description>
    <link>https://shenwy.com/</link>
    <atom:link href="https://shenwy.com/rss.xml" rel="self" type="application/rss+xml" />

    
    <managingEditor>Steven Shum</managingEditor>
    <docs>https://github.com/shenweiyan/Digital-Garden/</docs>
    <language>zh</language>

    
    <pubDate>Sat, 12 Sep 2026 13:22:47 -0000</pubDate>
    <lastBuildDate>Sat, 12 Sep 2026 13:22:47 -0000</lastBuildDate>
    <ttl>1440</ttl>

    
    <generator>MkDocs RSS plugin - v1.19.0</generator>

    
    
    <image>
      <url>https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/128px-Feed-icon.svg.png</url>
      <title>维燕的数字花园</title>
      <link>https://shenwy.com/</link>
    </image>
    

    
    
    <item>
      <title>八仙</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;知道《八仙》这部电影，主要源于每天上下班都在听的珠江经济台《珠江第一线》（朝朝饮早茶）主持人李嘉的安利。本来想着周末刚好有空去看沈腾的《欢迎来龙餐馆》，但是孩子又想着看自己喜欢的，权衡一下就只剩下《八仙》了，于是就安排上了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;film-20260815&#34; src=&#34;https://gi.weiyan.tech/2026/08/film-20260815.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这部将近 2 个半小时的动画片，在看完后，感觉还不错，10 分的话个人至少可以给 8.9 分以上，非常适合暑期档带娃一起去观看。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;baxian-20260815-1&#34; src=&#34;https://gi.weiyan.tech/2026/08/baxian-20260815-1.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;剧情在这里不透露太多，聊几点个人比较喜欢的点吧。&lt;/p&gt;
&lt;p&gt;首先，是八仙这个名字的由来，可能大家都想当然以为刚好 8 个人，所以叫八仙。其实在电影里面最开始并不是叫这个名字，而是源于和小偷有关的一段经历，这一点我没想到。&lt;/p&gt;
&lt;p&gt;第二，电影里面的孙大圣。从饺子的《哪吒》系列开始，到《浪浪山小妖怪》，甚至今天看的《八仙》，大圣这个名字几乎已经成为了中国古代神话动画电影的一个信仰般的存在，当然作为观众的我们也一直深信 &amp;ldquo;大圣&amp;rdquo; 这两个字始终代表着这里面正义一方的最高战力和底气。但是个人感觉相比《哪吒2之魔童闹海》带来的“大圣虽未至，棍威震三界”震撼，《八仙》中大圣的冲击感是稍低的。&lt;/p&gt;
&lt;p&gt;第三，剧情反转。个人认为“无心昌”的剧情反转是《八仙》里面最惊艳和升华一笔，也是让人最喜欢的一段，具体剧情就不多说，留给大家在观看的时候去体验。        &lt;br /&gt;
&lt;img alt=&#34;lvdongbin-20260815&#34; src=&#34;https://gi.weiyan.tech/2026/08/lvdongbin-20260815.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;“八仙过海，各显神通”这个成语虽然大家都耳熟能详，但是关于八仙的具体故事大家可能知道的少一些，看完这部电影可能会给大家带来更多不一样的文化触动。电影最后的彩蛋也很有意思，很有想象力。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;baxian-20260815-2&#34; src=&#34;https://gi.weiyan.tech/2026/08/baxian-20260815-2.avif&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;196&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-196/</link>
      <pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-196/</guid>
      
    </item>
    
    <item>
      <title>公众号改名字</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;公众号想改名字的想法总会时不时在脑海蹦跶，IT 的这个绑定总有点不合时宜的局促感，有被当下无处不在的 AI 技术冲击带来的一些焦虑，也有对自己职业方向的一些思考。爱好者其实并非内心的一个真实反馈，只不过有些事情做多久而久之就形成了一种本能。&lt;/p&gt;
&lt;p&gt;又一方面想着不要改太多，要克制一点，所以一直迟迟没下定决心，更大的原因应该还是一些想到的名字都已经名花有主。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;对于自身来说，年岁的增长，筛掉了越来越多的表达冲动，像河流入海，喧嚣渐息，只剩下深流。公众号和博客站点能分享，想分享，值得分享的东西越来越少，开始更加专注内心的平静和满足，更加专注于做自己真正喜欢做的事情。&lt;/p&gt;
&lt;p&gt;GitHub 还是自己最喜欢逛的地方，&lt;a href=&#34;https://github.com/shenweiyan/Digital-Garden/discussions&#34;&gt;博客站点&lt;/a&gt; 也会一直都在。&lt;a href=&#34;https://gitcode.com/shenweiyan&#34;&gt;GitCode&lt;/a&gt; 依然是自己当下最喜欢记录的第二大脑，虽然它还有很多可以和需要完善地方，但不妨碍我把 Issues 当记事本使用，把 notebook 当临时服务器。 &lt;/p&gt;
&lt;p&gt;在未来 Bioinfo 方向分享的内容可能会少一些，X 未知领域和方向的一些兴趣和所见所闻可能会更多，时光不老，记录不止，希望大家都好好的。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;195&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-195/</link>
      <pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-195/</guid>
      
    </item>
    
    <item>
      <title>从华为到 OPPO</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;不知不觉手上的  mate 30 Pro（4G）8+256 手机从入手到今天，已经用了整整 5 年。这也算得上是第一款真真正正可以从时间上算清楚的使用时长的高端旗舰了，虽然在这之前也用过好几年的 iphone 6s —— 这才是真正意义上人生的第一款高端机，也是大学毕业后用自己的工资在香港买的第一台高端旗舰手机。     &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;mate30pro-taobao&#34; src=&#34;https://gi.weiyan.tech/2026/08/mate30pro-taobao.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;苹果 6s 之后后来也用过几年的荣耀 mate 20 pro，但受限于 128G 内存的限制，不知道从 2019 还是 2020 年前后就开始搁置，到了 2025 年换了个屏幕后顺理成章成为了孩子打卡作业的备用机。&lt;/p&gt;
&lt;p&gt;mate 30 自从今年三月中在官方售后自费更换了电池以来，本以为还能够再战个一两年。     &lt;br /&gt;
&lt;img alt=&#34;mate30pro-new-battery&#34; src=&#34;https://gi.weiyan.tech/2026/08/mate30pro-new-battery.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;没想到短短 2、3 个月刚过去，在 8 月 3 号这个老朋友屏幕 2/3 的面积就出现故障，时好时坏看不见 —— 其实最大的责任还是在于自己的 &lt;strong&gt;&amp;ldquo;不小心&amp;rdquo;&lt;/strong&gt;，把这台用了五年之久的老物件送上了报废台。     &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;mate30pro-bad.-screen&#34; src=&#34;https://gi.weiyan.tech/2026/08/mate30pro-bad.-screen.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;换机的念头就开始浮上日程了。&lt;/p&gt;
&lt;p&gt;OPPO find x9 Pro 是目前的首选，PDD 和京东看了那么多，1TB 版本就剩下了追光红一个版本，但这个颜色个人看着有点嫌弃。&lt;/p&gt;
&lt;p&gt;虽然 512 的版本总觉得有点捉襟见肘，但架不住它外观的更多选择和价格诱惑，几经权衡，最终还是在 7 号拿到了这一款 16+512 配置的绒砂钛。&lt;/p&gt;
&lt;p&gt;聊一聊体验吧。&lt;/p&gt;
&lt;p&gt;用了差不多一周，总体只能说还算满意。
- 最直观的是，7500 毫安带来的续航对于个人来说基本可以实现两天一充。
- 系统流畅度也还算，各种配置也很顺畅。
- OPPO 官方提供的 「手机搬家」应用对于换手机的数据和应用转移算是一大便利。
- OPPO 的 ai 助手小布的使用体验也很棒，灵敏度高回答在线。&lt;/p&gt;
&lt;p&gt;不太满意的地方也有。
- 6.78 英寸一个手的确不太好掌握，握感也一般，总感觉有点硌手。
- 左后背凸起的摄像头，总是不太习惯。
- 用久了还是会有机身发烫的问题。
- 在 mate30p 习惯了使用悬浮球返回上一级菜单的操作，目前在 ColorOS 16 上悬浮球的反应灵敏度还是有点低，即使在开发模式中把 “窗口动画缩放”、“过渡动画缩放” 和 “动画程序时长缩放” 这三项都从默认的 1x 调整到了 0.5x，甚至是直接 “关闭”，效果也不尽如人意。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;194&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-194/</link>
      <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-194/</guid>
      
    </item>
    
    <item>
      <title>天斧 88DP 剁手记</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2026 年的 6.18 表面波澜不惊，内心却蠢蠢欲动 —— 电子设备太贵折腾不起，高端羽毛球拍的心 AK 都压不住。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;从朋友那里入手的 &lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=14147&#34;&gt;天斧 77 Pro&lt;/a&gt; 算是人生的第一把高端拍。对个人而言，这个拍子距离暴力进攻和追求后场杀球终究还是差了点意思，本想着顺水推舟留给老婆，奈何她还是对亮剑 12N 更情有独钟，最终6月21日还是在抖音+闲鱼成功出掉了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=23795&#34;&gt;99 Pro 三代&lt;/a&gt; 的 4U 版本在今年的 6.18 前夕曾一度降到 998，&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=18592&#34;&gt;黑龙牙&lt;/a&gt; 也一直在 860 左右浮动，这两把在价格上的确很有诱惑力也让我纠结了很久。后来又想着兼顾双打的连贯性，内心拉扯了一段时间，还是想着&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=19393&#34;&gt;天斧 88d Pro&lt;/a&gt; 或许更合适一些，线上 4UG5 应该在 1500 以内可以拿下，但在线下的尤尼克斯专卖店居然要 1800 多 —— 太打击人。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=24653&#34;&gt;战戟 9000 Power&lt;/a&gt; 和&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=17815&#34;&gt;极音速&lt;/a&gt; 都纠结过，前者除了价格偏高外，颜值个人也不太喜欢，后者又考虑到和手上的 &lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view_6462.html&#34;&gt;亮剑 12N&lt;/a&gt; 多少有点重叠，还是算了。&lt;/p&gt;
&lt;p&gt;继续蹲点 88dp 吧，等哪天有好价，就可以入手了。&lt;/p&gt;
&lt;p&gt;2026-06-08 在 PDD 最开始看到 ¥1495 的国行版本，需要拼个三人团，幸亏没拼成。当天晚上刷抖音看到了 ¥1318 的海外版本四人团，于是开始上车，但四缺二。转而在抖音发了一条寻找拼团小伙伴的图文，第二天一早醒来，拼团成功。&lt;/p&gt;
&lt;p&gt;在周三 10 号终于拿到心心念念的新拍。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;astrox-88dp-unboxing&#34; src=&#34;https://gi.weiyan.tech/2026/06/astrox-88dp-unboxing.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;astrox-88dp-20260610&#34; src=&#34;https://gi.weiyan.tech/2026/06/astrox-88dp-20260610.avif&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;193&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-193/</link>
      <pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-193/</guid>
      
    </item>
    
    <item>
      <title>AtomCode 的 Coding Plan 无限畅用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;之所以去试用这个智能体，最大的吸引力正如标题所说的 &lt;strong&gt;&amp;ldquo;Coding Plan 无限畅用&amp;rdquo;&lt;/strong&gt; —— 它提供了可以不限总量调用的两个昇腾编码模型 DeepSeek-V4-Flash 和 Qwen3.6-35B-A3B，并打出了 &amp;ldquo;订阅式编码权益，昇腾国产算力支撑，一次领取告别按 Token 计费&amp;rdquo; 的口号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-serverless-api&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-serverless-api.avif&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;a class=&#34;headerlink&#34; href=&#34;#介绍&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AtomCode 是一款 2026 年 4 月开源的、基于 Rust 构建的本地化 AI 编码终端智能体（Claude Code 的国产替代）。它支持 DeepSeek、Qwen 等国产大模型，能够通过自然语言指令，在本地自动完成代码生成、重构、诊断、运行和修复的全流程开发任务。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-homepage&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-homepage.avif&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;a class=&#34;headerlink&#34; href=&#34;#安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考官方&lt;a href=&#34;https://atomcode.atomgit.com/#install&#34;&gt;安装说明&lt;/a&gt;，一键式安装。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-install&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-install.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成后，可以通过 &lt;code&gt;atomcode&lt;/code&gt; 命令运行，然后通过扫码或者链接登录，即可领取不限量使用的 CodingPlan 免费额度。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;首次运行&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;—&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;欢迎界面
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;atomcode

欢迎使用&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;AtomCode&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;·&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;开始使用：

&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;▸&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Set&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;up&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CodingPlan&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;免费额度&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;·&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;推荐
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;manually&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;API&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Key
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Skip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;now&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;先看看再说
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-codingplan-setup&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-codingplan-setup.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;model&lt;/code&gt; 内置命令可以自行选择 &lt;code&gt;DeepSeek-V4-Flash&lt;/code&gt; 或者 &lt;code&gt;Qwen3.6-35B-A3B&lt;/code&gt; 模型。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-model&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-model.avif&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用体验&#34;&gt;使用体验&lt;a class=&#34;headerlink&#34; href=&#34;#使用体验&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;个人主要用的是 &lt;code&gt;Qwen3.6-35B-A3B&lt;/code&gt; 模型，对于一些站点主题功能调整，或者代码优化，用了一天下来感觉还算不错，最起码速度还是挺快的，复杂的项目代码重构目前没试过。&lt;/p&gt;
&lt;p&gt;第二个想说的是，天下没有免费的午餐，在目前满大街的 token plan 付费环境下，&lt;strong&gt;&amp;ldquo;Coding Plan 无限畅用&amp;rdquo; 是站不住脚的，都是套路——先免费拉人头在想办法收费，大家需要有心理准备&lt;/strong&gt;。今天（2026.05.15）再去一看，果然发现不到一个月的时间这个 Coding Plan 就开始调整为 30 天有效了，模型倒是增加了一个 GLM-5.1。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomcode-doingplan&#34; src=&#34;https://gi.weiyan.tech/2026/05/atomcode-codingplan.avif&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果你的代码复杂性并不是特别高，又想 AI 辅助进行代码优化，可以考虑尝试一下。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;192&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-192/</link>
      <pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-192/</guid>
      
    </item>
    
    <item>
      <title>五一琐记之徒步、羽球与闲欢</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2026 年的五一假期，期待了好久，对于去哪里一直缺少规划。但是历历在目的反而是在期待这个假期的那些日子，尤其是节前的最后一两周，印象深刻，完美阐释了期待的过程往往比享受结果本身更让人感到幸福。&lt;/p&gt;
&lt;p&gt;今天是星期三，5 天假期转眼即逝，回来上班的第一天，回味一下这个期待已久的五一假期 1311 之旅 —— 一次徒步，三场羽毛球，一次游乐场，一次星巴克。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;徒步&#34;&gt;徒步&lt;a class=&#34;headerlink&#34; href=&#34;#徒步&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;假期的第一天，阳光明媚，天气极好。六大四小来了一场大夫山树屋徒步，认识了新的朋友，走过了不一样的新路线，但真正的挑战在于从家里到大夫山之间的往返 —— 打车+地铁换乘+再打车，来回 3 个多小时的车程算是假期第一天最煎熬的体验了。&lt;/p&gt;
&lt;h2 id=&#34;羽毛球&#34;&gt;羽毛球&lt;a class=&#34;headerlink&#34; href=&#34;#羽毛球&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从 5.2 到假期最后一天，阴雨雷暴穿插，活动范围一下字压缩到了家里几公里的周边。&lt;/p&gt;
&lt;p&gt;在三个球馆打了三场羽毛球，体验都只能说还不错 —— 毕竟势均力敌的好对手不是每次都那么容易碰上。群体通五月份抽到的唯一一张 20 块优惠券，刚好在羽括一号馆用上了，从性价比来说二号打的这一场球最高。三号在 9 号馆打的那一场应该算是相对刺激，有对抗性但场次不多，参差不齐。四号在风羽打的最后一场略有失望，人不多，偏养生。&lt;/p&gt;
&lt;h2 id=&#34;游乐场&#34;&gt;游乐场&lt;a class=&#34;headerlink&#34; href=&#34;#游乐场&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从群友那里 ¥50 兑换了可可乐园的一场次卡，带娃也记不清时隔多久了，重回钧明世界的可可乐园玩了一下午，人不算太多，孩子玩的很开心，还偶遇了幼儿园时期的小伙伴。&lt;/p&gt;
&lt;h2 id=&#34;星巴克&#34;&gt;星巴克&lt;a class=&#34;headerlink&#34; href=&#34;#星巴克&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后一天，带着女儿去了星巴克。小的赶作业，大的对着电脑反而有点无所事事。&lt;/p&gt;
&lt;p&gt;值得开心的是，给小孩子 ¥29.9 充了 180 个币，取了 30 个居然夹了 2 个娃娃。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;191&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-191/</link>
      <pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-191/</guid>
      
    </item>
    
    <item>
      <title>在 Qwen Code CLI 中接入 DeepSeek V4 模型</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在前一篇《&lt;a href=&#34;https://shenwy.com/blog/discussions-189/&#34;&gt;选择一套适合自己的 AI Code CLI&lt;/a&gt;》文章中，我们提到通义千问 OAuth 免费套餐已经成为了历史，作为付费备选方案，今天介绍一下 Qwen Code CLI + DeepSeek V4（Flash/Pro）这一套组合，方便国内的用户可以直接配置使用。     &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;qwen-deepseek-v4&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-deepseek-v4.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;首先，在 DeepSeek 开放平台的 &lt;a href=&#34;https://platform.deepseek.com/top_up&#34;&gt;充值&lt;/a&gt; 页面先充值。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;deepseek-top-up&#34; src=&#34;https://gi.weiyan.tech/2026/04/deepseek-top-up.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第二，在 DeepSeek 开放平台的 &lt;a href=&#34;https://platform.deepseek.com/api_keys&#34;&gt;API Keys&lt;/a&gt; 页面创建 API Key。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;deepseek-api-keys&#34; src=&#34;https://gi.weiyan.tech/2026/04/deepseek-api-keys.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第三，配置 Qwen Code。有两种配置方式，一个是直接编辑 &lt;code&gt;settings.json&lt;/code&gt; 文件；第二是通过 &lt;code&gt;qwen&lt;/code&gt; 命令，一步步进行配置。&lt;/p&gt;
&lt;p&gt;方法一，直接编辑 &lt;code&gt;settings.json&lt;/code&gt; 文件。具体是，找到 &lt;code&gt;settings.json&lt;/code&gt; 文件（通常在 &lt;code&gt;~/.qwen&lt;/code&gt; 目录下，或通过终端输入配置命令打开），填写和编辑下面的内容。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;env&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;QWEN_CUSTOM_API_KEY_OPENAI_HTTPS_API_DEEPSEEK_COM&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;YOUR_DEEPSEEK_API_KEY&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 填入你的 API Key&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;modelProviders&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;openai&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;id&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;deepseek-v4-flash&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;name&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;deepseek-v4-flash&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;baseUrl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://api.deepseek.com&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;envKey&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;QWEN_CUSTOM_API_KEY_OPENAI_HTTPS_API_DEEPSEEK_COM&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;security&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;auth&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;selectedType&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;openai&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;model&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&#34;name&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;deepseek-v4-flash&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;方法二，在命令行打开 &lt;code&gt;qwen&lt;/code&gt;，根据提示进行一步一步配置。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;命令行打开 &lt;code&gt;qwen&lt;/code&gt;，认证方式选择 &lt;strong&gt;API Key&lt;/strong&gt;。
   &lt;img alt=&#34;qwen-setting-api-key&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-setting-api-key.png&#34; /&gt;        &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API Key Type&lt;/strong&gt; 选择 &lt;strong&gt;&amp;ldquo;Custom API Key&amp;rdquo;&lt;/strong&gt;。
   &lt;img alt=&#34;qwen-setting-api-key-type&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-setting-api-key-type.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于 &lt;a href=&#34;https://api-docs.deepseek.com/zh-cn/&#34;&gt;DeepSeek API 使用与 OpenAI/Anthropic 兼容的 API 格式&lt;/a&gt;，在 Protocol 这一步可以选择 &lt;strong&gt;&amp;ldquo;OpenAI-compatible&amp;rdquo;&lt;/strong&gt;，或者 &lt;strong&gt;&amp;ldquo;Anthropic-compatible&amp;rdquo;&lt;/strong&gt;，我这里选择前者。
    &lt;img alt=&#34;qwen-openai-compatible&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-openai-compatible.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API endpoint 这里填写：&lt;code&gt;https://api.deepseek.com&lt;/code&gt;。       &lt;br /&gt;
&lt;img alt=&#34;qwen-seeting-api-endpoint&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-seeting-api-endpoint.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API Key 填写前面创建的 API Key。       &lt;br /&gt;
&lt;img alt=&#34;qwen-setting-enter-api-key&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-setting-enter-api-key.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model IDs&lt;/strong&gt; 这里填写 &lt;code&gt;deepseek-v4-flash&lt;/code&gt;。        &lt;br /&gt;
&lt;img alt=&#34;qwen-setting-model-ids&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-setting-model-ids.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced Config&lt;/strong&gt; 这里选择 &lt;code&gt;Enable thinking&lt;/code&gt;。        &lt;br /&gt;
&lt;img alt=&#34;qwen-setting-advanced-config&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-setting-advanced-config.png&#34; /&gt;          &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后，一路回车，直至配置完成。完成配置后通过 &lt;code&gt;/model&lt;/code&gt; 指令，就可以看到你现在使用的模型。
   &lt;img alt=&#34;qwen-deepseek-v4-flash&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-deepseek-v4-flash.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完成上面的 8 步后，在 Qwen Code CLI 中接入 DeepSeek-V4-Flash 模型就算全部配置完成了，接下来就可以在 Qwen Code CLI 中体验智能编程的乐趣了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;qwen-deepseek-v4-coding&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-deepseek-v4-coding.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回到 DeepSeek 开放平台的 &lt;a href=&#34;https://platform.deepseek.com/usage&#34;&gt;用量信息&lt;/a&gt; 页面就可以看到自己的用量信息和余额。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;platform-deepseek-usage&#34; src=&#34;https://gi.weiyan.tech/2026/04/platform-deepseek-usage.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;190&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-190/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-190/</guid>
      
    </item>
    
    <item>
      <title>选择一套适合自己的 AI Code CLI</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;通义千问 OAuth 免费套餐已于 2026 年 4 月 15 日停止。这一变动使得一直在个人服务器运行的 Qwen Code 突然无法使用，对于长期依赖命令行界面（CLI）进行项目程序优化的个人而言，简直不要太糟心。            &lt;br /&gt;
&lt;img alt=&#34;qwen-code-cli-oauth&#34; src=&#34;https://gi.weiyan.tech/2026/04/qwen-code-cli-oauth.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;看一下阿里云的 Token Plan 团队版，对于个人用户且使用频率特别高的我来说，性价比太低了 —— AI 写代码太烧钱！        &lt;br /&gt;
&lt;img alt=&#34;aliyun-token-plan&#34; src=&#34;https://gi.weiyan.tech/2026/04/aliyun-token-plan.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;于是，开始去看一下其他的备用选择。&lt;/p&gt;
&lt;p&gt;第一，是 Qwen Code CLI + DeepSeek V4 (flash/pro)，但是看到 GitHub 的 &lt;a href=&#34;https://github.com/QwenLM/qwen-code/issues/3619&#34;&gt;#3619&lt;/a&gt;、&lt;a href=&#34;https://github.com/QwenLM/qwen-code/issues/3579&#34;&gt;3579&lt;/a&gt;，还是会存在一些问题，有待验证。&lt;/p&gt;
&lt;p&gt;第二，Gemini Code CLI，吸引点主要在于 &lt;code&gt;gemini-cli&lt;/code&gt; 是 &lt;a href=&#34;https://github.com/google-gemini/gemini-cli&#34;&gt;开源&lt;/a&gt;) 的，而且功能更强大，可以搭配其他模型进行使用。&lt;/p&gt;
&lt;p&gt;至于为什么没有使用 Claude Code CLI，除了价格因素，它的封控严格，限制国内使用，除了心里膈应外还大大提升了折腾成本。
&lt;img alt=&#34;claude-failed-connect&#34; src=&#34;https://gi.weiyan.tech/2026/04/claude-failed-connect.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第三，Qoder CLI。之所以看到这个，主要是因为它的&lt;a href=&#34;https://qoder.com/pricing&#34;&gt;价格便宜&lt;/a&gt;，Qoder CLI 和 Qwen Code CLI 的区别在于，它们都是基于 Qwen 模型的两个独立项目，目前由不同的团队开发维护，Qwen Code CLI 是阿里巴巴官方出品，是支持其最新 Qwen 模型的 &amp;ldquo;嫡系部队&amp;rdquo;。Qoder CLI 早期也来自阿里团队，但目前由独立的公司 Qoder Inc. 负责维护和商业化运营。        &lt;br /&gt;
&lt;img alt=&#34;qodercli-hello-world&#34; src=&#34;https://gi.weiyan.tech/2026/04/qodercli-hello-world.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;189&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-189/</link>
      <pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-189/</guid>
      
    </item>
    
    <item>
      <title>SciPy 安装无法识别 BLAS 和 LAPACK</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;这个问题出现在 &lt;code&gt;import sklearn&lt;/code&gt; 时候，调用 &lt;code&gt;from scipy.linalg import _flapack&lt;/code&gt;，出现 &lt;code&gt;undefined symbol: sgeqrt_&lt;/code&gt; 错误。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ifs1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SoftWare&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.10.16&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python3&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.10.16&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Feb&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2025&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GCC&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;7.3.1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20180303&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Red&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Hat&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;7.3.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;linux&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Type&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;help&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;copyright&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;credits&#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;license&#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;more&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;information&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;sklearn&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Traceback&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;most&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;recent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;last&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;&amp;lt;stdin&amp;gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/sklearn/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;82&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.base&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/sklearn/base.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.utils&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_IS_32BIT&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/sklearn/utils/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.fixes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;threadpool_info&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/sklearn/utils/fixes.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;scipy.stats&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/stats/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;391&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.stats&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/stats/stats.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;174&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;scipy.spatial.distance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cdist&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/spatial/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;._procrustes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;procrustes&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/spatial/_procrustes.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;scipy.linalg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;orthogonal_procrustes&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/linalg/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;195&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.misc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/linalg/misc.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;.lapack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_lapack_funcs&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/linalg/lapack.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;808&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;scipy.linalg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_flapack&lt;/span&gt;
&lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ifs1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SoftWare&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.10.16&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python3&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;site&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scipy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linalg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_flapack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cpython&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;310&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gnu&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;so&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;undefined&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;symbol&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sgeqrt_&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个错误的核心原因是：&lt;code&gt;scipy.linalg._flapack&lt;/code&gt; 在运行时无法找到 &lt;code&gt;LAPACK&lt;/code&gt; 函数的 &lt;code&gt;sgeqrt_&lt;/code&gt;。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;问题分析&#34;&gt;问题分析&lt;a class=&#34;headerlink&#34; href=&#34;#问题分析&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;scipy&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scipy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show_config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;lapack_mkl_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;libraries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;mkl_rt&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;pthread&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;library_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;define_macros&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;SCIPY_MKL_H&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;HAVE_CBLAS&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;include_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/include&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;lapack_opt_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;libraries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;mkl_rt&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;pthread&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;library_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;define_macros&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;SCIPY_MKL_H&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;HAVE_CBLAS&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;include_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/include&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;blas_mkl_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;libraries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;mkl_rt&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;pthread&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;library_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;define_macros&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;SCIPY_MKL_H&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;HAVE_CBLAS&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;include_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/include&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;blas_opt_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;libraries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;mkl_rt&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;pthread&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;library_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;define_macros&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;SCIPY_MKL_H&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;HAVE_CBLAS&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;include_dirs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/include&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Supported&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SIMD&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;extensions&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;this&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NumPy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;baseline&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SSE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SSE2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SSE3&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SSSE3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SSE41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;POPCNT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SSE42&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;F16C&lt;/span&gt;
    &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FMA3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512F&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512CD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512_KNL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512_KNM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512_SKX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AVX512_CNL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ldd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/linalg/_flapack.cpython-310-x86_64-linux-gnu.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-iE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;lapack|blas|mkl&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libmkl_rt.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64/libmkl_rt.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007fc1db146000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;nm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64/libmkl_rt.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sgeqrt&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;nm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libopenblas.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sgeqrt
0000000001d86020&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt
0000000001d86170&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt2
0000000001d86270&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt2_work
0000000001d86510&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt3
0000000001d86610&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt3_work
0000000001d868b0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACKE_sgeqrt_work
0000000001705ba0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sgeqrt2_
&lt;span class=&#34;m&#34;&gt;0000000001706230&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sgeqrt3_
00000000017057b0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sgeqrt_
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;结合 &lt;code&gt;scipy.show_config()&lt;/code&gt; 输出，可以明确以下几点。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;sgeqrt_&lt;/code&gt; 是 LAPACK 3.3.0+ 引入的 QR 分解函数。&lt;/li&gt;
&lt;li&gt;使用的 MKL 版本为 composer_xe_2011_sp1.6.233（约 2011 年发布），该版本未包含此函数；但系统的 libopenblas 是包含 &lt;code&gt;sgeqrt&lt;/code&gt; 函数的。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;解决方法&#34;&gt;解决方法&lt;a class=&#34;headerlink&#34; href=&#34;#解决方法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/enable
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BLAS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/lib64/libopenblas.so
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LAPACK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/lib64/libopenblas.so
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LDFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-Wl,--no-as-needed -lopenblas&#34;&lt;/span&gt;
/ifs1/SoftWare/Python-3.10.10/bin/pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-cache-dir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force-reinstall&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-binary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:all:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;scipy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.7.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这时候看到多了一个 &lt;code&gt;libopenblas.so.0&lt;/code&gt; 的动态库链接，再 &lt;code&gt;import sklearn&lt;/code&gt; 也可以正常导入了。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ldd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/SoftWare/Python-3.10.16/lib/python3.10/site-packages/scipy/linalg/_flapack.cpython-310-x86_64-linux-gnu.so
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;linux-vdso.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007fffa04a7000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libopenblas.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libopenblas.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae1e79000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libmkl_rt.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64/libmkl_rt.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae190f000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libpthread.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libpthread.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae16f2000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libgfortran.so.3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libgfortran.so.3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae1400000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libm.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libm.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae117b000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libgcc_s.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libgcc_s.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae0f65000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libc.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libc.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae0bd1000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;/lib64/ld-linux-x86-64.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x0000003636a00000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libdl.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libdl.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f4ae09cc000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;py3-sklearn-scipy&#34; src=&#34;https://gi.weiyan.tech/2026/04/py3-sklearn-scipy.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/scikit-learn/scikit-learn/issues/26858&#34;&gt;Cython compilation error with Cython&amp;gt;=3 and scikit-learn&amp;lt;1.2 - scikit-learn/scikit-learn#26858&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.scipy.org/doc/scipy/building/blas_lapack.html&#34;&gt;BLAS and LAPACK — SciPy v1.17.0 Manual&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;188&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-188/</link>
      <pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-188/</guid>
      
    </item>
    
    <item>
      <title>纯数字的 xyz 域名</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在逛 GitHub 的时候看到 wxh 的《&lt;a href=&#34;https://wxhou.cn/Docs/50cny-10y-spaceship/&#34;&gt;不到60人民币购入10年xyz域名&lt;/a&gt;》这篇文章，文章提到在 &lt;a href=&#34;https://www.spaceship.com/zh/&#34;&gt;Spaceship&lt;/a&gt; 可以通过不到 60 人民币购入一个 6-9 位的纯数字，后缀为 xyz 的域名。&lt;/p&gt;
&lt;p&gt;具体做法是：&lt;strong&gt;出现了 ¥4.57 的价格，可以直接买入，注意是先买一年，再续费 9 年，不能直接买 10 年。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.57&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;+&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;.94*9&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;58&lt;/span&gt;.03
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;同样纯数字的 xyz 域名，发现在阿里云购买 10 年也不过 70 来块人民币。 &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;aliyun-xyz-10-years&#34; src=&#34;https://gi.weiyan.tech/2026/04/aliyun-xyz-10-years.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;这个的价格可以说相当不错，可以用 QQ 号、生日号、手机号，或者自己喜欢的一串数字，去注册一个自己喜欢的域名，然后去各种折腾，很有性价比。另外想说的是，这两处域名注册最大的区别 —— 阿里云需要实名， Spaceship 不需要实名。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;187&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-187/</link>
      <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-187/</guid>
      
    </item>
    
    <item>
      <title>工作之外</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在工作之余可以输出一些个人看法和观点，或许有不少意料之外的收获，也或多或少也能缓解一些 AI 甚至是工作带来的焦虑情绪。&lt;/p&gt;
&lt;p&gt;对于 AI，各大网站全是失业焦虑，程序员已死的帖子，还看到有人在抱怨      &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你们搞大模型的就是码奸，你们已经害死前端兄弟了，还要害死后端兄弟，测试兄弟，运维兄弟，设计兄弟，害死网安兄弟，害死 IC 兄弟，最后害死自己害死全人类 &amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于工作，现在这个裁员时代，每个人都得学会不和平台绑定的能力，才能过得更轻松。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;186&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-186/</link>
      <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-186/</guid>
      
    </item>
    
    <item>
      <title>MkDocs 主题的中文搜索有点弱</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最开始是想着在自己的站点通过 &lt;strong&gt;&amp;ldquo;体积&amp;rdquo;&lt;/strong&gt; 的关键词搜索《&lt;a href=&#34;https://shenwy.com/blog/discussions-83/&#34;&gt;解决 GitHub 提交次数多导致仓库体积过大的问题&lt;/a&gt;》这篇文章，但死活就是搜不到。      &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;tiji-shenwy&#34; src=&#34;https://gi.weiyan.tech/2026/03/tiji-shenwy.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;换成 &lt;strong&gt;&amp;ldquo;次数&amp;rdquo;&lt;/strong&gt;、&lt;strong&gt;&amp;ldquo;次数多&amp;rdquo;&lt;/strong&gt; 这个关键词还是搜不到。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cishuduo-shenwy&#34; src=&#34;https://gi.weiyan.tech/2026/03/cishuduo-shenwy.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;后来换成 &lt;strong&gt;&amp;ldquo;提交&amp;rdquo;&lt;/strong&gt;、&lt;strong&gt;&amp;ldquo;提交次数&amp;rdquo;&lt;/strong&gt; 反倒是搜索出来了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;tijicishu-shenwy&#34; src=&#34;https://gi.weiyan.tech/2026/03/tijicishu-shenwy.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;同样的问题在 &lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/&#34;&gt;Material for MkDocs 官方站点&lt;/a&gt; 同样也是不如人意。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;sousuo-mkdocs&#34; src=&#34;https://gi.weiyan.tech/2026/03/sousuo-mkdocs.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;zhongwen-mkdocs&#34; src=&#34;https://gi.weiyan.tech/2026/03/zhongwen-mkdocs.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;zhichi-mkdocs&#34; src=&#34;https://gi.weiyan.tech/2026/03/zhichi-mkdocs.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从现有的一些资料可以看到这其实是中文分词，文本​没有被​正确​分割​导致的，参考&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/blog/2022/05/05/chinese-search-support/&#34;&gt;官方给的方案&lt;/a&gt;可以比较好解决这个问题。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;a href=&#34;https://pypi.org/project/jieba/&#34;&gt;jieba&lt;/a&gt; 包
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;jieba
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;指定了 &lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/search/#config.separator&#34;&gt;separator&lt;/a&gt; 配置
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;separator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;[\s\u200b\-]&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，重新构建站点，就可以看到文章开头提到的，通过 &lt;strong&gt;&amp;ldquo;体积&amp;rdquo;&lt;/strong&gt; 的关键词搜索《&lt;a href=&#34;https://shenwy.com/blog/discussions-83/&#34;&gt;解决 GitHub 提交次数多导致仓库体积过大的问题&lt;/a&gt;》这篇文章，已经可以正常搜索。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;tiji-shen-ok&#34; src=&#34;https://gi.weiyan.tech/2026/03/tiji-shen-ok.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;185&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-185/</link>
      <pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-185/</guid>
      
    </item>
    
    <item>
      <title>MkDocs 的缓慢崩溃</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;从 2023 年 7 月开始，个人的 &lt;a href=&#34;https://shenwy.com&#34;&gt;博客站点&lt;/a&gt; 从 Hugo 换成了 Material for MkDocs 并在 2026 年换成了 MaterialX，但始终都没有脱离过 MkDocs 的框架。&lt;/p&gt;
&lt;p&gt;作为使用者，和 MkDocs 生态关注者，现如今 MkDocs 生态系统分崩离析，给大家分享一篇来自 Florian Maas 在 2026 年 3 月 22 写的《&lt;a href=&#34;https://fpgmaas.com/blog/collapse-of-mkdocs/&#34;&gt;The Slow Collapse of MkDocs&lt;/a&gt;》文章，看看性格冲突、创始人缺席以及备受争议的重新设计如何导致 Python 最受欢迎的项目之一分崩离析。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;hr /&gt;
&lt;p&gt;2026 年 3 月 9 日， &lt;a href=&#34;https://github.com/mkdocs/mkdocs&#34; title=&#34;MkDocs&#34;&gt;MkDocs&lt;/a&gt; 的一位前维护者&lt;a href=&#34;https://github.com/orgs/ProperDocs/discussions/1&#34;&gt;接管&lt;/a&gt;了 PyPI 代码库的控制权，并撤销了原作者的权限。原作者迅速作出回应：
&lt;img alt=&#34;collapse-mkdocs-1&#34; src=&#34;https://gi.weiyan.tech/0001/260301/collapse-mkdocs-1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后他们提交了一份 &lt;a href=&#34;https://github.com/pypi/support/issues/9671&#34; title=&#34;PyPI 支持工单&#34;&gt;PyPI 支持工单&lt;/a&gt; 以重新获得控制权，但在工单得到处理之前，问题就已得到了解决。 &lt;/p&gt;
&lt;p&gt;MkDocs 为超过 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/network/dependents&#34; title=&#34;90,000&#34;&gt;90,000&lt;/a&gt; 个 GitHub 项目提供文档支持，其中大多数项目都依赖于由 &lt;code&gt;@squidfunk&lt;/code&gt; 开发的 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material&#34;&gt;Material for MkDocs&lt;/a&gt; 主题，该主题非常受欢迎，其获得的星标数甚至超过了 MkDocs 本身。&lt;/p&gt;
&lt;p&gt;PyPI 被接管事件不过是更深层次问题的一个最为显眼的症状表现。如今，任何使用 Material for MkDocs 的人都会在终端中看到以下警告信息：   &lt;br /&gt;
&lt;img alt=&#34;mkdocs-2-warning&#34; src=&#34;https://gi.weiyan.tech/0001/260301/mkdocs-2-warning.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;MkDocs 项目已经超过 18 个月没有进行任何实质性的开发。Material for MkDocs 目前处于&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/releases/tag/9.7.0&#34; title=&#34;维护模式&#34;&gt;维护模式&lt;/a&gt;。而曾经两大主导工具携手共进的局面已不复存在，如今有多款工具竞相涌现，试图取而代之：如 &lt;a href=&#34;https://github.com/ProperDocs/properdocs&#34; title=&#34;ProperDocs&#34;&gt;ProperDocs&lt;/a&gt;、&lt;a href=&#34;https://github.com/jaywhj/mkdocs-materialx&#34; title=&#34;MaterialX&#34;&gt;MaterialX&lt;/a&gt;（&amp;rdquo;新一代的 mkdocs-material&amp;rdquo;）以及 &lt;a href=&#34;https://github.com/zensical/zensical&#34; title=&#34;Zensical&#34;&gt;Zensical&lt;/a&gt;（&amp;rdquo;由 Material for MkDocs 开发者打造的现代化静态网站生成器&amp;rdquo;）。&lt;/p&gt;
&lt;p&gt;我们怎么会走到这一步？要了解事情的全貌，我们需要稍微回顾一下过去 ……&lt;/p&gt;
&lt;h2 id=&#34;2014年1月11日---mkdocs-的诞生&#34;&gt;2014年1月11日 - MkDocs 的诞生&lt;a class=&#34;headerlink&#34; href=&#34;#2014年1月11日---mkdocs-的诞生&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2014 年 1 月 11 日，Mia Kimberly Christie（ &lt;code&gt;@lovelydinosaur&lt;/code&gt; ）提交了第一个代码 ，也就是后来的 MkDocs，并附上了 &amp;ldquo;Hell yeah&amp;rdquo; 的消息。接下来的几个月里，提交数量激增。&lt;/p&gt;
&lt;p&gt;这种活跃期并没有持续太久。到 2014 年年中，他们在代码库中的活动就完全停止了。
&lt;img alt=&#34;lovelydinosaur-commits-2014&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-commits-2014.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;其他开发者也加入了这个项目，比如 &lt;code&gt;@d0ugal&lt;/code&gt; 和 &lt;code&gt;@waylan&lt;/code&gt;。&lt;code&gt;@lovelydinosaur&lt;/code&gt; 此后便不再活跃，而在 2016 年 7 月至 2021 年 7 月期间，&lt;code&gt;@waylan&lt;/code&gt; 似乎是该项目的唯一维护者。
&lt;img alt=&#34;waylan-commits&#34; src=&#34;https://gi.weiyan.tech/0001/260301/waylan-commits.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;该项目越来越受欢迎，到 2022 年年中，该项目在 GitHub 上积累了超过 &lt;a href=&#34;https://www.star-history.com/?repos=mkdocs%2Fmkdocs&amp;amp;type=date&amp;amp;legend=top-left&#34; title=&#34;14,000&#34;&gt;14,000&lt;/a&gt; 个星标 。&lt;/p&gt;
&lt;h2 id=&#34;2020年4月27日---oprypin-加入了该项目&#34;&gt;2020年4月27日 - oprypin 加入了该项目&lt;a class=&#34;headerlink&#34; href=&#34;#2020年4月27日---oprypin-加入了该项目&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2020 年 4 月 27 日，新贡献者 &lt;code&gt;@oprypin&lt;/code&gt; &lt;a href=&#34;https://github.com/mkdocs/mkdocs/pull/2081&#34; title=&#34;首次为该项目做出贡献&#34;&gt;首次为该项目做出贡献&lt;/a&gt;：提交了一个 bug 修复方案。&lt;code&gt;@waylan&lt;/code&gt; 同意了这些更改,并合并了 PR。
&lt;img alt=&#34;waylan-20200427&#34; src=&#34;https://gi.weiyan.tech/0001/260301/waylan-20200427.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在首次提交贡献后，&lt;code&gt;@oprypin&lt;/code&gt; 有大约半年时间未参与该项目，之后他又进入了一段&lt;a href=&#34;https://github.com/mkdocs/mkdocs/pulls?page=8&amp;amp;q=is%3Apr+is%3Amerged+author%3Aoprypin&#34; title=&#34;长时间的高频活跃期&#34;&gt;长时间的高频活跃期&lt;/a&gt;；修复 bug、添加新功能等等，不一而足。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 和 &lt;code&gt;@waylan&lt;/code&gt; 之间似乎存在一些摩擦。例如，&lt;code&gt;@waylan&lt;/code&gt; 就不同意 &lt;code&gt;@oprypin&lt;/code&gt; 提出的一个 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/pull/2272&#34; title=&#34;潜在的性能&#34;&gt;潜在的性能&lt;/a&gt; 改进方案：
&lt;img alt=&#34;waylan-oprypin-2104&#34; src=&#34;https://gi.weiyan.tech/0001/260301/waylan-oprypin-2104.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;2021年5月16日---waylan-下台&#34;&gt;2021年5月16日 - waylan 下台&lt;a class=&#34;headerlink&#34; href=&#34;#2021年5月16日---waylan-下台&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 的不满情绪日益加剧，最终他发起了一个题为 &amp;ldquo;关于 MkDocs 维护工作的担忧（Concerns about maintainership of MkDocs）&amp;rdquo; 的&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/2410&#34;&gt;讨论帖&lt;/a&gt;。在这篇长文中，他指责 &lt;code&gt;@waylan&lt;/code&gt; 对项目进行独断专行式的管控，且在没有技术依据的情况下拒绝他人贡献，并提出了另一种维护模式，以减轻单一维护者的责任负担。
&lt;img alt=&#34;oprypin-210516&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-210516.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;他将该 &lt;a href=&#34;https://github.com/oprypin/mkdocs/discussions/2#discussioncomment-745295&#34;&gt;帖子的副本&lt;/a&gt; 发布到他自己 fork 的仓库中。两个帖子均未引发过多讨论，但普遍共识是，尽管事实与观点难以分辨，但该帖子过于针对个人，项目原作者（且基本已不再活跃）也提到了这一点：  &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-210517&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-210517.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;就在 &lt;code&gt;@oprypin&lt;/code&gt; 发起讨论的同一天，&lt;code&gt;@waylan&lt;/code&gt; 宣布退出该项目：       &lt;br /&gt;
&lt;img alt=&#34;waylan-210517&#34; src=&#34;https://gi.weiyan.tech/0001/260301/waylan-210517.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;2021年6月7日---oprypin-接管&#34;&gt;2021年6月7日 - oprypin 接管&lt;a class=&#34;headerlink&#34; href=&#34;#2021年6月7日---oprypin-接管&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于 &lt;code&gt;@waylan&lt;/code&gt; 已不再担任项目维护者，因此需要新的维护者。&lt;code&gt;@lovelydinosaur&lt;/code&gt; 发起了一项讨论，征求关于维护者人选的建议。&lt;code&gt;@oprypin&lt;/code&gt; 立即表示他愿意接手项目的维护工作。     &lt;br /&gt;
&lt;img alt=&#34;oprypin-210607&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-210607.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 并没有立即接受他的提议，但 &lt;code&gt;@oprypin&lt;/code&gt; 希望继续开发这个项目，所以几周后他又回到了这个帖子：            &lt;br /&gt;
&lt;img alt=&#34;oprypin-210621&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-210621.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一段时间后，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 似乎不太愿意授予 &lt;code&gt;@oprypin&lt;/code&gt; 项目写入权限，且回复迟缓，此时 Material for MkDocs 的原作者兼维护者 &lt;code&gt;@squidfunk&lt;/code&gt; 也加入了讨论。       &lt;br /&gt;
&lt;img alt=&#34;squidfunk-210703&#34; src=&#34;https://gi.weiyan.tech/0001/260301/squidfunk-210703.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;之后，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 邀请了一群维护者加入 MkDocs：            &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-210705&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-210705.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;大约一年后，&lt;code&gt;@oprypin&lt;/code&gt; 请求提升对 Github 仓库和 PyPI 项目的权限：     &lt;br /&gt;
&lt;img alt=&#34;oprypin-220602&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-220602.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;获得所有者权限后，&lt;code&gt;@oprypin&lt;/code&gt; 成为 MkDocs 的主要维护者。在接下来的两年里，他与其他维护者和贡献者一起稳步推进项目。修复 bug、更新依赖项、添加新功能，项目持续向前发展。      &lt;br /&gt;
&lt;img alt=&#34;oprypin-commits-2024&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-commits-2024.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;请注意，由于 &lt;code&gt;@oprypin&lt;/code&gt; 目前已被禁止参与该项目，因此无法在 MkDocs 存储库中找到上述图表中的数据，但仍然可以在 MkDocs 的分支中找到，例如&lt;a href=&#34;https://github.com/ProperDocs/properdocs/graphs/contributors?from=09%2F04%2F2020&amp;amp;to=12%2F05%2F2025&#34;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;2024年2月25日---紧张局势公开爆发&#34;&gt;2024年2月25日 - 紧张局势公开爆发&lt;a class=&#34;headerlink&#34; href=&#34;#2024年2月25日---紧张局势公开爆发&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一次常规的&lt;a href=&#34;https://github.com/mkdocs/mkdocs/issues/3579&#34; title=&#34;文档问题&#34;&gt;文档问题&lt;/a&gt;讨论，因 &lt;code&gt;@squidfunk&lt;/code&gt; 在帖子中指责 Read the Docs 从 MkDocs 项目中获利却未回馈社区而升级，演变成了另一回事。&lt;code&gt;@oprypin&lt;/code&gt; 趁机表态：       &lt;br /&gt;
&lt;img alt=&#34;oprypin-240226&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-240226.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@squidfunk&lt;/code&gt; 回复：         &lt;br /&gt;
&lt;img alt=&#34;squidfunk-240229&#34; src=&#34;https://gi.weiyan.tech/0001/260301/squidfunk-240229.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;随后，双方公开长篇追溯过往恩怨：&lt;code&gt;@oprypin&lt;/code&gt; &lt;a href=&#34;https://github.com/mkdocs/mkdocs/issues/3579#issuecomment-1970586568&#34; title=&#34;坚称&#34;&gt;坚称&lt;/a&gt; 自己并无过错，&lt;code&gt;@squidfunk&lt;/code&gt; 则&lt;a href=&#34;https://github.com/mkdocs/mkdocs/issues/3579#issuecomment-1970691690&#34; title=&#34;回忆&#34;&gt;回忆&lt;/a&gt; 曾作为 &lt;code&gt;@oprypin&lt;/code&gt; 的首位赞助者，力排众议推荐其加入 MkDocs 团队，但因多次个人冲突，最终选择将沟通限制在公开渠道。&lt;/p&gt;
&lt;p&gt;在完成对文档小问题的修复后，该问题被标记为已解决。&lt;/p&gt;
&lt;h2 id=&#34;2024年3月16日---oprypin-将-squidfunk-从组织中移除&#34;&gt;2024年3月16日 - oprypin 将 squidfunk 从组织中移除&lt;a class=&#34;headerlink&#34; href=&#34;#2024年3月16日---oprypin-将-squidfunk-从组织中移除&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们回到&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/2442#discussioncomment-964629&#34; title=&#34;之前的帖子&#34;&gt;之前的帖子&lt;/a&gt;，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 在其中宣布他们已将 &lt;code&gt;@oprypin&lt;/code&gt;、 &lt;code&gt;@squidfunk&lt;/code&gt; 和 &lt;code&gt;@ultrabug&lt;/code&gt; 添加为该项目的维护者。&lt;/p&gt;
&lt;p&gt;3 月 16 日，&lt;code&gt;@squidfunk&lt;/code&gt; 发帖：         &lt;br /&gt;
&lt;img alt=&#34;squidfunk-240316&#34; src=&#34;https://gi.weiyan.tech/0001/260301/squidfunk-240316.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;原来，这个决定是 &lt;code&gt;@oprypin&lt;/code&gt; 独自做出的：              &lt;br /&gt;
&lt;img alt=&#34;oprypin-240316&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-240316.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;不久后，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 加入讨论，恢复了 &lt;code&gt;@squidfunk&lt;/code&gt; 在 MkDocs 组织中的成员身份，并撤销了 &lt;code&gt;@oprypin&lt;/code&gt; 对代码仓库的所有权。&lt;/p&gt;
&lt;h2 id=&#34;2024年4月6日---oprypin-下台&#34;&gt;2024年4月6日 - oprypin 下台&lt;a class=&#34;headerlink&#34; href=&#34;#2024年4月6日---oprypin-下台&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;4 月 6 日，&lt;code&gt;@lovelydinosaur&lt;/code&gt;写道：       &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-240406&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-240406.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;三个小时后，&lt;code&gt;@oprypin&lt;/code&gt; 宣布他将从 MkDocs 项目卸任。在他的帖子中，他详细阐述了他与 &lt;code&gt;@squidfunk&lt;/code&gt; 的分歧、对 &lt;code&gt;@lovelydinosaur&lt;/code&gt; 介入的不满，以及维护该项目的孤独感：
&lt;img alt=&#34;oprypin-240406&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-240406.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;他决定协助团队于 2024 年 4 月 20 日发布 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/releases/tag/1.6.0&#34;&gt;1.6.0&lt;/a&gt; 版本，除同年 8 月 30 日发布的 1.6.1 版本外，截至本文撰写时该版本仍是最新版本。&lt;/p&gt;
&lt;h2 id=&#34;2024年4月8日---社区短暂集结&#34;&gt;2024年4月8日 - 社区短暂集结&lt;a class=&#34;headerlink&#34; href=&#34;#2024年4月8日---社区短暂集结&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 卸任两天后，活跃社区成员兼 mkdocstrings 作者 &lt;code&gt;@pawamoy&lt;/code&gt; 在一个题为 &amp;ldquo;推动 MkDocs 迈向新高度&amp;rdquo; 的帖子中，邀请约 25 位插件和主题作者共同参与 MkDocs 的维护工作，反响热烈。&lt;code&gt;@squidfunk&lt;/code&gt; 表示对此 &amp;ldquo;深感振奋（eally psyched to see this happening）&amp;rdquo;，他还补充道：         &lt;br /&gt;
&lt;img alt=&#34;squidfunk-240422&#34; src=&#34;https://gi.weiyan.tech/0001/260301/squidfunk-240422.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;4 月 23 日，在 &lt;code&gt;@oprypin&lt;/code&gt; 发布最后一个版本几天后，&lt;code&gt;@lovelydinosaur&lt;/code&gt; &lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/3677&#34;&gt;发帖宣布&lt;/a&gt; 将回归担任首席维护者。此时，距离其 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/pulls?q=is%3Apr+author%3Alovelydinosaur+is%3Aclosed&#34;&gt;上一次向代码仓库提交的拉取请求被合并&lt;/a&gt; 已过去整整八年。其明确目标为：MkDocs 应拥有 &amp;ldquo;独立于Material for MkDocs的强有力领导团队&amp;rdquo;。他们标记了 28 位社区成员，并安排了周六的线上电话会议。&lt;/p&gt;
&lt;p&gt;会议如期举行。&lt;code&gt;@squidfunk&lt;/code&gt; 拒绝参加。仅两人到场。此后十八个月，该帖子再无公开活动记录。&lt;/p&gt;
&lt;h2 id=&#34;2024年5月17日---lovelydinosaur-回归&#34;&gt;2024年5月17日 - lovelydinosaur 回归&lt;a class=&#34;headerlink&#34; href=&#34;#2024年5月17日---lovelydinosaur-回归&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于 &lt;code&gt;@oprypin&lt;/code&gt; 不再参与该项目，MkDocs 的开发基本上&lt;a href=&#34;https://github.com/ProperDocs/properdocs/graphs/contributors&#34; title=&#34;停止&#34;&gt;停止&lt;/a&gt;了。     &lt;br /&gt;
&lt;img alt=&#34;commits2024&#34; src=&#34;https://gi.weiyan.tech/0001/260301/commits2024.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在向 MkDocs 提交部分拉取请求的同时，他们还开始在 &lt;a href=&#34;https://github.com/mkdocs/sketch/commits/main/&#34; title=&#34;mkdocs/sketch&#34;&gt;mkdocs/sketch&lt;/a&gt; 代码库中着手对 MkDocs 进行重新设计。&lt;/p&gt;
&lt;h2 id=&#34;2024年8月1日---无需插件的重新设计&#34;&gt;2024年8月1日 - 无需插件的重新设计&lt;a class=&#34;headerlink&#34; href=&#34;#2024年8月1日---无需插件的重新设计&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 向 MkDocs 核心团队展示了其提出的 MkDocs 重新设计方案演示。MkDocs 目前会一次性构建整个站点，而新方案则按需动态生成页面。此提议引发了维护者及核心贡献者的担忧：     &lt;br /&gt;
&lt;img alt=&#34;alexvoss-240801&#34; src=&#34;https://gi.weiyan.tech/0001/260301/alexvoss-240801.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在另一个无关的讨论帖中，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 表示其正致力于对 MkDocs 进行无需任何插件的重新设计。       &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-240820&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-240820.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;该帖子收到的反对票表明，这并非社区真正希望看到的。&lt;/p&gt;
&lt;h2 id=&#34;2024年8月30日---mkdocs-的最新版本&#34;&gt;2024年8月30日 - MkDocs 的最新版本&lt;a class=&#34;headerlink&#34; href=&#34;#2024年8月30日---mkdocs-的最新版本&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mkdocs/mkdocs/releases/tag/1.6.1&#34; title=&#34;MkDocs 1.6.1&#34;&gt;MkDocs 1.6.1&lt;/a&gt; 版本已发布。截至目前，这仍是最新版本，除对文档进行一两次修订及更新持续集成（CI）徽章外，该代码库没有进行任何积极的开发。&lt;/p&gt;
&lt;h2 id=&#34;2025年7月17日---这个项目被搁置了吗&#34;&gt;2025年7月17日 - 这个项目被搁置了吗？&lt;a class=&#34;headerlink&#34; href=&#34;#2025年7月17日---这个项目被搁置了吗&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;插件作者 &lt;code&gt;@facelessuser&lt;/code&gt; 发起了一个直接提问的讨论：        &lt;br /&gt;
&lt;img alt=&#34;facelessuser-250717&#34; src=&#34;https://gi.weiyan.tech/0001/260301/facelessuser-250717.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;他指出，尽管有积极的赞助商，但修复 bug 的 PR 已经几个月没有经过审核了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@pawamoy&lt;/code&gt; 的回应清晰呈现了自 2024 年 4 月以来发生的情况。他表示曾尝试围绕 &lt;code&gt;@lovelydinosaur&lt;/code&gt; 的回归构建协作维护模式，却发现 &lt;code&gt;@lovelydinosaur&lt;/code&gt; 对现有代码库兴趣寥寥，转而专注于重新设计。当 &lt;code&gt;@pawamoy&lt;/code&gt; 致力于整理待办事项列表并尝试维护项目的同时，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 在被提及 PR 时却&lt;a href=&#34;https://github.com/mkdocs/mkdocs/pull/3913#issuecomment-2717728307&#34;&gt;杳无音信&lt;/a&gt;。        &lt;br /&gt;
&lt;img alt=&#34;pawamoy-250723&#34; src=&#34;https://gi.weiyan.tech/0001/260301/pawamoy-250723.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 回复称，其一直专注于当前处于早期预发布阶段的 httpx 1.0 项目，并正在考虑是否有时间为 MkDocs 腾出时间。&lt;code&gt;@facelessuser&lt;/code&gt; 回应如下：        &lt;br /&gt;
&lt;img alt=&#34;facelessuser-250724&#34; src=&#34;https://gi.weiyan.tech/0001/260301/facelessuser-250724.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;8 月 3 日，大约十天后，&lt;code&gt;@oprypin&lt;/code&gt; 自离开后首次重新出现在该帖子中。他提出回归的条件只有一个：      &lt;br /&gt;
&lt;img alt=&#34;oprypin-250803&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-250803.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 没有回复。&lt;/p&gt;
&lt;h2 id=&#34;2025年10月15日---幕后工作仍在继续&#34;&gt;2025年10月15日 - 幕后工作仍在继续&lt;a class=&#34;headerlink&#34; href=&#34;#2025年10月15日---幕后工作仍在继续&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当 MkDocs 用户纷纷要求修复漏洞时，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 却在另一个尚未公开的代码库（&lt;a href=&#34;https://github.com/encode/mkdocs&#34; title=&#34;encode/mkdocs&#34;&gt;encode/mkdocs&lt;/a&gt;）中继续推进 MkDocs 的重新设计工作。&lt;/p&gt;
&lt;h2 id=&#34;2025年11月11日---squidfunk-宣布推出-zensical&#34;&gt;2025年11月11日 - squidfunk 宣布推出 Zensical&lt;a class=&#34;headerlink&#34; href=&#34;#2025年11月11日---squidfunk-宣布推出-zensical&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025 年 11 月 11 日，&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/releases/tag/9.7.0&#34;&gt;mkdocs-material 9.7.0&lt;/a&gt; 版本发布，同时宣布 Material for MkDocs 项目进入维护模式。与之同步&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/blog/2025/11/05/zensical/&#34;&gt;发布&lt;/a&gt;的还有 Zensical —— 一款由 Material for MkDocs 团队全新打造的现代化静态网站生成器。团队表示，该工具可原生解析现有 &lt;code&gt;mkdocs.yml&lt;/code&gt; 配置文件，重建速度提升5倍，并配备全新设计的搜索引擎。&lt;/p&gt;
&lt;p&gt;在 2024 年 4 月的维护者讨论帖中（该帖已沉寂数月），有人发布了一篇博文链接，并询问 Material for Mkdocs 进入维护模式是否意味着 MkDocs 需要重新开始。&lt;code&gt;@oprypin&lt;/code&gt; 再次出现，指出 Zensical 就是一个新的开始。关于 MkDocs，他说道：        &lt;br /&gt;
&lt;img alt=&#34;oprypin-251107&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-251107.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在 Material for MkDocs 宣布进入维护模式几周后， &lt;code&gt;@jaywhj&lt;/code&gt; 发布了 MaterialX 的&lt;a href=&#34;https://pypi.org/project/mkdocs-materialx/10.0.2/&#34; title=&#34;第一个版本&#34;&gt;第一个版本&lt;/a&gt;，它是 Material for MkDocs 的延续。&lt;/p&gt;
&lt;h2 id=&#34;2026年1月14日---mkdocs-20&#34;&gt;2026年1月14日 - MkDocs 2.0&lt;a class=&#34;headerlink&#34; href=&#34;#2026年1月14日---mkdocs-20&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2026 年 1 月 14 日，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 表示，欢迎他人发布 MkDocs 1.6.2 版本，而其正私下开展 MkDocs v2 的开发工作。&lt;/p&gt;
&lt;p&gt;然后，在 1 月 21 日，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 发起了一个&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/4077&#34;&gt;讨论&lt;/a&gt; ，宣布推出 MkDocs 版本 2：      &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-260121&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-260121.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;绝大多数用户都持负面态度。。社区认为，拟议的 MkDocs 2.0 主要缺点在于缺乏插件支持，而插件正是 MkDocs 最初成功的关键所在。
&lt;img alt=&#34;twardoch-260218&#34; src=&#34;https://gi.weiyan.tech/0001/260301/twardoch-260218.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@facelessuser&lt;/code&gt; 道出了社区中许多人的心声：        &lt;br /&gt;
&lt;img alt=&#34;facelessuser-260203&#34; src=&#34;https://gi.weiyan.tech/0001/260301/facelessuser-260203.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 一个月前也&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/3677#discussioncomment-15478473&#34;&gt;表达&lt;/a&gt;了相同观点。社区成员注意到，MkDocs 2.0 版本代码库被放置在 &lt;a href=&#34;https://github.com/encode&#34; title=&#34;encode&#34;&gt;encode&lt;/a&gt; 组织而非 MkDocs 组织下，且 encode 组织的&lt;a href=&#34;https://github.com/encode/.github/blob/master/CONTRIBUTING.md&#34;&gt;贡献指南&lt;/a&gt;明确禁止提交 issue 或 pull request。他们还强调，不公开源代码违背了开源软件开发的原则。最终，&lt;code&gt;@lovelydinosaur&lt;/code&gt; 解释了该代码库设为私有的原因：    &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-260203&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-260203.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;2 月 13 日，&lt;code&gt;@lovelydinosaur&lt;/code&gt; &lt;a href=&#34;https://github.com/encode/mkdocs/commit/313d3e88f7e16103ee0cda36bd8e9d2b68a11533&#34;&gt;删除了&lt;/a&gt;关于计划使 MkDocs 2.x 向后兼容 MkDocs 1.x 的通知。&lt;/p&gt;
&lt;p&gt;2 月 18 日，Material for MkDocs 团队发布了一篇&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/blog/2026/02/18/mkdocs-2.0/&#34;&gt;详尽的博客文章&lt;/a&gt;，全面分析了 MkDocs v2 版本为何与其工作及更广泛的插件生态系统不兼容，涵盖从移除插件系统到缺失许可证等诸多问题。&lt;/p&gt;
&lt;h2 id=&#34;2026年3月9日---pypi-接管事件&#34;&gt;2026年3月9日 - PyPI 接管事件&lt;a class=&#34;headerlink&#34; href=&#34;#2026年3月9日---pypi-接管事件&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2 月 18 日，Material for MkDocs 在每次 mkdocs 构建时均&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/releases/tag/9.7.2&#34; title=&#34;显示警告&#34;&gt;显示警告&lt;/a&gt;信息，提醒用户可能存在与 MkDocs 2 未来不兼容的问题，并附上上述博客文章链接。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 此前提出的获取 PyPI 所有权的&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/2442#discussioncomment-2869019&#34; title=&#34;请求&#34;&gt;请求&lt;/a&gt;已于过去某个时间获得批准。虽然他在 2024 年卸任后，其对 GitHub 代码库的权限已被剥夺，但他对 PyPI 仓库的权限仍然有效。&lt;/p&gt;
&lt;p&gt;3 月 9 日，为防止用户项目因意外升级至不受欢迎的 MkDocs 2.0 版本而受损，&lt;code&gt;@oprypin&lt;/code&gt; 采取最后手段，利用其权限将所有其他维护者（包括原作者 &lt;code&gt;@lovelydinosaur&lt;/code&gt;）移出项目。他在 GitHub 的两个讨论区宣布接管：一个在 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/4089&#34; title=&#34;mkdocs&#34;&gt;mkdocs&lt;/a&gt;（后被编辑），另一个在 &lt;a href=&#34;https://github.com/orgs/ProperDocs/discussions/1&#34; title=&#34;mkdocs-community&#34;&gt;mkdocs-community&lt;/a&gt;（该组织后更名为 ProperDocs）。其核心理由是，静默发布 v2 版本会导致运行 &lt;code&gt;pip install mkdocs&lt;/code&gt; 的用户意外地破坏他们的项目。他随后在 &lt;code&gt;mkdocs-community/mkdocs&lt;/code&gt; 创建新仓库，宣布未来 PyPI 版本将由此发布，并呼吁社区支持。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 向 &lt;a href=&#34;https://github.com/pypi/support/issues/9671&#34; title=&#34;PyPI 提交了支持工单&#34;&gt;PyPI 提交了支持工单&lt;/a&gt; ，并将 &lt;code&gt;@oprypin&lt;/code&gt; 排除在 MkDocs GitHub 组织之外。&lt;/p&gt;
&lt;p&gt;6 小时内， &lt;code&gt;@oprypin&lt;/code&gt; 做出让步并道歉：        &lt;br /&gt;
&lt;img alt=&#34;oprypin-260310&#34; src=&#34;https://gi.weiyan.tech/0001/260301/oprypin-260310.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@lovelydinosaur&lt;/code&gt; 重新获得 PyPI 访问权限。&lt;/p&gt;
&lt;p&gt;在另一场&lt;a href=&#34;https://github.com/mkdocs/mkdocs/discussions/4088&#34; title=&#34;讨论&#34;&gt;讨论&lt;/a&gt;中， &lt;code&gt;@Andre601&lt;/code&gt; 表达了他对项目现状的担忧，并就项目维护的未来提出了各种问题， &lt;code&gt;@lovelydinosaur&lt;/code&gt; 对此作出了回应：        &lt;br /&gt;
&lt;img alt=&#34;lovelydinosaur-260309&#34; src=&#34;https://gi.weiyan.tech/0001/260301/lovelydinosaur-260309.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;2026年3月15日---oprypin-推出-properdocs&#34;&gt;2026年3月15日 - oprypin 推出 ProperDocs&lt;a class=&#34;headerlink&#34; href=&#34;#2026年3月15日---oprypin-推出-properdocs&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在接管 PyPI 六天后，&lt;code&gt;@oprypin&lt;/code&gt; 正式发布 &lt;a href=&#34;https://github.com/ProperDocs/properdocs&#34; title=&#34;ProperDocs&#34;&gt;ProperDocs&lt;/a&gt;：一款可无缝替代 MkDocs 1.x 的工具。用户只需将 &lt;code&gt;pip install mkdocs&lt;/code&gt; 替换为 &lt;code&gt;pip install properdocs&lt;/code&gt;，将 &lt;code&gt;mkdocs build&lt;/code&gt; 替换为 &lt;code&gt;properdocs build&lt;/code&gt; 即可。现有插件无需修改代码即可使用。该项目还发布警告，引导用户远离 MkDocs 2.0。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;那么，如今的情况又如何呢？&lt;/p&gt;
&lt;p&gt;原 MkDocs 代码库已有 18 个月未进行实质性开发。其原作者兼唯一维护者 &lt;code&gt;@lovelydinosaur&lt;/code&gt; 正在推进一项缺乏社区支持且会破坏现有插件生态系统的重新设计。&lt;a href=&#34;https://github.com/encode/mkdocs/commits/main/&#34; title=&#34;encode/mkdocs&#34;&gt;encode/mkdocs&lt;/a&gt; v2 代码库自 2026 年 2 月 19 日起已停止更新。&lt;/p&gt;
&lt;p&gt;与此同时，构建该生态系统最广泛使用组件的核心人员已转向其他项目。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@oprypin&lt;/code&gt; 表示，继续推进需要双方达成一致，但认为此举难以成功，因此独立启动了 ProperDocs 项目。该项目并未立即获得巨大成功，一周后，它在 GitHub 上获得了 21 个星标。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@jaywhj&lt;/code&gt; 正在维护 MaterialX，由于原项目 Material for MkDocs 进入了维护模式，该项目似乎在社区中获得了一些关注。&lt;/p&gt;
&lt;p&gt;负责 MkDocs Material 的 &lt;code&gt;@squidfunk&lt;/code&gt; 团队已停止开发，转而从零开始构建 Zensical。MkDocs 生态系统中最活跃的贡献者之一 &lt;code&gt;@pawamoy&lt;/code&gt; 也加入了该项目。截至撰写本文时，Zensical 在 GitHub 上已获得超过 3700 个 star，目前看来是最受欢迎的项目，因此它也极有可能成功，并在未来取代 MkDocs。&lt;/p&gt;
&lt;p&gt;MkDocs 生态系统正在实时分裂。三个继任者，三种愿景，以及一个需要决定押注哪一方的社区。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;184&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-184/</link>
      <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-184/</guid>
      
    </item>
    
    <item>
      <title>自建 RSS 阅读器二三事</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;RSS 阅读器的文章写过几篇，从 &lt;a href=&#34;https://shenwy.com/yuque/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/2019-07-01-rss-for-top-news/&#34;&gt;Inoreader&lt;/a&gt; 到 &lt;a href=&#34;https://shenwy.com/blog/discussions-73/&#34;&gt;QiReader&lt;/a&gt; 用的也都还算满意，但自从手持一台 4 核 8G 的云服务器以来， 总想着搞些事情，于是想着自建 RSS 阅读器。&lt;/p&gt;
&lt;p&gt;为什么需要 RSS 阅读器，这里引用奇客 Solidot 的一篇文章 《&lt;a href=&#34;https://www.solidot.org/story?sid=83837&#34;&gt;一篇推荐 RSS 阅读器的文章下载了 500 MB 的广告&lt;/a&gt;》。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在被算法控制和广告轰炸的时代，RSS 阅读器能让我们控制自己阅读的内容而再次受到青睐。PC Gamer 网站发表了一篇推荐 RSS 阅读器的文章，然而讽刺的是网页本身充斥着广告。除了多则弹出式窗口，网页初步完成加载后其大小达到了 37MB，但此后网页还会在后台持续加载广告，在五分钟内它加载了 500MB 的广告。这就是我们需要 RSS 阅读器摆脱这一切的原因。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;freshrss&#34;&gt;FreshRSS&lt;a class=&#34;headerlink&#34; href=&#34;#freshrss&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先找的是 FreshRSS。它是一款开源、免费、轻量级的自托管 RSS 订阅聚合器。它允许用户在自己的服务器或 NAS 上部署，通过网页或移动端应用集中订阅、管理和阅读博客、新闻及论坛等内容的更新。FreshRSS 特点是界面清爽、支持多用户、可定制标签及扩展功能强大。&lt;/p&gt;
&lt;p&gt;别的不说，单看 Star 和 Fork 数，就可以知道 FreshRSS 的受欢迎程序。        &lt;br /&gt;
&lt;img alt=&#34;freshrss-github&#34; src=&#34;https://gi.weiyan.tech/2026/03/freshrss-github.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在 1Panel 上恰好也有这个应用，点击安装就能一步到位。     &lt;br /&gt;
&lt;img alt=&#34;1panel-freshrss&#34; src=&#34;https://gi.weiyan.tech/2026/03/1panel-freshrss.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;再绑定一下自己的域名，直接就可以在浏览器追踪和阅读自己喜欢的各种资讯信息，而且整个页面的主题还很清爽简洁。    &lt;br /&gt;
&lt;img alt=&#34;freshrss-home&#34; src=&#34;https://gi.weiyan.tech/2026/03/freshrss-home.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置和订阅源也很强大，后面可以再去熟悉。        &lt;br /&gt;
&lt;img alt=&#34;freshrss-subscription&#34; src=&#34;https://gi.weiyan.tech/2026/03/freshrss-subscription.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;FreshRSS 还自带了一个用于获取全文的配置，完美解决了那些仅提供摘要的订阅源全文阅读的问题。        &lt;br /&gt;
&lt;img alt=&#34;freshrss-decohack&#34; src=&#34;https://gi.weiyan.tech/2026/03/freshrss-decohack.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;newsboat&#34;&gt;Newsboat&lt;a class=&#34;headerlink&#34; href=&#34;#newsboat&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是一个 &lt;strong&gt;终端的免费和开源&lt;/strong&gt; 的 RSS/Atom 提要阅读器，可以在 GNU / Linux，FreeBSD 或 macOS 系统的终端上使用。      &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;newsboat-github&#34; src=&#34;https://gi.weiyan.tech/2026/03/newsboat-github.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;不得不说，Newsboat 的确是一款极客风格十足的 RSS/Atom 阅读器，但是它的安装要比 FreshRSS 更加复杂，而且要解决一堆的 &lt;a href=&#34;https://github.com/newsboat/newsboat?tab=readme-ov-file#dependencies&#34;&gt;Dependencies&lt;/a&gt;。        &lt;br /&gt;
&lt;img alt=&#34;newsboat-dependencies&#34; src=&#34;https://gi.weiyan.tech/2026/03/newsboat-dependencies.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装后，只需在 &lt;code&gt;~/.newsboat/urls&lt;/code&gt; 中添加订阅源。如果你是从其他阅读器迁移而来，并有导出的 OPML 文件，那么可以使用以下方式导入：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;newsboat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-i&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;/path/to/my/feeds.opml&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;个人在 CentOS Stream 9 中，导入 OPML 后，打开 &lt;code&gt;newsboat&lt;/code&gt; 就能看到非常熟悉的界面。       &lt;br /&gt;
&lt;img alt=&#34;newsboat-home&#34; src=&#34;https://gi.weiyan.tech/2026/03/newsboat-home.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;使用箭头键上下滚动，使用 &lt;code&gt;r&lt;/code&gt; 检查某个源中是否有新项目，使用 &lt;code&gt;R&lt;/code&gt; 检查所有源中是否有新项目，按回车打开订阅源，并选择要阅读的文章，按 &lt;code&gt;q&lt;/code&gt; 返回上一页面。      &lt;br /&gt;
&lt;img alt=&#34;newsboat-bestblogs&#34; src=&#34;https://gi.weiyan.tech/2026/03/newsboat-bestblogs.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;详细的文章页面，当然，在终端下图片是不可能直接看到的。        &lt;br /&gt;
&lt;img alt=&#34;newsboat-bestblogs-post&#34; src=&#34;https://gi.weiyan.tech/2026/03/newsboat-bestblogs-post.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;结尾&#34;&gt;结尾&lt;a class=&#34;headerlink&#34; href=&#34;#结尾&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;生命在于折腾，获取资讯的途径千千万万，找到合适自己的用起来才是最好的。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;183&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-183/</link>
      <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-183/</guid>
      
    </item>
    
    <item>
      <title>让公众号成为更大的朋友圈</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;公众号使用 &lt;strong&gt;&amp;ldquo;BioiT爱好者&amp;rdquo;&lt;/strong&gt; 这个名字应该也有 4、5 年的时间了吧，最开始是定位于技术分享，包括生物信息、互联网技术的记录和管理。到了 2026 年的今天，想法有些改变，少了很多不切实际的空想，更想着过好当下 —— 公众号或许也可以用成朋友圈。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;它不一定是技术定位，更多定位于个人知识和日常想法管理，就像一个花园，寄托于互联网的数字花园，它需要精心培育和持续维护才能繁荣。更像是一个在代码与生活交界处探索多维世界的极客手记，是一个不设边界的成长型知识花园。&lt;/p&gt;
&lt;p&gt;名字还没想好，先用着吧，说不定哪天就把名字和 ID 都改了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;182&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-182/</link>
      <pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-182/</guid>
      
    </item>
    
    <item>
      <title>用 AI 优化 mRNA 序列设计软件 LinearDesign 的一些尝试</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 OpenClaw 如火如荼，全民养虾的当下，聚焦一下自己更加关注的 AI 在编程中的应用场景 —— 在编程中如何让 AI 更好为自己服务。本次优化的 LinearDesign 代码也已经提交到 GitHub，感兴趣的小伙伴可以参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/shenweiyan/LinearDesignPY3&#34;&gt;https://github.com/shenweiyan/LinearDesignPY3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lineardesign&#34;&gt;LinearDesign&lt;a class=&#34;headerlink&#34; href=&#34;#lineardesign&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LinearDesign 是百度自主研发的 mRNA 序列设计优化算法，其核心功能是同时优化 mRNA 的折叠自由能（MFE）和密码子适应指数（CAI），为研究人员提供专业的序列设计解决方案。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;LinearDesign 项目的源代码托管在 GitHub 上，全球的开发者和研究人员都可以共同协作和改进。安装和使用过这个软件的小伙伴，都会发现几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;默认仅支持 Python2 语法；&lt;/li&gt;
&lt;li&gt;编译后的程序默认只能在当前目录执行，不支持绝对路径；&lt;/li&gt;
&lt;li&gt;LinearDesign 自 203 年 4 月开源发布以来，基本没有任何实际性的更新，各种 Issues 也是没有任何响应。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;qwen-code-cli&#34;&gt;Qwen Code CLI&lt;a class=&#34;headerlink&#34; href=&#34;#qwen-code-cli&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Qwen Code CLI 是阿里巴巴通义千问团队推出的一款，基于 Gemini CLI 改造、针对 Qwen3-Coder 模型优化的开源命令行工具，专为终端用户设计，能够实现自然语言生成代码、调试 bug、解释代码、文件操作及自动化工作流，显著提升开发效率。&lt;/p&gt;
&lt;p&gt;虽然 Gemini CLI 能力更强（如联网搜索、长上下文），但 Qwen Code 在本地文件操作、代码生成方面更成熟，而且主打国产自主、每天 2000 次免费额度，适合中文社区和阿里生态。因此，我们在这里选择使用 Qwen Code CLI 对 LinearDesign 上面提到的两个尝试进行 AI 优化修复。&lt;/p&gt;
&lt;h2 id=&#34;优化修复&#34;&gt;优化修复&lt;a class=&#34;headerlink&#34; href=&#34;#优化修复&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;把 LinearDesign 的开源代码 &lt;code&gt;clone&lt;/code&gt; 到本地。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入 &lt;code&gt;LinearDesign&lt;/code&gt; 源码根目录，打开 &lt;code&gt;qwen&lt;/code&gt;，输入需求。
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;优化&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LinearDesign&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;项目，要求可以在任何路径下通过绝对路径调用编译好的&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;进行mRNA序列优化，要求支持&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;语法
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    &lt;img alt=&#34;qwen-lineardesign-start&#34; src=&#34;https://gi.weiyan.tech/2026/03/qwen-lineardesign-1.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Qwen 接下来就会分析整个项目的代码逻辑，并开始进行优化修改，每次如果需要编辑源码，或者执行命令，Qwen Code CLI 都会让你进行选择。    &lt;br /&gt;
&lt;img alt=&#34;qwen-code-apply-change&#34; src=&#34;https://gi.weiyan.tech/2026/03/qwen-code-apply-change.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优化修改完成后，还会对代码进行编译测试，直至最后完成。
    &lt;img alt=&#34;qwen-lineardesign-test&#34; src=&#34;https://gi.weiyan.tech/2026/03/qwen-lineardesign-test.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;测试验证&#34;&gt;测试验证&lt;a class=&#34;headerlink&#34; href=&#34;#测试验证&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;优化完成后，验证了一下，的确能正常执行。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;lineardesign-run&#34; src=&#34;https://gi.weiyan.tech/2026/03/lineardesign-run.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;想法&#34;&gt;想法&lt;a class=&#34;headerlink&#34; href=&#34;#想法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从这一次的尝试体验来看，AI 的确是给编程带了巨大的变化，在效率的提升上极其明显，这也为一些历史项目的优化更新甚至重构提供了支持。作为程序员，不管是 Qwen Code CLI，还是 Gemini CLI，都是值得我们去折腾的。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;181&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-181/</link>
      <pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-181/</guid>
      
    </item>
    
    <item>
      <title>Bioconductor 西湖大学镜像无法下载安装 R 包</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;&lt;a href=&#34;https://www.bioconductor.org/&#34;&gt;&lt;strong&gt;Bioconductor&lt;/strong&gt;&lt;/a&gt; 为高通量基因组数据的分析和可视化提供开源工具。Bioconductor 多数软件包采用 R 统计编程语言开发。Bioconductor 每年释出两个版本，并有活跃的用户社区。&lt;/p&gt;
&lt;h2 id=&#34;版本说明&#34;&gt;版本说明&lt;a class=&#34;headerlink&#34; href=&#34;#版本说明&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于 Bioconductor 的 rsync 上游会自行删除非最新的版本，大部分镜像站仅提供 Bioconductor 的当前最新版本和开发版本，只有少量镜像站点会保留过时的版本。目前已知&lt;a href=&#34;https://mirrors.westlake.edu.cn/&#34;&gt;西湖大学镜像站&lt;/a&gt;提供了历史版本的镜像。&lt;/p&gt;
&lt;p&gt;详细讨论参见 &lt;a href=&#34;https://github.com/tuna/issues/issues/1969&#34;&gt;tuna/issues#1969&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;问题&#34;&gt;问题&lt;a class=&#34;headerlink&#34; href=&#34;#问题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;先看一下问题，在 R 里面直接配置配置西湖大学的 bioconductor 镜像站，执行 &lt;code&gt;BiocManager::install&lt;/code&gt; 包安装提示 &amp;ldquo;cannot open URL&amp;rdquo;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BioC_mirror&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.westlake.edu.cn/bioconductor&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BiocManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;ChAMP&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirrors.westlake.edu.cn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioconductor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;contrib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/bioc/src/contrib/PACKAGES&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirrors.westlake.edu.cn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioconductor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;annotation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;contrib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/data/annotation/src/contrib/PACKAGES&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirrors.westlake.edu.cn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioconductor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;experiment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;contrib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/data/experiment/src/contrib/PACKAGES&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirrors.westlake.edu.cn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioconductor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;workflows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;contrib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/workflows/src/contrib/PACKAGES&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirrors.westlake.edu.cn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bioconductor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;books&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;contrib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/books/src/contrib/PACKAGES&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Bioconductor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3.18&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BiocManager&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.30&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4.3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2023-04-21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Installing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;ChAMP&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;总所周知，当 R 通过 HTTP 传输文件时（例如使用 &lt;code&gt;install.packages&lt;/code&gt; 或 &lt;code&gt;download.file&lt;/code&gt; 函数），下载方式的选择取决于 &lt;code&gt;download.file.method&lt;/code&gt; 选项，其选项值包括了 &lt;code&gt;&#34;internal&#34;&lt;/code&gt;，&lt;code&gt;&#34;wininet&#34;&lt;/code&gt;(Windows only)，&lt;code&gt;&#34;libcurl&#34;&lt;/code&gt;，&lt;code&gt;&#34;wget&#34;&lt;/code&gt; 以及 &lt;code&gt;&#34;curl&#34;&lt;/code&gt;，如果没有显式指定选项，则默认使用 R 内部的 HTTP 实现，即 &lt;code&gt;method = &#34;auto&#34;&lt;/code&gt;。 &lt;/p&gt;
&lt;p&gt;在 R 中验证 &lt;code&gt;libcurl&lt;/code&gt; 支持，也发现不支持 http2，而且 &lt;code&gt;download.file&lt;/code&gt; 时候提示 &amp;lsquo;SSL connect error&amp;rsquo;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 检查 R 是否编译支持 libcurl&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;capabilities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;libcurl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# TRUE = 支持，FALSE = 不支持&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 2. 查看 R 的完整编译配置&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;R.version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capabilities&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 3. 查看 libcurl 版本信息（如果支持）&lt;/span&gt;
&lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;capabilities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;libcurl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;curl_version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 需要 curl 包&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 4. 测试实际下载（使用 libcurl 方法）&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download.file.method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;libcurl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download.file.quiet&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;FALSE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 显示下载过程&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;test_url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.westlake.edu.cn/bioconductor/3.18/bioc/PACKAGES&#34;&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;download.file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;test_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;destfile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;test_PACKAGES&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;libcurl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;但是，用 &lt;code&gt;wget&lt;/code&gt; 测试却是正常的！
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-S&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/bioc/src/contrib/PACKAGES&#34;&lt;/span&gt;
--2026-03-10&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;13&lt;/span&gt;:17:10--&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/bioc/src/contrib/PACKAGES
Resolving&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mirrors.westlake.edu.cn&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mirrors.westlake.edu.cn&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;124&lt;/span&gt;.160.108.195,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;.247.30.189,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2001&lt;/span&gt;:250:6413:1002:250:56ff:10:195
Connecting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mirrors.westlake.edu.cn&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mirrors.westlake.edu.cn&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;124&lt;/span&gt;.160.108.195&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;:443...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;connected.
HTTP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;request&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sent,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awaiting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;response...
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;HTTP/1.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OK
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Date:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tue,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Mar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2026&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;05&lt;/span&gt;:17:28&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GMT
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Content-Length:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;836345&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Connection:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;keep-alive
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Accept-Ranges:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bytes
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Alt-Svc:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;h3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;:443&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ma&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2592000&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Etag:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;d0nehqitrzwjhxbt&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Last-Modified:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Thu,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Apr&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2024&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;16&lt;/span&gt;:48:34&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GMT
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Vary:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Accept-Encoding
Length:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;836345&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;817K&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
Saving&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘PACKAGES’

PACKAGES&lt;span class=&#34;w&#34;&gt;                                &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;%&lt;span class=&#34;o&#34;&gt;[===============================================================================&lt;/span&gt;&amp;gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;816&lt;/span&gt;.74K&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.00MB/s&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.8s

&lt;span class=&#34;m&#34;&gt;2026&lt;/span&gt;-03-10&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;13&lt;/span&gt;:17:13&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.00&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MB/s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘PACKAGES’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;saved&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;836345&lt;/span&gt;/836345&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;wget&lt;/code&gt; 下载具体的包也是正常的。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-t&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-check-certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://mirrors.westlake.edu.cn/bioconductor/3.18/data/experiment/src/contrib/ChAMPdata_2.34.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;事情到这里，基本可以肯定是默认的 &lt;code&gt;libcurl&lt;/code&gt; 有问题，至于具体是什么问题，折腾了好久都没排查个所以然来，虽然在 《&lt;a href=&#34;https://shenwy.com/yuque/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/r/2021-02-20-r-download-file/&#34;&gt;R 语言 download.file 的几点知识&lt;/a&gt;》也讨论过 R 通过 &lt;code&gt;download.file&lt;/code&gt; 下载数据和软件包默认方法的问题，但对 &lt;code&gt;libcurl&lt;/code&gt; 一直都了解的太少。&lt;/p&gt;
&lt;h2 id=&#34;使用-wget-方法&#34;&gt;使用 wget 方法&lt;a class=&#34;headerlink&#34; href=&#34;#使用-wget-方法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;既然 &lt;code&gt;wget&lt;/code&gt; 可以正常下载西湖大学镜像的具体包，说明网络和镜像本身没问题。我们可以通过配置 R 的下载方法，让 BiocManager 调用 &lt;code&gt;wget&lt;/code&gt; 而非默认的 &lt;code&gt;libcurl&lt;/code&gt;/&lt;code&gt;internal&lt;/code&gt; 方法。&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 设置全局下载方法为 wget&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download.file.method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;wget&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# （可选）BiocManager 专属选项（某些版本支持）&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BiocManager.download.file.method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;wget&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# （可选）添加 wget 额外参数，如超时、重试、断点续传&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download.file.extra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;paste&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;--timeout=60&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 超时时间（秒）&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;--tries=3&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;         &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 重试次数&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;--progress=bar:force&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 强制显示进度条&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;--no-check-certificate&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 跳过证书验证（仅限内网/自签名证书）&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这样子配置完后，就可以让  R 使用 &lt;code&gt;wget&lt;/code&gt; 作为下载工具去下载西湖大学镜像的具体包了。&lt;/p&gt;
&lt;h2 id=&#34;使用-curl-方法&#34;&gt;使用 curl 方法&lt;a class=&#34;headerlink&#34; href=&#34;#使用-curl-方法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个方法其实在《&lt;a href=&#34;https://shenwy.com/yuque/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/r/2021-02-20-r-download-file/&#34;&gt;R 语言 download.file 的几点知识&lt;/a&gt;》也提到过，具体就是 —— 使用 &lt;code&gt;curl&lt;/code&gt; 方法时，通常需要加上 &lt;code&gt;-L&lt;/code&gt; 参数。这时候 R 会自动调用系统的 &lt;code&gt;curl&lt;/code&gt; 命令在后台执行对应包的下载。使用这个方法的前提是，对应的 R 包能正常通过 &lt;code&gt;curl&lt;/code&gt; 命令进行下载。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-L&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-S&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://mirrors.westlake.edu.cn/bioconductor/packages/3.18/bioc/src/contrib/ChAMP_2.32.0.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ChAMP_2.32.0.tar.gz
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Total&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Received&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Xferd&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Average&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Speed&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;Time&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Time&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;Time&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Current
&lt;span class=&#34;w&#34;&gt;                                 &lt;/span&gt;Dload&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Upload&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;Total&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;Spent&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Left&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Speed
&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;8134k&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;8134k&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;948k&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;:00:08&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;:00:08&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--:--:--&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;1833k
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置 &lt;code&gt;download.file.method&lt;/code&gt; 使用 &lt;code&gt;curl&lt;/code&gt; 方法：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# For method &#34;curl&#34; use argument extra = &#34;-L&#34;.&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download.file.method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;curl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-L&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# （可选）BiocManager 专属选项（某些版本支持）&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BiocManager.download.file.method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;curl&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-L&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://stackoverflow.com/questions/45061272/r-and-ssl-curl-on-ubuntu-linux-failed-ssl-connect-in-r-but-works-in-curl&#34;&gt;R and SSL/curl on Ubuntu linux: failed SSL connect in R, but works in curl&lt;/a&gt; - &lt;a href=&#34;https://stackoverflow.com/&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;180&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-180/</link>
      <pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-180/</guid>
      
    </item>
    
    <item>
      <title>用 Docker 来解决 LinearDesign 的 GLIBC 版本过低问题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;h2 id=&#34;lineardesign-介绍&#34;&gt;LinearDesign 介绍&lt;a class=&#34;headerlink&#34; href=&#34;#lineardesign-介绍&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LinearDesign 是一款用于优化 mRNA 设计的软件，旨在提高 mRNA 的稳定性和免疫原性。该项目由 He Zhang、Liang Zhang、Ang Lin 等研究人员开发，并已在 Nature杂志上发表相关研究成果。LinearDesign 通过算法优化 mRNA 序列，使其在保持高翻译效率的同时，具有更好的结构稳定性。&lt;/p&gt;
&lt;p&gt;GitHub 地址：&lt;a href=&#34;https://github.com/LinearDesignSoftware/LinearDesign&#34;&gt;https://github.com/LinearDesignSoftware/LinearDesign&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;项目快速启动&#34;&gt;项目快速启动&lt;a class=&#34;headerlink&#34; href=&#34;#项目快速启动&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;确保你的系统满足以下依赖要求：     &lt;br /&gt;
- Clang 11.0.0 或更高版本，或 GCC 4.8.5 或更高版本             &lt;br /&gt;
- Python 2.7        &lt;br /&gt;
- GLIBC≥2.29          &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;glibc (GNU C Library) 是 GNU 发布的 C 标准运行库，是 Linux 系统中最底层、最核心的 API，几乎所有应用软件都依赖它。它主要负责封装 Linux 内核系统调用，并提供内存管理、字符串操作、文件操作等标准函数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Ubuntu 18.04.6 LTS 中，GLIBC 最高只有 2.27，在不升级系统更新 GLIBC 风险太大，因此可以考虑用 Docker 的方式来解决 LinearDesign 的 GLIBC 版本过低问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;构建-lineardesign-的-docker-镜像&#34;&gt;构建 LinearDesign 的 Docker 镜像&lt;a class=&#34;headerlink&#34; href=&#34;#构建-lineardesign-的-docker-镜像&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;编写-dockerfile&#34;&gt;编写 Dockerfile&lt;a class=&#34;headerlink&#34; href=&#34;#编写-dockerfile&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# GUESSING....&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# dfimage shenweiyan/lineardesign:1.0&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# WARNING: The requested image&#39;s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# FROM shenweiyan/lineardesign:1.0&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;FROM ubuntu:jammy-20230425&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;ARG RELEASE&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;ARG LAUNCHPAD_BUILD_ARCH&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;LABEL org.opencontainers.image.ref.name=ubuntu&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;LABEL org.opencontainers.image.version=22.04&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;# ADD file:2fc6364d149eccc7f94ead482a0dcf24b0e44cc0d00ac6a2c1797776153e9608 in /&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y git&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;# Need to add Python2 (should be 2.7.18)&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;# https://linuxconfig.org/install-python-2-on-ubuntu-22-04-jammy-jellyfish-linux&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN apt-get install -y python2&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;# Need to add GCC&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;# https://linuxconfig.org/how-to-install-gcc-the-c-compiler-on-ubuntu-22-04-lts-jammy-jellyfish-linux&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN apt-get install -y build-essential&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN apt-get clean&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN git clone https://gitcode.com/bio-mirrors/LinearDesign.git /lineardesign&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# buildkit&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN cd /lineardesign &amp;amp;&amp;amp; make&lt;/span&gt;

&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;RUN mkdir /mnt/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;             &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# buildkit&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;WORKDIR /lineardesign&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;VOLUME [/mnt/data]&lt;/span&gt;
&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;CMD [&#34;/bin/bash&#34;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;构建镜像&#34;&gt;构建镜像&lt;a class=&#34;headerlink&#34; href=&#34;#构建镜像&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-t&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign:1.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;docker-build-lineardesign&#34; src=&#34;https://gi.weiyan.tech/2026/03/docker-build-lineardesign.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;查看镜像&#34;&gt;查看镜像&lt;a class=&#34;headerlink&#34; href=&#34;#查看镜像&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;images
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;运行容器&#34;&gt;运行容器&lt;a class=&#34;headerlink&#34; href=&#34;#运行容器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以使用下面的方式开启 docker 容器。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;交互方式
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-it&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/steven/data:/data&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign:1.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
   这种方式，通过 &lt;code&gt;exit&lt;/code&gt; 退出容器后，容器被终止，可以通过 &lt;code&gt;docker ps -a&lt;/code&gt; 来看终止状态的容器，可以通过 &lt;code&gt;docker rm &amp;lt;CONTAINER ID&amp;gt;&lt;/code&gt; 删除终止状态的容器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Daemon 方式，守护态运行
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-it&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/steven/data:/data&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign:1.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
   守护态运行运行的容器，在容器内 &lt;code&gt;exit&lt;/code&gt; 退出后，容器不会终止，可以使用 &lt;code&gt;docker exec -it &amp;lt;CONTAINER ID&amp;gt; bash&lt;/code&gt; 再次进入容器。    &lt;br /&gt;
   这种方式可以让软件作为长时间服务运行，可通过 &lt;code&gt;ocker stop &amp;lt;CONTAINER ID&amp;gt;&lt;/code&gt;终止容器，通过 &lt;code&gt;ocker rm &amp;lt;CONTAINER ID&amp;gt;&lt;/code&gt;删除终止状态的容器。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;将本地镜像推送到远程仓库&#34;&gt;将本地镜像推送到远程仓库&lt;a class=&#34;headerlink&#34; href=&#34;#将本地镜像推送到远程仓库&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是指把我们构建好的镜像 push 到 Docker Hub、阿里云 ACR、Harbor 等远程 Registry，这里我们 push 到 Docker Hub。&lt;/p&gt;
&lt;h3 id=&#34;登录远程仓库&#34;&gt;登录远程仓库&lt;a class=&#34;headerlink&#34; href=&#34;#登录远程仓库&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;首次登录会提示输入用户名/密码或 Access Token。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# Docker Hub&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;login

&lt;span class=&#34;c1&#34;&gt;# 阿里云 ACR&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;login&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;registry.cn-hangzhou.aliyuncs.com

&lt;span class=&#34;c1&#34;&gt;# 私有 Harbor&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;login&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;harbor.yourcompany.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;为镜像打标签&#34;&gt;为镜像打标签&lt;a class=&#34;headerlink&#34; href=&#34;#为镜像打标签&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;远程仓库要求镜像名称格式为：&lt;code&gt;&amp;lt;registry&amp;gt;/&amp;lt;namespace&amp;gt;/&amp;lt;repo&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 推送到 Docker Hub（用户名：shenweiyan）&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tag&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign:1.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shenweiyan/lineardesign:1.0

&lt;span class=&#34;c1&#34;&gt;# 推送到阿里云 ACR&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tag&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lineardesign:1.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;registry.cn-hangzhou.aliyuncs.com/shen-lab/lineardesign:1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;推送镜像&#34;&gt;推送镜像&lt;a class=&#34;headerlink&#34; href=&#34;#推送镜像&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 推送到 Docker Hub&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;push&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shenweiyan/lineardesign:1.0
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;push&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;refers&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;repository&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;docker.io/shenweiyan/lineardesign&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
5f70bf18a086:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
f307a02003d0:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
67721cd40298:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
&lt;span class=&#34;m&#34;&gt;593672012667&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
52bfb0e9f36b:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
5dd52f89c1a9:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
8fb8ac00d103:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
c90d82bb7e29:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
b8a36d10656a:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pushed
&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.0:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;digest:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sha256:aa43b247010b964a9b3faf434409463df12002bd9ecf03b1d41bf55f74df988e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;size:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2204&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 推送到阿里云&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;push&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;registry.cn-hangzhou.aliyuncs.com/shen-lab/lineardesign:1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;验证推送&#34;&gt;验证推送&lt;a class=&#34;headerlink&#34; href=&#34;#验证推送&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 查看远程仓库（网页或 CLI）&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 或拉取测试：&lt;/span&gt;
docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pull&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shenweiyan/lineardesign:1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;lineardesign-shenweiyan&#34; src=&#34;https://gi.weiyan.tech/2026/03/lineardesign-shenweiyan.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;run-docker-lineardesign&#34; src=&#34;https://gi.weiyan.tech/2026/03/run-docker-lineardesign.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;179&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-179/</link>
      <pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-179/</guid>
      
    </item>
    
    <item>
      <title>丙午马年 2026 春节</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;丙午年是中国传统干支纪年体系中的第 43 个组合，以天干“丙”与地支“午”相配构成双火格局，对应生肖马，故称火马年或赤马年，每 60 年循环出现于 1906、1966、2026 等年份。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;2026 年的春节转眼就过去了，还在初六的时候就已经感受到即将要上班的无力和抗拒。&lt;/p&gt;
&lt;h2 id=&#34;回家越来越方便&#34;&gt;回家越来越方便&lt;a class=&#34;headerlink&#34; href=&#34;#回家越来越方便&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;和往年不一样的是，今年的回老家选择高铁+顺风车的方式。提前一周的时间成功候补了一家三口的三张高铁票，加上顺风车到家门的 1.5H 车程，全程 4 个小时把今年回家的体验感直接提升了好几个档次 —— 终于再也不用担心像往年一样的堵堵堵了！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;xintang-china-railway&#34; src=&#34;https://gi.weiyan.tech/2026/02/xintang-china-railway.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;大潮收费站（S26中阳信高速出口）无疑是今年回家，在交通方面最大的惊喜之一，极大的提升了从老家到进出市区、走亲访友的体验，第一次真真切切感受到了高铁修道家门口所带来的便捷和幸福感。&lt;/p&gt;
&lt;h2 id=&#34;年味&#34;&gt;年味&lt;a class=&#34;headerlink&#34; href=&#34;#年味&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;其实快乐和年味一直都有，只是换了一批人去感受。人长大了，都各有各的家庭需要兼顾，过年也不例外，这样子相聚在一起的时间也就更少了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不要动不动就说，现在过年没有年味了，没有小时候的乐趣了。快乐和年味一直都有，只是自从你接替了父母的角色，担起了生活的重担，过年的快乐就不再属于你了。&lt;/p&gt;
&lt;p&gt;随着年龄的增长，你从看烟花变成放烟花，从吃年夜饭变为做年夜饭，你不再是曾经的那个少年，你已经成为放烟花给孩子看的人了，所以你要什么年味，你已经不是主角了。你会发现过年最重要的，是让你身边的人感受过年的快乐。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;new-year-2026-1&#34; src=&#34;https://gi.weiyan.tech/2026/02/new-year-2026-1.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;new-year-2026-4&#34; src=&#34;https://gi.weiyan.tech/2026/02/new-year-2026-4.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;失落&#34;&gt;失落&lt;a class=&#34;headerlink&#34; href=&#34;#失落&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;为什么每年大年初一的下午，会有一种莫名的失落感？&lt;/p&gt;
&lt;p&gt;因为过年的真正意义，是在年前十五天左右，是在过年回家的路上，是在除夕前一天晚上。&lt;/p&gt;
&lt;p&gt;一旦过了年初一初二就没意思了。古人讲乐在将至，而非已至。人总是在无限接近幸福的时候最幸福，就像周五的下午永远比周末更让人开心。即将拥有时，期待的感觉永远比拥有更快。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;new-year-2026-2&#34; src=&#34;https://gi.weiyan.tech/2026/02/new-year-2026-2.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;new-year-2026-3&#34; src=&#34;https://gi.weiyan.tech/2026/02/new-year-2026-3.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;不一样的变化&#34;&gt;不一样的变化&lt;a class=&#34;headerlink&#34; href=&#34;#不一样的变化&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在知乎看到 《&lt;a href=&#34;https://zhuanlan.zhihu.com/p/2008311689326653721&#34;&gt;回家过年发现今年过年的10大新变化现象&lt;/a&gt;》 这一篇文章，有几点的确感触很深。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;往年回来过年的人要初六初七才开始陆陆续续出门，今年才初四村里就看不到什么人了。&lt;/li&gt;
&lt;li&gt;基本没有人组织同学聚会了，就算有，绝大部分人也不参与了，顶多几个玩得好的私下聚聚。&lt;/li&gt;
&lt;li&gt;大家好像进入了低欲望阶段，年夜饭一大桌就意思了几口，红包收着也就收着了，春晚是不想看的，和同辈聊聊天、打打牌也很无聊，只想回家睡大觉，门根本不想出，旅游更是没兴趣，只想爆睡到初八。&lt;/li&gt;
&lt;li&gt;各个微信群都不发红包了，好像大家都商量好了，让彼此过个没有负担的年，你不打扰我，我也不麻烦你。&lt;/li&gt;
&lt;li&gt;放烟花的，放大炮仗的很少，鞭炮声也变小时间变短了。&lt;/li&gt;
&lt;li&gt;时间好像开了二倍速、三倍速，一晃几天就过完了，还没来得及品味其中的滋味，又将踏上漂泊的行程，过个年像做了场梦，该醒了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;祝福&#34;&gt;祝福&lt;a class=&#34;headerlink&#34; href=&#34;#祝福&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;人们用 300 多天的勤劳换来了 5-6 天的热闹，团聚，欢乐，吵闹，这一切过后的安静更为震耳欲聋。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hometown-stars&#34; src=&#34;https://gi.weiyan.tech/2026/02/hometown-stars.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;2026，烟火向星辰，愿新的一年，所愿皆成真，我们越来越好，越来越顺。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;178&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-178/</link>
      <pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-178/</guid>
      
    </item>
    
    <item>
      <title>我的博客图床新方案 R2-Explorer</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;&lt;a href=&#34;https://shenwy.com/&#34;&gt;博客站点&lt;/a&gt; 图床的问题，&lt;a href=&#34;https://shenwy.com/blog/discussions-62/&#34;&gt;纠结了很久&lt;/a&gt;，也一度以为很难会找到一个自己满意的 Pages 工具。但幸运的是，2025 年 12 月时候看到了 &lt;a href=&#34;https://github.com/G4brym/R2-Explorer&#34;&gt;R2-Explorer&lt;/a&gt; 这个基于 Worker 的 Cloudflare R2 存储管理工具，部署完成后一番体验下来，发现这就是我一直要找的图床。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;r2-explorer-live-demo&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-live-demo.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;在线访问&#34;&gt;在线访问&lt;a class=&#34;headerlink&#34; href=&#34;#在线访问&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，它是基于 GitHub Actions 部署到 Cloudflare 的 Workers 边缘计算平台上，通过绑定域名提供基于网页的在线访问。&lt;/p&gt;
&lt;h2 id=&#34;身份验证&#34;&gt;身份验证&lt;a class=&#34;headerlink&#34; href=&#34;#身份验证&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;其次，它提供了基本的身份验证支持，可以通过配置 GitHub Secrets and variables 实现用户名、密码登录。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;R2EXPLORER_CONFIG =&amp;gt; { readonly: false, basicAuth: { username: &#39;shenwy&#39;, password: &#39;123456&#39; }, }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34; r2-explorer-sign-in&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-sign-in.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;文件管理&#34;&gt;文件管理&lt;a class=&#34;headerlink&#34; href=&#34;#文件管理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;支持的文件管理包括：
- 拖放式文件上传
- 文件夹的创建和组织
- 大文件分段上传
- 右键单击上下文菜单可查看高级选项
- HTTP/自定义元数据编辑
- &lt;strong&gt;可共享链接&lt;/strong&gt; - 创建安全的公开文件 URL，可选择设置密码保护、过期时间和下载次数限制&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;r2-explorer-manage&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-manage.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/G4brym/R2-Explorer/issues/51&#34;&gt;复制图片的直接链接&lt;/a&gt; 的功能现在也已经支持，如果你在这个功能的配置中遇到了问题，可以参考&lt;a href=&#34;https://github.com/G4brym/R2-Explorer/issues/120&#34;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;r2-explorer-copy-public-url&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-copy-public-url.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;文件处理&#34;&gt;文件处理&lt;a class=&#34;headerlink&#34; href=&#34;#文件处理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;支持 PDF 文档、图片、文本文件、Markdown、CSV 等，浏览器内文件预览。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;r2-explorer-pdf-preview&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-pdf-preview.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;部署与构建&#34;&gt;部署与构建&lt;a class=&#34;headerlink&#34; href=&#34;#部署与构建&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;虽然 &lt;a href=&#34;https://r2explorer.com/getting-started/creating-a-new-project&#34;&gt;官方文档&lt;/a&gt; 有很详细的部署和配置说明，但有一些细节并未给出。&lt;/p&gt;
&lt;h3 id=&#34;cloudflare-api-token&#34;&gt;Cloudflare API Token&lt;a class=&#34;headerlink&#34; href=&#34;#cloudflare-api-token&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;进入 &lt;a href=&#34;https://dash.cloudflare.com/profile/api-tokens&#34;&gt;https://dash.cloudflare.com/profile/api-tokens&lt;/a&gt; 申请 Cloudflare API Token，对应权限如下：
&lt;img alt=&#34;r2-explorer-api&#34; src=&#34;https://gi.weiyan.tech/2026/02/r2-explorer-api-token.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;github-secrets-and-variables&#34;&gt;GitHub Secrets and variables&lt;a class=&#34;headerlink&#34; href=&#34;#github-secrets-and-variables&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;配置 GitHub Secrets&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CF_API_TOKEN =&amp;gt; Cloudflare API Token&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置 GitHub Variables&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;R2EXPLORER_WORKER_NAME =&amp;gt; gitimg-r2-explorer&lt;/code&gt;  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;R2EXPLORER_CONFIG =&amp;gt; { readonly: false, basicAuth: { username: &#39;steven&#39;, password: &#39;123456&#39; }, buckets: { &#39;gitimg-r2-explorer&#39;: { publicUrl: &#34;https://gi.weiyan.tech&#34; } }, }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;R2EXPLORER_BUCKETS =&amp;gt; gitimg-r2-explorer:gitimg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;R2EXPLORER_DOMAIN =&amp;gt; gg.weiyan.tech&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;最后&#34;&gt;最后&lt;a class=&#34;headerlink&#34; href=&#34;#最后&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后总得写点什么，搜索枯肠墨枯笔涩，只能说好好码字，努力生活！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;177&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-177/</link>
      <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-177/</guid>
      
    </item>
    
    <item>
      <title>年底迷思</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;此时此刻，距离 2026 年的春节还剩大约 2 周的时间，记录一下这段时间的一些糟心。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;a href=&#34;https://shenwy.com/blog/discussions-175/&#34;&gt;上一篇&lt;/a&gt; 文章的 X 项目，终于是走到了最后阶段，在年底这个节骨眼，细枝末叶的琐事一件接一件，压得喘不过气。&lt;/p&gt;
&lt;p&gt;加班好像成了常态。&lt;/p&gt;
&lt;p&gt;一月上旬频繁人事变动和压抑带来的躁动和不安，随着时间竟有种事过境迁，淡忘如水的错觉，时间静默地抚平一切波澜。&lt;/p&gt;
&lt;p&gt;心底依旧割裂，永远摸不到安全的边界。&lt;/p&gt;
&lt;p&gt;生活愧歉良多。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;176&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-176/</link>
      <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-176/</guid>
      
    </item>
    
    <item>
      <title>2025 致敬每一个人都在拼命地苟活着人</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;千言万语，无从下笔！&lt;/p&gt;
&lt;p&gt;2025 已接近尾声，在这个时间节点，也确实该对自己做一个阶段性的总结了，也顺便对我的来时路做个回顾。2025 对于个人来说，可以用几个关键词串起来：AI、社区开源、项目、户外徒步。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;ai&#34;&gt;AI&lt;a class=&#34;headerlink&#34; href=&#34;#ai&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025 年初，DeepSeek 爆火让各大公司开始对 AI 趋之若鹜，蠢蠢欲动。对于我自己来说，最开始，完全是出于个人兴趣，陆陆续续对着 Ollama、OpenWebUI、AnythingLLM 一通瞎折腾，尝试 DeekSeek、Qwen 本地安装和 API 调用，大多都浅尝截止，只追求能用上能问答能简单推理，总有一种知其然不知其所以然的困惑。&lt;/p&gt;
&lt;p&gt;后来，细化到具体业务方向考虑，开始跟各大厂商接触，知道了 MaxKB、Dify、FastGPT，开始本地和线上的部署，开始流程编排的各种尝试，在 CPU 服务器上的尝试失败后，又被应用开发的权限、前端开发问题拦住，原地踏步。&lt;/p&gt;
&lt;p&gt;在生信方向，蛋白核酸的模型接触的越来越多，从老破旧的 RHEL 6 到 Ubuntu-22.04，虽然都是 CPU，但也总能勉勉强强跑起来解决一部分问题。随之而来的 HelixFold、AlphaFold3 这种在线工具也用的多了起来，也算是真真切切对 AI 有了一个相对直观的认识。
&lt;img alt=&#34;my-2025-ai&#34; src=&#34;https://gi.weiyan.tech/2025/12/my-2025-ai.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;项目&#34;&gt;项目&lt;a class=&#34;headerlink&#34; href=&#34;#项目&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;姑且叫它 X 项目。&lt;/p&gt;
&lt;p&gt;这是一个机会与挑战并存的项目。从匆匆的接手到后面推进的每一步，都耗费了我极大的心力，为了这个项目有过太多的煎熬、彷徨和无法消解的压力，也曾一度让我对自己的职业生涯产生过怀疑。不管主观原因还是客观因素，在项目的最后冲刺阶段，退无可退，只能咬咬牙继续往前推。&lt;/p&gt;
&lt;p&gt;X 带给自己的除了面对压力，面对未知的负面情绪和咬咬牙后的坚持外，也让我看到一些优秀的人在处理事情做决策的果敢与睿智。在复杂棘手的状况面前，他们总能迅速抽丝剥茧，精准地抓住问题的核心要点，以冷静客观的态度分析局势，权衡利弊。&lt;/p&gt;
&lt;h2 id=&#34;社区开源&#34;&gt;社区开源&lt;a class=&#34;headerlink&#34; href=&#34;#社区开源&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这一年，GitHub 成了每天必逛的地方，GitCode 使用的频率大幅上升。GitHub 的 Discussions 承载了个人博客站点的一篇篇文章，GitCode 的 Issues 成了个人情绪的小黑屋。公众号更新的频率越来越低，博客和 Issues 越写越多。&lt;/p&gt;
&lt;p&gt;在开源项目的付费尝试中，也算勉勉强强填平了一个 top 域名十年续费的成本，自娱自乐。&lt;/p&gt;
&lt;h2 id=&#34;户外徒步&#34;&gt;户外徒步&lt;a class=&#34;headerlink&#34; href=&#34;#户外徒步&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;国庆回来后，便开启了每周一山的户外徒步小目标 —— 从四小只的油麻山森林公园开始，到后面的龙神线、金麦线、龙渔线，每周不一样的风景，不一样的收获。
&lt;img alt=&#34;liangbulu-2025-1&#34; src=&#34;https://gi.weiyan.tech/2025/12/liangbulu-2025-1.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;希望每一次的经历，都能让这几个 &amp;ldquo;萌娃小队&amp;rdquo; 们的友谊像山顶的风景一样开阔，也像攀登过程一样充满乐趣和成长。&lt;/p&gt;
&lt;h2 id=&#34;羽毛球&#34;&gt;羽毛球&lt;a class=&#34;headerlink&#34; href=&#34;#羽毛球&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;入手了人生的第一把高端拍 77 Pro，球衣、球包、球鞋、手胶、拍线花费的不多，但都很满意，尤其是球包和球鞋。开始爱上 25/27 的差磅感觉，持续对 80 线情有独钟。&lt;/p&gt;
&lt;p&gt;每周至少一场球，足迹遍布羽括1号、羽括9号、羽括5号、奥力派、荔湖城、风羽、威力、搜羽，遗憾的是离家最近的新动力羽毛球馆在这一年的下半年下线了。&lt;/p&gt;
&lt;h2 id=&#34;寄语&#34;&gt;寄语&lt;a class=&#34;headerlink&#34; href=&#34;#寄语&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025 是焦虑、煎熬，与压力的一年，经济发展有所下降、企业利润降低、债务、裁员、降薪、找不到工作、难以承受的房贷车贷等等这些成为了这一年的主题，每一个人都在拼命地苟活着。&lt;/p&gt;
&lt;p&gt;希望接下来的 2026 年，健康，和顺。After all, tomorrow is another day！&lt;/p&gt;
&lt;p&gt;2026，加油！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;175&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-175/</link>
      <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-175/</guid>
      
    </item>
    
    <item>
      <title>每周一山 | 广州龙渔线徒步</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;广州龙渔线是一条从&lt;strong&gt;龙眼洞&lt;/strong&gt;至&lt;strong&gt;渔沙坦&lt;/strong&gt;的城郊徒步路线，全长约12公里。它以交通便利、难度适中著称，串联起山林、水库与陡峭石壁，其中二战碉堡遗址是途中标志景观。&lt;/p&gt;
&lt;p&gt;我们这一次走的是从植物园 → 鬼王山 → 龙洞（民族文化村）总站的路线 —— 从地铁 6 号线看植物园的下一站就是龙洞，相当于绕一圈就走了一站地铁站。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;搭乘地铁6号线植物园G出口出来，从旁边的宝翠园进去，穿过广东工业大学（龙洞校区）。
&lt;img alt=&#34;ly-20251214-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-20251214-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-20251214-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-20251214-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;穿过广东工业大学（龙洞校区）后，我们从旁边一小片菜地边开始上山。
&lt;img alt=&#34;ly-climb-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-climb-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-climb-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-climb-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;龙渔线我们走的大部分都是碎石路，前一天周六下了大半天的绵绵小雨，本以为第二天的路多少会有些泥泞，没想好却是恰到好处的潮而不黏，反而少了一分灰尘，多了几分雨后的清新干爽。
&lt;img alt=&#34;ly-climb-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-climb-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-100150&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-100150.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-100453&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-100453.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-102647&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-102647.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;碎石路的后面是泥路，湿而不软，加上时而透过林间的阳光，一路上也是惬意满满。
&lt;img alt=&#34;ly-104604&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-104604.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-111148&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-111148.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-113210&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-113210.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-113406&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-113406.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;龙渔线其实也是有几段坡度比较大的泥路，包括上坡和下坡。
&lt;img alt=&#34;ly-113533&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-113533.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;鬼王山的陡峭石壁，算是整个龙渔线最震撼的一段，据说旁边还有个二战碉堡遗址的标志景观，可惜这一次没看到。
&lt;img alt=&#34;ly-115808&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-115808.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-120121&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-120121.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-120826&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-120826.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;鬼王山过后，我们穿过一路杂草丛生的山路，开始下山。
&lt;img alt=&#34;ly-122120&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-122120.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-122208&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-122208.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ly-122617&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-122617.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最终，我们到达 &lt;strong&gt;&amp;ldquo;龙洞（民族文化村）总站&amp;rdquo;&lt;/strong&gt;，在这里可以乘坐公交直达龙洞地铁站。
&lt;img alt=&#34;ly-124401&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-124401.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这一次的龙渔线全程约 8.5 公里，我们 5 个大人 4 个小孩，耗时 3 个小时左右完成，总体来说速度还是相当快的。三个一年级小学生，加上一个五年级的姐姐，四个萌娃像开了挂一样引领了全程。作为幼儿园的同班同学和一路走过来的爬山搭子，希望每一次的经历都能让你们的友谊像山顶的风景一样开阔，也像攀登过程一样充满乐趣和成长。
&lt;img alt=&#34;ly-locus-20251214&#34; src=&#34;https://gi.weiyan.tech/2025/12/ly-locus-20251214.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;期待下次继续挑战更高更远的目标！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;174&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-174/</link>
      <pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-174/</guid>
      
    </item>
    
    <item>
      <title>Python 包和项目管理工具 UV 安装与更新</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; 有人评价是近十年来 Python 生态出现的最好东西，它彻底改变了 Python 的安装和使用方式，尤其在快速解决依赖冲突（这对大型项目至关重要）方面，速度快得惊人。作为一个由 Astral 开发，用 Rust 编写，几乎可以在任何操作系统或平台上运行的免费的开源工具，个人在越来越多的开源模型、项目中都能看到它的身影，&lt;code&gt;uv&lt;/code&gt; 似乎已经和 &lt;code&gt;conda&lt;/code&gt; 成为了现在 Python 环境构建与管理的标配。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/12/uv-fast.webp&#34; alt=&#34;uv-fast&#34;&gt;&lt;br&gt;
    &lt;em&gt;Installing &lt;a href=&#39;https://trio.readthedocs.io/&#39; target=&#39;_blank&#39;&gt;Trio&lt;/a&gt;&#39;s dependencies with a warm cache.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;官方文档 &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/#installing-uv&#34;&gt;Installing uv&lt;/a&gt; 大多数都是先下载 &lt;code&gt;install.sh&lt;/code&gt;，然后 &lt;code&gt;sh install.sh&lt;/code&gt; 执行安装。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;installsh&#34;&gt;install.sh&lt;a class=&#34;headerlink&#34; href=&#34;#installsh&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，&lt;code&gt;sh install.sh&lt;/code&gt; 默认把 &lt;code&gt;uv&lt;/code&gt; 和 &lt;code&gt;uvx&lt;/code&gt; 安装到 &lt;code&gt;~/.local/bin&lt;/code&gt; 目录，当然我们也这两个可执行文件 &lt;code&gt;mv&lt;/code&gt; 到任何想要的目录，然后把目标目录添加到 &lt;code&gt;$PATH&lt;/code&gt; 环境变量中。如果我们想要指定安装目录，可以：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-LsSf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://astral.sh/uv/install.sh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;env&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;UV_INSTALL_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/software/uv&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;其次，&lt;code&gt;sh install.sh&lt;/code&gt; 会默认使用 &lt;code&gt;curl&lt;/code&gt; 或者 &lt;code&gt;wget&lt;/code&gt; 先去 github 下载对应 prebuilt binaries 压缩包，然后解压缩到指定目录。  &lt;br /&gt;
&lt;img alt=&#34;uv-install-base-url&#34; src=&#34;https://gi.weiyan.tech/2025/07/uv-install-base-url.webp&#34; /&gt;    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;uv-install-curl-wget&#34; src=&#34;https://gi.weiyan.tech/2025/07/uv-install-curl-wget.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我们验证一下：
1. 首先，在 &lt;code&gt;install.sh&lt;/code&gt; 的 &lt;code&gt;downloader&lt;/code&gt; 部分增加一个 curl 执行输出。
   &lt;img alt=&#34;uv-install-echo-curl&#34; src=&#34;https://gi.weiyan.tech/2025/07/uv-install-echo-curl.webp&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;其次，我们对下载后的结果解压缩（unpack the archive）的执行也增加一个输出。
   &lt;img alt=&#34;uv-install-tar&#34; src=&#34;https://gi.weiyan.tech/2025/07/uv-install-tar.webp&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后，直接在本地执行 &lt;code&gt;sh install.sh&lt;/code&gt;。
   &lt;img alt=&#34;uv-sh-install-sh&#34; src=&#34;https://gi.weiyan.tech/2025/07/uv-sh-install-sh.webp&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以，如果由于网络原因 &lt;code&gt;install.sh&lt;/code&gt; 和 &lt;code&gt;uv-x86_64-unknown-linux-gnu.tar.gz&lt;/code&gt; 无法正常下载，推荐使用下面的方法安装。&lt;/p&gt;
&lt;p&gt;首先，下载好 &lt;code&gt;install.sh&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;其次，下载好 &lt;code&gt;uv-x86_64-unknown-linux-gnu.tar.gz&lt;/code&gt;，然后在 &lt;code&gt;install.sh&lt;/code&gt; 中替换 &lt;code&gt;ARTIFACT_DOWNLOAD_URL&lt;/code&gt; 为该压缩包所在的路径。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;#ARTIFACT_DOWNLOAD_URL=&#34;${INSTALLER_BASE_URL}/astral-sh/uv/releases/download/0.8.3&#34;&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;ARTIFACT_DOWNLOAD_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;file:///ifs1/software/uv/src&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第三，指定安装目录，执行安装。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;env&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;UV_INSTALL_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/ifs1/software/uv&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uv-installer.sh
downloading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.9.11&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;x86_64-unknown-linux-gnu
no&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;checksums&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify
installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/software/uv
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;uv
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;uvx
everything&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installed!

To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/software/uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;your&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PATH,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;either&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;restart&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;your&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shell&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run:

&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/software/uv/env&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;sh,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bash,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zsh&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ifs1/software/uv/env.fish&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;fish&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;直接安装&#34;&gt;直接安装&lt;a class=&#34;headerlink&#34; href=&#34;#直接安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;综合 &lt;code&gt;install.sh&lt;/code&gt; 的操作，其实我们可以直接去 &lt;a href=&#34;https://github.com/astral-sh/uv/releases&#34;&gt;https://github.com/astral-sh/uv/releases&lt;/a&gt; 下载对应的 prebuilt binaries 压缩包，然后解压缩到指定目录。&lt;strong&gt;但是这种安装会导致后续无法通过 &lt;code&gt;uv self update&lt;/code&gt; 自动更新，需要再次去手动下载 prebuilt binaries 压缩包，然后再解压。&lt;/strong&gt;    &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/astral-sh/uv/releases/download/0.8.3/uv-x86_64-unknown-linux-gnu.tar.gz
tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;xf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uv-x86_64-unknown-linux-gnu.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--strip-components&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/local/uv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;升级&#34;&gt;升级&lt;a class=&#34;headerlink&#34; href=&#34;#升级&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当 &lt;code&gt;uv&lt;/code&gt; 通过独立安装程序（&lt;strong&gt;install.sh&lt;/strong&gt;）安装时，可以通过下面的方式更新。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;self&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;admonition note&#34;&gt;
&lt;p class=&#34;admonition-title&#34;&gt;提示&lt;/p&gt;
&lt;p&gt;Updating uv will re-run the installer and can modify your shell profiles. To disable this behavior, set &lt;code&gt;INSTALLER_NO_MODIFY_PATH=1&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;卸载&#34;&gt;卸载&lt;a class=&#34;headerlink&#34; href=&#34;#卸载&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您需要从系统中去除 &lt;code&gt;uv&lt;/code&gt;，请按照下列步骤作。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;清理存储的数据（可选，在删除二进制文件之前，您可能希望删除 uv 存储的任何数据）
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cache&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean
rm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;
rm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;uv&lt;/code&gt; 和 &lt;code&gt;uvx&lt;/code&gt; 二进制文件
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/.local/bin/uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/.local/bin/uvx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;173&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-173/</link>
      <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-173/</guid>
      
    </item>
    
    <item>
      <title>广州金麦线徒步下集</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;自从上一次我们走完了&lt;a href=&#34;https://shenwy.com/blog/discussions-171/&#34;&gt;金麦线从金坑到华峰寺的前半段&lt;/a&gt;，这一次我们走的是从华峰寺 → 石牙顶天坑 → 麦村的下半段。出发点是华峰寺山脚下的&lt;strong&gt;华峰寺总站-公交站&lt;/strong&gt;，穿过华圣公园的小路，沿着登山步道一路向上，到达华峰寺。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;到达华峰寺短暂休息后，从华峰寺大雄宝殿的左侧指示牌处，开始上山。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-hfs-road-sign&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-hfs-road-sign.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从华峰寺上山的这一段路会比较陡，也比较滑，算是金麦线下半段中最吃力的一小段。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-hfs-climb-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-hfs-climb-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-hfs-climb-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-hfs-climb-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上完山后，沿着石牙顶天坑方向进发，这一段路线的上坡会相对平缓一些，但起起伏伏的路段会比较多，中后半程也会有几段坡度比较陡的，可以沿着绳索慢慢向下。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-04&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-04.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-05&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-05.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;过完下坡最陡的这一段山路，迎面的是一小段平坦的小公路，过去后又回到山路继续向前。走到黄埔增城界碑，距离石牙顶天坑就剩 2、300米的路程了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-road-1&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-road-1.webp&#34; /&gt;    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-road-2&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-road-2.webp&#34; /&gt;    &lt;/p&gt;
&lt;p&gt;从相对平坦的小公路到黄埔增城界碑（我在黄埔石牙顶很想你）这一段，前一段公路的路程很短，大部分是后面的泥山路。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-climb-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-climb-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-climb-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-climb-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tk-climb-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tk-climb-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从黄埔增城界碑出发，下一个点就是整个金麦线最大最漂亮的打卡地 —— 石牙顶天坑了。在这里可以从上往下俯瞰整个天坑的全貌，非常震撼漂亮，下山后也可以在山腰的登山步道打卡点打卡更加漂亮的天坑风景。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tkeng-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tkeng-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tkeng-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tkeng-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tkeng-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tkeng-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从石牙顶天坑往下走，也能沿途欣赏天坑不同角度的风景。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-04&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-04.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-05&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-05.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-06&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-06.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-tiankeng-07&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-tiankeng-07.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后的路线，就是下山直达麦村了，都是水泥路。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-mai-01&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-mai-01.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-mai-02&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-mai-02.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-mai-03&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-mai-03.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-mai-04&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-mai-04.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;总体来说，从华峰寺 → 石牙顶天坑 → 麦村的这次徒步还是挺好走的，沿途风景也极好，我们五个大人三个小孩一行人走走停停，全程 7.2 公里左右也就花了 3 个小时。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jm2-locus-20251206&#34; src=&#34;https://gi.weiyan.tech/2025/12/jm2-locus-20251206.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;172&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-172/</link>
      <pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-172/</guid>
      
    </item>
    
    <item>
      <title>广州金麦线徒步上集</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;金麦线一般是金坑地铁站 B 出口开始徒步，到达油麻山山顶约 2 小时，再到达华峰寺（12 点之前可以吃斋饭哦）、石牙顶天坑，最后到达麦村，终点也可以选择镇龙西地铁站（不想徒步公路的小伙伴，麦村也可以坐公交去地铁站）。      &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;从油麻山下 21 号线的金坑地铁站 B 口出来，沿着村道水泥路走上几百米，就正式进入了本次金麦线的山间小路。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_01.webp&#34; width=600 alt=&#34;jm-20251129_01&#34;&gt;
&lt;/p&gt;

&lt;p&gt;村里面环境也挺好的，中间还有一条小溪，小卖部也挺多了，可以买些水。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_02.webp&#34; width=600 alt=&#34;jm-20251129_02&#34;&gt;
&lt;/p&gt;

&lt;p&gt;金坑到油麻山的山间小路，前面部分其实还是挺好走的，沿途风景也很好，路的不算陡，也很少有那种又陡松散泥土又多且易滑的路段。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_12.webp&#34; width=600 alt=&#34;jm-20251129_12&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_13.webp&#34; width=600 alt=&#34;jm-20251129_13&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_14.webp&#34; width=600 alt=&#34;jm-20251129_14&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_15.webp&#34; width=600 alt=&#34;jm-20251129_15&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_16.webp&#34; width=600 alt=&#34;jm-20251129_16&#34;&gt;
&lt;/p&gt;

&lt;p&gt;其实，金麦线从金坑到油麻山、华峰寺，这一段真正有难度的，是中后半程才出现的那几段坡度极大且易滑的，起起伏伏的路线，尤其是从油麻山到华峰寺下山这一段，上下起伏，陡坡大、松散泥土多、易滑，不管是爬升还是下坡都难度极大，特别容易摔跤，需要特别注意。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-up-110507.webp&#34; width=600 alt=&#34;jm-up-110507&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-up-111114.webp&#34; width=600 alt=&#34;jm-up-111114&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-up-121712.webp&#34; width=600 alt=&#34;jm-up-121712&#34;&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-20251129_30.webp&#34; width=600 alt=&#34;jm-20251129_30&#34;&gt;
&lt;/p&gt;

&lt;p&gt;总体来说，这应该是个人在 2025 年爬过的难度最大的一次山，三个一年级的孩子加上 4 个大人历经 5 个小时，终于是爬完了前半段，在华峰寺休息了大半个小时，一拨人才慢悠悠的下山，回家。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://gi.weiyan.tech/2025/11/jm-locus-20251129.webp&#34; width=600 alt=&#34;jm-locus-20251129&#34;&gt;
&lt;/p&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;171&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-171/</link>
      <pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-171/</guid>
      
    </item>
    
    <item>
      <title>这个双十一小剁手</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2025 年的双十一并没有往年的热闹，不管是各大商家的促销力度和阵仗，还是周围人的反应，都透着一股冷清的氛围。或许正应景了当下低迷的就业环境，大家的购买欲望都被按下了减速键，愈发谨慎。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;服务器&#34;&gt;服务器&lt;a class=&#34;headerlink&#34; href=&#34;#服务器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这应该是今年双十一最大的一笔投入，把香港 4 核 8G 100G 的云服务器续费了一年，八五折共计 ¥425 块。这个来自 &lt;a href=&#34;https://zhenxun.cn/recommend/4zYOG1JdFE4YzUb9O6gC&#34;&gt;臻讯云&lt;/a&gt; 的服务器，用了将近一年，从价格，包括续费价格，和稳定性都让自己很满意。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hk-weiyan-server&#34; src=&#34;https://gi.weiyan.tech/2025/11/hk-weiyan-server.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;运动&#34;&gt;运动&lt;a class=&#34;headerlink&#34; href=&#34;#运动&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;国庆后带娃出去爬山和徒步的次数多了，刚好趁着这个双十一入手了两支登山杖，碳纤维，性价比，两相考虑在拼多多入手了原始人的这两支。到手后，11月16日去京溪森林公园环线使用体验了一下，还挺不错，轻便稳固，大人小孩都挺满意。        &lt;br /&gt;
&lt;img alt=&#34;hiking-pole&#34; src=&#34;https://gi.weiyan.tech/2025/11/hiking-pole.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;羽毛球装备，在京东给自己换了一个双肩的羽毛球包，价格，空间，舒适度，颜值都很满意。         &lt;br /&gt;
&lt;img alt=&#34;yy-bag-202511&#34; src=&#34;https://gi.weiyan.tech/2025/11/yy-bag-202511.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;羽毛球的另外一个大支出是球鞋。最开始，入手的是安踏的低帮后卫篮球鞋空域 5，这鞋子虽然颜值在线，但穿上发现蹬脚弯曲时候脚掌两侧会有点被硌到，始终不太舒服，不知道是因为鞋子太窄还是尺码不合适，只好选择了退掉。        &lt;br /&gt;
&lt;img alt=&#34;kongyu-5&#34; src=&#34;https://gi.weiyan.tech/2025/11/kongyu-5.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后来又来来回回看了一圈，纠结了一波 P9200NTD，P9200TD 巭，P9200 巭到底哪一款性价比更高后，最终在 PDD 下单了 VICTOR 威克多的 &lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=22699&#34;&gt;P9200NTD&lt;/a&gt;，比较神奇的是同样一款鞋子在京东要 ¥310 多，在拼多多 ¥240 多就可以拿下了！            &lt;br /&gt;
&lt;img alt=&#34;P9200NTD&#34; src=&#34;https://gi.weiyan.tech/2025/11/p9200ntd.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;开心就好&#34;&gt;开心就好&lt;a class=&#34;headerlink&#34; href=&#34;#开心就好&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个双十一的剁手还算是比较理性的，入手的四样东西都比较满意，情绪价值满满。手上的 Mate30 Pro 虽然用了 4 年多，清清存储后还是能支撑到明年的，而且今年的手机目前也没等到什么满意的，也算是给下一年定个目标。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;170&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-170/</link>
      <pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-170/</guid>
      
    </item>
    
    <item>
      <title>要和过去以及未来的自己对话</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;网站的初心就是要和过去以及未来的自己对话，可以在未来的某一天，坐在电脑旁打开，几年前，甚至十几年前的文章或者说说，可能会看到以前的自己与今天的自己有什么不同，重拾与回味在互联网洪流里自己留下独特印记。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;为什么要有一个属于自己的博客？&lt;/p&gt;
&lt;p&gt;似乎是每一位博主都会提及的一个老生常谈的话题。&lt;/p&gt;
&lt;p&gt;只是深知，真正会为它驻足的人不多，远不及最初设想的热闹。&lt;/p&gt;
&lt;p&gt;但是拥有一个属于自己的域名还有服务器，已是件足够浪漫并且很酷的事！&lt;/p&gt;
&lt;p&gt;可以在这里随意的写一些自己喜欢的东西，记下生活与工作里撞见的困惑与解法，就已经很好。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;169&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-169/</link>
      <pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-169/</guid>
      
    </item>
    
    <item>
      <title>统计之都中文博客</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;统计之都有一个帖子收集了上百个博客，《&lt;a href=&#34;https://d.cosx.org/d/421538&#34;&gt;大家贴一下自己的博客地址吧&lt;/a&gt;》，各种高人满天飞，拜读了一下，深感折服！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;168&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-168/</link>
      <pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-168/</guid>
      
    </item>
    
    <item>
      <title>网络文章</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;很多年前在语雀开设了一个 &amp;ldquo;&lt;a href=&#34;https://www.yuque.com/shenweiyan/articles&#34;&gt;网络文精选&lt;/a&gt;&amp;rdquo; 的专题知识库，记录了一些在互联网看到的个人比较喜欢的文章。个人站点在 2025-05 初的时候也增加了一个 &lt;strong&gt;&amp;ldquo;摘录&amp;rdquo;&lt;/strong&gt; 的导航分类，本意是想着把这些来源于互联网、自己喜欢的精选文章，或者是自己翻译而来的一些文章，放到里面。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;现在看来需要重新考虑一下这个分类的一些潜在风险。首先，是知识产权和是转载授权的问题。其次，是站点（仓库，或者是 Issues）敏感内容的风险问题。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;167&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-167/</link>
      <pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-167/</guid>
      
    </item>
    
    <item>
      <title>做猪呢最重要的是开心</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在知乎看到这张图片，被它呆萌与天真的眼神圈粉了，画的也很生动传神，不是么？底下的评论也很有爱，足以让这段时间身心俱疲的一些工作和生活阴霾得以短暂的休憩。   &lt;br /&gt;
&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/10/happy-pig.webp&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;国庆假期结束后，工作与生活的琐事便如潮水般接连涌来，再加上天气逐渐转凉且变幻无常，整个人忙得如同飞速旋转的陀螺，一刻也不得停歇。心中太多对未知的惴惴不安，还有那患得患失的隐隐担忧。正好看到了这只可爱又传神的呆萌猪，在给我带来些许的欢乐和温暖的同时，也把它挪到了个人的站点上，希望它也能给所有看到的人带去欢乐。&lt;/p&gt;
&lt;p&gt;看看另外一个网友画的 —— &amp;ldquo;画的不错，以后就是我的了&amp;rdquo;，再感受一下评论的画风。   &lt;br /&gt;
&lt;img src=&#39;https://gi.weiyan.tech/2025/10/happy-pig-2.jpg&#39; width=720&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你这个看着没他那个开心。     &lt;/li&gt;
&lt;li&gt;瞧把孩子瘦的     &lt;/li&gt;
&lt;li&gt;饿了多久     &lt;/li&gt;
&lt;li&gt;像浪浪山出来的     &lt;/li&gt;
&lt;li&gt;被社会毒打啦😆     &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;鸟山明风格😍&amp;rdquo;，&amp;rdquo;有娇养的感觉&amp;rdquo;。        &lt;br /&gt;
&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/10/happy-pig-3.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;粉嫩版的~   &lt;br /&gt;
&lt;img src=&#34;https://gi.weiyan.tech/2025/10/happy-pig-pink.jpg&#34; width=720&gt;&lt;/p&gt;
&lt;p&gt;还有 AI 豆包风格版本的 —— 把野猪认成家猪了😂   &lt;br /&gt;
&lt;img src=&#34;https://gi.weiyan.tech/2025/10/doubao-happy-pig.jpg&#34; width=720&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;166&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-166/</link>
      <pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-166/</guid>
      
    </item>
    
    <item>
      <title>微信公众号当朋友圈</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;微信公众号年久没有更新，脑子里突然蹦出来的这么一个想法 —— 微信公众号能不能当朋友圈使用？仔细想一下，其实应该也是可以，但最大的区别应该在于微信公众号是所有人都能看，朋友圈只有好友能看。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;就归档来说，微信公众号查看以前的文章好像也没那么好用。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;165&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-165/</link>
      <pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-165/</guid>
      
    </item>
    
    <item>
      <title>今年的最后一个法定长假</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;籍此纪念一下 2025 年刚刚过去的最后一个法定长假，也是给这八天的中秋国庆长假作个记录。   &lt;br /&gt;
&lt;img alt=&#34;今年的最后一个法定长假&#34; src=&#34;https://gi.weiyan.tech/2025/10/last-holiday.jpg&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;念&#34;&gt;念&lt;a class=&#34;headerlink&#34; href=&#34;#念&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自6月1日端午节与儿童节不期而遇，开启三天小长假以来，便开始满心期盼着今年的中秋国庆黄金周。整整三个月，期待与日俱增，几乎到了望眼欲穿的地步。一方面，长期工作的压力如暗流般长久涌动、不断堆积，身心仿佛被无形的绳索紧紧束缚，急切地渴望一处能让灵魂栖息、压力消散的港湾，去尽情释放与放松；另一方面，故乡的山水、故人的音容，宛如一幅幅温暖而鲜活的画卷，时常在心间浮现，对家乡人和物的思念，如藤蔓般在心底肆意生长，缠绕不休。&lt;/p&gt;
&lt;h2 id=&#34;堵&#34;&gt;堵&lt;a class=&#34;headerlink&#34; href=&#34;#堵&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;堵&amp;rdquo;&lt;/strong&gt; 是每次来回老家无法避免的一个主题。从十月一下午 16 时动身出发到凌晨 1 点半到家，将近 11 个小时的返程，为这个长假添上了一抹别样的况味。一路上，高速公路上的走走停停，服务区的车水马龙，仿佛是一场漫长的修行，每一寸的前进都显得那么艰难。车窗外，不断掠过的路灯，像是一串串被拉长的时光符号，记录着这无尽等待的时光。   &lt;br /&gt;
&lt;img alt=&#34;丹灶服务器&#34; src=&#34;https://gi.weiyan.tech/2025/10/danzao.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;也不得不感慨一番现如今交通的发达，打车的方便。从老家到老丈人家，从姐夫店里到距离老家最近的镇上，以往得提前好久安排交通工具，要么麻烦亲戚开车送，要么在路边苦等不知何时才来的乡村巴士。现在好了，顺风车一叫，约定好时间就能出发，而且价格实惠，直接把我们送到想去的地方，大大节省了时间和精力，体验感也极好。   &lt;br /&gt;
&lt;img alt=&#34;深夜·老家&#34; src=&#34;https://gi.weiyan.tech/2025/10/night-home.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;慢&#34;&gt;慢&lt;a class=&#34;headerlink&#34; href=&#34;#慢&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在老家待了三天，老丈人家待了两天，都深深感受到了农村生活慢节奏带来的舒适和宁静。没有城市里的喧嚣和浮躁，只有邻里家人之间简单而真实的交流，家长里短到国家大事，温暖且充实。&lt;/p&gt;
&lt;p&gt;难得的是，小孩子能在这里找到玩伴，忘却了作业的压力，在村里奔跑嬉戏，在水边捉鱼摸虾，在空地跳房子，逮个不知名小动物也能好奇玩上半天，还能玩上去年过年的烟花存货。   &lt;br /&gt;
&lt;img alt=&#34;空地跳房子&#34; src=&#34;https://gi.weiyan.tech/2025/10/children-playing.webp&#34; /&gt;     &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;去年的烟花存货&#34; src=&#34;https://gi.weiyan.tech/2025/10/fireworks.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;安&#34;&gt;安&lt;a class=&#34;headerlink&#34; href=&#34;#安&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;父母一辈年纪大了，习惯不了大城市的喧嚣和冰冷，反而能在邻里亲朋的老家找到慰藉，力所能及农活，虽然累点，但却能让他们觉得充实。&lt;/p&gt;
&lt;p&gt;城市，就像一个巨大而又冰冷的机器，日夜不停地运转着。父母在其中，就像两颗渺小的螺丝钉，被忙碌和喧嚣裹挟着，找不到自己的方向。高楼大厦遮住了他们的视线，车水马龙淹没了他们的声音，他们在这座繁华的城市里，内心充满了孤独和迷茫。而老家，却是他们心灵的港湾，是他们永远的根。当他们踏足这片熟悉的土地，闻着那熟悉的泥土气息，听着那亲切的乡音，邻里亲朋们的热情招呼，就像一束束温暖的阳光，照亮了他们内心深处的角落。&lt;/p&gt;
&lt;p&gt;祝愿所有的父母们能平安喜乐，健健康康。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;164&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-164/</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-164/</guid>
      
    </item>
    
    <item>
      <title>羽毛球拍</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;人到中年，能坚持下来的运行少之又少，唯有羽毛球还能一如既往没有放弃掉。回想当年大学还没毕业，出来实习后开始正式接触羽毛球，此间断断续续，一直到现在，真是弹指一瞬间。&lt;/p&gt;
&lt;p&gt;球打的多了，面对拍子按说早已经波澜不惊，但最近不知道怎么回事，又开始对装备这个事情念念不忘，走火入魔。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;手持一把&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view_6462.html&#34;&gt;亮剑 12N&lt;/a&gt; 和一把&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view_6902.html&#34;&gt;天斧 69&lt;/a&gt;，都是 3U。BS12N 在中前场平抽快杀以及防守个人还是很满意的，但是后场高远球和杀球感觉总差那么一点意思。ASTROX 69 虽然杀球尖，鞭击感明显，但在放网、劈吊以及搓球技术方面有所欠缺，且连续进攻的能力较弱，但是作为一个 ¥200 出头淘来的二手拍打了四五年也就那样了。&lt;/p&gt;
&lt;p&gt;于是，开始心念念新版的&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=19393&#34;&gt;天斧 88d Pro&lt;/a&gt;，4UG5，但却纠结于线下将近 ¥1900 的价格。
&lt;img alt=&#34;astrox-88dp&#34; src=&#34;https://gi.weiyan.tech/2025/09/astrox-88dp.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;为兴趣买单，早买早享受，会不会是一个极好的剁手理由！还有就是，任何人，想坚持打羽毛球，都，一定，且，必须，买一把千元球拍。&lt;/p&gt;
&lt;p&gt;时隔一个月后，终究还是 ¥1000 大洋从朋友手里入手了这把 4U G5 的&lt;a href=&#34;https://www.badmintoncn.com/cbo_eq/view.php?eid=14147&#34;&gt;天斧 77 Pro&lt;/a&gt;。     &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;astrox-77-pro&#34; src=&#34;https://gi.weiyan.tech/2025/10/astrox-77pro.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;来来回回使用这个拍子打了五六场球，渐入佳境，对自己而言还算满意。虽然一开始给我的感觉还是偏木，中杆太硬，但综合打感还不错，后场网前都能兼顾，也无震手感，对于 3U 拍子打久了的我来说，简直是福音，打的多了发现这个拍子更加适合那些比较有爆发力的小伙伴。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;163&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-163/</link>
      <pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-163/</guid>
      
    </item>
    
    <item>
      <title>桦加沙</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;作为 2025 年的风王，&amp;rdquo;桦加沙&amp;rdquo; 算是一定程度上满足了多年以来对台风的期待值 —— 2025 年第 18 号台风 &amp;ldquo;桦加沙&amp;rdquo; 来势汹汹，强度与 2018 年超强台风 &amp;ldquo;山竹&amp;rdquo; 相当，或成为今年以来影响我国的最强台风。&lt;/p&gt;
&lt;p&gt;台风没来之前，朋友圈的热闹，各种严阵以待的信息，超市抢购一空的景象，让人对这个号称今年最强风王的期待拉满，既担心又激动。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;对 2018 年超强台风 &amp;ldquo;山竹&amp;rdquo; 的印象比较浅，唯一的印象仅剩下当时个人租住的公寓中，在大风中砰砰乱响的的落地玻璃。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;桦加沙&amp;rdquo; 的影响更加直接。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提前两天，晚上将近 21 点多才收到停课通知，大晚上急急忙忙联系托管，确不曾想第二天风平浪静，艳阳高照。&lt;/li&gt;
&lt;li&gt;公司层面做足了措施，下班前把服务器关停了。&lt;/li&gt;
&lt;li&gt;下班后才收到确认公司停工的通知，具体复工时间未定。&lt;/li&gt;
&lt;li&gt;回到家，看到朋友圈热闹非凡，超市蔬菜鲜肉抢购一空。&lt;/li&gt;
&lt;li&gt;停工当天，想给老婆打车发现滴滴、哈罗、高德地图一众平台都无法打车了，恰好一大早老婆的公司也发布了停工通知。&lt;/li&gt;
&lt;li&gt;虽然停工，还是被上班日的生物钟搞醒，7点就起来了，窗外狂风日渐大作。&lt;/li&gt;
&lt;li&gt;游戏，帮孩子打卡学习，安装两个新买的书柜，看看电视，一天就这样过去了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;复工后的第一天，服务器还是出现了一些意外，给原本紧凑的工作更添了一丝阴霾，所幸的是最后还是有惊无险成功修复了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;162&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-162/</link>
      <pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-162/</guid>
      
    </item>
    
    <item>
      <title>GitHub Notifications 无法清除或标记为已读</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;GitHub 使用多了，最近总是遇到一些奇奇怪怪的问题。这不，今天又遇到了一个 Notifications 无法清除或标记为已读的神奇问题。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;github-notifications&#34; src=&#34;https://gi.weiyan.tech/2025/09/github-notifications.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;这个问题，在 &lt;a href=&#34;https://github.com/orgs/community/discussions/174310&#34;&gt;https://github.com/orgs/community/discussions/174310&lt;/a&gt; 也有人遇到过，在 V2EX 也有相关的讨论 ——&lt;a href=&#34;https://www.v2ex.com/t/1161205&#34;&gt;《疑似 GitHub × Gitcoin 的骗局》&lt;/a&gt;，是这样子解释的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是 GitHub 上一个已知的边缘情况。当触发通知的仓库或用户被删除时，有时相关通知会“卡住”，无法清除或标记为已读。这是一个偶尔会发生的错误，尤其是在垃圾邮件或已删除的帐户中。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;GitHub 在这个讨论中给了四个方法：尝试将所有通知标记为已读、使用 GitHub 移动应用程序、等待 GitHub 维护、联系 GitHub 支持。都未能很好解决问题，反而是讨论中的其他用户提供了解决的方案，个人试了一下，的确可行。&lt;/p&gt;
&lt;p&gt;参考：《&lt;a href=&#34;https://gist.github.com/jeremystretch/2c09f76837fc5af787fe9ff7747ecf3f&#34;&gt;Mark GitHub notifications as read&lt;/a&gt;》
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;TOKEN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;&amp;lt;TOKEN&amp;gt;&#39;&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;s1&#34;&gt;&#39;Accept&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;application/vnd.github+json&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;s1&#34;&gt;&#39;Authorization&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TOKEN&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;s1&#34;&gt;&#39;X-Github-Api-Version&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;2022-11-28&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;notifications&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;https://api.github.com/notifications&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;notification&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;notifications&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notification&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;id&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notification&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;subject&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;title&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;https://api.github.com/notifications/threads/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notification&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;id&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;161&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-161/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-161/</guid>
      
    </item>
    
    <item>
      <title>把站点域名从 cc 换成 com 了</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 V2EX 看到《&lt;a href=&#34;https://v2ex.com/t/1159380&#34;&gt;请谨慎使用 .cc 域名作为产品域名， Google 提交 Sitemap 始终失败&lt;/a&gt;》的帖子，发现 cc 域名发布的文章 Google 收录好像的确不如必应，也认同目前 &lt;strong&gt;&amp;ldquo;com &amp;gt; net/org&amp;rdquo;&lt;/strong&gt; 的现状，想着 &lt;code&gt;weiyan.com&lt;/code&gt; 肯定没戏了，自己对 org 也没什么想法，com 空着也是空着，于是，就把 &lt;code&gt;weiyan.cc&lt;/code&gt; 换成了 &lt;code&gt;shenwy.com&lt;/code&gt;。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;好了，现在个人的站点通过 &lt;a href=&#34;https://shenwy.com&#34;&gt;&lt;strong&gt;https://shenwy.com&lt;/strong&gt;&lt;/a&gt; 也能正常访问了。在站点主题上，&lt;strong&gt;&amp;ldquo;mkdocs-material&amp;rdquo;&lt;/strong&gt; 依然是目前的首选！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;160&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-160/</link>
      <pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-160/</guid>
      
    </item>
    
    <item>
      <title>一次发生在 GitHub 的 Trigger security scan 异常事件</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2025年9月4日，早上起来看邮件时候，突然发现，邮箱一下子多了几百封 GitHub Actions 构建异常的邮件！&lt;/p&gt;
&lt;p&gt;震惊紧张后，第一个反应就是，该不会是个人的 personal access token，或者密码泄露了，被人动态进行 commit 提交，以至于出现批量的 Actions 异常。于是，赶紧登录 GitHub 看一下到底发生了什么事。&lt;/p&gt;
&lt;p&gt;首先，看到个人账号下基本每个 Public 仓库，甚至包括 organization 下个人创建的所有 Public 仓库，都出现了类似 &lt;strong&gt;&amp;ldquo;Trigger security scan&amp;rdquo;&lt;/strong&gt; 的 commits 提交。
&lt;img alt=&#34;trigger-security-scan&#34; src=&#34;https://gi.weiyan.tech/2025/09/trigger-security-scan.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;点击进去一看，好家伙，直接往 README 里面进行注释性的提交。
&lt;img alt=&#34;commit-change-readme&#34; src=&#34;https://gi.weiyan.tech/2025/09/commit-change-readme.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;再回到 commits 记录一看，果然有连续多次的提交。
&lt;img alt=&#34;commits-20250902&#34; src=&#34;https://gi.weiyan.tech/2025/09/commits-20250902.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第二，回去仓库的 &lt;code&gt;.github/workflows&lt;/code&gt; 下一看，还莫名其妙多了一个 &lt;code&gt;github_actions_security.yml&lt;/code&gt; 自动化流程。
&lt;img alt=&#34;github-actions-security&#34; src=&#34;https://gi.weiyan.tech/2025/09/github-actions-security.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;github-actions-security-yaml&#34; src=&#34;https://gi.weiyan.tech/2025/09/github-actions-security-yaml.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这就直接把 &lt;code&gt;PERSONAL_ACCESS_TOKEN&lt;/code&gt; 的信息提交到了一个 &lt;code&gt;https://bold-dhawan.45-139-104-115.plesk.page&lt;/code&gt; 的未知站点。
&lt;img alt=&#34;bold-dhawan-45-139-104-115-plesk-page&#34; src=&#34;https://gi.weiyan.tech/2025/09/plesk-page.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这一连串的骚操作下来，&lt;strong&gt;可以肯定的是 token 或者其他密码泄露，或者是某个共用的 actions 出问题了&lt;/strong&gt;，所以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一件事情，先把 personal access token 全部删除。&lt;/li&gt;
&lt;li&gt;清除所有仓库已存在的 &lt;code&gt;github_actions_security.yml&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;最后，静观后效。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在文章最后，感谢 @guedou 在问题仓库中的建议。  &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;compromised-token&#34; src=&#34;https://gi.weiyan.tech/2025/09/compromised-token.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;159&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-159/</link>
      <pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-159/</guid>
      
    </item>
    
    <item>
      <title>GitHub 2FA 双因素身份验证浏览器插件</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 GitHub 贡献一定的代码量后，GitHub 会要求启用双因素身份验证，否则登录会受到影响。GitHub 提供了短信验证（&lt;strong&gt;SMS/Text message&lt;/strong&gt;，但是不支持 +86 国内手机号），APP 扫码验证（&lt;strong&gt;Authenticator app&lt;/strong&gt;），GitHub 移动 APP（&lt;strong&gt;GitHub Mobile&lt;/strong&gt;），&lt;strong&gt;Security keys&lt;/strong&gt;。    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2fa-github&#34; src=&#34;https://gi.weiyan.tech/2025/08/2fa-github.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果手机不在身边，想要在另外一台电脑登录自己的 GitHub 账号，这里推荐一种最简单的方式，就是用浏览器插件验证。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;安装插件&#34;&gt;安装插件&lt;a class=&#34;headerlink&#34; href=&#34;#安装插件&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Authenticator 可以直接去 &lt;a href=&#34;https://authenticator.cc/&#34;&gt;https://authenticator.cc/&lt;/a&gt; 下载包括 Chrome、Firefox、Edge 对应的插件，或者是&lt;a href=&#34;https://github.com/Authenticator-Extension/Authenticator&#34;&gt;源码&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome 插件：&lt;a href=&#34;https://chromewebstore.google.com/detail/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%99%A8/bhghoamapcdpbohphigoooaddinpkbai?hl=zh-CN&amp;amp;utm_source=ext_sidebar&#34;&gt;身份验证器&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;authentication-google&#34; src=&#34;https://gi.weiyan.tech/2025/08/authentication-google.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置-github-authenticator-app&#34;&gt;配置 GitHub Authenticator app&lt;a class=&#34;headerlink&#34; href=&#34;#配置-github-authenticator-app&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub 头像 → Settings → Password and authentication，在 Two-factor methods 栏点击 Authenticator app 的 Edit 按钮，会得到一个 2FA 的二维码。    &lt;br /&gt;
&lt;img alt=&#34;authenticator-app-edit&#34; src=&#34;https://gi.weiyan.tech/2025/08/authenticator-app-edit.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;身份验证器&#34;&gt;身份验证器&lt;a class=&#34;headerlink&#34; href=&#34;#身份验证器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;点击浏览器的 &amp;ldquo;身份验证器&amp;rdquo; 插件，点击扫描图标，扫描上一步 GitHub Authenticator app 页面中生成的二维码。   &lt;br /&gt;
&lt;img alt=&#34;authenticator-cc-scan&#34; src=&#34;https://gi.weiyan.tech/2025/08/authenticator-cc-scan.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;扫描后会自动生成6位数代码。   &lt;br /&gt;
&lt;img alt=&#34;github-2fa-authentication-number&#34; src=&#34;https://gi.weiyan.tech/2025/08/github-2fa-authentication-number.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这就是在 GitHub 登录账号时需要输入的 Two-factor authentication。   &lt;br /&gt;
&lt;img alt=&#34;github-two-factor-authentication&#34; src=&#34;https://gi.weiyan.tech/2025/08/github-two-factor-authentication.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;导出备份&#34;&gt;导出备份&lt;a class=&#34;headerlink&#34; href=&#34;#导出备份&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;点击浏览器的 &amp;ldquo;身份验证器&amp;rdquo; 插件，左上角设置图标 → 备份 → 下载备份文件，会得到一个 &lt;strong&gt;authenticator.txt&lt;/strong&gt; 的文件。   &lt;br /&gt;
&lt;img alt=&#34;authenticator-cc-download-backup&#34; src=&#34;https://gi.weiyan.tech/2025/08/authenticator-cc-download-backup.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;导入备份&#34;&gt;导入备份&lt;a class=&#34;headerlink&#34; href=&#34;#导入备份&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;登录另外一台电脑，同样先安装 &amp;ldquo;身份验证器&amp;rdquo; 插件，安装完成后导入上一步得到的 &lt;strong&gt;authenticator.txt&lt;/strong&gt;，即可在该电脑，即可得到该电脑自动生成6位数 Two-factor authentication 代码，从而完成 GitHub 账号登录。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;158&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-158/</link>
      <pubDate>Wed, 27 Aug 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-158/</guid>
      
    </item>
    
    <item>
      <title>这个夏天</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2025 年，立夏是 5 月 5 日。这一天是二十四节气中的第七个节气，标志着春季的结束和夏季的开始。立夏表示阳气开始旺盛，万物进入快速生长期的开始，昼长夜短，气温升高，雷雨增多，是温度明显升高，炎暑将临的节气。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;工作只是生活的一部分&#34;&gt;工作只是生活的一部分&lt;a class=&#34;headerlink&#34; href=&#34;#工作只是生活的一部分&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从端午过后的六月开始，先是工作遇上了一大堆的变动，不管是工作内容还是其他上层为了应对降本增效带来的一系列迷之操作，给原有的工作带来了很大的困扰。每天的工作开始精神内耗，再加上自己本身是一个事情会想的比较多的人，导致了这几个月以来工作都过得很压抑，很纠结。&lt;/p&gt;
&lt;p&gt;很多悲观的情绪不是好事，时时刻刻跟自己说，工作是人生一部份，但绝不是全部！不是真的要尽全力，不要入戏太深，不要让自己落入情绪陷阱！&lt;/p&gt;
&lt;h2 id=&#34;打不死的小强&#34;&gt;打不死的小强&lt;a class=&#34;headerlink&#34; href=&#34;#打不死的小强&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025 年上半年的工作非得要说收获，只能说自己在 AI，尤其 RAG 这一块多了一分熟悉，从技术路线到在极其有限的云服务器上手动实践，漫漫长征有了第一步，在 AI 领域的投入或许是个人职业生涯的第二次重大转变，也是一次学习的机会，没有放弃，需要鼓起勇气撸起袖子加油干。&lt;/p&gt;
&lt;h2 id=&#34;认清生活的真相后依然热爱生活&#34;&gt;认清生活的真相后依然热爱生活&lt;a class=&#34;headerlink&#34; href=&#34;#认清生活的真相后依然热爱生活&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;其次是七月初老母亲突如其来的生病，让原本按部就班的日子一下子变的紧凑起来。一方面担心老母亲的病情，另一方面为下班后的孩子接送学习事宜忙碌。&lt;/p&gt;
&lt;p&gt;7 月中老母亲病情加剧 —— 于是辗转几十公里的市人民医院疼痛科前前后后看了三次，终于有所缓解，后续还需多加修养。现如今的老家地处边远山区，只有镇上一个卫生站，虽然也还有不少私人诊所，医疗条件终归有限，市里有更好的三甲医院却又路途遥远，农村慢节奏的生活下医疗保障始终是一个挑战。&lt;/p&gt;
&lt;p&gt;现如今的大环境下，子女不能常伴身边，农村独居老人也成了一种常态。回想起我们的父辈，他们经历了从农村到城市到最终回归农村，经历了农村从曾经热闹安详到现如今的冷落凋零，他们吃过的苦也非我们 90 一代所能体会得到的。历史的大幕褪去，现在只剩下他们佝偻的身影，还在曾经熟悉的土地上坚守着。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;157&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-157/</link>
      <pubDate>Thu, 14 Aug 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-157/</guid>
      
    </item>
    
    <item>
      <title>Dify 上的 Ollama 不支持 Rerank 模型</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 Dify Cloud 平台调用各大平台的大模型 API 一直都没发现这个问题，随着开始折腾本地化使用，才发现 Ollama 部署大模型虽然方便，但是 RAG 中 Dify 知识库混合检索，需要 Rerank 模型时，这一点上，Ollama 居然是不支持 Rerank 模型的。   &lt;br /&gt;
&lt;img alt=&#34;rag-pipelines&#34; src=&#34;https://gi.weiyan.tech/2025/07/rag-pipelines.webp&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Dify Cloud 的系统模型设置，在接入了阿里云百炼的通义千问 API Key 后，Rerank 模型会默认显示通义千问的 &lt;code&gt;gte-rerank&lt;/code&gt; 和 &lt;code&gt;gte-rerank-v2&lt;/code&gt;。
&lt;img alt=&#34;dify-cloud-rerank&#34; src=&#34;https://gi.weiyan.tech/2025/07/dify-cloud-rerank.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;本地部署 Ollama + Dify，在 Dify 选择 Ollama 模型供应商，发现 Ollama 只支持 LLM 和 Text Embedding，不支持 Rerank 模型。
&lt;img alt=&#34;dify-local-ollama-models&#34; src=&#34;https://gi.weiyan.tech/2025/07/dify-local-ollama-models.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;看到有提到使用 Xinference 平台来部署 Rerank 模型的，特意去看了一下 Xorbits Inference，发现的确是除了 LLM 和 Text Embedding 还支持 Rerank、Speech2text、TTS。
&lt;img alt=&#34;dify-xorbits-inference&#34; src=&#34;https://gi.weiyan.tech/2025/07/dify-xorbits-inference.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/719782211&#34;&gt;安装 Dify 并集成 Ollama 和 Xinference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/langgenius/dify/issues/10917&#34;&gt;&lt;strong&gt;add Ollama rerank model&lt;/strong&gt; - langgenius/dify#10917&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;156&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-156/</link>
      <pubDate>Tue, 15 Jul 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-156/</guid>
      
    </item>
    
    <item>
      <title>NCBI Blast 源码编译安装</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;记录一下在老破旧服务器从源码编译安装 NCBI Blast 2.15.0+ 遇到的一些问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;Basic-Local-Alignment-Search-Tool&#34; src=&#34;https://gi.weiyan.tech/2025/07/ncbi-blast.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;先说一下，总体的安装步骤。&lt;/p&gt;
&lt;p&gt;首先，根据 &lt;code&gt;ncbi-blast-2.xx.x+-src/c++/src/algo/blast/core/README&lt;/code&gt; 的说明，blast+ 的源码编译安装，直接通过下面命令即可：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-projects&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;scripts/projects/blast_core_lib.lst&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;--without-debug&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-mt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-build-root&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ReleaseMT
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ReleaseMT/build
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all_p
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;其实 &lt;code&gt;configure&lt;/code&gt; 这一步的最后也会有提示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-projects&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;scripts/projects/blast_core_lib.lst&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;--without-debug&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-mt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-build-root&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ReleaseMT&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;===============================================================================&lt;/span&gt;
NCBI&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;C++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Toolkit&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;documentation:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Online:&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;https://www.ncbi.nlm.nih.gov/toolkit/doc/book/
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Local:&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;./doc/public/index.html
For&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configuration&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;flags&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help

&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-Wall&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Wno-format-y2k&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-pthread&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fopenmp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-O2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fPIC
&lt;span class=&#34;nv&#34;&gt;CXXFLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-Wall&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Wno-format-y2k&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-pthread&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fopenmp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-O2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fPIC
&lt;span class=&#34;nv&#34;&gt;CPPFLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-DNDEBUG&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D_LARGEFILE_SOURCE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D_FILE_OFFSET_BITS&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D_LARGEFILE64_SOURCE&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;-D_MT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D_REENTRANT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D_THREAD_SAFE
&lt;span class=&#34;nv&#34;&gt;LDFLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-Wl,--enable-new-dtags&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Wl,-export-dynamic&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-pthread&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fopenmp&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;-O2

LIBRARIES:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;static&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;default
FEATURES:&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;Int8GI&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GCC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LFS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;DLL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unix&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;WinMain&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Linux
PACKAGES:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;enabled:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;UUID&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Iconv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BZ2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PCRE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalPCRE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MBEDTLS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GMP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GMP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OPENSSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;KRB5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CURL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MySQL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BerkeleyDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BerkeleyDB++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PYTHON&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PYTHON27&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PYTHON3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PERL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Iostreams&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Program-Options&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Regex&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Serialization&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Spirit&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Test.Included&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OpenGL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GLUT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GLEW&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;EXPAT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBXML&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBXSLT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBEXSLT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SQLITE3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;HDF5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;JPEG&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PNG&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;TIFF&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;XPM&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FreeType&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LMDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalLMDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBUV
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;disabled:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FUSE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBUNWIND&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBDW&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BACKWARD_CPP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalZ&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalBZ2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LZO&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ZSTD&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GCRYPT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NETTLE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GNUTLS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Sybase&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;DBLib&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FreeTDS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ODBC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PYTHON25&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PYTHON26&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Chrono&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Filesystem&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.System&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Test&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Boost.Thread&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;C-Toolkit&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NCBICRYPT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MESA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wxWidgets&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wx2.8&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Fast-CGI&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FASTCGIPP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalSSS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalMSGMAIL2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SSSUTILS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LocalNCBILS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NCBILS2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SSSDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ORBacus&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ICU&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SABLOT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Xerces&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Xalan&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Zorba&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SQLITE3ASYNC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;VDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NGS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OECHEM&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SGE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;DRMAA2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MUPARSER&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GIF&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;UNGIF&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GL2PS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FTGL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MAGIC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MIMETIC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GSOAP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;AVRO&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Cereal&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SASL2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MONGODB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MONGODB3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LEVELDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBURING&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ROCKSDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GMOCK&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LAPACK&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBSSH2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CASSANDRA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NGHTTP2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;H2O&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INFLUXDB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBXLSXWRITER&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PROTOBUF&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GRPC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MSGSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;AWS_SDK&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CRC32C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GOOGLE_CLOUD&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;HIREDIS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;APACHE_ARROW&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;LIBRDKAFKA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CPPKAFKA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;THRIFT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NLohmann_JSON&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YAML_CPP&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OPENTRACING&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;JAEGER
PROJECTS:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;enabled:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;cgi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;serial&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;objects&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dbapi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;app&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;algo
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;disabled:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bdb&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ctools&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;gui&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;gbench

Tools&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;flags&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;paths:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;/software/src/build/ncbi-blast-2.16.0+-src/c++/ReleaseMT/build/Makefile.mk
Configuration&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;header:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;/software/src/build/ncbi-blast-2.15.0+-src/c++/ReleaseMT/inc/ncbiconf_unix.h

To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;everything:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/software/src/build/ncbi-blast-2.15.0+-src/c++/ReleaseMT/build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/root/usr/bin/make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all_r
or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;simply&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/root/usr/bin/make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;current&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory
To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;selected&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;projects&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;listed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;scripts/projects/blast_core_lib.lst&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/software/src/build/ncbi-blast-2.15.0+-src/c++/ReleaseMT/build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/root/usr/bin/make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all_p

*******&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CONFIGURATION&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SUCCESSFUL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;*******
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;梳理一下它整个步骤，其实就是 &lt;strong&gt;&lt;code&gt;configure&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;生成 &lt;code&gt;Makefile.mk&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;make&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;makefilemk&#34;&gt;Makefile.mk&lt;a class=&#34;headerlink&#34; href=&#34;#makefilemk&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;很不幸的是，个人在 CentOS 6.5 的老破旧服务器上执行 &lt;code&gt;configure&lt;/code&gt; 或者 &lt;code&gt;make&lt;/code&gt; 出现了 &lt;code&gt;Makefile.mk:682: *** missing separator.  Stop.&lt;/code&gt; 的异常。&lt;/p&gt;
&lt;p&gt;对于这个突如其来的错误，本人最开始也想当然的认为这是 &lt;code&gt;Makefile&lt;/code&gt; 语法的一个BUG，很明显 Makefile 中命令的前缀默认要使用 Tab, 不能使用 4 个空格代替，因此需要在 &lt;code&gt;Makefile.mk&lt;/code&gt; 682 行开始用 Tab 替换四个空格开头的行。&lt;/p&gt;
&lt;p&gt;事实上，这个问题的根本原因并非单纯的 &lt;code&gt;Makefile&lt;/code&gt; 语法的问题，而是问题出现在 &lt;strong&gt;&lt;code&gt;configure&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;生成 &lt;code&gt;Makefile.mk&lt;/code&gt;&lt;/strong&gt; 这一步。经过对 &lt;strong&gt;&lt;code&gt;configure&lt;/code&gt;&lt;/strong&gt; 源码排查了一下发现，问题就出在 &lt;code&gt;curl-config --static-libs&lt;/code&gt; 的错误输出被直接插入到了 &lt;code&gt;Makefile&lt;/code&gt; 中，导致 &lt;code&gt;make&lt;/code&gt; 误解析这些文本（如 &lt;code&gt;--ca&lt;/code&gt;, &lt;code&gt;--cc&lt;/code&gt; 等）为 &lt;code&gt;Makefile&lt;/code&gt; 规则，从而引发 &lt;code&gt;missing separator&lt;/code&gt; 和 &lt;code&gt;ignoring old recipe&lt;/code&gt; 错误。
&lt;img alt=&#34;blast-curl-config&#34; src=&#34;https://gi.weiyan.tech/2025/07/blast-curl-config.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;因此，有几个解决方法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;方法1，修改 &lt;code&gt;Makefile.mk&lt;/code&gt;，确保正确处理 &lt;code&gt;curl-config&lt;/code&gt; 的输出。例如：
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# 安全获取静态库链接信息（避免错误输出污染 Makefile）
CURL_STATIC_LIBS := $(shell curl-config --static-libs 2&amp;gt;/dev/null || echo &#34;-lcurl&#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法2：如果系统支持 &lt;code&gt;pkg-config&lt;/code&gt;，可以改用更可靠的方式获取 &lt;code&gt;libcurl&lt;/code&gt; 链接信息。
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CURL_LIBS&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pkg-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--libs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libcurl&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
CURL_STATIC_LIBS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pkg-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--static&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--libs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libcurl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&amp;gt;/dev/null&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-lcurl&#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;方法3：在 &lt;code&gt;configure&lt;/code&gt; 一步中通过 &lt;code&gt;--without-curl&lt;/code&gt; 来禁用 &lt;code&gt;libcurl&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;zlib_ver_major&#34;&gt;ZLIB_VER_MAJOR&lt;a class=&#34;headerlink&#34; href=&#34;#zlib_ver_major&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;make&lt;/code&gt; 过程中出现 &lt;code&gt;ZLIB_VER_MAJOR&lt;/code&gt; 相关错误：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all_r
Build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;session&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ID:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;37264a70-80c7-4bfb-857e-3fcc536c2046
/opt/rh/devtoolset-7/root/usr/bin/make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;corelib&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;all_r&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
......
/opt/rh/devtoolset-7/root/usr/bin/make&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Makefile.compress.lib&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Nothing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;be&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;flag-stamps&lt;span class=&#34;s1&#34;&gt;&#39;.&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/opt/rh/devtoolset-7/root/usr/bin/make -f /software/ncbi-blast-2.16.0+/build/Makefile.lib.tmpl srcdir=/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api TMPL=compress -w all&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[4]: Entering directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress/api&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/opt/rh/devtoolset-7/root/usr/bin/g++  -std=gnu++17 -msse4.2 -c  -Wall -Wno-format-y2k  -pthread -fopenmp -O2 -fPIC   -DNDEBUG -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE   -D_MT -D_REENTRANT -D_THREAD_SAFE -I/software/ncbi-blast-2.16.0+/inc -I/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/include      -DNCBI_BUILD_SESSION_ID=37264a70-80c7-4bfb-857e-3fcc536c2046 /software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp -o zlib.o&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp: In member function ‘virtual ncbi::CVersionInfo ncbi::CZipCompression::GetVersion() const’:&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:25: error: ‘ZLIB_VER_MAJOR’ was not declared in this scope&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                         ^~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:25: note: suggested alternative: ‘ZLIB_VERSION’&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                         ^~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                         ZLIB_VERSION&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:41: error: ‘ZLIB_VER_MINOR’ was not declared in this scope&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                         ^~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:41: note: suggested alternative: ‘ZLIB_VERSION’&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                         ^~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                         ZLIB_VERSION&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:57: error: ‘ZLIB_VER_REVISION’ was not declared in this scope&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                                         ^~~~~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/util/compress/api/zlib.cpp:333:57: note: suggested alternative: ‘ZLIB_VERSION’&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;     return CVersionInfo(ZLIB_VER_MAJOR, ZLIB_VER_MINOR, ZLIB_VER_REVISION, &#34;zlib&#34;);&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                                         ^~~~~~~~~~~~~~~~~&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;                                                         ZLIB_VERSION&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[4]: *** [/software/ncbi-blast-2.16.0+/build/Makefile.rules:103: zlib.o] Error 1&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[4]: Leaving directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress/api&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;FAILED: src/util/compress/api/Makefile.compress.lib&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[4]: Entering directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress/api&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/bin/rm -f libxcompress.a .xcompress.dep .libxcompress.a.stamp&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;/bin/rm -f /software/ncbi-blast-2.16.0+/lib/libxcompress.a /software/ncbi-blast-2.16.0+/status/.xcompress.dep \&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;    /software/ncbi-blast-2.16.0+/lib/libxcompress-static.a /software/ncbi-blast-2.16.0+/status/.xcompress-static.dep&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[4]: Leaving directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress/api&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[3]: *** [/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/build-system/Makefile.meta_l:336: all.nonusr] Error 2&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[3]: Leaving directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress/api&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[2]: *** [/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/build-system/Makefile.meta_r:41: all_r.real] Error 5&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[2]: Leaving directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util/compress&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[1]: *** [/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/build-system/Makefile.meta_r:41: all_r.real] Error 5&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;make[1]: Leaving directory &#39;&lt;/span&gt;/software/ncbi-blast-2.16.0+/build/util&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;
make:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;***&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;/software/ncbi-blast-2.16.0+/src/ncbi-blast-2.16.0+-src/c++/src/build-system/Makefile.meta_r:41:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all_r.real&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;最后，想说的是，以上扒拉扒拉折腾了那么多，到最后还是没能完整安装起来，只好先放弃了，后面有时间再慢慢去 debug 看看吧。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;155&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-155/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-155/</guid>
      
    </item>
    
    <item>
      <title>带着女儿泡星巴克</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;外面将近 40 度的似火艳阳把我们的户外活动彻底给劝退了，今天尝试着带女儿过来家里旁边的星巴克，她在画画做练习题，我在忙自己的一些事情，看起来也算是一个挺好的选择。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;starbucks-20250705&#34; src=&#34;https://gi.weiyan.tech/2025/07/starbucks-20250705.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;虽然有空调的舒适，但小孩子好动，想着应该也呆不了太长时间，但出乎意外的是她居然可以很专注沉浸在自己的玩具时间。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;154&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-154/</link>
      <pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-154/</guid>
      
    </item>
    
    <item>
      <title>热爱生活</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;世界上只有一种真正的英雄主义，那就是在认清生活的真相后依然热爱生活。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;p&gt;前一阵子的一个经历。&lt;/p&gt;
&lt;p&gt;晚上跟一众同事打完球，打车回家的路上，碰到一个很有意思的司机，一路上听着他分享了从 90 年代上大学，进国企，下岗，开公司，前几年公司注销的诸多经历，谈到当下社区大众迷茫，裹挟着压力前行，心中很是感慨。&lt;/p&gt;
&lt;p&gt;对于压力这个问题，近两年感触很深。大环境下的各行各业总有种越卷越烈的感觉，很多公司企业订单腰斩，于是开始内卷，卡各种考核卡各种日报周报月报，卡的让人喘不过气。消费上大家日益谨慎，除了必要的吃喝拉撒，娱乐旅游什么的也越来越提不起兴趣。那种说走就走的旅程，也因为挤不出时间变成了时常挂载嘴边的自我安慰。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hello-man&#34; src=&#34;https://gi.weiyan.tech/2025/07/hello-man.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;心态这个问题，很多时候都充斥着焦虑，打球、游戏、徒步或许都能暂缓，但也正如 &amp;ldquo;世界上只有一种真正的英雄主义，那就是在认清生活的真相后依然热爱生活&amp;rdquo; 中所说，需要更多积极的勇气。&lt;/p&gt;
&lt;p&gt;抱怨没用，需要给自己信心，需要努力，需要在认清生活的真相后依然热爱生活。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;153&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-153/</link>
      <pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-153/</guid>
      
    </item>
    
    <item>
      <title>这些年打过的羽毛球线</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/好玩&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打羽毛球这么多年，用过的羽毛球线也就那么几款，从最开始的 NBG95 到现在的 BG80，感觉差不多就认准了 BG80。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;性能维度&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;80线（BG80）&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;80P线（BG80P）&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;95线（NBG95）&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;弹性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;极致弹性，蓄力强，扣杀球速快&lt;/td&gt;
&lt;td&gt;弹性优异，略优于80线&lt;/td&gt;
&lt;td&gt;弹性良好，平衡性佳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;击球感&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;硬朗，进攻性强&lt;/td&gt;
&lt;td&gt;硬中带弹，控球精准&lt;/td&gt;
&lt;td&gt;软硬适中，全面均衡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;耐打性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;耐用性一般，易断线&lt;/td&gt;
&lt;td&gt;耐磨性提升约20%（聚氨酯涂层）&lt;/td&gt;
&lt;td&gt;耐打性优秀，适合高频使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;控球性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;包裹性强，但易走线&lt;/td&gt;
&lt;td&gt;棱形线芯设计，控球稳定&lt;/td&gt;
&lt;td&gt;平衡性佳，易培养手感&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;适用磅数&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;26-28磅（建议）&lt;/td&gt;
&lt;td&gt;26-30磅（可调）&lt;/td&gt;
&lt;td&gt;24-28磅（通用）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt=&#34;brave-sword-12n&#34; src=&#34;https://gi.weiyan.tech/2025/06/brave-sword-12n.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;拿到这把亮剑 12N 的时候也用过一段时间 XB63 线，虽然感觉比 80 线更舒服，但总体来说 BG80 性价比更高，XB63 相对价格更高而且也也一定能买得到。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;152&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-152/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-152/</guid>
      
    </item>
    
    <item>
      <title>端午节难看龙舟</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/乱弹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今年的端午节和六一儿童节叠在一起了，但是看龙舟却比往年更难，不只是人多，更多是龙舟排期更加分散。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;端午假期的第一天就去了海珠区的国家湿地公园，公园是极好的，很多荔枝、菠萝蜜、黄皮，还是一堆叫不上名字的水果，环境很好，还能看到一大片叫不出名字的花海。从龙潭地铁站 G 出口出来步行一小段就到了海珠湿地的北门，20 块买个门票进去，就可以开启湿地公园之旅。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/20250531-1.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/20250531-3.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/20250531-4.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/20250531-boat.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;除了人多，更遗憾的是没看上在爱莲亭举行的龙舟赛，一早蹲守的小伙伴说整个龙舟赛也就持续了 2 分钟左右，还目睹了亚洲飞人苏炳添参加划龙舟的风采。&lt;/p&gt;
&lt;p&gt;不死心。&lt;/p&gt;
&lt;p&gt;第二天，再接再厉，约了 4、5 个娃拖家带口浩浩荡荡往中大北门广场进发，开始第二波看龙舟之旅。没想到被现场人山人海，人头挤人头的场面给狠狠打脸了，费劲九牛二虎之力好不容易挤了进去，连个站的位置都没有。化身人肉梯子抱起娃看了不到十分钟，就跟着大部队匆匆忙忙败兴而归。&lt;/p&gt;
&lt;p&gt;没看上龙舟，看到海珠区老城区一些烟火气息的小巷，看到了补鞋的、补衣服的、小菜市场、小商贩等等，现在高楼大厦和过去传统融合在一起，有种很神奇的感觉。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/dragon-boat-3.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/dragon-boat-1.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://gi.weiyan.tech/2025/06/dragon-boat-2.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;151&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-151/</link>
      <pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-151/</guid>
      
    </item>
    
    <item>
      <title>域名证书端口转发网络存储一站式解决</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;IPv6/IPv4 端口转发、Web 服务、动态域名、语音助手网络唤醒、IPv4 内网穿透、计划任务、自动证书、webdav、ftp、filebrowser、挂载阿里云盘/webdav 等多项功能。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;p&gt;使用 &lt;a href=&#34;https://github.com/shenweiyan/Digital-Garden/discussions&#34;&gt;GitHub Discussios&lt;/a&gt; 写作&lt;a href=&#34;https://weiyan.cc/&#34;&gt;博客&lt;/a&gt;一直都有一个很大的痛点就是图床的问题，没有接触 Lucky 的 &lt;strong&gt;&amp;ldquo;网络存储&amp;rdquo;&lt;/strong&gt; 功能前，个人一直在用自搭建的 &lt;a href=&#34;https://github.com/XPoet/picx/tree/v2&#34;&gt;PicX v2&lt;/a&gt; —— 这个方案有一个比较纠结的点：每次上传图片都要触发一次 pages 自动构建，这中间的耗时有点让人受不了。第二个问题是无法自动新创建目录。&lt;/p&gt;
&lt;p&gt;今天来介绍一个好玩的应用：&lt;a href=&#34;https://github.com/gdy666/lucky&#34;&gt;&lt;strong&gt;Lucky&lt;/strong&gt;&lt;/a&gt; —— 一个集合了端口转发、Web 服务、自动证书、WebDAV、FTP 和 FileBrowser 模块等功能的家用软硬路由公网利器。个人在阿里云 99 元/年 2 核 2G 配置的阿里云服务器上用了几个月，体验相当不错。&lt;/p&gt;
&lt;h2 id=&#34;自动证书&#34;&gt;自动证书&lt;a class=&#34;headerlink&#34; href=&#34;#自动证书&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;阿里云、腾讯云各大平台免费 SSL 证书的有效期都调整到 3 个月，及时续签是个问题。Lucky 的 ACME 证书默认启用全自动续签机制，无须人工干预。    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;lucky-ssl-tls&#34; src=&#34;https://gi.weiyan.tech/2025/05/lucky-ssl-tls.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;web-服务&#34;&gt;Web 服务&lt;a class=&#34;headerlink&#34; href=&#34;#web-服务&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cloudflare 对每个托管的域名都有 3 个免费页面规则，例如，通过这个页面规则可以实现 &lt;a href=&#34;https://weiyan.tech&#34;&gt;https://weiyan.tech&lt;/a&gt; 跳转到 &lt;a href=&#34;https://github.com&#34;&gt;https://github.com&lt;/a&gt; 或者 &lt;a href=&#34;https://baidu.com&#34;&gt;https://baidu.com&lt;/a&gt; 任何一个你想要的域名。当然这种跳转通过 &lt;a href=&#34;https://weiyan.cc/blog/discussions-33/&#34;&gt;《使用 meta 实现页面的定时刷新或跳转》&lt;/a&gt; 也可以实现。&lt;/p&gt;
&lt;p&gt;但是这一切在 Lucky 的 Web 服务都是免费一键化配置，再配合上面的自动化证书，可以做很多好玩的事情。    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;lucky-web-sub-rule&#34; src=&#34;https://gi.weiyan.tech/2025/05/lucky-web-sub-rule.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;网络存储&#34;&gt;网络存储&lt;a class=&#34;headerlink&#34; href=&#34;#网络存储&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是最近个人才摸索到的另外一个好玩的用法。基本上可以让我把自搭建的 &lt;a href=&#34;https://github.com/XPoet/picx/tree/v2&#34;&gt;PicX v2&lt;/a&gt; 抛弃了。&lt;/p&gt;
&lt;p&gt;网络存储包含了&lt;strong&gt;存储管理&lt;/strong&gt;、&lt;strong&gt;WebDAV&lt;/strong&gt;、&lt;strong&gt;FTP&lt;/strong&gt; 和 &lt;strong&gt;FileBrowser&lt;/strong&gt; 模块，它提供了将本地存储、WebDAV 和阿里云盘挂载到 Lucky 内部的各个文件类服务功能。&lt;/p&gt;
&lt;p&gt;个人在阿里云 99 元/年的阿里云服务器上，开启 File Browser 可以完美解决文件上传、下载、分享的问题。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;lucky-file-browser-login&#34; src=&#34;https://gi.weiyan.tech/2025/05/lucky-file-browser-login.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;lucky-file-browser&#34; src=&#34;https://gi.weiyan.tech/2025/05/lucky-file-browser.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;借助 Web 服务下的&lt;strong&gt;文件服务&lt;/strong&gt;，可以实现类似 Pages 的图床服务。
&lt;img alt=&#34;lucky-webdev&#34; src=&#34;https://gi.weiyan.tech/2025/05/lucky-webdev.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;说到图床的应用，网上一搜有很多，但是像 &lt;a href=&#34;https://github.com/Molunerfinn/PicGo&#34;&gt;PicGo&lt;/a&gt;、&lt;a href=&#34;https://github.com/Kuingsmile/PicList&#34;&gt;PicList&lt;/a&gt; 之类都没有提供 Web 端的管理使用，需要下载安装。个人的使用更加注重于是否提供浏览器 Web 端的操作管理，一定要避免切换电脑再次安装带来的繁琐，仅一个浏览器可以完成上传、下载、删除等一系列管理操作。其次，可以上传图片到指定的目录！&lt;/p&gt;
&lt;h2 id=&#34;其他功能&#34;&gt;其他功能&lt;a class=&#34;headerlink&#34; href=&#34;#其他功能&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lucky 的升级、备份、重新部署也是相当方便，只要备份好配置目录，一切都可以从头再来，基于 Docker 的安装大大降低了折腾的复杂性。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;150&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-150/</link>
      <pubDate>Mon, 26 May 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-150/</guid>
      
    </item>
    
    <item>
      <title>域名越来越贵了</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/乱弹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近的这几天在续费域名的时候，发现在阿里云 com 都涨到 95 一年了，cc 也涨到了 80，有种马上就要突破百元大关的感觉。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;domain-price&#34; src=&#34;https://gi.weiyan.tech/2025/05/domain-price.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;更离谱的是 cc 的普通域名，新购 10 年才 320，换成续费要 800，价格相差了 2 倍多。同样的 cc 域名在阿里云续费 80/年，腾讯云 65/年。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;aliyun-cc-domain&#34; src=&#34;https://gi.weiyan.tech/2025/05/aliyun-cc-domain.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;太魔幻了。&lt;/p&gt;
&lt;p&gt;蚊子再小也是肉，为了省那每年 15 块大洋，看来把我那个 WeiYan.CC 转到腾讯云也是不错。&lt;/p&gt;
&lt;p&gt;最后，手头有一个已注册长达 10 年的优质域名 &lt;strong&gt;bioinfo.top&lt;/strong&gt;（到期时间为 2034 年），现打算转让。价格十分实惠，对生物信息领域感兴趣的小伙伴们，欢迎咨询！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;149&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-149/</link>
      <pubDate>Thu, 08 May 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-149/</guid>
      
    </item>
    
    <item>
      <title>MkDocs Material 大法好</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/好玩&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自从用上了 MkDocs Material，除了可以用作专业的文档生成器，发现其实也可以干些其他的杂活，例如用它自定义一个更加有辨识度的 Homepage，用它搭建一个属于自己的导航站点。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Hugo 的 &lt;a href=&#34;https://github.com/navpage&#34;&gt;Navpage&lt;/a&gt; 导航虽然颜值上更舒服一些，但是和博客、站内搜索的集成依然有些割裂，自己对 Hugo 越来越缺乏学习的热情。另外一方面，反而更加热衷于在 &lt;a href=&#34;https://github.com/shenweiyan/Digital-Garden/discussions&#34;&gt;GitHub Discussions&lt;/a&gt; 持续记录自己的一些胡言乱语。&lt;/p&gt;
&lt;p&gt;感谢自己省吃俭用薅下来的 4 核 8G 小 VPS，几经折腾下，终于让 Homepage + Documents + Navigation 都集成在了一个 MkDocs Material 里面，先贴几张图，后面可能会开源，也可能会和 &lt;a href=&#34;https://github.com/navpage&#34;&gt;Navpage&lt;/a&gt; 整合在一起付费提供使用。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/04/home-pages.png&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;Homepage&lt;/span&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/04/get-start-pages.png&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;文档页面&lt;/span&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/04/docs-pages.png&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;文档页面 - 目录&lt;/span&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/04/blog-pages.png&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;博客页面&lt;/span&gt;
&lt;/p&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/04/navigation-pages.png&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;导航页面&lt;/span&gt;
&lt;/p&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;110&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-110/</link>
      <pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-110/</guid>
      
    </item>
    
    <item>
      <title>Vim 缩进插入删除使用技巧</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在服务器环境下，Vim 因其高效、轻量、无需图形界面的特性，确实是开发者最常用的代码编辑工具之一。针对 vim 使用过程中最常遇到的一些操作技巧简单记录一下。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;Vim-editor&#34; src=&#34;https://gi.weiyan.tech/2025/06/vim.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;多行缩进&#34;&gt;多行缩进&lt;a class=&#34;headerlink&#34; href=&#34;#多行缩进&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;没有学会使用技巧前，最常规的做法还是一行行的缩进，针对大片段的长代码简直就是灾难。&lt;/p&gt;
&lt;h3 id=&#34;向前或向后缩进4个空格&#34;&gt;向前或向后缩进4个空格&lt;a class=&#34;headerlink&#34; href=&#34;#向前或向后缩进4个空格&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;code&gt;shift + v&lt;/code&gt; 组合键进入 &lt;code&gt;Visual Line&lt;/code&gt; 模式，可使用方向键选择多行；&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;&amp;lt;&lt;/code&gt; 或 &lt;code&gt;&amp;gt;&lt;/code&gt;，进行向前或向后缩进。注：有些设置为缩进一个 &lt;code&gt;Tab&lt;/code&gt; 单位。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;向前或向后缩进n个空格&#34;&gt;向前或向后缩进n个空格&lt;a class=&#34;headerlink&#34; href=&#34;#向前或向后缩进n个空格&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;向前缩进，实则是使用 &lt;code&gt;Visual Block&lt;/code&gt; 模式删除多余空格以达到向前缩进的效果。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;code&gt;ctrl + v&lt;/code&gt; 组合键进入&lt;code&gt;Visual Block&lt;/code&gt;模式；&lt;/li&gt;
&lt;li&gt;使用上下方向键可选择多行，使用前后方向键可选择空格大小长度；&lt;/li&gt;
&lt;li&gt;按下 &lt;code&gt;d&lt;/code&gt; 删除选中内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;向后缩进，实则是使用 &lt;code&gt;Visual Block&lt;/code&gt; 模式批量添加空格以达到向后缩进的效果。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按&lt;code&gt;ctrl + v&lt;/code&gt;组合键进入&lt;code&gt;Visual Block&lt;/code&gt;模式；&lt;/li&gt;
&lt;li&gt;使用上下方向键可选择多行；&lt;/li&gt;
&lt;li&gt;按&lt;code&gt;shift + i&lt;/code&gt;组合键进入编辑模式；&lt;/li&gt;
&lt;li&gt;输入需要缩进的空格数量；&lt;/li&gt;
&lt;li&gt;按&lt;code&gt;esc&lt;/code&gt;按键完成操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;删除&#34;&gt;删除&lt;a class=&#34;headerlink&#34; href=&#34;#删除&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;d^&lt;/code&gt;：删除光标至行首内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d$&lt;/code&gt;：删除光标至行尾内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dgg&lt;/code&gt;：删除光标前的所有内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dG&lt;/code&gt;：删除光标后的所有内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd&lt;/code&gt;：删除当前行内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;多行注释插入与删除&#34;&gt;多行注释插入与删除&lt;a class=&#34;headerlink&#34; href=&#34;#多行注释插入与删除&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;多行注释插入字符&#34;&gt;多行注释插入字符&lt;a class=&#34;headerlink&#34; href=&#34;#多行注释插入字符&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进入 vi/vim 编辑器，按 &lt;strong&gt;&lt;code&gt;CTRL+V&lt;/code&gt;&lt;/strong&gt; 进入可视化模式（VISUAL BLOCK）；&lt;/li&gt;
&lt;li&gt;移动光标上移或者下移，选中多行的开头，如下图所示&lt;/li&gt;
&lt;li&gt;选择完毕后，按&lt;strong&gt;大写的 &lt;code&gt;I&lt;/code&gt; 键&lt;/strong&gt;，此时下方会提示进入 &amp;ldquo;insert&amp;rdquo; 模式，输入你要插入的注释符，例如 &lt;code&gt;#&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;最后按 &lt;strong&gt;&lt;code&gt;ESC&lt;/code&gt;&lt;/strong&gt; 键，你就会发现多行代码已经被注释了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;多行删除注释&#34;&gt;多行删除注释&lt;a class=&#34;headerlink&#34; href=&#34;#多行删除注释&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;方法同上，&lt;strong&gt;&lt;code&gt;Ctrl+v&lt;/code&gt;&lt;/strong&gt; 进入列选择模式，移到光标把注释符选中，按下&lt;strong&gt;小写的 &lt;code&gt;d&lt;/code&gt; 键&lt;/strong&gt;，注释就被删除了。&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;111&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-111/</link>
      <pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-111/</guid>
      
    </item>
    
    <item>
      <title>一杯热茶一个下午</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/乱弹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;除了图书馆、自习室，其实星巴克也算的上是一个码字的好地方，如果再点上一杯自己喜欢的热茶，伴随着耳机传来的音乐，也算的上极致的享受。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#39;https://gi.weiyan.tech/2025/04/starbuks-red-tea.webp&#39; alt=&#39;starbuks-red-tea&#39; width=600&gt;
&lt;/p&gt;

&lt;p&gt;外面的世界很复杂，陌生人之间的沟通交流已然处处勾心斗角，夫妻家庭之间的摩擦磕碰更是加剧内心的孤独。总希望有人可以关心，总希望能一家人和睦平安，事实上不会事事如意。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“人到中年的男人，时常会觉得孤独，因为他一睁开眼睛，周围都是要依靠他的人，却没有他可以依靠的人。”   &lt;br /&gt;
—— 张爱玲&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实说白了，就是人到中年不如狗，不敢老，不敢死，因为上有老下有小。于是开始卖笑：讨老人欢心是孝顺；给儿女做榜样是责任；看老婆脸色过日子是爱情；出门还要迎合所有人。&lt;/p&gt;
&lt;p&gt;圣贤有云：三十而立，四十不惑，五十而知天命。中年男人的人生，就是距离真实的自己最远的时刻。有家的男人是幸福，可有家的男人也辛苦。人到中年可以没有豪情万丈，更不能只剩惆怅，生活本身已经是不能承受之重，那些身外之物更应看透。&lt;/p&gt;
&lt;p&gt;所谓一叶知秋，见好就收。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;109&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-109/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-109/</guid>
      
    </item>
    
    <item>
      <title>清明时节雨纷纷</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/乱弹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自打搬进新家，生活的节奏就像按下了快进键，琐碎的事务如潮水般涌来，让自己始终没能腾出完整的时间，像从前在图书馆那样，沉浸式地做些自己喜欢的事。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;时间匆匆忙忙，难有时间停下来想一些事情，尤其过完年后的这一段时间里，焦虑与躁动忙碌交错。身边人生病的来回折腾，孩子补习班兴趣班辅导的鸡飞狗跳，让整个人下班后、周末的时间被切割得支离破碎。每次刚有点想做喜欢事情的念头，就被各种琐事打断。有时候好不容易抽出点时间，却又觉得缺少了图书馆那种宁静专注的氛围，很难静下心来。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2025-清明-天鹿湖-徒步&#34; src=&#34;https://gi.weiyan.tech/2025/04/2025-qm-1.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;虽然知道这些都是暂时的，也在等着工作生活慢慢渐入佳境。&lt;/p&gt;
&lt;p&gt;清明时节雨纷纷，趁着这个假期，好不容易在家附近找到一个可以静静呆着一下的小图书馆。接着，把在家里尘封已久的 ThinkPad 小钢炮又翻了出来 —— 破 PC 用久了，切换回已经有 7、8 个年头的 T460p，依然感受到了这个笔记本的倔强 —— 很有一股“老兵不死”的错觉。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;home-library&#34; src=&#34;https://gi.weiyan.tech/2025/04/home-library.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;“世上只有一种英雄主义，就是认清生活的真相之后依然热爱生活。”&lt;/p&gt;
&lt;p&gt;很多人都曾被这句话鼓舞过，特别是在长大之后，我们慢慢发现“生活的真相”其实就是，总会有这样那样的“坏事”发生，但还是得咬紧牙关迎难而上。&lt;/p&gt;
&lt;p&gt;一路披荆斩棘、披星戴月，虽然辛苦，但却在这个过程里变得更加勇敢和坚强。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2025-清明-天鹿湖-禾雀花&#34; src=&#34;https://gi.weiyan.tech/2025/04/2025-birdwoodiana.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;108&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-108/</link>
      <pubDate>Sat, 05 Apr 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-108/</guid>
      
    </item>
    
    <item>
      <title>Python 3.6 不能产生 libpython3.6m.so 文件</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 Python-3.6.9 中测试 &lt;code&gt;Cheetah&lt;/code&gt; 包的时候遇到了找不到 &lt;code&gt;libpython3.6m.so.1.0&lt;/code&gt; 静态库，记录一下填坑。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;import Cheetah._namemapper; print(Cheetah._namemapper.file)&#34;&lt;/span&gt;
Traceback&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;most&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;recent&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;call&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;last&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;File&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&amp;lt;string&amp;gt;&#34;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;line&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
ImportError:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libpython3.6m.so.1.0:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cannot&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;open&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shared&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;object&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;No&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;such&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;编译第三方静态库，在 &lt;code&gt;configure&lt;/code&gt; 阶段需要增加 &lt;code&gt;--enable-shared CFLAGS=-fPIC&lt;/code&gt; 参数！
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--enable-optimizations&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--enable-shared&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-fPIC
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在安装后，才会在 &lt;code&gt;/usr/local/python3/lib&lt;/code&gt; 目录下产生 &lt;code&gt;libpython3.6m.so&lt;/code&gt; 和 &lt;code&gt;libpython3.6m.so.1.0&lt;/code&gt; 两个文件。如果不加上面的添加，产生的文件是 &lt;code&gt;libpython3.6m.a&lt;/code&gt;。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;106&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-106/</link>
      <pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-106/</guid>
      
    </item>
    
    <item>
      <title>Galaxy 安装应该选择哪个版本</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2025-03-19&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2025-03-19T00:00:00+00:00&#39;&gt;2025-03-19&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--Catories:3.1.x-GalaxyOther--&gt;

&lt;blockquote&gt;
&lt;p&gt;Galaxy  是一个用于生物学研究的工作流程开源平台，用网页作为界面，让不熟悉编程语言的生物科学家更容易将手上的资料做进一步分析。Galaxy 的工作流程包含: 资料筛选与整合、资料分析与发布。虽然最早是为了基因组学研究而开发，但现在通常做为一般的生物资讯学工作流程管理系统。  —— &lt;a href=&#34;https://zh.wikipedia.org/wiki/Galaxy_(%E8%A8%88%E7%AE%97%E7%94%9F%E7%89%A9%E5%AD%B8)&#34;&gt;Galaxy (计算生物学)&lt;/a&gt; · 维基百科&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;随着新技术的更新换代，&lt;a href=&#34;https://github.com/galaxyproject/galaxy&#34;&gt;Galaxy Project&lt;/a&gt; 这个项目现在的变化也是越来越大，不管是 UI 界面还是各种框架技术，好像是越来越复杂。从业务角度出发，面对每年至少 2+ 次的 Release 版本，我们应该怎么选呢？&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;首先，在 UI 上 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.0_announce.html&#34;&gt;release_24.0&lt;/a&gt; 和 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.1_announce.html&#34;&gt;release_24.1&lt;/a&gt; 是一个分水岭。&lt;/p&gt;
&lt;p&gt;传统三栏界面，以 release_22.x 为例。
&lt;img alt=&#34;galaxy-21.01&#34; src=&#34;https://gi.weiyan.tech/2025/03/galaxy-21.01.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.0_announce.html&#34;&gt;release_24.0&lt;/a&gt; 开始增加了四栏模式（最左侧增加了一栏 &lt;strong&gt;Activity Bar&lt;/strong&gt;），但通过管理员可以通过设置保留传统的左中右三栏模式。到 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.1_announce.html&#34;&gt;release_24.1&lt;/a&gt; 后一律强制变成了四栏模式，即 &lt;strong&gt;Activity Bar&lt;/strong&gt; 不再支持隐藏（Activity bar is now enabled by default.）。  &lt;br /&gt;
&lt;img alt=&#34;galaxy-24.1&#34; src=&#34;https://gi.weiyan.tech/2024/10/galaxy-24.1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到了 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.2_announce.html&#34;&gt;release_24.2&lt;/a&gt;，更是把中间栏头部的 &lt;strong&gt;Masthead Revision&lt;/strong&gt; 导航去掉整合到左侧的 &lt;strong&gt;Activity Bar&lt;/strong&gt; 里面去了。  &lt;br /&gt;
&lt;img alt=&#34;galaxy-24.2.3.dev0&#34; src=&#34;https://gi.weiyan.tech/2025/03/galaxy-24.2.3.dev0.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第二，release_24.x 在安装过程中对 CPU 要求更高，以前的 2 核 4G 服务器现在基本没法安装。  &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;galaxy-24-sigkill&#34; src=&#34;https://gi.weiyan.tech/2025/03/galaxy-24-sigkill.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以说，从 release_24.x 起 Galaxy 开始真正贯彻 &lt;strong&gt;Galaxy = workflows&lt;/strong&gt; 的理念 - Create complex workflows and deploy via &lt;a href=&#34;https://training.galaxyproject.org/training-material/topics/galaxy-interface/tutorials/workflow-editor/tutorial.html&#34;&gt;UI&lt;/a&gt; or &lt;a href=&#34;https://training.galaxyproject.org/training-material/topics/galaxy-interface/tutorials/workflow-automation/tutorial.html&#34;&gt;CLI&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;galaxy-more-than-you-think&#34; src=&#34;https://gi.weiyan.tech/2025/03/galaxy-more-than-you-think.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;所以，总的来说，如果只是想借助 Galaxy 的平台完成命令行工具(程序)到 UI 可视化操作这一业务需求，可以简单选择 &lt;strong&gt;≤&lt;/strong&gt; release_24.0 的版本；如果更加侧重 &lt;strong&gt;workflows&lt;/strong&gt;，或者两者兼顾，可以选择 release_24.1 或者更高的版本 - 从颜值上个人更喜欢 24.2 这一个对 &lt;strong&gt;Masthead Revision&lt;/strong&gt; 导航优化后的布局。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;105&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/other/2025-03-19-Galaxy-%E5%AE%89%E8%A3%85%E5%BA%94%E8%AF%A5%E9%80%89%E6%8B%A9%E5%93%AA%E4%B8%AA%E7%89%88%E6%9C%AC-dis105/</link>
      <pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/other/2025-03-19-Galaxy-%E5%AE%89%E8%A3%85%E5%BA%94%E8%AF%A5%E9%80%89%E6%8B%A9%E5%93%AA%E4%B8%AA%E7%89%88%E6%9C%AC-dis105/</guid>
      
    </item>
    
    <item>
      <title>git clone 设置临时代理</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;很多时候我们在国内使用 git 克隆，或者拉取、推送代码时总是显示连接不上，这时我们就需要设定 git 代理解决。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;一次性代理&#34;&gt;一次性代理&lt;a class=&#34;headerlink&#34; href=&#34;#一次性代理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clone&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http.proxy&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;http://127.0.0.1:1080&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;全局设置代理&#34;&gt;全局设置代理&lt;a class=&#34;headerlink&#34; href=&#34;#全局设置代理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https.proxy&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://127.0.0.1:1080
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https.proxy&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://127.0.0.1:1080
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--unset&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http.proxy
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--unset&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https.proxy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/laispace/666dd7b27e9116faece6&#34;&gt;git 设置和取消代理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;104&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-104/</link>
      <pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-104/</guid>
      
    </item>
    
    <item>
      <title>如何在 Win11 上恢复旧的右键菜单？</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;家里的 Win11 使用了一段时间，最近发现它的这个鼠标右键的 &lt;strong&gt;&amp;lsquo;显示更多选项&amp;rsquo;&lt;/strong&gt; 实在太让人反感了，以至于每次想通过鼠标右键选择其他功能时必须要多点击一次 &lt;strong&gt;&amp;ldquo;显示更多选项&amp;rdquo;&lt;/strong&gt;。因此迫切希望能够将 Win11 显示更多选项这个反人类的设置恢复成 Win10 的状态，或者让 Win11 的鼠标右键的默认打开 &lt;strong&gt;&amp;lsquo;显示更多选项&amp;rsquo;&lt;/strong&gt;。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;shift-f10&#34; src=&#34;https://gi.weiyan.tech/2025/02/shift-f10.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;网上的普遍使用，且很多人反馈完美解决的解决方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤1.&lt;/strong&gt; 按 &lt;strong&gt;Win+S&lt;/strong&gt; 打开搜索框，输入 &lt;strong&gt;cmd&lt;/strong&gt; 并以管理员身份运行命令提示符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤2.&lt;/strong&gt; 输入以下命令并按 &lt;strong&gt;Enter&lt;/strong&gt; 键执行。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 /ve /d &#34;&#34; /f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2025年的更新操作：&lt;/strong&gt; 如果上述命令无效的话，还可以继续执行这个命令：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;reg.exe add &#34;HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&#34; /f /ve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 如果您想要重新打开 Win11 新样式的右键菜单的话，以同样的方式在命令提示符中执行此命令：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;reg delete &#34;HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}&#34; /f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤3.&lt;/strong&gt; 重启资源管理器，运行以下命令：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;taskkill /f /im explorer.exe &amp;amp; start explorer.exe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;我刚开始的时候也是按照这样的方法去设置了，后来打开文件夹的时候鼠标右键的确完美解决了，但是一回到桌面，还是原来 Win11 新样式的右键菜单。反反复复试了很多次，包括直接去修改注册列表、尝试 Windows 11 Classic Context Menu v1.2 插件等等，最终都无法解决。&lt;/p&gt;
&lt;p&gt;后来静下心想了一下桌面和打开文件夹有什么不一样的，才发现原来自己在桌面还装了一个腾讯的&lt;a href=&#34;https://guanjia.qq.com/product/zmzl/&#34;&gt;桌面整理&lt;/a&gt;，实话实说，这个的确是个好用的小工具。
&lt;img alt=&#34;zmzl&#34; src=&#34;https://gi.weiyan.tech/2025/02/zmzl.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这个桌面插件在 &lt;strong&gt;&amp;ldquo;实用功能&amp;rdquo;&lt;/strong&gt; → &lt;strong&gt;&amp;ldquo;设置中心&amp;rdquo;&lt;/strong&gt; 里面居然还有一个 &lt;strong&gt;&amp;ldquo;启用Windows11风格桌面右键菜单&amp;rdquo;&lt;/strong&gt;，只要把这个选项去掉，Win11 右键菜单恢复成 Win10 状态就立马生效了。
&lt;img alt=&#34;zmzl-w11&#34; src=&#34;https://gi.weiyan.tech/2025/02/zmzl-w11.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;102&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-102/</link>
      <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-102/</guid>
      
    </item>
    
    <item>
      <title>DeepSeek 本地部署与使用初探</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;DeepSeek 相关的人工智能现在是火得一塌糊涂，本着学习的心态，基于现在的一些有限资源，也来体验一下。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;参考文章&#34;&gt;参考文章&lt;a class=&#34;headerlink&#34; href=&#34;#参考文章&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/kzwOYEMtzzBZH7jD3kNRlA&#34;&gt;用本地文件调教 DeepSeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.csdn.net/spiderwower/article/details/138463635&#34;&gt;ollama+open-webui，本地部署自己的大模型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;注意事项&#34;&gt;注意事项&lt;a class=&#34;headerlink&#34; href=&#34;#注意事项&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;1-依赖的一些问题&#34;&gt;1. 依赖的一些问题&lt;a class=&#34;headerlink&#34; href=&#34;#1-依赖的一些问题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;open-webui&lt;/code&gt; 安装完成后，在 &lt;code&gt;backend&lt;/code&gt; 目录执行 &lt;code&gt;bash start.sh&lt;/code&gt; 如果出现 &lt;strong&gt;ImportError: libGL.so.1: cannot open shared object file: No such file or directory&lt;/strong&gt; 错误，可以考虑降低 &lt;code&gt;transformers&lt;/code&gt; 版本，个人测试 &lt;code&gt;mamba install transformers=4.36 --force-reinstall&lt;/code&gt; 重装后恢复正常。&lt;/p&gt;
&lt;h3 id=&#34;2-有限的资源也能跑起来&#34;&gt;2. 有限的资源，也能跑起来&lt;a class=&#34;headerlink&#34; href=&#34;#2-有限的资源也能跑起来&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一台 2 核 4G 的云服务器，跑个 &lt;strong&gt;deepseek-r1:1.5b&lt;/strong&gt; 模型毫无压力，非常流畅，一些简单的问题也能回答出来。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;linux-deepseek-r1-1-5b&#34; src=&#34;https://gi.weiyan.tech/2025/02/linux-deepseek-r1-demo.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-交互问题&#34;&gt;3. 交互问题&lt;a class=&#34;headerlink&#34; href=&#34;#3-交互问题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ollama serve&lt;/code&gt;，或者 &lt;code&gt;systemctl start ollama&lt;/code&gt; 默认可以通过 &lt;code&gt;http://localhost:11434&lt;/code&gt; 看到 ollama 是否已经在运行，但无法与模型进行交互。《&lt;a href=&#34;https://mp.weixin.qq.com/s/kzwOYEMtzzBZH7jD3kNRlA&#34;&gt;用本地文件调教 DeepSeek&lt;/a&gt;》 一文说在终端运行 &lt;code&gt;ollama serve&lt;/code&gt; 命令启动 Ollama 服务，服务启动后，可以通过访问 &lt;code&gt;http://localhost:11434&lt;/code&gt; 来与模型进行交互。这是不正确的。        &lt;br /&gt;
&lt;img alt=&#34;ollama-service-11434&#34; src=&#34;https://gi.weiyan.tech/2025/02/ollama-service-11434.png&#34; /&gt;    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ollama-is-running&#34; src=&#34;https://gi.weiyan.tech/2025/02/ollama-is-running.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-通过网页端访问和使用&#34;&gt;4. 通过网页端访问和使用。&lt;a class=&#34;headerlink&#34; href=&#34;#4-通过网页端访问和使用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果想要通过网页把自己本地部署的 DeepSeek 模型开放给自己或者其他小伙伴使用，&lt;code&gt;open-webui&lt;/code&gt; 是一个比较好的选择，安装和启动都很简单。
&lt;img alt=&#34;open-webui-start&#34; src=&#34;https://gi.weiyan.tech/2025/02/open-webui-start.png&#34; /&gt;   &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;open-webui-auth&#34; src=&#34;https://gi.weiyan.tech/2025/02/open-webui-auth.png&#34; /&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;deepseek-open-webui&#34; src=&#34;https://gi.weiyan.tech/2025/02/deepseek-open-webui.png&#34; /&gt;    &lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;101&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-101/</link>
      <pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-101/</guid>
      
    </item>
    
    <item>
      <title>那些偶尔想起的幸福时刻</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最近偶尔浮现一些记忆中画面，记忆中是在家附近的金黄的稻田间散步，走在田埂上感受阳光明媚风微凉，脑袋里没有想太多的事情， 只是纯粹的感受美好......&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;golden-rice&#34; src=&#34;https://gi.weiyan.tech/2025/02/golden-rice.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;那段关于童年放牛的记忆，如同一幅幅温馨而生动的画卷，那时的天空总是格外晴朗，阳光透过树叶的缝隙，洒下斑驳陆离的光影，与三两玩伴的欢声笑语交织在一起，构成了最纯粹的快乐。我们在山林间自由穿梭，仿佛整个世界都属于我们这群小小的探险家。&lt;/p&gt;
&lt;p&gt;攀上枝头，与鸟儿嬉戏，那份无畏与好奇，探索那些隐蔽的小径，揭开大自然的神秘面纱，每一处新发现都像是宝藏，让我们的午后时光既舒适又充满了奇幻色彩。那时的我们，心中装满了对未知世界的好奇与向往，每一次探险都是对自我边界的拓宽。&lt;/p&gt;
&lt;p&gt;即使时光荏苒，岁月如梭，那份记忆依旧鲜明如初。当暮色悄然爬上远处的山脊，天边最后一抹夕阳也依依不舍地隐去，我的鼻尖似乎还能捕捉到那熟悉而又遥远的山间篝火炊烟的味道。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;children-cattle&#34; src=&#34;https://gi.weiyan.tech/2025/02/children-cattle.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;高考完的那年暑假，和班上一大堆同学跑到了深圳观澜的一家电子厂打暑假工。白天在车间焊接电子配件，炎热又忙碌，晚上泡网吧，周末爬山、瞎逛，试图着用脚步去丈量着这座城市的每一个角落。那年夏天，第一次体验了打工的新鲜和艰辛，第一次接触手机，第一次注册了自己的 QQ 号，没作业，不知道未来，带着青葱的稚嫩和对未来的憧憬，只有炎炎夏日和蝉叫，以及几个对未来不知所措的少年，刻骨铭心......&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2025/02/09-aug-09.jpg&#34; alt&gt;&lt;br&gt;
    &lt;span&gt;感受一下AI修复后的旧时照片&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;那些记忆的画面很简单，但是那感受刻骨铭心。这种感受已经十几年没有过了，尤其在城市里，你甚至找不到一处安静的地方。人大了，事情多了，脑袋里总是有卸不完的事情，卸了一件再来一件。甚至这种回忆也不常有，有点麻木的感觉。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;99&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-99/</link>
      <pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-99/</guid>
      
    </item>
    
    <item>
      <title>R 语言中的 libpng 版本冲突</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;事情起因是在 R 语言中调用 &lt;code&gt;png&lt;/code&gt; 包的 &lt;code&gt;readPNG&lt;/code&gt; 读取 png 图片的时候，碰到了错误：&lt;strong&gt;libpng error: Incompatible libpng version in application and library&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;png&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readPNG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;/bioinfo/polyA/circos.png&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readPNG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;/bioinfo/polyA/circos.png&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Incompatible&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;library&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;In&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addition&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Warning&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;In&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readPNG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;/bioinfo/polyA/circos.png&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;was&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compiled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;png.h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;-1.6&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;37&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;In&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readPNG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;/bioinfo/polyA/circos.png&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;running&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;png.c&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libpng&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;-1.2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;49&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个问题，其实在 《&lt;a href=&#34;https://weiyan.cc/yuque/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/R/2019-07-15-r-ramigo/&#34;&gt;RamiGO 安装及库依赖解决备忘&lt;/a&gt;》曾经遇到过，当时的解决方法，在现在看起来其实是并不完善的。所以，在问题解决前，我们先来看看这个问题到底是怎么导致的。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;首先，我的 R 是通过源码编译安装的，而且在安装的过程中 &lt;code&gt;configure&lt;/code&gt; 时候指定了自己安装的 libpng-1.6.37。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure --prefix=bioinfo/software/r/r-4.4.2 --enable-R-shlib --with-libtiff --with-libpng --with-jpeglib --with-pcre1 \
LDFLAGS=&#34;-L/bioinfo/software/mylibs/zlib-1.2.6/lib \
            -L/bioinfo/software/mylibs/bzip2-1.0.6/lib \
            -L/bioinfo/software/mylibs/pcre-8.40/lib \
            -L/bioinfo/software/mylibs/tiff-4.0.9/lib \
            -L/bioinfo/software/mylibs/jpeg-9c/lib \
            -L/bioinfo/software/mylibs/libpng-1.6.37/lib \
            -L/bioinfo/software/mylibs/xz-5.2.3/lib \
            -L/bioinfo/software/mylibs/curl-7.64.1/lib -fopenmp&#34; \
CPPFLAGS=&#34;-I/bioinfo/software/mylibs/zlib-1.2.6/include \
            -I/bioinfo/software/mylibs/bzip2-1.0.6/include \
            -I/bioinfo/software/mylibs/pcre-8.40/include \
            -I/bioinfo/software/mylibs/tiff-4.0.9/include \
            -I/bioinfo/software/mylibs/jpeg-9c/include \
            -I/bioinfo/software/mylibs/libpng-1.6.37/include \
            -I/bioinfo/software/mylibs/xz-5.2.3/include \
            -I/bioinfo/software/mylibs/curl-7.64.1/include&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第二，我使用的 &lt;code&gt;png&lt;/code&gt; 是在 R 里面直接 &lt;code&gt;install.package(&#39;png&#39;)&lt;/code&gt; 安装的。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ldd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r/r-4.4.2/lib64/R/library/png/libs/png.so
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;linux-vdso.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007fff29dd9000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libpng12.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libpng12.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a614bc000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libz.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r-3.3.2/lib/libz.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a612a4000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libm.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libm.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a61020000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libR.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r/r-3.6.1/lib64/R/lib/libR.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a6098e000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libgomp.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bioinfo/software/gcc-7.3.0/lib64/libgomp.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a60760000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libpthread.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libpthread.so.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a60543000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libc.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libc.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a601af000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libRblas.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r/r-3.6.1/lib64/R/lib/libRblas.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5ff83000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libgfortran.so.3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libgfortran.so.3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5fc91000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libreadline.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libreadline.so.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5fa4e000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libpcre.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r-3.3.2/lib/libpcre.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5f81b000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;liblzma.so.5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/r-3.3.2/lib/liblzma.so.5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5f5f6000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;librt.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/librt.so.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5f3ee000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libdl.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libdl.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5f1e9000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libiconv.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/local/lib/libiconv.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5ef04000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;/lib64/ld-linux-x86-64.so.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x0000003636a00000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;libtinfo.so.5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/lib64/libtinfo.so.5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00007f1a5ece2000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;从 &lt;code&gt;ldd&lt;/code&gt; 的结果可以很明显看到，&lt;code&gt;install.package(&#39;png&#39;)&lt;/code&gt; 使用了系统默认的 &lt;code&gt;libpng&lt;/code&gt;，也就是对应的 &lt;code&gt;libpng-1.2.49&lt;/code&gt;。因此最后在调用 &lt;code&gt;png&lt;/code&gt; 的时候就和编译使用的 &lt;code&gt;libpng-1.6.37&lt;/code&gt; 发生了冲突。&lt;/p&gt;
&lt;p&gt;第三，所以最终的解决方法就是，先设置 &lt;code&gt;libpng-1.6.37&lt;/code&gt;的 &lt;code&gt;PATH&lt;/code&gt; 和 &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt;。 
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export PATH=/bioinfo/software/mylib/libpng-1.6.37/bin:$PATH
export LD_LIBRARY_PATH=/bioinfo/software/mylib/libpng-1.6.37/lib:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;卸载原来的 &lt;code&gt;png&lt;/code&gt; 包，再重新安装。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nf&#34;&gt;remove.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;png&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;repos&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CRAN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;install.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;png&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;总的来说，最开始碰到这个问题的时候，虽然知道问题在哪，也设置过 &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; 后去重装 &lt;code&gt;png&lt;/code&gt;，但是一直都没成功，后面尝试了几个方法。&lt;/p&gt;
&lt;p&gt;一是，怎么在 &lt;code&gt;install.packages()&lt;/code&gt; 中指定 libpng-1.6.37 的 &lt;code&gt;LDFLAGS&lt;/code&gt; 和 &lt;code&gt;CPPFLAGS&lt;/code&gt;，因为没搞懂 &lt;code&gt;--configure-args&lt;/code&gt; 具体是怎么用的，这条路没走通。另外，在 &lt;code&gt;HOME/.R/Makevars&lt;/code&gt; 设置了 &lt;code&gt;LDFLAGS&lt;/code&gt; 和 &lt;code&gt;CPPFLAGS&lt;/code&gt; 进行了尝试，也依然不起作用。&lt;/p&gt;
&lt;p&gt;二是，想通过 &lt;code&gt;patchelf&lt;/code&gt; 去直接修改 &lt;code&gt;png.so&lt;/code&gt; 的动态库链接，虽然修改成功，但直接把 &lt;code&gt;png&lt;/code&gt; 搞崩溃。&lt;/p&gt;
&lt;p&gt;直至把 libpng-1.6.37 的 bin 也一起增加到 &lt;code&gt;PATH&lt;/code&gt;，才重装 &lt;code&gt;png&lt;/code&gt; 后，这个问题才最终解决。个人猜测在安装 &lt;code&gt;png&lt;/code&gt; 时检测 libpng 的过程中应该跟 &lt;code&gt;libpng-config&lt;/code&gt; 的可执行文件有关系，因为系统默认的 &lt;code&gt;/usr/bin/libpng-config&lt;/code&gt; 为 1.2.49 版本，而 libpng-1.6.37 的 &lt;code&gt;bin/libpng-config&lt;/code&gt; 默认软连接至 &lt;code&gt;bin/libpng16-config&lt;/code&gt;，对应 1.6.37。&lt;/p&gt;
&lt;p&gt;事后，去 &lt;code&gt;png&lt;/code&gt; 的&lt;a href=&#34;https://github.com/s-u/png&#34;&gt;源码仓库&lt;/a&gt;一看，果然在 &lt;code&gt;src/Makevars&lt;/code&gt; 中发现了链接库和依赖中调用了 &lt;code&gt;libpng-config&lt;/code&gt;：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;PKG_LIBS=$(PNG_LIBS) `libpng-config --static --ldflags`
PKG_CFLAGS=$(PNG_CFLAGS) `libpng-config --cflags`
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;png-src-makevars&#34; src=&#34;https://gi.weiyan.tech/2025/02/png-src-makevars.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;而系统的 &lt;code&gt;libpng-config&lt;/code&gt; 和 libpng-1.6.37 的 &lt;code&gt;bin/libpng-config&lt;/code&gt; 的链接库和依赖：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/bin/libpng-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--static&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--ldflags
-L/usr/lib64&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lpng12&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lm

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/software/mylib/libpng-1.6.37/bin/libpng-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--static&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--ldflags
-L/bioinfo/software/mylib/libpng-1.6.37/lib&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lpng16&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;正好印证了在安装 &lt;code&gt;png&lt;/code&gt; 时，的确需要从默认 &lt;code&gt;PATH&lt;/code&gt; 中调用 &lt;code&gt;libpng-config&lt;/code&gt;，从而获取对应的链接库和依赖。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;98&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-98/</link>
      <pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-98/</guid>
      
    </item>
    
    <item>
      <title>Python 包 matplotlib 安装的一些问题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Python 的 matplotlib 在安装的过程中一直无法解决 freetype2 自动下载的问题，导致始终安装不成功。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Python-3.10.16 通过本地（或者是在线）方式安装 matplotlib-3.10.0 的时候，发现对应 &lt;code&gt;freetype2&lt;/code&gt;、&lt;code&gt;qhull&lt;/code&gt; 通过对应的 URL 无法正常下载，以至于 &lt;code&gt;matplotlib&lt;/code&gt; 一直安装不成功，详细信息如下面代码所示。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;.
Looking&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;indexes:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://pypi.tuna.tsinghua.edu.cn/simple
Processing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dependencies&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Getting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;requirements&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wheel&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;backend&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dependencies&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Preparing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;pyproject.toml&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;subprocess-exited-with-error

&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;×&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Preparing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;pyproject.toml&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;did&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully.
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;│&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;code:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;╰─&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;48&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lines&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;+&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;meson&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0/.mesonpy-smx69lrx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Dbuildtype&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Db_ndebug&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;if-release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-Db_vscrt&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;md&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--native-file&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0/.mesonpy-smx69lrx/meson-python-native-file.ini
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Meson&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;system
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Version:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.7.0
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Source&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dir:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dir:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0/.mesonpy-smx69lrx
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;type:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;native&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Program&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/bioinfo/software/Python-3.10.16/bin/python3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Project&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;matplotlib
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Project&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;version:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.10.0
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;compiler&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.4.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;cc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ld.bfd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.20.51.0.2-5
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;C++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;compiler&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;c++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.4.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;c++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;C++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;c++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ld.bfd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.20.51.0.2-5
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cpu&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;family:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;x86_64
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;machine&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cpu:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;x86_64
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Program&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/bioinfo/software/Python-3.10.16/bin/python3.10&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pkg-config:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/usr/bin/pkg-config&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.23
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Run-time&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dependency&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.10
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;pybind11-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/tmp/pip-build-env-gf0psrg8/overlay/bin/pybind11-config&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.13.6
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Run-time&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dependency&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pybind11&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;YES&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.13.6
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Downloading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;freetype-2.6.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;Downloading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;freetype-2.6.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;download&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;after&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;delay...
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&amp;lt;urlopen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;SSL:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERTIFICATE_VERIFY_FAILED&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;verify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issuer&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;certificate&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;_ssl.c:1007&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&amp;gt;

&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;../extern/meson.build:18:18:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ERROR:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;internet&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available?

&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;A&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;full&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;log&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;can&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;be&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;at&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/bioinfo/src/py/matplotlib-3.10.0/.mesonpy-smx69lrx/meson-logs/meson-log.txt
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;end&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;note:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;originates&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;subprocess,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;likely&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;problem&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip.
error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata-generation-failed

×&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Encountered&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;generating&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;package&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata.
╰─&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;See&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;above&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output.

note:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;an&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;issue&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;package&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mentioned&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;above,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip.
hint:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;See&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;above&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;details.

&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;notice&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;A&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;new&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;23&lt;/span&gt;.0.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;25&lt;/span&gt;.0.1
&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;notice&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;update,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--upgrade&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对于这种情况，可以：
1. 根据提示给出的 URL 下载好相应的依赖（这个 URL 也可以在 &lt;code&gt;matplotlib-3.10.0/subprojects/*.wrap&lt;/code&gt; 中找到），并把依赖包保存的服务器任何一个目录下。        &lt;br /&gt;
   - &lt;a href=&#34;https://github.com/matplotlib/matplotlib/blob/v3.10.x/subprojects/freetype-2.6.1.wrap&#34;&gt;freetype-2.6.1.wrap&lt;/a&gt;：&lt;code&gt;/bioinfo/src/py/freetype-2.6.1.tar.gz&lt;/code&gt;；       &lt;br /&gt;
   - &lt;a href=&#34;https://github.com/matplotlib/matplotlib/blob/v3.10.x/subprojects/qhull.wrap&#34;&gt;qhull.wrap&lt;/a&gt;：&lt;code&gt;/bioinfo/src/py/qhull-8.0.2.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;matplotlib-3.10.0/subprojects/*.wrap&lt;/code&gt;。      &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;freetype-2.6.1.wrap
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[wrap-file]
source_url = file:///bioinfo/src/py/freetype-2.6.1.tar.gz
source_fallback_url = file:///bioinfo/src/py/freetype-2.6.1.tar.gz
source_filename = freetype-2.6.1.tar.gz
source_hash = 0a3c7dfbda6da1e8fce29232e8e96d987ababbbf71ebc8c75659e4132c367014

patch_directory = freetype-2.6.1-meson

[provide]
freetype-2.6.1 = freetype_dep
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qhull.wrap
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[wrap-file]
# Also bump the cache key in `.circleci/config.yml`.
# Also update the docs in `docs/devel/dependencies.rst`.
directory = qhull-8.0.2
source_url = file:///bioinfo/src/py/qhull-8.0.2.tar.gz
source_filename = qhull-8.0.2.tgz
source_hash = 8774e9a12c70b0180b95d6b0b563c5aa4bea8d5960c15e18ae3b6d2521d64f8b

patch_directory = qhull-8.0.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后，再次执行安装。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
   &lt;img alt=&#34;pip3-matplotlib&#34; src=&#34;https://gi.weiyan.tech/2025/02/pip3-matplotlib.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;97&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-97/</link>
      <pubDate>Wed, 12 Feb 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-97/</guid>
      
    </item>
    
    <item>
      <title>我的 2024 年总结</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2024 年已过去，距离农历新年还有将近半个月的时间，趁着这个时间简单来盘点一下 2024 年走过的一些坑坑洼洼。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;工作那些事&#34;&gt;工作那些事&lt;a class=&#34;headerlink&#34; href=&#34;#工作那些事&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;工作上的事情，早在公司层面已经梳理了一次，到了这里实在是乏善可陈，也不太想再来这里赘述了，只想聊聊一些想法。&lt;/p&gt;
&lt;p&gt;当一个人一年到头安装、测试过上百款软件/包，在 configure/make/make install 这条路上趟过太多坑后，会对 mamba/conda/virtualenv 一类的解决方案更加关注，但是对于老旧服务器甚至是集群 docker/singularity 却又是另一个可望不可及的痛 —— 想用却用不上。总的来说，软件这条路，依旧是源码加 conda 流混合双打的局面，借助 Google 或者是 AI 还是能打上几个回合的。&lt;/p&gt;
&lt;p&gt;在另外一个赛道上，AI 火的一塌糊涂的今天，PyTorch/TensorFlow，AlphaFold 3/HelixFold 3，&amp;hellip; 成为了个人的另外一个选择和挑战，2024 年没能真正躬身入局，2025 年的路还会远吗？GPU 带来的问题仿佛还在耳边，路漫漫看不见脚下的路。&lt;/p&gt;
&lt;p&gt;都说这是艰难的一年，&lt;a href=&#34;https://weiyan.cc/blog/discussions-81/&#34;&gt;寒冬将至&lt;/a&gt;，2025 年又何尝不会更加艰难！&lt;/p&gt;
&lt;h2 id=&#34;享受生活&#34;&gt;享受生活&lt;a class=&#34;headerlink&#34; href=&#34;#享受生活&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2024 年绝对是陪娃打卡室外活动最多的一年。在爬山和徒步这条路上，从华峰寺、南香山、油麻山、火炉山，到博物馆、儿童公园、黄埔欢乐跑、玉岩书院徒步，萌鸡小队一年以来可谓战绩辉煌，欢乐满满。&lt;/p&gt;
&lt;p&gt;2024 年 7 月中旬，经历了公司体检后，成功带领公司的小伙伴们入坑羽毛球。把公司附近大大小小的球馆打过一遍后，羽毛球成为了每周的常态，养生局和对抗局轮流转。随着周围羽毛球馆越开越多，打球虽然越来越方便，但人却越来越分散，价格也越加参差不齐。&lt;/p&gt;
&lt;h2 id=&#34;聊聊其他&#34;&gt;聊聊其他&lt;a class=&#34;headerlink&#34; href=&#34;#聊聊其他&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2024 年是全面游走在黄埔、增城两区的一年，通勤、生活日渐适应，完美的过渡。&lt;/p&gt;
&lt;p&gt;2024 年家人经历了一些职场变动，经历了一些健康困扰，幸运的是这一年大家一路扶持一路鼓励，让包容给了这个家更多温暖。&lt;/p&gt;
&lt;h2 id=&#34;愿你所愿&#34;&gt;愿你所愿&lt;a class=&#34;headerlink&#34; href=&#34;#愿你所愿&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025 年，愿你所愿 —— 这盛世每一天，山河无恙，烟火寻常。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;96&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-96/</link>
      <pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-96/</guid>
      
    </item>
    
    <item>
      <title>生活跌宕，羽球向阳</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;羽毛球这项运动真是很神奇，就想多巴胺一样，过程总能让人乐此不疲，就像平常生活中的一束光或是一拂尘，拂去生活的阴霾与不快。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;blockquote&gt;
&lt;p&gt;生活无非就是上班下班，过了初出茅庐的迷茫与昂扬，一切都开始变得按部就班有条不紊，也经历了没遇到过的波折与离别，很多事情都只能放在心里，让别人放心。就这样不知不觉间成为了一些人事物的支撑，俗称高个的。但只有自己才知道，自己也需要一个支撑，一个途径，一个宣泄口，一个目标让自己能扛得下去，于是我说生活跌宕，羽球向阳。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#39;https://gi.weiyan.tech/2025/05/badminton202505.webp&#39; width=800 alt=&#34;badminton202505&#34;&gt;&lt;/p&gt;
&lt;p&gt;或许这正是羽毛球的治愈力，它让疲惫的灵魂暂时抽离现实，在攻防的博弈里，找回对生活的掌控感与热忱。&lt;/p&gt;
&lt;p&gt;年龄增长，体力也在以肉眼可见在退步，周围的球馆关了开开了关，身边的球搭子换了一批又一批，林林总总的背后总有神伤的时候。生活也总是这样，不能让人处处都满意。不同阶段有不同问题，生活态度也随之起起落落。但流过了汗，短暂的宣泄过后，咬咬牙，一切总能过去。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;95&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-95/</link>
      <pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-95/</guid>
      
    </item>
    
    <item>
      <title>手机流量与套餐</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;都到 2024 年了，还在为手机流量和套餐的事情纠结。身处广东，不管移动联通电信，还是新出来的广电，就想问一下现在还有比较便宜的套餐吗？&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;起源是老母亲现在用的移动 39 元/月的套餐，老人觉得费用太高，想要换一个费用低一点的套餐。所以问题就来了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要给老人（未满 60 周岁）用。&lt;/li&gt;
&lt;li&gt;平时就用微信、抖音。&lt;/li&gt;
&lt;li&gt;在不换号码前提下有没有比较便宜的套餐（例如，19 元的套餐挺好）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看到一些建议，说给老人买一张副卡，把主卡转为 8 元保号套餐，这也是一个方法，但这样一来，问题就变成了：哪些副卡比较划算？&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;china-mobile-operators&#34; src=&#34;https://gi.weiyan.tech/2024/11/china-mobile-operators.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;家里有老人的，不知道大家都是怎么给他们选择套餐的，现在的套餐五花八门，一时间还真不知道该怎么选。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;94&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-94/</link>
      <pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-94/</guid>
      
    </item>
    
    <item>
      <title>GitHub Actions 更新 Submodule</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;怎么通过 GitHub Actions 实时更新 Git 仓库中的子模块（submodules）。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;Send submodule updates to parent repo&lt;/span&gt;

&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;branches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;main&lt;/span&gt;

&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runs-on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;ubuntu-latest&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;actions/checkout@v2&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;xxx/parent_xxx&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;${{ secrets.PRIVATE_TOKEN_GITHUB }}&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;Pull &amp;amp; update submodules recursively&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;|&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git submodule update --init --recursive&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git submodule update --recursive --remote&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;Commit&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;|&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git config user.email &#34;actions@github.com&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git config user.name &#34;GitHub Actions - update submodules&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git add --all&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git commit -m &#34;Update submodules&#34; || echo &#34;No changes to commit&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;git push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git submodule update --init --recursive&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个命令用于初始化并更新仓库中的子模块。具体来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--init&lt;/code&gt; 参数会初始化在 &lt;code&gt;.gitmodules&lt;/code&gt; 文件中指定的每个子模块的配置信息，但不会更新子模块的内容。这个步骤是必须的，因为 Git 不会自动初始化子模块的配置信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--recursive&lt;/code&gt; 参数确保命令递归地应用于任何嵌套的子模块。这意味着如果子模块本身还包含子模块，这些子模块也会被初始化。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简而言之，这个命令会初始化仓库中所有（包括嵌套的）子模块的配置，并更新它们到在父仓库中记录的提交。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git submodule update --recursive --remote&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个命令用于更新仓库中的子模块到它们的远程仓库中的最新状态（或指定的分支/标签）。具体来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--recursive&lt;/code&gt; 的作用与上述命令相同，确保命令递归地应用于所有嵌套的子模块。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--remot&lt;/code&gt;e 参数指示 Git 更新每个子模块到其远程仓库的当前分支的最新提交。如果没有指定分支，则默认为在 &lt;code&gt;.gitmodules&lt;/code&gt; 文件中为每个子模块指定的分支。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，这个命令并不会改变父仓库中记录的子模块的提交。它只是更新了子模块的工作目录和索引，以匹配远程仓库的最新状态。如果你想在父仓库中记录这些更新，你需要在子模块中执行提交，然后回到父仓库中，添加子模块的变更并提交。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;总结&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git submodule update --init --recursive&lt;/code&gt; 用于初始化并更新子模块到父仓库中记录的提交。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git submodule update --recursive --remote&lt;/code&gt; 用于将子模块更新到其远程仓库的最新状态，但不会在父仓库中记录这些更新。&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;93&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-93/</link>
      <pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-93/</guid>
      
    </item>
    
    <item>
      <title>Follow 初体验</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 2024 年国庆前后的这一段时间，&lt;a href=&#34;https://follow.is/&#34;&gt;Follow&lt;/a&gt; 的这个号称 Next-Gen Information Browser 的 RSS 阅读器在各大平台相当的火，各种疯抢激活码的帖子也是起此彼伏。直到 10 月 24，开始公测，上去体验了一下，发现也就跟其它 RSS 软件没啥太大区别，并没有说的那么玄乎。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;卡顿&#34;&gt;卡顿&lt;a class=&#34;headerlink&#34; href=&#34;#卡顿&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有人提到的公测遇到的第一个问题 &lt;strong&gt;&amp;ldquo;卡&amp;rdquo;&lt;/strong&gt;，加载缓慢。这个问题，我也感受到了，我一直用的 Web 版本，刚开始的时候的确不够流畅。有人说这跟代理工具和节点有关，通过更换工具和节点解决。&lt;/p&gt;
&lt;h2 id=&#34;解析异常&#34;&gt;解析异常&lt;a class=&#34;headerlink&#34; href=&#34;#解析异常&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个 RSS 最核心的还是要能订阅并正常获取并解析订阅源的内容。这一点 Follow 给我的感觉不好。在订阅 &lt;a href=&#34;https://yuanfan.rbind.io/&#34;&gt;袁凡&lt;/a&gt; 老师的博客，就出现了无法正常解析。   &lt;br /&gt;
&lt;img alt=&#34;follow-earfanfan&#34; src=&#34;https://gi.weiyan.tech/2024/10/follow-earfanfan.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;同样的订阅，在 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/73&#34;&gt;QiReader&lt;/a&gt; 上却表现很好。   &lt;br /&gt;
&lt;img alt=&#34;qireader-earfanfan&#34; src=&#34;https://gi.weiyan.tech/2024/10/qireader-earfanfan.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;列表赚钱&#34;&gt;列表赚钱&lt;a class=&#34;headerlink&#34; href=&#34;#列表赚钱&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;之前为什么水军这么多到处发订阅列表，今天用了下才知道原来 RSS 列表真的可以赚钱。第一次见到这种创新，和之前的饥饿营销绝配了。然而阅读器本身做得不怎样。    &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;很同意这个评论，对于这一种赚钱方式，的确第一次见到。&lt;/p&gt;
&lt;h2 id=&#34;其他看法&#34;&gt;其他看法&lt;a class=&#34;headerlink&#34; href=&#34;#其他看法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在细节处理，希望这一款 &lt;strong&gt;Next-Gen Information Browser&lt;/strong&gt; 继续打磨。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;follow-joe-hou&#34; src=&#34;https://gi.weiyan.tech/2024/10/follow-joe-hou.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;92&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-92/</link>
      <pubDate>Tue, 29 Oct 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-92/</guid>
      
    </item>
    
    <item>
      <title>hisat2-build RAM 不足</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 96G RAM 的节点跑 T2T-CHM13v2.0 的 HISAT2 index 时候，发现任务居然被系统 Killed 掉了。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;排查一下才发现是因为 RAM 内存不够！    &lt;br /&gt;
&lt;img alt=&#34;hisat2-resource-usage-summary&#34; src=&#34;https://gi.weiyan.tech/2024/10/hisat2-resource.png&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: If you use &lt;a href=&#34;https://open.bioqueue.org/home/knowledge/showKnowledge/sig/hisat2-build#--snp&#34;&gt;&amp;ndash;snp&lt;/a&gt;, &lt;a href=&#34;https://open.bioqueue.org/home/knowledge/showKnowledge/sig/hisat2-build#--ss&#34;&gt;&amp;ndash;ss&lt;/a&gt;, and/or &lt;a href=&#34;https://open.bioqueue.org/home/knowledge/showKnowledge/sig/hisat2-build#--exon&#34;&gt;&amp;ndash;exon&lt;/a&gt;, hisat2-build will need about &lt;strong&gt;200 GB&lt;/strong&gt; RAM for the human genome size as index building involves a graph construction. Otherwise, you will be able to build an index on your desktop with 8GB RAM.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;https://open.bioqueue.org/home/knowledge/showKnowledge/sig/hisat2-build&#34;&gt;hisat2-build manual with usage examples | BioQueue Encyclopedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;91&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-91/</link>
      <pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-91/</guid>
      
    </item>
    
    <item>
      <title>Galaxy 平台 release_24.x 升级之路</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2024-10-18&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2024-10-18T00:00:00+00:00&#39;&gt;2024-10-18&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;记录一下 Galaxy 分析平台从 &lt;strong&gt;release_20.09&lt;/strong&gt; 升级到 &lt;strong&gt;release_24.0&lt;/strong&gt;，横跨九个发布版本的升级之路。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;为什么要升级&#34;&gt;为什么要升级&lt;a class=&#34;headerlink&#34; href=&#34;#为什么要升级&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;很主要的一个原因是随着新技术的更新，旧版本的使用可能会存在一些安全隐患，尤其对于提供互联网公开访问的平台。新版本的升级有助于捕获并应用所有先前的安全更新，以确保平台的安全性。&lt;/p&gt;
&lt;h2 id=&#34;版本选择&#34;&gt;版本选择&lt;a class=&#34;headerlink&#34; href=&#34;#版本选择&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最开始选择的是 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/releases/24.1_announce_user.html&#34;&gt;release_24.1&lt;/a&gt; 版本，但好不容易安装完成后才发现，这个新版本中增加了一个常规途径下无法隐藏的 &lt;strong&gt;Activity Bar Interface&lt;/strong&gt;，一时间无法忍受。
&lt;img alt=&#34;23.1-activity-bar&#34; src=&#34;https://gi.weiyan.tech/2024/10/23.1-activity-bar.png&#34; /&gt;   &lt;br /&gt;
&lt;img alt=&#34;galaxy-24.1&#34; src=&#34;https://gi.weiyan.tech/2024/10/galaxy-24.1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第二个原因是，后台 PostgreSQL 数据库的升级遇到了 &lt;a href=&#34;https://help.galaxyproject.org/t/database-upgrade-error/13687&#34;&gt;function gen_random_uuid() does not exist&lt;/a&gt; 异常，一下子没法解决也不想去升级 PostgreSQL 版本。&lt;/p&gt;
&lt;p&gt;所以，最终选择了从 &lt;strong&gt;release_20.09&lt;/strong&gt; 升级到次新的 &lt;strong&gt;release_24.0&lt;/strong&gt; 版本方案。&lt;/p&gt;
&lt;h2 id=&#34;安装系统环境&#34;&gt;安装系统环境&lt;a class=&#34;headerlink&#34; href=&#34;#安装系统环境&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这里以 release_24.1 作为示例，该环境要求同样适用于 release_24.0。&lt;/p&gt;
&lt;p&gt;Galaxy release_24.1 默认安装 node-v18.12.1，参考：&lt;code&gt;run.sh&lt;/code&gt; → &lt;code&gt;./scripts/common_startup_functions.sh&lt;/code&gt; → &lt;code&gt;./scripts/common_startup.sh&lt;/code&gt; → &lt;code&gt;nodeenv -n &#34;$NODE_VERSION&#34; -p&lt;/code&gt; 的安装代码。&lt;/p&gt;
&lt;p&gt;node-v18.12.1 下载地址：&lt;a href=&#34;https://nodejs.org/download/release/v18.12.1/&#34;&gt;https://nodejs.org/download/release/v18.12.1/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;node-v18.12.1 要求 g++ 8.3.0 or clang++ 8.0.0：  &lt;br /&gt;
&lt;img alt=&#34;node-v18.12.1-gcc&#34; src=&#34;https://gi.weiyan.tech/2024/10/node-v18.12.1-gcc.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以通过安装 Devtoolset 的方式解决：    &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手动调整  CentOS 7 的 SCL YUM 源（也可以 yum 安装），注意变更 &lt;code&gt;baseurl&lt;/code&gt; 为阿里云或者其他的源链接。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 会默认在 /etc/yum.repos.d 下生成 2 个 repo 源文件&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# CentOS-SCLo-scl.repo&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# CentOS-SCLo-scl-rh.repo&lt;/span&gt;
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;centos-release-scl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;centos-release-scl-rh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;更新 yum 源的缓存。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/yum.repos.d
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;makecache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;安装 scl-utils，scl-utils 是管理 SCL (Software Collection) 环境设置和运行软件的一套软件工具。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scl-utils
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;安装 devtoolset-9。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;devtoolset-9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;激活 devtoolset-9。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-9/enable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;python-环境&#34;&gt;Python 环境&lt;a class=&#34;headerlink&#34; href=&#34;#python-环境&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Galaxy 要求 Python &amp;gt;= 3.8，node-v18.12.1 要求 3.6&amp;lt;=Python&amp;lt;=3.10，这里选择 Python-3.9.18，安装如下。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz
tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-3.9.18.tgz
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-3.9.18
&lt;span class=&#34;nv&#34;&gt;$enabledevtoolset9&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TCLTK_LIBS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/home/shenweiyan/software/tcltK-8.5.19/lib -ltcl8.5 -ltk8.5&#34;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TCLTK_CFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/home/shenweiyan/software/tcltK-8.5.19/include&#34;&lt;/span&gt;
./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--enable-optimizations&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/python-3.9.18&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-openssl&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-tcltk-includes&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/home/shenweiyan/software/tcltK-8.5.19/include&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-tcltk-libs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/home/shenweiyan/software/tcltK-8.5.19/lib -ltcl8.5 -ltk8.5&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-j&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Python-3.9.18 安装完成后，避免 &lt;code&gt;ssl&lt;/code&gt; 模块无法正常 &lt;code&gt;import&lt;/code&gt; 使用，需要在环境中增加以下设置。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;node-环境&#34;&gt;Node 环境&lt;a class=&#34;headerlink&#34; href=&#34;#node-环境&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Galaxy 的 &lt;code&gt;sh run.sh&lt;/code&gt; 默认通过 &lt;code&gt;ssl&lt;/code&gt; 的方式安装已经提前编译好的 node-v18.12.1-linux-x64.tar.gz（直接解压即可使用），对于系统版本比较低的服务器（如 CentOS 7）会存在 GLIBC 异常，因此需要调整为 &lt;code&gt;ignore_ssl_certs&lt;/code&gt; 的下载方式 + source 源码安装的方式安装 node-v18.12.1。   &lt;br /&gt;
&lt;img alt=&#34;nodeenv--help&#34; src=&#34;https://gi.weiyan.tech/2024/10/nodeenv-help.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;所以，最终的方法为调整 &lt;code&gt;./scripts/common_startup.sh&lt;/code&gt; 中 &lt;code&gt;nodeenv -n &#34;$NODE_VERSION&#34; -p&lt;/code&gt; 的安装代码如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nodeenv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-n&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$NODE_VERSION&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--source&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--ignore_ssl_certs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--jobs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;node-v18.12.1 下载地址：&lt;a href=&#34;https://nodejs.org/download/release/v18.12.1/&#34;&gt;https://nodejs.org/download/release/v18.12.1/&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;由于编译非常耗时（4核8G 的服务器编译了 1 个小时左右），且对 Python 版本有要求，建议手动安装，具体安装步骤如下。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;shenweiyan@centos-vm-7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;:30:34&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/src/node-v18.12.1
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/node-v18.12.1
Node.js&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configure:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.11.6...
Please&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;use&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3.10&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3.9&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3.8&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3.6.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://nodejs.org/download/release/v18.12.1/node-v18.12.1.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;node-v18.12.1.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;node-v18.12.1
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-9/enable
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/node-v18.12.1
Node.js&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configure:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.9.18...
INFO:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;completed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-j&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;yarn-环境&#34;&gt;Yarn 环境&lt;a class=&#34;headerlink&#34; href=&#34;#yarn-环境&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;注意要先设置 &lt;code&gt;npm&lt;/code&gt; 的路径，如果有多个版本的 &lt;code&gt;npm&lt;/code&gt;，会因为版本混乱导致语法异常。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/node-v18.12.1/bin:&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;
/home/shenweiyan/software/node-v18.12.1/bin/npm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;yarn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;pip-源&#34;&gt;pip 源&lt;a class=&#34;headerlink&#34; href=&#34;#pip-源&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Galaxy 在安装 &lt;code&gt;requirements.txt&lt;/code&gt; 的时候默认使用下面两个源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wheels.galaxyproject.org/simple&#34;&gt;https://wheels.galaxyproject.org/simple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pypi.python.org/simple&#34;&gt;https://pypi.python.org/simple&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于国内服务器，可以考虑更换为阿里云或者清华大学的 pip 源。可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;scripts/common_startup.sh&lt;/code&gt; 中修改：
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PYPI_INDEX_URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://mirrors.aliyun.com/pypi/simple/&#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;requirements.txt&lt;/code&gt; 头部增加：
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-i&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://mirrors.aliyun.com/pypi/simple/
--extra-index-url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://wheels.galaxyproject.org/simple
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;数据库升级&#34;&gt;数据库升级&lt;a class=&#34;headerlink&#34; href=&#34;#数据库升级&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是本次 Galaxy 核心版本升级时候遇到的最大问题。&lt;/p&gt;
&lt;p&gt;由于 Galaxy 在 release_21.05 新增加了一个 &lt;a href=&#34;https://github.com/galaxyproject/galaxy/pull/11914&#34;&gt;&lt;code&gt;history_audit&lt;/code&gt;&lt;/a&gt; 数据表，release_20.09 的数据库直接执行 &lt;code&gt;sh manage_db.sh upgrade&lt;/code&gt; 升级的时候 &lt;code&gt;history_audit&lt;/code&gt; 数据表并不会一并创建和更新，因此最终导致在 Galaxy 服务启动的时候发生错误。&lt;/p&gt;
&lt;p&gt;这应该是数据库升级时候的一个bug，经过摸索发现，目前可以参考下面的文章，通过分步升级的方式解决。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/arRZ-3mMrpUIsXYuqg4sGQ&#34;&gt;https://mp.weixin.qq.com/s/arRZ-3mMrpUIsXYuqg4sGQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上解决方法，参考：&lt;a href=&#34;https://github.com/galaxyproject/galaxy/issues/19016&#34;&gt;galaxyproject/galaxy #19016&lt;/a&gt;   &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;galaxy-issues-19016&#34; src=&#34;https://gi.weiyan.tech/2024/10/galaxy-issues-19016.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;a class=&#34;headerlink&#34; href=&#34;#总结&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;更新后的 release_24.0 界面看起来比旧版本要更加清爽舒服一些，各个页面的汉化功能也有所改善，新增的 Notifications 功能也挺不错，总之升级之后各个方面还是挺满意的，其他细节和功能还在体验中。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;90&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/other/2024-10-18-Galaxy-%E5%B9%B3%E5%8F%B0-release-24-x-%E5%8D%87%E7%BA%A7%E4%B9%8B%E8%B7%AF-dis90/</link>
      <pubDate>Fri, 18 Oct 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/other/2024-10-18-Galaxy-%E5%B9%B3%E5%8F%B0-release-24-x-%E5%8D%87%E7%BA%A7%E4%B9%8B%E8%B7%AF-dis90/</guid>
      
    </item>
    
    <item>
      <title>上下班听广播</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;自从切换了电动车的通勤方式，同时就打开了广播的大门。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;hello-morning&#34; src=&#34;https://gi.weiyan.tech/2024/09/hello-morning.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;符合自己兴趣的电台不好找，尤其是下午下班的这段时间。&lt;/p&gt;
&lt;h2 id=&#34;珠江第一线&#34;&gt;珠江第一线&lt;a class=&#34;headerlink&#34; href=&#34;#珠江第一线&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;珠江第一线，朝朝陪你饮早茶！&lt;/p&gt;
&lt;p&gt;早上的选择中个人尤其喜欢珠江经济台的《珠江第一线》，它的播出时间是周一到周五的 07:30-09:00，是珠江经济台重点打造的一档粤语民生新闻名牌节目，李嘉、淼钧、郑达等一众名嘴的组合，加上独具的广府文化韵味，针砭时弊，作风硬朗，嬉笑怒骂，亦庄亦谐，让人在上班的路上更加放松。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;《珠江第一线》开播之时，就在广东广播界率先提出“打造听众上班路上的新闻资讯大餐”的口号。节目立足民生视觉，着重在内容碎片化上下功夫，让海量资讯更有层次感，更适合伴随性收听的人群；另外增加生活化话题、软性资讯，讲老百姓身边的故事，塑造老百姓“贴心老友”节目品牌形象；同时强化新闻时评的针对性，聘请最强广播评论专家团队，与市民评论员联袂，每天对社会热点话题进行精辟点评；节目主持人也一改传统的新闻节目播报方式，使用个性化的“说新闻”，节目过程还不时插播上班路上的交通、天气状况，使节目更接地气，更具亲和力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;放工路上&#34;&gt;放工路上&lt;a class=&#34;headerlink&#34; href=&#34;#放工路上&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下班时间段的选择，要说十分喜欢的节目目前没找到，虽然会听同样是珠江经济台的《珠江晚高峰》，但找不到《珠江第一线》的舒适感。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;89&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-89/</link>
      <pubDate>Sun, 29 Sep 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-89/</guid>
      
    </item>
    
    <item>
      <title>All in one</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;写笔记，做表格的很多时候，总有一个 All in one 的魔咒在脑海挥之不去，以前用语雀就想当然 All in yuque，后来又想着 All in GitHub，但现实终究是现实。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;没有十全十美的平台，语雀就没有邮箱、日历之类的功能；小记也没有浮墨笔记那么好用。&lt;/p&gt;
&lt;p&gt;GitHub 虽好，但始终有一堵长城横亘在前面，时时刻刻提醒着你小心翼翼。&lt;/p&gt;
&lt;p&gt;现在的飞书，各种功能都很齐全，但是不能实时查看文档的 Markdown，自己也没有能力去造这样一个轮子。有很多的时候，都有一个 All in feishu 的魔咒的诱惑着我，但又一次一次被它的木桶理论劝退。&lt;/p&gt;
&lt;p&gt;知识的沉淀，对于承受的载体没有什么是可以从一而终一成不变的，很多东西虽然分散，但也印证了不要把所有的鸡蛋放进一个篮子。逐渐的，我用上了飞书国际版的邮箱，我用上了语雀（小记/知识库）来记录我的一些碎片想法和文字，最终还是选择 GitHub 来记录这一切。&lt;/p&gt;
&lt;p&gt;不得不说，GitHub 真是个码字的好地方。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;88&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-88/</link>
      <pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-88/</guid>
      
    </item>
    
    <item>
      <title>GCC 版本不一致导致的 R magick 包安装错误</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在安装 Y 叔的 &lt;code&gt;yyplot&lt;/code&gt; 时候，发现 &lt;code&gt;magick&lt;/code&gt; 依赖包安装的时候的一些棘手问题，特此记录一下。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;r-403-安装&#34;&gt;R-4.0.3 安装&lt;a class=&#34;headerlink&#34; href=&#34;#r-403-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install_github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;GuangchuangYu/yyplot&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;successfully&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unpacked&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MD5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sums&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;checked&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;using&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;staged&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installation&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Magick&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;was&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;not&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path.&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Perhaps&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;you&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;should&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;containing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;`&lt;span class=&#34;n&#34;&gt;Magick&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;+.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pc&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;to the PKG_CONFIG_PATH environment variable&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;No package &#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Magick&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39; found&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;Using PKG_CFLAGS=&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;Using PKG_LIBS=-lMagick++-6.Q16 -lMagickWand-6.Q16 -lMagickCore-6.Q16&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;--------------------------- [ANTICONF] --------------------------------&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;Configuration failed to find the Magick++ library. Try installing:&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt; - deb: libmagick++-dev (Debian, Ubuntu)&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt; - rpm: ImageMagick-c++-devel (Fedora, CentOS, RHEL)&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt; - brew: imagemagick or imagemagick@6 (MacOS)&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;If Magick++ is already installed, check that &#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39; is in your&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;PATH and PKG_CONFIG_PATH contains a Magick++.pc file. If pkg-config&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;is unavailable you can set INCLUDE_DIR and LIB_DIR manually via:&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;R CMD INSTALL --configure-vars=&#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INCLUDE_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LIB_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;-------------------------- [ERROR MESSAGE] ---------------------------&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;&amp;lt;stdin&amp;gt;:1:22: fatal error: Magick++.h: No such file or directory&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;compilation terminated.&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;--------------------------------------------------------------------&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;ERROR: configuration failed for package ‘magick’&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;* removing ‘/home/shenweiyan/software/R/R-4.0.3/lib64/R/library/magick’&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;Error: Failed to install &#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;yyplot&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt; from GitHub:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;converted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;had&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;non&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;quit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Save&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;仅在 Bash 环境配置了 &lt;code&gt;PATH&lt;/code&gt; 和 &lt;code&gt;PKG_CONFIG_PATH&lt;/code&gt; 是不够的，安装过程会提示动态库的问题。  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# export PATH=/home/shenweiyan/software/ImageMagick-7.0.10/bin:$PATH
# export PKG_CONFIG_PATH=/home/shenweiyan/software/ImageMagick-7.0.10/lib/pkgconfig:$PKG_CONFIG_PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install_github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;GuangchuangYu/yyplot&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lazy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loading&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;***&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;indices&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;building&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;indices&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vignettes&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;can&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;be&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loaded&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;temporary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;location&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;failed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;dyn.load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DLLpath&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DLLpath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;/home/shenweiyan/software/R/R-4.0.3/lib64/R/library/00LOCK-magick/00new/magick/libs/magick.so&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;libMagick&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;-7&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.Q16HDRI.so.4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;No&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;such&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loading&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;failed&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Execution&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;halted&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loading&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;failed&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;removing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;home&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shenweiyan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;software&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;-4.0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’
&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Failed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;yyplot&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GitHub&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;converted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;‘&lt;span class=&#34;n&#34;&gt;magick&lt;/span&gt;’&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;had&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;non&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;quit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Save&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
最终解决方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;手动安装 &lt;code&gt;ggimage_0.3.1&lt;/code&gt;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;http://cran.r-project.org/src/contrib/Archive/ggimage/ggimage_0.3.1.tar.gz&#39;&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;install.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repos&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;source&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置必要环境。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/ImageMagick-7.0.10/bin:&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/ImageMagick-7.0.10/lib/pkgconfig:&lt;span class=&#34;nv&#34;&gt;$PKG_CONFIG_PATH&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/ImageMagick-7.0.10/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装。根据提示，先安装缺失的 &lt;code&gt;meme&lt;/code&gt; 包，然后再安装 &lt;code&gt;yyplot&lt;/code&gt;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;repos&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CRAN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;meme&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install_github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;GuangchuangYu/yyplot&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;r-430-安装&#34;&gt;R-4.3.0 安装&lt;a class=&#34;headerlink&#34; href=&#34;#r-430-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;R-4.3.0 安装 &lt;code&gt;magick_2.8.4&lt;/code&gt; 会出现 &lt;a href=&#34;https://github.com/ropensci/magick/issues/166&#34;&gt;ropensci/magick#166&lt;/a&gt; 的问题。根据 &lt;a href=&#34;https://github.com/ropensci/magick/issues/166#issuecomment-457875591&#34;&gt;ropensci/magick#166#issuecomment-457875591&lt;/a&gt; 的描述，&lt;strong&gt;编译 ImageMagick 的 gcc 需要跟编译 R 的 gcc 保持版本一致&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;重新编译安装 ImageMagick
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.imagemagick.org/archive/releases/ImageMagick-7.0.10-24.tar.xz
extract&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ImageMagick-7.0.10-24.tar.xz
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ImageMagick-7.0.10-24
./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/gcc-7.3.0/bin/gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CXX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/gcc-7.3.0/bin/g++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/ImageMagick-7.0.10-24
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 &lt;code&gt;magick&lt;/code&gt; 包
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# export PATH=/home/shenweiyan/software/ImageMagick-7.0.10-24/bin:$PATH&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# export PKG_CONFIG_PATH=/home/shenweiyan/software/ImageMagick-7.0.10-24/lib/pkgconfig:$PKG_CONFIG_PATH&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# export LD_LIBRARY_PATH=/home/shenweiyan/software/ImageMagick-7.0.10-24/lib:$LD_LIBRARY_PATH&lt;/span&gt;
/home/shenweiyan/software/R/R-4.3.0/bin/R
&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;options&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;repos&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;c&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CRAN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install.packages&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;magick&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;根据提示，先安装缺失的 &lt;code&gt;meme&lt;/code&gt; 包，然后再安装 &lt;code&gt;yyplot&lt;/code&gt;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;repos&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CRAN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#39;meme&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remotes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;install_github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;GuangchuangYu/yyplot&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;87&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-87/</link>
      <pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-87/</guid>
      
    </item>
    
    <item>
      <title>Linux 下 PostgreSQL 源码编译安装</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;PostgreSQL 是一个功能强大的开源对象关系数据库管理系统(ORDBMS)，它从伯克利写的 POSTGRES 软件包发展而来（1995 年几个 UCB 的学生为 Post-Ingres 开发了 SQL 的接口，正式发布了 PostgreSQL95，随后一步步在开源社区中成长起来），经过十几年的发展， PostgreSQL 已经成为世界上发展最快最受欢迎的数据库系统之一。&lt;/p&gt;
&lt;p&gt;本文章主要介绍在 CentOS 下源码编码安装 PostgreSQL-10.0 的一些简单步骤，以供参考。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;1-新增用户组及用户&#34;&gt;1. 新增用户组及用户&lt;a class=&#34;headerlink&#34; href=&#34;#1-新增用户组及用户&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PostgreSQL 默认是通过 &lt;code&gt;postgres:postgres&lt;/code&gt; 来启动和使用的，因此在安装 PostgreSQL 前需要先创建 &lt;code&gt;postgres&lt;/code&gt; 用户组及 &lt;code&gt;postgres&lt;/code&gt; 用户。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 在root权限下进行&lt;/span&gt;
groupadd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgres&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 添加postgres用户组&lt;/span&gt;
useradd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgres&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-g&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgres&lt;span class=&#34;w&#34;&gt;         &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 添加postgres用户&lt;/span&gt;
passwd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgres&lt;span class=&#34;w&#34;&gt;                      &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 设置postgres用户密码&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;2-安装&#34;&gt;2. 安装&lt;a class=&#34;headerlink&#34; href=&#34;#2-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ wget https://ftp.postgresql.org/pub/source/v10.0/postgresql-10.0.tar.gz
$ tar zvxf postgresql-10.0.tar.gz
$ cd postgresql-10.0
$ ./configure --prefix=/data/softwares/pgsql
$ make
$ make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解决依赖：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;FAQ1：configure: error: readline library not found
$ yum install readline-devel

FAQ2：configure: error: zlib library not found
$ yum install zlib-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;3-启动&#34;&gt;3. 启动&lt;a class=&#34;headerlink&#34; href=&#34;#3-启动&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;＃ 新建数据库数据文件目录
$ mkdir /data/softwares/pgsql/data

# 新建数据库 log 文件目录
$ mkdir /data/softwares/pgsql/log

# 修改目录拥有者
$ chown postgres:postgres /data/softwares/pgsql/data -R
$ chown postgres:postgres /data/softwares/pgsql/log -R

# 执行数据库初始化脚本
$ su postgres
$ /data/softwares/pgsql/bin/initdb --encoding=utf8 -D /data/softwares/pgsql/data

# 启动 PostgreSQL 服务
$ /data/softwares/pgsql/bin/pg_ctl -D /data/softwares/pgsql/data -l /data/softwares/pgsql/log/postgresql.log start    #postgres 用户下执行

# 登录 PostgreSQL 数据库
$ psql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;psql-db-list&#34; src=&#34;https://gi.weiyan.tech/2024/09/psql-db-list.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-重启&#34;&gt;4. 重启&lt;a class=&#34;headerlink&#34; href=&#34;#4-重启&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ su postgres
$ /data/softwares/pgsql/bin/pg_ctl -D /data/softwares/pgsql/data -l /data/softwares/pgsql/log/postgresql.log restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;5-设置开机启动&#34;&gt;5. 设置开机启动&lt;a class=&#34;headerlink&#34; href=&#34;#5-设置开机启动&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;解压后的 postgresql-x.x.x 下提供了基于 freebsd、linux、osx 3 个系统的 &lt;code&gt;postgresql&lt;/code&gt; 启动命令。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1）对于通过源码自定义安装的 pgsql，需要修改相关启动脚本：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql-10.0/postgresql-10.0/contrib/start-scripts
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;vi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linux
......
......
&lt;span class=&#34;c1&#34;&gt;# Installation prefix&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/data/softwares/pgsql

&lt;span class=&#34;c1&#34;&gt;# Data directory&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;PGDATA&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/data/softwares/pgsql/data&#34;&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# Who to run the postmaster as, usually &#34;postgres&#34;.  (NOT &#34;root&#34;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;PGUSER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;postgres

&lt;span class=&#34;c1&#34;&gt;# Where to keep a log file&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;PGLOG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PGDATA&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/serverlog&#34;&lt;/span&gt;
......
......
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2）设置数据库开机启动：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/softwares/source/postgresql-10.0/postgresql-10.0/contrib/start-scripts/linux&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/init.d/postgresql

&lt;span class=&#34;c1&#34;&gt;# 添加执行权限&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chmod&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a+x&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/init.d/postgresql

&lt;span class=&#34;c1&#34;&gt;# 添加至开机启动&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chkconfig&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chkconfig&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;on
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3）查看 postgresql 状态&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;service&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;status
pg_ctl:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PID:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;32586&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
/data/softwares/pgsql/bin/postgres&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-D&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/data/softwares/pgsql/data&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;6-禁止管理员空密码登录&#34;&gt;6. 禁止管理员空密码登录&lt;a class=&#34;headerlink&#34; href=&#34;#6-禁止管理员空密码登录&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 PostgreSQL 中，如果你想禁止管理员（通常是 &lt;code&gt;postgres&lt;/code&gt; 用户）使用空密码登录（正常情况下 &lt;code&gt;postgres&lt;/code&gt; 用户可以直接使用 &lt;code&gt;psql&lt;/code&gt; 命令直接登录 PostgreSQL），你可以通过修改 &lt;code&gt;pg_hba.conf&lt;/code&gt; 文件来实现。&lt;/p&gt;
&lt;p&gt;第一步，找到你的 &lt;code&gt;pg_hba.conf&lt;/code&gt; 文件。这个文件通常位于 PostgreSQL 的数据目录中，例如 &lt;code&gt;/var/lib/pgsql/data&lt;/code&gt; 或 &lt;code&gt;/etc/postgresql/&amp;lt;version&amp;gt;/main&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第二步，修改 &lt;code&gt;pg_hba.conf&lt;/code&gt; 文件，将管理员的登录方式从 &lt;code&gt;trust&lt;/code&gt; 更改为 &lt;code&gt;md5&lt;/code&gt; 或 &lt;code&gt;password&lt;/code&gt;。这意味着所有连接，包括 &lt;code&gt;postgres&lt;/code&gt; 用户的，都需要提供密码。&lt;/p&gt;
&lt;p&gt;例如，将以下行：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;local   all             postgres                                trust
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;修改为：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;local   all             postgres                                md5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第三步，重新加载或重启 PostgreSQL 服务以应用更改。&lt;/p&gt;
&lt;p&gt;重新加载配置的命令通常是：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pg_ctl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;或者重启服务：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;restart&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;或者在不同的系统中可能是：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;postgresql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;完成这些步骤后，&lt;code&gt;postgres&lt;/code&gt; 用户将不能再使用空密码登录数据库。其他用户如果想登录数据库，也需要提供密码。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;86&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-86/</link>
      <pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-86/</guid>
      
    </item>
    
    <item>
      <title>R 包安装指定 GCC 和 G++ 并开启 C++11 支持</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;如果你的 R 是使用比较低版本的 GCC（如 Red Hat 6.5 + GCC/G++ 4.4.7），但安装的 R 包需要开启 C++11 支持，或者需要更高版本的 GCC 和 G++，可以参考一下这个方法。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;首先，在 &lt;code&gt;home&lt;/code&gt; 目录创建一个 &lt;code&gt;~/.R/Makevars&lt;/code&gt; 文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/.R
vi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/.R/Makevars
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后，在 &lt;code&gt;Makevars&lt;/code&gt; 文件中加入以下内容。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nv&#34;&gt;CXX11&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/root/usr/bin/g++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-std&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;c++11&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fPIC
&lt;span class=&#34;nv&#34;&gt;CXX14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/rh/devtoolset-7/root/usr/bin/g++
&lt;span class=&#34;nv&#34;&gt;CXX14FLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-g&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-O2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;LTO&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;CXX14PICFLAGS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fpic
&lt;span class=&#34;nv&#34;&gt;CXX14STD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-std&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gnu++14
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后，重新打开 R，执行对应包安装。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nf&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;repos&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CRAN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;install.packages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;gridtext&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;install-packages-gridtext&#34; src=&#34;https://gi.weiyan.tech/2024/08/install-packages-gridtext.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/wilkelab/gridtext/issues/7&#34;&gt;ERROR: compilation failed for package &amp;lsquo;gridtext&amp;rsquo; - wilkelab/gridtext#7&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;85&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-85/</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-85/</guid>
      
    </item>
    
    <item>
      <title>诛仙</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;闲来看剧，无意中在腾讯视频看了几集《诛仙》动漫，虽然个别人物在建模还不算特别满意，但总体还是很不错，而且冲着对原著的高度还原，瞬间有种入坑不能自拔的感觉。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;第一次接触诛仙小说应该也是十几年前的事情，高一高二一度沉迷网络小说，一发不可收拾，断断续续的看了不少。惊叹于作者对于诛仙世界架构和故事逻辑，主副线也很完整，人物鲜活丰满，而且文笔也不错。最引人瞩目的当属主人公的感情纠葛，碧瑶的虽死不悔的爱，陆雪琪的温婉素雅和为了张小凡的付出都是让那时的我特别特别感动的，从当时来说，诛仙确实是非常可以带给人一种震撼的感觉的。      &lt;/p&gt;
&lt;p&gt;如今从动漫入局，又把原小说看了一遍，梦回青春年少的仙侠错觉，总有种说不清道不明的神奇滋味。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;84&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-84/</link>
      <pubDate>Tue, 20 Aug 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-84/</guid>
      
    </item>
    
    <item>
      <title>解决 GitHub 提交次数多导致仓库体积过大的问题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;提交代码要控制节奏，不能随心所欲，尤其是团队协作开发。如果发现 &lt;code&gt;.git&lt;/code&gt; 目录太大，推荐使用 Git LFS 来管理大文件。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;参考以下几篇文章的解决方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/chengxy-nds/p/17306115.html&#34;&gt;被吐槽 GitHub仓 库太大，直接 600M 瘦身到 6M，这下舒服了&lt;/a&gt; - 博客园&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zhihu.com/question/29769130&#34;&gt;如何解决 GitHub 提交次数过多 .git 文件过大的问题？&lt;/a&gt; - 知乎&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;完全重建版本库&#34;&gt;完全重建版本库&lt;a class=&#34;headerlink&#34; href=&#34;#完全重建版本库&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rm&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;.git
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;init.defaultBranch&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;main
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;init
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--all
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;commit&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-m&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Initial commit&#34;&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;remote&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;origin&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://&amp;lt;github_token&amp;gt;@github.com/shenweiyan/Digital-Garden.git
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;push&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-u&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;origin&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;83&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-83/</link>
      <pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-83/</guid>
      
    </item>
    
    <item>
      <title>巴黎奥运</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2024 年的巴黎奥运会各项比赛正在如火如荼进行，但是在个人感官上，这一届的奥运会热度好像有点低。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;对于开幕式，有两点切身的感受比较深刻。一个是时间定于 7 月 27 日（星期六）凌晨，第二个是可以在电影院观看 2024 年巴黎奥运会开幕式直播。这些信息基于都是来源于自己在上班路上的听广播习惯，广州可进行奥运会开幕式观影预约的影院仅有 4 家，但需要达到最低拼场人数才可 &amp;ldquo;开团&amp;rdquo;！&lt;/p&gt;
&lt;p&gt;作为史上第一次把开幕式放在室外搞，也是首次摈弃以往步行进入体育场的传统，让运动员乘船沿着巴黎的&amp;rdquo;主干道&amp;rdquo; ——塞纳河前进。这届奥运会的确有点别出心裁。个人对于开幕式并没有什么特别值得期待的，也就事后通过各种短视频看了一下中国代表团出场、点燃圣火，以及其他零零散散的一些画面，感觉相比上一届的日本奥运会，巴黎奥运会给人印象更加深刻，文化底蕴、开放性、包容性都很不错，但也不可否认开幕式过后的各种两极分化评论，这的确也是争议性相当大的异常奥运会。&lt;/p&gt;
&lt;p&gt;奥运会最大的看点还是比赛。作为四年难得一遇的体育盛宴，各项赛程都很吸引人。&lt;/p&gt;
&lt;p&gt;个人最大的期待，还是在于羽毛球，小组赛的赛程也追了很多场，接下来依旧值得期待。跳水、游泳、排球、篮球，时间允许下肯定也是不能错过的。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;记录一下那些自己看过的一些赛事，为这个夏天的运动健儿们加油。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;7 月 28 - 19:30 - 周日  篮球 | 女子小组赛 - A组(1)：西班牙（90） VS 中国（89）   &lt;br /&gt;
  没顶住！女篮首战憾负西班牙！     &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;7 月 29 - 21:40 - 周一  羽毛球 | 男子双打小组赛 - D组(5)：丹麦（2） VS 中国（0）        &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/badminton-0729.png&#39; width=600 alt=&#39;badminton-0729&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;7 月 30 - 20:30 - 周二 乒乓球 | 混合双打金牌赛：中国（4） VS 朝鲜（2）   &lt;br /&gt;
  乒乓球中国的首个奥运混双金牌！终于到手！   &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/ping-pong-china-korea-2024.jpg&#39; width=600 alt=&#39;ping-pong-china-korea-2024&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;7 月 30 - 21:40 - 周二 羽毛球 | 男子双打小组赛 - D组(8)：中国（2） VS 日本（0）   &lt;br /&gt;
  保木卓朗/小林优吾 vs  欧烜屹/刘雨辰，图欧组合终于赢了，不容易。     &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;7 月 31 - 19:30 - 周三 篮球 | 女子小组赛 - A组(4)：塞尔维亚（81） VS 中国（59）   &lt;br /&gt;
  两连败！中国女篮22分惨负塞尔维亚，看的揪心，后面两节完全被碾压！   &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/basketball-0731.png&#39; width=600 alt=&#39;basketball-0731&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 1 - 19:00 - 周四 羽毛球 | 男子双打1/4决赛(2)：中国（2） VS 印尼（0）       &lt;br /&gt;
  梁王（梁伟铿/王昶） 2 比 0 胜双阿（阿尔菲安/阿迪安托），晋级巴黎奥运会 4 强！   &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/badminton-lw-paris-2024.jpg&#39; width=600 alt=&#39;badminton-lw-paris-2024&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 1 - 21:20 - 周四 羽毛球 | 男子单打16强赛(5)：中国（0） VS 新加坡（2）  &lt;br /&gt;
  李诗沣 0 比 2 不敌骆建佑，脑子不够叠加勇气不够，战术执行不起来，输得不冤。。。  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 2 - 22:10 - 周五 羽毛球 | 混合双打金牌赛：中国（2）VS 韩国（0）      &lt;br /&gt;
  雅思组合（黄雅琼/郑思维）2:0 胜韩国金银组合（金元昊/郑那银），成就大满贯，圆梦巴黎！这场决赛不得不说，郑思维状态是真的好，打疯了！    &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/zheng-huang-paris-gold.jpg&#39; width=600 alt=&#39;zheng-huang-paris-gold&#39;&gt;    &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 3 - 00:45 - 周六 羽毛球 | 男子单打1/4决赛(2)  &lt;br /&gt;
  爆冷，石宇奇 0-2 昆拉武特·威提讪，无缘羽毛球男单四强。第一次熬夜看的比赛，石头状态不好，战术上完全被压制，真的破防了！         &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/badminton-shiyuqi-paris-2024.jpg&#39; width=600 alt=&#39;badminton-shiyuqi-paris-2024&#39;&gt;     &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 3 - 22:10 - 周六 羽毛球 | 女子双打金牌赛：中国（2）VS 中国（0）   &lt;br /&gt;
  凡尘组合（陈清晨/贾一凡）2:0 圣坛组合（谭宁/刘圣书），正如赛后她们身披国旗大喊 &lt;strong&gt;&amp;ldquo;中国女双第一&amp;rdquo;&lt;/strong&gt;！   &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/badminton-women-gold-paris-2024.jpg&#39; width=600 alt=&#39;badminton-women-gold-paris-2024&#39;&gt;      &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 4 - 20:30 - 周日 乒乓球 | 男子单打金牌赛  &lt;br /&gt;
  4-1！樊振东击败莫雷加德勇夺男单冠军，成国乒第11位大满贯得主！  &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/fanzhendong-gold-paris-2024.webp&#39; width=600 alt=&#39;fanzhendong-gold-paris-2024&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 月 4 - 22:30 - 周日 羽毛球 | 男子双打金牌赛   &lt;br /&gt;
  梁王组合（王昶/梁伟铿）1-2 惜败羚羊组合（李洋/王齐麟），遗憾摘银。接发球失误太多，加上随意挑战，顶着夺冠压力和政治压力打到决胜局的 19-21，也算尽力了！   &lt;br /&gt;
  &lt;img src=&#39;https://gi.weiyan.tech/2024/08/badminton-lw-silver-paris-2024.jpg&#39; width=600 alt=&#39;badminton-lw-silver-paris-2024&#39;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;82&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-82/</link>
      <pubDate>Mon, 29 Jul 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-82/</guid>
      
    </item>
    
    <item>
      <title>寒冬将至</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;经济不景气，就像一股寒风，吹得人心颤颤，市场更是进入严冬，就业、消费和投资都变得如履薄冰。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;从最近身边的很多人身上，由于大环境不景气带来的裁员比比皆是，IVD 行业、生信行业订单以肉眼可见的速度越来越少，小公司首先扛不住开启裁员，大公司从考核到绩效各种手段轮番上阵。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#39;https://gi.weiyan.tech/2024/07/you-are-fired.webp&#39; width=600&gt;&lt;/p&gt;
&lt;p&gt;好一点的公司 N+1 赔偿，但凤毛麟角；次一点的公司礼仪性的赔偿 1、2 个月的工资；更多的是领完当月工资走人；更有甚者，老板跑路，变相裁人的 ......&lt;/p&gt;
&lt;p&gt;裁人失业年年有，今年的暴风雨可能会更加猛烈些。铁打的营盘，流水的兵，除了比比谁更卷，还是要多思考一下自身的选择和规划。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;81&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-81/</link>
      <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-81/</guid>
      
    </item>
    
    <item>
      <title>晒桌面</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;文艺男青年对于烟火气息的干净整洁桌面总有一种迷之吸引，热衷于各种晒桌面带来的解压感，其中的细节让我觉得这才是生活应该有的部分，尤其在这样的桌面上摆上各种我喜欢的影音娱乐设备，更能点亮我的生活。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;80&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-80/</link>
      <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-80/</guid>
      
    </item>
    
    <item>
      <title>Python 陷阱之 strip、lstrip、rstrip 可以删除比预期更多的内容</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;本文章内容来源于 《&lt;a href=&#34;https://andrewwegner.com/python-gotcha-strip-functions-unexpected-behavior.html&#34;&gt;Python Gotcha: strip, lstrip, rstrip can remove more than expected&lt;/a&gt;》，由作者翻译，仅供个人学习使用，如有内容侵犯了你的权益，请联系管理员删除相关内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;a class=&#34;headerlink&#34; href=&#34;#介绍&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作为一名软件工程师，你处理过不少脏字符串。删除用户输入中的前导或尾随空格可能是最常见的工作之一。&lt;/p&gt;
&lt;p&gt;在 Python 中，这是通过 &lt;code&gt;.strip()&lt;/code&gt; 、 &lt;code&gt;.lstrip()&lt;/code&gt; 或 &lt;code&gt;.rstrip()&lt;/code&gt; 函数完成的，通常如下所示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;     Andrew Wegner     &#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;andrew wegner&#39;&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;     Andrew Wegner     &#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lstrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;andrew wegner     &#39;&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;     Andrew Wegner     &#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rstrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;     andrew wegner&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;这非常简单，并且没有什么意外的事情发生。&lt;/p&gt;
&lt;h2 id=&#34;陷阱&#34;&gt;陷阱&lt;a class=&#34;headerlink&#34; href=&#34;#陷阱&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;陷阱在于，这些函数中的每一个都可以接受一个要删除的字符列表。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Andrew Wegner&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rstrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34; wegner&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;and&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;发生了什么？为什么结果不只是：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;s1&#34;&gt;&#39;andrew&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;解释&#34;&gt;解释&lt;a class=&#34;headerlink&#34; href=&#34;#解释&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;再次仔细阅读文档中的这行说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A list of &lt;strong&gt;characters&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不是字符串列表 (Not a list of strings.)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.python.org/3/library/stdtypes.html#str.rstrip&#34;&gt;str.rstrip([chars])&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Return a copy of the string with trailing characters removed. The chars argument is a string specifying the set of characters to be removed. If omitted or &lt;code&gt;None&lt;/code&gt;, the chars argument defaults to removing whitespace. The chars argument is &lt;strong&gt;not a suffix&lt;/strong&gt;; rather, &lt;strong&gt;all combinations of its values are stripped&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;https://docs.python.org/3/library/stdtypes.html&#34;&gt;Built-in Types — Python 3.12.4 documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;文档中已经明确并举例说明了这一行为及其含义。然而，对于新开发者来说，这是出乎意料的行为。毕竟，这些函数看起来都很直观。&lt;/p&gt;
&lt;p&gt;我的示例执行以下操作：
- 接收要删除的字符列表。在本例中，删除的字符是我姓氏中的所有字母，加上空格： &lt;code&gt;wegner&lt;/code&gt;。
- 将输入字符串中的所有字母都转成小写，结果为 &lt;code&gt;andrew wegner&lt;/code&gt;。
- 从字符串的右侧开始，删除输入列表中的字符。遇到列表中不存在的字符时停止。在本例中，这意味着从右到左删除了 &lt;code&gt;rengew wer&lt;/code&gt;，然后遇到 &lt;code&gt;andrew&lt;/code&gt; 中的 &lt;code&gt;d&lt;/code&gt; ， &lt;code&gt;rstrip&lt;/code&gt; 函数停止。
- 返回剩余的字符串 &lt;code&gt;and&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;解决方法&#34;&gt;解决方法&lt;a class=&#34;headerlink&#34; href=&#34;#解决方法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 有两个可以正确删除&lt;strong&gt;字符串&lt;/strong&gt;的函数 - &lt;a href=&#34;https://docs.python.org/3.10/library/stdtypes.html#str.removesuffix&#34;&gt;&lt;code&gt;.removesuffix()&lt;/code&gt;&lt;/a&gt; 和 &lt;a href=&#34;https://docs.python.org/3.10/library/stdtypes.html#str.removeprefix&#34;&gt;&lt;code&gt;.removeprefix()&lt;/code&gt;&lt;/a&gt; 分别用于删除右侧和左侧的字符串。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Andrew Wegner&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;removesuffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34; wegner&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;andrew&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这两个函数是作为 &lt;a href=&#34;https://peps.python.org/pep-0616/&#34;&gt;&lt;strong&gt;PEP-616&lt;/strong&gt;&lt;/a&gt; 的一部分在 Python 3.9 中引入的。该 PEP 明确指出了用户对 &lt;code&gt;*strip()&lt;/code&gt; 函数及其行为方式的困惑。引入这两个函数是为了实现所需的行为。&lt;/p&gt;
&lt;p&gt;需要注意的是，这两个 &lt;code&gt;remove*&lt;/code&gt; 函数最多只会删除字符串的一个实例。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Andrew Wegner Wegner&#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;removesuffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34; wegner&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;andrew wegner&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;79&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-79/</link>
      <pubDate>Wed, 03 Jul 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-79/</guid>
      
    </item>
    
    <item>
      <title>手机</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;手机对大部分人来说，现在更像是一个外置的私密部位：能随意触碰的人只有自己，伴侣想碰也得防着，只有万不得已的时候，才能交到专业人士手上（指修手机的）。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;78&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-78/</link>
      <pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-78/</guid>
      
    </item>
    
    <item>
      <title>最舒服的字号和字体大小</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最舒服的字号目前没有确切的定论，默认的微软雅黑还能接受。但是在字体大小这一块，个人对小字体情有独钟。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;在手机端一直都会把系统(或者是常用 APP)的字体设置为最小，很重要的一个原因就是能在一页上容纳更多的信息，排版布局看起来更加舒服。在知乎看到有人说喜欢用小字体的人，其性格可能会相对内向，日常生活中并不是特别外向开放的人，或许也有一定的道理。&lt;/p&gt;
&lt;p&gt;浏览器端最常用的 Google Chrome 和备用的 Edge 用的也是 &lt;strong&gt;14px&lt;/strong&gt; 的字体大小。    &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;chrome-14px&#34; src=&#34;https://gi.weiyan.tech/2024/06/chrome-14px.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;77&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-77/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-77/</guid>
      
    </item>
    
    <item>
      <title>生活的后花园</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;年纪越大，越期待短暂的一些独处时光，安静且惬意。&lt;/p&gt;
&lt;p&gt;不知道大家的后花园都是什么，在 V2EX 看到，对有些人来说，备菜+做饭的一个小时，不接收外界信息，完全沉浸在只有自己的世界里，是他近几年找到了最好的放松方式了。对我自己可能就在于游戏+看电影，但是能有这样时间的机会确实不多。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;看到有人说家里玩游戏会有压力，这一点是同意的，尤其有了娃以后，放空自己的机会就更少了。所以，建立自己的精神后花园，去运运动其实也是一个不错的选择。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;76&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-76/</link>
      <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-76/</guid>
      
    </item>
    
    <item>
      <title>使用 Python 的 argparse 构建命令行界面</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://realpython.com/command-line-interfaces-python-argparse/&#34;&gt;Build Command-Line Interfaces With Python&amp;rsquo;s argparse&lt;/a&gt;     &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;命令行应用在普通用户空间中可能并不常见，但它们存在于开发、数据科学、系统管理和许多其他操作中。每个命令行应用都需要一个用户友好的命令行界面 （CLI），以便你可以与应用本身进行交互。在 Python 中，您可以使用标准库中的 &lt;code&gt;argparse&lt;/code&gt; 模块创建功能齐全的 CLI。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;在本文中，你将了解如何：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令行界面入门；&lt;/li&gt;
&lt;li&gt;在 Python 中组织和布局命令行应用项目；&lt;/li&gt;
&lt;li&gt;使用 Python &lt;code&gt;argparse&lt;/code&gt; 创建命令行界面（command-line interfaces）；&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;argparse&lt;/code&gt; 一些强大的功能深度自定义您的 CLI；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若要充分利用本教程，应熟悉 Python 编程，包括面向对象编程、脚本开发和执行以及 Python 包和模块等概念。如果您熟悉与使用命令行或终端相关的一般概念和主题，这也将很有帮助。&lt;/p&gt;
&lt;h2 id=&#34;了解命令行界面&#34;&gt;了解命令行界面&lt;a class=&#34;headerlink&#34; href=&#34;#了解命令行界面&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自从计算机发明以来，人类一直需要并找到与这些机器交互和共享信息的方法。信息交换在人、计算机软件和硬件组件之间流动。其中任意两个元素之间的共享边界通常称为接口(&lt;a href=&#34;https://en.wikipedia.org/wiki/Interface_(computing)&#34;&gt;interface&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;在软件开发中，接口是给定软件的特殊部分，它允许计算机系统组件之间的交互。当涉及到人机交互和软件交互时，这个重要的组件被称为用户界面（&lt;a href=&#34;https://en.wikipedia.org/wiki/User_interface&#34;&gt;user interface&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;您会在编程中找到不同类型的用户界面。图形用户界面 （GUI） 可能是当今最常见的。但是，您还可以找到为其用户提供命令行界面 （CLI） 的应用和程序。在本教程中，你将了解 CLI 以及如何在 Python 中创建它们。&lt;/p&gt;
&lt;h2 id=&#34;命令行界面-cli&#34;&gt;命令行界面 （CLI）&lt;a class=&#34;headerlink&#34; href=&#34;#命令行界面-cli&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;命令行界面允许您通过操作系统命令行、终端或控制台与应用程序或程序进行交互。&lt;/p&gt;
&lt;p&gt;要了解命令行界面及其工作原理，请考虑此实际示例。假设您有一个名为 sample 包含三个示例文件的目录。如果您使用的是类 Unix 操作系统，例如 Linux 或 macOS，请继续在父目录中打开命令行窗口或终端，然后执行以下命令：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
hello.txt&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;lorem.md&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;realpython.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Unix 的 &lt;code&gt;ls&lt;/code&gt; 命令列出目标目录中包含的文件和子目录，该目录默认为当前工作目录。上面的命令调用没有显示有关 的内容 sample 的太多信息。它只在屏幕上显示文件名。&lt;/p&gt;
&lt;p&gt;假设你想要获取有关目录及其内容的更丰富信息，那么你不需要寻找其他程序，因为 ls 命令有一个功能齐全的命令行界面，并且提供了一组有用的选项，可以用来定制命令的行为。&lt;/p&gt;
&lt;p&gt;例如，继续执行带有 &lt;code&gt;-l&lt;/code&gt; 选项的 &lt;code&gt;ls&lt;/code&gt; 命令：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
total&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;24&lt;/span&gt;
-rw-r--r--@&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;user&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;staff&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;83&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Aug&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;:15&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;hello.txt
-rw-r--r--@&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;user&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;staff&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2609&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Aug&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;:15&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lorem.md
-rw-r--r--@&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;user&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;staff&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;428&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Aug&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;:15&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;realpython.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;现在，&lt;code&gt;ls&lt;/code&gt; 命令的输出完全不同了。该命令显示了有关 sample 目录中文件的更多信息，包括权限、所有者、组、日期和大小。它还显示了这些文件在你计算机磁盘上使用的总空间。&lt;/p&gt;
&lt;p&gt;这种更丰富的输出结果是由于使用了 &lt;code&gt;-l&lt;/code&gt; 选项，这是 Unix &lt;code&gt;ls&lt;/code&gt; 命令行界面的一部分，它启用了详细的输出格式。&lt;/p&gt;
&lt;h2 id=&#34;命令参数选项参数和子命令&#34;&gt;命令、参数、选项、参数和子命令&lt;a class=&#34;headerlink&#34; href=&#34;#命令参数选项参数和子命令&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在本教程中，您将深入了解&lt;strong&gt;命令&lt;/strong&gt;(commands)及其&lt;strong&gt;子命令&lt;/strong&gt;(subcommands)，同时还会学习到&lt;strong&gt;命令行参数&lt;/strong&gt;(command-line arguments)、&lt;strong&gt;选项&lt;/strong&gt;(options)和&lt;strong&gt;参数&lt;/strong&gt;(parameters)的相关知识。因此，建议您将这些术语纳入您的技术词汇库中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;命令(Command)&lt;/strong&gt;：在命令行或终端窗口中运行的程序或例程。通常，您可以通过其背后的程序(underlying program)或例程(routine)的名称来识别一个命令。     &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数(Argument)&lt;/strong&gt;：命令在执行其预期操作时所需或可选的信息片段。命令通常接受一个或多个参数，您可以在命令行中以空格分隔或逗号分隔的列表形式提供这些参数。     &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选项(Option)&lt;/strong&gt;，也称为 &lt;strong&gt;flag&lt;/strong&gt; 或 &lt;strong&gt;switch&lt;/strong&gt;：一种可选的参数，用于修改命令的行为。选项通过特定的名称（如前一个示例中的 &lt;code&gt;-l&lt;/code&gt;）传递给命令。     &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数(Parameter)&lt;/strong&gt;：一个选项用于执行其预期操作或动作时所使用的参数。     &lt;/li&gt;
&lt;li&gt;子命令(Subcommand)**：一个预定义的名称，可以传递给应用程序来执行特定的操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考上一节中的示例命令结构：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这个例子中，您组合了命令行界面（CLI）的以下组件：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ls&lt;/strong&gt;：命令的名称或应用的名称；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-l&lt;/strong&gt;：启用详细输出的选项(option)、开关(switch)或标志(flag)；    &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sample&lt;/strong&gt;：为命令执行提供附加信息的参数(argument)；    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在，让我们来看下面的命令结构，它展示了 Python 包管理器 &lt;code&gt;pip&lt;/code&gt; 的命令行界面（CLI）：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这是一个常见的 &lt;code&gt;pip&lt;/code&gt; 命令结构，您可能之前已经见过。它允许您使用 &lt;code&gt;requirements.txt&lt;/code&gt; 文件来给指定的 Python 项目安装依赖项。在这个例子中，您使用了以下命令行界面（CLI）组件：   &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pip&lt;/strong&gt;：命令的名称；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;install&lt;/strong&gt;：&lt;code&gt;pip&lt;/code&gt; 的子命令(subcommand)名称；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-r&lt;/strong&gt;：&lt;code&gt;install&lt;/code&gt; 子命令的选项(option)；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;requirements.txt&lt;/strong&gt;：一个参数，特别是 &lt;code&gt;-r&lt;/code&gt; 选项的参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在您已经了解了命令行界面（CLI）是什么以及其主要部分或组件有哪些。接下来，是时候学习如何在 Python 中创建自己的 CLI 了。&lt;/p&gt;
&lt;h2 id=&#34;python-中的-cli-入门&#34;&gt;Python 中的 CLI 入门&lt;a class=&#34;headerlink&#34; href=&#34;#python-中的-cli-入门&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 附带了一些工具，这些工具可帮助您为程序和应用程序编写命令行界面（CLI）。若您需要快速为小型程序构建一个简洁的 CLI，那么可以利用 &lt;a href=&#34;https://docs.python.org/3/library/sys.html#module-sys&#34;&gt;&lt;code&gt;sys&lt;/code&gt;&lt;/a&gt; 模块中的 &lt;a href=&#34;https://docs.python.org/3/library/sys.html#sys.argv&#34;&gt;&lt;code&gt;argv&lt;/code&gt;&lt;/a&gt; 属性。这个属性会自动存储您在命令行中传递给特定程序的参数。&lt;/p&gt;
&lt;h3 id=&#34;使用-sysargv-构建最小的-cli&#34;&gt;使用 &lt;code&gt;sys.argv&lt;/code&gt; 构建最小的 CLI&lt;a class=&#34;headerlink&#34; href=&#34;#使用-sysargv-构建最小的-cli&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以使用 &lt;code&gt;argv&lt;/code&gt; 创建最小命令行界面（CLI）为例，假设您需要编写一个小程序，该程序类似于 &lt;code&gt;ls&lt;/code&gt; 命令，能够列出给定目录下的所有文件。在这种情况下，您可以编写如下代码：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls_argv.py&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;One argument expected, got &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args_count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;You must specify the target directory&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;The target directory doesn&#39;t exist&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;该程序通过手动处理命令行提供的参数来实现了一个简单的命令行界面（CLI），这些参数会自动存储在 &lt;code&gt;sys.argv&lt;/code&gt; 中。&lt;code&gt;sys.argv&lt;/code&gt; 的第一个元素始终是程序名称，第二个元素则是目标目录。由于应用程序不应接受超过一个目标目录，因此 &lt;code&gt;args_count&lt;/code&gt; 不得超过 2。&lt;/p&gt;
&lt;p&gt;在检查 &lt;code&gt;sys.argv&lt;/code&gt; 的内容后，您创建一个&lt;code&gt;pathlib.Path&lt;/code&gt;对象来存储目标目录的路径。如果该目录不存在，您将通知用户并退出程序。接下来的&lt;code&gt;for&lt;/code&gt;循环将列出目录内容，每行一个条目。&lt;/p&gt;
&lt;p&gt;如果从命令行运行该脚本，您将得到以下结果：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls_argv.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
hello.txt
lorem.md
realpython.md

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls_argv.py
You&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;must&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;specify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;target&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls_argv.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;other_dir/
One&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;argument&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;expected,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;got&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls_argv.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;non_existing/
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;target&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;doesn&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;t&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;exist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;您的程序接受一个目录作为参数，并列出其内容。如果您运行命令时没有提供参数，您将收到一个错误消息。如果您运行命令时指定了超过一个目标目录，您同样会收到一个错误消息。如果尝试运行命令并指定一个不存在的目录，程序将输出另一个错误消息。&lt;/p&gt;
&lt;p&gt;虽然您的程序运行正常，但对于更复杂的 CLI 应用程序来说，使用&lt;code&gt;sys.argv&lt;/code&gt;属性手动解析命令行参数并不是一个可扩展的解决方案。如果您的应用需要接受更多的参数和选项，那么解析&lt;code&gt;sys.argv&lt;/code&gt;将变得复杂且容易出错。您需要一个更好的解决方案，这就是 Python 中的&lt;code&gt;argparse&lt;/code&gt;模块所提供的。&lt;/p&gt;
&lt;h3 id=&#34;使用-argparse-创建-cli&#34;&gt;使用 &lt;code&gt;argparse&lt;/code&gt; 创建 CLI&lt;a class=&#34;headerlink&#34; href=&#34;#使用-argparse-创建-cli&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 Python 中创建 CLI 应用程序的更便捷方法是使用标准库中的 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html?highlight=argparse#module-argparse&#34;&gt;&lt;code&gt;argparse&lt;/code&gt;&lt;/a&gt; 模块。该模块首次在 Python 3.2 中随 &lt;a href=&#34;https://www.python.org/dev/peps/pep-0389/&#34;&gt;PEP-389&lt;/a&gt; 一同发布，是快速创建 Python CLI 应用程序的利器，无需安装如 Typer 或 Click 这样的第三方库。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;argparse&lt;/code&gt; 模块是作为较旧的 &lt;a href=&#34;https://docs.python.org/3/library/getopt.html&#34;&gt;&lt;code&gt;getopt&lt;/code&gt;&lt;/a&gt; 和 &lt;a href=&#34;https://docs.python.org/3/library/optparse.html&#34;&gt;&lt;code&gt;optparse&lt;/code&gt;&lt;/a&gt; 模块的替代品而发布的，因为它们缺乏一些重要的功能。&lt;/p&gt;
&lt;p&gt;Python 的 &lt;code&gt;argparse&lt;/code&gt; 模块允许您：     &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解析命令行&lt;strong&gt;参数&lt;/strong&gt;(arguments)和&lt;strong&gt;选项&lt;/strong&gt;(options)；&lt;/li&gt;
&lt;li&gt;在一个单一选项中接受&lt;strong&gt;可变数量的参数&lt;/strong&gt;(variable number of parameters)；&lt;/li&gt;
&lt;li&gt;在 CLI 中提供子命令(subcommands)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些特性使 &lt;code&gt;argparse&lt;/code&gt; 成为了一个强大的 CLI 框架，您在创建 CLI 应用程序时可以放心地依赖它。要使用 Python 的 &lt;code&gt;argparse&lt;/code&gt;，您需要遵循以下四个简单的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;导入 &lt;code&gt;argparse&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;通过实例化 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser&#34;&gt;&lt;code&gt;ArgumentParser&lt;/code&gt;&lt;/a&gt; 创建&lt;strong&gt;参数解析器&lt;/strong&gt;(argument parser)；&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_argument&#34;&gt;&lt;code&gt;.add_argument()&lt;/code&gt;&lt;/a&gt; 方法向解析器添加&lt;strong&gt;参数&lt;/strong&gt;(arguments)和&lt;strong&gt;选项&lt;/strong&gt;(options)；&lt;/li&gt;
&lt;li&gt;在解析器上调用 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html?highlight=argparse#argparse.ArgumentParser.parse_args&#34;&gt;&lt;code&gt;.parse_args()&lt;/code&gt;&lt;/a&gt; 以获取参数 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#namespace&#34;&gt;&lt;code&gt;Namespace&lt;/code&gt;&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如，您可以使用 &lt;code&gt;argparse&lt;/code&gt; 来改进您的 &lt;code&gt;ls_argv.py&lt;/code&gt; 脚本。现在，您可以创建一个名为 &lt;code&gt;ls.py&lt;/code&gt; 的脚本，并编写以下代码：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v1&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;path&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;The target directory doesn&#39;t exist&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;随着 &lt;code&gt;argparse&lt;/code&gt; 的引入，您的代码发生了显著的变化。与之前的版本相比，最明显的不同是，用于检查用户提供的参数的条件语句已经消失了。这是因为 &lt;code&gt;argparse&lt;/code&gt; 会自动为您检查参数的存在性。&lt;/p&gt;
&lt;p&gt;在这个新的实现中，您首先导入 &lt;code&gt;argparse&lt;/code&gt; 并创建一个参数解析器。要创建解析器，您可以使用 &lt;code&gt;ArgumentParser&lt;/code&gt; 类。接下来，您定义一个名为 &lt;code&gt;path&lt;/code&gt; 的参数，用于获取用户的目标目录。&lt;/p&gt;
&lt;p&gt;接下来，您需要调用 &lt;code&gt;.parse_args()&lt;/code&gt; 方法来解析输入参数，并获取一个包含所有用户参数的 &lt;code&gt;Namespace&lt;/code&gt; 对象。请注意，现在 &lt;code&gt;args&lt;/code&gt; 变量保存了一个 &lt;code&gt;Namespace&lt;/code&gt; 对象，该对象具有从命令行收集的每个参数所对应的属性。&lt;/p&gt;
&lt;p&gt;在这个例子中，您只有一个参数，名为 &lt;code&gt;path&lt;/code&gt;。&lt;code&gt;Namespace&lt;/code&gt; 对象允许您使用点表示法通过 &lt;code&gt;args&lt;/code&gt; 来访问 &lt;code&gt;path&lt;/code&gt;。其余的代码与第一个实现相同。&lt;/p&gt;
&lt;p&gt;现在继续从命令行运行这个新脚本：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
lorem.md
realpython.md
hello.txt

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path
ls.py:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;following&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;are&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;required:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;other_dir/
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path
ls.py:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unrecognized&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;other_dir/

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;non_existing/
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;target&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;doesn&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;t&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;exist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第一个命令的输出与您的原始脚本 &lt;code&gt;ls_argv.py&lt;/code&gt; 相同。而第二个命令的输出则与 &lt;code&gt;ls_argv.py&lt;/code&gt; 中的输出大不相同。程序现在会显示一个使用说明消息，并发出错误提示，告诉您必须提供 &lt;code&gt;path&lt;/code&gt; 参数。&lt;/p&gt;
&lt;p&gt;在第三个命令中，您传递了两个目标目录，但应用程序并未为此做好准备。因此，它再次显示使用说明消息，并抛出一个错误，告知您潜在的问题。&lt;/p&gt;
&lt;p&gt;最后，如果您运行脚本时传递了一个不存在的目录作为参数，那么您会收到一个错误，告知您目标目录不存在，因此程序无法执行其工作。&lt;/p&gt;
&lt;p&gt;现在，您可以使用一个新的隐式特性。现在，您的程序接受一个可选的 &lt;code&gt;-h&lt;/code&gt; 标志。不妨尝试一下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

positional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;path

options:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-h,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;show&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;message&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;太棒了，现在您的程序会自动响应 &lt;code&gt;-h&lt;/code&gt; 或 &lt;code&gt;--help&lt;/code&gt; 标志，并为您显示带有使用说明的帮助消息。这真是一个很棒的特性，而且您只需在代码中引入 &lt;code&gt;argparse&lt;/code&gt; 就能轻松获得！&lt;/p&gt;
&lt;p&gt;经过这个快速介绍如何在 Python 中创建 CLI 应用后，您现在就可以深入研究 &lt;code&gt;argparse&lt;/code&gt; 模块及其所有炫酷特性了。&lt;/p&gt;
&lt;h2 id=&#34;使用-python-的-argparse-创建-cli&#34;&gt;使用 Python 的 argparse 创建 CLI&lt;a class=&#34;headerlink&#34; href=&#34;#使用-python-的-argparse-创建-cli&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;您可以使用 &lt;code&gt;argparse&lt;/code&gt; 模块为您的应用程序和项目编写用户友好的命令行界面。该模块允许您定义应用程序所需的参数和选项。然后，&lt;code&gt;argparse&lt;/code&gt; 将负责为您解析 &lt;code&gt;sys.argv&lt;/code&gt; 的参数和选项。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;argparse&lt;/code&gt; 的另一个酷炫特性是它可以自动为您的 CLI 应用程序生成使用说明和帮助消息。该模块还会在参数无效时发出错误提示，并具备更多功能。&lt;/p&gt;
&lt;p&gt;在深入研究 &lt;code&gt;argparse&lt;/code&gt; 之前，您需要知道该模块的文档可识别两种不同类型的命令行参数：     &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;位置参数&lt;/strong&gt;(Positional arguments)，您称为参数(arguments)；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可选参数&lt;/strong&gt;(Optional arguments)，即选项(options)、标志(flags)或开关(switches)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 &lt;code&gt;ls.py&lt;/code&gt; 的示例中，&lt;code&gt;path&lt;/code&gt; 是一个&lt;strong&gt;位置参数&lt;/strong&gt;(positional argument)。这样的参数之所以被称为位置参数，是因为它在命令构造中的相对位置定义了其作用。&lt;/p&gt;
&lt;p&gt;与位置参数不同，&lt;strong&gt;可选参数&lt;/strong&gt;(Optional arguments)并不是必需的。它们允许你修改命令的行为。以 Unix 命令 &lt;code&gt;ls&lt;/code&gt; 为例，&lt;code&gt;-l&lt;/code&gt; 标志就是一个可选参数，它使得命令以详细模式显示输出。&lt;/p&gt;
&lt;p&gt;在明确了这些概念之后，你就可以着手使用 Python 和 &lt;code&gt;argparse&lt;/code&gt; 库来构建自己的命令行界面（CLI）应用程序了。&lt;/p&gt;
&lt;h3 id=&#34;创建命令行参数解析器&#34;&gt;创建命令行参数解析器&lt;a class=&#34;headerlink&#34; href=&#34;#创建命令行参数解析器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;命令行参数解析器是任何使用 &lt;code&gt;argparse&lt;/code&gt; 的命令行界面（CLI）中最为关键的部分。你在命令行上提供的所有参数和选项都会经过这个解析器的处理，它会为你完成繁重的解析工作。&lt;/p&gt;
&lt;p&gt;要使用 &lt;code&gt;argparse&lt;/code&gt; 创建命令行参数解析器，您需要实例化 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#argumentparser-objects&#34;&gt;&lt;code&gt;ArgumentParser&lt;/code&gt;&lt;/a&gt; 类：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;usage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;formatter_class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HelpFormatter&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;&amp;gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;conflict_handler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;add_help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ArgumentParser&lt;/code&gt; 的构造函数接受多种不同的参数，你可以利用这些参数来微调你的 CLI 的多个特性。由于所有这些参数都是可选的，因此你可以通过不传入任何参数直接实例化 &lt;code&gt;ArgumentParser&lt;/code&gt; 来创建一个最基本的解析器。&lt;/p&gt;
&lt;p&gt;在本教程中，你将会更深入地了解 &lt;code&gt;ArgumentParser&lt;/code&gt; 构造函数的参数，特别是在定制你的参数解析器的部分。目前，你可以开始使用 &lt;code&gt;argparse&lt;/code&gt; 创建 CLI 的下一步了。这一步就是通过解析器对象来添加参数和选项。&lt;/p&gt;
&lt;h3 id=&#34;添加参数和选项&#34;&gt;添加参数和选项&lt;a class=&#34;headerlink&#34; href=&#34;#添加参数和选项&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要为 &lt;code&gt;argparse&lt;/code&gt; 的 CLI 添加参数和选项，你将使用 &lt;code&gt;ArgumentParser&lt;/code&gt; 实例的 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#the-add-argument-method&#34;&gt;&lt;code&gt;.add_argument()&lt;/code&gt;&lt;/a&gt; 方法。请注意，这个方法对参数和选项都是通用的。在 &lt;code&gt;argparse&lt;/code&gt; 的术语中，参数被称为&lt;strong&gt;位置参数&lt;/strong&gt;(positional arguments)，而选项被称为&lt;strong&gt;可选参数&lt;/strong&gt;(optional arguments)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.add_argument()&lt;/code&gt; 方法的第一个参数决定了参数和选项之间的区别。这个参数被标识为&lt;a href=&#34;https://docs.python.org/3/library/argparse.html?highlight=argparse#name-or-flags&#34;&gt;名称（name）或标志（flag）&lt;/a&gt;。因此，如果你提供一个 name，那么你将定义一个参数(argument)。相反，如果你使用一个 flag，那么你将添加一个选项(option)。&lt;/p&gt;
&lt;p&gt;你已经在使用 &lt;code&gt;argparse&lt;/code&gt; 时处理过命令行参数了。现在，考虑以下你自定义的 &lt;code&gt;ls&lt;/code&gt; 命令的增强版本，它向 CLI 添加了一个 &lt;code&gt;-l&lt;/code&gt; 选项：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v2&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;path&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-l&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;--long&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;store_true&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;The target directory doesn&#39;t exist&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;st_size&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;st_mtime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strftime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
            &lt;span class=&#34;s2&#34;&gt;&#34;%b &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %H:%M:%S&#34;&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;6d&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这个例子中，第 11 行代码创建了一个带有 &lt;code&gt;-l&lt;/code&gt; 和 &lt;code&gt;--long&lt;/code&gt; 标志的选项。参数(arguments)和选项(options)在语法上的区别在于，选项名称以短横线 &lt;code&gt;-&lt;/code&gt; 开头表示简写标志，以双短横线 &lt;code&gt;--&lt;/code&gt; 开头表示完整标志。&lt;/p&gt;
&lt;p&gt;请注意，在这个特定例子中，与 &lt;code&gt;-l&lt;/code&gt; 或 &lt;code&gt;--long&lt;/code&gt; 选项一同设置了一个 &lt;code&gt;action&lt;/code&gt; 参数为 &lt;code&gt;&#34;store_true&#34;&lt;/code&gt;，这意味着这个选项将存储一个布尔值。如果你在命令行上提供了这个选项，那么它的值将为 &lt;code&gt;True&lt;/code&gt;。如果你省略了这个选项，那么它的值将为 &lt;code&gt;False&lt;/code&gt;。在 &amp;ldquo;设置 Option 背后的 Action&amp;rdquo; 部分内容中，你将了解更多关于 &lt;code&gt;.add_argument()&lt;/code&gt; 中的 &lt;code&gt;action&lt;/code&gt; 参数的信息。&lt;/p&gt;
&lt;p&gt;在第 21 行的 &lt;code&gt;build_output()&lt;/code&gt; 函数中，当 &lt;code&gt;long&lt;/code&gt; 为 &lt;code&gt;True&lt;/code&gt; 时，它会返回一个详细的输出，否则返回一个简短的输出。详细的输出将包含目标目录中所有条目的大小、修改日期和名称。它使用了诸如 &lt;code&gt;Path.stat()&lt;/code&gt; 这样的工具，以及带有自定义字符串格式的 &lt;code&gt;datetime.datetime&lt;/code&gt; 对象。&lt;/p&gt;
&lt;p&gt;继续在 &lt;code&gt;sample&lt;/code&gt; 上执行您的程序，以检查 &lt;code&gt;-l&lt;/code&gt; 选项如何工作：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sample/
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2609&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Oct&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;14&lt;/span&gt;:07:04&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lorem.md
&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;428&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Oct&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;14&lt;/span&gt;:07:04&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;realpython.md
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;83&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Oct&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;14&lt;/span&gt;:07:04&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;hello.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;新增的 &lt;code&gt;-l&lt;/code&gt; 选项允许你生成并显示关于目标目录内容的更详细输出。&lt;/p&gt;
&lt;p&gt;既然你已经知道了如何向 CLI 添加命令行参数和选项，接下来就是深入解析这些参数和选项的时候了。这将是你在接下来部分要探索的内容。&lt;/p&gt;
&lt;h3 id=&#34;解析命令行参数和选项&#34;&gt;解析命令行参数和选项&lt;a class=&#34;headerlink&#34; href=&#34;#解析命令行参数和选项&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;解析命令行参数是基于 &lt;code&gt;argparse&lt;/code&gt; 的任何 CLI 应用中的另一个重要步骤。一旦你解析了参数，你就可以根据它们的值来执行相应的操作。在你自定义的 &lt;code&gt;ls&lt;/code&gt; 命令示例中，参数解析发生在包含 &lt;code&gt;args = parser.parse_args()&lt;/code&gt; 语句的行上。&lt;/p&gt;
&lt;p&gt;这个语句调用了 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#the-parse-args-method&#34;&gt;&lt;code&gt;.parse_args()&lt;/code&gt;&lt;/a&gt; 方法，并将其返回值赋给 &lt;code&gt;args&lt;/code&gt; 变量。&lt;code&gt;.parse_args()&lt;/code&gt; 的返回值是一个 &lt;a href=&#34;https://docs.python.org/3/library/argparse.html#the-namespace-object&#34;&gt;&lt;code&gt;Namespace&lt;/code&gt;&lt;/a&gt; 对象，其中包含了在命令行上提供的所有参数和选项以及它们对应的值。&lt;/p&gt;
&lt;p&gt;考虑以下简单的示例：    &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;site&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;_StoreAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-c&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;--connect&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;store_true&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;_StoreTrueAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Real Python&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;-c&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;site&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Real Python&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;site&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;&#39;Real Python&#39;&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;
&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;通过在命令行参数解析器上调用 &lt;code&gt;.parse_args()&lt;/code&gt; 方法得到的 &lt;code&gt;Namespace&lt;/code&gt; 对象，你可以使用&lt;strong&gt;点表示法&lt;/strong&gt;(dot notation)访问所有输入参数、选项以及它们对应的值。这样，你就可以检查输入参数和选项的列表，并根据用户在命令行上的选择来执行相应的操作。&lt;/p&gt;
&lt;p&gt;你将在应用程序的主代码中使用这个 &lt;code&gt;Namespace&lt;/code&gt; 对象。这与你在自定义 &lt;code&gt;ls&lt;/code&gt; 命令示例中的 &lt;code&gt;for&lt;/code&gt; 循环下所做的类似。&lt;/p&gt;
&lt;p&gt;到目前为止，你已经了解了创建基于 &lt;code&gt;argparse&lt;/code&gt; 的 CLI 的主要步骤。现在，你可以花些时间学习如何在 Python 中组织和构建 CLI 应用程序的基础知识了。&lt;/p&gt;
&lt;h3 id=&#34;设置-cli-应用程序的布局和构建系统&#34;&gt;设置 CLI 应用程序的布局和构建系统&lt;a class=&#34;headerlink&#34; href=&#34;#设置-cli-应用程序的布局和构建系统&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在继续你的 &lt;code&gt;argparse&lt;/code&gt; 学习之旅之前，你应该暂停一下，思考如何组织你的代码和规划一个 CLI 项目。首先，你应该考虑以下几点：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你可以创建模块和包来组织代码。&lt;/li&gt;
&lt;li&gt;你可以将 Python 应用的核心包命名为应用本身的名字。&lt;/li&gt;
&lt;li&gt;你会根据每个 Python 模块的具体内容或功能来命名它们。&lt;/li&gt;
&lt;li&gt;如果你希望某个包可以直接执行，你可以在该 Python 包中添加一个 &lt;code&gt;__main__.py&lt;/code&gt; 模块。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将这些想法铭记于心，并考虑到模型-视图-控制器（MVC）模式是一种有效组织应用程序结构的方法，你在规划 CLI 项目时可以采用以下目录结构：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;hello_cli/
│
├── hello_cli/
│   ├── __init__.py
│   ├── __main__.py
│   ├── cli.py
│   └── model.py
│
├── tests/
│   ├── __init__.py
│   ├── test_cli.py
│   └── test_model.py
│
├── pyproject.toml
├── README.md
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hello_cli/&lt;/code&gt; 目录是项目的根目录。在那里，您将放置以下文件：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pyproject.toml 是一个 TOML 文件，用于指定项目的构建系统(build system)和其他配置(configurations)。&lt;/li&gt;
&lt;li&gt;README.md 文件提供了项目的描述以及安装和运行应用程序的说明。为你的项目添加一个描述性且详细的 README.md 文件是编程中的最佳实践，特别是如果你打算将项目作为开源解决方案发布的话。&lt;/li&gt;
&lt;li&gt;requirements.txt 是一个常规文件，列出了项目的外部依赖项(external dependencies)。你将使用这个文件，结合 &lt;code&gt;pip&lt;/code&gt; 的 &lt;code&gt;-r&lt;/code&gt; 选项，来自动安装这些依赖项。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来是 &lt;code&gt;hello_cli/&lt;/code&gt; 目录，它包含了应用的核心包，该包包含以下模块：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;__init__.py&lt;/code&gt; 文件使得 &lt;code&gt;hello_cli/&lt;/code&gt; 可以作为一个 Python 包被识别。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;__main__.py&lt;/code&gt; 文件提供了应用程序的&lt;strong&gt;入口点脚本&lt;/strong&gt;(entry-point script)或可执行文件，这是启动程序的主要入口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt; 文件为应用提供了命令行界面。在此文件中的代码将扮演基于 MVC 架构中的视图-控制器角色。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model.py&lt;/code&gt; 文件包含了支持应用主要功能的代码。这部分代码将在你的 MVC 布局中扮演模型角色。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你还需要一个 &lt;code&gt;tests/&lt;/code&gt; 包，其中包含针对应用程序组件的单元测试文件。在这个具体的项目布局示例中，你有 &lt;code&gt;test_cli.py&lt;/code&gt; 用于检查 CLI 功能的单元测试，以及 &lt;code&gt;test_model.py&lt;/code&gt; 用于检查你的模型代码的单元测试。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pyproject.toml&lt;/code&gt; 文件允许你定义应用程序的构建系统以及许多其他常规配置。以下是一个如何为你的示例 hello_cli 项目填写此文件的简单示例：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# pyproject.toml&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;[build-system]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;requires&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;setuptools&amp;gt;=64.0.0&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;wheel&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;build-backend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;setuptools.build_meta&#34;&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;[project]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;hello_cli&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;0.0.1&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;My awesome Hello CLI application&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;readme&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;README.md&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;authors&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Real Python&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;info@realpython.com&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;[project.scripts]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;hello_cli&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;hello_cli.__main__:main&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[build-system]&lt;/code&gt; 表头将 &lt;code&gt;setuptools&lt;/code&gt; 设置为应用程序的构建系统，并指定 Python 需要安装哪些依赖项来构建应用程序。&lt;code&gt;[project]&lt;/code&gt; 表头为你的应用提供了通用元数据。这些元数据在你想要将应用发布到 Python 包索引（PyPI）时非常有用。最后， &lt;code&gt;[project.scripts]&lt;/code&gt; 表头定义了你的应用程序的入口点。&lt;/p&gt;
&lt;p&gt;经过这次对 CLI 项目布局和构建的快速探索，你已经准备好继续学习 &lt;code&gt;argparse&lt;/code&gt; 了，特别是如何自定义你的命令行参数解析器。&lt;/p&gt;
&lt;h2 id=&#34;自定义你的命令行参数解析器&#34;&gt;自定义你的命令行参数解析器&lt;a class=&#34;headerlink&#34; href=&#34;#自定义你的命令行参数解析器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在前面的部分中，你已经学习了如何使用 Python 的 &lt;code&gt;argparse&lt;/code&gt; 模块为你的程序或应用实现命令行接口的基础知识。同时，你也了解了如何按照 MVC 模式组织和规划 CLI 应用项目。&lt;/p&gt;
&lt;p&gt;在接下来的部分中，你将更深入地探索 &lt;code&gt;argparse&lt;/code&gt; 的许多其他强大功能。特别是，你将学习如何在 &lt;code&gt;ArgumentParser&lt;/code&gt; 构造函数中使用一些最有用的参数，这将使你能够自定义 CLI 应用的一般行为。&lt;/p&gt;
&lt;h3 id=&#34;调整程序的-help-和-usage-内容&#34;&gt;调整程序的 Help 和 Usage 内容&lt;a class=&#34;headerlink&#34; href=&#34;#调整程序的-help-和-usage-内容&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;向 CLI 应用程序的用户提供使用说明和帮助是一种最佳实践，可以通过出色的用户体验 (UX) 让用户更加愉快。在本节中，你将了解如何利用 &lt;code&gt;ArgumentParser&lt;/code&gt; 的一些参数来微调 CLI 应用程序向用户显示帮助和使用消息的方式。你将学习如何：  &lt;br /&gt;
- 设置程序名称
- 定义程序的描述和结束消息
- 对参数和选项进行分组显示帮助&lt;/p&gt;
&lt;p&gt;首先，你将开始设置你的程序名称，并指定该名称在帮助或使用说明消息中的显示方式。&lt;/p&gt;
&lt;h4 id=&#34;设置程序名称&#34;&gt;设置程序名称&lt;a class=&#34;headerlink&#34; href=&#34;#设置程序名称&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;默认情况下，&lt;code&gt;argparse&lt;/code&gt; 会使用 &lt;code&gt;sys.argv&lt;/code&gt; 中的第一个值来设置程序的名称。这个第一项包含你刚刚执行的 Python 文件的名称。这个文件名在使用说明消息中看起来会有些奇怪。&lt;/p&gt;
&lt;p&gt;例如，继续使用 &lt;code&gt;-h&lt;/code&gt; 选项运行自定义 &lt;code&gt;ls&lt;/code&gt; 命令：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-l&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

positional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;path

options:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-h,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;show&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;message&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-l,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--long
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;命令输出中的高亮行显示 &lt;code&gt;argparse&lt;/code&gt; 正在使用文件名 &lt;code&gt;ls.py&lt;/code&gt; 作为程序的名称。这看起来有些奇怪，因为在使用说明消息中，应用名称很少包含文件扩展名。&lt;/p&gt;
&lt;p&gt;幸运的是，你可以使用 &lt;code&gt;prog&lt;/code&gt; 参数来指定你的程序名称，就像下面的代码片段所示：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v3&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;ls&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# ...&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;prog&lt;/code&gt; 参数，你可以指定将在使用说明消息中使用的程序名称。在这个例子中，你使用了字符串 &amp;ldquo;ls&amp;rdquo;。现在，继续运行你的应用：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-l&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

positional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;path

options:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-h,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;show&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;message&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-l,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--long
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;很好！这个输出的第一行中的使用说明消息显示程序名称为 &lt;code&gt;ls&lt;/code&gt;，而不是 &lt;code&gt;ls.py&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;除了设置程序名称外，&lt;code&gt;argparse&lt;/code&gt; 还允许你定义应用的描述和结尾信息。在接下来的部分中，你将学习如何进行这两方面的操作。&lt;/p&gt;
&lt;h4 id=&#34;定义程序的描述和结语消息&#34;&gt;定义程序的描述和结语消息&lt;a class=&#34;headerlink&#34; href=&#34;#定义程序的描述和结语消息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;你还可以为你的应用定义一个通用的描述和一个结尾或结束语。为此，你将分别使用 &lt;code&gt;description&lt;/code&gt; 和 &lt;code&gt;epilog&lt;/code&gt; 参数。接下来，请更新 &lt;code&gt;ls.py&lt;/code&gt; 文件，在 &lt;code&gt;ArgumentParser&lt;/code&gt; 构造函数中添加以下内容：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v4&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;ls&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;List the content of a directory&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;epilog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Thanks for using &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(prog)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;! :)&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# ...&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这次更新中，&lt;code&gt;description&lt;/code&gt; 参数允许你为应用提供一个通用的描述。这个描述将显示在帮助消息的开头。&lt;code&gt;epilog&lt;/code&gt; 参数则允许你定义一些文本作为应用的结尾或结束语。请注意，你可以使用旧式的字符串格式化操作符(&lt;code&gt;%&lt;/code&gt;)将 &lt;code&gt;prog&lt;/code&gt; 参数插入到 &lt;code&gt;epilog&lt;/code&gt; 字符串中。    &lt;/p&gt;
&lt;p&gt;如果再次运行该应用程序，你将得到如下输出：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-l&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

List&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;content&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory

positional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;path

options:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-h,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;show&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;message&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-l,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--long

Thanks&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;using&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;现在，输出会在使用消息之后显示描述消息，并在帮助文本末尾显示结语消息。&lt;/p&gt;
&lt;h4 id=&#34;显示参数和选项的分组帮助&#34;&gt;显示参数和选项的分组帮助&lt;a class=&#34;headerlink&#34; href=&#34;#显示参数和选项的分组帮助&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;帮助分组&lt;/strong&gt;(Help groups)是 &lt;code&gt;argparse&lt;/code&gt; 的另一个有趣特性。它们允许你将相关的命令和参数进行分组，从而帮助你组织应用的帮助消息。要创建这些帮助分组，你将使用 &lt;code&gt;ArgumentParser&lt;/code&gt; 的 &lt;code&gt;.add_argument_group()&lt;/code&gt; 方法。&lt;/p&gt;
&lt;p&gt;作为一个例子，请考虑你自定义的 &lt;code&gt;ls&lt;/code&gt; 命令的以下更新版本：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v5&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# ...&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;ls&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;List the content of a directory&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;epilog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Thanks for using &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(prog)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;! :)&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;general&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;general output&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;general&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;path&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;detailed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;detailed output&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;detailed&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-l&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;--long&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;store_true&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# ...&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这次更新中，你为显示一般输出的参数和选项创建了一个帮助分组，并为显示详细输出的参数和选项创建了另一个分组。&lt;/p&gt;
&lt;p&gt;如果你在命令行中使用 &lt;code&gt;-h&lt;/code&gt; 选项运行应用程序，那么你将获得以下输出： &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-l&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path

List&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;content&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory

options:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-h,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--help&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;show&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;message&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;

general&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;path

detailed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output:
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-l,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--long

Thanks&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;using&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;现在，你的应用的参数和选项在帮助消息中以描述性的标题进行了方便的分组。这个整洁的特性将帮助你为用户提供更多的上下文，并帮助他们更好地理解应用的工作原理。&lt;/p&gt;
&lt;h3 id=&#34;为参数和选项提供全局设置&#34;&gt;为参数和选项提供全局设置&lt;a class=&#34;headerlink&#34; href=&#34;#为参数和选项提供全局设置&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;除了自定义使用说明和帮助消息外，&lt;code&gt;ArgumentParser&lt;/code&gt; 还允许你对命令行界面（CLI）应用进行其他一些有趣的调整。这些调整包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为参数和选项定义全局默认值&lt;/li&gt;
&lt;li&gt;从外部文件中加载参数和选项&lt;/li&gt;
&lt;li&gt;允许或禁止选项缩写&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有时，你可能需要为你的应用的参数和选项指定一个全局默认值。你可以通过在调用 &lt;code&gt;ArgumentParser&lt;/code&gt; 构造函数时，将默认值传递给 &lt;code&gt;argument_default&lt;/code&gt; 参数来实现这一点（注意：实际上 &lt;code&gt;ArgumentParser&lt;/code&gt; 没有 &lt;code&gt;argument_default&lt;/code&gt; 这个参数，但这里是为了说明可以全局设置默认值的概念。在实际应用中，你可能需要为每个参数单独设置默认值）。&lt;/p&gt;
&lt;p&gt;这个特性可能并不常用，因为参数和选项通常具有不同的数据类型或意义，很难找到一个满足所有需求的值。&lt;/p&gt;
&lt;p&gt;然而，&lt;code&gt;argument_default&lt;/code&gt;(尽管 &lt;code&gt;ArgumentParser&lt;/code&gt; 并没有直接提供这个参数，但这里是为了说明概念）的一个常见用例是当你想要避免将参数和选项添加到 &lt;code&gt;Namespace&lt;/code&gt; 对象中。在这种情况下，你可以使用 &lt;code&gt;SUPPRESS&lt;/code&gt; 常量作为默认值。这个默认值将确保只有命令行中提供的参数和选项才会被存储在 &lt;code&gt;arguments&lt;/code&gt; 的 &lt;code&gt;Namespace&lt;/code&gt; 中。&lt;/p&gt;
&lt;p&gt;作为一个例子，请继续修改你的自定义 &lt;code&gt;ls&lt;/code&gt; 命令，如下面的代码片段所示：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# ls.py v6&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;ls&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;List the content of a directory&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;epilog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Thanks for using &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(prog)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;! :)&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;argument_default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SUPPRESS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# ...&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;AttributeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;通过将 &lt;code&gt;SUPPRESS&lt;/code&gt; 传递给 &lt;code&gt;ArgumentParser&lt;/code&gt; 构造函数，你可以防止未提供的参数被存储在 &lt;code&gt;argparse.Namespace&lt;/code&gt; 对象中。这就是为什么在调用 &lt;code&gt;build_output()&lt;/code&gt; 之前，你需要检查 &lt;code&gt;-l&lt;/code&gt; 或 &lt;code&gt;--long&lt;/code&gt; 选项是否实际被传递了。否则，你的代码会因为 &lt;code&gt;args&lt;/code&gt; 中不存在 &lt;code&gt;long&lt;/code&gt; 属性而引发 &lt;code&gt;AttributeError&lt;/code&gt; 错误。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ArgumentParser&lt;/code&gt; 的另一个酷炫功能是允许你从外部文件中加载参数值。当你有一个具有冗长或复杂的命令行结构的应用，并希望自动化加载参数值的过程时，这个功能就非常有用。&lt;/p&gt;
&lt;p&gt;在这种情况下，你可以将参数值存储在一个外部文件中，并让你的程序从该文件中加载它们。为了尝试这个功能，请继续创建一个简单的命令行界面（CLI）应用，如下所示：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# fromfile.py&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromfile_prefix_chars&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;@&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;one&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;two&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;three&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这里，你向 &lt;code&gt;ArgumentParser&lt;/code&gt; 的 &lt;code&gt;fromfile_prefix_chars&lt;/code&gt; 参数传递 &lt;code&gt;@&lt;/code&gt; 符号。然后，你创建了三个必须在命令行中提供的必需参数。&lt;/p&gt;
&lt;p&gt;现在，假设你经常使用此应用程序，并且总是使用相同的一组参数值。为了简化和优化你的工作流程，你可以创建一个文件，其中包含所有必需参数的适当值，每个参数占一行，就像下面的 &lt;code&gt;args.txt&lt;/code&gt; 文件一样： &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;first
second
third
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;有了这个文件，您现在可以调用您的程序并指示它从 &lt;code&gt;args.txt&lt;/code&gt; 文件加载值，如以下命令运行所示：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;fromfile.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;@args.txt
Namespace&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;first&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;two&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;second&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;three&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;third&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在此命令的输出中，你可以看到 &lt;code&gt;argparse&lt;/code&gt; 已经读取了 &lt;code&gt;args.txt&lt;/code&gt; 的内容，并顺序地将值分配给了 &lt;code&gt;fromfile.py&lt;/code&gt; 程序的每个参数。所有参数及其值都已成功存储在 &lt;code&gt;Namespace&lt;/code&gt; 对象中。&lt;/p&gt;
&lt;p&gt;接受缩写选项名称的能力是 &lt;code&gt;argparse&lt;/code&gt; 命令行界面（CLI）的另一个酷炫特性。这个特性是默认启用的，当你的程序具有长选项名称时非常有用。例如，考虑以下程序，它会在命令行下打印出你在 &lt;code&gt;--argument-with-a-long-name&lt;/code&gt; 选项后指定的值：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# abbreviate.py&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;--argument-with-a-long-name&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argument_with_a_long_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这个程序会打印出你在 &lt;code&gt;--argument-with-a-long-name&lt;/code&gt; 选项后传入的任何参数值。现在，请继续运行以下命令来检查 Python 的 &lt;code&gt;argparse&lt;/code&gt; 模块如何处理这些缩写：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--argument-with-a-long-name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--argument&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这些示例展示了如何缩写 &lt;code&gt;--argument-with-a-long-name&lt;/code&gt; 选项的名称，而应用程序仍能正常工作。此功能是默认启用的。如果你希望禁用它并禁止缩写，那么可以在 &lt;code&gt;ArgumentParser&lt;/code&gt; 中使用 &lt;code&gt;allow_abbrev&lt;/code&gt; 参数：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# abbreviate.py&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allow_abbrev&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;--argument-with-a-long-name&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argument_with_a_long_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;allow_abbrev&lt;/code&gt; 设置为 &lt;code&gt;False&lt;/code&gt; 会禁用命令行选项中的缩写。从这一点开始，你将需要为程序提供完整的选项名称才能正确工作。否则，你会收到一个错误：   &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--argument-with-a-long-name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--argument&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
usage:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;abbreviate.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;-h&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;--argument-with-a-long-name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
abbreviate.py:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unrecognized&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;arguments:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--argument&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第二个示例中的错误消息告诉你 &lt;code&gt;--argument&lt;/code&gt; 选项没有被识别为有效的选项。要使用该选项，你需要提供它的完整名称。&lt;/p&gt;
&lt;h2 id=&#34;微调你的命令行参数和选项&#34;&gt;微调你的命令行参数和选项&lt;a class=&#34;headerlink&#34; href=&#34;#微调你的命令行参数和选项&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;到目前为止，你已经学习了如何定制 &lt;code&gt;ArgumentParser&lt;/code&gt; 类的多个功能，以改善你的命令行界面（CLI）的用户体验。现在，你知道了如何调整你的应用程序的使用说明和帮助信息，以及如何微调命令行参数和选项的一些全局方面。&lt;/p&gt;
&lt;p&gt;在本节中，你将学习如何定制你的 CLI 的命令行参数和选项的其他几个功能。在这种情况下，你将使用 &lt;code&gt;.add_argument()&lt;/code&gt; 方法及其一些最相关的参数，包括 &lt;code&gt;action&lt;/code&gt;、&lt;code&gt;type&lt;/code&gt;、&lt;code&gt;nargs&lt;/code&gt;、&lt;code&gt;default&lt;/code&gt;、&lt;code&gt;help&lt;/code&gt; 等。     &lt;/p&gt;
&lt;h3 id=&#34;设置-option-背后的-action&#34;&gt;设置 Option 背后的 Action&lt;a class=&#34;headerlink&#34; href=&#34;#设置-option-背后的-action&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当你向命令行界面添加一个选项或标志时，通常需要定义如何将选项的值存储在调用 &lt;code&gt;.parse_args()&lt;/code&gt; 后得到的 &lt;code&gt;Namespace&lt;/code&gt; 对象中。为此，你会使用 &lt;code&gt;.add_argument()&lt;/code&gt; 的 &lt;code&gt;action&lt;/code&gt; 参数。&lt;code&gt;action&lt;/code&gt; 参数的默认值为 &amp;ldquo;store&amp;rdquo;，意味着提供的选项值将原样存储在 &lt;code&gt;Namespace&lt;/code&gt; 中。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;action&lt;/code&gt; 参数可以接受几个可能的值。以下是这些可能值的列表及其含义：&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;75&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-75/</link>
      <pubDate>Thu, 06 Jun 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-75/</guid>
      
    </item>
    
    <item>
      <title>Chrome/Edge 地址栏正常显示完整的 URL</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;对于在 Chrome/Edge 使用 IP 或者其他 URL 访问网页，地址栏想复制 IP/URL 非要给我自动加上 &lt;code&gt;http://&lt;/code&gt;(或者 &lt;code&gt;https://&lt;/code&gt;) 前缀。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;chrome&#34;&gt;Chrome&lt;a class=&#34;headerlink&#34; href=&#34;#chrome&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Google Chrome 对于这个问题的解决方法很简单：在 URL 地址栏点击 &amp;ldquo;鼠标右键&amp;rdquo; -&amp;gt; 选择 &amp;ldquo;总是显示完整网址&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;chrome-show-url&#34; src=&#34;https://gi.weiyan.tech/2024/06/chrome-show-url.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;edge&#34;&gt;Edge&lt;a class=&#34;headerlink&#34; href=&#34;#edge&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;右键点击 Microsoft Edge 的桌面快捷方式，选择属性。
   &lt;img alt=&#34;edge-1&#34; src=&#34;https://gi.weiyan.tech/2024/05/edge-1.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在启动目标结尾追加空格以及下面这段代码并保存。
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;--disable-features=msHideSteadyStateUrlPath
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
   &lt;img alt=&#34;edge-disable-features&#34; src=&#34;https://gi.weiyan.tech/2024/05/edge-disable-features.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启浏览器后地址栏就可以显示完整 URL 了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;74&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-74/</link>
      <pubDate>Wed, 29 May 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-74/</guid>
      
    </item>
    
    <item>
      <title>适合我的 RSS 阅读器</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;好多年前，写过一篇文章《&lt;a href=&#34;https://zhuanlan.zhihu.com/p/42088810&#34;&gt;使用RSS打造你的科研资讯头条&lt;/a&gt;》，但是由于没有趁手的 RSS 阅读器以至于让 RSS 信息聚合的这个念头荒废了好多年。直到最近用上了 &lt;a href=&#34;https://github.com/oxyry/qireader&#34;&gt;QiReader&lt;/a&gt; - 优雅的在线 RSS 阅读器，我的 RSS 信息聚合好像又找到了延续下去的动力。 &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;不得不说，它很好的满足了我 Web 端+移动端同步的使用需求，而且国内国外通用。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;qireader-twitter&#34; src=&#34;https://gi.weiyan.tech/2024/05/qireader-twitter.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在价格层面，一年 Pro 会员 ￥38，二年 ￥68，五年 ￥128，也不算贵 —— 于是，果断入手了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;qireader-plans&#34; src=&#34;https://gi.weiyan.tech/2024/05/qireader-plans.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;73&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-73/</link>
      <pubDate>Tue, 21 May 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-73/</guid>
      
    </item>
    
    <item>
      <title>Twitter</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;相比微博，Twitter 更有意思一些，除了可以获取到很多技术大咖的日常和动态，还能发现不少有意思的人和事。加上推特世界性的，开放性的一些特点，所以可以看到的自然是什么都有也比国内精彩。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;能够翻出来的都是有点认知的人，虽然不一定全对，但也有一定道理。&lt;/p&gt;
&lt;p&gt;微博用的比较少，感觉更加偏向娱乐和一些时事热点。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;72&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-72/</link>
      <pubDate>Thu, 16 May 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-72/</guid>
      
    </item>
    
    <item>
      <title>mamba 的两个分支 miniforge 和 mambaforge</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在安装 mamba 的时候在 &lt;a href=&#34;https://github.com/conda-forge/miniforge/releases&#34;&gt;release&lt;/a&gt; 页面和&lt;a href=&#34;https://mamba.readthedocs.io/en/latest/installation/mamba-installation.html&#34;&gt;官方的安装页面&lt;/a&gt; 总是看到关于 miniforge 和 mambaforge 的选择问题，傻傻搞不明白。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;miniforge-和-mambaforge&#34;&gt;Miniforge 和 Mambaforge&lt;a class=&#34;headerlink&#34; href=&#34;#miniforge-和-mambaforge&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://github.com/conda-forge/miniforge?tab=readme-ov-file#faq&#34;&gt;https://github.com/conda-forge/miniforge?tab=readme-ov-file#faq&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s the difference between Mambaforge and Miniforge?&lt;/strong&gt;  &lt;br /&gt;
After the release of Miniforge 23.3.1 in August 2023, Miniforge and Mambaforge are essentially identical. The only difference is the name of the installer and subsequently the default installation path.&lt;/p&gt;
&lt;p&gt;2023 年 8 月发布 Miniforge 23.3.1 后，Miniforge 和 Mambaforge 基本相同。唯一的区别是安装程序的名称以及随后的默认安装路径(一个默认是 miniforge3，一个默认是 mambaforge3)。&lt;/p&gt;
&lt;p&gt;Before that release, Miniforge only shipped conda, while Mambaforge added mamba on top. Since Miniconda started shipping conda-libmamba-solver in July 2023, Miniforge followed suit and started shipping it too in August. At that point, since conda-libmamba-solver depends on libmambapy, the only difference between Miniforge and Mambaforge was the presence of the mamba Python package. To minimize surprises, we decided to add mamba to Miniforge too.    &lt;/p&gt;
&lt;p&gt;在之前的版本中，Miniforge 仅提供 conda，而 Mambaforge 在此基础上增加了 mamba。自 2023 年 7 月 Miniconda 开始提供 conda-libmamba-solver 以来，Miniforge 也紧随其后，于 8 月开始提供此功能。那时，由于 conda-libmamba-solver 依赖于libmambapy，Miniforge 和 Mambaforge 之间的唯一区别就是是否包含 mamba Python 包。为了尽量减少意外情况，我们决定也在 Miniforge 中添加 mamba。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should I choose one or another going forward at the risk of one of them gettting deprecated?&lt;/strong&gt;   &lt;br /&gt;
Given its wide usage, there are no plans to deprecate Mambaforge. If at some point we decide to deprecate Mambaforge, it will be appropriately announced and communicated with sufficient time in advance.&lt;/p&gt;
&lt;p&gt;鉴于 Mambaforge 的广泛使用，目前没有计划将其弃用。如果未来我们决定弃用 Mambaforge，我们会提前充分公告并通知相关用户。&lt;/p&gt;
&lt;p&gt;That said, if you had to start using one today, we recommend to stick to Miniforge.&lt;/p&gt;
&lt;p&gt;不过，如果你今天需要开始使用其中一个，我们建议你坚持使用 Miniforge。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;miniforge-和-miniconda&#34;&gt;Miniforge 和 Miniconda&lt;a class=&#34;headerlink&#34; href=&#34;#miniforge-和-miniconda&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://bioconda.github.io/faqs.html#what-s-the-difference-between-anaconda-conda-miniconda-mamba-mambaforge-micromamba&#34;&gt;What’s the difference between Anaconda, conda, Miniconda, mamba, Mambaforge, micromamba?&lt;/a&gt; - bioconda#Faqs&lt;/p&gt;
&lt;p&gt;Miniforge 是社区 (conda-forge) 驱动的简约 conda 安装程序。Miniforge 与 Miniconda 类似，但预配置了 &lt;code&gt;conda-forge&lt;/code&gt; 通道，并且所有包都来自 conda-forge 而不是 &lt;code&gt;defaults&lt;/code&gt; 通道。现在它还包含了 mamba 和 libmamba。&lt;/p&gt;
&lt;p&gt;Miniconda 是公司 (Anaconda) 驱动的简约 conda 安装程序。随后的软件包安装来自 anaconda 频道（默认或其他）。&lt;/p&gt;
&lt;h2 id=&#34;一句话&#34;&gt;一句话&lt;a class=&#34;headerlink&#34; href=&#34;#一句话&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;总的一句话来说，Mambaforge 类似于 Miniforge，但将 mamba 安装到基础环境中。虽然没有严格弃用，但从 &lt;strong&gt;2023 年 9 月&lt;/strong&gt;起不鼓励使用它（请参阅 miniforge 自述 &lt;a href=&#34;https://github.com/conda-forge/miniforge&#34;&gt;README&lt;/a&gt; 文件）。&lt;/p&gt;
&lt;h2 id=&#34;版本选择&#34;&gt;版本选择&lt;a class=&#34;headerlink&#34; href=&#34;#版本选择&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Miniforge3 的 &lt;a href=&#34;https://github.com/conda-forge/miniforge/releases/tag/24.5.0-0&#34;&gt;Release 24.5.0-0&lt;/a&gt; 要求 &lt;strong&gt;Linux-x86_64: glibc &amp;gt;= 2.17&lt;/strong&gt;，也就是对于 CentOS/RHEL 6.x (glibc = 2.12) 的旧服务器将无法正常安装使用。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lsb_release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a
LSB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Version:&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;:core-4.1-amd64:core-4.1-noarch
Distributor&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ID:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CentOS
Description:&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;CentOS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Linux&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7&lt;/span&gt;.7.1908&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Core&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
Release:&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7&lt;/span&gt;.7.1908
Codename:&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;Core

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ldd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--version
ldd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;GNU&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libc&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.17
Copyright&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2012&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Free&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Software&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Foundation,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Inc.
This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;free&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;software&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;see&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;copying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conditions.&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;There&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NO
warranty&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;even&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MERCHANTABILITY&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FITNESS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FOR&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;A&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PARTICULAR&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PURPOSE.
Written&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Roland&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;McGrath&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Ulrich&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Drepper.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;miniforge3-24.5.0-0&#34; src=&#34;https://gi.weiyan.tech/2025/03/miniforge3-24.5.0-0.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;71&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-71/</link>
      <pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-71/</guid>
      
    </item>
    
    <item>
      <title>寻找 GitHub 的替代品</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;与其说是在寻找 GitHub 的替代品，倒不如说在寻找 GitHub 的备用站点 —— 以防万一 GitHub 哪天登不上去了，也不至于把托管在上面的东西都丢了，尤其对于我这种几乎把所有可公开文档都记录在 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions&#34;&gt;GitHub Discussions&lt;/a&gt; 上的人，毕竟把所有的鸡蛋放在一个篮子里终究是很危险的。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;代码&#34;&gt;代码&lt;a class=&#34;headerlink&#34; href=&#34;#代码&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果纯粹是代码托管，这样的备用平台多的是。&lt;/p&gt;
&lt;p&gt;除去国内的那几家，国外优秀的托管平台更多一些。如 &lt;a href=&#34;https://framagit.org/&#34;&gt;Framagit&lt;/a&gt; 和 &lt;a href=&#34;https://codeberg.org/&#34;&gt;Codeberg&lt;/a&gt;。&lt;a href=&#34;https://framagit.org/&#34;&gt;Framagit&lt;/a&gt; 是一个基于 GitLab 的法国托管平台，而 &lt;a href=&#34;https://codeberg.org/&#34;&gt;Codeberg&lt;/a&gt; 则是一个站点（总部）在德国，由非盈利组织采用自由软件（Gitea）搭建的代码托管平台，两相比较，个人感觉 &lt;a href=&#34;https://codeberg.org/&#34;&gt;Codeberg&lt;/a&gt; 比 &lt;a href=&#34;https://framagit.org/&#34;&gt;Framagit&lt;/a&gt; 体验更友好，最起码文档和各种导航操作更加清晰明了。&lt;/p&gt;
&lt;p&gt;最最重要的一点是，这两个托管平台目前国内都可以直接连接。&lt;/p&gt;
&lt;h2 id=&#34;issues-和-discussions&#34;&gt;Issues 和 Discussions&lt;a class=&#34;headerlink&#34; href=&#34;#issues-和-discussions&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果说 Issues 和 Discussions 的备用站点，这个就不好说了。国内的 &lt;a href=&#34;https://gitcode.com/&#34;&gt;GitCode&lt;/a&gt; 和 &lt;a href=&#34;https://atomgit.com/&#34;&gt;AtomGit&lt;/a&gt; 虽然都有类似的功能，但是&lt;strong&gt;都不能搜索内容&lt;/strong&gt;，虽然他们说全文搜索已经&lt;a href=&#34;https://atomgit.com/atomgit_operate/feedback/issues/496&#34;&gt;在路上了&lt;/a&gt;，但是背后的 CSDN 运营和 UI 风格真是让人有点担忧重蹈 CSDN 的尿性体验。&lt;/p&gt;
&lt;p&gt;尤其是最近（2024年6月）这一段时间 GitCode 被曝&lt;a href=&#34;https://www.ithome.com/0/778/049.htm&#34;&gt;批量搬运 Github 项目&lt;/a&gt;的事件，让本来对 CSDN 厌恶至极的我瞬间好感全无，开始对 GitCode 也时刻保持警戒心态。&lt;/p&gt;
&lt;h2 id=&#34;pages&#34;&gt;Pages&lt;a class=&#34;headerlink&#34; href=&#34;#pages&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gitee Pages 在五一&lt;a href=&#34;https://gitee.com/oschina/git-osc/issues/I9L5FJ&#34;&gt;悄悄关停了&lt;/a&gt; 也终于让人对国内代码托管平台开启 Pages 服务不再抱有期待。虽然最近发现 &lt;a href=&#34;https://atomgit.com/&#34;&gt;AtomGit&lt;/a&gt; 也提供了 &lt;a href=&#34;https://atomgit.com/apps/pages&#34;&gt;AtomGit Pages&lt;/a&gt;，而且也的确能正常的用起来了，但谁能确保未来会不会也跟 Gitee Pages 一个下场！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;atomgit-pages-for-atomgit&#34; src=&#34;https://gi.weiyan.tech/2024/07/atomgit-pages-for-atomgit.jpg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;想法&#34;&gt;想法&lt;a class=&#34;headerlink&#34; href=&#34;#想法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于国内监管的一些问题，国内的开源社区大多都让人一言难尽，曾经的极狐也因为收费的问题把个人用户的最后一根稻草给压垮了，总的来说，国内目前为止就还没有一家能跟得上 GitHub/GitLab 的开源平台，不管从开源本身还是功能体验，现在没有，未来也不一定能有。&lt;/p&gt;
&lt;p&gt;用了一段时间 AtomGit，页面 UI 真是无法忍受，一堆的 BUG 毫无修复（&lt;a href=&#34;https://atomgit.com/atomgit_operate/feedback/issues/442&#34;&gt;issues#442&lt;/a&gt;、&lt;a href=&#34;https://atomgit.com/atomgit_operate/feedback/issues/668&#34;&gt;issues#668&lt;/a&gt;），用户体验全无。还是先在 GitCode，继续苟着吧！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;70&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-70/</link>
      <pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-70/</guid>
      
    </item>
    
    <item>
      <title>我的独立站点 Knowledge-Garden</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;使用 GitHub Discussions 写作文章大半年以来，越来越得心应手，最近起用了新的一个仓库，用于 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions&#34;&gt;Knowledge-Garden&lt;/a&gt; 静态资源的保存和使用。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;文章&#34;&gt;文章&lt;a class=&#34;headerlink&#34; href=&#34;#文章&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;所有的文章都是以 markdown 的格式进行保存，实际上就一堆 text 文本，占用不了多少的空间。&lt;/p&gt;
&lt;h2 id=&#34;静态资源&#34;&gt;静态资源&lt;a class=&#34;headerlink&#34; href=&#34;#静态资源&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;文章的静态资源，主要是图片，才是一个最耗流量和存储空间的东西。&lt;/p&gt;
&lt;p&gt;前一段时间经历了&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/63&#34;&gt;腾讯云 cos 对象存储被盗刷&lt;/a&gt; 的事件后，对于对象存储的使用也就越来越谨慎，今天终于狠下决心来把 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions&#34;&gt;Knowledge-Garden&lt;/a&gt; 这个仓库的所有包括图片在内的静态资源开始保存到另外一个 GitHub 仓库 &lt;a href=&#34;https://github.com/shenweiyan/PicKG&#34;&gt;PicKG&lt;/a&gt;，同时借助 Cloudflare Pages 来为图片提供访问链接。&lt;/p&gt;
&lt;p&gt;也尝试了一下 Cloudflare 的 &lt;a href=&#34;https://www.cloudflare.com/zh-cn/developer-platform/r2/&#34;&gt;R2&lt;/a&gt; 这个号称零出口费用的对象存储，免费额度很有吸引力，但目前 Cloudflare R2 还没能找到一个比较顺手的图片管理工具，例如阿里云的 &lt;a href=&#34;https://github.com/aliyun/oss-browser&#34;&gt;oss-browser&lt;/a&gt;、腾讯云的 &lt;a href=&#34;https://cosbrowser.cloud.tencent.com/&#34;&gt;cos-browser&lt;/a&gt;。虽然尝试了一些折中的方案，如 &lt;a href=&#34;https://github.com/shenweiyan/Picx4R2&#34;&gt;Picx4R2&lt;/a&gt;，但还是不太满意。&lt;/p&gt;
&lt;p&gt;所以目前的解决方法就是 GitHub + &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/68&#34;&gt;PicX&lt;/a&gt; + Cloudflare Pages 进行组合，GitHub 单个仓库 5G 的存储空间应该应该也足够使用了，如果实在不够了再来考虑其他方案。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;69&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-69/</link>
      <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-69/</guid>
      
    </item>
    
    <item>
      <title>部署 PicX 图床到 Vercel</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;由于 &lt;a href=&#34;https://github.com/XPoet/picx&#34;&gt;PicX&lt;/a&gt; 自 v3.0 起，不再支持自由选择仓库和分支，统一使用内置的仓库和分支。所以出于自定义的仓库和分支使用需求，这里主要对 &lt;a href=&#34;https://github.com/XPoet/picx/tree/v2&#34;&gt;PicX v2.0&lt;/a&gt; 进行 Vercel 自定义部署。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;项目地址：https://github.com/XPoet/picx/tree/v2&lt;/p&gt;
&lt;p&gt;利用 PicX 图床，直接把图片托管到 GitHub 上去。至于安装，参考&lt;a href=&#34;https://zburu.com/&#34;&gt;子舒 Blog&lt;/a&gt;的《&lt;a href=&#34;https://zburu.com/blog/172.html/&#34;&gt;安装一个基于 Github 的静态图床程序&lt;/a&gt;》这两篇文章。可以把程序和图床直接托管在 GitHub 上，也可以把程序搭建在自己的服务器上，但是图片还是只能托管到 GitHub 上。PicX 图床不像简单图床和兰空图床，图片生成的链接可以是自己的域名链接，而因为图片是托管到 GitHub 上，所以 PicX 生成的图片外链接只能是 staticaly 和 cloudfalre 的 CDN 的外链。所以个人感觉也就没有必要再把程序上传到自己的服务器上了，直接使用 GitHub 不是更好嘛。&lt;/p&gt;
&lt;h2 id=&#34;操作步骤&#34;&gt;操作步骤&lt;a class=&#34;headerlink&#34; href=&#34;#操作步骤&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主要的操作步骤如下： &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 个 GitHub 账号；&lt;/li&gt;
&lt;li&gt;1 个 Vercel 账号，可能需要科学上网环境；&lt;/li&gt;
&lt;li&gt;Fork PicX v2 源码 (https://github.com/XPoet/picx/tree/v2) 到个人 GitHub 仓库；&lt;/li&gt;
&lt;li&gt;在 Vercel 新建项目，绑定个人 GitHub 仓库的 PicX v2 源码；Framework Preset 选择 &amp;ldquo;Vue.js&amp;rdquo;；&lt;/li&gt;
&lt;li&gt;部署完成后为域名添加一条 CNAME 到 &lt;code&gt;cname-china.vercel-dns.com&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基于以上的步骤，个人成功部署的一个 PicX 站点，以供参考和使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://github.com/shenweiyan/PicX&lt;/li&gt;
&lt;li&gt;链接1：&lt;a href=&#34;https://v2picx.vercel.app/&#34;&gt;https://v2picx.vercel.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;链接2：&lt;a href=&#34;https://picx.weiyan.cc/&#34;&gt;https://picx.weiyan.cc/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;picx-weiyan-cc&#34; src=&#34;https://gi.weiyan.tech/2024/05/picx-weiyan-cc.webp&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;68&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-68/</link>
      <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-68/</guid>
      
    </item>
    
    <item>
      <title>国内静态部署与托管平台</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;&lt;a href=&#34;https://gitee.com/help/articles/4136/&#34;&gt;Gitee Pages&lt;/a&gt; 由于审查原因，基本上已经是名存实亡的状态了；之前勉强可以使用的  &lt;a href=&#34;https://webify.cloudbase.net/&#34;&gt;Webbify&lt;/a&gt; 现如今也变成了每月至少 15 块的购买时长模式。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;之前在《&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/56&#34;&gt;越来越难用的国内代码托管平台&lt;/a&gt;》吐槽过一波国内所谓开源平台的状况，今天又发现除了代码平台外，原来静态部署的平台也走上了这一条路。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gitee.com/help/articles/4136/&#34;&gt;Gitee Pages&lt;/a&gt; 就不说了，懂得都懂。&lt;/p&gt;
&lt;p&gt;说一说腾讯云的 &lt;a href=&#34;https://webify.cloudbase.net/&#34;&gt;Webbify&lt;/a&gt;。今天 (2024年4月15) 上去想要部署一个新的站点，居然发现以前的 &lt;strong&gt;&amp;ldquo;按量付费&amp;rdquo;&lt;/strong&gt; 计费模式已经消失，取而代之的是一个每月至少 15 块的购买时长模式。作为一个 2021 年就不再更新的产品，这样的收费模式真是让人瞬间欲望大减。
&lt;img alt=&#34;webify-price-15-pre-month.webp&#34; src=&#34;https://static.weiyan.tech/2024/04/webify-price-15-pre-month.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回过头来看一看国外的 &lt;a href=&#34;https://app.netlify.com/&#34;&gt;Netlify&lt;/a&gt;、&lt;a href=&#34;https://vercel.com/&#34;&gt;Vercel&lt;/a&gt;、&lt;a href=&#34;https://www.cloudflare-cn.com/developer-platform/pages/&#34;&gt;Cloudflare Pages&lt;/a&gt;，甚至是 GitHub Pages，再看一下国内的这些平台，真是一言难尽，除了先培养用户再收割，好像也没剩下什么了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;67&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-67/</link>
      <pubDate>Mon, 15 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-67/</guid>
      
    </item>
    
    <item>
      <title>RSS 订阅插件 mkdocs-rss-plugin 的一些问题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;聊一下 Mkdocs Material 的默认插件 &lt;a href=&#34;https://github.com/Guts/mkdocs-rss-plugin&#34;&gt;mkdocs-rss-plugin&lt;/a&gt; 在使用上的一些问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;对于 blog 插件，默认的 RSS 里边提供的地址有一部分会默认为目录链接(例如 &lt;code&gt;category&lt;/code&gt; 和 &lt;code&gt;archive&lt;/code&gt;)，而非文章地址。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;rss-item.webp&#34; src=&#34;https://static.weiyan.tech/2024/04/rss-item.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;针对这一种情况，需要使用 RSS 配置的 &lt;a href=&#34;https://guts.github.io/mkdocs-rss-plugin/configuration/#match_path-filter-pages-to-include-in-feed&#34;&gt;&lt;code&gt;match_path&lt;/code&gt;&lt;/a&gt;，即可解决：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;plugins:
  - rss:
      match_path: &#34;(blog/posts|flinks|galaxy|message|note|readme|tech|yuque)/.*&#34;
      date_from_meta:
        as_creation: date
      categories:
        - categories
        - tags
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;65&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-65/</link>
      <pubDate>Thu, 11 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-65/</guid>
      
    </item>
    
    <item>
      <title>阿里云域名备案与使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在阿里云注册且完成备案的域名，在使用与解析中遇到的一些问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;备案接入信息与实际接入信息不符&#34;&gt;备案接入信息与实际接入信息不符&lt;a class=&#34;headerlink&#34; href=&#34;#备案接入信息与实际接入信息不符&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在阿里云注册且完成备案的域名，前两天收到了信息：如您的网站备案还要继续使用，请您务必于2024-04-18 09:05:39之前设置解析指向阿里云内地服务器且恢复该网站在阿里云内地节点服务器的正常访问。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如您的网站备案还要继续使用，请您务必于2024-04-18 09:05:39之前设置解析指向阿里云内地服务器且恢复该网站在阿里云内地节点服务器的正常访问。若在规定时间内未完成整改，可能会导致备案信息被取消接入或被注销，影响您网站的正常访问；若您的备案域名解析IP地址已指向阿里云备案的内地节点（不含香港）服务器，且保持正常访问，请忽略此邮件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;beian-weiyan-cc.webp&#34; src=&#34;https://static.weiyan.tech/2024/04/beian-weiyan-cc.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;目前，参考知乎《&lt;a href=&#34;https://zhuanlan.zhihu.com/p/516077564&#34;&gt;阿里云服务器备案域名会掉吗&lt;/a&gt;》的方法 —— 先把目前 &lt;code&gt;weiyan.cc&lt;/code&gt; 下的一到两个子域名增加一个 A 记录绑定到阿里云的 ECS 公网 IP，主域名继续按目前的要求通过 CNAME 绑定 &lt;a href=&#34;https://weiyan.netlify.app&#34;&gt;weiyan.netlify.app&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;再看看后续是否有影响。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2024年11月28日，半年过去了，这个方法好像的确可以。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;已备案域名未使用阿里云中国内地节点服务器&#34;&gt;已备案域名未使用阿里云中国内地节点服务器&lt;a class=&#34;headerlink&#34; href=&#34;#已备案域名未使用阿里云中国内地节点服务器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是 2024-11-19 收到的阿里云消息，发现个人博客类网站现在用起真的是门槛越来越高。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如您的网站备案还要继续保留阿里云的备案信息，请您务必于&lt;strong&gt;2024-11-25 14:12:51之前设置恢复使用阿里云服务器&lt;/strong&gt;。若在规定时间内未完成整改，可能会导致备案信息被取消接入或被注销，影响您网站的备案状态。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;beian-aliyun-server&#34; src=&#34;https://gi.weiyan.tech/2024/11/beian-aliyun-server.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;参考了一些人的&lt;a href=&#34;https://blog.csdn.net/qq_36759224/article/details/104210934&#34;&gt;方法&lt;/a&gt;：将你的域名添加一个二级域名，解析到某些阿里云国内节点服务器上就行了。例如我博客域名为 &lt;code&gt;www.abcde.com&lt;/code&gt;，就可以添加一个或者两个 A 记录，记录值为阿里云国内节点服务器的 IP。然后隔一段时间访问一下 &lt;code&gt;1.abcde.com&lt;/code&gt; 或者 &lt;code&gt;2.abcde.com&lt;/code&gt; ，确保有一点儿访问量就行了。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 用最简单的方式在服务器开启一个 HTML &lt;/span&gt;
nohup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-m&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http.server&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--cgi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;也有人说，必须是 &lt;code&gt;www&lt;/code&gt; 和根域名，其他不行，先试试二级域名吧！&lt;/p&gt;
&lt;p&gt;目前尚不清楚这样的做法是否能确保备案不失效，如果备案失效，很可能导致域名被墙的，根据网络上一些人的说法，默认不影响站点访问，但是个别城市的运营商会屏蔽（和你没关系，是他们一刀切了国外 IP 的解析）。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;66&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-66/</link>
      <pubDate>Thu, 11 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-66/</guid>
      
    </item>
    
    <item>
      <title>无趣的人</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;有趣的灵魂万里挑一，好看的皮囊千篇一律。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;活得通透的人 ，没有特别想维持的关系 ，也没有特别想要的东西 ，走近的人不抗拒 ，离开的人不强留 ，就连吃亏也懒得计较。&lt;/p&gt;
&lt;p&gt;从统计上来看，成年后还能重塑自我的人太罕见了。年纪越大就越相信命运，其中最大的一个原因就是理解人的改变之难。意图改变不如早早学会接纳。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;64&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-64/</link>
      <pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-64/</guid>
      
    </item>
    
    <item>
      <title>腾讯云 cos 也被盗刷了</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;我的 &lt;a href=&#34;https://bioit.top/&#34;&gt;WebStack-Hugo&lt;/a&gt; 个人导航站点最开始用的是腾讯云的 cos 对象存储作为所有图片的存储和访问，在 2024 年 3 月底的时候收到腾讯云的通知说 200 万次的标准存储请求已经用掉了 180 多万次。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;cos-warning.webp&#34; src=&#34;https://static.weiyan.tech/2024/03/cos-warning.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;收到信息吓了一跳，心想我这一个小破网站不至于这么多的请求吧，肯定被攻击盗刷了。加上之前在网络上看到的阿里云/腾讯云对象存储被刷爆的新闻还历历在目，于是赶紧的上去腾讯云一看发现一天的读写请求居然达到了 25 万多次！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cos-y-requests&#34; src=&#34;https://static.weiyan.tech/2024/03/cos-y-requests.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;虽然之前一直设置了防盗链，但是一直允许着 &lt;strong&gt;&amp;ldquo;空 referer&amp;rdquo;&lt;/strong&gt;，这无疑是一个巨大的漏洞，参考 《&lt;a href=&#34;https://zhuanlan.zhihu.com/p/660308000&#34;&gt;COS被流量盗刷了&lt;/a&gt;》 的经历，第一时间就把这个 &lt;strong&gt;&amp;ldquo;空 referer&amp;rdquo;&lt;/strong&gt; 设置为了 &lt;strong&gt;&amp;ldquo;拒绝&amp;rdquo;&lt;/strong&gt;，并开启了日志。&lt;/p&gt;
&lt;p&gt;果不其然，一段时间过后从生成的日志文件，发现了这样的一个网址：&lt;a href=&#34;https://123.wqydl.cn/&#34;&gt;https://123.wqydl.cn/&lt;/a&gt;。
&lt;img alt=&#34;123-wqydl-get&#34; src=&#34;https://static.weiyan.tech/2024/03/123-wqydl-get.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这个网站一直在请求获取个人 cos 内的 &lt;code&gt;/webstack/logos/default.webp&lt;/code&gt; 这个图片！为了安全起见，又赶紧第一时间把这个网站加入了黑名单，并且把对应的 cos 权限设置成了 &lt;strong&gt;&amp;ldquo;私有读写&amp;rdquo;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但是从源源不断产生的日志可以看到这个恶心的网站还一直不依不饶在每隔几分钟就执行一堆读取请求！
&lt;img alt=&#34;get-requests-by-time.webp&#34; src=&#34;https://static.weiyan.tech/2024/03/get-requests-by-time.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;但幸运的是这些请求现在都 &lt;strong&gt;&amp;ldquo;AccessDenied&amp;rdquo;&lt;/strong&gt; 了，但对它的一些后续可能的动作也很是好奇，在持续观察中。
&lt;img alt=&#34;cos-access-denied.webp&#34; src=&#34;https://static.weiyan.tech/2024/03/cos-access-denied.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cos-log.png&#34; src=&#34;https://static.weiyan.tech/2024/03/cos-log.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cos-safe.png&#34; src=&#34;https://static.weiyan.tech/2024/03/cos-safe.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;终于，第二天的晚上终于在他们的官网联系上了对应的客服，他们把相应的网站停掉后一切又回归正常。   &lt;br /&gt;
&lt;img alt=&#34;cos-package-free.webp&#34; src=&#34;https://static.weiyan.tech/2024/04/cos-package-free.webp&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后，以此为鉴，希望大家在提供公共资源的时候擦亮眼睛，避免踩坑。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;63&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-63/</link>
      <pubDate>Fri, 29 Mar 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-63/</guid>
      
    </item>
    
    <item>
      <title>图床管理与使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;随着博客和其他一些站点多了起来，日积月累的访问越来越觉得腾讯云 cos 和阿里云 oss 是远远不够的，于是开始想着寻找可以一劳永逸的图床管理和使用替代者。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;GitHub 的图床虽然不错，但如果文件越来越多，终究不是一个很好的解决方案。&lt;/p&gt;
&lt;p&gt;Cloudflare R2 目前看来是个不错的选项，但是图片的上传、删除和日常管理目前还没有找到一个比较顺手的工具。目前在用的一个 &lt;a href=&#34;https://github.com/shenweiyan/Picx4R2/&#34;&gt;Picx4R2&lt;/a&gt; 还有一些不太满意的地方，即上传的图片无法保留原始的文件名！—— 不过幸运的是借助百度文心一言终于把保留原始文件名的这个问题给解决了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;62&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-62/</link>
      <pubDate>Wed, 27 Mar 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-62/</guid>
      
    </item>
    
    <item>
      <title>Python 里面没 if 也能用 else</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;这是来自于 &lt;a href=&#34;https://twitter.com/YangZhou1993&#34;&gt;Yang Zhou&lt;/a&gt; 发表在 &lt;a href=&#34;https://medium.com/techtofreedom/beyond-if-else-leveraging-pythons-versatile-else-statements-9ac260dac102&#34;&gt;Medium&lt;/a&gt; 的一篇文章 《&lt;a href=&#34;https://medium.com/techtofreedom/beyond-if-else-leveraging-pythons-versatile-else-statements-9ac260dac102&#34;&gt;Beyond If-Else: Leveraging Python’s Versatile “Else” Statements&lt;/a&gt;》，作者觉得挺有意思的，拿过来简单翻译了一下在这里分享给大家。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;p&gt;当我们说到 &amp;ldquo;else&amp;rdquo;，必须先有 &amp;ldquo;if&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;这对于许多编程语言来说都是正确的，但对于 Python 来说却不然。&lt;/p&gt;
&lt;p&gt;Python 的 else 语句比我们想象的更通用。&lt;/p&gt;
&lt;p&gt;从循环后的 &amp;ldquo;else&amp;rdquo; 到 try- except 块后的 &amp;ldquo;else&amp;rdquo;，本文将探讨 else 语句鲜为人知的功能。&lt;/p&gt;
&lt;p&gt;我们不一定需要在生产中使用这些技巧，尤其是当我们的同事还不知道它们时，但仅仅意识到它们的存在就可以让我们再次感受到 Python 的灵活性和多功能性。&lt;/p&gt;
&lt;h2 id=&#34;1-while-else-结构&#34;&gt;1. While-Else 结构&lt;a class=&#34;headerlink&#34; href=&#34;#1-while-else-结构&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 Python 中， &lt;code&gt;while&lt;/code&gt; 循环可以与 &lt;code&gt;else&lt;/code&gt; 块配对。当且仅当循环正常完成时，&lt;code&gt;else&lt;/code&gt; 块才会执行，这意味着它不会通过 &lt;code&gt;break&lt;/code&gt; 语句终止。&lt;/p&gt;
&lt;p&gt;换句话说，如果 &lt;code&gt;while&lt;/code&gt; 循环被 &lt;code&gt;break&lt;/code&gt; 终止，则 &lt;code&gt;else&lt;/code&gt; 块将不会被执行。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;leaders&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Elon&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Tim&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Warren&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;leaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;leaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Yang&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Yang is a leader!&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Not found Yang!&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# Not found Yang!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;如上面的示例所示， &lt;code&gt;while&lt;/code&gt; 循环迭代 &lt;code&gt;leaders&lt;/code&gt; 列表，搜索领导者 &amp;ldquo;Yang&amp;rdquo;。不幸的是，&amp;rdquo;Yang&amp;rdquo; 并不是该名单中真正的领导者。所以 &lt;code&gt;break&lt;/code&gt; 语句没有被执行。因此，&lt;code&gt;else&lt;/code&gt; 语句下的代码就被执行了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;else&lt;/code&gt; 语句的这种意外用法使我们无需添加额外的标志变量来标记循环是否被破坏。这样我们的 Python 程序就可以精简一些了。&lt;/p&gt;
&lt;h2 id=&#34;2-带有-for-循环的-else-语句&#34;&gt;2. 带有 For 循环的 Else 语句&lt;a class=&#34;headerlink&#34; href=&#34;#2-带有-for-循环的-else-语句&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For 循环和 &lt;code&gt;while&lt;/code&gt; 循环是编程的孪生兄弟。如果我们可以在 while 循环中利用 else 语句的多功能性，那么毫无疑问它可以用于 for 循环。&lt;/p&gt;
&lt;p&gt;这个想法是完全相同的：      &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &amp;ldquo;else&amp;rdquo; block only executes when there is no break in the for loop.   &lt;br /&gt;
&amp;ldquo;else&amp;rdquo; 块仅在 for 循环中没有中断时执行。     &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;让我们用 for 循环重写前面的示例：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;leaders&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Elon&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Tim&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Warren&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;leaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Yang&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Yang is a leader!&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Not found Yang!&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# Not found Yang!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;代码更简洁了，不是吗？你能用其他编程语言做到这一点吗？&lt;/p&gt;
&lt;h2 id=&#34;3-使用-else-语句进行异常处理&#34;&gt;3. 使用 Else 语句进行异常处理&lt;a class=&#34;headerlink&#34; href=&#34;#3-使用-else-语句进行异常处理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;异常处理是编写健壮且无错误的代码的一项重要技术。&lt;/p&gt;
&lt;p&gt;在 Python 中，整个异常处理代码块的结构应该如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;# Code that might raise an exception&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SomeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;# Code that runs if the try block raised &#39;SomeException&#39;&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;# Code that runs if the try block did NOT raise any exceptions&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;finally&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;# Code that always runs no matter what, often for cleanup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;除了 &lt;code&gt;try&lt;/code&gt; 块之外，所有其他部分都是可选的。&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;try&lt;/code&gt; 块未引发异常时， &lt;code&gt;else&lt;/code&gt; 块就会执行。这是放置仅当 &lt;code&gt;try&lt;/code&gt; 块成功且无异常时才运行的代码的好地方。这对于阐明代码的意图并防止 &lt;code&gt;except&lt;/code&gt; 块意外捕获非常有用。&lt;/p&gt;
&lt;p&gt;例如，以下程序实现了一个非常简单的除法函数：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;divide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ZeroDivisionError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Error: Division by zero.&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Result is &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;finally&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;Executing finally clause.&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;如果没有遇到 &lt;code&gt;ZeroDivisionError&lt;/code&gt;，结果如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;divide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2077&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Result is 2077.0&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Executing finally clause.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当然，如果满足定义的异常，则会打印相关的 &lt;code&gt;Error&lt;/code&gt; 消息：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;divide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2077&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Error: Division by zero.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Executing finally clause.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;要点总结&#34;&gt;要点总结&lt;a class=&#34;headerlink&#34; href=&#34;#要点总结&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 Python 中，else 语句不一定位于 if 语句之后。&lt;/p&gt;
&lt;p&gt;它还有三个额外但鲜为人知的用途：     &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;while-else 循环     &lt;/li&gt;
&lt;li&gt;for-else 循环     &lt;/li&gt;
&lt;li&gt;使用 else 块进行异常处理     &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是，我不建议您在生产中频繁应用它们，因为使用鲜为人知的功能可能会降低可读性并使您的同事感到困惑。但理解并随意应用它们会给你的同事留下深刻的印象，并巩固你作为 &amp;ldquo;Python 大师&amp;rdquo; 的地位。 😎&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;61&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-61/</link>
      <pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-61/</guid>
      
    </item>
    
    <item>
      <title>RockyLinux 9 基础配置与使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;今天终于在阿里云入手了一台 2核(vCPU)+ 2GiB + 3Mbps 的 ECS，安装了最新的 Rocky Linux release 9.3 (Blue Onyx)，记录一下开箱后的一些基础配置。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;aliyun-99-plan&#34; src=&#34;https://gi.weiyan.tech/2024/03/aliyun-99-plan.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;hostname&#34;&gt;Hostname&lt;a class=&#34;headerlink&#34; href=&#34;#hostname&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[root@r0sasd1bQi ~]# hostnamectl   # 查看一下当前主机名的情况
[root@r0sasd1bQi ~]# hostnamectl set-hostname shen-server --static
[root@r0sasd1bQi ~]# hostnamectl status
[root@r0sasd1bQi ~]# reboot now    # 重启服务器
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;创建新用户&#34;&gt;创建新用户&lt;a class=&#34;headerlink&#34; href=&#34;#创建新用户&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;adduser&lt;/code&gt; 命令将新用户添加到系统中：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;adduser&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shenweiyan&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 创建新用户&lt;/span&gt;
passwd&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shenweiyan&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 修改密码&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;用户添加超级权限&#34;&gt;用户添加超级权限&lt;a class=&#34;headerlink&#34; href=&#34;#用户添加超级权限&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;把 &lt;code&gt;shenweiyan&lt;/code&gt; 用户添加超级权限（&lt;code&gt;/etc/sudoers&lt;/code&gt;）：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;shenweiyan      ALL=(ALL)       NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;自定义快捷方式&#34;&gt;自定义快捷方式&lt;a class=&#34;headerlink&#34; href=&#34;#自定义快捷方式&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;~/.bashrc&lt;/code&gt; 最后新增一下用户自定义的快捷方式。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# User Specific Alias
alias disp=&#39;display&#39;
alias rm=&#39;rm -i&#39;
alias la=&#39;ls -al&#39;
alias ll=&#39;ls -lh&#39;
alias le=&#39;less -S&#39;

# Custom History setting
# HISTFILESIZE 定义了在 .bash_history 中保存命令的记录总数
HISTFILESIZE=3000000
# HISTSIZE 定义了 history 命令输出的记录数
HISTSIZE=3000
# 定义 History 输出格式
export HISTTIMEFORMAT=&#39;%F %T &#39;
# 使用 HISTCONTROL 从命令历史中剔除连续重复的条目
HISTCONTROL=ignoredups
# 将 bash 内存中历史命令追加到 .bash_history 历史命令文件中， 默认只有退出 shell 是才会保存
PROMPT_COMMAND=&#34;history -a&#34;

# Login Style
PS1=&#39;\033[35;1m\u@\h \[\e[m\]\t \[\033[36;1m\]$(pwd) \n$ \[\e[m\]&#39;
clear;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;epel-release&#34;&gt;epel-release&lt;a class=&#34;headerlink&#34; href=&#34;#epel-release&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;企业版 Linux 附加软件包（Extra Packages for Enterprise Linux，以下简称 EPEL）是一个 Fedora 特别兴趣小组，用以创建、维护以及管理针对企业版 Linux 的一个高质量附加软件包集，面向的对象包括但不限于 &lt;a href=&#34;https://fedoraproject.org/wiki/Red_Hat_Enterprise_Linux/zh-cn&#34;&gt;红帽企业版 Linux (RHEL)&lt;/a&gt;、 CentOS、Scientific Linux (SL)、Oracle Linux (OL) 。&lt;/p&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://fedoraproject.org/wiki/EPEL/zh-cn&#34;&gt;EPEL/zh-cn - Fedora Project Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 下面两个命令都可以安装&lt;/span&gt;
sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;epel-release
sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;htop-和-btop&#34;&gt;Htop 和 Btop&lt;a class=&#34;headerlink&#34; href=&#34;#htop-和-btop&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://htop.dev/&#34;&gt;Htop&lt;/a&gt; 是一个基于 C 编写的跨平台的交互式流程查看器，&lt;code&gt;htop&lt;/code&gt; 是 &lt;code&gt;top&lt;/code&gt; 的一个增强替代品，提供了更加友好的用户界面和更多的功能，相比系统自带的 &lt;code&gt;top&lt;/code&gt; 更加直观好用。 &lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;htop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;btop&lt;/code&gt; 也是一个改进版的 Linux top 命令，这个命令不仅列出了各种系统使用情况，包括内存、磁盘、网络和进程，而且还允许与鼠标互动。即使是在服务器安装上，你也可以在 &lt;code&gt;btop&lt;/code&gt; 上指指点点，以树形方式查看进程，隐藏或显示某些显示，并访问选项菜单，在那里你可以调整显示的外观和感觉。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;btop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;docker-安装与使用&#34;&gt;Docker 安装与使用&lt;a class=&#34;headerlink&#34; href=&#34;#docker-安装与使用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主要参考《&lt;a href=&#34;https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-rocky-linux-9&#34;&gt;How To Install and Use Docker on Rocky Linux 9&lt;/a&gt;》，具体步骤如下：     &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;add the official Docker repository
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config-manager&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--add-repo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://download.docker.com/linux/centos/docker-ce.repo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install Docker
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker-ce&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker-ce-cli&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;containerd.io
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;start the Docker daemon
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;systemctl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;start&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that it’s running
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;systemctl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;status&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Output
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 749 (docker)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;make sure it starts at every server reboot
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;systemctl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置非 root 用户使用 Docker
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;usermod&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-aG&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;username
newgrp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;docker&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#更新docker用户组&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;60&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-60/</link>
      <pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-60/</guid>
      
    </item>
    
    <item>
      <title>我的随笔和博客</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;我的站点中把&lt;a href=&#34;https://weiyan.cc/note/&#34;&gt;随笔&lt;/a&gt;和&lt;a href=&#34;https://weiyan.cc/blog/&#34;&gt;博客&lt;/a&gt;分成了两个平行的导航，其实内容是一样的，只是原文托管的平台不一样而已。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;a href=&#34;https://weiyan.cc/note/&#34;&gt;随笔&lt;/a&gt; 的内容最开始是在语雀的&lt;a href=&#34;https://www.yuque.com/shenweiyan/notebook&#34;&gt;随笔与乱弹&lt;/a&gt;写的，导出来后加到现在的站点中，独立成了现在看到的&lt;a href=&#34;https://weiyan.cc/note/&#34;&gt;随笔&lt;/a&gt;。&lt;a href=&#34;https://weiyan.cc/blog/&#34;&gt;博客&lt;/a&gt; 则是从 2023 年起写在 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden&#34;&gt;Knowledge-Garden&lt;/a&gt; 的 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/&#34;&gt;discussions&lt;/a&gt; 上的一些非技术相关杂文。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;59&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-59/</link>
      <pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-59/</guid>
      
    </item>
    
    <item>
      <title>如今迈步从头越</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2024 年应该是不太平凡的一年，农历新年后经历了很多的事情，生活也好工作也好，都不太平静。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;尤其对于工作而言，有一些更加深入的体会，明白很多人和事都并非表面那么简单。职场多年一路走来，曾经的迷茫不解，焦虑，纠结，吐槽，走到最后不由得越来越小心翼翼、如履薄冰。时间实际上是人的积极存在，它不仅是人的生命的尺度，而且是人的发展的空间。总的来说，更加要学会保护好自己，做事情多留点心，多一些思考。    &lt;br /&gt;
&lt;img src=&#39;https://gi.weiyan.tech/2024/08/forest-road.jpg&#39; width=600 alt=&#39;美丽的林间公路风景&#39;&gt;&lt;/p&gt;
&lt;p&gt;人家说，能力也大，责任越大。对于个人职业和工作，更多的是权限越大，责任越大，任何的权限并非是越大越好。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;58&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-58/</link>
      <pubDate>Tue, 20 Feb 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-58/</guid>
      
    </item>
    
    <item>
      <title>使用 Planemo 进行 Galaxy 工具开发</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2024-02-04&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2024-02-04T00:00:00+00:00&#39;&gt;2024-02-04&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：本文章原文发布于 《&lt;a href=&#34;https://www.yuque.com/shenweiyan/biox/planemo-for-galaxy&#34;&gt;使用 Planemo 进行 Galaxy 工具开发 - 语雀&lt;/a&gt;》，部分内容已更新。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;文章开始前，我们先了解一下 Planemo 到底是个什么东西。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Command-line utilities to assist in developing &lt;a href=&#34;http://galaxyproject.org/&#34;&gt;Galaxy&lt;/a&gt; and &lt;a href=&#34;https://www.commonwl.org/&#34;&gt;Common Workflow Language&lt;/a&gt; artifacts - including tools, workflows, and training materials.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;说白了，Planemo 就是用于 Galaxy 平台工具和 WDL 通用工作流语言相关产品辅助开发的一个命令行工具，这个程序集可以用于工具、流程，以及培训教材的开发。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;安装-planemo&#34;&gt;安装 Planemo&lt;a class=&#34;headerlink&#34; href=&#34;#安装-planemo&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;无论是 pip 还是 conda 都可以安装 Planemo：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-U&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git+git://github.com/galaxyproject/planemo.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;channels&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bioconda
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;channels&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda-forge
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;接下来，进入今天的正题，我们来详细介绍一下怎么使用 Planemo 进行 Galaxy 工具开发。&lt;/p&gt;
&lt;h2 id=&#34;基础用法&#34;&gt;基础用法&lt;a class=&#34;headerlink&#34; href=&#34;#基础用法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本指南将演示如何使用 Heng Li 的 &lt;code&gt;Seqtk&lt;/code&gt; 软件包构建命令工具，该软件包用于处理 FASTA 和 FASTQ 文件中的序列数据。&lt;/p&gt;
&lt;p&gt;首先，我们需要先安装 &lt;code&gt;Seqtk&lt;/code&gt; 。在这里，我们使用 &lt;code&gt;conda&lt;/code&gt; 来安装 &lt;code&gt;Seqtk&lt;/code&gt; (你也可以使用其他的方法安装)。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--yes&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conda-forge&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bioconda&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;seqtk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.2
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seq
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;Usage:&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;seqtk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;options&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;.fq&amp;gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&amp;lt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;.fa&amp;gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;Options:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-q&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lower&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;than&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-X&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;higher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;than&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-n&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHAR&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;masked&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;converted&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHAR&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lowercase&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;number&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;residues&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;per&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;line&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;^32-1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-Q&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shift:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ASCII-INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;gives&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;base&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;33&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;random&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;effective&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FLOAT&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;sample&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FLOAT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;fraction&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sequences&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-M&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FILE&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;regions&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BED&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;list&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FILE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;null&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-L&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;drop&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sequences&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;length&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shorter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;than&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;complement&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;region&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;effective&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-M&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;reverse&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;complement
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-A&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;force&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FASTA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;discard&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-C&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;drop&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;comments&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;at&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;header&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lines
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-N&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;drop&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sequences&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;containing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ambiguous&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-1&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;2n-1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;reads&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;only
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-2&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;2n&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;reads&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;only
&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;-V&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
接下来，我们将下载一个 FASTQ 示例文件，并测试一个简单的 Seqtk 命令 &lt;code&gt;seq&lt;/code&gt; ，该命令将 FASTQ 文件转换为 FASTA。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://raw.githubusercontent.com/galaxyproject/galaxy-test-data/master/2.fastq
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-A&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fastq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fasta
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fasta
&amp;gt;EAS54_6_R1_2_1_413_324
CCCTTCTTGTCTTCAGCGTTTCTCC
&amp;gt;EAS54_6_R1_2_1_540_792
TTGGCAGGCCAAGGCCGATGGATCA
&amp;gt;EAS54_6_R1_2_1_443_348
GTTGCTTCTGGCGTGGGTGGGGGGG
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
有关功能齐全的 Seqtk 包封装，可以在 GitHub 上查看 &lt;a href=&#34;https://github.com/galaxyproject/tools-iuc/tree/master/tools/seqtk&#34;&gt;Helena Rasche&amp;rsquo;s wrappers&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Galaxy 工具文件只是 XML 文件，因此此时可以打开文本编辑器并开始编写工具。Planemo 有一个命令 &lt;code&gt;tool_init&lt;/code&gt; 可以快速生成一些样板 XML，因此首先开始。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool_init&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk_seq&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Convert to FASTA (seqtk)&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;code&gt;tool_init&lt;/code&gt; 命令可以采用各种复杂的参数，但如上面展示的 &lt;code&gt;--id&lt;/code&gt; 和 &lt;code&gt;--name&lt;/code&gt; 是其中两个最基本的参数。每个 Galaxy 工具都需要一个 ID（这是 Galaxy 自身用来标识该工具的简短标识符）和一个名称（此名称会显示给 Galaxy 用户，并且应该是该工具的简短描述）。工具名称可以包含空格，但其 ID 不能包含空格。&lt;/p&gt;
&lt;p&gt;上面的命令将生成一个 seqtk_seq.xml 文件，这个文件看起来像这样：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        TODO: Fill in command template.&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        TODO: Fill in help.&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这个生成的模板 XML 文件具有了 Galaxy 工具所需的公共部分内容，但你仍然需要打开编辑器并填写命令模板、输入参数描述、工具输出信息、帮助部分信息等。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tool_init&lt;/code&gt; 命令也可以做得更好。 们可以使用在 &lt;code&gt;seqtk seq -a 2.fastq&amp;gt; 2.fasta&lt;/code&gt; 上面尝试过的测试命令作为示例，通过指定输入和输出来生成命令块，如下所示。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool_init&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk_seq&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Convert to FASTA (seqtk)&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--requirement&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk@1.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_command&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk seq -a 2.fastq &amp;gt; 2.fasta&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_input&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fastq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fasta
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这将生成以下 XML 文件- 该文件具有正确的输入和输出定义以及实际的命令模板。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq -a &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        TODO: Fill in help.&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;(
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
如本节开头所示，命令 &lt;code&gt;seqtk seq&lt;/code&gt; 会为 &lt;code&gt;seq&lt;/code&gt; 命令生成帮助消息。 &lt;code&gt;tool_init&lt;/code&gt; 可以获取该帮助消息，并使用 &lt;code&gt;help_from_command&lt;/code&gt; 选项将其正确粘贴在生成的工具 XML 文件中。&lt;/p&gt;
&lt;p&gt;通常，命令帮助消息并不完全适用于工具，因为它们会提到参数名称和由工具抽象出来的类似细节，但它们可能是一个很好的起点。&lt;/p&gt;
&lt;p&gt;以下 Planemo 的 &lt;code&gt;tool_init&lt;/code&gt; 的调用已增强为使用 &lt;code&gt;--help_from_command&lt;/code&gt;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool_init&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk_seq&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Convert to FASTA (seqtk)&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--requirement&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk@1.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_command&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk seq -a 2.fastq &amp;gt; 2.fasta&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_input&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fastq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fasta&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--test_case&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--cite_url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;https://github.com/lh3/seqtk&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--help_from_command&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk seq&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;除了演示 &lt;code&gt;--help_from_command&lt;/code&gt; 之外，这还演示了使用 &lt;code&gt;--test_case&lt;/code&gt; 从我们的示例生成测试用例并为基础工具添加引用。生成的工具 XML 文件为：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq -a &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fastq&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fasta&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Usage:   seqtk seq [options] &amp;lt;in.fq&amp;gt;|&amp;lt;in.fa&amp;gt;&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Options: -q INT    mask bases with quality lower than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -X INT    mask bases with quality higher than INT [255]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -n CHAR   masked bases converted to CHAR; 0 for lowercase [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -l INT    number of residues per line; 0 for 2^32-1 [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -Q INT    quality shift: ASCII-INT gives base quality [33]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -s INT    random seed (effective with -f) [11]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -f FLOAT  sample FLOAT fraction of sequences [1]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -M FILE   mask regions in BED or name list FILE [null]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -L INT    drop sequences with length shorter than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -c        mask complement region (effective with -M)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -r        reverse complement&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -A        force FASTA output (discard quality)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -C        drop comments at the header lines&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -N        drop sequences containing ambiguous bases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -1        output the 2n-1 reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -2        output the 2n reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -V        shift quality by &#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -U        convert all bases to uppercases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -S        strip of white spaces in sequences&lt;/span&gt;


&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bibtex&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
@misc{githubseqtk,
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;author&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{LastTODO,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FirstTODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;year&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{TODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;title&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{seqtk},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;publisher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;journal&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;repository},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{https://github.com/lh3/seqtk},
}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citation&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;至此，我们有了一个功能相当齐全的 Galaxy 工具，它带有测试和帮助。这是一个非常简单的示例——通常，您需要在工具中投入更多工作才能实现这一点， &lt;code&gt;tool_init&lt;/code&gt; 实际上只是为了让您入门而设计的。&lt;/p&gt;
&lt;p&gt;现在让我们检查并测试我们开发的工具。Planemo的 &lt;code&gt;lint&lt;/code&gt;（或仅 &lt;code&gt;l&lt;/code&gt; ）命令将检查工具的 XML 有效性，检查是否有明显的错误以及是否符合 IUC 的最佳做法。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;l
Linting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/opt/galaxy/tools/seqtk_seq.xml
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tests...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;test&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INFO:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;outputs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;inputs...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INFO:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;input&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;parameters.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;help...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;contains&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;section.
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Help&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;contains&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;valid&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;reStructuredText.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;general...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;defines&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;version&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.1.0&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;defines&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Convert&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FASTA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seqtk&lt;span class=&#34;o&#34;&gt;)]&lt;/span&gt;.
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;defines&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;an&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;seqtk_seq&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;targets&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;16&lt;/span&gt;.01&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Galaxy&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;profile.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;command...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INFO:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;contains&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;command.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;citations...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;likely&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;valid&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;citations.
Applying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool_xsd...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CHECK
..&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INFO:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;File&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;validates&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;against&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;XML&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;schema.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
默认情况下， &lt;code&gt;lint&lt;/code&gt; 会在您当前的工作目录中找到所有工具，但是我们可以使用 &lt;code&gt;planemo lint seqtk_seq.xml&lt;/code&gt; 指定一个特定的工具。&lt;/p&gt;
&lt;p&gt;接下来，我们可以使用 &lt;code&gt;test&lt;/code&gt;（或仅执行 &lt;code&gt;t&lt;/code&gt; ）命令运行工具的功能测试。这将打印很多输出（因为它启动了 Galaxy 实例），但最终应该显示我们通过的一项测试。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你的服务器已经安装了 Galaxy 实例，你可以编辑 ~/.planemo.yml 文件，指定 Galaxy 实例路径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;## Specify a default galaxy_root for the `test` and `serve` commands here.&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;galaxy_root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;/home/user/galaxy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;完整的 &lt;code&gt;~/.planemo.yml&lt;/code&gt; 示例，参考：&lt;a href=&#34;https://planemo.readthedocs.io/en/latest/configuration.html&#34;&gt;https://planemo.readthedocs.io/en/latest/configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;t
...
All&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;test&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;executed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;passed.
seqtk_seq&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;passed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
除了在控制台中将测试结果显示为红色（失败）或绿色（通过）外，Planemo 还默认为测试结果创建 HTML 报告。 还有更多测试报告选项可用，例如 &lt;code&gt;--test_output_xunit&lt;/code&gt;，在某些持续集成环境中很有用。有关更多选项，请参见 &lt;code&gt;planemo test --help&lt;/code&gt; ，以及 &lt;code&gt;test_reports&lt;/code&gt; 命令。&lt;/p&gt;
&lt;p&gt;现在，我们可以使用 &lt;code&gt;serve&lt;/code&gt;（或仅使用 &lt;code&gt;s&lt;/code&gt; ）命令打开 Galaxy。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;s
...
serving&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;on&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://127.0.0.1:9090
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在网络浏览器中打开 &lt;a href=&#34;http://127.0.0.1:9090&#34;&gt;http://127.0.0.1:9090&lt;/a&gt; 以查看您的新工具。&lt;/p&gt;
&lt;p&gt;服务和测试可以通过各种命令行参数传递，例如 &lt;code&gt;--galaxy_root&lt;/code&gt;，以指定要使用的 Galaxy 实例（默认情况下，planemo 将仅为 planemo 下载和管理实例）。&lt;/p&gt;
&lt;h2 id=&#34;简单参数&#34;&gt;简单参数&lt;a class=&#34;headerlink&#34; href=&#34;#简单参数&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们为 &lt;code&gt;seqtk seq&lt;/code&gt; 命令构建了一个工具包的封装，但是该工具实际上具有我们可能希望向 Galaxy 用户公开的其他选项。&lt;/p&gt;
&lt;p&gt;让我们从 &lt;code&gt;help&lt;/code&gt; 命令中获取一些参数，并构建 Galaxy 的 &lt;code&gt;param&lt;/code&gt; 块以粘贴到该工具的 &lt;code&gt;input&lt;/code&gt; 块中。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-V&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在上一节中，我们看到了输入文件在 &lt;code&gt;param&lt;/code&gt; 块中是一个 &lt;code&gt;data&lt;/code&gt; 的类型，除此之外我们还可以使用许多不同种类的参数。如标志参数（例如以上 &lt;code&gt;-V&lt;/code&gt; 参数），通常在 Galaxy 工具的 XML 文件中由 &lt;code&gt;boolean&lt;/code&gt; 来表示。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift_quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Shift quality&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-V&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;falsevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift quality by &#39;(-Q) - 33&#39; (-V)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
然后，我们可以将 &lt;code&gt;$shift_quality&lt;/code&gt; 粘贴在 &lt;code&gt;command&lt;/code&gt; 块中，如果用户选择了此选项，它将扩展为 &lt;code&gt;-V&lt;/code&gt; （因为我们已将其定义为 &lt;code&gt;truevalue&lt;/code&gt; ）。如果用户未选择此选项，则 &lt;code&gt;$shift_quality&lt;/code&gt; 将仅扩展为空字符串，而不会影响生成的命令行。&lt;/p&gt;
&lt;p&gt;现在考虑以下的 &lt;code&gt;seqtk seq&lt;/code&gt; 参数：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-q&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lower&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;than&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
-X&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bases&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quality&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;higher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;than&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这些可以转换为 Galaxy 参数，如下所示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_min&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality lower than&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-q)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_max&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality higher than&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-X)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这些可以作为 &lt;code&gt;-q $quality_min -X $quality_max&lt;/code&gt; 添加到命令标签中。&lt;/p&gt;
&lt;p&gt;此时，该工具将如下所示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              $shift_quality&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -q $quality_min&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -X $quality_max&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -a &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift_quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Shift quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-V&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;falsevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift quality by &#39;(-Q) - 33&#39; (-V)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_min&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality lower than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-q)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_max&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality higher than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-X)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fastq&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fasta&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Usage:   seqtk seq [options] &amp;lt;in.fq&amp;gt;|&amp;lt;in.fa&amp;gt;&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Options: -q INT    mask bases with quality lower than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -X INT    mask bases with quality higher than INT [255]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -n CHAR   masked bases converted to CHAR; 0 for lowercase [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -l INT    number of residues per line; 0 for 2^32-1 [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -Q INT    quality shift: ASCII-INT gives base quality [33]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -s INT    random seed (effective with -f) [11]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -f FLOAT  sample FLOAT fraction of sequences [1]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -M FILE   mask regions in BED or name list FILE [null]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -L INT    drop sequences with length shorter than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -c        mask complement region (effective with -M)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -r        reverse complement&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -A        force FASTA output (discard quality)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -C        drop comments at the header lines&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -N        drop sequences containing ambiguous bases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -1        output the 2n-1 reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -2        output the 2n reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -V        shift quality by &#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -U        convert all bases to uppercases&lt;/span&gt;


&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bibtex&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
@misc{githubseqtk,
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;author&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{LastTODO,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FirstTODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;year&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{TODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;title&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{seqtk},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;publisher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;journal&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;repository},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{https://github.com/lh3/seqtk},
}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citation&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;条件参数&#34;&gt;条件参数&lt;a class=&#34;headerlink&#34; href=&#34;#条件参数&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以前的参数很简单，因为它们总是出现，现在考虑一下下面的参数。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-M&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FILE&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;mask&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;regions&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;BED&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;list&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FILE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;null&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;我们可以通过添加属性 &lt;code&gt;optional =&#34;true&#34;&lt;/code&gt; 将该数据类型参数标记为可选。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;mask_regions&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask regions in BED&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-M)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;optional=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;然后，不仅可以直接在命令块中使用 &lt;code&gt;$mask_regions&lt;/code&gt;，还可以将其包装在 &lt;code&gt;if&lt;/code&gt; 语句中（因为工具 XML 文件支持 &lt;a href=&#34;https://cheetahtemplate.org/users_guide/index.html&#34;&gt;Cheetah&lt;/a&gt;）。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$mask_regions
-M&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&#39;$mask_regions&#39;
#end&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;if
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;接着，我们考虑这一组参数：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;INT&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;random&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;effective&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FLOAT&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;sample&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FLOAT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;fraction&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sequences&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在这种情况下，只有在设置了样本参数的情况下，才能看到或使用 &lt;code&gt;-s&lt;/code&gt; 随机种子参数。我们可以使用 &lt;code&gt;conditional&lt;/code&gt; 条件块来表达这一点。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;conditional&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample_selector&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Sample fraction of sequences&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;float&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.0&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-f)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Random seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;11&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-s)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;false&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditional&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;在命令块中，我们可以再次使用 &lt;code&gt;if&lt;/code&gt; 语句包括这些参数。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$sample.sample_selector
-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$sample.fraction&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$sample.seed
#end&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;if
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;注意，我们必须使用 &lt;code&gt;sample.&lt;/code&gt; 的前缀来引用这个参数，因为它们是在 &lt;code&gt;sample&lt;/code&gt; 的条件块内定义的。&lt;/p&gt;
&lt;p&gt;现在该工具的最新版本如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              $shift_quality&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -q $quality_min&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -X $quality_max&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #if $mask_regions&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  -M &#39;$mask_regions&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #end if&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #if $sample.sample&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  -f $sample.fraction&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  -s $sample.seed&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #end if&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -a &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift_quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Shift quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-V&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;falsevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift quality by &#39;(-Q) - 33&#39; (-V)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_min&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality lower than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-q)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_max&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality higher than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-X)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;mask_regions&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask regions in BED&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-M)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;optional=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;conditional&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Sample fraction of sequences&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;float&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.0&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-f)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Random seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;11&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-s)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;false&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditional&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fastq&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fasta&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Usage:   seqtk seq [options] &amp;lt;in.fq&amp;gt;|&amp;lt;in.fa&amp;gt;&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Options: -q INT    mask bases with quality lower than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -X INT    mask bases with quality higher than INT [255]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -n CHAR   masked bases converted to CHAR; 0 for lowercase [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -l INT    number of residues per line; 0 for 2^32-1 [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -Q INT    quality shift: ASCII-INT gives base quality [33]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -s INT    random seed (effective with -f) [11]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -f FLOAT  sample FLOAT fraction of sequences [1]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -M FILE   mask regions in BED or name list FILE [null]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -L INT    drop sequences with length shorter than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -c        mask complement region (effective with -M)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -r        reverse complement&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -A        force FASTA output (discard quality)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -C        drop comments at the header lines&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -N        drop sequences containing ambiguous bases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -1        output the 2n-1 reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -2        output the 2n reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -V        shift quality by &#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -U        convert all bases to uppercases&lt;/span&gt;


&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bibtex&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
@misc{githubseqtk,
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;author&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{LastTODO,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FirstTODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;year&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{TODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;title&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{seqtk},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;publisher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;journal&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;repository},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{https://github.com/lh3/seqtk},
}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citation&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
对于这样的工具，这些工具有很多选项，但在大多数情况下使用默认值是首选——一个常见的习惯用法是使用条件将参数分为简单部分和高级部分。&lt;/p&gt;
&lt;p&gt;使用惯用法，更新此工具后的 XML 如下所示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #if $settings.advanced == &#34;advanced&#34;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  $settings.shift_quality&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  -q $settings.quality_min&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  -X $settings.quality_max&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  #if $settings.mask_regions&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                      -M &#39;$settings.mask_regions&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  #end if&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  #if $settings.sample.sample&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                      -f $settings.sample.fraction&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                      -s $settings.sample.seed&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;                  #end if&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              #end if&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;              -a &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;conditional&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;settings&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;advanced&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;select&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Specify advanced parameters&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;option&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;simple&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;selected=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;No,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;use&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;program&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;defaults.&lt;span class=&#34;nt&#34;&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;option&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;advanced&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;Yes,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;see&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;full&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;parameter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;list.&lt;span class=&#34;nt&#34;&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;simple&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;advanced&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift_quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Shift quality&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;-V&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;falsevalue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;shift quality by &#39;(-Q) - 33&#39; (-V)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_min&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality lower than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-q)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;quality_max&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask bases with quality higher than&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;min=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;max=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;255&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-X)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;mask_regions&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Mask regions in BED&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                       &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-M)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;optional=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;conditional&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;sample&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;boolean&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Sample fraction of sequences&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Fraction&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;float&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.0&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-f)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Random seed&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;integer&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;11&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                               &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;help=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;(-s)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;when&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;false&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditional&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/when&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditional&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fastq&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fasta&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Usage:   seqtk seq [options] &amp;lt;in.fq&amp;gt;|&amp;lt;in.fa&amp;gt;&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Options: -q INT    mask bases with quality lower than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -X INT    mask bases with quality higher than INT [255]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -n CHAR   masked bases converted to CHAR; 0 for lowercase [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -l INT    number of residues per line; 0 for 2^32-1 [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -Q INT    quality shift: ASCII-INT gives base quality [33]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -s INT    random seed (effective with -f) [11]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -f FLOAT  sample FLOAT fraction of sequences [1]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -M FILE   mask regions in BED or name list FILE [null]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -L INT    drop sequences with length shorter than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -c        mask complement region (effective with -M)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -r        reverse complement&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -A        force FASTA output (discard quality)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -C        drop comments at the header lines&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -N        drop sequences containing ambiguous bases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -1        output the 2n-1 reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -2        output the 2n reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -V        shift quality by &#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -U        convert all bases to uppercases&lt;/span&gt;


&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;bibtex&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
@misc{githubseqtk,
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;author&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{LastTODO,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FirstTODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;year&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{TODO},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;title&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{seqtk},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;publisher&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;journal&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{GitHub&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;repository},
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;url&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;=&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{https://github.com/lh3/seqtk},
}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citation&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;脚本封装&#34;&gt;脚本封装&lt;a class=&#34;headerlink&#34; href=&#34;#脚本封装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tool Shed 上已经提供了许多常见的生物信息学应用程序，因此一项常见的开发任务是将各种复杂程度的脚本集成到 Galaxy 中。&lt;/p&gt;
&lt;p&gt;考虑以下小型 Perl 脚本。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/perl -w&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# usage : perl toolExample.pl &amp;lt;FASTA file&amp;gt; &amp;lt;output file&amp;gt;&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&amp;lt;$ARGV[0]&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&amp;gt;$ARGV[1]&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;&amp;lt;IN&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;chop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;m/^&amp;gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;s/^&amp;gt;//&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;%.3f&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$gc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;\n&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$gc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$gc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;m/[gc]/ig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;%.3f&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$gc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;\n&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;可以按照以下步骤为此脚本构建 Galaxy 工具，并将脚本与工具 XML 文件本身放在同一目录中。这里的特殊值 &lt;code&gt;$__ tool_directory__&lt;/code&gt; 是指工具（即 xml 文件）所在的目录。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;gc_content&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Compute GC content&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;description&amp;gt;&lt;/span&gt;for&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;each&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sequence&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;in&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file&lt;span class=&#34;nt&#34;&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&amp;gt;&lt;/span&gt;perl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&#39;$__tool_directory__/gc_content.pl&#39;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&#39;$input&#39;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output.tsv&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;label=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Source file&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;tabular&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;from_work_dir=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output.tsv&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;
This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;computes&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;GC&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;content&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FASTA&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file.
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;macros-宏集&#34;&gt;Macros 宏集&lt;a class=&#34;headerlink&#34; href=&#34;#macros-宏集&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您希望为单个相对简单的应用程序或脚本编写工具，则应跳过本节。如果您希望维护一系列相关工具——经验表明，您将意识到有很多重复的 XML 可以很好地做到这一点。Galaxy工具 XML 宏可以帮助减少这种重复。&lt;/p&gt;
&lt;p&gt;通过使用 &lt;code&gt;--macros&lt;/code&gt; 标志，Planemo 的 &lt;code&gt;tool_init&lt;/code&gt; 命令可用于生成适合工具套件的宏文件。我们看一下以前的 &lt;code&gt;tool_init&lt;/code&gt; 命令的变体（唯一的区别是现在我们添加了 &lt;code&gt;--macros&lt;/code&gt; 标志）。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;planemo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool_init&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--force&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--macros&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk_seq&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Convert to FASTA (seqtk)&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--requirement&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;seqtk@1.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_command&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk seq -A 2.fastq &amp;gt; 2.fasta&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_input&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fastq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--example_output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.fasta&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--test_case&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;--help_from_command&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;seqtk seq&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这将在当前目录中产生两个文件（ &lt;code&gt;seqtk_seq.xml&lt;/code&gt; 和 &lt;code&gt;macros.xml&lt;/code&gt;），而不是一个。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;seqtk_seq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Convert to FASTA (seqtk)&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0.1.0&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;python_template_version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;3.5&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;macros&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;import&amp;gt;&lt;/span&gt;macros.xml&lt;span class=&#34;nt&#34;&gt;&amp;lt;/import&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/macros&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;expand&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;macro=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;requirements&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;detect_errors=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;exit_code&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;        seqtk seq -A &#39;$input1&#39; &amp;gt; &#39;$output1&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;data&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fastq&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/inputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;fasta&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/outputs&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;input1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fastq&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;output1&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2.fasta&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tests&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;help&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Usage:   seqtk seq [options] &amp;lt;in.fq&amp;gt;|&amp;lt;in.fa&amp;gt;&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;Options: -q INT    mask bases with quality lower than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -X INT    mask bases with quality higher than INT [255]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -n CHAR   masked bases converted to CHAR; 0 for lowercase [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -l INT    number of residues per line; 0 for 2^32-1 [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -Q INT    quality shift: ASCII-INT gives base quality [33]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -s INT    random seed (effective with -f) [11]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -f FLOAT  sample FLOAT fraction of sequences [1]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -M FILE   mask regions in BED or name list FILE [null]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -L INT    drop sequences with length shorter than INT [0]&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -c        mask complement region (effective with -M)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -r        reverse complement&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -A        force FASTA output (discard quality)&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -C        drop comments at the header lines&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -N        drop sequences containing ambiguous bases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -1        output the 2n-1 reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -2        output the 2n reads only&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -V        shift quality by &#39;(-Q) - 33&#39;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -U        convert all bases to uppercases&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;         -S        strip of white spaces in sequences&lt;/span&gt;


&lt;span class=&#34;cp&#34;&gt;    ]]&amp;gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/help&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;expand&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;macro=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;citations&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/tool&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;macros&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;xml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;requirements&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;requirement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;package&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;version=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;1.2&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;seqtk&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirement&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;yield/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/requirements&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/xml&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;xml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;citations&#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;yield&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/citations&amp;gt;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/xml&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/macros&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;如您在上面的代码中所看到的，宏是可重用的 XML 块，它们使避免重复和保持 XML 简洁变得更加容易。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.galaxyproject.org/Admin/Tools/ToolConfigSyntax#Reusing_Repeated_Configuration_Elements&#34;&gt;Macros syntax&lt;/a&gt; on the Galaxy Wiki.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/galaxyproject/tools-iuc/tree/master/tools/gatk2&#34;&gt;GATK tools&lt;/a&gt; (example tools making extensive use of macros)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/galaxyproject/tools-iuc/tree/master/tools/gemini&#34;&gt;gemini tools&lt;/a&gt; (example tools making extensive use of macros)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/galaxyproject/tools-iuc/tree/master/tools/bedtools&#34;&gt;bedtools tools&lt;/a&gt; (example tools making extensive use of macros)&lt;/li&gt;
&lt;li&gt;Macros implementation details - &lt;a href=&#34;https://bitbucket.org/galaxy/galaxy-central/pull-request/129/implement-macro-engine-to-reduce-tool/diff&#34;&gt;Pull Request #129&lt;/a&gt; and &lt;a href=&#34;https://bitbucket.org/galaxy/galaxy-central/pull-request/140/improvements-to-tool-xml-macroing-system/diff&#34;&gt;Pull Request #140&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.galaxyproject.org/en/latest/dev/schema.html&#34;&gt;Galaxy’s Tool XML Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://galaxyproject.org/develop/resources-tools/&#34;&gt;Big List of Tool Development Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cheetahtemplate.org/users_guide/index.html&#34;&gt;Cheetah templating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;57&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/other/2024-02-04-%E4%BD%BF%E7%94%A8-Planemo-%E8%BF%9B%E8%A1%8C-Galaxy-%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91-dis57/</link>
      <pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/other/2024-02-04-%E4%BD%BF%E7%94%A8-Planemo-%E8%BF%9B%E8%A1%8C-Galaxy-%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91-dis57/</guid>
      
    </item>
    
    <item>
      <title>越来越难用的国内代码托管平台</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;国内的代码平台对个人用户极其不友好，GitHub 可用的情况下，还是继续用着 GitHub 吧。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;码云&#34;&gt;码云&lt;a class=&#34;headerlink&#34; href=&#34;#码云&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gitee 的 Issues 永远都无法搜索内容 - &lt;a href=&#34;https://gitee.com/oschina/git-osc/issues/I7T4W6&#34;&gt;https://gitee.com/oschina/git-osc/issues/I7T4W6&lt;/a&gt;，感觉社区版本已经在摆烂了，现在他们的重点已经放在了企业版本，但是企业版本又难用的要死！&lt;/p&gt;
&lt;h2 id=&#34;扣钉&#34;&gt;扣钉&lt;a class=&#34;headerlink&#34; href=&#34;#扣钉&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Coding 现在的页面逻辑我是已经搞不明白了，注销的组织名称永远无法释放不说，在代码仓库更是连 Issues 都去掉了......&lt;/p&gt;
&lt;h2 id=&#34;极狐&#34;&gt;极狐&lt;a class=&#34;headerlink&#34; href=&#34;#极狐&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;单是从体验上来说，背靠着 Gitlab 的 &lt;a href=&#34;https://gitlab.cn/&#34;&gt;极狐(GitLab)&lt;/a&gt; 其实做的还不错，虽然也还没有 APP。      &lt;br /&gt;
- &lt;a href=&#34;https://gitlab.cn/is-it-any-good/&#34;&gt;极狐 GitLab 怎么样好不好_极狐 GitLab 优势有哪些-极狐 GitLab&lt;/a&gt;      &lt;br /&gt;
- &lt;a href=&#34;https://gitlab.cn/comparison/&#34;&gt;极狐 GitLab vs GitLab vs GitHub vs Gitee&lt;/a&gt;      &lt;br /&gt;
&lt;img alt=&#34;gitlab-jh&#34; src=&#34;https://gi.weiyan.tech/2024/02/jihulab-vs-github-gitee.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;但是，现在问题来了，极狐从&lt;a href=&#34;https://gitlab.cn/blog/2023/11/29/saas-adjustment/&#34;&gt;2024年1月2日起开始要收费了&lt;/a&gt;，这又是一个昙花一现可以放弃的托管平台，即使付费也总让人感觉这个平台套路不少。&lt;/p&gt;
&lt;h2 id=&#34;最后&#34;&gt;最后&lt;a class=&#34;headerlink&#34; href=&#34;#最后&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后，对于国内的代码托管平台的一个感受 —— 对个人用户极其不友好，都热衷去倒腾企业的版本了，所以，GitHub 可用的情况下，还是继续用着 GitHub 吧；某些情况下登录不上 GitHub 了，国内的 GitCode 作为备用暂时凑合着用吧；至于 Gitee/Coding/Jihulab，还是不要浪费时间去折腾了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;56&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-56/</link>
      <pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-56/</guid>
      
    </item>
    
    <item>
      <title>从公众号到个人独立站点</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;从 2023 年下半年以来 &amp;ldquo;&lt;strong&gt;BioIT爱好者&lt;/strong&gt;&amp;rdquo; 这个公众号基本上很少更新了，这一点在《&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/28&#34;&gt;公众号许久没有更新了&lt;/a&gt;》就提到过，现在唯一有所区别的是在 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/&#34;&gt;GitHub Discussions&lt;/a&gt; 的基础上又多了一个个人的独立站点。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;weiyan-cc-home&#34; src=&#34;https://gi.weiyan.tech/2024/01/weiyan-cc-home.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;weiyan-cc-hblog&#34; src=&#34;https://gi.weiyan.tech/2024/01/weiyan-cc-blog.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;全面拥抱 GitHub 的感觉真的很好，加上手机 APP 的加持，更加如虎添翼。回归了最原始 markdown 的编辑和写作，也终于不用再担心在《&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/26&#34;&gt;富文本编辑器与 md 语法的一些困惑&lt;/a&gt;》中所顾虑的问题。&lt;/p&gt;
&lt;p&gt;从 GitHub 到选择 Material for MkDocs 作为个人博客+文档独立站点，有很多的影响因素，但数据可控算是比较核心的一个出发点。这半年来混迹 GitHub 的确也收获良多，发现了很多&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/41&#34;&gt;有意思的博客和站点&lt;/a&gt;，学习到了很多优秀的项目。很多时候阅读别人的博客（站点），总能发现一些好玩的人和事物。&lt;/p&gt;
&lt;p&gt;2023 年被&lt;a href=&#34;https://blog.douchi.space/&#34;&gt;椒盐豆豉&lt;/a&gt;的一篇《&lt;a href=&#34;https://blog.douchi.space/2023-why-you-need-a-blog/&#34;&gt;2023 年了你为什么需要写博客&lt;/a&gt;》所吸引，尤其是 &amp;ldquo;博客是赛博空间的另一个你，也能反过来定义你&amp;rdquo; 这一句，写出了很多心声。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;比较反感 &amp;ldquo;个人品牌&amp;rdquo; 这个过于商业化的说法，不写技术不写学术的非实名博客甚至起不到简历作用。但它确是比简历更 &amp;ldquo;像个人&amp;rdquo;，比碎片化社交网络更全面展现我是怎样一个人的网络门面。当然这是我这个博客的用法，网上靠博客经营自己品牌的也比比皆是。总之，内容的自由度和高度的定制化让博客可以成为任何你想让它成为的东西。反之，博客写的久了，发现 &amp;ldquo;写博客&amp;rdquo; 也已经成为了自己（不只是线上） identity 的一部分——毕竟这是很多人认识我的渠道，也重塑了我的一部分自我认知。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;虽然期间尝试过《&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/11&#34;&gt;飞书文档初体验&lt;/a&gt;》，从国内版本的飞书到 LarkSuite，但终究不如 GitHub + Material for MkDocs 组合来得顺畅。GitHub 也好，飞书也罢，各种五花八门的奇淫巧技和折腾组合，总有能玩出花来的一波人，找到自己喜欢的并持之以恒就已经足够。&lt;/p&gt;
&lt;p&gt;趁着今天有时间，在公众号同步了这一篇，希望我们不忘初心，做到最好。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;55&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-55/</link>
      <pubDate>Thu, 25 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-55/</guid>
      
    </item>
    
    <item>
      <title>Mkdocs material 使用自定义 slug 和 url</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Mkdocs material 默认使用目录+文件名作为 post 展示的 URL，如果目录名/文件名太长的话，你的 URL 就会显得非常长。尤其是当你从浏览器地址栏中复制某一篇文档的链接时候，如果你的 URL 同时包含了中文，URL 转码后会导致你复制后粘贴的链接变得更加长。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Mkdocs material 目前我是没看到有什么具体的插件解决这个问题，只不过有人在 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/5161&#34;&gt;squidfunk/mkdocs-material#5161&lt;/a&gt; 基于 hook 提供了一个解决的方案。这个方案基本上能满足我们的需求，但也有一些限制。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slug 必须是不能以 &lt;code&gt;/&lt;/code&gt; 作为开头，且必须以 &lt;code&gt;/&lt;/code&gt; 作为结尾。&lt;/li&gt;
&lt;li&gt;可能会导致内部链接引用出现问题。&lt;/li&gt;
&lt;li&gt;会重复读取任务，如果文件非常多，会降低相对于文件量的整体性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;54&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-54/</link>
      <pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-54/</guid>
      
    </item>
    
    <item>
      <title>Mkdocs material 对指定页面隐藏 H1 标题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;主要记录一下在 Mkdocs material 中对指定页面隐藏标题，尤其是指在 Home 页面把 H1 级别的标题隐藏的一些解决方法。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;背景&#34;&gt;背景&lt;a class=&#34;headerlink&#34; href=&#34;#背景&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;对于一些特定的页面，不想显示顶级的标题，尤其是 H1 标题。Mkdocs material 讨论区给出了几个方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;内联 CSS 的方法，参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/issues/2163&#34;&gt;squidfunk/mkdocs-material#2163&lt;/a&gt;。  &lt;br /&gt;
   这个方法的确能解决隐藏当前页面的 H1 标题，但&lt;strong&gt;同时会把搜索栏搜索结果的 H1 标题给隐藏了&lt;/strong&gt;。有点治标不治本！&lt;/li&gt;
&lt;li&gt;自定义页面模板，参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/6185&#34;&gt;squidfunk/mkdocs-material#6185&lt;/a&gt;。
   这个参考的讨论里面没有给出具体的解决方法，本文章来详细介绍一下。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;创建模板&#34;&gt;创建模板&lt;a class=&#34;headerlink&#34; href=&#34;#创建模板&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，在 &lt;code&gt;overrides&lt;/code&gt; 目录下创建一个名为 &lt;code&gt;home.html&lt;/code&gt; 的文件(文件名可以随意命名)，内容可以参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/blob/master/material/templates/blog.html&#34;&gt;&lt;code&gt;blog.html&lt;/code&gt;&lt;/a&gt; 的内容。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{% extends &#34;base.html&#34; %}
{% block htmltitle %}
      {% if page.meta and page.meta.title %}
        &amp;lt;title&amp;gt;{{ page.meta.title }}&amp;lt;/title&amp;gt;
      {% elif page.title and not page.is_homepage %}
        &amp;lt;title&amp;gt;{{ page.title | striptags }}&amp;lt;/title&amp;gt;
      {% else %}
        &amp;lt;title&amp;gt;{{ config.site_name }}&amp;lt;/title&amp;gt;
      {% endif %}
{% endblock %}

{% block container %}
    &amp;lt;div class=&#34;md-content&#34; data-md-component=&#34;content&#34;&amp;gt;
      &amp;lt;article class=&#34;md-content__inner md-typeset&#34;&amp;gt;
        {% block content %}
          {% include &#34;partials/mycontent.html&#34; %}
        {% endblock %}
      &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
{% endblock %}

{% block extrahead %}
      &amp;lt;!--style&amp;gt;.md-typeset h1,.md-content__button {display:none !important}; &amp;lt;/style--&amp;gt;
      &amp;lt;style&amp;gt;.md-header__topic {font-weight:700 !important}&amp;lt;/style&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;第二，创建 &lt;code&gt;overrides/partials/mycontent.html&lt;/code&gt; 文件，内容参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/blob/master/material/templates/partials/content.html&#34;&gt;&lt;code&gt;content.html&lt;/code&gt;&lt;/a&gt; 文件，注意把 h1 的元素注释掉。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{#-
  This file was automatically generated - do not edit
-#}
{% if &#34;material/tags&#34; in config.plugins and tags %}
  {% include &#34;partials/tags.html&#34; %}
{% endif %}
{% include &#34;partials/actions.html&#34; %}
{% if &#34;\x3ch1&#34; not in page.content %}
  &amp;lt;!--h1&amp;gt;{{ page.title | d(config.site_name, true)}}&amp;lt;/h1--&amp;gt;
{% endif %}
{{ page.content }}
{% include &#34;partials/source-file.html&#34; %}
{% include &#34;partials/feedback.html&#34; %}
{% include &#34;partials/comments.html&#34; %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;在页面中使用模板&#34;&gt;在页面中使用模板&lt;a class=&#34;headerlink&#34; href=&#34;#在页面中使用模板&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;例如，在个人站点的主页文件 &lt;code&gt;docs/index.md&lt;/code&gt; 中头部，使用 &lt;code&gt;template&lt;/code&gt; 指定使用的模板。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;---
title: 维燕的知识花园
template: home.html
---
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;最后，重新启动 mkdocs 就可以看到对应页面 H1 隐藏后的效果。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;53&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-53/</link>
      <pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-53/</guid>
      
    </item>
    
    <item>
      <title>MkDocs Material  的一些使用与问题汇总</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;记录一下 MkDocs Material 在使用过程中遇到的一些问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;ol&gt;
&lt;li&gt;如何避免锚点链接的非英文字符转换成数字    &lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/4682&#34;&gt;How to disable converting non-english header links to numbers?#4682&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;52&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-52/</link>
      <pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-52/</guid>
      
    </item>
    
    <item>
      <title>MkDocs 的 Nav 导航结构与目录自定义调整插件使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;很长一段时间都在使用 &lt;a href=&#34;https://github.com/mysiki/mkdocs_include_dir_to_nav&#34;&gt;mkdocs_include_dir_to_nav&lt;/a&gt; 这个插件来自动包含目录下的所有 md 文件，但随着新需求的出现 —— &lt;strong&gt;如何给某一个指定的子目录使用 &lt;code&gt;reverse_sort_file&lt;/code&gt;，即升序排列展示子目录相应的 markdown 内容&lt;/strong&gt;。这才开始接触到 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 这个插件。&lt;/p&gt;
&lt;p&gt;值得注意的是，&lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 在 2025-02-17 发布的 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-nav/releases/tag/v3.0.0&#34;&gt;v3.0.0&lt;/a&gt; 正式变更成了 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-nav&#34;&gt;mkdocs-awesome-nav&lt;/a&gt;！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;开始&#34;&gt;开始&lt;a class=&#34;headerlink&#34; href=&#34;#开始&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从 GitHub 可以很直观看到的是 &lt;a href=&#34;https://github.com/mysiki/mkdocs_include_dir_to_nav&#34;&gt;mkdocs_include_dir_to_nav&lt;/a&gt; 自从 2022-05-01 更新了 &lt;a href=&#34;https://github.com/mysiki/mkdocs_include_dir_to_nav/releases/tag/v1.2.0&#34;&gt;V1.2.0&lt;/a&gt; 版本后基本就已经停止了更新，Star 也才 20 多人。     &lt;br /&gt;
&lt;img alt=&#34;mkdocs-include-dir-to-nav&#34; src=&#34;https://gi.weiyan.tech/2024/01/mkdocs-include-dir-to-nav.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;反而是 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 一直保持着非常积极的更新频率，而且维护者和关注和使用用户也远远比 &lt;a href=&#34;https://github.com/mysiki/mkdocs_include_dir_to_nav&#34;&gt;mkdocs_include_dir_to_nav&lt;/a&gt; 多得多。   &lt;br /&gt;
&lt;img alt=&#34;mkdocs-awesome-pages-plugin&#34; src=&#34;https://gi.weiyan.tech/2024/01/mkdocs-awesome-pages-plugin.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;于是，开始着入手 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt;。不得不说，Awesome-Pages 这个插件的功能很强大，可以很好解决我&amp;rdquo;指定子目录自定义文档排序&amp;rdquo;的需求。但不可否认的是 Awesome-Pages 的文档写的的确有点糙，不认真看还真不知道应该如何上手，这也是花费我最多时间的地方。&lt;/p&gt;
&lt;h2 id=&#34;使用&#34;&gt;使用&lt;a class=&#34;headerlink&#34; href=&#34;#使用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 有两个很重要的前提：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你在 &lt;code&gt;mkdocs.yml&lt;/code&gt; 定义了 &lt;code&gt;nav&lt;/code&gt; 或 &lt;code&gt;pages&lt;/code&gt; 条目，则此插件不会执行任何操作。要使用该插件列出的功能，我们必须完全删除该条目或向其中添加 &lt;code&gt;...&lt;/code&gt; 条目 (&lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin?tab=readme-ov-file#combine-custom-navigation--file-structure&#34;&gt;add a &lt;code&gt;...&lt;/code&gt; entry to it&lt;/a&gt;)。&lt;/li&gt;
&lt;li&gt;自定义导航时，在目录(或者子目录)中创建一个名为 &lt;code&gt;.pages&lt;/code&gt; 的文件时，使用 &lt;code&gt;nav&lt;/code&gt; 属性只能自定义&lt;strong&gt;该级别的导航&lt;/strong&gt;！然后，按照文件和子目录在导航中出现的顺序列出文件和子目录。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docs/
├── README.md
├── dirNamedA
│   ├── dirA-page01.md
│   ├── dirA-page02.md
│   └── subDirNamedA1
│   │   ├── subDirA1-page01.md
│   │   └── subDirA1-page02.md
│   └── subDirNamedA2
│       ├── subDirA2-page01.md
│       └── subDirA2-page02.md
├── dirNamedB
│   ├── dirB-page01.md
│   ├── dirB-page02.md
│   └── subDirNamedB1
│       ├── subDirB1-page01.md
│       └── subDirB1-page02.md
└── emptyDir
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这就发现了 &lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 和 MkDocs  、&lt;a href=&#34;https://github.com/mysiki/mkdocs_include_dir_to_nav&#34;&gt;mkdocs_include_dir_to_nav&lt;/a&gt; 在设置 navigation 时候的区别：&lt;a href=&#34;https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin&#34;&gt;MkDocs Awesome Pages Plugin&lt;/a&gt; 的 &lt;code&gt;nav&lt;/code&gt; 属性只能自定义&lt;strong&gt;该级别的导航&lt;/strong&gt;！即无法只通过一个 &lt;code&gt;.pages&lt;/code&gt; 实现所有目录+子目录的 navigation 排序配置。&lt;/p&gt;
&lt;p&gt;所以，最好的做法就是在 &lt;code&gt;docs&lt;/code&gt; 目录下(包含 &lt;code&gt;docs&lt;/code&gt;) 给每个目录增加一个 &lt;code&gt;.pages&lt;/code&gt; 文件，用于控制当前目录的所有子目录(或者 Posts) 的排序和展示。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;51&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-51/</link>
      <pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-51/</guid>
      
    </item>
    
    <item>
      <title>2023 年年终总结</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;本来没想着写年终总结 —— 主要是最近对于码字没太多的欲望，但翻到了 2021/2022 的一些年终记录，也看了不少其他网友博主 2023 年的总结，所以对自己说，还是写一写吧。&lt;/p&gt;
&lt;p&gt;2023 年对个人来说是变动的一年，这个变动主要体现在工作上。反观生活，除去家庭的一些琐事基本上也就是波澜不惊的一个状态。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;工作&#34;&gt;工作&lt;a class=&#34;headerlink&#34; href=&#34;#工作&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2023 年工作最大的变动之一就是公司搬迁新的厂区。随之而来是上下班通勤的变更，这一切让原本相对充裕的时间变得更加紧凑。但时间是最大的习惯，久而久之这就成了生活的一部分，朝九晚五体现的淋漓尽致。&lt;/p&gt;
&lt;p&gt;第二个变动最大的是新办公地点新办公规章。这一点影响很大，以至于让我不得不放弃了很多以前形成的一部分工具习惯，转身去重新接纳一些新的工具和平台。于是，有了现在的&lt;a href=&#34;https://weiyan.cc&#34;&gt;个人知识站点&lt;/a&gt;，有了&lt;a href=&#34;https://www.weiyan.cc/blog/2023/10/24/discussion-11/&#34;&gt;飞书的使用体验&lt;/a&gt;，GitHub 更是一瞬间成为了个人最常逛和依赖的平台 —— 这也让我重新认识了这个平台的强大和无可替代。    &lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/2024/01/github-contributions.png&#34; alt=&#34;github-contributions-2023&#34;&gt;
&lt;/p&gt;

&lt;p&gt;职业方向上探索了一把 AI，浅尝辄止又摸不着门道；mRNA 到 Protein 的优化道路上才刚刚看到入口，任重道远；只能背靠着老本行，在不断优化的道路上踉踉跄跄走着。&lt;/p&gt;
&lt;p&gt;职业生涯的道路上人来人往，铁打的营盘流水的兵，走了就走了，无需留念。&lt;/p&gt;
&lt;h2 id=&#34;生活&#34;&gt;生活&lt;a class=&#34;headerlink&#34; href=&#34;#生活&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;生活上其实没什么太多说的，感觉到微妙变化的是比以前更加注意到自己和身边人的健康问题了。从老婆孩子，到母亲的腰椎问题，再到自己，再加上这一年的流感、肺炎(尤其是支原体肺炎)，2023 年在健康这个问题上的确投入了很大的一部分时间和精力。&lt;/p&gt;
&lt;p&gt;家庭琐事上，家人彼此磕磕碰碰的事情总会有，生活无律，人生无常，我们更需要的是相互之间相互理解与包容。对于老婆和孩子，需要更多的关心和陪伴。&lt;/p&gt;
&lt;p&gt;运动这件事情上，基本还能保持着每周至少一场羽毛球，这是值得肯定的。虽然变换了新的地方，融入了新的面孔，但至少我们还能在一起用羽毛球找到属于彼此的快乐，那也足够了。&lt;/p&gt;
&lt;p&gt;孩子的事情上，这一年约着她的同班同学打卡了不少地方，这也让集体一起遛娃成为了周末值得期待的活动之一。&lt;/p&gt;
&lt;h2 id=&#34;最后&#34;&gt;最后&lt;a class=&#34;headerlink&#34; href=&#34;#最后&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后，2024 年就要搬进新的房子了，这是值得期待和努力的一件大事。希望自己和家人在新的环境中能收获新的惊喜，身体健康，和和美满。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;50&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-50/</link>
      <pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-50/</guid>
      
    </item>
    
    <item>
      <title>苹果字体 PingFang SC 的一些踩坑记录</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;曾经在 《&lt;a href=&#34;https://www.weiyan.cc/cookbook/%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4/windows/2021-02-19-win-font/&#34;&gt;为 Windows 系统替换优雅的苹果字体&lt;/a&gt;》中提到可在 Windows 中使用苹方字体替代默认的微软雅黑，这里就有一个问题即需要在 Wondows 下安装苹方字体 —— 如果你的字体安装错误，很有可能导致你的浏览器或其他应用出现乱码。&lt;/p&gt;
&lt;h2 id=&#34;浏览器乱码&#34;&gt;浏览器乱码&lt;a class=&#34;headerlink&#34; href=&#34;#浏览器乱码&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;出现这个的原因主要是站点使用了 &lt;code&gt;PingFang SC&lt;/code&gt; 的字体设置。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;body {
    font-family: PingFang SC,microsoft yahei,sans-serif;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;我们可以看到使用 F12 检查源码模式把 &lt;code&gt;font-family&lt;/code&gt; 中的 &lt;code&gt;PingFang SC&lt;/code&gt; 去掉后即可显示正常。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;字体安装后不起作用&#34;&gt;字体安装后不起作用&lt;a class=&#34;headerlink&#34; href=&#34;#字体安装后不起作用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这里就涉及一个 &lt;strong&gt;萍方&lt;/strong&gt; vs &lt;strong&gt;苹方&lt;/strong&gt; vs &lt;strong&gt;PingFang&lt;/strong&gt; 区别的一个问题。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;猛地看上去，萍方/苹方/PingFang 应该是同一个字体。但是，实际上的效果，却并不相同。那么，到底谁是真正的 pingfang sc呢？    &lt;/p&gt;
&lt;p&gt;这里以能否&lt;strong&gt;以 PingFang SC 为名称识别出来，作为标准&lt;/strong&gt;。为什么这么说呢？因为网页里面的 font-family，写的都是 pingfang sc，也许萍方/苹方都是差不多的字体，但是不能在网页里面自动识别出来。所以，就等于零。&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;body {
   font-family: PingFang SC,microsoft yahei,sans-serif;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
比如，上述 css 定义，就来自于腾讯云主页。在实际的应用过程中，只有安装好的 pingfang sc 系列字体才能被识别【如下图中的右侧字体】。  &lt;br /&gt;
&lt;strong&gt;注意：萍方/苹方，在安装的时候，文件名也都是 pingfang-sc 之类的文件名。但是，安装完成的真正成品，可不是这个拼音名字。进而导致字体不能识别。&lt;/strong&gt;
&lt;img alt=&#34;pingfang sc 区别&#34; src=&#34;https://gi.weiyan.tech/2024/01/fingfang-sc.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;From 《&lt;a href=&#34;https://newsn.net/say/css-font-family-pingfang.html&#34;&gt;由 pingfang sc 字体缺失，所暴露的字体加载顺序的潜规则&lt;/a&gt;》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;解决方案&#34;&gt;解决方案&lt;a class=&#34;headerlink&#34; href=&#34;#解决方案&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考 《&lt;a href=&#34;https://newsn.net/say/css-font-family-pingfang.html&#34;&gt;由 pingfang sc 字体缺失，所暴露的字体加载顺序的潜规则&lt;/a&gt;》 一文的方案。&lt;/p&gt;
&lt;h3 id=&#34;安装-pingfang-sc&#34;&gt;安装 PingFang SC&lt;a class=&#34;headerlink&#34; href=&#34;#安装-pingfang-sc&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;名称为 &lt;strong&gt;PingFang SC&lt;/strong&gt; (英文) 的字体找了很久才在 GitHub 翻到一个(以防丢失，个人 Fork 了过来)：&lt;a href=&#34;https://github.com/shenweiyan/PingFangSC-Fonts&#34;&gt;shenweiyan/PingFangSC-Fonts&lt;/a&gt;，如有需要可以直接下载安装。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;国内大多数网页，在定义网页字体的时候，都是先定义 PingFang SC，然后定义微软雅黑。那么：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正常来说，win 系统是不会安装 PingFang SC 字体的，所以，显示微软雅黑，页面正常。    &lt;/li&gt;
&lt;li&gt;但是，一旦单独安装了 PingFang SC Light，页面就会识别出这个 Light 字体，页面不正常。    &lt;/li&gt;
&lt;li&gt;解决方案是：再安装一个 PingFang SC Regular，页面会在 Light 之前优先识别 Regular，页面正常。    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果您非要在 win 下面安装 pingfang sc 字体，可能要三思而后安装了。李鬼似乎有点多&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;PingFang SC Regular&#34; src=&#34;https://gi.weiyan.tech/2024/01/pingfang-sc-regular.png&#34; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;删除-pingfang-sc&#34;&gt;删除 PingFang SC&lt;a class=&#34;headerlink&#34; href=&#34;#删除-pingfang-sc&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;个人用的就是这一个方法，但是在 &lt;code&gt;C:\Windows\Fonts&lt;/code&gt; 中删除的时候会提示 &lt;strong&gt;该字体正在使用无法删除！所以，必须要关闭使用苹方字体的程序。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因此，我们需要：&lt;/p&gt;
&lt;p&gt;参考：《&lt;a href=&#34;https://www.bilibili.com/video/BV1nc411575s/&#34;&gt;电脑安装新字体，浏览器字体全变了，如何删除正在使用的苹方字体&lt;/a&gt;》 - 哔哩哔哩&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 Windows 任务管理的进程中把浏览器相关的全部结束掉，如 360 浏览器相关的进程、Microsoft edge、Google Chrome 等等，全部选择结束任务。    &lt;/li&gt;
&lt;li&gt;把其他可能使用苹方字体的，如 OneNote、WPS、微信、&amp;hellip; 这些的进程也全部结束掉。    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，回到 &lt;code&gt;C:\Windows\Fonts&lt;/code&gt; 中再次删除相应的苹方字体，发现即可成功删除。删除了这些苹方字体，浏览器上的字体显示也就恢复正常了。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;苏南大叔，《&lt;a href=&#34;https://newsn.net/say/css-font-family-pingfang.html&#34;&gt;由 pingfang sc 字体缺失，所暴露的字体加载顺序的潜规则&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;科技猎手2023，《&lt;a href=&#34;https://www.bilibili.com/video/BV1nc411575s/&#34;&gt;电脑安装新字体，浏览器字体全变了，如何删除正在使用的苹方字体&lt;/a&gt;》 - 哔哩哔哩&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;49&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-49/</link>
      <pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-49/</guid>
      
    </item>
    
    <item>
      <title>1-支持的 Python 版本</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2024-01-08&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2024-01-08T00:00:00+00:00&#39;&gt;2024-01-08&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;编译：&lt;a href=&#34;https://www.weiyan.cc&#34;&gt;沈维燕&lt;/a&gt;   &lt;br /&gt;
原文：&lt;a href=&#34;https://docs.galaxyproject.org/en/master/admin/python.html&#34;&gt;https://docs.galaxyproject.org/en/master/admin/python.html&lt;/a&gt;       &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Galaxy 的核心功能目前支持 Python &amp;gt;=3.7。&lt;/p&gt;
&lt;p&gt;如果 Galaxy 排斥你正在使用的 Python 版本：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;完全删除 Galaxy 使用的 Python virtualenv（可以使用 &lt;code&gt;GALAXY_VIRTUAL_ENV&lt;/code&gt; 环境变量配置，默认为 &lt;code&gt;.venv&lt;/code&gt; ），例如： &lt;code&gt;rm -rf /path/to/galaxy/.venv&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果您在 conda 环境中使用 Python（可以使用 &lt;code&gt;GALAXY_CONDA_ENV&lt;/code&gt; 环境变量进行配置，默认为 &lt;code&gt;_galaxy_&lt;/code&gt;），请将其删除，例如： &lt;code&gt;conda env remove -n _galaxy_&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;让 Galaxy 知道要使用哪个 Python 的方法有以下几种：    &lt;/li&gt;
&lt;li&gt;如果您想从 conda 使用 Python，只需激活 &lt;code&gt;base&lt;/code&gt; 环境，Galaxy 将为自己创建一个新的 conda 环境。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;否则：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确保安装了受支持的 Python 版本。&lt;/li&gt;
&lt;li&gt;验证您要使用的 Python 解释器是否位于 &lt;code&gt;which -a python3 python&lt;/code&gt; 输出中的第一个位置（如果您使用的是 Galaxy &amp;lt;=19.09，则为 &lt;code&gt;which -a python&lt;/code&gt; ）。如果不是这种情况：     &lt;/li&gt;
&lt;li&gt;如果您使用的是 Galaxy &amp;gt;= 20.01，只需执行： &lt;code&gt;export GALAXY_PYTHON=/path/to/python&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果你使用的是较旧版本的 Galaxy，你可以操控你的 shell 的 &lt;code&gt;PATH&lt;/code&gt; 变量，将正确的版本置于首位。你可以通过创建一个新目录，将 python 的符号链接添加到其中，并将该目录置于 PATH 的最前面来完成此操作：
     &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/galaxy-python
%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ln&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/path/to/python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/galaxy-python/python
%&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/galaxy-python:&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从 Python 2 升级时，删除已编译的 &lt;code&gt;mako&lt;/code&gt; 模板：
   &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;% rm -rf /path/to/galaxy/database/compiled_templates/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
   这些模板将在启动 Galaxy 时自动重新生成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次启动 Galaxy。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;admonition abstract&#34;&gt;
&lt;p class=&#34;admonition-title&#34;&gt;注意&lt;/p&gt;
&lt;p&gt;如果您从源代码编译自己的 Python 解释器，请确保构建了 &lt;code&gt;ssl&lt;/code&gt;、&lt;code&gt;sqlite3&lt;/code&gt;、&lt;code&gt;curses&lt;/code&gt; 和 &lt;code&gt;bz2&lt;/code&gt; 模块，并且安装后可导入。这些 &amp;ldquo;额外&amp;rdquo; 模块是在编译过程的最后阶段构建的，并且是 Galaxy 框架所需的。如果在 Linux 上进行编译，您可能需要安装适用于 OpenSSL 和 Bzip2 的 &lt;code&gt;-dev&lt;/code&gt; 包。您可能还需要使用共享库 (&lt;code&gt;--enable-shared&lt;/code&gt;) 构建 Python。&lt;/p&gt;
&lt;/div&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;47&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/admin/2024-01-08-1-%E6%94%AF%E6%8C%81%E7%9A%84-Python-%E7%89%88%E6%9C%AC-dis47/</link>
      <pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/admin/2024-01-08-1-%E6%94%AF%E6%8C%81%E7%9A%84-Python-%E7%89%88%E6%9C%AC-dis47/</guid>
      
    </item>
    
    <item>
      <title>2-框架依赖</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2024-01-08&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2024-01-08T00:00:00+00:00&#39;&gt;2024-01-08&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;编译：&lt;a href=&#34;https://www.weiyan.cc&#34;&gt;Shen Weiyan&lt;/a&gt;    &lt;br /&gt;
原文：&lt;a href=&#34;https://docs.galaxyproject.org/en/master/admin/python.html&#34;&gt;https://docs.galaxyproject.org/en/master/admin/python.html&lt;/a&gt;      &lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;48&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/admin/2024-01-08-2-%E6%A1%86%E6%9E%B6%E4%BE%9D%E8%B5%96-dis48/</link>
      <pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/admin/2024-01-08-2-%E6%A1%86%E6%9E%B6%E4%BE%9D%E8%B5%96-dis48/</guid>
      
    </item>
    
    <item>
      <title>Galaxy Project 的 Sphinx 文档部署</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2024-01-05&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2024-01-05T00:00:00+00:00&#39;&gt;2024-01-05&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-07-25&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-07-25T14:37:44+00:00&#39;&gt;2026-07-25&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.galaxyproject.org/&#34;&gt;https://docs.galaxyproject.org/&lt;/a&gt; 是 Galaxy Project 官方的文档地址链接，这是一个基于 &lt;a href=&#34;https://www.sphinx-doc.org/&#34;&gt;Sphinx&lt;/a&gt; + &lt;a href=&#34;https://readthedocs.org/&#34;&gt;Read the Docs&lt;/a&gt; 的文档站点。如果我们也想要创建一个这样一模一样的 Galaxy 文档需要怎么操作呢？&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;虽然 &lt;a href=&#34;https://docs.galaxyproject.org/en/master/#building-this-documentation&#34;&gt;Galaxy 官方文档&lt;/a&gt; 也给出了关于构建该文档的一些说明，但没有太多细节。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you have your own copy of the Galaxy source code, you can also generate your own version of this documentation. Run the following command from the Galaxy’s root:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ make docs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
The generated documentation will be in &lt;code&gt;doc/build/html/&lt;/code&gt; and can be viewed with a web browser. Note that you will need to install Sphinx and other module dependencies which are listed in the Makefile in the Galaxy root folder.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面我们来详细分解一下 &lt;code&gt;make docs&lt;/code&gt; 这个命令具体执行的构建步骤。&lt;/p&gt;
&lt;p&gt;首先，在 Galaxy 根目录的执行 &lt;code&gt;make docs&lt;/code&gt;，主要是执行了该目录下 &lt;a href=&#34;https://github.com/galaxyproject/galaxy/blob/dev/Makefile&#34;&gt;Makefile&lt;/a&gt; 中的这几句命令：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docs: ## Generate HTML documentation.
# Run following commands to setup the Python portion of the requirements:
#   $ ./scripts/common_startup.sh
#   $ . .venv/bin/activate
#   $ pip install -r requirements.txt -r lib/galaxy/dependencies/dev-requirements.txt
    $(IN_VENV) $(MAKE) -C doc clean
    $(IN_VENV) $(MAKE) -C doc html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
- &lt;code&gt;$(MAKE)&lt;/code&gt;就是预设的 &lt;code&gt;make&lt;/code&gt; 这个命令的名称（或者路径）。  &lt;br /&gt;
- &lt;code&gt;-C&lt;/code&gt;：到指定目录下读取 Makefile 文件并执行（给出指定的目录的路径）。     &lt;/p&gt;
&lt;p&gt;第二步，读取 &lt;code&gt;doc&lt;/code&gt; 目录下的 &lt;a href=&#34;https://github.com/galaxyproject/galaxy/blob/dev/doc/Makefile&#34;&gt;Makefile&lt;/a&gt; 文件，并执行 &lt;code&gt;make html&lt;/code&gt;。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;html: $(GENERATED_RST)
    $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
    @echo
    @echo &#34;Build finished. The HTML pages are in $(BUILDDIR)/html.&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;结合其中的一些参数，其实最终就是执行了下面这个命令完成最终的构建。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sphinx-build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-b&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;html&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build/doctrees&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build/html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sphinx-build [OPTIONS] SOURCEDIR OUTPUTDIR [FILENAMES&amp;hellip;]&lt;/li&gt;
&lt;li&gt;sourcedir：path to documentation source files&lt;/li&gt;
&lt;li&gt;outputdir：path to output directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-b&lt;/code&gt;：BUILDER，builder to use (default: html)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;了解了以上几个步骤后，我们就可以把 Galaxy 根目录的 doc 目录单独拎出来，通过 Sphinx 的命令实现独立构建部署。&lt;/p&gt;
&lt;h2 id=&#34;1-安装必须依赖&#34;&gt;1. 安装必须依赖&lt;a class=&#34;headerlink&#34; href=&#34;#1-安装必须依赖&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主要包括三个依赖。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip3 install Sphinx sphinx_rtd_theme myst_parser
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-修改配置&#34;&gt;2. 修改配置&lt;a class=&#34;headerlink&#34; href=&#34;#2-修改配置&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于 &lt;code&gt;sphinx-build&lt;/code&gt; 会读取 &lt;code&gt;source/conf.py&lt;/code&gt; 并执行，但这个文件调用了 &lt;a href=&#34;https://github.com/galaxyproject/galaxy/blob/dev/lib/galaxy/version.py&#34;&gt;&lt;code&gt;galaxy.version&lt;/code&gt;&lt;/a&gt; 模块：
&lt;img alt=&#34;No module named &#39;galaxy&#39;&#34; src=&#34;https://gi.weiyan.tech/2024/01/no-galaxy-version.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;所以，如果我们想要把 &lt;code&gt;galaxy/doc&lt;/code&gt; 和 Galaxy 独立开来进行部署，就需要修改一下 &lt;code&gt;source/conf.py&lt;/code&gt;：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# The short X.Y version.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#from galaxy.version import (&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#    VERSION,&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#    VERSION_MAJOR,&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;VERSION_MAJOR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;23.1&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;VERSION_MINOR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;5.dev0&#34;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;VERSION&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;VERSION_MAJOR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;.&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;VERSION_MINOR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;VERSION_MINOR&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-执行构建&#34;&gt;3. 执行构建&lt;a class=&#34;headerlink&#34; href=&#34;#3-执行构建&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sphinx-build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-b&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;html&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build/doctrees&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build/html
Running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Sphinx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v7.2.6
making&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
myst&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v2.0.0:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MdParserConfig&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;commonmark_only&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;gfm_only&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;enable_extensions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;deflist&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;attrs_block&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;substitution&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;disable_syntax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[]&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;all_links_external&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;url_schemes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;http&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;https&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;mailto&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;ftp&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ref_domains&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;None,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;fence_as_directive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;set&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;number_code_blocks&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[]&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;title_to_header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;heading_anchors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;heading_slug_func&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;lt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make_id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;at&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;0x7f46201a6a60&amp;gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;html_meta&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={}&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;footnote_transition&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;words_per_minute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;200&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;substitutions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={}&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;linkify_fuzzy_links&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;dmath_allow_labels&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;dmath_allow_space&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;dmath_allow_digits&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;dmath_double_inline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;update_mathjax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mathjax_classes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;tex2jax_process|mathjax_process|math|output_area&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;enable_checkboxes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;False,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;suppress_warnings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[]&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;highlight_code_blocks&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
loading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;intersphinx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;inventory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://docs.python.org/3/objects.inv...
loading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;intersphinx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;inventory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://requests.readthedocs.io/en/master/objects.inv...
intersphinx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;inventory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;has&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;moved:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://requests.readthedocs.io/en/master/objects.inv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://requests.readthedocs.io/en/latest/objects.inv
building&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;mo&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;targets&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;po&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;that&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;are&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;out&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;date
writing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
building&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;html&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;targets&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;332&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;that&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;are&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;out&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;date
updating&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;environment:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;new&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;config&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;332&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;added,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;changed,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;removed
reading&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sources...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;%&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ts_api_doc

...

generating&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;indices...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;genindex&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
highlighting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;module&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;code...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
writing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;additional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pages...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;search&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
copying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;images...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;%&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;releases/images/23.1-hdf5.png
dumping&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;search&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;index&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;English&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;code:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;en&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
dumping&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;object&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;inventory...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;succeeded,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1223&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;warnings.

The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;HTML&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pages&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;are&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build/html.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后生成的静态文件都保存在了 &lt;code&gt;build/html&lt;/code&gt; 目录，我们可以借助 NGINX 或者其他 Pages 就可以直接看到一个一模一样对应当前 Repo 版本的 Galaxy Project 文档了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;46&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/topic/galaxy/other/2024-01-05-Galaxy-Project-%E7%9A%84-Sphinx-%E6%96%87%E6%A1%A3%E9%83%A8%E7%BD%B2-dis46/</link>
      <pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/other/2024-01-05-Galaxy-Project-%E7%9A%84-Sphinx-%E6%96%87%E6%A1%A3%E9%83%A8%E7%BD%B2-dis46/</guid>
      
    </item>
    
    <item>
      <title>不要使用 requirements.txt</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;作者：&lt;a href=&#34;https://miikka.me/&#34;&gt;Miikka Koskinen&lt;/a&gt;     &lt;br /&gt;
编译：&lt;a href=&#34;https://weiyan.cc&#34;&gt;沈维燕&lt;/a&gt;     &lt;br /&gt;
时间：原文发表于 2023-10-31     &lt;br /&gt;
原文：&lt;a href=&#34;https://quanttype.net/posts/2023-10-31-do-not-use-requirements.txt.html&#34;&gt;Do not use requirements.txt&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你是否在用 Python 开发后端服务？我有两条建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要使用 &lt;code&gt;pip&lt;/code&gt; 和 &lt;code&gt;requirements.txt&lt;/code&gt; 来管理 Python 依赖。它们缺乏一些应该内置的关键功能。&lt;/li&gt;
&lt;li&gt;改用 &lt;a href=&#34;https://python-poetry.org/&#34;&gt;Poetry&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;

&lt;p&gt;对我来说，第一条建议毋庸置疑。第二条则更具有暂时性：Poetry 是一个很好的选择，但并非唯一值得考虑的选择。&lt;/p&gt;
&lt;p&gt;我将在下面进行解释。&lt;/p&gt;
&lt;p&gt;请注意：如果你使用 Python 做其他事情而不是构建后端服务，那么本文中的建议可能并不适用于你。例如，如果你是&lt;a href=&#34;https://gregoryszorc.com/blog/2023/10/30/my-user-experience-porting-off-setup.py/&#34;&gt;一个正在迁移 &lt;code&gt;setup.py&lt;/code&gt; 的库开发者&lt;/a&gt;，Poetry 并不明显是一个完美的选择。&lt;/p&gt;
&lt;h2 id=&#34;pip-缺失的功能&#34;&gt;PIP 缺失的功能&lt;a class=&#34;headerlink&#34; href=&#34;#pip-缺失的功能&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/pip/&#34;&gt;pip&lt;/a&gt; 是一个工具，你可以用它从 &lt;a href=&#34;https://pypi.org/&#34;&gt;The Python Package Index (PyPI)&lt;/a&gt; 中安装软件包。它随 Python 一起安装，如果你是 Python 开发者，你可能已经多次使用过它。&lt;/p&gt;
&lt;p&gt;管理 Python 项目依赖的传统方式是将它们列在一个名为 &lt;code&gt;requirements.txt&lt;/code&gt; 的文件中，并使用 &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; 进行安装。然而，&lt;code&gt;pip&lt;/code&gt; 被设计成一个软件包安装工具，而不是一个功能齐全的项目工作流工具。&lt;strong&gt;pip 缺乏两个关键功能，即依赖的锁定文件 (dependency lockfiles) 和虚拟环境的自动管理(automatic management of virtualenvs)。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;依赖锁定文件&#34;&gt;依赖锁定文件&lt;a class=&#34;headerlink&#34; href=&#34;#依赖锁定文件&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你希望在所有环境中（比如你的笔记本电脑、持续集成(CI)、生产环境）获得相同的行为，你需要锁定你的依赖项及其传递依赖的版本。你可以在 &lt;code&gt;requirements.txt&lt;/code&gt; 中锁定你直接依赖的版本，例如，使用 &lt;code&gt;requests==2.31.0&lt;/code&gt; 而不是 &lt;code&gt;requests&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;然而，pip 不会锁定传递依赖的版本。这可以通过使用 &lt;a href=&#34;https://github.com/jazzband/pip-tools&#34;&gt;pip-tools&lt;/a&gt; 来解决，将 &lt;code&gt;requirements.txt&lt;/code&gt; 扩展成一个列出完整依赖图的文件，包括准确版本和构件的校验和(checksums for the artifacts)。pip-tools 很不错，但你需要自行设置并弄清楚它如何适应你的工作流程。&lt;/p&gt;
&lt;p&gt;在其他编程语言中，这个功能是基本要求的 - 例如，npm 多年来一直有 &lt;code&gt;package-lock.json&lt;/code&gt;，Cargo 也有 &lt;code&gt;Cargo.lock&lt;/code&gt;。这个功能实在应该是一个项目工作流工具中的内置功能。&lt;/p&gt;
&lt;h2 id=&#34;虚拟环境的自动管理&#34;&gt;虚拟环境的自动管理&lt;a class=&#34;headerlink&#34; href=&#34;#虚拟环境的自动管理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 Python 中创建隔离环境的方式是使用 &lt;a href=&#34;https://docs.python.org/3/library/venv.html&#34;&gt;virtualenvs&lt;/a&gt;。传统上，你需要手动管理它们：通过一个 shell 命令创建一个（比如 &lt;code&gt;python -m venv example&lt;/code&gt; 来创建名为 &lt;code&gt;example&lt;/code&gt; 的虚拟环境），当你想要使用它时，需要用另一个 shell 命令来激活它。&lt;/p&gt;
&lt;p&gt;这容易出错：忘记激活虚拟环境或者激活错误的虚拟环境是常见的错误。有一堆的解决方法。例如，你可以使用 &lt;a href=&#34;https://github.com/pyenv/pyenv-virtualenv&#34;&gt;pyenv-virtualenv&lt;/a&gt;，在进入项目目录时让你的 shell 自动激活一个虚拟环境。&lt;a href=&#34;https://github.com/direnv/direnv/wiki/Python&#34;&gt;direnv&lt;/a&gt; 也可以做到。&lt;/p&gt;
&lt;p&gt;同样，这也应该成为工作流工具中的一个内置功能。你不应该需要将多个工具粘合在一起。你不会听到 npm 或 Cargo 用户在虚拟环境上遇到问题的。&lt;/p&gt;
&lt;h2 id=&#34;poetry-及其他选择&#34;&gt;Poetry 及其他选择&lt;a class=&#34;headerlink&#34; href=&#34;#poetry-及其他选择&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;幸运的是，许多人已经意识到这些问题并努力解决它们。不太幸运的是，这导致了大量的 Python 项目工作流工具涌现。那么该如何选择呢？&lt;/p&gt;
&lt;p&gt;我的建议是：&lt;strong&gt;选择 &lt;a href=&#34;https://python-poetry.org/docs/&#34;&gt;Poetry&lt;/a&gt;&lt;/strong&gt;。它有锁定文件，有虚拟环境管理，而且很受欢迎且在积极开发中。根据我的经验，它并不完美，但是它起作用。&lt;/p&gt;
&lt;p&gt;你也可以考虑 &lt;a href=&#34;https://hatch.pypa.io/latest/&#34;&gt;Hatch&lt;/a&gt; 或 &lt;a href=&#34;https://github.com/pdm-project/pdm&#34;&gt;PDM&lt;/a&gt;。它们与 Poetry 相似。我自己没有使用过它们，但我听说其他人成功地使用了它们。Hatch 似乎在库作者 (library authors) 中特别受欢迎。&lt;/p&gt;
&lt;p&gt;如果你正在寻找一个更强大的选项，可以处理多个子项目，&lt;a href=&#34;https://www.pantsbuild.org/&#34;&gt;Pants 构建系统&lt;/a&gt;在 Python 支持方面做得很好。然而，它的学习曲线相对陡峭。&lt;/p&gt;
&lt;p&gt;最后，如果你正在寻找一个类似 rustup 那样可以为你安装 Python 的解决方案，那么有 &lt;a href=&#34;https://github.com/mitsuhiko/rye&#34;&gt;rye&lt;/a&gt;。它是新的实验性工具，但也许它对你来说是正确的选择？&lt;/p&gt;
&lt;h2 id=&#34;哪个是权威的工作流工具&#34;&gt;哪个是权威的工作流工具？&lt;a class=&#34;headerlink&#34; href=&#34;#哪个是权威的工作流工具&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果 Python 自带一个权威的项目工作流工具会很好。很多人希望 pip 成为这样一个工具。Node.js 自带 npm，Rust 自带 Cargo，那么为什么 Python 就不能有一个呢？为什么会有这么多竞争的选择呢？&lt;/p&gt;
&lt;p&gt;据我所知，最大的障碍是，由于 Python 被广泛使用且用于许多不同的用例，制定一个通用的官方解决方案是困难且缓慢的（并且资金不足的）工作。另外，也不清楚 pip 是否适合这些功能。&lt;/p&gt;
&lt;p&gt;如果你想了解更多信息，请阅读和听取这些与我不同、深度参与 Python 社区的人的意见：  &lt;br /&gt;
- Stargirl (Thea Flowers) on Fediverse：《&lt;a href=&#34;https://hachyderm.io/@stargirl/109697057391904145&#34;&gt;所以你想解决 Python 打包问题：一个实用指南&lt;/a&gt;》
- Pradyun Gedam：《&lt;a href=&#34;https://pradyunsg.me/blog/2023/01/21/thoughts-on-python-packaging/&#34;&gt;关于 Python 打包生态系统的思考&lt;/a&gt;》
- Talk Python to Me (podcast)：《&lt;a href=&#34;https://talkpython.fm/episodes/show/406/reimagining-pythons-packaging-workflows&#34;&gt;重新构想 Python 的打包工作流程&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id=&#34;关于-clojure&#34;&gt;关于 Clojure&lt;a class=&#34;headerlink&#34; href=&#34;#关于-clojure&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;阅读我的博客的 Clojure 开发者可能会问：嘿，Clojure 怎么样？为什么我们没有锁定文件呢？这是一个很好的问题！&lt;/p&gt;
&lt;p&gt;Clojure 社区通过始终使用明确的版本而不是版本范围来解决了这个问题，即使在库中也是如此。版本描述实际上支持范围，但没有人会使用它们。这样，只要版本解析算法稳定，你总是会得到相同的版本。&lt;/p&gt;
&lt;p&gt;理论上，传递依赖项版本不匹配可能是一个问题，但 Clojure 支持一种编码风格，很少引起问题。&lt;/p&gt;
&lt;p&gt;相比之下，在 Python 和 Node.js 社区，通常期望库列出其依赖项的版本范围，而软件包管理工具会抱怨版本不匹配的问题。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;44&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-44/</link>
      <pubDate>Wed, 03 Jan 2024 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-44/</guid>
      
    </item>
    
    <item>
      <title>基于 Matrix 协议的 Elements 通讯加密应用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Matrix 是一个开源、开放、轻量级、去中心化的即时聊天通讯协议，它是包括 deepin、Mozilla、Fedora、KDE、Archlinux、Debian 等开源社区均在广泛使用的即时聊天协议。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Element 是 Matrix 官方性质的，基于 Web 技术的 Matrix 客户端实现，除了网页环境外，也有桌面客户端可用。可以在你所使用的发行版的应用商店或包管理工具中搜索 element-desktop 或近似名称来检索和安装此客户端，然后即可运行并登录你的帐号。&lt;/p&gt;
&lt;p&gt;Element 可以和 GitHub 的仓库实现关联，把 GitHub 仓库的诸多信息同步到 Element。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;42&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-42/</link>
      <pubDate>Thu, 28 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-42/</guid>
      
    </item>
    
    <item>
      <title>阅读别人的博客</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;很多时候阅读别人的博客（站点），总能发现一些好玩的人和事物。2023 年被&lt;a href=&#34;https://blog.douchi.space/&#34;&gt;椒盐豆豉&lt;/a&gt;的一篇《&lt;a href=&#34;https://blog.douchi.space/2023-why-you-need-a-blog/&#34;&gt;2023 年了你为什么需要写博客&lt;/a&gt;》所吸引，尤其是 &lt;strong&gt;&amp;ldquo;博客是赛博空间的另一个你，也能反过来定义你&amp;rdquo;&lt;/strong&gt; 这一句，写出了很多心声。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;blockquote&gt;
&lt;p&gt;比较反感 &amp;ldquo;个人品牌&amp;rdquo; 这个过于商业化的说法，不写技术不写学术的非实名博客甚至起不到简历作用。但它确是比简历更 &amp;ldquo;像个人&amp;rdquo;，比碎片化社交网络更全面展现我是怎样一个人的网络门面。当然这是我这个博客的用法，网上靠博客经营自己品牌的也比比皆是。总之，内容的自由度和高度的定制化让博客可以成为任何你想让它成为的东西。反之，博客写的久了，发现 &amp;ldquo;写博客&amp;rdquo; 也已经成为了自己（不只是线上） identity 的一部分——毕竟这是很多人认识我的渠道，也重塑了我的一部分自我认知。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;鉴于此，终于在个人的&lt;a href=&#34;https://weiyan.cc/&#34;&gt;站点&lt;/a&gt;新增加了一个&lt;a href=&#34;https://weiyan.cc/flinks/&#34;&gt;友链&lt;/a&gt;页面，把一部分有意思的博客与站点都以友链的方式放到了这里（会不定期清理失效域名、停更的博客）。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;41&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-41/</link>
      <pubDate>Wed, 27 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-41/</guid>
      
    </item>
    
    <item>
      <title>Pandas 处理 Excel 常用方法技巧</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在使用 Pandas 前需要学习了解一下 Series 和 DataFrame 的基本数据结构和索引的相关概念，之后就可以练习基本的 Excel操作。Pandas 读取一个 Excel 文件后会将其转化为 DataFrame 对象，每一列或行就是一个 Series 对象。这里我们看下如何对一个 excel 进行读写，以及 Sheet、行列、表头处理的一些常用技巧。&lt;/p&gt;
&lt;h2 id=&#34;读取-excel&#34;&gt;读取 Excel&lt;a class=&#34;headerlink&#34; href=&#34;#读取-excel&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您想读取 Excel 表格中的数据，可以使用 &lt;code&gt;read_excel()&lt;/code&gt; 方法，其语法格式如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
              usecols=None, squeeze=False,dtype=None, engine=None,
              converters=None, true_values=None, false_values=None,
              skiprows=None, nrows=None, na_values=None, parse_dates=False,
              date_parser=None, thousands=None, comment=None, skipfooter=0,
              convert_float=True, **kwds)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- more --&gt;

&lt;p&gt;下表对常用参数做了说明：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;参数名称&lt;/th&gt;
&lt;th style=&#34;text-align: left;&#34;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;io&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;表示 Excel 文件的存储路径。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;sheet_name&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;要读取的工作表名称，默认0，即读取第一个工作表作为 DataFrame(一定要加&lt;code&gt;sheet_name=None&lt;/code&gt;，才能读取出所有的 sheet，否则默认读取第一个 sheet)。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;header&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;指定作为列名的行，默认0，即取第一行的值为列名；若数据不包含列名，则设定 header = None。若将其设置为 header=2，则表示将前两行作为多重索引。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;names&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;一般适用于Excel缺少列名，或者需要重新定义列名的情况；names的长度必须等于Excel表格列的长度，否则会报错。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;index_col&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;用做行索引的列，可以是工作表的列名称，如 index_col = &amp;lsquo;列名&amp;rsquo;，也可以是整数或者列表。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;usecols&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;int或list类型，默认为None，表示需要读取所有列。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;squeeze&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;boolean，默认为False，如果解析的数据只包含一列，则返回一个Series。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;converters&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;规定每一列的数据类型。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;skiprows&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;接受一个列表，表示跳过指定行数的数据，从头部第一行开始。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;nrows&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;需要读取的行数。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;skipfooter&lt;/td&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;接受一个列表，省略指定行数的数据，从尾部最后一行开始。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;示例如下所示：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 读取所有Sheet&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_excel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;example.xlsx&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sheet_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 读取第一个、第二个和名为&#34;Sheet5&#34;的工作表作为 DataFrame 的字典&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_excel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;example.xlsx&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sheet_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Sheet5&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;获取行数和列数&#34;&gt;获取行数和列数&lt;a class=&#34;headerlink&#34; href=&#34;#获取行数和列数&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_excel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;example.xlsx&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 行索引&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;span class=&#34;c1&#34;&gt;# RangeIndex(start=0, stop=3747, step=1)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 输出元祖,分别为行数和列数,默认第一行是表头不算行数&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;span class=&#34;c1&#34;&gt;# (3747, 4)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;获取表头&#34;&gt;获取表头&lt;a class=&#34;headerlink&#34; href=&#34;#获取表头&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;read_excel&lt;/code&gt; 默认是把 excel 的第一行当成表头。注意：如果 &lt;code&gt;read_excel&lt;/code&gt; 的 &lt;code&gt;sheet_name=None&lt;/code&gt;，读取的是所有 excel 的 sheet_name(key) 和 sheet_values(values) 组成的字典，&lt;code&gt;df.keys()&lt;/code&gt; 的结果是所有 sheet_name，即名字(字典的键)。&lt;/p&gt;
&lt;h3 id=&#34;获取第一个-sheet&#34;&gt;获取第一个 sheet&lt;a class=&#34;headerlink&#34; href=&#34;#获取第一个-sheet&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这时候 &lt;code&gt;df.keys()&lt;/code&gt; 和 &lt;code&gt;df.columns&lt;/code&gt; 的结果是一样的，都是第一个 sheet 的表头。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_excel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;input.xlsx&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;---------------&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;columns&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;获取所有-sheet&#34;&gt;获取所有 sheet&lt;a class=&#34;headerlink&#34; href=&#34;#获取所有-sheet&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pandas&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;pd&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 参数为 None 代表读取所有 sheet&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_excel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;input.xlsx&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sheet_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 获取所有sheet名字, 如果read_excel参数不是None, 则df.keys()为表头&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;sheet_names&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;df&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sheet_names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;老董，《&lt;a href=&#34;https://www.python66.com/pandasshujufenxi/268.html&#34;&gt;pandas获取excel的行数,列数,表头,sheet,前后行等数据&lt;/a&gt;》，&lt;a href=&#34;https://www.python66.com/&#34;&gt;Python编程网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://c.biancheng.net/pandas/excel.html&#34;&gt;Pandas Excel读写操作详解&lt;/a&gt;》，&lt;a href=&#34;https://c.biancheng.net/&#34;&gt;C语言中文网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html&#34;&gt;pandas.read_excel — pandas 2.1.4 documentation&lt;/a&gt;》，&lt;a href=&#34;https://pandas.pydata.org/docs/index.html&#34;&gt;pandas documentation — pandas 2.1.4 documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;40&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-40/</link>
      <pubDate>Tue, 26 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-40/</guid>
      
    </item>
    
    <item>
      <title>GitHub Discussions 使用与思考</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;从2023年7月起我所有可公开的文档都保存在了 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions&#34;&gt;GitHub Discussions&lt;/a&gt; 上，作为博客、IED 编辑器，以及评论使用，GitHub Discussions 是完全没问题的。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;开源的代名词&#34;&gt;开源的代名词&lt;a class=&#34;headerlink&#34; href=&#34;#开源的代名词&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;开源已成为 GitHub 的代名词。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当开发者谈论开源时，通常会想到 GitHub，它不仅仅是一个代码托管平台，更是一个汇聚了全球开发者的社交中心。过去，开发者发布一款软件后，都是在自己的小圈子里默默努力和交流，现在通过 GitHub 平台可以方便地与全球的开发者分享、交流和协作。贡献者在这里展示自己的才华，追随者在这里寻找强者的脚印，等待着被世人认可的时刻。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;体验与感受&#34;&gt;体验与感受&lt;a class=&#34;headerlink&#34; href=&#34;#体验与感受&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于 GitHub 是直接 markdown 源码进行书写，正常的导出基本不会有格式错乱的问题，这一点非常好。不像有一些富文本的编辑器，动不动就给你增加几个换行或者空格什么的额外字符。&lt;/p&gt;
&lt;p&gt;借助 GitHub GraphQL API + Python + GitHub Actions 进行每天定时导出非常顺滑，导出来的文档可以随意折腾，自由度非常大。&lt;/p&gt;
&lt;h2 id=&#34;专业书籍文档&#34;&gt;专业书籍文档&lt;a class=&#34;headerlink&#34; href=&#34;#专业书籍文档&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;今天忽然想到的一个问题，即如果作为专业性比较强的系列文档写作，如《&lt;a href=&#34;https://www.hello-algo.com/&#34;&gt;Hello 算法&lt;/a&gt;》 这样专业性和逻辑性非常明确的专业书籍，使用 GitHub Discussions 写作应该是有点不太合适。&lt;/p&gt;
&lt;p&gt;但又仔细想了一下，如果&lt;strong&gt;只是写作&lt;/strong&gt;应该是没问题的 —— 我们可以用 sections 或者 categories，甚至是 tags 进行书籍分类，最后在导出的时候借助这些标签把相关的文档整合到一块，再借助 nav 梳理成大纲展现给读者阅读就可以。所以，总的来说可以用于专业书籍&lt;strong&gt;写作(编辑)&lt;/strong&gt;，但&lt;strong&gt;不太适合用于专业书籍的呈现和阅读&lt;/strong&gt; —— 主要是大纲和逻辑性会变得不明显。&lt;/p&gt;
&lt;h2 id=&#34;目录和分类标签&#34;&gt;目录和分类标签&lt;a class=&#34;headerlink&#34; href=&#34;#目录和分类标签&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub Discussions 目前&lt;a href=&#34;https://github.com/orgs/community/discussions/7960&#34;&gt;最多支持 25 个 categories&lt;/a&gt;，这是一个限制。因此，通过 section+category 我们在 Discussions 上最多只能实现两级的目录结构，所以对于三级和三级以上的目录结构目前暂时无能为力。&lt;/p&gt;
&lt;p&gt;因此，想到一个折中的解决方法：使用 labels 来区分第三级目录结构。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;1.1-生信
  - 1.1.1-算法
  - 1.1.2-数据
  - 1.1.2-软件
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;然后，导出 Discussions 的时候需要在本地先在本地建立一个 &lt;code&gt;section+category: dictory&lt;/code&gt; 一一对应的字典，最后通过这个字典把不同的讨论 md 归档至对应的目录。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;1.1-生信:
    1.1.1-算法: docs/cookbook/生物信息/算法
    1.1.2-数据: docs/cookbook/生物信息/数据
    1.1.2-软件: docs/cookbook/生物信息/软件
    ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;github-graphql-api&#34;&gt;GitHub GraphQL API&lt;a class=&#34;headerlink&#34; href=&#34;#github-graphql-api&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub Discussions 的 API 操作主要依赖 &lt;a href=&#34;https://docs.github.com/zh/graphql/overview/about-the-graphql-api&#34;&gt;GitHub GraphQL API&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&#34;概述&#34;&gt;概述&lt;a class=&#34;headerlink&#34; href=&#34;#概述&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GraphQL 是一种用于&lt;a href=&#34;https://www.redhat.com/zh/topics/api/what-are-application-programming-interfaces&#34;&gt;应用编程接口（API）&lt;/a&gt;的查询语言和服务器端运行时，它可以使客户端准确地获得所需的数据，没有任何冗余。&lt;/p&gt;
&lt;h2 id=&#34;graphql-有什么用&#34;&gt;GraphQL 有什么用？&lt;a class=&#34;headerlink&#34; href=&#34;#graphql-有什么用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GraphQL 旨在让 API 变得快速、灵活并且为开发人员提供便利。它甚至可以部署在名为 &lt;a href=&#34;https://github.com/graphql/graphiql&#34;&gt;GraphiQL&lt;/a&gt; 的&lt;a href=&#34;https://www.redhat.com/zh/topics/middleware/what-is-ide&#34;&gt;集成开发环境（IDE）&lt;/a&gt;中。作为 &lt;a href=&#34;https://www.redhat.com/zh/topics/integration/whats-the-difference-between-soap-rest&#34;&gt;REST&lt;/a&gt; 的替代方案，GraphQL 允许开发人员构建相应的请求，从而通过单个 API 调用从多个数据源中提取数据。&lt;/p&gt;
&lt;p&gt;此外，GraphQL 还可让 API 维护人员灵活地添加或弃用字段，而不会影响现有查询。开发人员可以使用自己喜欢的方法来构建 API，并且 GraphQL 规范将确保它们以可预测的方式在客户端发挥作用。&lt;/p&gt;
&lt;p&gt;From：《&lt;a href=&#34;https://www.redhat.com/zh/topics/api/what-is-graphql&#34;&gt;什么是 GraphQL？核心概念解析&lt;/a&gt;》- 红帽&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;中文文档：https://docs.github.com/zh/graphql/guides/introduction-to-graphql&lt;/li&gt;
&lt;li&gt;在线使用：https://docs.github.com/en/graphql/overview/explorer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;获取-discussions-主要信息&#34;&gt;获取 discussions 主要信息&lt;a class=&#34;headerlink&#34; href=&#34;#获取-discussions-主要信息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
  repository(owner: &#34;shenweiyan&#34;, name: &#34;Knowledge-Garden&#34;) {
    discussions(orderBy: {field: CREATED_AT, direction: DESC}, categoryId: null, first: 5) {
      nodes {
        title
        number
        url
        createdAt
        lastEditedAt
        updatedAt
        body
        bodyText
        bodyHTML
        author {
          login
        }
        category {
          name
        }
        labels(first: 100) {
          nodes {
            name
          }
        }
        comments(first: 10) {
          nodes {
            body
            author {
              login
            }
          }
        }
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;获取-discussions-categoryid&#34;&gt;获取 discussions categoryId&lt;a class=&#34;headerlink&#34; href=&#34;#获取-discussions-categoryid&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;参考：《&lt;a href=&#34;https://qiita.com/shooter/items/d59fbb43d0f118c95092&#34;&gt;how to get github discussions categoryId&lt;/a&gt;》&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
  repository(owner: &#34;shenweiyan&#34;, name: &#34;Knowledge-Garden&#34;) {
    id
    name
    discussionCategories(first: 30) {
      nodes {
        id
        name
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;其他的一些问题&#34;&gt;其他的一些问题&lt;a class=&#34;headerlink&#34; href=&#34;#其他的一些问题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;目前，通过 GitHub GraphQL API 暂时无法获取 Sections 的信息。&lt;/p&gt;
&lt;h2 id=&#34;简单的总结&#34;&gt;简单的总结&lt;a class=&#34;headerlink&#34; href=&#34;#简单的总结&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;拥抱 GitHub Discussions 的一个前提是你可以随时登录 GitHub，如果你已经解决了这个问题，也想着像我一样 Using Github discussions as your blog engine，那么你可以参考一下我的 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/&#34;&gt;shenweiyan/Knowledge-Garden&lt;/a&gt; 仓库。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;38&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-38/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-38/</guid>
      
    </item>
    
    <item>
      <title>MkDocs Material 安装部署和使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;MkDocs 是一个快速、简单、华丽的静态网站生成器，适用于构建项目文档。文档源文件以 Markdown 编写，并使用一个 YAML 文件来进行配置。&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/&#34;&gt;Material for MkDocs&lt;/a&gt; 是 &lt;a href=&#34;https://www.mkdocs.org/&#34;&gt;MkDocs&lt;/a&gt; 的一个主题配置，更加简洁美观，更新和维护也更加及时和频繁，且社区也更加活跃。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;安装&#34;&gt;安装&lt;a class=&#34;headerlink&#34; href=&#34;#安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主要使用的一些软件包以及模块 (requirements.txt) 如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdocs==1.5.3
mkdocs-material
mkdocs-rss-plugin
mkdocs-git-revision-date-plugin
mkdocs-include-dir-to-nav==1.2.0
mkdocs-glightbox
jieba
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip3 install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;查看 &lt;code&gt;mkdocs-material&lt;/code&gt;, &lt;code&gt;mkdocs&lt;/code&gt; 的版本：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;version&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.5.3&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;software&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.9.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python3&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.9&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;site&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pip3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;material&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;material&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;9.4.4&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Summary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Documentation&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;that&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;simply&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;works&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Home&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; 
&lt;span class=&#34;n&#34;&gt;Author&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; 
&lt;span class=&#34;n&#34;&gt;Author&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Martin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Donath&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;martin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;donath&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@squidfunk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;License&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; 
&lt;span class=&#34;n&#34;&gt;Location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;software&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.9.18&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;python3&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.9&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;site&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Requires&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;babel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;colorama&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jinja2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;markdown&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mkdocs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;material&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extensions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;paginate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pygments&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pymdown&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extensions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;regex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Required&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;by&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用&#34;&gt;使用&lt;a class=&#34;headerlink&#34; href=&#34;#使用&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本地预览：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ mkdocs serve -a 0.0.0.0:8000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;问题与解决&#34;&gt;问题与解决&lt;a class=&#34;headerlink&#34; href=&#34;#问题与解决&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pagination 分页与 &lt;code&gt;git-revision-date&lt;/code&gt; 冲突，导致无法构建 - 参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/6156&#34;&gt;mkdocs-material/discussions/6156&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/issues/5134&#34;&gt;Support Markdown in the copyright string #5134&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/4969&#34;&gt;如何在 MkDocs 的版权部分自动添加年份 - squidfunk/mkdocs-material#4969&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/6324&#34;&gt;如何定制博客插件的归档页面 - squidfunk/mkdocs-material#6324&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;期待的功能&#34;&gt;期待的功能&lt;a class=&#34;headerlink&#34; href=&#34;#期待的功能&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是一个个人非常期待的功能，大部分目前已经可以在 &lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/insiders/&#34;&gt;Insiders&lt;/a&gt; 版本中使用，社区公开的版本尚无法使用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;博客插件的自定义归档、目录页面每页文档数 - &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/issues/6383&#34;&gt;squidfunk/mkdocs-material#6383&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;内置隐私插件（方便内网/国内部署加速访问）- &lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/privacy/&#34;&gt;Built-in privacy plugin - Material for MkDocs&lt;/a&gt;  &lt;br /&gt;
    内置隐私插件(privacy plugin) 在 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/releases/tag/9.5.0&#34;&gt;9.5.0&lt;/a&gt; 中已经k可以正常使用了，下一个值得期待的就是该插件的 &lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_exclude&#34;&gt;&lt;code&gt;assets_exclude&lt;/code&gt;&lt;/a&gt; 功能！&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;37&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-37/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-37/</guid>
      
    </item>
    
    <item>
      <title>为 Material for MkDocs 增加博客插件</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Material for MkDocs 从 9.2.0 开始内置博客插件，内置博客插件添加了对从帖子文件夹构建博客的支持，这些帖子带有日期和其他结构化数据注释。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Material for MkDocs makes it very easy to build a blog, either as a sidecar to your documentation or standalone. Focus on your content while the engine does all the heavy lifting, automatically generating archive and category indexes, post slugs, configurable pagination and more.&lt;/p&gt;
&lt;p&gt;Material for MkDocs 使构建博客变得非常容易，无论是作为文档的附属工具还是独立的博客。专注于您的内容，而引擎会完成所有繁重的工作，自动生成存档和类别索引、帖子段、可配置的分页等等。&lt;/p&gt;
&lt;p&gt;存在的一些问题和使用体验：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 Markdown 中使用 &lt;code&gt;&amp;lt;!-- more --&amp;gt;&lt;/code&gt; 的写法分割 description 和全文，总感觉有点别扭；&lt;/li&gt;
&lt;li&gt;Pagination 分页与 &lt;code&gt;git-revision-date&lt;/code&gt; 冲突，会引发构建错误 - 参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/6156&#34;&gt;mkdocs-material/discussions#6156&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;写博客&#34;&gt;写博客&lt;a class=&#34;headerlink&#34; href=&#34;#写博客&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有感于 Material for MkDocs 的博客结构，现在基本上可以实现使用 Discussions 进行 MkDocs blog 编辑与写作 —— 在 Discussions 上写完文章，借助第三方工具或者 GitHub Actions 导出为 Markdown 文件，保存到 &lt;code&gt;docs/blog/posts&lt;/code&gt; 就可以啦！&lt;/p&gt;
&lt;h2 id=&#34;加评论&#34;&gt;加评论&lt;a class=&#34;headerlink&#34; href=&#34;#加评论&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;借助 &lt;a href=&#34;https://giscus.app/zh-CN&#34;&gt;giscus&lt;/a&gt;，可以非常方便在文章页中插入指定的 discussions —— 在导出 discussions 的时候，在文章尾部增加类似以下 JavaScript 即可：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://giscus.app/client.js&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;shenweiyan/Knowledge-Garden&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;R_kgDOKgxWlg&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;number&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;term&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;4&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;reactions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;1&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;emit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;0&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;bottom&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;light&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;zh-CN&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;crossorigin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;anonymous&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;async&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;自定义归档页面&#34;&gt;自定义归档页面&lt;a class=&#34;headerlink&#34; href=&#34;#自定义归档页面&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/squidfunk/mkdocs-material&#34;&gt;mkdocs-material&lt;/a&gt; 的归档页面跟博客 index 主页面基本是一个样，如果想要列表式的自定义，可以参考 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/discussions/6324&#34;&gt;squidfunk/mkdocs-material#6324&lt;/a&gt; 和 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material/issues/6383&#34;&gt;squidfunk/mkdocs-material#6383&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;官方在 &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material-insiders/commit/8ecee7b9dbdc5b2a0befd043a048ad25d56c784f&#34;&gt;8ecee7b&lt;/a&gt; (Insiders) 中增加了几个个性化的新设置参数：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination&#34;&gt;&lt;code&gt;archive_pagination&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination_per_page&#34;&gt;&lt;code&gt;archive_pagination_per_page&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination&#34;&gt;&lt;code&gt;categories_pagination&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination_per_page&#34;&gt;&lt;code&gt;categories_pagination_per_page&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，等开放给公用版本使用后，可以再好好折腾一下。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;36&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-36/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-36/</guid>
      
    </item>
    
    <item>
      <title>跳过任意开屏广告和内部弹窗广告</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;今天去用了一下 &lt;a href=&#34;https://github.com/gkd-kit/gkd&#34;&gt;gkd&lt;/a&gt;—— 点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告的应用，发现真不错，记录一下遇到的一些问题。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;具体使用步骤如下。&lt;/p&gt;
&lt;h2 id=&#34;1-开启权限&#34;&gt;1. 开启权限&lt;a class=&#34;headerlink&#34; href=&#34;#1-开启权限&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;应用安装后，&lt;strong&gt;&amp;ldquo;主页&amp;rdquo;&lt;/strong&gt; 页面的这几个权限都需要开启（尤其是&lt;strong&gt;无障碍权限&lt;/strong&gt;），否则应用无法跳过广告，不起作用。   &lt;/p&gt;
&lt;p&gt;&lt;img width=300px src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/gkd-home.jpg&#34; alt=&#34;gkd-home&#34;&gt;&lt;/p&gt;
&lt;p&gt;华为鸿蒙系统怎么开启无障碍模式（也可以参考：&lt;a href=&#34;https://consumer.huawei.com/cn/support/content/zh-cn15849085/&#34;&gt;通过快捷方式启动无障碍功能&lt;/a&gt;）： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开辅助功能，进入手机设置界面，点击【辅助功能】。&lt;/li&gt;
&lt;li&gt;打开无障碍，点击【无障碍】。&lt;/li&gt;
&lt;li&gt;打开已安装的服务，下拉到页面底部，点击【已安装的服务】。&lt;/li&gt;
&lt;li&gt;选择服务，选择要设置的服务【GKD】，点击进入。&lt;/li&gt;
&lt;li&gt;打开服务开关，点击服务右侧【开关】按钮。&lt;/li&gt;
&lt;li&gt;确定打开。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里会有一个问题：&lt;strong&gt;鸿蒙手机无障碍打开后，点击清理后台会自动关闭&lt;/strong&gt;！参考：&lt;a href=&#34;https://github.com/gkd-kit/gkd/issues/201&#34;&gt;gkd-kit/gkd#201&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;具体可以参考华为官方给出的解决方法——《&lt;a href=&#34;https://consumer.huawei.com/cn/support/content/zh-cn00410039/&#34;&gt;华为手机/平板无障碍中的第三方应用的服务开关自动关闭&lt;/a&gt;》。&lt;/p&gt;
&lt;h2 id=&#34;2-更新订阅&#34;&gt;2. 更新订阅&lt;a class=&#34;headerlink&#34; href=&#34;#2-更新订阅&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;应用安装后，&lt;strong&gt;&amp;ldquo;订阅&amp;rdquo;&lt;/strong&gt; 页面的本地订阅如果没有规则，则需要下拉执行更新一下即可（参考：&lt;a href=&#34;https://github.com/gkd-kit/gkd/issues/100&#34;&gt;gkd-kit/gkd#100&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img width=300px src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/gkd-dy.jpg&#34; alt=&#34;GKD-订阅&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-设置&#34;&gt;3. 设置&lt;a class=&#34;headerlink&#34; href=&#34;#3-设置&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是个人在使用时候 &lt;strong&gt;&amp;ldquo;设置&amp;rdquo;&lt;/strong&gt; 页面的一个截图。    &lt;/p&gt;
&lt;p&gt;&lt;img width=300px src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/gkd-setting.jpg&#34; alt=&#34;GKD-订阅&#34;&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;39&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-39/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-39/</guid>
      
    </item>
    
    <item>
      <title>使用 meta 实现页面的定时刷新或跳转</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;这个方法最开始是在 &lt;a href=&#34;https://github.com/yanlinlin82&#34;&gt;Linlin Yan (颜林林)&lt;/a&gt; 的 GitHub Pages 上第一次看到。后来，随着自己也用上了，就开始有了更深一些的认识。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;跳转域名&#34;&gt;跳转域名&lt;a class=&#34;headerlink&#34; href=&#34;#跳转域名&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 &lt;a href=&#34;https://github.com/yanlinlin82/yanlinlin82.github.io/tree/master&#34;&gt;yanlinlin82/yanlinlin82.github.io&lt;/a&gt; 看到一个通过 &lt;a href=&#34;https://yanlinlin82.github.io&#34;&gt;https://yanlinlin82.github.io&lt;/a&gt; 可以直接重定向到 &lt;a href=&#34;https://yanlinlin.cn/&#34;&gt;https://yanlinlin.cn/&lt;/a&gt; 的用法 —— 只需要把 &lt;code&gt;index.html&lt;/code&gt; 写成这样就可以：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;refresh&#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0; url=https://yanlinlin.cn/&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;页面定时跳转与刷新&#34;&gt;页面定时跳转与刷新&lt;a class=&#34;headerlink&#34; href=&#34;#页面定时跳转与刷新&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这部分的内容主要来源自：《&lt;a href=&#34;https://www.zhangxinxu.com/wordpress/2015/03/meta-http-equiv-refresh-content/&#34;&gt;小tip: 使用meta实现页面的定时刷新或跳转&lt;/a&gt;》。&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;meta-源信息功能之页面定时跳转与刷新&#34;&gt;meta 源信息功能之页面定时跳转与刷新&lt;a class=&#34;headerlink&#34; href=&#34;#meta-源信息功能之页面定时跳转与刷新&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;几乎所有的网页头部都有&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;源信息。除了我们常用的定义编码、关键字(name=”keywords”)、描述(name=”description”)(for SEO)，还可以定义视区大小、缩放比例等(for 移动端)，如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1.0&#34;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以及，定义网页的过期时间，Cookie 的过期时间等等。&lt;/p&gt;
&lt;p&gt;文本要介绍的内容，科科，跟上面都没关系。哦，抱歉，都有关系，只是名称我故意没提到。主角嘛，总要最后闪亮登场！&lt;/p&gt;
&lt;p&gt;就是我们网页平时跳转，还可以使用 &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; 实现，下面几个典型代码示例：  &lt;br /&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;refresh&#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;5&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这个表示当前页面每5秒钟刷一下，刷一下~&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;refresh&#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;2; url=&#39;/&#39;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这个表示当前页面2秒后跳到首页~    &lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;refresh&#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;0; url=&#39;http://www.qq.com/&#39;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
页面直接跳转到腾讯网~&lt;/p&gt;
&lt;p&gt;所以，当我们下次遇到“登录成功，正在跳转到您之前访问页面……”的时候，可以使用&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;的这个&lt;code&gt;refresh&lt;/code&gt;刷新，跳转功能，可以说是成本最低的。    &lt;/p&gt;
&lt;p&gt;您可以狠狠地点击这里：&lt;a href=&#34;http://www.zhangxinxu.com/study/201503/meta-fresh-content.html&#34;&gt;meta与当前页面定时刷新Demo&lt;/a&gt;   &lt;br /&gt;
&lt;img alt=&#34;meta-refresh&#34; src=&#34;https://gi.weiyan.tech/2024/01/meta-refresh.37epe9yaam80.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上面 Demo 效果就是上面第1个示例代码效果。        &lt;/p&gt;
&lt;p&gt;根据我的测试，此特性包括IE7在内的浏览器都是支持的。    &lt;/p&gt;
&lt;h3 id=&#34;问题来了为何-meta-跳转不火呢&#34;&gt;问题来了：为何 meta 跳转不火呢？&lt;a class=&#34;headerlink&#34; href=&#34;#问题来了为何-meta-跳转不火呢&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;大家可以看到，&lt;code&gt;meta&lt;/code&gt; 跳转，使用方便，不用写 JS，不用会后台代码，定时跳转刷新什么的玩得照样很溜，而且兼容性好，为啥总感觉不温不火，很少看见有人提及呢？    &lt;/p&gt;
&lt;p&gt;新晋的小伙伴不知有没有听过这么一个词，叫做“万恶的IE6年代”。&lt;/p&gt;
&lt;p&gt;据说，当年，这一批老旧的浏览器，问题很多，其中就有对&lt;code&gt;meta&lt;/code&gt; 两个小小的不友好。我也是听说，不一定准确。坊间是这么传闻的：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时间设为0的跳转，有时候页面会闪一下；    &lt;/li&gt;
&lt;li&gt;跳转到其他页面，浏览器后退按钮是不能用的；     &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是啊，现在是什么年代啊，监狱风云都拍到第二季了，这些老问题，我觉得就可以忽略不计了。    &lt;/p&gt;
&lt;p&gt;不妨大胆试试 &lt;code&gt;meta&lt;/code&gt; 跳转，好好利用下浏览器的原生特性，说不定就会发现比什么 JS 跳转之流用得更开心。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以，在文章的最后有一个小想法 —— 我们是不是也可以利用这个方法实现无数个链接 301 重定向( URL 转发)，再也不需要担心是否需要主机+Nginx 之类！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;33&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-33/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-33/</guid>
      
    </item>
    
    <item>
      <title>博客与写作的一些思考</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;关于写作原本的想法，只是想写点自己在学习、工作、生活上的一些心得和体会，把一些知识点记录下来。&lt;/p&gt;
&lt;p&gt;留言的初衷是，希望自己写下来的东西能够有人一起探讨。哪怕你把我的观点批评得一无是处也可以，哪怕你说我的句子狗屁不通也没关系，只要有评判，我相信总有一天我会变得更好。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;写作也好留言也罢，博客也只是一种实现的载体，语雀、博客园也是同样的道理，平台的选择虽然重要，但根本还是在于内容。&lt;/p&gt;
&lt;p&gt;每次看到人家一些内容翔实，界面优雅的博客，总要跟自己说，要忍住再去折腾博客的冲动，什么 UI，什么 CSS/HTML，都是浮云，内容才是核心，老老实实回归最简单的 Issues 和 Discussions 已经足够了。另外，需要知道的是，博客其实就是写给自己看的，什么 SEO 流量、关注度、知名度还是需要一颗随缘的心态。&lt;/p&gt;
&lt;p&gt;使用 Issues 当作博客也是挺不错的~&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Meekdai/Gmeek&#34;&gt;https://github.com/Meekdai/Gmeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yihong0618/gitblog&#34;&gt;https://github.com/yihong0618/gitblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yutingzhao1991/github-blogs-collector&#34;&gt;https://github.com/yutingzhao1991/github-blogs-collector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于部分平台商业化的写作，有两点自认为讲的挺好：    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商业化已经改变了写作的初衷。    &lt;/li&gt;
&lt;li&gt;当写文章变成盈利的手段，那么，写出来的东西是没有灵魂的。&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;34&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-34/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-34/</guid>
      
    </item>
    
    <item>
      <title>2022 年的十大生物学突破</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;作者 |&lt;/strong&gt; &lt;a href=&#34;https://substack.com/profile/11154869-niko-mccarty&#34;&gt;Niko McCarty&lt;/a&gt;  &lt;br /&gt;
&lt;strong&gt;翻译 |&lt;/strong&gt; &lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;章鱼猫先生&lt;/a&gt;  &lt;br /&gt;
&lt;strong&gt;日期 |&lt;/strong&gt; 原文发表于 2022.12.10  &lt;br /&gt;
&lt;strong&gt;来源 |&lt;/strong&gt; &lt;a href=&#34;https://cell.substack.com/p/biology-breakthroughs-2022&#34;&gt;Biology Breakthroughs of 2022&lt;/a&gt; - Codon    &lt;/p&gt;
&lt;p&gt;您正在阅读 Codon，这是一份关于生物 + 技术进步和为人类创造更光明未来的想法的时事通讯。  &lt;br /&gt;
这是今年的最后一部作品。几周后我会在这里见到你！    &lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-1.webp&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;大约 1950 年代，戴着加压氧气面罩的男子&lt;/em&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;当你经历历史时，历史永远不会像历史。它总是看起来很混乱和凌乱，而且总是让人感觉不舒服。&amp;rdquo;  &lt;br /&gt;
—— 约翰·W·加德纳&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;许多我非常敬佩的作家都对“进步的停滞”写出了令人信服的论战。科学越来越难，发现越来越小（平均而言），这两件事都很糟糕。&lt;/p&gt;
&lt;p&gt;如果你召集来自世界顶级院系的 93 位物理学家，让他们将 1910 年代获得诺贝尔奖的发现与 80 年代的另一个发现进行比较，他们通常会说更早的发现更重要。&lt;/p&gt;
&lt;p&gt;与五十年前相比，今天实现技术飞跃也更加困难。将计算机芯片上的晶体管数量增加一倍（又名摩尔定律）需要的研究人员数量是 1970 年代初期的 &lt;a href=&#34;https://www.aeaweb.org/articles?id=10.1257/aer.20180338&#34;&gt;18 倍&lt;/a&gt;。今天发表的学术论文被美国专利引用的可能性不到 30 年前发表的论文的&lt;a href=&#34;https://mattsclancy.substack.com/p/science-is-getting-harder&#34;&gt;一半&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;这些不断缩减的回报正处于历史高位之中。&lt;/p&gt;
&lt;p&gt;美国每年授予超过 50,000 个科学和工程博士学位；这个数字在 1960 年还不到 10,000。联邦对科学的资助也（基本上）处于历史最高水平。科学论文的总数呈指数级增长，但每篇论文的平均作者人数在过去一百年里大约翻了两番。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-2.jpeg&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;From &#34;The Science of Science&#34; by &lt;a href=&#34;https://www.dashunwang.com/book/the-science-of-science&#34;&gt;Wang and Barabási&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;出于某种原因，这些都是生物学进步的不完美指标。但是有很多零散的证据表明，科学正在变得越来越不划算，即使感觉进步从未像现在这样快。我相信——基于轶事证据，真的——如果以每年获得诺贝尔奖的发现为基准，生物技术不会停滞不前。只是诺贝尔奖每年都会颁发一次，而且不乏令人惊叹的论文在排队等待获得最高奖项。所以，当然，并不是每个有价值的人都会赢。&lt;/p&gt;
&lt;p&gt;哦，如果你拿我之前提到的物理学调查结果，对医学和化学做同样的实验，结果就会颠倒过来——20 世纪下半叶发现的相对重要性超过了上半叶。&lt;/p&gt;
&lt;p&gt;不管停滞与否，生物学都存在巨大的低效率。它可以——应该！- 移动得更快。&lt;/p&gt;
&lt;p&gt;许多论文需要一年多的时间才能发表，在期刊官僚的严密监视下，被搁置在数字化的边缘。漫长的等待可能也不值得——同行评审通常是无用的，而且很多糟糕的科学无论如何都能通过。许多伟大的想法也从来没有发表在论文上，因为，好吧，他们从来没有得到资助。NIH 拨款审查非常不一致。如果您向 43 位不同的审稿人提供 25 份拨款建议，他们的评定者间可靠性（衡量分数一致性的指标）基本上为零，即使拨款已经获得资金和先前评审小组的高分！给予相同审稿人的无资金资助与有资金资助的资助得分一样。&lt;/p&gt;
&lt;p&gt;那么生物学文献呢？那也是一团糟。山姆·罗德里克斯 (&lt;a href=&#34;https://www.sam-rodriques.com/post/why-is-progress-in-biology-so-slow&#34;&gt;Sam Rodriques&lt;/a&gt;) 在最近的一篇文章中写道，科学论文“因委托而变得不可靠”，并且“因遗漏而变得不可靠”。换句话说，一些研究（一小部分）只是编造的。教授或学生为了发表论文而捏造数字，如果有人说他们在胡说八道，编辑可能要过&lt;a href=&#34;https://newscience.substack.com/p/laws-of-science&#34;&gt;好几年&lt;/a&gt;才会撤稿。&lt;/p&gt;
&lt;p&gt;不过，更大的问题可能是疏忽。科学期刊喜欢发表积极的结果，所以大多数消极的发现永远不会出现在光鲜的期刊上。如果有人进行的实验表明药物 A 与受体 B 结合，他们会发表它——但忽略提及药物 A 不会通过 Z 与受体 C 结合。无效结果很少传给科学家，他们中的许多人已经几个月来一次又一次尝试实验的痛苦经历，后来才发现 1970 年代的一篇不起眼的论文使他们所有的努力都变得毫无意义。&lt;/p&gt;
&lt;p&gt;我告诉你这些悲伤的事情——停滞不前的科学和可怕的低效率的故事——是为了说明一个观点：&lt;strong&gt;生物学在去年取得了如此大的进步，真是令人惊讶&lt;/strong&gt;。生物学的进步证明了人类渴望探索、失败，然后继续前进的愿望。这份时事通讯庆祝人类的成就，并重点介绍了过去 12 个月&lt;strong&gt;生物学领域的十大进步&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;此列表中的所有内容均来自 Codon 的上一期，因此希望您能在评论中指出我的错误和遗漏。我的入选标准很简单：该列表仅包括 2022 年期间发布到 bioRxiv 或发表在期刊上的论文。我不包括公司成就——这实际上可能是它自己的列表——除非他们发布了数据。(入选)列表中的一些项目包括了多篇论文，因为整个子领域发展得非常快。&lt;/p&gt;
&lt;p&gt;汇总“十佳排名”最大的危险是完全主观的，有很多优秀的东西没有入选，而且很多其他作家已经做到了(虽然我还没有看到专门针对生物学的清单)。诺亚·史密斯 (Noah Smith) 发布了他 2023 年的技术乐观主义清单 (&lt;a href=&#34;https://noahpinion.substack.com/p/techno-optimism-for-2023&#34;&gt;techno-optimism list&lt;/a&gt;)，其中包括对生物技术的简要提及，而《大西洋月刊》(The Atlantic) 发表了他们的 &amp;ldquo;年度突破 (&lt;a href=&#34;https://www.theatlantic.com/newsletters/archive/2022/12/technology-medicine-law-ai-10-breakthroughs-2022/672390/&#34;&gt;breakthroughs of the year&lt;/a&gt;)&amp;rdquo;，然后立即将该文章设置为付费文章。&lt;/p&gt;
&lt;p&gt;然而，有必要专门为生物学列出一份完整的榜单，因为很多伟大的事情在人工智能的阴影下被忽略了。人类基因组计划（始于 1990 年）终于在&lt;a href=&#34;https://www.science.org/toc/science/376/6588&#34;&gt;今年完成了&lt;/a&gt;，一个庞大的科学家团队填补了最后 8% 的序列空白。科学家们还使用 mirror-image DNA 聚合酶制作了镜像 DNA (&lt;a href=&#34;https://www.nature.com/articles/s41587-022-01337-8&#34;&gt;mirror-image DNA&lt;/a&gt;)，并发现了一类新的 CRISPR 蛋白质，它们可以&lt;a href=&#34;https://cell.substack.com/p/crispr-can-cut-proteins-too-index&#34;&gt;剪切蛋白质&lt;/a&gt;而不是基因。机器学习正在蛋白质工程中掀起波澜，例如有一种基于算法被设计出来的酶，这种酶可以比自然界中发现的任何酶更快地&lt;a href=&#34;https://cell.substack.com/p/ai-designed-enzyme-eats-plastic&#34;&gt;分解 PET 塑料&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;我不确定今年的进展是否与生物进展是否整体停滞不前有关。但有一件事是不变的：生物学变得越来越奇怪，而我会一直关注它。&lt;/p&gt;
&lt;h3 id=&#34;10-走向合成细胞&#34;&gt;10. 走向合成细胞&lt;a class=&#34;headerlink&#34; href=&#34;#10-走向合成细胞&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;从纯化学成分构建合成细胞是生物学的圣杯。如果实现了这一壮举，将证明我们已足够详细地理解生命运作的大体轮廓，并有足够的细节可以在实验室中重现它。这也将成为定制细胞的起点，这些细胞可以检测有毒污染或制造药物，同时又不会成为生物安全风险或存在感染风险。&lt;/p&gt;
&lt;p&gt;今年有几篇论文推动了合成细胞的发展，但其中有两篇让人印象深刻。第一篇是在 bioRxiv 上发表的预印本，据称是&lt;strong&gt;首次证明核糖体&lt;/strong&gt;（大分子蛋白质，负责合成其他蛋白质）&lt;strong&gt;可以在活细胞之外制造&lt;/strong&gt;。这是在合成细胞内从头生产蛋白质的重要起点。&lt;/p&gt;
&lt;p&gt;我们还在合成细胞分裂方面取得了重要进展。一项研究报告说，仅使用五种蛋白质就可以在脂肪泡中制造合成分裂环！当这些蛋白质聚集在一起时，它们会收缩并向气泡施加力（下面的 GIF）。    &lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-3.webp&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;合成分裂环在气泡内形成的延时摄影&lt;/em&gt;
&lt;/p&gt;

&lt;h3 id=&#34;9-更好的碱基编辑器&#34;&gt;9. 更好的碱基编辑器&lt;a class=&#34;headerlink&#34; href=&#34;#9-更好的碱基编辑器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;早在 2016 年，《自然》杂志的一篇论文就报道了第一个碱基编辑蛋白，它可以将 DNA 中的 &amp;ldquo;C&amp;rdquo; 替换为 &amp;ldquo;T&amp;rdquo;，而无需将基因组一分为二。它的重要性立即显而易见——许多严重的遗传疾病是由 DNA 中的单个碱基交换引起的，现在这些突变可以被修复。&lt;/p&gt;
&lt;p&gt;碱基编辑器已经成熟。这些基因编辑蛋白在发明后仅仅五年就以创纪录的速度进入临床试验，目前 Verve、Beam 和其他公司正在进行针对镰状细胞病、高胆固醇和 Stargardt 病的&lt;a href=&#34;https://www.nature.com/articles/d41573-022-00124-z&#34;&gt;试验&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;然而，碱基编辑的主要挑战之一是编辑线粒体基因组很棘手，&lt;a href=&#34;https://www.chop.edu/conditions-diseases/mitochondrial-dna-common-mutation-syndromes&#34;&gt;许多遗传疾病&lt;/a&gt;都源于此。早在 2020 年，&lt;a href=&#34;https://www.nature.com/articles/s41586-020-2477-4&#34;&gt;一篇论文&lt;/a&gt;就表明碱基编辑器可以成功进入线粒体并使 &amp;ldquo;C&amp;rdquo; 变为 &amp;ldquo;T&amp;rdquo;，但其前景并不乐观。今年 5 月，&lt;a href=&#34;https://www.nature.com/articles/s41586-022-04836-5&#34;&gt;一篇后续论文&lt;/a&gt;称，实际上，这些线粒体基因编辑器诱发了 &amp;ldquo;大量&amp;rdquo; 脱靶突变，这意味着它们编辑的位置比预期的要多，弊大于利。&lt;/p&gt;
&lt;p&gt;但创新不会因失败而受阻。仅今年一年就至少发表了&lt;strong&gt;三篇论文&lt;/strong&gt;，使线粒体碱基编辑器变得&lt;a href=&#34;https://www.nature.com/articles/s41467-022-34784-7&#34;&gt;更小&lt;/a&gt;或&lt;a href=&#34;https://doi.org/10.1016/j.cell.2022.03.039&#34;&gt;更准确&lt;/a&gt;。让碱基编辑酶进入线粒体或编辑其 DNA 从未如此简单。我相信我们很快就会看到一些针对线粒体相关疾病的临床试验。&lt;/p&gt;
&lt;h3 id=&#34;8-噬菌体传播病毒&#34;&gt;8. 噬菌体传播病毒&lt;a class=&#34;headerlink&#34; href=&#34;#8-噬菌体传播病毒&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今年对噬菌体来说是个好年头。这真的很合适，因为它也是 Felix d&amp;rsquo;Herelle 著名实验 &lt;strong&gt;100 周年纪念日&lt;/strong&gt;。1922 年，这位巴黎微生物学家证明噬菌体（感染细菌的小病毒）&lt;a href=&#34;https://jamanetwork.com/journals/jamapediatrics/article-abstract/1173780&#34;&gt;可以根除&lt;/a&gt;兔子和小动物体内的 &amp;ldquo;痢疾杆菌和其他杆菌&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;我们现在正经历着临床疗法的准复兴时期，噬菌体经常被用来消除抗生素无效的感染（尤其是在欧洲医院）。几周前，一个欧洲科学家团队使用实验性噬菌体疗法&lt;a href=&#34;https://www.nature.com/articles/s41467-022-33294-w&#34;&gt;挽救了一名幼儿的生命&lt;/a&gt;。器官移植后，这个小男孩感染了抗生素无法清除的耐药性感染。在用定制的噬菌体鸡尾酒 (a custom-made phage cocktail) 治疗两年多后，孩子在家中恢复了健康。&lt;/p&gt;
&lt;p&gt;5 月，丹佛的一个团队使用噬菌体治疗一名患有严重囊性纤维化的男孩的脓肿分枝杆菌感染。噬菌体将感染控制了一年多，直到获得供体肺。我相信我们会在 2023 年看到定制噬菌体疗法进入临床。    &lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-4.png&#34; alt&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h3 id=&#34;7-血友病基因疗法&#34;&gt;7. 血友病基因疗法&lt;a class=&#34;headerlink&#34; href=&#34;#7-血友病基因疗法&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.fda.gov/vaccines-blood-biologics/vaccines/hemgenix&#34;&gt;Hemgenix&lt;/a&gt; 是一种治疗 B 型血友病的基因疗法，几个月前获得了 FDA 的批准。它的价格达到了 350 万美元，使其成为有史以来最昂贵的药物（这并不好）。根据 III 期临床试验数据，它在患者的是安全有效期&lt;a href=&#34;https://hemophilianewstoday.com/news/hemgenix-gene-therapy-benefits-sustained-2-years-phase-3-hope-b/&#34;&gt;至少两年&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;血友病 A 的基因治疗进展缓慢，该病由一种名为 VIII 的不同凝血蛋白突变引起。5 月的一项研究表明，针对肝脏的基因疗法在非人类灵长类动物中效果很好，可以导致 &amp;ldquo;总凝血因子 VIII 输出增加 10 倍以上&amp;rdquo;。3 月份发表的一项有 134 名参与者参与的 I/II 期临床试验表明，使用腺相关病毒进行的基因疗法，也用于肝脏，可减少血友病患者的出血事件。但是，它带来了很多副作用；每个试验参与者至少有一次不良事件。尽管如此，血友病仍是基因治疗的 &amp;ldquo;低悬&amp;rdquo; 目标之一，这些试验是其他正在进行中的目标的有用酸性测试。&lt;/p&gt;
&lt;h3 id=&#34;6-合成胚胎&#34;&gt;6. 合成胚胎&lt;a class=&#34;headerlink&#34; href=&#34;#6-合成胚胎&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今年，从老鼠身上采集的干细胞被用来制造 &amp;ldquo;类胚胎结构&amp;rdquo;，其中包含工作的肠道、跳动的心脏和头脑的雏形，而不需要精子或卵子。&lt;/p&gt;
&lt;p&gt;以色列的 Jacob Hanna 团队发表了一篇最初的论文，于 8 月&lt;a href=&#34;https://doi.org/10.1016/j.cell.2022.07.028&#34;&gt;在 Cell 上发表&lt;/a&gt;。据《卫报》报道，这些作者后来成立了一家名为 Renewal Bio 的&lt;a href=&#34;https://www.theguardian.com/science/2022/aug/03/scientists-create-worlds-first-synthetic-embryos&#34;&gt;公司&lt;/a&gt;，&amp;rdquo;旨在培养人类合成胚胎，为医疗条件提供组织和细胞&amp;rdquo;。剑桥大学和加州理工学院的一个团队也在 8 月 2 日发布了一份&lt;a href=&#34;https://doi.org/10.1101/2022.08.01.502371&#34;&gt;预印本&lt;/a&gt;，表明这些 &amp;ldquo;合成胚胎&amp;rdquo;准确地概括了 &amp;ldquo;从胚胎第 5.5 天到第 8.5 天的发育事件，包括原肠胚形成、前后轴的形成、大脑，跳动的心脏结构，以及胚胎外组织（包括卵黄囊和绒毛膜）的发育。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;合成胚胎——正确形成的概率只有 0.5% 左右——有几个潜在的用途。例如，这些结构可以用于研究器官在发育过程中的形成，也可用于在不使用真实胚胎的情况下测试药物。    &lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-5.png&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;Embryoids after six days. From Kasey Lau et al. on bioRxiv. &lt;a href=&#34;https://www.biorxiv.org/content/10.1101/2022.08.01.502371v1.full.pdf&#34;&gt;Link&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;h3 id=&#34;5-细胞重编程&#34;&gt;5. 细胞重编程&lt;a class=&#34;headerlink&#34; href=&#34;#5-细胞重编程&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今年的一大亮点：首次证明仅靠化学物质就能将人体细胞&lt;a href=&#34;https://www.nature.com/articles/s41586-022-04593-5&#34;&gt;重新编程为干细胞&lt;/a&gt;。这一突破需要十多年的时间，并需使用 11 种不同的化学物质，以及一到两个月的工作时间，所以仍需要一些微调。早在 2013 年，同一个小组就已使用这种方法实现了&lt;a href=&#34;https://www.science.org/doi/10.1126/science.1239278&#34;&gt;小鼠细胞&lt;/a&gt;的转化，但人类细胞的转化过程要困难得多。&lt;/p&gt;
&lt;p&gt;这也不是第一项重新编程人类细胞的研究。这一荣誉属于山中伸弥 (Shinya Yamanaka)，他在 2006 年通过表达四种蛋白质（现在著名的 &amp;ldquo;Yamanaka 因子&amp;rdquo;）对 iPS 细胞进行了重编程。在随后的几十年中，其他研究小组使用病毒或 mRNA 对细胞进行重编程。但这种仅使用化学物质的方法脱颖而出，因为它在体外使用简单，而且化学混合物可以通过静脉注射输送到体内——不需要基因编辑。该方法提供了一种相对简单的工具来生成可用于再生医学的人类多能干细胞。&lt;/p&gt;
&lt;h3 id=&#34;4-植物更容易设计&#34;&gt;4. 植物更容易设计&lt;a class=&#34;headerlink&#34; href=&#34;#4-植物更容易设计&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;我们生活在人类世，这是人类历史上一个可怕的时刻，&lt;strong&gt;人造材料的重量超过地球上所有的生物量&lt;/strong&gt;，而且重量每年都在继续增加一倍。    &lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-6.webp&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;&#34;Global human-made mass exceeds all living biomass,&#34; by Elhacham E et al. in Nature. &lt;a href=&#34;https://www.nature.com/articles/s41586-020-3010-5&#34;&gt;Link&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;在我们现有的生物质中，据估计有 83% 由植物持有。如果我们想要走出这场行星垃圾场的困境，那么，那么我们可能不得不对植物进行工程改造：让它们捕获更多的碳，&lt;a href=&#34;https://cell.substack.com/p/hacking-photosynthesis&#34;&gt;增强它们的光合作用&lt;/a&gt;，种植生产更多的食物，等等！&lt;/p&gt;
&lt;p&gt;幸运的是，做到这一点从未如此简单。几十年来，合成生物学家已经对细菌和哺乳动物细胞进行了改造，使其具有越来越复杂的遗传回路，即使植物在很大程度上被忽视了。今年，两项重要进展改变了平衡。&lt;/p&gt;
&lt;p&gt;先是基因编辑技术，如 CRISPR，现在已经过优化，可以在植物中更好地发挥作用。例如，Prime 编辑器是可以插入、删除或交换 DNA 的 &amp;ldquo;搜索和替换&amp;rdquo; 基因编辑器。与其他 Prime 编辑器相比，新的 Plant Prime Editor 在植物细胞中的效率提高了 &lt;a href=&#34;https://www.nature.com/articles/s41587-022-01254-w&#34;&gt;3.4 倍&lt;/a&gt;，并被用于在实验室中迅速使水稻植物对除草剂产生耐受性。&lt;/p&gt;
&lt;p&gt;但更大的进步是：斯坦福大学的一个团队发布了&lt;a href=&#34;https://www.science.org/doi/10.1126/science.abo4326&#34;&gt;一个完整的基因工具包&lt;/a&gt;，可以像我们对细菌进行编程一样对植物进行 &amp;ldquo;编程&amp;rdquo;。新工具包包括大量合成启动子和转录因子，可用于控制植物中的基因表达。这些遗传部分被用于构建能够在本塞姆氏烟草和拟南芥中进行布尔逻辑运算的基因回路。作者还建立了逻辑门，可以控制植物根部的基因表达水平，从而控制它们的侧向密度。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-7.jpeg&#34; alt&gt;&lt;br&gt;
    &lt;em&gt;A genetic circuit controls how many lateral roots shoot out from a plant’s roots. Lateral density increases from left to right, with a wildtype plant shown on the far right. From &lt;a href=&#34;https://www.biorxiv.org/content/10.1101/2022.02.02.478917v1&#34;&gt;Brophy et al. on bioRxiv&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;

&lt;h3 id=&#34;3-走向负碳&#34;&gt;3. 走向负碳&lt;a class=&#34;headerlink&#34; href=&#34;#3-走向负碳&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;生物学的一个众所周知的困难部分是难以扩展（进行大规模的研究）。在试管中改造一个能将糖转化为抗癌药物的细胞是一回事，但在一个千升生物反应器中做同样的事却是完全不同的挑战。&lt;/p&gt;
&lt;p&gt;这就是像 &lt;a href=&#34;https://lanzatech.com/&#34;&gt;LanzaTech&lt;/a&gt; 这样的公司令人兴奋的原因。他们实际上已经在工业工厂扩大了生物学规模。他们有试点设施，将工厂的废碳回收成燃料和化学品。这些工厂每年可以生产数千亿加仑的燃料，并且已经达到相当于每年减少数千辆汽车上路的排放量。&lt;/p&gt;
&lt;p&gt;几个月前，来自 LanzaTech 和西北大学的科学家们达到了&lt;a href=&#34;https://www.nature.com/articles/s41587-021-01195-w&#34;&gt;另一个里程碑&lt;/a&gt;：使用一种名为 Clostridium autoethanogenum 的工程自养生物，他们在具有负碳足迹的过程中以工业规模生产丙酮和异丙醇。 &amp;ldquo;与导致温室气体释放的传统生产过程不同，我们的过程可以固定碳，&amp;rdquo; 他们在发表的论文中写道。这是大规模生物学向前迈出的一大步。经过改造的微生物可以在不拖累大气的情况下改善污染物并产生化学物质。&lt;/p&gt;
&lt;h3 id=&#34;2-异种移植成为现实&#34;&gt;2. 异种移植成为现实&lt;a class=&#34;headerlink&#34; href=&#34;#2-异种移植成为现实&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这将作为 &amp;ldquo;异种移植年&amp;rdquo; 载入人类史册。异种移植的历史可以追溯到 20 世纪 60 年代中期——法国外科医生勒内·库斯 (Renè Kuss) 将猪肾移植到人体中，结果很快被患者的身体排斥——异种移植一直是一个失败的领域。最著名的例子可能是 80 年代 Stephanie Beauclair 或 Baby Fae 的手术，她从狒狒那里接受了一颗心脏，但不久后就去世了。&lt;/p&gt;
&lt;p&gt;不过，在过去四十年里，我们在从猪身上提取心脏并将其植入人体方面做得更好，因为基因编辑技术正在改进。现在比以往任何时候都更容易在猪的细胞中找到所有导致我们的身体排斥该器官的有害蛋白质，并从基因组中&lt;a href=&#34;https://www.science.org/doi/10.1126/science.aad1191&#34;&gt;系统地消除&lt;/a&gt;这些蛋白质编码基因。但进步从来都不是没有陷阱的。&lt;/p&gt;
&lt;p&gt;今年 1 月 7 日，马里兰大学的一组外科医生将&lt;a href=&#34;https://www.technologyreview.com/2022/01/11/1043374/gene-edited-pigs-heart-transplant/&#34;&gt;一颗猪的心脏移植&lt;/a&gt;到 57 岁的老大卫贝内特体内，&lt;a href=&#34;https://www.technologyreview.com/2022/05/04/1051725/xenotransplant-patient-died-received-heart-infected-with-pig-virus/&#34;&gt;两个月后&lt;/a&gt;他去世了。&lt;/p&gt;
&lt;p&gt;5 月，两只猪的肾脏被移植到脑死亡患者体内，并进行了 54 小时的监测，这让沮丧过后变得乐观起来。两个肾脏都产生了尿液，活组织检查没有显示出任何器官排斥的迹象。&lt;/p&gt;
&lt;p&gt;心脏移植可能因为器官感染了猪病毒而失败，但肾移植研究的作者没有检测到这种病毒。猪肾可能很快就会进入人们的生活。&lt;/p&gt;
&lt;h3 id=&#34;1-我们离终结疟疾从未如此近&#34;&gt;1. 我们离终结疟疾从未如此近&lt;a class=&#34;headerlink&#34; href=&#34;#1-我们离终结疟疾从未如此近&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果您相信约翰·惠特菲尔德 (John Whitfield) 2002 年在《&lt;a href=&#34;https://www.nature.com/articles/news021001-6&#34;&gt;自然&lt;/a&gt;》杂志发表的这篇文章（该说法未被引用），&amp;rdquo;疟疾已经杀死了所有曾经生活过的人的一半&amp;rdquo;。即使该说法是错误的，在整个人类历史上，蚊子也已经集体杀死了数十亿人。昆虫混蛋干掉了亚历山大大帝、哥特人阿拉里克和但丁。而且，在 2021 年，疟疾仍导致约 620,000 人死亡。这是令人震惊、悲伤和可以预防的。但今年是取得惊人进步的一年。&lt;/p&gt;
&lt;p&gt;一种称为 R21/Matrix-M 的疟疾疫苗在四个非洲国家进行了 III 期试验。它在幼儿中的总体疗效为 &lt;a href=&#34;https://www.medpagetoday.com/meetingcoverage/astmh/101561&#34;&gt;75%&lt;/a&gt;。这是个好消息。在马里进行的一项 II 期试验还测试了一种名为 CIS43LS 的抗体，用于对抗健康成人中的恶性疟原虫感染。在六个月的时间里，单次注射的疗效为 &lt;a href=&#34;https://www.nejm.org/doi/full/10.1056/NEJMoa2206966&#34;&gt;88.2%&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;不过，唯一能有效预防疟疾 90% 以上的免疫原是子孢子，这是一种在蚊子生命周期中形成的类孢子部分。这些子孢子被注射到手臂中并&lt;a href=&#34;https://www.science.org/doi/10.1126/scitranslmed.abj3776&#34;&gt;用作疫苗&lt;/a&gt;，但显然很难从真正的蚊子身上收集到这些东西。&lt;/p&gt;
&lt;p&gt;本月早些时候，研究人员在实验室中创造了 &amp;ldquo;&lt;a href=&#34;https://www.nature.com/articles/s41586-022-05466-7&#34;&gt;数亿&lt;/a&gt;&amp;rdquo; 子孢子，而不需要蚊子。他们基本上重新创建了整个&amp;rdquo;疟原虫从传染性配子体到传染性配子体的全部生命周期，而不需要蚊子。&amp;rdquo; 这项新技术将有助于更快、更便宜地研制出抗疟疾疫苗。&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/2022-Biology-Breakthroughs-8.webp&#34; alt&gt;&lt;br&gt;
&lt;/p&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;32&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-32/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-32/</guid>
      
    </item>
    
    <item>
      <title>公众号许久没有更新了</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;大家可能会发现自从 2023 年下半年以来，&lt;strong&gt;&amp;ldquo;BioIT 爱好者&amp;rdquo;&lt;/strong&gt; 公众号的更新频率越来越低了。&lt;/p&gt;
&lt;p&gt;这里面除了个人私人时间越来越少以外，还有一个原因就是个人把写文章从语雀转移到了 &lt;a href=&#34;https://github.com/shenweiyan/&#34;&gt;GitHub&lt;/a&gt; 的 Issues 和 Discussions 上。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;虽然在很长一段时间以来，个人一直都在使用 &lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;语雀&lt;/a&gt; 来记录个人工作、生活的各种知识，但直到今年的下半年在考虑数据多平台使用+备份+搜索的一些使用场景时才发现语雀无法批量导出的一些弊端，更重要的一个原因是正如在 &amp;ldquo;&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/issues/34&#34;&gt;博客与写作的一些思考&lt;/a&gt;&amp;rdquo; 里面所提到的 &lt;strong&gt;&amp;ldquo;博客其实就是写给自己看的&amp;rdquo;&lt;/strong&gt;，&lt;strong&gt;&amp;ldquo;大部分人写所谓 &amp;lsquo;博客&amp;rsquo; 到最后都把时间花在装潢 CSS HTML 主题上了&amp;rdquo;&lt;/strong&gt;！几经考虑以后，选择了 &lt;a href=&#34;https://github.com/shenweiyan/&#34;&gt;GitHub&lt;/a&gt; 的 Issues 和 Discussions，对于其中的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全免费，不需要租用域名和服务器；&lt;/li&gt;
&lt;li&gt;不需要过多折腾，对不懂技术的人来说非常友好；&lt;/li&gt;
&lt;li&gt;Issues/Discussions 自带评论功能，不需要后期为博客安装评论插件；&lt;/li&gt;
&lt;li&gt;GitHub 有网页版和手机 App，只要有网，我们可以随时随地发布文章，而不仅仅局限于电脑；&lt;/li&gt;
&lt;li&gt;发布到 GitHub 的内容，在 Google 的搜索结果中有非常高的权重；&lt;/li&gt;
&lt;li&gt;回归 CommonMark 的编辑，方便各种支持 Markdown 平台间的备份迁移；&lt;/li&gt;
&lt;li&gt;借助 GitHub REST/GraphQL API 可以很方便实现 Issues/Discussions 的导入导出；&lt;/li&gt;
&lt;li&gt;借助 GitHub Pages 和 GitHub Actions，可以轻松把 Issues/Discussions 转化成静态博客&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;借助一些开源的工具，个人目前大部分文章都已经从语 &lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;语雀&lt;/a&gt; 同步到了 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden&#34;&gt;shenweiyan/Knowledge-Garden&lt;/a&gt;，并后续会继续在 GitHub 进行更新，由于&lt;a href=&#34;https://www.yuque.com/shenweiyan/articles/qw325a&#34;&gt;公众号的各种限制和封闭性&lt;/a&gt;，如精力和时间允许后续会同步至公众号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Knowledge-Garden Repo image&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/github-knowledge-garden.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Knowledge-Garden Discussions image&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/knowledge-garden-discussions.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;28&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-28/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-28/</guid>
      
    </item>
    
    <item>
      <title>富文本编辑器与 md 语法的一些困惑</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在语雀写文档写得多的，会对原始的 Markdown 越来越不敏感。&lt;/p&gt;
&lt;p&gt;语雀的富文本编辑器虽然支持的依然是 markdown，但也有它自身的一些与传统 markdown 不一样的写法，例如 &lt;a href=&#34;https://www.yuque.com/yuque/gpvawt/rhhxkx&#34;&gt;高亮块&lt;/a&gt;。这样的编辑器把 markdown 的源码给隐藏了——在用户编辑的时候实时进行渲染，这样对于不熟悉 markdown 的用户也极容易上手。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;但带来了一个问题，就是使用 markdown 对文档进行导出的时候，有时候会导致 markdown 格式错乱，尤其是当我们想要把语雀的一些文档导出到其他平台时候，这个问题特别烦人。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Markdown 语法异常&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/md-error.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回到 GitHub，重新接触纯 Markdown 格式的写法，才真正感觉到这种模式的好处 —— 方便其他支持 Markdown 语法平台的转移，又可以最大限度解决 Markdown 语法错乱的尴尬。&lt;/p&gt;
&lt;p&gt;但也有不好的地方，就是对于多级有序缩进，插入代码后，有序序列(多级缩进)会被打断。。。。&lt;/p&gt;
&lt;h2 id=&#34;嵌套列表&#34;&gt;嵌套列表&lt;a class=&#34;headerlink&#34; href=&#34;#嵌套列表&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;通过增加空格，Github 可以实现在嵌套列表中插入代码块；但是这样的做法在 MkDocs 中是有问题的。关于 MkDocs 的嵌套列表，在 https://github.com/mkdocs/mkdocs/issues/545 有一个讨论。&lt;/p&gt;
&lt;p&gt;参考的一个方法：&lt;a href=&#34;https://github.com/mkdocs/mkdocs/issues/2153&#34;&gt;https://github.com/mkdocs/mkdocs/issues/2153&lt;/a&gt;，即使用 &lt;a href=&#34;https://facelessuser.github.io/pymdown-extensions/extensions/superfences/&#34;&gt;superfences&lt;/a&gt; 插件，加上基于 Python 特有的 4 的倍数个空格进行缩进，可以比较好解决这个问题。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;26&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-26/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-26/</guid>
      
    </item>
    
    <item>
      <title>那些年，和微信公众号编辑器战斗的日子</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;看到 HelloGitHub 公众号在 2019-09-25 发表的这篇文章《&lt;a href=&#34;https://mp.weixin.qq.com/s/3-A_iSZYD88Cy467qOnNOw&#34;&gt;和微信公众号编辑器战斗的日子&lt;/a&gt;》，结合自己最近折腾的 React 版本应用 &lt;a href=&#34;https://github.com/shenweiyan/Markdown2Html&#34;&gt;Markdown2Html&lt;/a&gt;，也想着来聊几句。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;md2all&#34;&gt;Md2All&lt;a class=&#34;headerlink&#34; href=&#34;#md2all&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在使用 Mdnice 前，一直在用 &lt;a href=&#34;https://md.aclickall.com&#34;&gt;Md2All&lt;/a&gt; 的自搭建版本 &lt;a href=&#34;https://github.com/shenweiyan/Md2XEditor&#34;&gt;Md2XEditor&lt;/a&gt;，这是一个源自 &lt;a href=&#34;https://github.com/barretlee&#34;&gt;barretlee&lt;/a&gt; 最早在 2017 年的 &lt;a href=&#34;https://github.com/barretlee/online-markdown&#34;&gt;online-markdown&lt;/a&gt; 项目，经过二次开发而来的 Markdown 在线转换工具。&lt;/p&gt;
&lt;p&gt;个人在 2021 年的时候，浏览 GitHub 无意中发现了 &lt;a href=&#34;https://md.aclickall.com&#34;&gt;Md2All&lt;/a&gt; 托管在 GitHub 的源码仓库 &lt;a href=&#34;https://github.com/aclickall/aclickall.github.io&amp;gt;&#34;&gt;github.com/aclickall/aclickall.github.io&lt;/a&gt;，Fork 过来，利用自己微薄的前端知识做了一点点修改，才形成了一直使用到今天的 &lt;a href=&#34;https://github.com/shenweiyan/Md2XEditor&#34;&gt;Md2XEditor&lt;/a&gt;。  &lt;br /&gt;
&lt;img alt=&#34;Md2XEditor v-2.8.5&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/md2xeditor-v2.8.5.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;虽然说，Md2All 已经把 Markdown2Html 或者说把 Markdown2WeChat 的大部分功能实现了，但由于它目前能找到的源码都是 &lt;strong&gt;经过 build 构建后可以在生产环境中使用的最终版本的代码&lt;/strong&gt;（诸如压缩和优化代码、打包文件、生成静态文件等），功能调整实在太费劲，而且自己对 Node/React 的开发基本是零基础。在没有找到好的替代品前，也只能将就着用，一直用到了 2023 年。&lt;/p&gt;
&lt;h2 id=&#34;markdown-nice&#34;&gt;markdown-nice&lt;a class=&#34;headerlink&#34; href=&#34;#markdown-nice&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mdnice/markdown-nice/&#34;&gt;Mdnice&lt;/a&gt; 的项目虽然很早就听说，也曾经试用过一段时间，但是由于收费，加上同样存在 &lt;strong&gt;超链接文字复制到公众号颜色失效&lt;/strong&gt; 的问题，所以一直没有深入了解和使用。直到 2023 年下半年看到不少在关注的公众号推文都变换了风格，才知道原来都在用着 Mdnice，于是重新回来一看，发现这个应用原来还是&lt;strong&gt;开源的&lt;/strong&gt;，还可以&lt;strong&gt;自己搭建和部署&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;回来搜了一波 Mdnice，发现 UI 都大同小异，但也发现了 &lt;a href=&#34;https://wechat.bmpi.dev/&#34;&gt;https://wechat.bmpi.dev/&lt;/a&gt; 这一个长得很像 Mdnice 又不完全像的平台，从功能和 UI 上它似乎更符合个人的需求和审美，于是去搜源码，果然在 &lt;a href=&#34;https://github.com/TaleAi/markdown2html&#34;&gt;github.com/TaleAi/markdown2html&lt;/a&gt; 上找到了（虽然这个仓库里面包括 README 在内提供的链接已经失效），但还是果断 Fork 过来，开始了自己部署和折腾之旅。   &lt;br /&gt;
&lt;img alt=&#34;wechat-bmpi-dev&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/wechat-bmpi-dev.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;一点折腾&#34;&gt;一点折腾&lt;a class=&#34;headerlink&#34; href=&#34;#一点折腾&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;把自己的 Markdown2Html 站点部署起来后，一切看起来都很顺利，但在使用过程中就发现了这个一直存在的问题：&lt;strong&gt;超链接文字复制到公众号颜色失效&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;于是开始去尝试看看 Mdnice 的源码，从最开始的一头雾水开始到慢慢摸到一点点头绪，也第一次知道了 &lt;a href=&#34;https://github.com/markdown-it/markdown-it&#34;&gt;markdown-it&lt;/a&gt; 这个目前使用最广泛的 markdown 解析器工具。但功夫不负有心人，借助 ChatGPT 的帮助，最后终于勉勉强强把 &lt;strong&gt;超链接文字复制到公众号颜色失效&lt;/strong&gt; 给解决了。&lt;/p&gt;
&lt;p&gt;后面还陆陆续续增加了一些自己喜欢的文章主题，增加了一些网格化的背景等等。由于 Mdnice 使用了非常多的开源插件，所以很多东西改动起来都非常方便。 
&lt;img alt=&#34;markdown2weixin&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/markdown2wechat.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;继续更新&#34;&gt;继续更新&lt;a class=&#34;headerlink&#34; href=&#34;#继续更新&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;个人 (包括本公众号) 很多的文章都是先写在 GitHub &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden&#34;&gt;Knowledge-Garden&lt;/a&gt; 仓库的 &lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions&#34;&gt;Discussions&lt;/a&gt; 上，有了 Markdown2Html 后面想要转到公众号也就很方便了。&lt;/p&gt;
&lt;p&gt;到这里，轮子也总算造完了，又该好好搬砖了。&lt;/p&gt;
&lt;p&gt;希望后面能有更多的东西跟大家分享吧，也希望大家在 GitHub 上多多关注我，一起交流。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://lq782655835.github.io/blogs/project/markdown-it-code.html&#34;&gt;Markdown-It 解析原理&lt;/a&gt; - &lt;a href=&#34;https://lq782655835.github.io/blogs/&#34;&gt;springleo&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;31&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-31/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-31/</guid>
      
    </item>
    
    <item>
      <title>单行 Python 代码片段</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Via：https://muhammadraza.me/2023/python-oneliners&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我已经沉浸在 Python 编程世界大约三年了。在这段时间里，我开始欣赏这种多功能语言的优雅和强大。在这篇既有趣又具有教育意义的文章中，我将展示一系列单行 Python 代码片段。无论您是经验丰富的开发人员还是初学者，这些简洁的代码行都可以让您深入了解 Python 的简单性和有效性，它们展示一行代码如何完成在其他语言中可能需要几行代码才能完成的任务。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;反转字符串
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;reversed_string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;Hello World&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[::&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检查数字是否为偶数
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;is_even&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;is_even&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;#True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;求两个列表的交集
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;intersection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从列表中删除重复项
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;no_duplicates&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;my_list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不使用 &lt;code&gt;len()&lt;/code&gt; 计算字符串的长度
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;Hello World&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检查一个列表是否包含另一个列表的所有元素
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;contains_all&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;elem&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;elem&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成一串随机字符
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;span class=&#34;n&#34;&gt;random_str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;abcdefghijklmnopqrstuvwxyz&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将整数列表转换为单个数字
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回文(Palindromic)检查
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;is_palindrome&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[::&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;列表展开
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;flatten_list&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在一个列表中找到出现频率最高的元素
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;most_frequent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;my_list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;my_list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合并两个字典
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;merged_dict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dict1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dict2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，我希望您喜欢阅读本文并有机会学习新东西。如果您有任何反馈，请随时在下面发表评论。如果您不想公开发表评论，可以随时给我发送电子邮件。我也很想看到你最喜欢的 python one liner 代码片段。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;30&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-30/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-30/</guid>
      
    </item>
    
    <item>
      <title>Python3 编译安装 --with-openssl 无效的问题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;很多人在使用 Python3 经常会遇到一些 openssl 版本太低从而导致包无法正常使用的问题，尤其是 &lt;code&gt;urllib3&lt;/code&gt; 这个包。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.9.18&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Sep&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2023&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GCC&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;4.8.5&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20150623&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Red&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Hat&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;4.8.5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;linux&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Type&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;help&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;copyright&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;credits&#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;license&#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;more&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;information&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Traceback&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;most&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;recent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;last&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;&amp;lt;stdin&amp;gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/usr/local/software/python-3.9.18/lib/python3.9/site-packages/requests/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;43&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;urllib3&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/usr/local/software/python-3.9.18/lib/python3.9/site-packages/urllib3/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;only&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;supports&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenSSL&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.1.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;currently&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;ssl&#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;compiled&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;OpenSSL 1.0.2k-fips  26 Jan 2017&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;See&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2168&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;ssl&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;urllib3&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Traceback&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;most&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;recent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;last&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;&amp;lt;stdin&amp;gt;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;/usr/local/software/python-3.9.18/lib/python3.9/site-packages/urllib3/__init__.py&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;only&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;supports&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenSSL&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.1.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;currently&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;ssl&#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;compiled&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;OpenSSL 1.0.2k-fips  26 Jan 2017&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;See&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urllib3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2168&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;网络上有很多关于这方面的教程，主要解决方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;降级 &lt;code&gt;urllib3&lt;/code&gt; 的版本，例如：&lt;code&gt;pip install --upgrade urllib3==1.26.15&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;重新安装一个更高版本的 OpenSSL，然后备份并替换系统原来的 openssl，最后重新编译安装 Python。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;个人觉得这两个方法都不够好，尤其是第二个方法 —— &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新装了一个更高版本的 OpenSSL，但是又不想替换系统原来的 openssl 以免出现新的问题（或者没有管理员权限）；&lt;/li&gt;
&lt;li&gt;在编译的时候使用 &lt;code&gt;--with-openssl&lt;/code&gt; 指定了新装的 OpenSSL 路径，编译安装完成后 Python &lt;strong&gt;仍然使用旧版本的 OpenSSL&lt;/strong&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很不幸的是，个人在 CentOS 7.3 + Python-3.9.18 就遇到了这个问题。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;新装了 OpenSSL 3.0.10 
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget https://www.openssl.org/source/openssl-3.0.10.tar.gz --no-check-certificate
tar zvxf openssl-3.0.10.tar.gz
cd openssl-3.0.10
./config --prefix=/usr/local/software/openssl-3.0.10 shared zlib
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加 &lt;code&gt;~/.bashrc&lt;/code&gt; 环境变量
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export PATH=/usr/local/software/openssl-3.0.10/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/software/openssl-3.0.10/lib64:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新编译安装 Python-3.9.18
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure --prefix=/usr/local/software/python-3.9.18 --with-openssl=/usr/local/software/openssl-3.0.10/
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;等编译完成后，你会神奇的发现重新编译安装后 Python 3.9.18 &lt;strong&gt;仍然使用旧版本的 OpenSSL (OpenSSL 1.0.2k-fips  26 Jan 2017)&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;其实，这还是因为 Python 在重新编译的时候没有识别到新编译的 OpenSSL，因此，我们需要把重新编译的命令调整一下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/configure --prefix=/usr/local/software/python-3.9.18 \
--with-openssl=/usr/local/software/openssl-3.0.10/ \
LDFLAGS=&#34;-L/usr/local/software/openssl-3.0.10/lib64&#34; \
CPPFLAGS=&#34;-I/usr/local/software/openssl-3.0.10/include&#34; \
PKG_CONFIG_PATH=&#34;/usr/local/software/openssl-3.0.10/lib64/pkgconfig&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;这样子一来，问题就迎刃而解了，编译安装完后，你会发现 Python 3.9.18 已经成功用用上了 OpenSSL 3.0.10 1 Aug 2023：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ python3 -c &#34;import ssl; print(ssl.OPENSSL_VERSION)&#34;
OpenSSL 3.0.10 1 Aug 2023
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;OpenSSL 3.0.10 on Python3.9.18&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/Gitbook/2023/python-3.9.18-openssl-3.0.10.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/urllib3/urllib3/issues/2168&#34;&gt;Drop support for OpenSSL&amp;lt;1.1.1 - urllib3/urllib3#2168&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;27&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-27/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-27/</guid>
      
    </item>
    
    <item>
      <title>不同版本服务器间 SSH 免密码登录失败</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;今天从服务器 A（CentOS 7.3）配置 SSH 无密码登录服务器 B（CentOS Steam 9），发现执行以下常规操作后无法实现：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh-keygen
$ ssh-copy-id -i ~/.ssh/id_rsa.pub shenweiyan@66.xx.xx.xx  # ssh-copy-id user@rhel-9-server-IP
$ ssh shenweiyan@66.xx.xx.xx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;ssh-keygen-need-passwd&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/ssh-keygen-passwd.png&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;后来，更换 ecdsa 算法，问题才解决：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh-keygen -t ecdsa
$ ssh-copy-id -i ~/.ssh/id_ecdsa.pub shenweiyan@66.xx.xx.xx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;ssh-keygen-ecdsa&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/ssh-keygen-ecdsa.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;根本原因就在于 SHA-1 已经在 RHEL9 中弃用了！&lt;/p&gt;
&lt;p&gt;从 RHEL9 的官网文档《&lt;a href=&#34;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/considerations_in_adopting_rhel_9/index#ref_considerations-security-crypto_changes-to-security&#34;&gt;1.0.2. Crypto-policies, RHEL core cryptographic components, and protocols&lt;/a&gt;（加密策略、RHEL 核心加密组件和协议）》可以看到 SHA-1 已经在 RHEL9 中弃用了！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In RHEL 9, SHA-1 usage for signatures is restricted in the DEFAULT system-wide cryptographic policy. Except for HMAC, SHA-1 is no longer allowed in TLS, DTLS, SSH, IKEv2, DNSSEC, and Kerberos protocols. Individual applications not controlled by the RHEL system-wide crypto policies are also moving away from using SHA-1 hashes in RHEL 9.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 RHEL 9 中，用于签名的 SHA-1 用法在 DEFAULT 系统范围的加密策略中受到限制。除 HMAC 外，TLS、DTLS、&lt;strong&gt;SSH&lt;/strong&gt;、IKEv2、DNSSEC 和 Kerberos 协议中不再允许使用 SHA-1。不受 RHEL 系统范围的加密策略控制的单个应用程序在 RHEL 9 中也不再使用 SHA-1 hashes。&lt;/p&gt;
&lt;h2 id=&#34;跨用户免密码登录&#34;&gt;跨用户免密码登录&lt;a class=&#34;headerlink&#34; href=&#34;#跨用户免密码登录&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从服务器 A（CentOS 7.3）的 root 用户已配置 SSH 无密码登录服务器 B（CentOS Steam 9）的 shenweiyan 用户。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在服务器 A（CentOS 7.3）的 root 用户下执行以下命令，在 &lt;code&gt;/root/.ssh&lt;/code&gt; 目录会得到两个文件：&lt;/li&gt;
&lt;li&gt;私钥文件：&lt;strong&gt;id_ecdsa&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;公钥文件：&lt;strong&gt;id_ecdsa.pub&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@centos-vm-7 11:47:20 ~ 
$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
ad:15:01:5c:a9:db:69:64:2b:0c:4c:5f:be:f9:e1:44 root@centos-vm-7
The key&#39;s randomart image is:
+--[ECDSA  256]---+
|       ..oo.     |
|      . . o.     |
|     o . +.      |
|      o o.+.E    |
|       oS=o*     |
|        +oB o    |
|        .o + .   |
|            o    |
|                 |
+-----------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把服务器 A 下 root 用户的公钥文件拷贝到服务器 B（CentOS Steam 9）的 shenweiyan 用户的 authorized_keys 中；
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@centos-vm-7 11:53:25 ~
$ ssh-copy-id -i ~/.ssh/id_ecdsa.pub shenweiyan@66.xx.xx.xx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将公钥拷贝至目标服务器 B 后，在源服务器 A 通过密钥跨用户免密码登录云服务器。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@centos-vm-7 11:58:47 /root 
$ ssh shenweiyan@66.xx.xx.xx  # ssh -i id_ecdsa shenweiyan@66.xx.xx.xx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/rhel-9-no-hostkey-alg&#34;&gt;RHEL6 ssh 到 RHEL9 的 no hostkey alg 错误&lt;/a&gt;，语雀&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://serverfault.com/questions/1095898/how-can-i-use-a-legacy-ssh-rsa-key-on-centos-9-stream&#34;&gt;How can I use a legacy ssh-rsa key on CentOS 9 Stream?&lt;/a&gt;，Server Fault&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;25&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-25/</link>
      <pubDate>Thu, 30 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-25/</guid>
      
    </item>
    
    <item>
      <title>Micro/Mamba 安装与注意事项</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;记录一下 Micromamba/Mamba 安装的步骤和注意事项。&lt;/p&gt;
&lt;h2 id=&#34;mamba-安装&#34;&gt;Mamba 安装&lt;a class=&#34;headerlink&#34; href=&#34;#mamba-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mamba 可以使用 Mambaforge 方法和已有 Mini/conda 的方式安装，官方推荐的是前面一种，即使用 Mambaforge 进行全新安装。&lt;/p&gt;
&lt;h3 id=&#34;全新安装&#34;&gt;全新安装&lt;a class=&#34;headerlink&#34; href=&#34;#全新安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;关于 mamba 的安装，官方推荐 &lt;a href=&#34;https://mamba.readthedocs.io/en/latest/mamba-installation.html&#34;&gt;Fresh install&lt;/a&gt;，即全新安装。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We recommend that you start with the &lt;a href=&#34;https://github.com/conda-forge/miniforge#mambaforge&#34;&gt;Mambaforge distribution&lt;/a&gt;. Mambaforge comes with the popular conda-forge channel preconfigured, but you can modify the configuration to use any channel you like. Note that Anaconda channels are generally incompatible with conda-forge, so you should not mix them.      &lt;br /&gt;
我们建议您从 Mambaforge 发行版开始。 Mambaforge 预配置了流行的 conda-forge 通道，但您可以修改配置以使用您喜欢的任何通道。请注意，Anaconda 通道通常与 conda-forge 不兼容，因此您不应混合使用它们。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;p&gt;其实就是：        &lt;br /&gt;
1. 先去 &lt;a href=&#34;https://github.com/conda-forge/miniforge#mambaforge&#34;&gt;Mambaforge distribution&lt;/a&gt; 下载 Mambaforge-Linux-x86_64.sh。        &lt;br /&gt;
2. 执行 &lt;code&gt;sh Mambaforge-Linux-x86_64.sh&lt;/code&gt; 安装命令。&lt;/p&gt;
&lt;h3 id=&#34;在已有的-conda-中安装&#34;&gt;在已有的 conda 中安装&lt;a class=&#34;headerlink&#34; href=&#34;#在已有的-conda-中安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;官方文档中明确说不推荐这种安装 Mamba 的方式，他们强烈建议使用 Mambaforge 方法（见上文）。&lt;/p&gt;
&lt;p&gt;这种方法，要获取 &lt;code&gt;mamba&lt;/code&gt; ，其实只需将其从 &lt;code&gt;conda-forge&lt;/code&gt; 通道安装到基础环境中即可；但是需要注意 &lt;strong&gt;Installing mamba into any other environment than base is not supported&lt;/strong&gt;，即&lt;strong&gt;不支持将 mamba 安装到 base 之外的任何其他环境中&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;首先，安装 Miniconda。&lt;/p&gt;
&lt;p&gt;参考 &lt;a href=&#34;https://docs.conda.io/en/latest/miniconda.html&#34;&gt;https://docs.conda.io/en/latest/miniconda.html&lt;/a&gt;，下载完 Miniconda3-latest-Linux-x86_64.sh，sh 执行一下就可以安装了。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sh Miniconda3-latest-Linux-x86_64.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
然后，安装 mamba。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;~/miniconda3/bin/conda install -c conda-forge mamba
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For both &lt;code&gt;mamba&lt;/code&gt; and &lt;code&gt;conda&lt;/code&gt;, the &lt;code&gt;base&lt;/code&gt; environment is meant to hold their dependencies. It is strongly discouraged to install anything else in the base envionment. Doing so may break &lt;code&gt;mamba&lt;/code&gt; and &lt;code&gt;conda&lt;/code&gt; installation.    &lt;br /&gt;
对于 &lt;code&gt;mamba&lt;/code&gt; 和 &lt;code&gt;conda&lt;/code&gt; ， &lt;code&gt;base&lt;/code&gt; 环境旨在保存它们的依赖关系。强烈建议不要在基础环境中安装任何其他东西。这样做可能会破坏 &lt;code&gt;mamba&lt;/code&gt; 和 &lt;code&gt;conda&lt;/code&gt; 安装。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;micromamba-安装&#34;&gt;Micromamba 安装&lt;a class=&#34;headerlink&#34; href=&#34;#micromamba-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考 &lt;a href=&#34;https://mamba.readthedocs.io/en/latest/micromamba-installation.html&#34;&gt;https://mamba.readthedocs.io/en/latest/micromamba-installation.html&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;micromamba&lt;/code&gt; is a fully statically-linked, self-contained, executable. This means that the &lt;code&gt;base&lt;/code&gt; environment is completely empty. The configuration for &lt;code&gt;micromamba&lt;/code&gt; is slighly different, namely all environments and cache will be created by default under the &lt;code&gt;MAMBA_ROOT_PREFIX&lt;/code&gt; environment variable. There is also no pre-configured &lt;code&gt;.condarc&lt;/code&gt;/&lt;code&gt;.mambarc&lt;/code&gt; shipped with micromamba (they are however still read if present).                       &lt;br /&gt;
&lt;code&gt;micromamba&lt;/code&gt; 是一个完全静态链接的、独立的可执行文件。这意味着 &lt;code&gt;base&lt;/code&gt; 环境完全是空的。&lt;code&gt;micromamba&lt;/code&gt; 的配置略有不同，即默认情况下将在 &lt;code&gt;MAMBA_ROOT_PREFIX&lt;/code&gt; 环境变量下创建所有环境和缓存。&lt;code&gt;micromamba&lt;/code&gt; 也没有预配置的 &lt;code&gt;.condarc&lt;/code&gt; / &lt;code&gt;.mambarc&lt;/code&gt;（但是，如果存在，它们仍然会被读取）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;脚本安装&#34;&gt;脚本安装&lt;a class=&#34;headerlink&#34; href=&#34;#脚本安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果您使用的是 macOS、Linux 或 Windows 上的 Git Bash，则有一种简单的安装方法 &lt;code&gt;micromamba&lt;/code&gt;。只需在您喜欢的 shell 中执行安装脚本即可。&lt;/p&gt;
&lt;p&gt;对于 Linux、macOS 或 Windows 上的 Git Bash，请使用以下命令安装：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&#34;${SHELL}&#34; &amp;lt;(curl -L micro.mamba.pm/install.sh)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;自动更新&#34;&gt;自动更新&lt;a class=&#34;headerlink&#34; href=&#34;#自动更新&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;安装后，&lt;code&gt;micromamba&lt;/code&gt; 可以通过下面的方式更新：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;micromamba self-update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
可以指定显式版本：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;micromamba self-update --version 1.4.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;手动更新&#34;&gt;手动更新&lt;a class=&#34;headerlink&#34; href=&#34;#手动更新&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;linux-和-macos&#34;&gt;Linux 和 macOS&lt;a class=&#34;headerlink&#34; href=&#34;#linux-和-macos&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;下载并解压可执行文件（来自官方 &lt;code&gt;conda-forge&lt;/code&gt; 包）即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其实，这就等同于我们直接去 &lt;a href=&#34;https://github.com/mamba-org/micromamba-releases/releases&#34;&gt;https://github.com/mamba-org/micromamba-releases/releases&lt;/a&gt; 下载对应平台的二进制文件，或者 &lt;code&gt;tar.bz2&lt;/code&gt; 文件，然后解压缩，把 &lt;code&gt;bin/micromamba&lt;/code&gt; 部分提出来使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;确保安装了基本实用程序。我们需要 &lt;code&gt;curl&lt;/code&gt; 和 &lt;code&gt;tar&lt;/code&gt; 并支持 &lt;code&gt;bzip2&lt;/code&gt; 。此外，您还需要一个基于 glibc 的系统，例如 Ubuntu、Fedora 或 Centos（Alpine Linux 本身无法运行）。&lt;/p&gt;
&lt;p&gt;以下 magic URL 始终返回 micromamba 的最新可用版本，并且使用 &lt;code&gt;tar&lt;/code&gt; 自动提取 &lt;code&gt;bin/micromamba&lt;/code&gt; 部分。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Linux Intel (x86_64):
curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba
# Linux ARM64:
curl -Ls https://micro.mamba.pm/api/micromamba/linux-aarch64/latest | tar -xvj bin/micromamba
# Linux Power:
curl -Ls https://micro.mamba.pm/api/micromamba/linux-ppc64le/latest | tar -xvj bin/micromamba
# macOS Intel (x86_64):
curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba
# macOS Silicon/M1 (ARM64):
curl -Ls https://micro.mamba.pm/api/micromamba/osx-arm64/latest | tar -xvj bin/micromamba
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
提取完成后，我们就可以使用 &lt;code&gt;micromamba&lt;/code&gt; 二进制文件了。&lt;/p&gt;
&lt;p&gt;如果您想在临时用例中快速使用 micromamba，您可以运行：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export MAMBA_ROOT_PREFIX=/some/prefix  # optional, defaults to ~/micromamba
eval &#34;$(./bin/micromamba shell hook -s posix)&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
这个 shell hook 会修改您的 shell 变量以包含 micromamba 命令。&lt;/p&gt;
&lt;p&gt;如果您想保留这些更改，可以通过运行 &lt;code&gt;./micromamba shell init ...&lt;/code&gt; 自动将它们写入 &lt;code&gt;.bashrc&lt;/code&gt; （或 &lt;code&gt;.zshrc&lt;/code&gt; ）。这还允许您选择自定义 MAMBA_ROOT_ENVIRONMENT，这是包和 repodata 缓存所在的位置。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Linux/bash:
./bin/micromamba shell init -s bash -p ~/micromamba  # this writes to your .bashrc file
# sourcing the bashrc file incorporates the changes into the running session.
# better yet, restart your terminal!
source ~/.bashrc

# macOS/zsh:
./micromamba shell init -s zsh -p ~/micromamba
source ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;现在您可以激活基本环境并安装新软件包，或创建其他环境。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;micromamba activate  # this activates the base environment
micromamba install python=3.6 jupyter -c conda-forge
# or
micromamba create -n env_name xtensor -c conda-forge
micromamba activate env_name
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;专有的 &lt;a href=&#34;https://conda-forge.org/&#34;&gt;conda-forge&lt;/a&gt; 设置可以配置为：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;micromamba config append channels conda-forge
micromamba config append channels nodefaults
micromamba config set channel_priority strict
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;24&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-24/</link>
      <pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-24/</guid>
      
    </item>
    
    <item>
      <title>2023 年 Galaxy 社区大会会议报告</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;作者：Natalie Whitaker  &lt;br /&gt;
编译：&lt;a href=&#34;https://weiyan.cc&#34;&gt;沈维燕&lt;/a&gt;  &lt;br /&gt;
时间：2023-08-14  &lt;br /&gt;
原文：&lt;a href=&#34;https://galaxyproject.org/blog/2023-08-14-gc-c2023-meeting-report/&#34;&gt;2023 Galaxy Community Conference Meeting Report&lt;/a&gt;    &lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;gcc-2023-会议纪要&#34;&gt;GCC 2023 会议纪要&lt;a class=&#34;headerlink&#34; href=&#34;#gcc-2023-会议纪要&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;概述&#34;&gt;概述&lt;a class=&#34;headerlink&#34; href=&#34;#概述&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2023 年 Galaxy 社区会议（GCC2023）于7月10日至16日在澳大利亚昆士兰州布里斯班昆士兰科技大学举行。GCC 是 Galaxy 社区的年度会议，这是一个旨在在科学和技术层面展示过去一年内在 Galaxy 研究领域做出的令人惊叹的新工作，同时为与会者提供发现合作机会、加强联系、并开辟新的研究方向的大会。 GCC2023 由 Galaxy Australia 和 Australian BioCommons 主办，为期四天，包括了演讲、研讨会/培训、海报和演示等活动，还有三位主题演讲嘉宾和三天的协作节 (CoFest)。除了会议内容，整个 Galaxy 社区会议周还会举办网络交流和社交活动。总体而言，GCC2023 包括了 12.8 小时的长短演讲、37.5 小时的培训、3.3 小时的海报展示和演示，以及 10.6 小时的社交活动和交流。
&lt;img alt=&#34;GCC2023 Meeting Report Image1&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;GCC2023 共有 91 名现场参会者和 40 名虚拟参会者。来自 21 个不同国家的与会者出席了本次会议：澳大利亚、比利时、巴西、加拿大、捷克、丹麦、法国、德国、印度、爱尔兰、马耳他、摩洛哥、荷兰、新西兰、挪威、新加坡、韩国、斯里兰卡、瑞士、英国和美国（图1）。在总参会人数中，22.4% 是研究助理或技术人员，17.6% 是高级科学家或首席调查员，9.6% 是研究生，7.2% 是博士后，2.4% 是本科生，40% 是其他身份。&lt;/p&gt;
&lt;div align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image2.png&#34; alt=&#34;GCC2023 Meeting Report Image2&#34;&gt;
    &lt;em&gt;Figure 1. Map of GCC2023 attendees’ countries of origin.&lt;/em&gt;
&lt;/div&gt;

&lt;h2 id=&#34;奖学金获得者&#34;&gt;奖学金获得者&lt;a class=&#34;headerlink&#34; href=&#34;#奖学金获得者&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GCC2023 非常感谢能够利用一位匿名捐赠者的资金提供现场和虚拟参会的奖学金。作为奖学金的一部分，受奖者被要求通过演讲、海报或二者兼有的方式参与会议。&lt;/p&gt;
&lt;p&gt;今年，一个现场奖学金授予了英国开放大学的一年级博士生 Marisa Loach（Twitter: @Marisa_Loach）。Marisa 进行了一次题为 “为什么使用 Galaxy？用户友好的生物信息学选项的初步结果” 的演讲并展示了一份海报。
&lt;img alt=&#34;GCC2023 Meeting Report Image3&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image3.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;GCC2023共颁发了六个虚拟奖学金。以下列出了每位受奖者及其角色、机构和对会议的贡献。&lt;/p&gt;
&lt;h3 id=&#34;coline-royaux&#34;&gt;Coline Royaux&lt;a class=&#34;headerlink&#34; href=&#34;#coline-royaux&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Twitter: @ColineRoyaux&lt;/p&gt;
&lt;p&gt;研究生 (Graduate student)&lt;/p&gt;
&lt;p&gt;巴黎索邦大学，法国自然历史博物馆，法国 (Sorbonne University, French Natural History Museum, France)&lt;/p&gt;
&lt;p&gt;演讲标题 “Galaxy-E：基于生态学的 Galaxy 倡议，2022-2023 年更新！” &lt;/p&gt;
&lt;h3 id=&#34;vajiha-hussain&#34;&gt;Vajiha Hussain&lt;a class=&#34;headerlink&#34; href=&#34;#vajiha-hussain&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;高年级本科生 (Senior undergraduate student)&lt;/p&gt;
&lt;p&gt;印度维尼昂大学 (Vignan University, India)&lt;/p&gt;
&lt;p&gt;海报标题 “利用 RNASeq 分析识别棕榈蓟马中潜在的 GBNV 生物标志物”&lt;/p&gt;
&lt;h3 id=&#34;sudeepti-kulshrestha&#34;&gt;Sudeepti Kulshrestha&lt;a class=&#34;headerlink&#34; href=&#34;#sudeepti-kulshrestha&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;研究生 (Graduate student)&lt;/p&gt;
&lt;p&gt;印度阿米蒂大学 (Amity University, India)&lt;/p&gt;
&lt;p&gt;海报标题为“使用基于网络的方法探索 Vaginal Microbiome 和先兆子痫的关联”&lt;/p&gt;
&lt;h3 id=&#34;jonas-bucher&#34;&gt;Jonas Bucher&lt;a class=&#34;headerlink&#34; href=&#34;#jonas-bucher&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;研究生 (Graduate student)&lt;/p&gt;
&lt;p&gt;瑞士苏黎世联邦理工学院，苏黎世大学，瑞士 (Swiss Federal Institute of Technology in Zurich (ETH Zurich), University of Zurich, Switzerland)&lt;/p&gt;
&lt;p&gt;海报标题 “Methylator - DNA cytosine methylation pipeline”&lt;/p&gt;
&lt;h3 id=&#34;katarzyna-kamieniecka&#34;&gt;Katarzyna Kamieniecka&lt;a class=&#34;headerlink&#34; href=&#34;#katarzyna-kamieniecka&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Twitter: @katemurat&lt;/p&gt;
&lt;p&gt;研究生 (Graduate student)&lt;/p&gt;
&lt;p&gt;英国布拉德福德大学 (University of Bradford, United Kingdom)&lt;/p&gt;
&lt;p&gt;海报标题 &amp;ldquo;Galaxy 中的 FAIR 数据管理&amp;rdquo;&lt;/p&gt;
&lt;h4 id=&#34;taoufik-bensellak&#34;&gt;Taoufik Bensellak&lt;a class=&#34;headerlink&#34; href=&#34;#taoufik-bensellak&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;研究生 (Graduate student)&lt;/p&gt;
&lt;p&gt;英国利物浦大学 (University of Liverpool, United Kingdom)&lt;/p&gt;
&lt;p&gt;海报标题 “用于微阵列数据分析的 Galaxy 实例和工具”&lt;/p&gt;
&lt;h2 id=&#34;主讲嘉宾&#34;&gt;主讲嘉宾&lt;a class=&#34;headerlink&#34; href=&#34;#主讲嘉宾&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GCC2023 邀请了三位主题演讲嘉宾，分别就野生动物保护、结构生物学和生物安全等领域分享了他们的思考和研究成果。演讲者展示了他们团队如何通过使用 Galaxy 平台，以更易获取和可复现的方式完成工作。&lt;/p&gt;
&lt;p&gt;三位主题发言人分别发表了内容丰富的演讲，讨论了各自前瞻性研究领域的进展，重点关注开放存取端到端生物信息学 (open-access end-to-end bioinformatics)。Galaxy 在每位主题发言人的最新研究进展中都发挥了重要作用，Galaxy 开发人员和 Galaxy 社区能够亲眼目睹 Galaxy 对科学界的影响。此外，每位主题发言人都为 Galaxy 的未来提供了灵感，并有时间与平台发展轨迹背后的开发人员直接交流。&lt;/p&gt;
&lt;h3 id=&#34;carolyn-hogg-phd-university-of-sydney悉尼大学&#34;&gt;Carolyn Hogg, PhD (University of Sydney，悉尼大学)&lt;a class=&#34;headerlink&#34; href=&#34;#carolyn-hogg-phd-university-of-sydney悉尼大学&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;来自悉尼大学的 Carolyn Hogg 博士作为第一位主讲人拉开了 GCC2023 的序幕。霍格博士在 &amp;ldquo;拯救塔斯马尼亚袋獾计划 (Save the Tasmanian Devil Program)&amp;rdquo; 进行的研究中发挥了重要作用，此外还重点研究了其他澳大利亚物种，如橙腹鹦鹉、考拉、兔耳袋狸和袋鼠。她在 GCC2023 上的演讲题为 “走向无限和超越：结合基因组学和云技术来拯救我们的物种”，强调了自然资源保护主义者和基因组科学家之间合作研究的必要性。她的愿景是通过改变科学、管理和政策的整合方式，为澳大利亚创造保护遗产，而 Galaxy 的使用增强了她的这一愿景。通过使用像 Galaxy 这样的开源平台，Hogg 博士能够产生可重复的基因组科学，以帮助澳大利亚的物种保护和管理实践。
&lt;img alt=&#34;GCC2023 Meeting Report Image4&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image4.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;kate-michie-phd-university-of-new-south-wales新南威尔士大学&#34;&gt;Kate Michie, PhD (University of New South Wales，新南威尔士大学)&lt;a class=&#34;headerlink&#34; href=&#34;#kate-michie-phd-university-of-new-south-wales新南威尔士大学&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;来自新南威尔士大学的 Kate Michie 博士作为 GCC2023 的第二位主讲人发表了题为 “Alphafold2 和深度学习时代：结构生物学的最新进展” 的演讲。 Michie 博士在蛋白质结构生物学方面拥有二十多年的经验，并广泛使用 Alphafold2，并与众多研究人员密切合作，教他们如何使用这一强大的工具来推进他们的研究。在她的主题演讲中，Michie 博士呼吁关注 Galaxy 为结构生物学研究进展做好准备的迫切需要，这些进展肯定会伴随 Alphafold2 的巨大成功。 Michie 博士的演讲对 GCC2023 来说是一个有影响力的补充，因为 Galaxy 致力于保持竞争力并领先于社区的巨大研究需求。
&lt;img alt=&#34;GCC2023 Meeting Report Image5&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image5.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;roberto-barrero-phd-queensland-university-of-technology昆士兰科技大学&#34;&gt;Roberto Barrero, PhD (Queensland University of Technology，昆士兰科技大学)&lt;a class=&#34;headerlink&#34; href=&#34;#roberto-barrero-phd-queensland-university-of-technology昆士兰科技大学&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GCC2023 的最后一位主讲人是来自昆士兰科技大学的 Roberto Barrero 博士。巴雷罗博士的演讲题为 “通过更快、更准确地诊断植物病毒和类病毒，改善植物行业获得新遗传学的机会”，重点讨论利用生物信息学解决农业、植物生物安全和人类健康方面的现实问题。最近，Barrero 博士在开发植物诊断工具包方面发挥了重要作用，该工具包可以在一次测试中准确检测一系列病毒和类病毒，并于 2018 年向他和他的团队授予生物安全影响奖。Barrero 博士的研究进展得到了 Galaxy 的支持通过 GA-VirReport 和高通量测序技术。访问开放式端到端生物信息学工作流程对于诊断植物病毒和类病毒至关重要，Galaxy 很高兴能在 GCC2023 上将这一主题置于前沿。
&lt;img alt=&#34;GCC2023 Meeting Report Image6&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image6.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;培训课程&#34;&gt;培训课程&lt;a class=&#34;headerlink&#34; href=&#34;#培训课程&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image7&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image7.png&#34; /&gt;
培训是 Galaxy 社区的首要任务。让研究人员能够轻松学习使用该平台、如何进行新的分析或探索能够解决研究人员面临的实际需求的功能和工具，对于 Galaxy 的发展和可持续发展发挥了重要作用。本着这种精神，在 GCC2023 的三天里，共举办了 15 场不同的培训课程，供与会者与专家一起学习和实践生物信息学。专家包括主要研究员、Galaxy 开发人员、项目经理和 Galaxy 高级用户。培训课程主题多种多样，为 GCC2023 的所有与会者提供相关且实用的学习机会。从微生物学和人类遗传学到工作流程和工具开发，GCC2023 培训课程提供了扩大与会者特定研究兴趣和遇到新主题的机会。&lt;/p&gt;
&lt;p&gt;每节课将近三个小时，让学员有时间充分沉浸在教材中，与培训师和其他学员交流，并与来自不同背景的人交流经验和方法。&lt;/p&gt;
&lt;h2 id=&#34;birds-of-a-feather-bof&#34;&gt;Birds of a Feather (BoF)&lt;a class=&#34;headerlink&#34; href=&#34;#birds-of-a-feather-bof&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Birds of a Feather (BoF) 会议是 GCC 期间的非正式聚会，参与者可以讨论感兴趣的话题。 BoF 每天在会议结束时举行，各小组分成焦点小组，与专家和其他与会者进行交流和讨论。&lt;/p&gt;
&lt;p&gt;GCC2023 期间，与会者有九种不同的机会参加 BoF。今年的 BoF 提出了各种主题，包括备受期待的 Galaxy 高级用户与开发人员对话的机会。此外，BoF 还提供了举办迷你社交活动的机会，例如棋盘游戏、串酒吧和澳大利亚布里斯班徒步之旅！&lt;/p&gt;
&lt;h2 id=&#34;cofest&#34;&gt;CoFest&lt;a class=&#34;headerlink&#34; href=&#34;#cofest&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GCC2023 主会之后，举办了为期三天的协作节（CoFest）。 CoFest 是 Galaxy 成员的社区聚会，这些成员有兴趣为 Galaxy 的工具集、文档、培训材料、代码库以及扩展 Galaxy 生态系统的其他任何地方做出贡献。 CoFest 的目标是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;扩大贡献者社区。这次 CoFest 的首要目的是欢迎新的贡献者，帮助您学习资源并结识能够帮助您做出贡献的人。&lt;/li&gt;
&lt;li&gt;扩大 Galaxy 生态系统。不仅仅是代码，而是整个生态系统。这包括培训、工具、最佳实践工作流程、文档、测试用例、翻译、基础设施，甚至代码。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CoFest 的参与者围绕着共同的兴趣，讨论与这些兴趣相关的共同话题。这些群组在 CoFest 开始前、开始时和整个过程中形成，旨在相互之间保持流动和高度互动。今年的 CoFest 分为九大主题：前端、后端、社区、设计、工具、工作流程、培训、测试和辅助项目。由于 CoFest 在整个活动期间都在不断变化和构建，因此主题被进一步细分，重点关注以下主题：交互式工具；升级 Vue3 和上传功能；吸引和保留社区参与活动、管理和领导力；ChatGXY；实施 Galaxy 工具健康审计服务；以及 Simon 的数据俱乐部。&lt;/p&gt;
&lt;h2 id=&#34;社会事件&#34;&gt;社会事件&lt;a class=&#34;headerlink&#34; href=&#34;#社会事件&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GCC2023 希望将 Galaxy 社区的成员联系在一起，因此在整个会议期间举办了不同的社交活动。今年的 GCC2023 社交活动包括为会议拉开序幕的欢迎晚宴、由 Galaxy 社区成员主持的布里斯班徒步游、带有街机游戏的酒馆爬行、桌游之夜、会议晚宴，以及广受好评的 Lone Pine 考拉保护区之行！&lt;/p&gt;
&lt;p&gt;毫无疑问，Lone Pine 考拉保护区是今年社交活动的亮点！一大群 GCC2023 与会者参观了世界上最大的考拉保护区，度过了一个下午，与动物邂逅、野生动物表演，并了解一些澳大利亚最受欢迎的野生动物！
&lt;img alt=&#34;GCC2023 Meeting Report Image8&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image8.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;通过这些有组织的社交活动，Galaxy 社区的成员们在建立职业关系的同时，也建立了友谊。此外，许多社区成员还通过非组织活动，包括游览植物园、参观动物园医院和热带雨林，以及一日游等，彼此建立联系。&lt;/p&gt;
&lt;p&gt;请参阅附录一，了解今年社交活动的更多照片以及遇到的所有令人惊叹的澳大利亚动物！&lt;/p&gt;
&lt;h2 id=&#34;纪念-simon-gladman&#34;&gt;纪念 Simon Gladman&lt;a class=&#34;headerlink&#34; href=&#34;#纪念-simon-gladman&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;simon-数据俱乐部&#34;&gt;Simon 数据俱乐部&lt;a class=&#34;headerlink&#34; href=&#34;#simon-数据俱乐部&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Simon Gladman 是 GCC2023 的最初发起者和组织者，如果看到他的伴侣和孩子参加这次会议，他一定会感到非常自豪。Simon 获得了多项荣誉，他作为创新者、榜样、支持者和社区联系者的遗产将继续受到表彰，“星际数据委员会 (Intergalactic Data Commission)” 更名为 “Simon 数据俱乐部 (Simon’s Data Club)”，并在他的组织中获得年度奖项。姓名。
&lt;img alt=&#34;GCC2023 Meeting Report Image9&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image9.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;simon-gladman-旅行补助金&#34;&gt;Simon Gladman 旅行补助金&lt;a class=&#34;headerlink&#34; href=&#34;#simon-gladman-旅行补助金&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;已故西蒙·格拉德曼 (Simon Gladman) 对 Galaxy 的贡献将获得以他名字命名的年度奖项。 Galaxy Australia 才华横溢的技术主管和大家的伙伴 Simon 在 GCC2023 上受到了人们的深深怀念，人们对他表示了许多敬意。&lt;/p&gt;
&lt;p&gt;Simon 对 Galaxy 充满热情并与人交流，并且很高兴能够组织在澳大利亚举办的首届国际 Galaxy 社区会议 (GCC)。在 GCC2023 上，我们宣布了首届 Simon Gladman 旅行补助金，以此来庆祝他。每年将向参加 Galaxy 社区活动的澳大利亚公民颁发 5,000 澳元的补助金。&lt;/p&gt;
&lt;p&gt;如果您与 Simon 一样充满热情并希望为 Galaxy 做出贡献，我们鼓励您申请 Simon Gladman 旅行补助金。&lt;/p&gt;
&lt;h2 id=&#34;感言&#34;&gt;感言&lt;a class=&#34;headerlink&#34; href=&#34;#感言&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Galaxy 执行董事会成员 Michael Schatz 是约翰·霍普金斯大学计算机科学和生物学的彭博杰出教授，他很高兴地看到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;The keynotes really highlighted how Galaxy enables cutting edge science.”&lt;/em&gt;
&lt;em&gt;“主题演讲真正强调了 Galaxy 如何实现尖端科学。”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;来自 BioCommons、昆士兰网络基础设施基金会 (QCIF)、昆士兰大学、墨尔本生物信息学和 AARNet 的 Galaxy Australia 团队成员发表了从监测工具健康状况到开发最近发布的 Galaxy Australia 基因组实验室等主题。澳大利亚银河服务项目负责人 Gareth Price 博士表示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“There was a fantastic exchange between our team and international colleagues and wonderful opportunities to engage with the global Galaxy community. GCC was an exhilarating experience, and it was inspiring to be surrounded by like-minded people. The team left full of energy to keep improving Galaxy Australia and strengthen their collaborations with the wider Galaxy community.”&lt;/em&gt;
&lt;em&gt;“我们的团队与国际同事之间进行了精彩的交流，并有绝佳的机会与全球 Galaxy 社区互动。 GCC 是一次令人兴奋的经历，周围都是志趣相投的人，这很鼓舞人心。该团队充满活力地继续改进 Galaxy Australia，并加强与更广泛的 Galaxy 社区的合作。”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;虽然我们是在昆士兰科技大学 (QUT) 的 The Cube 一流设施中举办的，但远程参与的能力是举办真正国际会议的关键因素。尽管 Amrita 大学系统基因组学首席科学家 Prash Suravajhala 博士是 GCC2023 组委会成员，但他无法从印度出发，但他：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Very excited and happy to be a part of GCC2023 virtually. We witnessed scintillating talks and brainstorming sessions, and the virtual attendance was a treat. This was a cherishing moment for me as I guzzled the talks from early morning India time! It has created a great camaraderie.&amp;rdquo;&lt;/em&gt;
&lt;em&gt;“能够以虚拟方式参加 GCC2023 感到非常兴奋和高兴。我们目睹了精彩的演讲和头脑风暴会议，虚拟出席是一种享受。这对我来说是一个珍贵的时刻，因为我沉迷于印度时间清晨的演讲！它创造了伟大的友情。&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;recognition&#34;&gt;Recognition&lt;a class=&#34;headerlink&#34; href=&#34;#recognition&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;特别感谢 GCC2023 的赞助商：&lt;/p&gt;
&lt;h3 id=&#34;白金赞助商&#34;&gt;白金赞助商&lt;a class=&#34;headerlink&#34; href=&#34;#白金赞助商&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;BizData (&lt;a href=&#34;https://www.bizdata.com.au/&#34;&gt;https://www.bizdata.com.au/&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;银牌赞助商&#34;&gt;银牌赞助商&lt;a class=&#34;headerlink&#34; href=&#34;#银牌赞助商&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Limagrain (&lt;a href=&#34;https://www.limagrain.com/en&#34;&gt;https://www.limagrain.com/en&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;GalaxyWorks (&lt;a href=&#34;https://galaxyworks.io/&#34;&gt;https://galaxyworks.io/&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;铜牌赞助商&#34;&gt;铜牌赞助商&lt;a class=&#34;headerlink&#34; href=&#34;#铜牌赞助商&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GIGA Science (&lt;a href=&#34;https://academic.oup.com/gigascience?login=false&#34;&gt;https://academic.oup.com/gigascience?login=false&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;非常感谢所有使 GCC2023 取得成功的个人：&lt;/p&gt;
&lt;h3 id=&#34;组织和科学委员会&#34;&gt;组织和科学委员会&lt;a class=&#34;headerlink&#34; href=&#34;#组织和科学委员会&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Andrew Lonie&lt;/p&gt;
&lt;p&gt;Christina Hall&lt;/p&gt;
&lt;p&gt;Enis Afgan&lt;/p&gt;
&lt;p&gt;Gareth Price&lt;/p&gt;
&lt;p&gt;Jenn Vessio&lt;/p&gt;
&lt;p&gt;Margita Jadan&lt;/p&gt;
&lt;p&gt;Prash Suravajhala&lt;/p&gt;
&lt;p&gt;Roberto Barrero Gumiel&lt;/p&gt;
&lt;p&gt;Ross Lazarus&lt;/p&gt;
&lt;p&gt;Assunta DeSanto&lt;/p&gt;
&lt;p&gt;Natalie Whitaker&lt;/p&gt;
&lt;p&gt;Simon Gladman&lt;/p&gt;
&lt;p&gt;Claudia Melogno de Sandoval &lt;/p&gt;
&lt;h3 id=&#34;培训协调员&#34;&gt;培训协调员&lt;a class=&#34;headerlink&#34; href=&#34;#培训协调员&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Assunta DeSanto&lt;/p&gt;
&lt;p&gt;Igor Makunin&lt;/p&gt;
&lt;p&gt;Mark Crowe&lt;/p&gt;
&lt;h3 id=&#34;在线支持&#34;&gt;在线支持&lt;a class=&#34;headerlink&#34; href=&#34;#在线支持&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Melissa Burke&lt;/p&gt;
&lt;p&gt;Patrick Capon&lt;/p&gt;
&lt;h3 id=&#34;科学计划成员&#34;&gt;科学计划成员&lt;a class=&#34;headerlink&#34; href=&#34;#科学计划成员&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Andrew Lonie&lt;/p&gt;
&lt;p&gt;Anne Claire Fouilloux&lt;/p&gt;
&lt;p&gt;Anna Syme&lt;/p&gt;
&lt;p&gt;Anshu Bhardwaj&lt;/p&gt;
&lt;p&gt;Bérénice Batut&lt;/p&gt;
&lt;p&gt;Bryan Raubenolt&lt;/p&gt;
&lt;p&gt;Cameron Hyde&lt;/p&gt;
&lt;p&gt;Catherine Bromhead&lt;/p&gt;
&lt;p&gt;Clare Sloggett&lt;/p&gt;
&lt;p&gt;Cristóbal Gallardo&lt;/p&gt;
&lt;p&gt;Dan Blankenberg&lt;/p&gt;
&lt;p&gt;Davor Davidović&lt;/p&gt;
&lt;p&gt;Enis Afgan&lt;/p&gt;
&lt;p&gt;Frederik Coppens&lt;/p&gt;
&lt;p&gt;Hans-Rudolf Hotz&lt;/p&gt;
&lt;p&gt;Ivan Jakovlić&lt;/p&gt;
&lt;p&gt;Jeremy Goecks&lt;/p&gt;
&lt;p&gt;Justin Lee&lt;/p&gt;
&lt;p&gt;Margita Jadan&lt;/p&gt;
&lt;p&gt;Maria Doyle&lt;/p&gt;
&lt;p&gt;Matthias Bernt&lt;/p&gt;
&lt;p&gt;Natalie Kucher&lt;/p&gt;
&lt;p&gt;Nicola Soranzo&lt;/p&gt;
&lt;p&gt;Nuwan Goonasekera&lt;/p&gt;
&lt;p&gt;Peter van Heusden&lt;/p&gt;
&lt;p&gt;Ralf Weber&lt;/p&gt;
&lt;p&gt;Ross Lazarus&lt;/p&gt;
&lt;p&gt;Soyean Kim&lt;/p&gt;
&lt;p&gt;Thomas Harrop&lt;/p&gt;
&lt;p&gt;Timothy Griffin&lt;/p&gt;
&lt;p&gt;Tyler Collins&lt;/p&gt;
&lt;p&gt;Wendi Bacon&lt;/p&gt;
&lt;p&gt;Yvan Le Bras&lt;/p&gt;
&lt;h3 id=&#34;联合节主办方&#34;&gt;联合节主办方&lt;a class=&#34;headerlink&#34; href=&#34;#联合节主办方&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cameron Hyde&lt;/p&gt;
&lt;h2 id=&#34;附录一&#34;&gt;&lt;em&gt;附录一&lt;/em&gt;&lt;a class=&#34;headerlink&#34; href=&#34;#附录一&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image10&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image10.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image11&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image11.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image12&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image12.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image13&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image13.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;GCC2023 Meeting Report Image14&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/GCC2023-Meeting-Report-Image14.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;21&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-21/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-21/</guid>
      
    </item>
    
    <item>
      <title>Notepad++ 在 GitHub 已经沦为战场了</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Notepad++ 这片瓜田的瓜都吃了好几年了，作者却一直还在死性不改 。。。。。&lt;/p&gt;
&lt;p&gt;同样的 Notepad++ 在 GitHub 仓库 &lt;a href=&#34;https://github.com/notepad-plus-plus/notepad-plus-plus&#34;&gt;notepad-plus-plus&lt;/a&gt; 早已沦为反华辱华的垃圾场，群魔乱舞，简直惨不忍睹！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img src=&#39;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/say-no.png&#39; alt=&#39;say-no-to-Notepad++&#39; width=600&gt;&lt;/p&gt;
&lt;h2 id=&#34;add-random-characters&#34;&gt;Add random characters&lt;a class=&#34;headerlink&#34; href=&#34;#add-random-characters&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Twitter：&lt;a href=&#34;https://twitter.com/Notepad_plus/status/1618276938342359042&#34;&gt;https://twitter.com/Notepad_plus/status/1618276938342359042&lt;/a&gt;  &lt;br /&gt;
V2EX：&lt;a href=&#34;https://www.v2ex.com/t/910777&#34;&gt;https://www.v2ex.com/t/910777&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Twitter Notepad++&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/twitter-notepad%2B%2B.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;free-uyghur&#34;&gt;Free Uyghur&lt;a class=&#34;headerlink&#34; href=&#34;#free-uyghur&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;不知道大家有没有留意，前两天（2019 年 10 月 29）开源文本编辑器 Notepad++ 发布了最新的  &lt;a href=&#34;https://notepad-plus-plus.org/downloads/v7.8.1/&#34;&gt;7.8.1&lt;/a&gt;  版本。&lt;/p&gt;
&lt;p&gt;然而，软件新版本发布后，在该版本中 Notepad++ 的作者同时附加了一篇名为《&lt;a href=&#34;https://notepad-plus-plus.org/news/v781-free-uyghur-edition/&#34;&gt;Notepad++ v7.8.1 : Free Uyghur&lt;/a&gt;》抹黑中国的文章，具体的内容请大家自行百度（图片是文章部分截图）。而且这已经不是 Notepad++ 第一次这么干了！
&lt;img alt=&#34;Notepad++ Free Uyghur&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/notepad%2B%2Bv781.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Notepad++ 的 &amp;ldquo;Free Uyghur&amp;rdquo; 出来以后，Notepad++ 所在的 Github 瞬间被广大中国的开发者占领，他们用自己的方式进行了回击。小编也忍不住上去看一下，发现  GitHub 上面基本上都是骂 Notepad++ 作者的，不过也有少数支持作者。
&lt;img alt=&#34;notepad-781-github-issue1&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/notepad-781-github-issue1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;notepad-781-github-issue2&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/notepad-781-github-issue2.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;起底一下开发者&#34;&gt;起底一下开发者&lt;a class=&#34;headerlink&#34; href=&#34;#起底一下开发者&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;后来查了一下，Notepad++ 的作者，原来名字叫做侯今吾（英语：DonHO，&lt;a href=&#34;https://github.com/donho&#34;&gt;https://github.com/donho&lt;/a&gt;），是一个毕业于台湾淡江大学及巴黎第七大学的电脑工程师，作为一个台湾人，也是一个台独积极分子，侯今吾借助 Notepad++ 抹黑中国可谓由来已久。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Notepad++ DonHO&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/notepad-donho.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;我也来说几句&#34;&gt;我也来说几句&lt;a class=&#34;headerlink&#34; href=&#34;#我也来说几句&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在这里我想说的是，Notepad++ 作为一款免费开源，深受国外编程爱好者赞扬，也为台湾开源界赢得好评，效率很高的文本编辑器，在早年间也是小编最喜欢常用的软件之一。但对于政见这件事情，小编觉得就像吃一道菜一样，你可以选择吃与不吃，不吃，你可以一笑而过，喜欢的人照常吃，与你无关，但你绝对不能吐一口脏东西上去。&lt;/p&gt;
&lt;p&gt;软件本身是没什么问题的，要说软件和作者之间的关系，那就是爱用不用的关系了。同类软件，我不喜欢你作者，当然就不用了，当然我不用也不会对软件发展有什么影响，不过我想说，这就像是去餐馆吃饭。对于顾客来说，他吃与不吃，不会影响服务员的工资。但对于服务员来说，至少不能让顾客觉得你讨厌。&lt;/p&gt;
&lt;p&gt;最后，有人说要抵制 Notepad++，但对我而言，小编是反对把开源与政治挂钩的，因此小编选择不用 Notepad++ —— 我有选择的权利，既然开源的编辑器那么多（我可以用 &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt; (虽然 &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt; 是非开源的)，可以用 &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&lt;/a&gt;，可以用 &lt;a href=&#34;https://atom.io/&#34;&gt;Github Atom&lt;/a&gt;，也可以用 &lt;a href=&#34;https://tools.stefankueng.com/BowPad.html&#34;&gt;BowPad&lt;/a&gt;、&lt;a href=&#34;http://editra.org/&#34;&gt;Editra&lt;/a&gt;，甚至是国人开发的 &lt;a href=&#34;https://gitee.com/cxasm/notepad--&#34;&gt;Notepad&amp;ndash;&lt;/a&gt;），我又何必选择一个带政治倾向自己又不喜欢的编辑器呢！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;22&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-22/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-22/</guid>
      
    </item>
    
    <item>
      <title>兆碱基中关于 Kb、KB、Bps、bps 的区别</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;生物信息很多文章都提到 DNA 序列的 100 万个碱基数据（兆碱基）大致相当于计算机 1 兆的存储空间。借着这个问题，我们今天来聊一聊计算机存储和数据传输中 Kb、KB、Bps、bps 的一些区别，分析一下所谓的兆碱基到底是使用哪一种标准（单位）怎么计算出来的。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;计算机存储容量单位&#34;&gt;计算机存储容量单位&lt;a class=&#34;headerlink&#34; href=&#34;#计算机存储容量单位&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bit (binary digit)：亦称二进制位，指二进制中的一位，是信息的最小单位。位的值只会是 0 或 1。虽然计算机也提供对位的判断和操作，但是计算机指令一般以字节（Byte）为单位。在大多数的计算机系统中，八位是一个字节。一位的值通常以存储电容是否带电来衡量。&lt;/p&gt;
&lt;p&gt;B（Byte）：字节。8 个二进制位构成 1 个 &amp;ldquo;字节（Byte）&amp;rdquo;，它是电脑存储空间的基本计量单位。1 字节（Byte）=8（bit） 位，就是有 8 个二进制数组成。1 个英文字符是 1 个字节,也就是 1B；1 个汉字为 2 个字符，也就是 2B。&lt;/p&gt;
&lt;p&gt;GB（Gigabyte）：吉字节，是一种&lt;strong&gt;十进制&lt;/strong&gt;的信息计量单位。Gibibyte（giga binary byte 的缩写）则是&lt;strong&gt;二进制&lt;/strong&gt;信息计量的一个单位，简称 GiB。吉字节（Gigabyte）常容易和二进制的信息计量单位 Gibibyte 混淆。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gibibyte 与 Gigabyte 常常被混淆，前者的计算方式是二进制，后者的计算方式是十进制。现今的计算上，常把 Gigabyte 以二进制的方式计算，即 &lt;span class=&#34;arithmatex&#34;&gt;\(2^{30} = 1,073,741,824\)&lt;/span&gt; 。(因为 Windows 对 GB 这个信息计量单位的误用，因此在 Windows 中显示的 &amp;ldquo;1GB&amp;rdquo;，其实应是指 &amp;ldquo;1GiB&amp;rdquo;，但 Windows 却显示为 &amp;ldquo;1GB&amp;rdquo;，而常造成误解。误用会普遍化的一大因素，是因为 Windows 的操作系统占有率高)，由于两种换算方法的不同，使容量在计算上相差了 7.3%，所以常有 Windows 系统报告的容量比硬盘标示的容量还要小的情况发生。但在苹果公司的 OS X 操作系统中，对于存储设备的容量计算方式与硬盘厂商一致，均为 1GB = 1,000,000,000 ( &lt;span class=&#34;arithmatex&#34;&gt;\(10^{9}\)&lt;/span&gt; ) 字节的十进制，避免了计算和使用上的麻烦。&lt;/p&gt;
&lt;p&gt;—— 维基百科 - Gibibyte，&lt;a href=&#34;https://zh.wikipedia.org/wiki/Gibibyte&#34;&gt;https://zh.wikipedia.org/wiki/Gibibyte&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;K、M、G 都是 KB、MB、GB 的简称。由于混淆已经普遍化，Gigabyte 往往是指 Gibibyte，所以平时我们说的 1 兆存储就是 1M（MB），1G 存储就是 1GB）。我们的照片一般是 104KB、209KB、1.45MB、2.45MB、3.32MB 等等。&lt;/p&gt;
&lt;p&gt;在说明其他储存单位的换算前，我们来看看两个标准：SI、IEC。&lt;/p&gt;
&lt;h3 id=&#34;国际单位制si&#34;&gt;国际单位制（SI）&lt;a class=&#34;headerlink&#34; href=&#34;#国际单位制si&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;国际单位制(简称 SI，来自于法语 Système International d&amp;rsquo;Unités)，是世界上最普遍采用的标准度量系统。国际单位制以七个基本单位(米（m），千克（kg），秒（s），安培（A），开尔文（K），摩尔（mol），坎德拉（cd）)为基础，由此建立起一系列相互换算关系明确的&amp;rdquo;一致单位&amp;rdquo;。另有二十个基于十进制的词头，当加在单位名称或符号前的时候，可用于表达该单位的倍数或分数。&lt;/p&gt;
&lt;h3 id=&#34;国际电工委员会iec&#34;&gt;国际电工委员会（IEC）&lt;a class=&#34;headerlink&#34; href=&#34;#国际电工委员会iec&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;国际电工委员会（IEC, International Electrotechnical Commission）成立于 1906 年，至今已有 90 多年的历史。它是世界上成立最早的国际性电工标准化机构，负责有关电气工程和电子工程领域中的国际标准化工作。&lt;/p&gt;
&lt;p&gt;IEC 的宗旨是，促进电气、电子工程领域中标准化及有关问题的国际合作，增进国际间的相互了解。为实现这一目的，IEC 出版包括国际标准在内的各种出版物，并希望各成员在本国条件允许的情况下，在本国的标准化工作中使用这些标准。&lt;/p&gt;
&lt;p&gt;目前 IEC 的工作领域已由单纯研究电气设备、电机的名词术语和功率等问题扩展到电子、电力、微电子及其应用、通讯、视听、机器人、信息技术、新型医疗器械和核仪表等电工技术的各个方面。IEC 标准的权威性是世界公认的，截止到 2008 年 12 月底，IEC 已制定了 5425 个国际标准。&lt;/p&gt;
&lt;p&gt;不同标准下储存单位的次方单位 ( &lt;span class=&#34;arithmatex&#34;&gt;\(2^{10}=1024\)&lt;/span&gt; )：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;字节的次方单位&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/byte-wiki.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;比特率单位&#34;&gt;比特率单位&lt;a class=&#34;headerlink&#34; href=&#34;#比特率单位&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在电信和计算领域，比特率（Bit rate）是指单位时间内传输送或处理的比特的数量。比特率经常在电信领域用作连接速度、传输速度、信息传输速率和数字带宽容量的同义词。&lt;/p&gt;
&lt;p&gt;在数字多媒体领域，比特率是单位时间播放连续的媒体如压缩后的音频或视频的比特数量。在这个意义上讲，它相当于术语数字带宽消耗量，或吞吐量。&lt;/p&gt;
&lt;p&gt;比特率规定使用&amp;rdquo;比特每秒&amp;rdquo;（bit/s 或 bps）为单位，经常和国际单位制词头关联在一起：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bps(bit/s)，即 bit pro second（位每秒）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kbps(Kbit/s)，即 Kilobit pro second(千位每秒)；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mbps(Mbit/s)，即 Milionbit pro second(百万位每秒)。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中，bit 即比特，通常用 b（小写）表示，指一位二进制位，Milionbit=1000Kilobit=1000 000bit，所以 1Mbps=1000 000bps；&lt;/p&gt;
&lt;h3 id=&#34;bps-和-bps&#34;&gt;bps 和 Bps&lt;a class=&#34;headerlink&#34; href=&#34;#bps-和-bps&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;bps 是通常用来&lt;strong&gt;衡量带宽&lt;/strong&gt;的单位，常见于表示数据机及网络通讯的传输速率，指每秒钟传输的二进制位数。例如 GigabitEthernet 端口。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;5 minute input rate 38410000 bits/sec, 6344 packets/sec
382410000 bits/sec = 382.41Mbps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;通常电脑(软件)上显示的上传下载速度（如下面的阿里云 OSSBrowser、Google Chrome 数据下载速度），则是指每秒种传输的字节数（Byte）通常用 B（大写）表示：MB 即百万字节也称兆字节；KB 即千字节；B 即字节。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1B=8b&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1MB=1024KB=1024*1024B&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1Mbps=1000Kbps=1000/8KBps=125KBps&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们通常说的 1M 带宽即指 1Mbps，因此 1M 的带宽下载的速度一般不会超过 125KB 每秒。2M、3M 带宽的下载速度分别不会超过 250KB、375KB 每秒。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;download-byte-rate&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/download-byte-rate.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据传输速率的衡量单位 K 是十进制含义，但数据存储的 K 是 2 进制含义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1kbit/s 就是 1000bit/s，而 KB 是 1024 个字节,注意 KB(KByte) 和 kbit 的区别，另外，数据传输速率的单位是 bit/s 记作：bps 。&lt;/p&gt;
&lt;p&gt;在实际应用中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1kbps=1000bps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1Mbps=1000,000bps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1bps=0.000001bps&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1Mbps 与 1m/s 是有区别的，1m/s 指的是 1024KB/s，而 1Mbps 指的是(1000/8)KB/s 也就是 125KB/S。&lt;/p&gt;
&lt;p&gt;记住 K 和 k 是没区别的  ，区别在于 bps 属于位每秒的单位，而 m/s ,KB/s 这两个属于字节每秒的单位，一字节等于 8 位，即 1k=8b。&lt;/p&gt;
&lt;h2 id=&#34;兆碱基&#34;&gt;兆碱基&lt;a class=&#34;headerlink&#34; href=&#34;#兆碱基&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;所以，在文章开头提到的 DNA 序列的 100 万个碱基数据（兆碱基）大致相当于计算机 1 兆的存储空间。其实也就是这么计算来得：&lt;/p&gt;
&lt;p&gt;一个碱基就是一个英文字母，而一个英文字母是 1 个字节（Byte），所以 100 万个碱基就是 1000,000 Byte。按照 SI 国际单位的十进制标准，正好相当于 1 MB，如果按照 IEC 国际电工委员会的二进制标准，应该为：1000,000 / 1024 /1024 ≈ 0.95 MB，则是大致相当于计算机 1 兆的存储空间。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zh.wikipedia.org/wiki/Gibibyte&#34;&gt;Wiki: Gibibyte&lt;/a&gt;，维基百科&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%AF%94%E7%89%B9%E7%8E%87&#34;&gt;Wiki：比特率&lt;/a&gt;，维基百科&lt;/li&gt;
&lt;li&gt;沙翁，《&lt;a href=&#34;https://www.cnblogs.com/shaweng/p/3816985.html&#34;&gt;什么是 Mbps、Kbps、bps、kb、mb 及其换算和区别&lt;/a&gt;》，博客园&lt;/li&gt;
&lt;li&gt;大任 Dren，《&lt;a href=&#34;https://blog.csdn.net/a9254778/article/details/8513086&#34;&gt;bit、Byte、bps、Bps、pps、Gbps 的单位详细说明及换算&lt;/a&gt;》，CSDN-专业 IT 技术社区&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;20&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-20/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-20/</guid>
      
    </item>
    
    <item>
      <title>大学计算机没有的一课</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;今天是2023年1月19日，马上要过年了，在这里先提前给大家拜年了，祝大家新年快乐，阖家幸福安康！&lt;/p&gt;
&lt;p&gt;今天来给大家推荐一个不错的开源项目。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;大学里的计算机课程往往只专注于讲授数据结构、操作系统这些知识，对于编程开发中常用的工具则留给学生自行学习。在 MIT 这个课程中，你可以了解和掌握命令行(shell)、文本编辑器(Vim)、版本控制系统(Git)等强大的工具，越早接触越能更加熟练地使用它们，有助于未来的职业生涯。
&lt;img alt=&#34;missing-semester&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/23019-missing-semester.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt;&lt;a href=&#34;https://github.com/missing-semester/missing-semester&#34;&gt;https://github.com/missing-semester/missing-semester&lt;/a&gt;
&lt;strong&gt;中文：&lt;/strong&gt;&lt;a href=&#34;https://missing-semester-cn.github.io/&#34;&gt;https://missing-semester-cn.github.io/&lt;/a&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;23&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-23/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-23/</guid>
      
    </item>
    
    <item>
      <title>沉浸式双语网页翻译扩展</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;向大家极力推荐这个插件：&lt;strong&gt;沉浸式双语网页翻译扩展&lt;/strong&gt;，浏览器翻译神器，而且&lt;strong&gt;完全免费&lt;/strong&gt;！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub：&lt;/strong&gt; &lt;a href=&#34;https://github.com/immersive-translate/immersive-translate&#34;&gt;https://github.com/immersive-translate/immersive-translate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;如果你是 &lt;strong&gt;Mac&lt;/strong&gt; 系统，推荐：&lt;a href=&#34;https://github.com/ripperhe/Bob&#34;&gt;https://github.com/ripperhe/Bob&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FtAZvqEDdgc3yfpbqwRq40MUEfld.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;截图&lt;/strong&gt;
&lt;img alt=&#34;Twitter 翻译&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FpC4e5Sf_G5YT9bzCWSTl4oBIBVO.png&#34; title=&#34;Twitter 翻译&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pdf 文件翻译&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FpImmIXzUhUNXaD-OgDI1AArm2eu.png&#34; title=&#34;pdf 文件翻译&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Reddit 高亮译文样式&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FuFqmDqRNOZl_es2sVoRkmeMDAar.png&#34; title=&#34;Reddit 高亮译文样式&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;19&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-19/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-19/</guid>
      
    </item>
    
    <item>
      <title>跨端博客解决方案 Elog 使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;Elog (&lt;a href=&#34;https://github.com/LetTTGACO/elog&#34;&gt;https://github.com/LetTTGACO/elog&lt;/a&gt;) —— 开放式跨平台博客解决方案，随意组合写作平台 (语雀/Notion/FlowUs) 和部署平台 (Hexo/Vitepress 等 。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;主要配置文件 &lt;strong&gt;elog.config.js&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nx&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;yuque&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;yuque&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;YUQUE_TOKEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;baseUrl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;login&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;YUQUE_LOGIN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;YUQUE_REPO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;onlyPublic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;onlyPublished&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;notion&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NOTION_TOKEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;databaseId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NOTION_DATABASE_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// {property: &#39;status&#39;, select: {equals: &#39;已发布&#39;}}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sorts&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// [{timestamp: &#39;created_time&#39;, direction: &#39;descending&#39;}],&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;catalog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flowus&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tablePageId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FLOWUS_TABLE_PAGE_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// {property: &#39;status&#39;,value: &#39;已发布&#39;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sort&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// { property: &#39;createdAt&#39;, direction: &#39;descending&#39; }&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;catalog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;deploy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;local&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outputDir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;./Cookbook&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;title&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//生成文档的命名格式，取值 urlname|title&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;markdown&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;catalog&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//是否按照目录生成文档&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;formatExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;confluence&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CONFLUENCE_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CONFLUENCE_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;baseUrl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CONFLUENCE_BASE_URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;spaceKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CONFLUENCE_SPACE_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rootPageId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CONFLUENCE_ROOT_PAGE_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;formatExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;enable&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;local&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outputDir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;./Images&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//本地图片保存目录&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/cookbook&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//替换图片的url前缀，如 ![image.png](/cookbook/xxxx.png)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;oss&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OSS_SECRET_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OSS_SECRET_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bucket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OSS_BUCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;region&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OSS_REGION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OSS_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;COS_SECRET_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;COS_SECRET_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bucket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;COS_BUCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;region&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;COS_REGION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;COS_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;qiniu&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;QINIU_SECRET_ID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;QINIU_SECRET_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bucket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;QINIU_BUCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;region&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;QINIU_REGION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;QINIU_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;upyun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UPYUN_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UPYUN_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bucket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UPYUN_BUCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UPYUN_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GITHUB_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GITHUB_REPO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;branch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefixKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;secretExt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 可选&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;基于语雀 WebHook 实现实时同步：&lt;a href=&#34;https://github.com/LetTTGACO/serverless-api&#34;&gt;https://github.com/LetTTGACO/serverless-api&lt;/a&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;18&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-18/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-18/</guid>
      
    </item>
    
    <item>
      <title>NCBI API 使用</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;参考：https://www.ncbi.nlm.nih.gov/books/NBK25499/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This chapter serves as a reference for all supported parameters for the E-utilities, along with accepted values and usage guidelines. This information is provided for each E-utility in sections below, and parameters and/or values specific to particular databases are discussed within each section. Most E-utilities have a set of parameters that are required for any call, in addition to several additional optional parameters that extend the tool&amp;rsquo;s functionality. These two sets of parameters are discussed separately in each section.&lt;/p&gt;
&lt;!-- more --&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;17&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-17/</link>
      <pubDate>Tue, 21 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-17/</guid>
      
    </item>
    
    <item>
      <title>基于 GitHub Discussions 的博客与站点</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;GitHub Discussions 是一个可以在每个 GitHub 仓库上启用的论坛。它使开发者能够轻松地讨论新功能，从社区获得反馈，创建投票，发布公告等。这里搜集了一些基于 GitHub Discussions 的博客与站点，以供参考。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/YeungKC/Hakuba&#34;&gt;Hakuba&lt;/a&gt; - 一个通过 Github Discussion 驱动的 Blog 启动器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/lencx/gg&#34;&gt;GG&lt;/a&gt; - Gatsby + GitHub，好像不支持 MathJax，也不见怎么维护了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://lencx.tech/#/&#34;&gt;lencx.tech&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://shenweiyan.github.io/gg-discussions/&#34;&gt;gg-discussions&lt;/a&gt;，个人尝试对页面进行了一些调整&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/LeetaoGoooo/pure&#34;&gt;Pure&lt;/a&gt; 一个基于 Github Discussion 的极简博客&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;15&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-15/</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-15/</guid>
      
    </item>
    
    <item>
      <title>给作者留言</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-11-09&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-11-09T00:00:00+00:00&#39;&gt;2023-11-09&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-05-20&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-05-20T00:00:00+00:00&#39;&gt;2026-05-20&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果你通过本人的博文/平台学到了一点东西，那么对我最好的奖赏就是请你也尝试教我些东西。你可以通过邮箱、微信，或者移步到 &lt;a href=&#34;https://github.com/shenweiyan/Digital-Garden/discussions/16&#34;&gt;GitHub Discussions&lt;/a&gt; 写下您的建议，或者向我提问。&lt;/p&gt;
&lt;p&gt;感谢你的一路支持！&lt;/p&gt;
&lt;p&gt;📢 如果给我发邮件，或者通过微信添加好友，请写上您的&lt;strong&gt;真名实姓&lt;/strong&gt;，让我感受到一个&lt;strong&gt;真实的人的气息&lt;/strong&gt;。我不太愿意跟&lt;strong&gt;网名&lt;/strong&gt;打交道，对于那些不知来路、上来就问问题的微信和邮件，我通常会直接忽略。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;微信：&lt;strong&gt;ishenweiyan&lt;/strong&gt;（请备注真实姓名，谢谢）&lt;/li&gt;
&lt;li&gt;邮箱：&lt;strong&gt;shenweiyan@aliyun.com&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://gi.weiyan.tech/0000/img/feedback.gif&#34; alt=&#34;feedback&#34;&gt;
&lt;/p&gt;

&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;16&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/message/</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/message/</guid>
      
    </item>
    
    <item>
      <title>基于 Mkdocs 的主题与站点</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;鉴于 MkDocs 的诸多优点，让它被很多知名开源项目选中，用于搭建和项目相关的文档网站。比如 Python 里知名的 Web 圈里的 &lt;a href=&#34;https://sspai.com/link?target=https%3A%2F%2Fwww.django-rest-framework.org%2F&#34;&gt;django-rest-framework&lt;/a&gt;、&lt;a href=&#34;https://sspai.com/link?target=https%3A%2F%2Ffastapi.tiangolo.com%2F&#34;&gt;FastAPI&lt;/a&gt; 以及基于 Go 编写的云网关代理服务器 &lt;a href=&#34;https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Ftraefik%2Ftraefik&#34;&gt;traefik&lt;/a&gt; 等项目的官方文档站点，都是通过 MkDocs 进行搭建。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;下面列的是搜集的一些 Mkdocs 主题与站点，以供参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hello 算法 - &lt;a href=&#34;https://www.hello-algo.com/&#34;&gt;https://www.hello-algo.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FDU-MSC 论坛 - &lt;a href=&#34;https://fdu-msc.github.io/forum/&#34;&gt;https://fdu-msc.github.io/forum/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Django REST framework - &lt;a href=&#34;https://www.django-rest-framework.org/&#34;&gt;https://www.django-rest-framework.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FastAPI - &lt;a href=&#34;https://fastapi.tiangolo.com/&#34;&gt;https://fastapi.tiangolo.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chrisjing 的运维之旅精选 - &lt;a href=&#34;http://www.chrisjing.com/&#34;&gt;http://www.chrisjing.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;艇仔粥 TingZaiZuk - &lt;a href=&#34;https://herointene.github.io/&#34;&gt;https://herointene.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Arisa | Blog - &lt;a href=&#34;https://blog.arisa.moe/&#34;&gt;https://blog.arisa.moe/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;嬉戏实验室 - &lt;a href=&#34;https://blog.xiiigame.com/&#34;&gt;https://blog.xiiigame.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;老胡的周刊 - &lt;a href=&#34;https://weekly.howie6879.com/&#34;&gt;weekly.howie6879.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wcowin&amp;rsquo;s Web - &lt;a href=&#34;https://wcowin.work/&#34;&gt;https://wcowin.work/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeremy Feng - &lt;a href=&#34;https://fengchao.pro/&#34;&gt;https://fengchao.pro/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我的工作学习生活笔记 - &lt;a href=&#34;https://hellowac.github.io/&#34;&gt;https://hellowac.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Power&amp;rsquo;s Wiki - &lt;a href=&#34;https://wiki-power.com/&#34;&gt;https://wiki-power.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docs of Jian - &lt;a href=&#34;https://blog.99092019.xyz/&#34;&gt;https://blog.99092019.xyz/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XMU Chenggroup Wiki - &lt;a href=&#34;https://wiki.cheng-group.net/&#34;&gt;https://wiki.cheng-group.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;14&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-14/</link>
      <pubDate>Wed, 08 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-14/</guid>
      
    </item>
    
    <item>
      <title>Python 中 tkinter 源码安装使用与中文乱码</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;主要是因为下面这两个原因，所以决定从源码编译安装去折腾一下 tkinter，以下是一些记录。&lt;/p&gt;
&lt;h2 id=&#34;_tkinter-not-found&#34;&gt;_tkinter not found&lt;a class=&#34;headerlink&#34; href=&#34;#_tkinter-not-found&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 3 源码编译安装，执行 &lt;code&gt;make&lt;/code&gt; 过程中提示 &lt;code&gt;_tkinter not found&lt;/code&gt;，如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
......
Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;finished&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully!
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bits&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;these&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;optional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;were&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:
_tkinter&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;中文乱码&#34;&gt;中文乱码&lt;a class=&#34;headerlink&#34; href=&#34;#中文乱码&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 Anaconda 3（conda 4.5.11）的 tkinter python 包（conda install -c conda-forge tk）开发 GUI 界面程序过程中，发现 UI 界面出现的中文 Unicode 乱码一直没办法解决。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;#-*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;tkinter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Tk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wm_title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;菜单&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;geometry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;800x600+300+100&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 创建一个菜单项，类似于导航栏&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;menubar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Menu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 创建菜单项&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;fmenu1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Menu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 如果该菜单时顶层菜单的一个菜单项，则它添加的是下拉菜单的菜单&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;新建文件&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;打开文件&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;结果保存&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;fmenu1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;fmenu2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Menu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;程序设置&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;程序运行&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;fmenu2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;fmenu3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Menu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;使用教程&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;版权信息&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;检查更新&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;fmenu3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# add_cascade 的一个很重要的属性就是 menu 属性，它指明了要把那个菜单级联到该菜单项上&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 当然，还必不可少的就是 label 属性，用于指定该菜单项的名称&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;menubar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_cascade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;文件&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;menu&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmenu1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;menubar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_cascade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;程序&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;menu&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmenu2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;menubar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_cascade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;帮助&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;menu&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmenu3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 最后可以用窗口的 menu 属性指定我们使用哪一个作为它的顶层菜单&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;menu&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;menubar&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mainloop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/Fh22i487OzvY-uSXvAuFs6rEXXvu.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我们也可以确认一下是不是 Tk 本身的问题：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;echo &#39;pack [button .h -text &#34;Hello, World! 显示中文&#34; -command exit]&#39; | wish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
- 正常显示
  &lt;img alt=&#34;TK 正常显示&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/tk-ok.png&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文乱码
  &lt;img alt=&#34;TK 中文乱码&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/tk-error.png&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;一些参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.x 中文编码转换的问题：&lt;a href=&#34;https://bbs.bccn.net/thread-479560-1-1.html&#34;&gt;https://bbs.bccn.net/thread-479560-1-1.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python 2.6 Tk 中文乱码解決方法：&lt;a href=&#34;http://blogkrogh.blogspot.com/2011/03/python-26-tk.html&#34;&gt;http://blogkrogh.blogspot.com/2011/03/python-26-tk.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tkinter 乱码，pyqt4 乱码：&lt;a href=&#34;http://aboutweb.lofter.com/post/11743e_6f7e4a5&#34;&gt;http://aboutweb.lofter.com/post/11743e_6f7e4a5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上面几种方法测试后，问题依然存在。在 google 上一番搜索和来回测试之后，发现了几点信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有人说，可能是 tcl/tk 安装不完整造成的。&lt;/li&gt;
&lt;li&gt;tcl/tk 重装后需要对 Python 重新编译 tkinter 才能起作用。&lt;/li&gt;
&lt;li&gt;conda install -c conda-forge tk，虽然没有任何报错，python2 中 import tkinter 也正常，但 conda 的软件安装就像一个黑盒子，无法确认 tcl/tk 是否完整安装。&lt;/li&gt;
&lt;li&gt;python 的 PyPI 仓库中是没有 tkinter 包的，想要使用 &lt;code&gt;pip install tkinter&lt;/code&gt; 卸载或者重装都是行不通的。&lt;/li&gt;
&lt;li&gt;网上也有人说可以使用 &lt;code&gt;yum install python3-tk/python-tk&lt;/code&gt; 解决，但对于本人来说，没用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;什么是-tcl-tk-tkinter&#34;&gt;什么是 tcl, tk, tkinter&lt;a class=&#34;headerlink&#34; href=&#34;#什么是-tcl-tk-tkinter&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;a href=&#34;https://docs.python.org/3.6/library/tkinter.html#module-tkinter&#34;&gt;tkinter&lt;/a&gt; package (“Tk interface”) is the standard Python interface to the Tk GUI toolkit. Both Tk and &lt;a href=&#34;https://docs.python.org/3.6/library/tkinter.html#module-tkinter&#34;&gt;tkinter&lt;/a&gt; are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.)&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;python -m tkinter&lt;/code&gt; from the command line should open a window demonstrating a simple Tk interface, letting you know that &lt;a href=&#34;https://docs.python.org/3.6/library/tkinter.html#module-tkinter&#34;&gt;tkinter&lt;/a&gt; is properly installed on your system, and also showing what version of Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific to that version.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;https://docs.python.org/3/library/tkinter.html&#34;&gt;https://docs.python.org/3/library/tkinter.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tcl 是&amp;rdquo;工具控制语言（Tool Control Language）&amp;rdquo;的缩写。Tk 是 Tcl &amp;ldquo;图形工具箱&amp;rdquo; 的扩展，它提供各种标准的 GUI 接口项，以利于迅速进行高级应用程序开发。&lt;/p&gt;
&lt;p&gt;tkinter 包（&amp;rdquo;Tk 接口&amp;rdquo;）是 Tk GUI 工具包的标准 Python 接口。 Tk 和  tkinter 在大多数 Unix 平台以及 Windows 系统上都可用（Tk 本身不是 Python 的一部分，它在 ActiveState 中维护）。您可以通过从命令行运行  &lt;code&gt;python -m tkinter&lt;/code&gt;来检查  tkinter 是否已正确安装在系统上。如果已经安装该命令会打开一个简单的 Tk 界面，该界面除了让我们知道 tkinter 已正确安装，并且还显示安装了哪个版本的 Tcl/Tk，因此我们可以阅读特定于该版本的 Tcl/Tk 文档。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FpWx6rSTKaQ1BXXPQJzchNbviKYd.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果  tkinter  没有安装，则会提示找不到该包（注意在 Python 2 中该包包名为 Tkinter，Python 3 中为 tkinter）：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FrRwzLFA1tIq2VfwS4p7i0dVLTjP.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们将尝试在 Python 2/3 中安装 Tcl/Tk，并重新编译 Python 2/3，已完成 Tkinter 安装（tkinter 为 Python 的标准库，标准库的安装需要重新编译 Python ？）。&lt;/p&gt;
&lt;h2 id=&#34;activetcl-安装&#34;&gt;ActiveTcl 安装&lt;a class=&#34;headerlink&#34; href=&#34;#activetcl-安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ActiveTcl 是 ActiveState 发布的关于 Tcl/Tk 的发行版本，该发行版本包含了最新版本的 Tk 和 Tcl 程序，我们下载其免费的社区版本进行安装即可。&lt;/p&gt;
&lt;p&gt;参考下载链接：&lt;a href=&#34;https://www.activestate.com/products/activetcl/downloads/&#34;&gt;https://www.activestate.com/products/activetcl/downloads/&lt;/a&gt;
参考安装教程：&lt;a href=&#34;https://tkdocs.com/tutorial/install.html&#34;&gt;https://tkdocs.com/tutorial/install.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下为 CentOS 6.5 下 &lt;strong&gt;ActiveTcl-8.6.9&lt;/strong&gt; 的一些安装记录，仅作参考。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://shenweiyan-generic.pkg.coding.net/btscl/activetcl/ActiveTcl-8.6.9.8609.2-x86_64-linux-glibc-2.5-dcd3ff05d.tar.gz?version=8.6.9.8609.2&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ActiveTcl-8.6.9.8609.2-x86_64-linux-glibc-2.5-dcd3ff05d.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ActiveTcl-8.6.9.8609.2-x86_64-linux-glibc-2.5-dcd3ff05d.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ActiveTcl-8.6.9.8609.2-x86_64-linux-glibc-2.5-dcd3ff05d
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./install.sh
......
Cancel&lt;span class=&#34;w&#34;&gt;         &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;no&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;RET&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
Accept&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;License&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;yes&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;A&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;A

Please&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;specify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory.
Path&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;/opt/ActiveTcl-8.6&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9

Please&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;specify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;demos.
Path&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9/demos&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:

Please&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;specify&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;runtime&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory.

This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;applications&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;will&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;see&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;their&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory
when&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;searching&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;packages&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libraries,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;instead&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files
were&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;copied&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;In&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;most&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;circumstances&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;same&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation
directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chosen&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;before.
Path&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:

Press&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;begin&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installation
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;Installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Directory:&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;Demos&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Directory:&lt;span class=&#34;w&#34;&gt;         &lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9/demos
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;Runtime&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Directory:&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;See&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Installation&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Directory
&lt;span class=&#34;nv&#34;&gt;Cancel&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;C
&lt;span class=&#34;nv&#34;&gt;Next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;RET&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;

Installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ActiveTcl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;Creating&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9/share&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;Creating&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9/share/man&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;......

Please&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;forget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;extend&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;your&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PATH&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MANPATH&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;variables&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to
get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;access&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;applications&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;manpages&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;distributed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ActiveTcl.

For&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;csh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;compatible&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;perform
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;setenv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PATH&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/home/shenweiyan/software/ActiveTcl-8.6.9/bin:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;

For&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;similar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;perform
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/home/shenweiyan/software/ActiveTcl-8.6.9/bin:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PATH

Some&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shells&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;bash&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;example&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;allow
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/home/shenweiyan/software/ActiveTcl-8.6.9/bin:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;

Similar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;changes&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;are&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;required&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MANPATH
Finish&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ActiveTcl 安装完成后，需要把 path 添加至环境变量（\~/.bashrc）:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export PATH=&#34;/home/shenweiyan/software/ActiveTcl-8.6.9/bin:$PATH&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;tcltk&#34;&gt;Tcl/Tk&lt;a class=&#34;headerlink&#34; href=&#34;#tcltk&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们也可以直接去 &lt;a href=&#34;https://sourceforge.net/projects/tcl/files/Tcl/&#34;&gt;https://sourceforge.net/projects/tcl/files/Tcl/&lt;/a&gt; 直接通过源码的方式去编译安装 Tcl/Tk，尤其是当你的系统版本比较低，需要低版本的 Tcl/Tk，这种方法会比较合适。&lt;/p&gt;
&lt;p&gt;以 tcl8.5.19-src.tar.gz/tk8.5.19-src.tar.gz 为例，下载完成后，直接解压，然后执行常规安装即可。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd tcl8.5.19/unix
./configure
make
make test
make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;python-重新编译安装&#34;&gt;Python 重新编译安装&lt;a class=&#34;headerlink&#34; href=&#34;#python-重新编译安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://docs.python.org/3/whatsnew/3.11.html&#34;&gt;What’s New In Python 3.11&lt;/a&gt; - doc.python.org&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📢 &lt;strong&gt;注意：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Python 3.11.x 起（如 Python-3.11.3）中的 &lt;code&gt;configure&lt;/code&gt; 已经把 &lt;code&gt;--with-tcltk-includes&lt;/code&gt;和&lt;code&gt;--with-tcltk-libs&lt;/code&gt;这两个参数移除！并使用 &lt;code&gt;TCLTK_CFLAGS&lt;/code&gt; 和 &lt;code&gt;TCLTK_LIBS&lt;/code&gt; 替代！！！&lt;/li&gt;
&lt;li&gt;Python 3.10.x (及以下版本，如 Python-3.9.16) 以及 Python 2.x.x 在 &lt;code&gt;configure&lt;/code&gt; 中 &lt;code&gt;--with-tcltk-includes&lt;/code&gt;和&lt;code&gt;--with-tcltk-libs&lt;/code&gt;都是有的，通过这两个参数可以解决 Tkinter 的问题！！！&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;python-3&#34;&gt;Python 3&lt;a class=&#34;headerlink&#34; href=&#34;#python-3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这里以 Python-3.11.6 为例，参考 &lt;a href=&#34;https://github.com/pyenv/pyenv/issues/2499&#34;&gt;Python 3.11.0 install doesn’t recognize homebrew Tcl/Tk due to &amp;ndash;with-tcltk-libs, &amp;ndash;with-tcltk-includes switches being removed from 3.11 - pyenv#2499&lt;/a&gt;，在编译安装过程中使用 &lt;code&gt;TCLTK_CFLAGS&lt;/code&gt; 和 &lt;code&gt;TCLTK_LIBS&lt;/code&gt; 解决 &lt;code&gt;_tkinter&lt;/code&gt; 缺失的问题。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export TCLTK_LIBS=&#34;-L/home/shenweiyan/software/ActiveTcl-8.6.9/lib -ltcl8.6 -ltk8.6&#34;  # 8.5.x 版本，需改为 -ltcl8.5 -ltk8.5
export TCLTK_CFLAGS=&#34;-I/home/shenweiyan/software/ActiveTcl-8.6.9/include&#34;

cd Python-3.11.6
/configure --prefix=/home/shenweiyan/software/python-3.11.6 ......
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;python3-confiigure-tkinter-yes&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/python-3-tkinter.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;对于 Python 3.10.x (及以下版本，如 Python-3.9.18)，&lt;code&gt;configure&lt;/code&gt; 中 &lt;code&gt;--with-tcltk-includes&lt;/code&gt; 和 &lt;code&gt;--with-tcltk-libs&lt;/code&gt; 的具体使用参考 &lt;a href=&#34;https://bugs.python.org/issue21887&#34;&gt;https://bugs.python.org/issue21887&lt;/a&gt;：  &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;tcltk-issue-21887-msg&#34; src=&#34;https://gi.weiyan.tech/2024/10/tcltk-issue-21887-msg.webp&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;python-2&#34;&gt;Python 2&lt;a class=&#34;headerlink&#34; href=&#34;#python-2&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;想要在 Python 2.7 安装 Tkinter，需要在编译过程中通过 &lt;code&gt;--with-tcltk-includes&lt;/code&gt; 和 &lt;code&gt;--with-tcltk-libs&lt;/code&gt; 中指定 ActiveTcl 的头文件以及库所在路径。&lt;/p&gt;
&lt;p&gt;如果在执行编译安装过程中，出现无法找到 libXss.so.1 共享动态库报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-2.7.15.tgz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-2.7.15
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/software/python-2.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-tcltk-includes&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;-I/usr/local/software/ActiveTcl-8.6/include&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--with-tcltk-libs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;-L/usr/local/software/ActiveTcl-8.6/lib -ltcl8.6 -ltk8.6&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--enable-optimizations
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make

......

warning:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;building&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bundled&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;copy&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;deprecated&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;on&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;this&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;platform.&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;It&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;will&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;be&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;distributed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.7
***&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;WARNING:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;renaming&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;_tkinter&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;since&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;importing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;it&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libXss.so.1:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cannot&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;open&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shared&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;object&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;No&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;such&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory

Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;finished&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully!
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bits&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;these&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;optional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;were&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:
_dbm&lt;span class=&#34;w&#34;&gt;                  &lt;/span&gt;_gdbm
To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;find&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bits,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;look&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;detect_modules&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;module&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name.

The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;following&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;detect_modules&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;have&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;been
built&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Makefile&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;instead,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configured&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Setup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files:
atexit&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                   &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt;

Following&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;built&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;but&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;were&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;removed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;because&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;they&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;be&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;imported:
_tkinter

running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build_scripts

......
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CentOS 下请参考以下解决方法：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sudo yum install libXScrnSaver libXScrnSaver-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;调用-tkinter&#34;&gt;调用 Tkinter&lt;a class=&#34;headerlink&#34; href=&#34;#调用-tkinter&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 2/3 重新编译完后，执行一下下面的命令即可显示 Tk 的 ui 界面，以及相应的 Tcl/Tk 版本。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python2 -m Tkinter   # python 2
python3 -m tkinter   # python 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;python2-m-Tkinter&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FgBtb14ZgZFZXIRhOdt6efbYz7fd.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这时候，我们重新运行开头的 GUI 界面程序，可以看到中文已经正常显示：
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FqRHUXczPdHrQjFUXNQr_Cg_j2B4.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Download And Install Tcl: ActiveTcl，&lt;a href=&#34;https://www.activestate.com/products/activetcl/downloads/&#34;&gt;https://www.activestate.com/products/activetcl/downloads/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Installing Tk，&lt;a href=&#34;https://tkdocs.com/tutorial/install.html&#34;&gt;https://tkdocs.com/tutorial/install.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python 下&amp;rdquo;No module named _tkinter&amp;rdquo;问题解决过程分析，&lt;a href=&#34;https://www.jianshu.com/p/0baa9657377f&#34;&gt;https://www.jianshu.com/p/0baa9657377f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python GUI 编程(Tkinter)文件对话框，&lt;a href=&#34;https://my.oschina.net/u/2245781/blog/661533&#34;&gt;https://my.oschina.net/u/2245781/blog/661533&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;12&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-12/</link>
      <pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-12/</guid>
      
    </item>
    
    <item>
      <title>Python3 源码安装</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;编程，作为生物信息学的一个基础性技能，是任何一个生信工程师都无法绕开话题。也许有些人还在纠结 Perl 和 Python 到底应该学习哪一个，但作为目前最火最流行的编程语言 Python 还是非常值得尝试的。它不但可以进行文本处理，在统计、网站、游戏、爬虫、数据可视化等方面也有非常强大的应用，比起曾经的 Perl 真的强大和全面很多，且比 Perl 更容易入手。不管从长远发展，还是短期需要，学会 Python，看懂 Perl (或者先学   Python，后学 Perl) 应该是每一个生信工程必备的基础技能之一。&lt;/p&gt;
&lt;p&gt;工欲善其事，必先利其器。关于 Python 安装教程在网上一搜一大把，但总感觉不够全面，尤其对于中间出现的一些问题的解决方法不尽如人意。鉴于此，本文基于  CentOS/RHEL Linux 对 Python 的源码编译安装进行了一下简单的总结，记录如下。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;安装环境&#34;&gt;安装环境&lt;a class=&#34;headerlink&#34; href=&#34;#安装环境&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Red Hat 6.5 + GCC 4.4.7（GCC-7.3.0 - 此版本 gcc 为手动安装）。&lt;/p&gt;
&lt;p&gt;GCC 高级版本手动或者 &lt;code&gt;yum&lt;/code&gt; 安装参考以下文章：
- &lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/scl-devtoolset-note&#34;&gt;SCL+Devtoolset 安装与使用笔记 · 语雀&lt;/a&gt;
- &lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/linux-gcc-install&#34;&gt;非 root 用户手动编译安装 GCC · 语雀&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lsb_release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a
LSB&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Version:&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;:base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ID:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;RedHatEnterpriseServer
Description:&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Red&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Enterprise&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Linux&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Server&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;release&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;6&lt;/span&gt;.5&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Santiago&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
Release:&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;6&lt;/span&gt;.5
Codename:&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;Santiago

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--version
gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;GCC&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.4.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20120313&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Red&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.4.7-4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
Copyright&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2010&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Free&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Software&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Foundation,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Inc.
This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;free&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;software&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;see&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;copying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;conditions.&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;There&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NO
warranty&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;even&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;MERCHANTABILITY&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FITNESS&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;FOR&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;A&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PARTICULAR&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PURPOSE.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;解决依赖&#34;&gt;解决依赖&lt;a class=&#34;headerlink&#34; href=&#34;#解决依赖&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您拥有 root 权限，请执以下依赖安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zlib
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zlib-devel
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;openssl
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;openssl-devel
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi-devel
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;readline&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;readline-devel&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sqlite&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sqlite-devel&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tk-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缺少库名称&lt;/th&gt;
&lt;th&gt;安装命令&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;_uuid&lt;/td&gt;
&lt;td&gt;yum install libuuid-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;readline&lt;/td&gt;
&lt;td&gt;yum install readline-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_tkinter&lt;/td&gt;
&lt;td&gt;yum install tk-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_ffi&lt;/td&gt;
&lt;td&gt;yum install libffi-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_curses&lt;/td&gt;
&lt;td&gt;yum install ncurses-libs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_sqlite&lt;/td&gt;
&lt;td&gt;yum install sqlite-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_bz2&lt;/td&gt;
&lt;td&gt;yum install bzip2-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_ssl&lt;/td&gt;
&lt;td&gt;yum install openssl-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_gdbm&lt;/td&gt;
&lt;td&gt;yum install gdbm-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_dbi&lt;/td&gt;
&lt;td&gt;yum install libdbi-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_zlib&lt;/td&gt;
&lt;td&gt;yum install zlib-devel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lzma&lt;/td&gt;
&lt;td&gt;yum install xz-devel (yum install python-backports-lzma)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果您没有 root 权限，可以参考《&lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/install-latest-r-from-source&#34;&gt;手把手教你在 Linux 源码安装最新版本的 R&lt;/a&gt;》一文，手动一个个去解决以上的依赖。&lt;/p&gt;
&lt;h3 id=&#34;_sqlite3&#34;&gt;_sqlite3&lt;a class=&#34;headerlink&#34; href=&#34;#_sqlite3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;执行 &lt;strong&gt;make&lt;/strong&gt; 过程中提示 &lt;strong&gt;_sqlite3 not found&lt;/strong&gt;，如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
......
Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;finished&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successfully!
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bits&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;these&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;optional&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;were&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found:
_sqlite3&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;_ssl
To&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;find&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bits,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;look&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;detect_modules&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;module&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name.

The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;following&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;detect_modules&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;have&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;been
built&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Makefile&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;instead,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configured&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Setup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files:
_abc&lt;span class=&#34;w&#34;&gt;                  &lt;/span&gt;atexit&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;系统已安装-sqlite3&#34;&gt;系统已安装 sqlite3&lt;a class=&#34;headerlink&#34; href=&#34;#系统已安装-sqlite3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果执行 &lt;strong&gt;rpm -qa|grep sqlite&lt;/strong&gt; 看到 sqlite 和 sqlite-devel 都已经安装（libsqlite3.so 默认保存在 /usr/lib64 下； &lt;code&gt;sqlite3.h&lt;/code&gt; 默认保存在 &lt;code&gt;/usr/include&lt;/code&gt; 下）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sqlite3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-version
&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;.6.20

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ll&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libsqlite3.so
lrwxrwxrwx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;root&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;root&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Apr&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2015&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/lib64/libsqlite3.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libsqlite3.so.0.8.6

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ll&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/include/sqlite3.h
-rw-r--r--&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;root&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;root&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;263K&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Nov&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2009&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/include/sqlite3.h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但是，执行 &lt;code&gt;make&lt;/code&gt; 依然出现以上报错，参考下面的方法《&lt;a href=&#34;https://stackoverflow.com/questions/32779768/python-build-from-source-cannot-build-optional-module-sqlite3&#34;&gt;python build from source: cannot build optional module sqlite3 - Stack Overflow&lt;/a&gt;》。&lt;/p&gt;
&lt;h4 id=&#34;手动安装-sqlite3&#34;&gt;手动安装 sqlite3&lt;a class=&#34;headerlink&#34; href=&#34;#手动安装-sqlite3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://www.sqlite.org/2021/sqlite-autoconf-3360000.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-check-certificate
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sqlite-autoconf-3360000.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sqlite-autoconf-3360000
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/sqlite-3.36.0
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;配置-sqlite3&#34;&gt;配置 sqlite3&lt;a class=&#34;headerlink&#34; href=&#34;#配置-sqlite3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;配置环境&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/sqlite-3.36.0/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
2. 调整源码或编译&lt;/p&gt;
&lt;p&gt;对于 3.11.x 以上版本的 Python 可以在 &lt;code&gt;configure&lt;/code&gt; 指定自定义安装的 sqlite3 路径解决 &lt;code&gt;_sqlite3&lt;/code&gt; 依赖。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure ... \
    LDFLAGS=&#34;-L/home/shenweiyan/software/sqlite-3.36.0/lib&#34; \
    CPPFLAGS=&#34;-I/home/shenweiyan/software/sqlite-3.36.0/include&#34; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;有些低版本的 Python (如 3.7) 可能需要再源码文件中加入 &lt;code&gt;sqlite3.h&lt;/code&gt; 的文件路径。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到 &lt;strong&gt;sqlite3.h&lt;/strong&gt; 文件的保存目录。&lt;/li&gt;
&lt;li&gt;修改 &lt;strong&gt;setup.py&lt;/strong&gt; 文件，在 sqlite_inc_paths 中加上 sqlite3.h 的文件路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nv&#34;&gt;sqlite_inc_paths&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/home/shenweiyan/software/sqlite-3.36.0/include&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/include&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/include/sqlite&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/include/sqlite3&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/local/include&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/local/include/sqlite&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                     &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;/usr/local/include/sqlite3&#39;&lt;/span&gt;,
&lt;span class=&#34;w&#34;&gt;                   &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;_ssl&#34;&gt;_ssl&lt;a class=&#34;headerlink&#34; href=&#34;#_ssl&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python3 需要引用 &lt;code&gt;openssl&lt;/code&gt;  模块，但是 python3.7+ 在 CentOS 中要求的 openssl 版本最低为 1.0.2，而 CentOS 默认的为 1.0.1（CentOS-6.x 通过 &lt;code&gt;yum&lt;/code&gt;  源安装的 openssl 的最高版本是 1.0.1），所以需要手动更新 openssl。&lt;/p&gt;
&lt;p&gt;对于 openssl 版本的选择，建议至少选择 1.1.1+ 版本：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the &amp;lsquo;ssl&amp;rsquo; module is compiled with &amp;lsquo;OpenSSL 1.0.2k-fips  26 Jan 2017&amp;rsquo;. See: https://github.com/urllib3/urllib3/issues/2168&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 下载&lt;/span&gt;
wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://www.openssl.org/source/openssl-1.1.1.tar.gz

&lt;span class=&#34;c1&#34;&gt;# 解压缩&lt;/span&gt;
tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-zxvf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;openssl-1.1.1.tar.gz

&lt;span class=&#34;c1&#34;&gt;# 进入目录安装&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;openssl-1.1.1

&lt;span class=&#34;c1&#34;&gt;# 进行配置下，自定义&lt;/span&gt;
./config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shared&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zlib

&lt;span class=&#34;c1&#34;&gt;# 编译并安装&lt;/span&gt;
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install

&lt;span class=&#34;c1&#34;&gt;# 配置到用户环境变量，随处使用&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;export LD_LIBRARY_PATH=/home/shenweiyan/software/openssl-1.1.1/lib:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.bashrc

&lt;span class=&#34;c1&#34;&gt;# 是环境变量配置生效&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;请注意：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;openssl&lt;/strong&gt; 编译（config）的时候 &lt;strong&gt;必须要加上 shared  参数&lt;/strong&gt;，否者源码安装 Python 即使添加了 &lt;code&gt;--with-openssl&lt;/code&gt; 的自定义路径，依然会导致 &lt;code&gt;Could not build the ssl module!&lt;/code&gt; 报错！&lt;/li&gt;
&lt;li&gt;从 &lt;a href=&#34;https://www.openssl.org/source/&#34;&gt;https://www.openssl.org/source/&lt;/a&gt; 下载的源码 openssl-1.0.2s、openssl-1.0.2m，包括  CentOS-7.5 使用 &lt;code&gt;yum&lt;/code&gt; 安装的最高版本的 openssl-1.0.2k 目前发现依然会导致 &lt;code&gt;Could not build the ssl module&lt;/code&gt; ，建议从 &lt;a href=&#34;https://www.openssl.org/source/old/&#34;&gt;https://www.openssl.org/source/old/&lt;/a&gt; 下载 1.1.1 的源码编译安装。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，在 Python 执行 &lt;code&gt;configure&lt;/code&gt; 的时候指定 openssl 的相关参数：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./configure ... \
    --with-openssl=/home/shenweiyan/software/openssl-1.1.1 \
    --with-openssl-rpath=/home/shenweiyan/software/openssl-1.1.1/lib \
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;_tkinter&#34;&gt;_tkinter&lt;a class=&#34;headerlink&#34; href=&#34;#_tkinter&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tkinter 模块缺失是一个比较棘手的问题，为此专门写了一篇文章来介绍这个问题。&lt;/p&gt;
&lt;p&gt;具体请参考：&lt;a href=&#34;https://github.com/shenweiyan/Knowledge-Garden/discussions/12&#34;&gt;Python 中 tkinter 源码安装使用与中文乱码 - Knowledge-Garden#12&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;_dbm&#34;&gt;_dbm&lt;a class=&#34;headerlink&#34; href=&#34;#_dbm&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;_dbm&lt;/code&gt; 和 &lt;code&gt;_gdbm&lt;/code&gt; 的模块缺失可以通过下面手动的方法解决。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz
tar -zxvf gdbm-1.23.tar.gz
./configure --prefix=/home/shenweiyan/software/gdbm-1.23 --enable-libgdbm-compat  --enable-debug
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后，增加环境变量，并调整 Python 执行 &lt;code&gt;configure&lt;/code&gt; 时的参数：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export PATH=/home/shenweiyan/software/gdbm-1.23/bin:$PATH
export LD_LIBRARY_PATH=/home/shenweiyan/software/gdbm-1.23/lib:$LD_LIBRARY_PATH

./configure ... \
    LDFLAGS=&#34;-L/home/shenweiyan/software/gdbm-1.23/lib&#34; \
    CPPFLAGS=&#34;-I/home/shenweiyan/software/gdbm-1.23/include&#34;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;_lzma&#34;&gt;_lzma&lt;a class=&#34;headerlink&#34; href=&#34;#_lzma&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;正常情况下，下面的方法可以解决该问题（如果您有 root 权限的话）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# For ubuntu:&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sudo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;liblzma-dev

&lt;span class=&#34;c1&#34;&gt;# For centos:&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;xz-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;普通用户可以手动安装解决：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://tukaani.org/xz/xz-5.2.5.tar.gz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-check-certificat
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;xz-5.2.5.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;xz-5.2.5
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/xz-5.2.5
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后，配置环境：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/xz-5.2.5/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;_ctypes&#34;&gt;_ctypes&lt;a class=&#34;headerlink&#34; href=&#34;#_ctypes&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 CentOS 6.x 安装 &lt;code&gt;libffi-devel&lt;/code&gt;  的时候出现以下问题：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi-devel
Loaded&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;plugins:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;product-id,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;refresh-packagekit,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;search-disabled-repos,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;security,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;subscription-manager
This&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;system&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;registered&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Red&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Subscription&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Management.&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;You&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;can&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;use&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;subscription-manager&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;register.
Setting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;up&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Process
cdrom&lt;span class=&#34;w&#34;&gt;                                                                                                                                         &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;kB&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;:00&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...
No&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;package&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi-devel&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;available.
Error:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Nothing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以使用下面的方法安装：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;root@log01&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# rpm -ivh http://mirror.centos.org/centos/6/os/x86_64/Packages/libffi-devel-3.0.5-3.2.el6.x86_64.rpm&lt;/span&gt;
Retrieving&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://mirror.centos.org/centos/6/os/x86_64/Packages/libffi-devel-3.0.5-3.2.el6.x86_64.rpm
warning:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/tmp/rpm-tmp.V9ihbu:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Header&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;V3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;RSA/SHA256&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Signature,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;key&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ID&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;c105b9de:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NOKEY
Preparing...&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;########################################### [100%]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;:libffi-devel&lt;span class=&#34;w&#34;&gt;           &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;########################################### [100%]&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;root@log01&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# rpm -qa|grep libffi&lt;/span&gt;
libffi-3.0.5-3.2.el6.x86_64
libffi-devel-3.0.5-3.2.el6.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;手动的源码方法安装如下：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libffi-3.2.1.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/libffi-3.2.1
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;pygraphviz&#34;&gt;pygraphviz&lt;a class=&#34;headerlink&#34; href=&#34;#pygraphviz&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果你不需要使用 pygraphviz，可以不用管这个依赖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PyGraphviz is a Python interface to the Graphviz graph layout and visualization package. With PyGraphviz you can create, edit, read, write, and draw graphs using Python to access the Graphviz graph data structure and layout algorithms.&lt;/p&gt;
&lt;p&gt;PyGraphviz 是 Graphviz 图形布局和可视化包的 Python 接口。 借助 PyGraphviz，您可以使用 Python 创建、编辑、读取、写入和绘制图形，以访问 Graphviz 图形数据结构和布局算法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/Python-3.7.3/bin/pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
Collecting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Using&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cached&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://files.pythonhosted.org/packages/7e/b1/d6d849ddaf6f11036f9980d433f383d4c13d1ebcfc3cd09bc845bda7e433/pygraphviz-1.5.zip
Installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;collected&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;packages:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Complete&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;output&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/Python-3.7.3/bin/python3.7&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-u&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;import setuptools, tokenize;__file__=&#39;/tmp/pip-install-_zdjdg0j/pygraphviz/setup.py&#39;;f=getattr(tokenize, &#39;open&#39;, open)(__file__);code=f.read().replace(&#39;\r\n&#39;, &#39;\n&#39;);f.close();exec(compile(code, __file__, &#39;exec&#39;))&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--record&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/tmp/pip-record-g0mz7lrq/install-record.txt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--single-version-externally-managed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--compile:
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dpkg
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;find&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dpkg
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Trying&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pkg-config
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Package&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libcgraph&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;was&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pkg-config&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;search&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;path.
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;Perhaps&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;you&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;should&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;directory&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;containing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;libcgraph.pc&lt;span class=&#34;s1&#34;&gt;&#39;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;    to the PKG_CONFIG_PATH environment variable&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;    No package &#39;&lt;/span&gt;libcgraph&lt;span class=&#34;s1&#34;&gt;&#39; found&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;    Traceback (most recent call last):&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;&amp;lt;string&amp;gt;&#34;, line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/tmp/pip-install-_zdjdg0j/pygraphviz/setup.py&#34;, line 93, in &amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        tests_require=[&#39;&lt;/span&gt;nose&amp;gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.3.7&lt;span class=&#34;s1&#34;&gt;&#39;, &#39;&lt;/span&gt;doctest-ignore-unicode&amp;gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.1.2&lt;span class=&#34;s1&#34;&gt;&#39;, &#39;&lt;/span&gt;mock&amp;gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.0.0&lt;span class=&#34;s1&#34;&gt;&#39;],&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/site-packages/setuptools/__init__.py&#34;, line 145, in setup&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        return distutils.core.setup(**attrs)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/distutils/core.py&#34;, line 148, in setup&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        dist.run_commands()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/distutils/dist.py&#34;, line 966, in run_commands&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        self.run_command(cmd)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/distutils/dist.py&#34;, line 985, in run_command&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        cmd_obj.run()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/tmp/pip-install-_zdjdg0j/pygraphviz/setup_commands.py&#34;, line 44, in modified_run&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        self.include_path, self.library_path = get_graphviz_dirs()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/tmp/pip-install-_zdjdg0j/pygraphviz/setup_extra.py&#34;, line 162, in get_graphviz_dirs&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        include_dirs, library_dirs = _try_configure(include_dirs, library_dirs, _pkg_config)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/tmp/pip-install-_zdjdg0j/pygraphviz/setup_extra.py&#34;, line 117, in _try_configure&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        i, l = try_function()&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/tmp/pip-install-_zdjdg0j/pygraphviz/setup_extra.py&#34;, line 72, in _pkg_config&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        output = S.check_output([&#39;&lt;/span&gt;pkg-config&lt;span class=&#34;s1&#34;&gt;&#39;, &#39;&lt;/span&gt;--libs-only-L&lt;span class=&#34;s1&#34;&gt;&#39;, &#39;&lt;/span&gt;libcgraph&lt;span class=&#34;s1&#34;&gt;&#39;])&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/subprocess.py&#34;, line 395, in check_output&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        **kwargs).stdout&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;      File &#34;/home/shenweiyan/software/Python-3.7.3/lib/python3.7/subprocess.py&#34;, line 487, in run&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;        output=stdout, stderr=stderr)&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;    subprocess.CalledProcessError: Command &#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;pkg-config&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;--libs-only-L&#39;&lt;/span&gt;,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;libcgraph&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39; returned non-zero exit status 1.&lt;/span&gt;

&lt;span class=&#34;s1&#34;&gt;    ----------------------------------------&lt;/span&gt;
&lt;span class=&#34;s1&#34;&gt;Command &#34;/home/shenweiyan/software/Python-3.7.3/bin/python3.7 -u -c &#34;import setuptools, tokenize;__file__=&#39;&lt;/span&gt;/tmp/pip-install-_zdjdg0j/pygraphviz/setup.py&lt;span class=&#34;s1&#34;&gt;&#39;;f=getattr(tokenize, &#39;&lt;/span&gt;open&lt;span class=&#34;s1&#34;&gt;&#39;, open)(__file__);code=f.read().replace(&#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\r\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;, &#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;);f.close();exec(compile(code, __file__, &#39;&lt;/span&gt;exec&lt;span class=&#34;err&#34;&gt;&#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34; install --record /tmp/pip-record-g0mz7lrq/install-record.txt --single-version-externally-managed --compile&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;error&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;code&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/tmp/pip-install-_zdjdg0j/pygraphviz/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考：《&lt;a href=&#34;https://github.com/pygraphviz/pygraphviz/issues/11&#34;&gt;Installation:fatal error: &amp;lsquo;graphviz/cgraph.h&amp;rsquo; file not found&lt;/a&gt;》&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://graphviz.gitlab.io/pub/graphviz/stable/SOURCES/graphviz.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;graphviz.tar.gz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;graphviz-2.40.1
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;推荐把安装好的 graphviz 添加到环境变量，这样可以避免运行过程中出现：&lt;strong&gt;&amp;ldquo;pygraphviz/graphviz_wrap.c:2987:29: fatal error: graphviz/cgraph.h: No such file or directory&amp;rdquo;&lt;/strong&gt; 无法找到头文件的异常。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/lib/pkgconfig:&lt;span class=&#34;nv&#34;&gt;$PKG_CONFIG_PATH&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;C_INCLUDE_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/include:&lt;span class=&#34;nv&#34;&gt;$C_INCLUDE_PATH&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CPLUS_INCLUDE_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/include:&lt;span class=&#34;nv&#34;&gt;$CPLUS_INCLUDE_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果 graphviz 添加到环境变量， &lt;code&gt;pygraphviz&lt;/code&gt; 的 python 包可以参考下面的方法安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/Python-3.7.3/bin/pip3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global-option&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;build_ext&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global-option&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/home/shenweiyan/software/graphviz-2.40.1/include&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global-option&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/home/shenweiyan/software/graphviz-2.40.1/lib&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
/home/shenweiyan/software/Python-3.7.3/lib/python3.7/site-packages/pip/_internal/commands/install.py:207:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;UserWarning:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Disabling&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;all&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;use&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wheels&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;due&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;use&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;of&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--build-options&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--global-options&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install-options.
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;cmdoptions.check_install_build_global&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;options&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
Collecting&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Using&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cached&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://files.pythonhosted.org/packages/7e/b1/d6d849ddaf6f11036f9980d433f383d4c13d1ebcfc3cd09bc845bda7e433/pygraphviz-1.5.zip
Installing&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;collected&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;packages:&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;Running&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
Successfully&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pygraphviz-1.5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;编译安装&#34;&gt;编译安装&lt;a class=&#34;headerlink&#34; href=&#34;#编译安装&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这里的编译安装，以 Python-3.11.6 为示例。&lt;/p&gt;
&lt;p&gt;第一，下载 Python 源码，解压。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 官网下载地址 https://www.python.org/downloads&lt;/span&gt;
wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz

&lt;span class=&#34;c1&#34;&gt;# 解压到指定目录&lt;/span&gt;
tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-3.11.6.tgz&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-C&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/local/src
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;第二，进入解压的源码路径，编译 Python 源码。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/libffi-3.2.1/lib/pkgconfig:&lt;span class=&#34;nv&#34;&gt;$PKG_CONFIG_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/lib/pkgconfig:&lt;span class=&#34;nv&#34;&gt;$PKG_CONFIG_PATH&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/libffi-3.2.1/lib64:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/graphviz-2.40.1/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/sqlite-3.36.0/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/gdbm-1.23/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/ActiveTcl-8.6.9/lib:&lt;span class=&#34;nv&#34;&gt;$LD_LIBRARY_PATH&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TCLTK_LIBS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/home/shenweiyan/software/ActiveTcl-8.6.9/lib -ltcl8.6 -ltk8.6&#34;&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TCLTK_CFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/home/shenweiyan/software/ActiveTcl-8.6.9/include&#34;&lt;/span&gt;

$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
--enable-optimizations&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/Python-3.11.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
--with-openssl&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
--with-openssl-rpath&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/openssl-1.1.1/lib&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/gcc-7.3.0/bin/gcc&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;CXX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/shenweiyan/software/gcc-7.3.0/bin/c++&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;LDFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/home/shenweiyan/software/libffi-3.2.1/lib64 \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;         -L/home/shenweiyan/software/graphviz-2.40.1/lib \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;         -L/home/shenweiyan/software/sqlite-3.36.0/lib \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;         -L/home/shenweiyan/software/gdbm-1.23/lib&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;CPPFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/home/shenweiyan/software/graphviz-2.40.1/include \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;          -I/home/shenweiyan/software/sqlite-3.36.0/include \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;          -I/home/shenweiyan/software/gdbm-1.23/include&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;/home/shenweiyan/software/libffi-3.2.1/lib/pkgconfig: \&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;                 /home/shenweiyan/software/graphviz-2.40.1/lib/pkgconfig&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--enable-optimizations&lt;/code&gt;  是优化选项（LTO，PGO  等）加上这个  flag  编译后，性能有  10%  左右的优化，但是这会明显的增加编译时间。建议使用这个参数；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--prefix&lt;/code&gt;  声明安装路径；&lt;/li&gt;
&lt;li&gt;安装多个 python 的版本，如果不开启&lt;code&gt;--enable-shared&lt;/code&gt;，指定不同路径即可。当开启&lt;code&gt;--enable-shared&lt;/code&gt; 时，默认只有一个版本的 python。&lt;/li&gt;
&lt;li&gt;Python 3 编译可以在 configure 或者环境变量中指定 OpenSSL 安装路径进行编译的方式解决 OpenSSL 依赖，否则 &lt;code&gt;make&lt;/code&gt;  过程可能出错。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
......
The&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;following&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;found&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;detect_modules&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setup.py,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;have&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;been
built&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Makefile&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;instead,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;as&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configured&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;by&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Setup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;files:
_abc&lt;span class=&#34;w&#34;&gt;                  &lt;/span&gt;atexit&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt;


Failed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;to&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;these&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;modules:
_ctypes&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;_hashlib&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;_ssl


Could&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;build&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;module!
Python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;requires&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;an&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;OpenSSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.0.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;or&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;compatible&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;with&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;X509_VERIFY_PARAM_set1_host&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;.
LibreSSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;.6.4&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;and&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;earlier&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;not&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;provide&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;the&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;necessary&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;APIs,&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/libressl-portable/portable/issues/381

......
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt; 过程如果出现 &lt;code&gt;ModuleNotFoundError: No module named &#39;_ctypes&#39;&lt;/code&gt; 或者 &lt;code&gt;INFO: Could not locate ffi libs and/or headers&lt;/code&gt; 参考：&lt;a href=&#34;https://groups.google.com/forum/#!topic/comp.lang.python/npv-wzmytzo&#34;&gt;https://groups.google.com/forum/#!topic/comp.lang.python/npv-wzmytzo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FmK7bCeEeGjfbl1UVdvHyw3Jg8Zj.png&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于低版本的 Python 如果指定 &lt;code&gt;--with-openssl=DIR&lt;/code&gt; 依然无法解决 ssl 模块的问题，可以参考修改 Modules/Setup.dist 文件（默认这块是注释的，放开注释即可。这块功能是开启 SSL 模块，不然会出现安装完毕后，提示找不到 ssl 模块的错误）再执行 configure，修改内容如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# Socket module helper for SSL support; you must comment out the other&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# socket line above, and possibly edit the SSL variable:&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;SSL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/ssl
_ssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;_ssl.c&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;-DUSE_SSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-I&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;SSL&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/include&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-I&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;SSL&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/include/openssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;-L&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;SSL&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/lib&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lcrypto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;第三，Makefile 生后依次在当前路径执行编译和安装命令。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;第四，安装完成。以上命令执行完毕，且无报错的情况下，我们将默认 python 换将切换至 3.11.6（一般不建议替换，个人建议把自定义安装的 Python bin 路径添加到 PATH 环境变量即可）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 替换系统自带的 python（不建议）&lt;/span&gt;
mv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/bin/python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/bin/python2
ln&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/software/Python-3.11.6/bin/python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/bin/python3

&lt;span class=&#34;c1&#34;&gt;# 添加新 Python 到 PATH 环境变量（建议）&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;export PATH=/home/shenweiyan/software/Python-3.11.6/bin:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;~/.bashrc
&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;运行命令 &lt;code&gt;python -V&lt;/code&gt; ，查看是否出现 3.11.6  的版本，出现即为安装成功。&lt;/p&gt;
&lt;h2 id=&#34;其他工具&#34;&gt;其他工具&lt;a class=&#34;headerlink&#34; href=&#34;#其他工具&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python &amp;gt;= 3.10 在安装时候，默认会同时安装 &lt;strong&gt;pip3&lt;/strong&gt;！如果你的 python &amp;lt; 3.10，可以参考下面的方法安装 pip。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 下载 setuptools 和 pip 安装程序&lt;/span&gt;
curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://bootstrap.pypa.io/get-pip.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get-pip.py
python3&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;get-pip.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;至此，CentOS Linux release 6.5 下的 python-3.11.6  全部安装完成。如果在安装过程中出现其他的报错，建议把 error 关键信息直接复制到 Google 进行检索，参考其他人的解决方法。&lt;/p&gt;
&lt;h2 id=&#34;其他异常与解决&#34;&gt;其他异常与解决&lt;a class=&#34;headerlink&#34; href=&#34;#其他异常与解决&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;_bz2&#34;&gt;_bz2&lt;a class=&#34;headerlink&#34; href=&#34;#_bz2&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;系统：CentOS Linux release 7.7.1908 (Core)&lt;/li&gt;
&lt;li&gt;GCC：gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 CentOS 7 中安装 Python-3.6.9 中发现 make 过程中一直提示：&amp;rdquo;&lt;strong&gt;ModuleNotFoundError: No module named &amp;lsquo;_bz2&amp;rsquo;&lt;/strong&gt;&amp;ldquo;，尽管 &lt;code&gt;sudo yum install bzip2 bzip2-devel&lt;/code&gt;  已经安装了 bzip2 的依赖，问题还是不得其解。最后参考 stackoverflow 上的《Correctly building local python3, with bz2 support》，终于解决问题，下面记录一下。
&lt;a href=&#34;https://stackoverflow.com/questions/51149227/correctly-building-local-python3-with-bz2-support&#34;&gt;Correctly building local python3, with bz2 support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;手动安装 bzip2：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://nchc.dl.sourceforge.net/project/bzip2/bzip2-1.0.6.tar.gz
tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bzip2-1.0.6.tar.gz
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bzip2-1.0.6
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Makefile_libbz2_so&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 这一步是生成 libbz2.so.1.0.6 的动态库文件&lt;/span&gt;
make
make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PREFIX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/software/bzip2-1.0.6
cp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;libbz2.so.1.0.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/usr/local/software/bzip2-1.0.6/lib/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;几点说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bzip2 的官网  &lt;a href=&#34;http://www.bzip.org/&#34;&gt;http://www.bzip.org/&lt;/a&gt;  已经把 bzip2 的源码下载链接放到了  SourceForge，网络上一些从  &lt;a href=&#34;http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz&#34;&gt;http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz&lt;/a&gt;  下载的做法已经失效。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sourceforge.net/projects/bzip2/files/&#34;&gt;SourceForge&lt;/a&gt; 上 bzip2 的最新版本还是 1.0.6（Last modified 2018-11-3），更高级版本的 bzip2 我也不知道是否存在，也不知道能不能用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-cookbook-img/FvgxGWlVJSxOCvgXFo9BPOa3ODm5.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编译安装 Python-3.6.9：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tar&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;zvxf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-3.6.9.tgz
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Python-3.6.9
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--enable-optimizations&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--prefix&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/software/python-3.6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-I/usr/local/software/bzip2-1.0.6/include&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LDFLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;-L/usr/local/software/bzip2-1.0.6/lib&#34;&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;make&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Python-3.6.9 中的 &lt;code&gt;./configure --help&lt;/code&gt; 中没有 &lt;code&gt;--with-openssl&lt;/code&gt; 参数！有点神奇，我也不知道原因。&lt;/li&gt;
&lt;li&gt;安装完成可以用 &lt;code&gt;from _bz2 import BZ2Compressor, BZ2Decompressor&lt;/code&gt; 测试一下 &lt;code&gt;_bz2&lt;/code&gt;  是否可用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;行者无疆-ITer,《&lt;a href=&#34;https://www.cnblogs.com/ITer-jack/p/8305912.html&#34;&gt;python2.7 源码编译安装&lt;/a&gt;》, 博客园&lt;/li&gt;
&lt;li&gt;Scott Frazer,《&lt;a href=&#34;https://stackoverflow.com/questions/23548188/how-do-i-compile-python-3-4-with-custom-openssl&#34;&gt;How do I compile Python 3.4 with custom OpenSSL?&lt;/a&gt;》, Stack Overflow&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;13&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-13/</link>
      <pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-13/</guid>
      
    </item>
    
    <item>
      <title>飞书文档初体验</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2023 年的 1024 程序员节前一天，语雀服务器崩溃长达 8 个小时的余温还没消，就迫不及待再去体验了一把飞书文档，说几点个人感受。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;20231023-yuque&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/Gitbook/2023/20231023-yuque.png&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zhihu.com/question/627418678&#34;&gt;如何看待语雀因网络故障导致用户无法正常访问文档？在线文档的可靠性还值得信任吗？&lt;/a&gt; - 知乎&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.v2ex.com/t/984728&#34;&gt;鉴于昨天的语雀，有啥推荐的笔记软件么&lt;/a&gt; -V2EX&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，飞书文档&lt;a href=&#34;https://www.feishu.cn/&#34;&gt;国内版本&lt;/a&gt;和&lt;a href=&#34;https://www.larksuite.com/&#34;&gt;国际版本&lt;/a&gt;的区别可不是一般的大。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;飞书文档国内版本&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/Gitbook/2023/feishu-cn-admin.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;飞书文档国际版本&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/Gitbook/2023/larksuite-admin.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第二，书写体验相当不错。&lt;/p&gt;
&lt;p&gt;第三，最然支持 Markdown 所见即所得的编辑模式，但没法查看单篇文档的 Markdown，这也是我最不满意的地方。&lt;/p&gt;
&lt;p&gt;第四，API 很强大，文档很丰富，但没找到怎么通过 API 获取 wiki 知识库内容的介绍！&lt;/p&gt;
&lt;p&gt;截止 2023.10.25 了解到飞书目前是没有 wiki 知识库内容的 API 接口，不清楚后面是否会有这方面的支持，且持续关注中。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;飞书文档 wiki 知识库 API&#34; src=&#34;https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/feishu-wiki-api.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;事实上，飞书是支持 通过 API 接口获取 wiki 知识库内容的（上面截图中客服的回答并不准确），具体可以参考 &lt;a href=&#34;https://github.com/longbridgeapp/feishu-pages#feishu-pages&#34;&gt;Feishu Pages&lt;/a&gt; 实现 wiki 知识库的内容导出。&lt;/p&gt;
&lt;p&gt;第五，经历语雀宕机事件，不得不考虑多平台备份的问题，对于飞书文档目前没发现比较好的方法。&lt;/p&gt;
&lt;p&gt;经过了这个事件很多人都对在线文档产生了一些动摇，但总体来说在使用性和方便性上在线文档还是很有优势的，但值得注意的是不能把所有的鸡蛋都放到一个篮子 —— 备份很重要！&lt;strong&gt;通用格式&lt;/strong&gt; 和 &lt;strong&gt;数据可控&lt;/strong&gt; 或者可以成为一个评判的基础，那些过于封闭不支持导出(甚至是批量导出)的平台基本可以放弃了。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;11&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-11/</link>
      <pubDate>Tue, 24 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-11/</guid>
      
    </item>
    
    <item>
      <title>WebStack-Hugo | 一个静态响应式导航主题</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Via：&lt;a href=&#34;https://mp.weixin.qq.com/s/gVWGjxG9qd7qSyX3N8Zgag&#34;&gt;我给自己做了一个导航网站&lt;/a&gt; | &lt;a href=&#34;https://github.com/bioitee&#34;&gt;BioIT爱好者&lt;/a&gt;    &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;📢 让更多人的人制作自己的导航网站。如果你觉得本主题对你有所帮助，欢迎请作者 &lt;a href=&#34;https://gi.weiyan.tech/0000/img/donate.webp&#34;&gt;喝杯咖啡&lt;/a&gt; &amp;gt;.&amp;lt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;主题开源地址&#34;&gt;主题开源地址&lt;a class=&#34;headerlink&#34; href=&#34;#主题开源地址&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo&#34;&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; | &lt;a href=&#34;https://gitee.com/shenweiyan/WebStack-Hugo&#34;&gt;&lt;strong&gt;Gitee&lt;/strong&gt;&lt;/a&gt; | &lt;a href=&#34;https://gitcode.com/shenweiyan/WebStack-Hugo&#34;&gt;&lt;strong&gt;GitCode&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;主题展示地址&#34;&gt;主题展示地址&lt;a class=&#34;headerlink&#34; href=&#34;#主题展示地址&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://np.pagex.top/&#34;&gt;&lt;strong&gt;WebStack-Hugo 网址导航&lt;/strong&gt;&lt;/a&gt; | &lt;a href=&#34;https://hao.bioit.top/&#34;&gt;&lt;strong&gt;生信网址导航&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;为什么做这个网站&#34;&gt;为什么做这个网站&lt;a class=&#34;headerlink&#34; href=&#34;#为什么做这个网站&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;之所以想着要给自己倒腾一个导航网站，主要有几个原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;购买了一个域名，且也备案成功了，总想折腾点跟它有关的事情；&lt;/li&gt;
&lt;li&gt;经常在公司、家里（有时候还有其他的临时场所）更换电脑，每次同步书签（或者登陆一些导航网站）需要各种登陆，麻烦。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说干就干，从 &lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;WebStack 的开源项目&lt;/a&gt;开始，断断续续的折腾了好几天，终于把轮子造起来了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-collapse.png&#34; width=800&gt;
&lt;img src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-expand.png&#34; width=800&gt;
&lt;img src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-search.png&#34; width=800&gt;
&lt;img src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-phone.png&#34; alt=&#34;webstack-apple&#34; width=600&gt;&lt;/p&gt;
&lt;h2 id=&#34;跟其他导航网站有什么区别&#34;&gt;跟其他导航网站有什么区别&lt;a class=&#34;headerlink&#34; href=&#34;#跟其他导航网站有什么区别&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是 Hugo 版 WebStack 主题。可以借助 Github/Gitee Pages 或者云平台直接托管部署，无需服务器。&lt;/p&gt;
&lt;p&gt;本项目是基于纯静态的网址导航网站 &lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;webstack.cc&lt;/a&gt; 制作的 &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; 主题，其中部分代码参考了以下几个开源项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;https://github.com/WebStackPage/WebStackPage.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;https://github.com/liutongxu/liutongxu.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/iplaycode/webstack-hugo&#34;&gt;https://github.com/iplaycode/webstack-hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总体说一下特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;采用了一直以来最喜欢的 hugo 部署方式，方便高效。&lt;/li&gt;
&lt;li&gt;主要的配置信息都集成到了 &lt;strong&gt;config.toml&lt;/strong&gt;，一键完成各种自定义的配置。&lt;/li&gt;
&lt;li&gt;导航的各个信息都集成在 &lt;strong&gt;data/webstack.yml&lt;/strong&gt; 文件中，方便后续增删改动。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taxonomy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;科研办公&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;fas fa-flask fa-lg&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;term&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;生物信息&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;links&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;NCBI&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;n/ncbi.jpg&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;https://www.ncbi.nlm.nih.gov/&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;National Center for Biotechnology Information.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;Bioconda&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;b/bioconda.jpg&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;https://anaconda.org/bioconda/&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;Bioconda&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Anaconda.org.&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;term&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;云服务器&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;links&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;阿里云&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;a/aliyun.jpg&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;https://www.aliyun.com/&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;上云就上阿里云。&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;腾讯云&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;c/cloud-tencent.jpg&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;https://cloud.tencent.com/&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;产业智变，云启未来。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;做了手机电脑自适应以及夜间模式。&lt;/li&gt;
&lt;li&gt;增加了搜索功能，以及下拉的热词选项（基于百度 API）。&lt;/li&gt;
&lt;li&gt;增加了一言、和风天气的 API（和风天气 API 已经官方已经不再支持，目前还没到到替代）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;windows-下安装部署&#34;&gt;Windows 下安装部署&lt;a class=&#34;headerlink&#34; href=&#34;#windows-下安装部署&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本安装部署在 Windows 7 x64 上测试没问题，相关操作同样适用于 Windows 10，如有任何问题，欢迎留言或者微信与我联系。&lt;/p&gt;
&lt;h3 id=&#34;第一下载-hugo&#34;&gt;第一，下载 hugo&lt;a class=&#34;headerlink&#34; href=&#34;#第一下载-hugo&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下载链接：&lt;a href=&#34;https://github.com/gohugoio/hugo/releases&#34;&gt;https://github.com/gohugoio/hugo/releases&lt;/a&gt;，在这里我们下载 &lt;a href=&#34;https://github.com/gohugoio/hugo/releases/download/v0.89.4/hugo_0.89.4_Windows-64bit.zip&#34;&gt;hugo_0.89.4_Windows-64bit.zip&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;download-hugo-windows&#34; src=&#34;https://gi.weiyan.tech/2023/11/download-hugo-windows.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第二解压&#34;&gt;第二，解压&lt;a class=&#34;headerlink&#34; href=&#34;#第二解压&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;我们把 &lt;a href=&#34;https://github.com/gohugoio/hugo/releases/download/v0.89.4/hugo_0.89.4_Windows-64bit.zip&#34;&gt;hugo_0.89.4_Windows-64bit.zip&lt;/a&gt; 下载到 &lt;strong&gt;F:\WebStack&lt;/strong&gt; 目录下，然后解压到当前文件夹。&lt;/p&gt;
&lt;p&gt;解压完成后，在该目录会多出 &lt;code&gt;hugo.exe&lt;/code&gt;、&lt;code&gt;LICENSE&lt;/code&gt;、&lt;code&gt;README.md&lt;/code&gt; 三个文件：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;unzip hugo_0.89.4_Windows-64bit&#34; src=&#34;https://gi.weiyan.tech/2023/11/unzip-hugo-0.89.4-windows-64bit.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第三检测是否安装成功&#34;&gt;第三，检测是否安装成功&lt;a class=&#34;headerlink&#34; href=&#34;#第三检测是否安装成功&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过下面的方法，检测 &lt;code&gt;hugo&lt;/code&gt; 是否安装成功。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🏷️ 温馨提示：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows 命令运行窗口中可以使用 Tab 进行命令行补全，例如你当前目录下有一个 WebStack-Hugo 目录，你在命令行窗口中输入一个 w 后按下 Tab 键，命令行就会自动出现 WebStack-Hugo！&lt;/p&gt;
&lt;p&gt;使用命令行补全，可以减少代码（或者文件名）的输入，方便快捷，又能减少错误！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;在 Windows 中使用 &lt;strong&gt;Win+R&lt;/strong&gt; 打开“&lt;strong&gt;运行&lt;/strong&gt;”对话框，在对话框中输入“&lt;strong&gt;cmd&lt;/strong&gt;”，点击确认。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;win-r-cmd&#34; src=&#34;https://gi.weiyan.tech/2023/11/win-r-cmd.png&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 Windows 运行窗口，先切换盘符到 &lt;strong&gt;F&lt;/strong&gt; 盘，然后进入 &lt;code&gt;hugo&lt;/code&gt; 的解压缩目录（&lt;strong&gt;F:\WebStack&lt;/strong&gt;），具体操作如下。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在光标处输入 &lt;strong&gt;F:&lt;/strong&gt;，然后按回车；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cmd-change-dir&#34; src=&#34;https://gi.weiyan.tech/2023/11/cmd-change-dir.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我们就将盘符切换为 &lt;strong&gt;F&lt;/strong&gt; 盘；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cmd-f-dir&#34; src=&#34;https://gi.weiyan.tech/2023/11/cmd-f-dir.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着输入 &lt;strong&gt;cd WebStack&lt;/strong&gt;，回车，就进入了 &lt;strong&gt;F:\WebStack&lt;/strong&gt; 目录；使用 &lt;strong&gt;ls&lt;/strong&gt; 可以看到当前目录下的文件。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;webstack-win-ls&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-win-ls.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后，输入 &lt;strong&gt;hugo.exe version&lt;/strong&gt;，回车，如图所示，则代表安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hugo-exe-version&#34; src=&#34;https://gi.weiyan.tech/2023/11/hugo-exe-version.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;第四下载-webstack-hugo&#34;&gt;第四，下载 WebStack-Hugo&lt;a class=&#34;headerlink&#34; href=&#34;#第四下载-webstack-hugo&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;浏览器打开 &lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo&#34;&gt;https://github.com/shenweiyan/WebStack-Hugo&lt;/a&gt;，点击 Code 下的 &lt;strong&gt;&amp;ldquo;Download ZIP&amp;rdquo;&lt;/strong&gt;，把 &lt;strong&gt;WebStack-hugo-main.zip&lt;/strong&gt; 下载到刚才 hugo 解压缩的目录（&lt;strong&gt;F:\WebStack&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;webstack-download-zip&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-download-zip.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;webstack-hugo-main-zip&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-main-zip.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第五解压和重命名&#34;&gt;第五，解压和重命名&lt;a class=&#34;headerlink&#34; href=&#34;#第五解压和重命名&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;把 &lt;strong&gt;WebStack-Hugo-main.zip&lt;/strong&gt; 解压到当前目录。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;webstack-hugo-main-unzip&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-main-unzip.png&#34; /&gt;
&lt;img alt=&#34;webstack-hugo-main-rename&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-main-rename.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第六安装主题&#34;&gt;第六，安装主题&lt;a class=&#34;headerlink&#34; href=&#34;#第六安装主题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;首先，进入 &lt;strong&gt;F:\WebStack&lt;/strong&gt; 目录；&lt;/p&gt;
&lt;p&gt;然后，创建一个 &lt;strong&gt;themes&lt;/strong&gt; 的文件夹；&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;create-themes-dir&#34; src=&#34;https://gi.weiyan.tech/2023/11/create-themes-dir.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;接着，把解压后的 &lt;strong&gt;WebStack-Hugo&lt;/strong&gt; 整个文件夹移动到 &lt;strong&gt;themes&lt;/strong&gt; 中。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;mv-webstack-hugo-to-themes&#34; src=&#34;https://gi.weiyan.tech/2023/11/mv-webstack-hugo-to-themes.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第四，将 &lt;code&gt;themes/WebStack-Hugo/exampleSite&lt;/code&gt; 目录下的所有文件复制到 hugo 站点根目录（即 &lt;code&gt;F:\WebStack&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;cp-examplesite&#34; src=&#34;https://gi.weiyan.tech/2023/11/cp-examplesite.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第七启动预览&#34;&gt;第七，启动预览&lt;a class=&#34;headerlink&#34; href=&#34;#第七启动预览&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在刚才已经打开的 Windows 命令运行窗口中，使用下面的命令执行 &lt;strong&gt;hugo server&lt;/strong&gt;，启动站点——Hugo 可以启动一个 Web 服务器，同时构建站点内容到内存中并在检测到文件更改后重新渲染，方便我们在开发环境实时预览对站点所做的更改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;hugo.exe&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;hugo-exe-server&#34; src=&#34;https://gi.weiyan.tech/2023/11/hugo-exe-server.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后，在浏览器中打开 &lt;a href=&#34;http://127.0.0.1:1313/&#34;&gt;&lt;strong&gt;http://127.0.0.1:1313/&lt;/strong&gt;&lt;/a&gt;，即可看到生成的站点。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;webstack-hugo-1313&#34; src=&#34;https://gi.weiyan.tech/2023/11/webstack-hugo-1313.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;linux-下安装部署&#34;&gt;Linux 下安装部署&lt;a class=&#34;headerlink&#34; href=&#34;#linux-下安装部署&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;安装完本 WebStack-Hugo 主题后，将 exampleSite 目录下的文件复制到 hugo 站点根目录，根据需要把 config.toml 的一些信息改成自己的，导航的网址信息可通过 data 目录下 webstack.yml 修改。&lt;/p&gt;
&lt;p&gt;具体执行步骤如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/mysite
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/mysite

&lt;span class=&#34;c1&#34;&gt;# 安装 WebStack-Hugo 主题&lt;/span&gt;
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clone&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/shenweiyan/WebStack-Hugo.git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;themes/WebStack-Hugo

&lt;span class=&#34;c1&#34;&gt;# 将 exampleSite 目录下的文件复制到 hugo 站点根目录&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/home/shenweiyan/mysite
cp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;themes/WebStack-Hugo/exampleSite/*&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./

&lt;span class=&#34;c1&#34;&gt;# 启动 hugo 站点&lt;/span&gt;
hugo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server
&lt;span class=&#34;c1&#34;&gt;# 如果你知道你的公网 ip, 如下面的 132.76.230.31, 可以使用下面的方式执行 hugo server&lt;/span&gt;
hugo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--baseUrl&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;132&lt;/span&gt;.76.230.31&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--bind&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;.0.0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;也可以参考 &lt;a href=&#34;https://github.com/jetsung&#34;&gt;@jetsung&lt;/a&gt; 在 &lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo/pull/15&#34;&gt;pull 15&lt;/a&gt; 所用的方法安装部署：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 创建项目&lt;/span&gt;
mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;navsites
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$_&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# 初始化项目&lt;/span&gt;
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;init

&lt;span class=&#34;c1&#34;&gt;# 将 WebStack-Hugo 源下载到 themes/WebStack-Hugo 文件夹&lt;/span&gt;
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;submodule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/shenweiyan/WebStack-Hugo.git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;themes/WebStack-Hugo
cp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;themes/WebStack-Hugo/exampleSite/*&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;./

&lt;span class=&#34;c1&#34;&gt;# 安装 hugo&lt;/span&gt;
go&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;github.com/gohugoio/hugo@latest

&lt;span class=&#34;c1&#34;&gt;# 本地测试&lt;/span&gt;
hugo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server

&lt;span class=&#34;c1&#34;&gt;# 生成 docs 文件夹，将并静态内容生成至此处&lt;/span&gt;
hugo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;导出-html-静态资源&#34;&gt;导出 HTML 静态资源&lt;a class=&#34;headerlink&#34; href=&#34;#导出-html-静态资源&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Windows/Linux 下执行的 &lt;strong&gt;hugo server&lt;/strong&gt; 命令将会通过热加载的方式临时启动一个 Hugo 服务器（Hugo 可以启动一个 Web 服务器，同时构建站点内容到内存中并在检测到文件更改后重新渲染，方便我们在开发环境实时预览对站点所做的更改），这个时候我们打开浏览器 &lt;a href=&#34;http://127.0.0.1:1313/&#34;&gt;http://127.0.0.1:1313/&lt;/a&gt;，就可以看到我们站点的样子了。&lt;/p&gt;
&lt;p&gt;如果我们想要把我们的站点部署到 GitHub/Gitee Pages（或者本地的服务器），我们可以：&lt;/p&gt;
&lt;h3 id=&#34;1-生成静态页面内容&#34;&gt;1. 生成静态页面内容&lt;a class=&#34;headerlink&#34; href=&#34;#1-生成静态页面内容&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以通过下面的命令，生成(构建)静态页面内容。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;hugo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;或者&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hugo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;minify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个命令会默认在 &lt;strong&gt;&lt;code&gt;public/&lt;/code&gt;&lt;/strong&gt; 目录中生成您的网站，当然您可以通过改变站点配置中的 &lt;strong&gt;&lt;code&gt;publishDir&lt;/code&gt;&lt;/strong&gt; 选项来配置这个输出目录。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🏷️ Hugo 小知识 - 草案、未来和过期内容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hugo 允许您在网站内容的前言设定中设置文档的&lt;code&gt;draft&lt;/code&gt;，&lt;code&gt;publishdate&lt;/code&gt;甚至&lt;code&gt;expirydate&lt;/code&gt;字段。默认情况下，Hugo 不会发布下面内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;publishdate&lt;/code&gt; 发布日期值设定在未来的内容；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;draft:true&lt;/code&gt; 草案状态设置为真的内容；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expirydate&lt;/code&gt; 过期日期值设置为过去某事件的内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这三个可以在本地开发和部署编译时通过对&lt;code&gt;hugo&lt;/code&gt;和&lt;code&gt;hugo server&lt;/code&gt;分别添加如下参数来重新设定，或者在配置文件中设定对应(不包含&lt;code&gt;--&lt;/code&gt;)域的 boolean 值：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;-F, &amp;ndash;buildFuture include content with publishdate in the future&lt;/li&gt;
&lt;li&gt;-D, &amp;ndash;buildDrafts include content marked as draft&lt;/li&gt;
&lt;li&gt;-E, &amp;ndash;buildExpired include expired content&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;2-部署站点&#34;&gt;2. 部署站点&lt;a class=&#34;headerlink&#34; href=&#34;#2-部署站点&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;把生成的 &lt;code&gt;public/&lt;/code&gt; 静态内容目录上传到 GitHub，开启 GitHub/Gitee Pages，并且绑定 cname 域名即可。&lt;/p&gt;
&lt;h2 id=&#34;使用说明与技巧&#34;&gt;使用说明与技巧&lt;a class=&#34;headerlink&#34; href=&#34;#使用说明与技巧&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是一个开源的公益项目，你可以拿来制作自己的网址导航，也可以做与导航无关的网站。&lt;/p&gt;
&lt;h3 id=&#34;左导航栏图标&#34;&gt;左导航栏图标&lt;a class=&#34;headerlink&#34; href=&#34;#左导航栏图标&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;左侧、顶部导航栏图标用的都是 &lt;strong&gt;Font Awesome&lt;/strong&gt; 图标库 &lt;strong&gt;v5&lt;/strong&gt; 版本 &lt;strong&gt;Free&lt;/strong&gt; 的图标。链接如下：&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&#34;https://fontawesome.com/v5/search?o=r&amp;amp;m=free&#34;&gt;https://fontawesome.com/v5/search?o=r&amp;amp;m=free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;fontawesome-v5-free&#34; src=&#34;https://gi.weiyan.tech/2023/11/fontawesome-v5-free.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;调整头部搜索栏&#34;&gt;调整头部搜索栏&lt;a class=&#34;headerlink&#34; href=&#34;#调整头部搜索栏&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;头部搜索栏的默认位置可以通过下面的方法进行修改。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接修改 &lt;strong&gt;layouts/partials/content_search.html&lt;/strong&gt;，调整对应部分的位置。&lt;/li&gt;
&lt;li&gt;调整默认的搜索（即点击&amp;rdquo;常用/搜索/工具 ....&amp;rdquo; 时下指箭头的指向），把对应的 id 添加到对应的 label 里面。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;set-default-search-bing&#34; src=&#34;https://gi.weiyan.tech/2023/11/set-default-search-bing.png&#34; /&gt;
&lt;img alt=&#34;view-default-search-bing&#34; src=&#34;https://gi.weiyan.tech/2023/11/view-default-search-bing.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;自定义头部导航&#34;&gt;自定义头部导航&lt;a class=&#34;headerlink&#34; href=&#34;#自定义头部导航&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo&#34;&gt;WebStack-Hugo&lt;/a&gt; 把头部的导航菜单的各个信息集成在了 &lt;strong&gt;data/header.yml&lt;/strong&gt; 文件中，每个人可以根据自己的需要调整。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;首页&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;fa fa-home&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;./&#34;&lt;/span&gt;

&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;作者&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;fa fa-book&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;https://www.yuque.com/shenweiyan&lt;/span&gt;

&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;配置&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;fa fa-cog&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;源码&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;#&#34;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;图标&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;#&#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;获取网站图标&#34;&gt;获取网站图标&lt;a class=&#34;headerlink&#34; href=&#34;#获取网站图标&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://nav.bioitee.com/&#34;&gt;Bio &amp;amp; IT 网址导航&lt;/a&gt;默认使用的是个人收集的网站图标，主要是查看网站源码、百度、谷歌等途径把对应导航的图标下载下来，这个方法比较原始繁琐，适合导航不是很多的情况。&lt;/p&gt;
&lt;h4 id=&#34;一为&#34;&gt;一为&lt;a class=&#34;headerlink&#34; href=&#34;#一为&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;你也可以使用一为提供的的 &lt;a href=&#34;https://www.iowen.cn/tag/favicon/&#34;&gt;Favicon&lt;/a&gt; 图标 &lt;a href=&#34;https://www.iowen.cn/tag/api/&#34;&gt;API&lt;/a&gt;：&lt;a href=&#34;https://api.iowen.cn/doc/favicon.html&#34;&gt;获取网站 Favicon - 免费 API 数据接口调用服务平台&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用方法：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;获取 Favicon 图标
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://api.iowen.cn/favicon/www.iowen.cn.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;刷新缓存
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://api.iowen.cn/favicon/www.iowen.cn.png?refresh=true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将上方代码中的 &lt;code&gt;www.iowen.cn&lt;/code&gt; 替换为你需要获取的网址域名。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;faviconim&#34;&gt;Favicon.im&lt;a class=&#34;headerlink&#34; href=&#34;#faviconim&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;除了一为的 API，你也可以使用 &lt;a href=&#34;https://favicon.im/&#34;&gt;https://favicon.im/&lt;/a&gt; 来在网页中插入其他网站的 Favicon 图片，可以放大显示。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;favicon-im&#34; src=&#34;https://gi.weiyan.tech/2024/08/favicon-im.webp&#34; /&gt;&lt;/p&gt;
&lt;h4 id=&#34;favicon-extractor&#34;&gt;Favicon Extractor&lt;a class=&#34;headerlink&#34; href=&#34;#favicon-extractor&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;类似网站 &lt;a href=&#34;https://www.faviconextractor.com/&#34;&gt;Favicon Downloader&lt;/a&gt;，代码&lt;a href=&#34;https://github.com/seadfeng/favicon-downloader&#34;&gt;开源&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;favicon-extractor&#34; src=&#34;https://gi.weiyan.tech/2024/08/favicon-extractor.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;已知问题&#34;&gt;已知问题&lt;a class=&#34;headerlink&#34; href=&#34;#已知问题&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;日间模式与夜间模式切换时候，头部搜索栏的背景图片切换不够流畅（个人的 js 知识有限，在 footer.html 做了一些简单的调整来实现），如果你有更好的想法，欢迎 PR 或者交流。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;感谢墙&#34;&gt;感谢墙&lt;a class=&#34;headerlink&#34; href=&#34;#感谢墙&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本主题的部分代码参考了以下几个开源项目，特此感谢。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;WebStackPage/WebStackPage.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/liutongxu/liutongxu.github.io&#34;&gt;liutongxu/liutongxu.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/iplaycode/webstack-hugo&#34;&gt;iplaycode/webstack-hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;感谢 &lt;a href=&#34;https://github.com/WebStackPage/WebStackPage.github.io&#34;&gt;WebStack&lt;/a&gt; 的作者 &lt;a href=&#34;https://twitter.com/decohack&#34;&gt;Viggo&lt;/a&gt; 的肯定和&lt;a href=&#34;https://twitter.com/decohack/status/1569188705478516738&#34;&gt;推广宣传&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;twitter-decohack-webstack-hugo&#34; src=&#34;https://gi.weiyan.tech/2023/11/twitter-decohack-webstack-hugo.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;感谢以下所有朋友对本主题所做出的贡献。     &lt;br /&gt;
&lt;strong&gt;&lt;a href=&#34;https://github.com/yinhanghang&#34;&gt;@yanbeiyinhanghang&lt;/a&gt;&lt;/strong&gt;    &lt;br /&gt;
&lt;strong&gt;&lt;a href=&#34;https://github.com/jetsung&#34;&gt;@jetsung&lt;/a&gt;&lt;/strong&gt;       &lt;/p&gt;
&lt;h2 id=&#34;赞赏&#34;&gt;赞赏&lt;a class=&#34;headerlink&#34; href=&#34;#赞赏&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你觉得本项目对你有所帮助，欢迎请作者喝杯热咖啡 &amp;gt;.&amp;lt;     &lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;donate-wecaht-aliapy&#34; src=&#34;https://gi.weiyan.tech/0000/img/donate.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;反馈与交流&#34;&gt;反馈与交流&lt;a class=&#34;headerlink&#34; href=&#34;#反馈与交流&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后，最重要的，秉承 WebStack 的宗旨，这是一个开源的公益项目，你可以拿来制作自己的网址导航，也可以做与导航无关的网站。&lt;/p&gt;
&lt;p&gt;WebStack 有非常多的魔改版本，这是其中一个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你对本主题进行了一些个性化调整，欢迎在本项目中 &lt;/strong&gt;&lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo/issues&#34;&gt;&lt;strong&gt;issues&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 中一起分享交流！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果参考本主题构建了属于你自己的网址导航，欢迎在本评论区（或源码 &lt;/strong&gt;&lt;a href=&#34;https://github.com/shenweiyan/WebStack-Hugo/issues&#34;&gt;&lt;strong&gt;issues&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 区）留下你网站的访问链接 &amp;gt;.&amp;lt;&lt;/strong&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;10&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-10/</link>
      <pubDate>Mon, 23 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-10/</guid>
      
    </item>
    
    <item>
      <title>个人域名跳转至语雀个人主页</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;语雀的个人使用目前是不支持自定义域名的，虽然空间的使用可以自定义二级域名，如：&lt;a href=&#34;https://weiyan.yuque.com/&#34;&gt;weiyan.yuque.com&lt;/a&gt;，但是空间知识库必须要先登录，不方便其他人查看，尤其是对于没有注册语雀的用户。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;现在的情况是，我有一个已经备案的个人域名 &lt;code&gt;www.example.com&lt;/code&gt;，现在我想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让所有 &lt;code&gt;www.example.com&lt;/code&gt; 的访问地址都跳转到 &lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;https://www.yuque.com/shenweiyan&lt;/a&gt;，比如 &lt;code&gt;https://www.example.com/cookbook&lt;/code&gt; 跳转到 &lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook&#34;&gt;https://www.yuque.com/shenweiyan/cookbook&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www.example.com&lt;/code&gt; 的访问地址跳转同时支持 http/https。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;example.com/www.example.com&lt;/code&gt; 同时实现以上跳转。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反正就一句话，让下面的链接都跳转到 &lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;https://www.yuque.com/shenweiyan&lt;/a&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://example.com&#34;&gt;http://example.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.example.com&#34;&gt;http://www.example.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://example.com&#34;&gt;https://example.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.example.com&#34;&gt;https://www.example.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面简单记录一下具体的实现过程。&lt;/p&gt;
&lt;h2 id=&#34;背景知识&#34;&gt;背景知识&lt;a class=&#34;headerlink&#34; href=&#34;#背景知识&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;显性 URL 转发：&lt;/strong&gt; 用的是 301 重定向技术，效果为浏览器地址栏输入 &lt;a href=&#34;http://a.com/&#34;&gt;http://a.com&lt;/a&gt; 回车，打开网站内容是目标地址 &lt;a href=&#34;http://cloud.baidu.com/&#34;&gt;http://cloud.baidu.com/&lt;/a&gt; 的网站内容，且地址栏显示目标地址 &lt;a href=&#34;http://cloud.baidu.com/&#34;&gt;http://cloud.baidu.com/&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;隐性 URL 转发：&lt;/strong&gt; 用的是 iframe 框架技术、非重定向技术，效果为浏览器地址栏输入 &lt;a href=&#34;http://a.com/&#34;&gt;http://a.com&lt;/a&gt; 回车，打开网站内容是目标地址 &lt;a href=&#34;http://cloud.baidu.com/&#34;&gt;http://cloud.baidu.com/&lt;/a&gt; 的网站内容，但地址栏显示当前地址 &lt;a href=&#34;http://a.com/&#34;&gt;http://a.com&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;301 重定向是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;301 重定向表示网页由一个地址永久地移动到了另外一个地址。这里中的 301 是被重定向网页的 HTTP 状态代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例如：&lt;/strong&gt; &lt;a href=&#34;https://blog.ahrefs.com/&#34;&gt;blog.ahrefs.com&lt;/a&gt; 重定向到了 &lt;a href=&#34;https://ahrefs.com/blog&#34;&gt;ahrefs.com/blog&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;简单来说，301 重定向是在告诉浏览器：“这个页面已经永久迁移了。这个是新的地址，我们不打算把它移回去啦。”这时，浏览器会回复：“没问题！我现在（开始）就把用户引向这里！”&lt;/p&gt;
&lt;p&gt;这就是为什么访问 blog.ahrefs.com 已经不可能了。你最后会去到的网页是 ahrefs.com/blog。&lt;/p&gt;
&lt;h2 id=&#34;前提条件&#34;&gt;前提条件&lt;a class=&#34;headerlink&#34; href=&#34;#前提条件&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;前提条件可以分为&lt;strong&gt;有服务器&lt;/strong&gt;和&lt;strong&gt;无服务器&lt;/strong&gt;两种情况，下面具体说一下。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;有服务器（可以考虑腾讯云或者阿里云的轻量云服务器，双十一优惠价一年也就几十块）；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里云轻量云服务器：&lt;a href=&#34;https://www.aliyun.com/activity/1111?userCode=mx65q35j&#34;&gt;购买链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;腾讯云轻量云服务器：&lt;a href=&#34;https://curl.qcloud.com/0Sy0R0AX&#34;&gt;购买链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;域名（域名需要已经完成备案）；&lt;/li&gt;
&lt;li&gt;SSL 证书（可以使用阿里云或者腾讯云的免费域名证书）；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无服务器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以考虑使用 &lt;a href=&#34;https://support.cloudflare.com/hc/zh-cn/articles/218411427&#34;&gt;Cloudflare Page Rules&lt;/a&gt;（页面规则）；当然，其他的平台也可以；&lt;/li&gt;
&lt;li&gt;域名（有些域名可以不用备案）；&lt;/li&gt;
&lt;li&gt;SSL 证书（如果你用的是 &lt;a href=&#34;https://support.cloudflare.com/hc/zh-cn/articles/218411427&#34;&gt;Cloudflare Page Rules&lt;/a&gt;，可以不用 SSL 证书 ）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;操作步骤有服务器&#34;&gt;操作步骤：有服务器&lt;a class=&#34;headerlink&#34; href=&#34;#操作步骤有服务器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本操作以 &lt;strong&gt;ncbix.com&lt;/strong&gt; 域名为示例。&lt;/p&gt;
&lt;h3 id=&#34;1-域名解析&#34;&gt;1. 域名解析&lt;a class=&#34;headerlink&#34; href=&#34;#1-域名解析&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在你的域名供应商后台点击“添加记录”，分别输入 www 和 @，记录类型“A”，记录值就是你虚拟主机或 VPS 服务器的 IP 地址，最后保存。以 DNSPOD 为例。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FqvWUx6cyUz-O8d1avOdFZ1aDIWF.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-ssl-证书&#34;&gt;2. SSL 证书&lt;a class=&#34;headerlink&#34; href=&#34;#2-ssl-证书&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;申请免费证书，具体操作可以自行百度。以腾讯云为例：&lt;a href=&#34;https://console.cloud.tencent.com/ssl&#34;&gt;https://console.cloud.tencent.com/ssl&lt;/a&gt;。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fo4XBIRStXxx27kvjKULIjHazdJ9.png&#34; /&gt;
根据截图，一步步点击操作。申请完成后，把证书下载并上传到你的服务器。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FqamrO4EBSQuO6wsJ28y8g-AH63E.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-安装-nginx&#34;&gt;3. 安装 Nginx&lt;a class=&#34;headerlink&#34; href=&#34;#3-安装-nginx&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以直接使用 &lt;strong&gt;yum/apt&lt;/strong&gt; 的方式直接安装；源码方式的安装，参考：《&lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/centos-install-nginx&#34;&gt;CentOS 7 下编译安装 Nginx · 语雀&lt;/a&gt;》。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# Debian/Ubuntu&lt;/span&gt;
apt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;update
apt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;nginx

&lt;span class=&#34;c1&#34;&gt;# CentOS/RHEL&lt;/span&gt;
yum&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;4-配置-nginx&#34;&gt;4. 配置 Nginx&lt;a class=&#34;headerlink&#34; href=&#34;#4-配置-nginx&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过 &lt;strong&gt;yum/apt&lt;/strong&gt; 安装的 Nginx 默认的置文件在 &lt;strong&gt;/etc/nginx/nginx.conf&lt;/strong&gt;，编辑该文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;##&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Basic Settings&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;##&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;......&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;##&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Virtual Host Configs&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;##&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;443&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;ssl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;server_name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;ncbix.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;www.ncbix.com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;ssl_certificate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/etc/nginx/ssl/nginx/www.ncbix.com_bundle.crt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;ssl_certificate_key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/etc/nginx/ssl/nginx/www.ncbix.com.key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;index.php&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;index.html&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;index.htm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&#34;http&#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;https://www.yuque.com/shenweiyan&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$request_uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#确保跳转到新域名HTTPS如果没有HTTPS可以去掉&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;rewrite&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/.*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;https://www.yuque.com/shenweiyan&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$uri&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#跳转到新域名并重写为新域名&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/etc/nginx/conf.d/*.conf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/etc/nginx/sites-enabled/*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;5-重启-nginx&#34;&gt;5. 重启 Nginx&lt;a class=&#34;headerlink&#34; href=&#34;#5-重启-nginx&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最后，通过下面的命令重启 Nginx 服务即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;nginx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;操作步骤无服务器&#34;&gt;操作步骤：无服务器&lt;a class=&#34;headerlink&#34; href=&#34;#操作步骤无服务器&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们以 &lt;a href=&#34;https://support.cloudflare.com/hc/zh-cn/articles/218411427&#34;&gt;Cloudflare Page Rules&lt;/a&gt; 为例，说明一下具体怎么操作。&lt;/p&gt;
&lt;h3 id=&#34;1-cloudflare-中添加站点&#34;&gt;1. Cloudflare 中添加站点&lt;a class=&#34;headerlink&#34; href=&#34;#1-cloudflare-中添加站点&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fjd2wS9yVs0ZiBBalZQVOuPQHbU1.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;添加完站点后，可以选择 &lt;strong&gt;Free 计划&lt;/strong&gt;，然后点击继续：
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FumaUELUaIJnv9s0Q4paKUDIAWTL.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击继续后，Cloudflare 会自动扫描你对应域名的一些解析记录：
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FtQZKAyQd_6dd5d7A_ZLCVp4NUEg.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以直接选择 &lt;strong&gt;&amp;ldquo;继续&amp;rdquo;&lt;/strong&gt;。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fvkt0gHVP7lmiqapWf3pM7Zx4YwN.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-修改域名-dns&#34;&gt;2. 修改域名 DNS&lt;a class=&#34;headerlink&#34; href=&#34;#2-修改域名-dns&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;首先，我的域名是在腾讯云注册的，可以去腾讯云控制台 &lt;strong&gt;&amp;ldquo;我的域名&amp;rdquo;&lt;/strong&gt; 中直接修改 DNS：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# 添加 Cloudflare 名称服务器
imani.ns.cloudflare.com
caroline.dnspod.net
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FlKyYHHLGHwD9IPKYvLtPorghBpr.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FmRwodrlbkBt6SkX7RsG2ec1iruc.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-完成-cloudflare-添加站点&#34;&gt;3. 完成 Cloudflare 添加站点&lt;a class=&#34;headerlink&#34; href=&#34;#3-完成-cloudflare-添加站点&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以把后面快速指南的这几个配置都勾选。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FtULJ4uM_TuPjPkkMtdXAhxpyDes.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;等待几分钟就可以看到你的域名站点已经添加到 Cloudflare 上了！
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fk8Hv5dkW8kHd1IorhNfT427RliQ.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-设置-dns-记录&#34;&gt;4. 设置 DNS 记录&lt;a class=&#34;headerlink&#34; href=&#34;#4-设置-dns-记录&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The first thing you will need is a DNS record for &lt;strong&gt;@&lt;/strong&gt;, &lt;strong&gt;www&lt;/strong&gt; and any other subdomains you want to redirect, set to &lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FjjhP041Zj-aZVPAHpQ-YnHIzMA6.png&#34; /&gt;. This can point to any IP address as the redirection page rule will execute first. I would recommend pointing them to 192.0.2.1 , a dummy IP.&lt;/p&gt;
&lt;p&gt;From：&lt;a href=&#34;https://community.cloudflare.com/t/redirecting-one-domain-to-another/81960&#34;&gt;https://community.cloudflare.com/t/redirecting-one-domain-to-another/81960&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在配置 Cloudflare 站点的页面规则前，你需要把该域名的 &lt;strong&gt;@&lt;/strong&gt;，&lt;strong&gt;www&lt;/strong&gt; 或者其他你想要进行重定向的子域名添加到 DNS 记录中，这个记录的值可以指向任何 IP 地址，因为重定向页面规则将首先执行。我建议将它们指向 192.0.2.1 ，一个虚拟 IP。&lt;/p&gt;
&lt;p&gt;在这里，我们以 &lt;strong&gt;@&lt;/strong&gt; 和 &lt;strong&gt;note&lt;/strong&gt; 子域名为例，添加 DNS 记录，先让它们指向一个虚拟 IP。
&lt;img alt=&#34;images&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fk08ydFuPukTv88AAa0V27T4xTBh.png&#34; title=&#34;以 ncbix.com 和 note.ncbix.com 为例，均重定向到 https://www.yuque.com/shenweiyan 页面&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;5-配置-cloudflare-站点页面规则&#34;&gt;5. 配置 Cloudflare 站点页面规则&lt;a class=&#34;headerlink&#34; href=&#34;#5-配置-cloudflare-站点页面规则&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;首先，在 Cloudflare 的主页上点击对应的站点，选择 &lt;strong&gt;&amp;ldquo;页面规则&amp;rdquo;&lt;/strong&gt;，点击。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FqolXaSzUdkgtKo66yRC3xRkV7mv.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;strong&gt;&amp;ldquo;创建页面规则&amp;rdquo;&lt;/strong&gt;：
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FnF2bk6hzYvulCtXdLSQSUiV1Z44.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fp5DSLxKInn25a591hjYjDNpUeRn.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FiFuRSizKlmkmJ5LxiBfkIGreBdm.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FtNPR2rLIFDKMYz3N8gqkLBcQFnG.png&#34; /&gt;&lt;/p&gt;
&lt;h4 id=&#34;什么是页面规则&#34;&gt;什么是页面规则？&lt;a class=&#34;headerlink&#34; href=&#34;#什么是页面规则&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;页面规则为 Cloudflare 设置提供基于 URL 的粒度控制。关于页面规则需要了解的最重要事情是，针对一个 URL 仅触发一个页面规则，因此一定要按照优先级顺序对页面规则进行排序并将最具体的页面规则放在顶部。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;页面规则中允许哪些模式&#34;&gt;页面规则中允许哪些模式？&lt;a class=&#34;headerlink&#34; href=&#34;#页面规则中允许哪些模式&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;如果使用的是转发页面规则，则可以将这些通配符映射到变量。在转发 URL 中，可以按照从左到右的顺序指定与原始 URL 中的通配符相匹配的 &lt;span class=&#34;arithmatex&#34;&gt;\(1、\)&lt;/span&gt;2，以此类推。&lt;/p&gt;
&lt;p&gt;例如，可以将 &lt;code&gt;http://.example.com/&lt;/code&gt; 转发到 &lt;code&gt;http://$2.example.com/$1.jpg&lt;/code&gt;。此规则将与 &lt;a href=&#34;http://cloud.example.com/flare&#34;&gt;http://cloud.example.com/flare&lt;/a&gt; 相匹配，这最终将转发到 &lt;a href=&#34;http://flare.example.com/cloud.jpg&#34;&gt;http://flare.example.com/cloud.jpg&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;一些有用的提示&#34;&gt;一些有用的提示：&lt;a class=&#34;headerlink&#34; href=&#34;#一些有用的提示&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h5&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;如果要同时匹配 http 和 https，只需编写 example.com 即可。无需编写 example.com。&lt;/li&gt;
&lt;li&gt;如果要匹配域中的每个页面，则需要编写 example.com/，仅编写 example.com 是不够的。&lt;/li&gt;
&lt;li&gt;请参阅 &lt;a href=&#34;https://support.cloudflare.com/hc/articles/218411427&#34;&gt;了解和配置 Cloudflare 页面规则&lt;/a&gt; 了解有关页面规则模式的更多详细信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;6-配置-ssl不必要&#34;&gt;6. 配置 SSL(不必要)&lt;a class=&#34;headerlink&#34; href=&#34;#6-配置-ssl不必要&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;📢 Update 2022.09.05：这一步不是必要的，这里仅供参考！&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;申请 &lt;a href=&#34;http://www.example.com&#34;&gt;www.example.com&lt;/a&gt; 域名的 SSL 证书；&lt;/li&gt;
&lt;li&gt;把 DNS 验证域名的记录添加到 Cloudfare 的 DNS 中；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FiEmXujpQKK0j0p2GxzaOgTC3xwN.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FnOHAmNIAcEmwBD_fv3eIUBzxmiB.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FtxcA4iXJhT029vkw35EVkDN-2QG.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FgrIb03h7Inot6k7fa1BHGH4G3HO.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://segmentfault.com/q/1010000015157572&#34;&gt;nginx 实现两个域名之间跳转配置 - SegmentFault 思否&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.baidu.com/doc/DNS/s/ukq4w1pji&#34;&gt;智能云解析 DNS - 通过 Nginx 实现 URL 转发 | 百度智能云文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ahrefs.com/blog/zh/301-redirects/&#34;&gt;SEO 的 301 重定向：你需要知道的一切&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;8&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-8/</link>
      <pubDate>Mon, 23 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-8/</guid>
      
    </item>
    
    <item>
      <title>在 Linux 上给用户赋予指定目录的读写权限</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;在 Linux 上指定目录的读写权限赋予用户，有两种方法可以实现这个目标：第一种是使用 ACL (访问控制列表)，第二种是创建用户组来管理文件权限，下面会一一介绍。为了完成这个教程，我们将使用以下设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;操作系统：CentOS 7&lt;/li&gt;
&lt;li&gt;测试目录：/data/share&lt;/li&gt;
&lt;li&gt;测试用户：shenweiyan&lt;/li&gt;
&lt;li&gt;文件系统类型：ext4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请确认所有的命令都是使用 root 用户执行的，或者使用 sudo 命令来享受与之同样的权限。让我们开始吧！下面，先使用 mkdir 命令来创建一个名为 share 的目录。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;1-acl-权限设置&#34;&gt;1. ACL 权限设置&lt;a class=&#34;headerlink&#34; href=&#34;#1-acl-权限设置&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;重要提示：&lt;/strong&gt;     &lt;br /&gt;
打算使用此方法的话，您需要确认您的 Linux 文件系统类型（如 ext3 和 ext4, NTFS, BTRFS）支持 ACL。&lt;/p&gt;
&lt;h3 id=&#34;11-查看内核是否支持-acl&#34;&gt;1.1. 查看内核是否支持 ACL&lt;a class=&#34;headerlink&#34; href=&#34;#11-查看内核是否支持-acl&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;依照以下命令在您的系统中检查当前文件系统类型，并且查看内核是否支持 ACL：**&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;df&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-T&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;{print $1,$2,$NF}&#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;^/dev&#34;&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-i&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;acl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/boot/config*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;从下方的截屏可以看到，文件系统类型是 ext4，并且从 &lt;code&gt;CONFIG_EXT4_FS_POSIX_ACL=y&lt;/code&gt; 选项可以发现内核是支持 POSIX ACL 的。
&lt;img alt=&#34;config-ext4-fs-posix-acl&#34; src=&#34;https://gi.weiyan.tech/2024/08/config-ext4-fs-posix-acl.webp&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;12-挂载是否使用了-acl&#34;&gt;1.2. 挂载是否使用了 ACL&lt;a class=&#34;headerlink&#34; href=&#34;#12-挂载是否使用了-acl&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用下面的命令，查看文件系统（分区）挂载时是否使用了 ACL 选项。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tune2fs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/dev/vda1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;acl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;tune2fs-acl&#34; src=&#34;https://gi.weiyan.tech/2024/08/tune2fs-acl.webp&#34; /&gt;    &lt;br /&gt;
通过上边的输出可以发现，默认的挂载项目中已经对 ACL 进行了支持。如果发现结果不如所愿，你可以通过以下命令对指定分区（此例中使用 /dev/sda3）开启 ACL 的支持）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mount&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;remount,acl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tune2fs&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;acl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/dev/sda3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;13-设置-acl-权限&#34;&gt;1.3. 设置 ACL 权限&lt;a class=&#34;headerlink&#34; href=&#34;#13-设置-acl-权限&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-m&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;m:rx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;文件名&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 给 mask 的权限为 r-x ，使用 &#34;m:rx&#34;格式 &lt;/span&gt;

setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-m&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;u:用户名:权限&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-R&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;目录名&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 递归 ACL 权限(针对目录现有的文件设置 ACL) &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例如，指定目录 &lt;code&gt;share&lt;/code&gt; 的读写权限分配给名为 &lt;code&gt;shenweiyan&lt;/code&gt; 的用户了，依照以下命令执行即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# 检查目录默认的 ACL 设置（Check the default ACL settings for the directory）&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;getfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share

&lt;span class=&#34;c1&#34;&gt;# 指定用户读写权限（Give rw access to user shenweiyan）&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 对于目录必须增加 x (执行)权限, 否则无法进入目录&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-m&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;user:shenweiyan:rwx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share

&lt;span class=&#34;c1&#34;&gt;# 再次检查目录 ACL 设置（Check new ACL settings for the directory）&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;getfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#34;setfacl-m-user&#34; src=&#34;https://gi.weiyan.tech/2024/08/setfacl-m-user.webp&#34; /&gt;    &lt;br /&gt;
在上方的截屏中，通过输出结果的第二行 getfacl 命令可以发现，用户 shenweiyan 已经成功的被赋予了 /data/share 目录的读写权限。&lt;/p&gt;
&lt;p&gt;如果想要获取 ACL 列表的更多信息。请参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.tecmint.com/set-access-control-lists-acls-and-disk-quotas-for-users-groups/&#34;&gt;如何使用访问控制列表（ACL）为用户/组设置磁盘配额&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/&#34;&gt;如何使用访问控制列表（ACL）挂载网络共享&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;14-删除-acl-权限&#34;&gt;1.4. 删除 ACL 权限&lt;a class=&#34;headerlink&#34; href=&#34;#14-删除-acl-权限&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果用户名（组名）已经删除，可以使用 UID（GID）进行删除。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-x&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;u:用户名&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;文件名&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 删除指定用户的 ACL 权限&lt;/span&gt;
setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-x&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;g:组名&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;文件名&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 删除指定组的 ACL 权限 &lt;/span&gt;
setfacl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-b&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;文件名&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 删除文件下所有的 ACL 权限 &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;2-用户组权限设置&#34;&gt;2. 用户组权限设置&lt;a class=&#34;headerlink&#34; href=&#34;#2-用户组权限设置&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;21-变更属组&#34;&gt;2.1. 变更属组&lt;a class=&#34;headerlink&#34; href=&#34;#21-变更属组&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果用户已经拥有了默认的用户组（通常组名与用户名相同），就可以简单的通过变更文件夹的所属用户组来完成。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chgrp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shenweiyan&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;share&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;另外，我们也可以通过以下方法为多个用户（需要赋予指定目录读写权限的）新建一个用户组。如此一来，也就创建了一个共享目录。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;groupadd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dbshare&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;22-把用户添加到属组&#34;&gt;2.2. 把用户添加到属组&lt;a class=&#34;headerlink&#34; href=&#34;#22-把用户添加到属组&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;接下来将用户 &lt;code&gt;shenweiyan&lt;/code&gt; 添加到 &lt;code&gt;dbshare&lt;/code&gt; 组中：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# add user to projects&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;usermod&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aG&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dbshare&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shenweiyan&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# check users groups&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;groups&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tecmint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;23-变更属组&#34;&gt;2.3. 变更属组&lt;a class=&#34;headerlink&#34; href=&#34;#23-变更属组&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;将目录的所属用户组变更为 &lt;code&gt;dbshare&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chgrp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;projects&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;share&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;24-设置组员权限&#34;&gt;2.4. 设置组员权限&lt;a class=&#34;headerlink&#34; href=&#34;#24-设置组员权限&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;现在，给组成员设置读写权限。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chmod&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-R&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0760&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share

&lt;span class=&#34;c1&#34;&gt;# check new permissions&lt;/span&gt;
$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ls&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/data/share
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ok，在 Linux 上给用户赋予指定目录的读写权限就介绍到这里 ！&lt;/p&gt;
&lt;h2 id=&#34;3-参考资料&#34;&gt;3. 参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#3-参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;高延斌，《&lt;a href=&#34;https://www.ibm.com/developerworks/cn/linux/l-acl/index.html&#34;&gt;Linux ACL 体验&lt;/a&gt;》，IBM Developer&lt;/li&gt;
&lt;li&gt;Mr-Ping，《在 Linux 上给用户赋予指定目录的读写权限》，Linux 中国&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;9&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/tech/discussions-9/</link>
      <pubDate>Mon, 23 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/tech/discussions-9/</guid>
      
    </item>
    
    <item>
      <title>Python 导出公众号文章为 Markdown</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;记录一下个人使用 Python3 爬取个人公众号的所有文章，并把文章保存为 Markdown 格式的一些操作记录，主要介绍一下思路和一些简单的代码。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;前提条件与思路&#34;&gt;前提条件与思路&lt;a class=&#34;headerlink&#34; href=&#34;#前提条件与思路&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;需要登录网页端微信公众号，获取对应 Cookies；&lt;/li&gt;
&lt;li&gt;通过获取的 Cookies 爬取所有的文章 url 以及其他信息；&lt;/li&gt;
&lt;li&gt;通过文章 url 获取对应文章的 HTML；&lt;/li&gt;
&lt;li&gt;最后，把 HTML 转化为 Markdown。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;之所以选择通过文章公开访问的 url 爬取对应文章的 HTML，而不是直接沿用 Cookies，主要是怕 Cookies 滥用导致其他不可预知的问题，例如封号之类。截止本文章发布前，个人公众号全部已发表的文章大约有 400 多篇，通过这个方法都能正常爬取下来。&lt;/p&gt;
&lt;h2 id=&#34;获取已发表文章数&#34;&gt;获取已发表文章数&lt;a class=&#34;headerlink&#34; href=&#34;#获取已发表文章数&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;登录公众号，按下 F12 打开开发者工具，在 &lt;code&gt;网络&lt;/code&gt; 栏中找到 &lt;code&gt;appmsgpublish&lt;/code&gt; 名称的请求。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看请求地址
  &lt;img alt=&#34;wechat-appmsgpublish-url&#34; src=&#34;https://gi.weiyan.tech/2023/10/wechat-appmsgpublish-url.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取 cookie
  &lt;img alt=&#34;wecaht-cookie&#34; src=&#34;https://gi.weiyan.tech/2023/10/wecaht-cookie.png&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;#注意把 &amp;lt;Your Cookie&amp;gt; 替换成你自己的 cookie&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;Content-type&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;User-Agent&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
           &lt;span class=&#34;s1&#34;&gt;&#39;Cookie&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Your&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Cookie&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;#这个 url 即截图中的请求地址&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&amp;amp;search_field=null&amp;amp;begin=0&amp;amp;count=5&amp;amp;query=&amp;amp;type=101_1&amp;amp;free_publish_type=1&amp;amp;sub_action=list_ex&amp;amp;token=&amp;lt;token&amp;gt;&amp;amp;lang=zh_CN&amp;amp;f=json&amp;amp;ajax=1&#39;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;req_json&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;utf-8&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;req_json&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# total_count 即为已发表文章的总数&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;img alt=&#34;wecaht-posts-total-count&#34; src=&#34;https://gi.weiyan.tech/2023/10/wecaht-posts-total-count.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;获取所有的文章信息&#34;&gt;获取所有的文章信息&lt;a class=&#34;headerlink&#34; href=&#34;#获取所有的文章信息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下程序的 &lt;code&gt;mp.txt&lt;/code&gt; 就是得到的该公众号所有文章信息的列表。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;allPostList&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;420&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;#注意 begin={number}&amp;amp;count=20，即按照每页20篇文章，分页进行爬取&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;#根据测试每页最多只支持20篇文章&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&amp;amp;search_field=null&amp;amp;begin=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;amp;count=20&amp;amp;query=&amp;amp;type=101_1&amp;amp;free_publish_type=1&amp;amp;sub_action=list_ex&amp;amp;token=&amp;lt;token&amp;gt;&amp;amp;lang=zh_CN&amp;amp;f=json&amp;amp;ajax=1&#39;, headers=headers)&#34;&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;posts_list&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;utf-8&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&#39;publish_page&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;publish_list&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;allPostList&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;allPostList&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;posts_list&lt;/span&gt;  
    &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;mp.txt&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;w&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allPostList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;html-to-markdown&#34;&gt;HTML to Markdown&lt;a class=&#34;headerlink&#34; href=&#34;#html-to-markdown&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 导出公众号文章为 Markdown 最后的一步工作就是解析上一步骤得到的 &lt;code&gt;mp.txt&lt;/code&gt; 文件，然后通过 url 去逐一爬取对应的文章 HTML，然后把 Html 转化成 Markdown 即可。&lt;/p&gt;
&lt;p&gt;这些步骤都很简单，网上搜一下就有一大堆教程，感兴趣的可以去搜一下，这里文章就不写了。 &lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;7&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-7/</link>
      <pubDate>Thu, 19 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-7/</guid>
      
    </item>
    
    <item>
      <title>2023年下半年的一些乱弹</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;其实写这边文章，主要是想着测试一下使用了 GitHub Actions 的 mkdocs 触发 Discussions to mkdocs blog posts 的一些效果。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;今天的天气真好啊！阳光明媚，微风拂面，仿佛是一幅美丽的画卷。这样的天气让人心情愉悦，忍不住想要出去走走，感受大自然的美丽。无论是散步还是骑自行车，都是不错的选择。我享受着这美好的一天，也期待着未来更多美好的时光。&lt;/p&gt;
&lt;p&gt;从 11 月起，公司也好，家庭也罢，陆陆续续的一些事情让生活变得此起彼伏。缺乏了一些码字的动力，整个人变得有点沮丧，空洞夹杂着混沌的状态让整个人都很显得颓废。生活需要激情，希望接下来的 12 月能回归一个更好的状态吧！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;6&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-6/</link>
      <pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-6/</guid>
      
    </item>
    
    <item>
      <title>友情链接</title>
      
      
        
      <author>shenweiyan</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-10-16&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-10-16T00:00:00+00:00&#39;&gt;2023-10-16&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2026-03-18&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2026-03-18T00:00:00+00:00&#39;&gt;2026-03-18&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;style&gt;
.md-typeset .grid{grid-template-columns: repeat(auto-fit, minmax(12rem, 5fr))}
.md-sidebar--primary:is([hidden]) ~ .md-content:not(.md-content--post){margin-left: 5px;}
.md-content__inner a{font-size:14px;font-weight:700}
.md-typeset img{margin: 0 5px 0 0 !important;width: 48px;height: 48px;float:left;}
.md-typeset ul li p:last-of-type {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;}
&lt;/style&gt;

&lt;blockquote&gt;
&lt;p&gt;每一个独立博客都是一个信息孤岛。我们没有类似「你可能喜欢其他人写的这些文章」的推荐机制，所以除了搜索引擎、社交网络引荐之外，我们应该还需要通过某种方法将这些信息孤岛连接起来：&lt;strong&gt;交换友情链接就是一种很棒的架桥方式。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;社交就是不断认识新的人、结交新的朋友，而友链也正是这样一种很棒的交朋友的方式，作为一个不太善于言辞的技术人，我希望结交更多的朋友，来丰富我的社交，一起成长。&lt;/p&gt;
&lt;h2 id=&#34;站点信息&#34;&gt;站点信息&lt;a class=&#34;headerlink&#34; href=&#34;#站点信息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;申请前记得先添加本站哦&lt;/strong&gt;，站点信息如下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;站点名称: 维燕的数字花园&lt;/li&gt;
&lt;li&gt;站点链接: &lt;a href=&#34;https://shenwy.com&#34;&gt;https://shenwy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;站点头像: &lt;a href=&#34;https://shenwy.com/assets/logo.png&#34;&gt;https://shenwy.com/assets/logo.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;站点描述: BioIT 爱好者，沉淀生活，记录点滴。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;交换友链&#34;&gt;交换友链&lt;a class=&#34;headerlink&#34; href=&#34;#交换友链&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;想和我交换友链的，没啥特别需求，只是希望你的博客有足够多的&lt;strong&gt;原创&lt;/strong&gt;、&lt;strong&gt;有意义&lt;/strong&gt;的内容，并且建站已满半年。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不接受商业性或包含侵入性广告的站点。&lt;/li&gt;
&lt;li&gt;那种塞满了转载文章的采集站点暂时不考虑。&lt;/li&gt;
&lt;li&gt;非常反感很多论坛上动不动就来交换友链的帖子，如果是出于 SEO 的一些目的来交换友链其实是没什么意义的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;友链说明&#34;&gt;友链说明&lt;a class=&#34;headerlink&#34; href=&#34;#友链说明&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如需申请，在下方评论区提供你的「博客名称」和「博客地址」即可。或者参考以下格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;博客名称：xxxxx&lt;/li&gt;
&lt;li&gt;博客地址：https://xxxx.com&lt;/li&gt;
&lt;li&gt;博客介绍：xxxxxxxx&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;友情站点&#34;&gt;友情站点&lt;a class=&#34;headerlink&#34; href=&#34;#友情站点&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下站点按照添加的时间顺序排列。&lt;/p&gt;
&lt;div class=&#34;grid cards&#34;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://avatars.githubusercontent.com/u/105262243&#34; /&gt; &lt;a href=&#34;https://jiaoyuan.org/&#34;&gt;&lt;strong&gt;JiaoYuan&amp;rsquo;s blog&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;思绪来得快去得也快，偶尔会在这里停留。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://avatars.githubusercontent.com/u/37357188&#34; /&gt; &lt;a href=&#34;https://blog.1874.cool&#34;&gt;&lt;strong&gt;1874’s Blog&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有粤语歌就不会有世界末日。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://avatars.githubusercontent.com/u/97662597&#34; /&gt; &lt;a href=&#34;https://xxu.do/&#34;&gt;&lt;strong&gt;Jayden&amp;rsquo;s site&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为天地立心，为生民立命，为往圣继绝学，为万世开太平。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shitao5.org/logo.png&#34; /&gt; &lt;a href=&#34;https://shitao5.org/&#34;&gt;&lt;strong&gt;Shitao Wu | 吴诗涛&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;喜欢捣鼓电脑，UseR，喜欢&lt;a href=&#34;https://shitao5.org/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/&#34;&gt;阅读&lt;/a&gt;，重度使用 Kindle。甘愿做一个平庸的人，走在成为我自己的道路上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://douchi.sfo3.cdn.digitaloceanspaces.com/blog/dino_statict.png&#34; /&gt; &lt;a href=&#34;https://blog.douchi.space/&#34;&gt;&lt;strong&gt;椒盐豆豉&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个写了二十年博客，现居美国西雅图的女博主+码农。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://uioqps.github.io/me.jpg&#34; /&gt; &lt;a href=&#34;https://uioqps.github.io/&#34;&gt;&lt;strong&gt;Pepper 的博客&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;生命留给有价值的事物才能创造价值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://avatars.githubusercontent.com/u/69741445&#34; /&gt; &lt;a href=&#34;https://wanjinhu.github.io/&#34;&gt;&lt;strong&gt;Wanjin Hu (胡万金)&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;思考人生，探索世界，知行合一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://pica.zhimg.com/80/v2-74ecd899c7c4cc0258930eaff239a21b_1440w.webp&#34; /&gt; &lt;a href=&#34;https://wcowin.work/&#34;&gt;&lt;strong&gt;Wcowin&amp;rsquo;s Blog&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;循此苦旅，以达星辰。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://avatars.githubusercontent.com/u/117809044&#34; /&gt; &lt;a href=&#34;https://goslion.eu.org/&#34;&gt;&lt;strong&gt;Goslion 的博客&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个专注技术与写作的个人博客，记录日常与技术。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://www.boyouquan.com/assets/images/sites/logo/logo-small.svg&#34; /&gt; &lt;a href=&#34;https://www.boyouquan.com/home&#34;&gt;&lt;strong&gt;博友圈&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;博客人的朋友圈，将一个个散落在各处的孤岛连接成一片广袤无垠的新大陆！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://hongjun.vip/assets/avatar.png&#34; /&gt; &lt;a href=&#34;https://hongjun.vip/&#34;&gt;&lt;strong&gt;极简主义&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文档即产品。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;5&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/flinks/</link>
      <pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/flinks/</guid>
      
    </item>
    
    <item>
      <title>专题类知识文档</title>
      
      
        
      <author>沈维燕</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-07-24&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-07-24T00:00:00+00:00&#39;&gt;2023-07-24&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-07-24&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-07-24T08:08:08+00:00&#39;&gt;2023-07-24&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这是作者关于特定方向的专题类的文档，如 Galaxy Project、Rocky Linux 等。目前正在努力更新中。&lt;/p&gt;
&lt;h2 id=&#34;galaxy-project&#34;&gt;Galaxy Project&lt;a class=&#34;headerlink&#34; href=&#34;#galaxy-project&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Galaxy Project has produced numerous open source software offerings to help you build your science analysis infrastructure. Our software covers the gamut from helping you integrate new software into our platform, to a production-ready engine to run those programs in complex MapReduce workflows.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;galaxyproject&#34; src=&#34;https://kg.weiyan.tech/2025/03/galaxyproject.jpg&#34; /&gt;&lt;/p&gt;</description>
      <link>https://shenwy.com/topic/</link>
      <pubDate>Mon, 24 Jul 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/</guid>
      
    </item>
    
    <item>
      <title>Galaxy Project 文档</title>
      
      
        
      <author>章鱼猫先生</author>
        
      
      
      
      <description>&lt;div class=&#39;document-dates-plugin-wrapper document-dates-top&#39;&gt;&lt;div class=&#39;document-dates-plugin&#39; locale=&#39;&#39;&gt;&lt;div class=&#39;dd-left&#39;&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-07-24&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_created&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-07-24T00:00:00+00:00&#39;&gt;2023-07-24&lt;/time&gt;&lt;/span&gt;&lt;span class=&#39;dd-item&#39; data-tippy-content data-tippy-raw=&#39;2023-07-24&#39;&gt;&lt;span class=&#39;material-icons&#39; data-icon=&#39;doc_updated&#39;&gt;&lt;/span&gt;&lt;time datetime=&#39;2023-07-24T08:08:08+00:00&#39;&gt;2023-07-24&lt;/time&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Galaxy Project 中文版本文档。目前正在努力更新中。&lt;/p&gt;</description>
      <link>https://shenwy.com/topic/galaxy/</link>
      <pubDate>Mon, 24 Jul 2023 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/topic/galaxy/</guid>
      
    </item>
    
    <item>
      <title>2020 年年终总结</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2020 年，是一个不平凡的一年，在这里一年里，我们经历了新冠，见证了嫦五，看到动荡和不安，有经济熔断，有球王陨落，名人远去，有感动有泪水，我们也有收获。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;-工作&#34;&gt;✍️ 工作&lt;a class=&#34;headerlink&#34; href=&#34;#-工作&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作为一个科学民工，2020 年的工作重心依旧停留在 Bio 与 IT 交叉的那几块，集群、Galaxy、生信，闲暇之余记录一下工作生活中的点滴，有经验有吐槽，平淡而又繁杂。&lt;/p&gt;
&lt;h2 id=&#34;-生活&#34;&gt;😂 生活&lt;a class=&#34;headerlink&#34; href=&#34;#-生活&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这一年更多的精力放在了家庭，入户、社保、带娃，磕磕碰碰之中更加感受到琐事之于工作的一些无奈。但总相信，这个世界里美好总要多过阴暗，欢乐总要多过苦难，还有很多事，值得我们一如既往的相信。&lt;/p&gt;
&lt;p&gt;2020 年最值得自豪的是，还有一个自己喜欢而且能一直坚持下来的运动——羽毛球。在新的场馆认识了另外一拨有着同样兴趣的球友，这样已经很满足！
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmnD0ZMG0bgeW5W0GC64NBkK3A_c.webp&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;-公众号&#34;&gt;✒️ 公众号&lt;a class=&#34;headerlink&#34; href=&#34;#-公众号&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;分享是一种态度，2020 年，我们不离不弃，在 &lt;strong&gt;“BioIT 爱好者” &lt;/strong&gt;公众号一共推出 &lt;strong&gt;39&lt;/strong&gt; 篇原创文章。&lt;/p&gt;
&lt;p&gt;这些文章，有生信的学习笔记，有集群服务器的运维经历，也有编程与可视化的一部分记录，甚至还有一部分热点与趣闻相关的科普。&lt;/p&gt;
&lt;p&gt;这一年，公众号综合了语雀、博客、简书、CSDN 推送了不少其他作者贡献的优秀文字，源于热爱，源于分享，特别感谢给我们公众号贡献了这些优秀原创文章的可爱作者们：&lt;strong&gt;南希修炼中&lt;/strong&gt;，&lt;strong&gt;小潤澤&lt;/strong&gt;，&lt;strong&gt;biobin&lt;/strong&gt;，&lt;strong&gt;佳名&lt;/strong&gt;，......，同样也要感谢一路支持我们公众号可爱读者们，正是因为你们，我们更有动力。&lt;/p&gt;
&lt;h2 id=&#34;2020-原创文章&#34;&gt;▌2020  原创文章&lt;a class=&#34;headerlink&#34; href=&#34;#2020-原创文章&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247490492&amp;amp;idx=1&amp;amp;sn=e55930b64a89f0c1c5e25b4482d7e0ca&amp;amp;chksm=fba078ecccd7f1fa9e58713becaef4374f08c68c79b8c92e55bf1a7b62afb128cac878c92f72&amp;amp;scene=21#wechat_redirect&#34;&gt;使用 coding.net 发布你的个人博客&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247490302&amp;amp;idx=1&amp;amp;sn=56e5adc3d71ec248d8004b9d8a8bfd3e&amp;amp;chksm=fba079aeccd7f0b8294dd5930b09591196a6f7769c6b12042cb3af34841b5ba24978f9f8b052&amp;amp;scene=21#wechat_redirect&#34;&gt;测序数据学习笔记：bcl2fastq 安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489077&amp;amp;idx=1&amp;amp;sn=a7b5c17cb160936a91ef3091c7f2ae78&amp;amp;chksm=fba07565ccd7fc733006dc8d2a45d0563225c4eecd1b2de785d2c0a8c5c72f94432a81af2eb0&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy Release_20.09 发布，新增多个数据上传组件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488605&amp;amp;idx=1&amp;amp;sn=94afff662d98c7dd7669b70343e5d1c4&amp;amp;chksm=fba0770dccd7fe1b6573f3569b424eb8469fceb1ef9021006e4ce8a1121f3f0cbd2ce80f4515&amp;amp;scene=21#wechat_redirect&#34;&gt;一次 HPC 病毒感染与解决经历&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488558&amp;amp;idx=1&amp;amp;sn=c9641424f2239ebd9b39bb076a3cd51c&amp;amp;chksm=fba0777eccd7fe6896fc4eceac70d0603a78abc9699c2a556425a22fc8e3522df3da5c727348&amp;amp;scene=21#wechat_redirect&#34;&gt;腾讯云 cloudbase 云开发使用笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488460&amp;amp;idx=1&amp;amp;sn=ad230f0a2eeae7ee0429f033a936cf1e&amp;amp;chksm=fba0709cccd7f98a278ff5971dd19cea6131a97fccf05e9f45f322213cd2077da3fa5390c9cd&amp;amp;scene=21#wechat_redirect&#34;&gt;JupyterLab Server 搭建与使用笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488233&amp;amp;idx=1&amp;amp;sn=a40f395860bede8dd8d23cca0cc32127&amp;amp;chksm=fba071b9ccd7f8af0519955aa0ec99ed729f6491478d6db6567c080ca6ec248167d250f46663&amp;amp;scene=21#wechat_redirect&#34;&gt;R 语言中 X11 相关的一些问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488186&amp;amp;idx=1&amp;amp;sn=78a3e7ede7c288bd17216c7435e8a048&amp;amp;chksm=fba071eaccd7f8fc71527d90b3bc3bed9c11fcfa20681163d4d3020d4948a35a0e6c3a84826c&amp;amp;scene=21#wechat_redirect&#34;&gt;Linux 中多终端同步 history 记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488136&amp;amp;idx=1&amp;amp;sn=bdf46a2bd8139cc0e3adb47d9391171b&amp;amp;chksm=fba071d8ccd7f8ce7f910ea131ee10c58f534320fed2638ed42eadc8e2bf42c15e9a9ce196dd&amp;amp;scene=21#wechat_redirect&#34;&gt;一个小清新的知识管理和问题讨论平台&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488125&amp;amp;idx=1&amp;amp;sn=f42316431342f9f4d9fc334f5c660c5c&amp;amp;chksm=fba0712dccd7f83b5eaa03ae44f1e757cb69af0287cefa9a02d7524decc147e0c40080523931&amp;amp;scene=21#wechat_redirect&#34;&gt;在 RedHat 使用 gdc-client 下载 TCGA 数据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488084&amp;amp;idx=1&amp;amp;sn=f29255cac3760e0a4404d77e4853d8e6&amp;amp;chksm=fba07104ccd7f8127291964b39160a3b9e23b1fc55c9094a63cfe3ec685adcb3ce50ae11786b&amp;amp;scene=21#wechat_redirect&#34;&gt;一个小团队使用的知识管理方案与工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488075&amp;amp;idx=1&amp;amp;sn=2ad4698e58eb5bf54168300c7be605d5&amp;amp;chksm=fba0711bccd7f80dfb867909c997c4cbaa2a2de8a2c9c154d1ffcf975adf7503b778e7ae2789&amp;amp;scene=21#wechat_redirect&#34;&gt;推荐一部青春搞笑悬疑电竞网络剧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247487249&amp;amp;idx=1&amp;amp;sn=6756ba0c88fc3661212e4dbaaa09a6b2&amp;amp;chksm=fba06c41ccd7e557a4d4825bf7dc6c2ad5e4b5583a2b8a316bc4247ca51f1de8f1c69561bbb4&amp;amp;scene=21#wechat_redirect&#34;&gt;吐槽 | 聊一聊公众号的那些事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247487240&amp;amp;idx=1&amp;amp;sn=4a7253f0daee2973455538614d491a35&amp;amp;chksm=fba06c58ccd7e54e9214df65dcdc4c4d0c29d27605b0433991ea45692d9d055d8a05f520816b&amp;amp;scene=21#wechat_redirect&#34;&gt;ImageMagick 图像处理学习笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247486927&amp;amp;idx=1&amp;amp;sn=183e1f3973bc3872cf4da8e343c409da&amp;amp;chksm=fba06e9fccd7e789eaf94865f1dadfcaeef20f56ffee1514e765820acd7dc0071ef7f9012382&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy Release 20.05 发布，新增多项可视化体验&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485861&amp;amp;idx=1&amp;amp;sn=8ed6241c76299f59d42126cf5699f96e&amp;amp;chksm=fba06af5ccd7e3e304d7ee0713e8d068854cff8fa077ca46036e7a7a3efd89154e9dd304396b&amp;amp;scene=21#wechat_redirect&#34;&gt;一款强大而实用的图片去水印神器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485842&amp;amp;idx=1&amp;amp;sn=842a25b308ea697c058b240470268ad1&amp;amp;chksm=fba06ac2ccd7e3d4806f52b9d914d064ff3af70ce852292aae8c93aff4603a3a3a622a0af198&amp;amp;scene=21#wechat_redirect&#34;&gt;在 Linux 和 Windows 下源码安装 Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485818&amp;amp;idx=1&amp;amp;sn=e2efffb5d3745def43847ffa57fdd99c&amp;amp;chksm=fba06a2accd7e33ce6149be9d20d51ebf2b2bcc5cef3bd8591b44ffabe6e24f2efa3979c2689&amp;amp;scene=21#wechat_redirect&#34;&gt;R 语言关于 SSL 证书异常处理笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485564&amp;amp;idx=1&amp;amp;sn=38b4e3598a79b03c5f684f6612a18200&amp;amp;chksm=fba06b2cccd7e23a49cde605dc7971436ae437a3779634c53a0dafdb57127c16d59f649c6218&amp;amp;scene=21#wechat_redirect&#34;&gt;生信服务器入门级基本设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485442&amp;amp;idx=1&amp;amp;sn=93a19d57b7d6e571fe5353e7613caadc&amp;amp;chksm=fba06b52ccd7e244053576516e64235090a8c3ea556c4b76fa876a3b334d3d077466533cb628&amp;amp;scene=21#wechat_redirect&#34;&gt;如何在 5 分钟内建立一个数据驱动的新型冠状病毒肺炎应用程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485426&amp;amp;idx=1&amp;amp;sn=4a73eea4b3545f31305c95bd4491af12&amp;amp;chksm=fba064a2ccd7edb4d63adc1aefe82d62365a3b132de865ade9e30739076b33544d2a96da84b5&amp;amp;scene=21#wechat_redirect&#34;&gt;顶级生物信息学 RSS 订阅源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485163&amp;amp;idx=1&amp;amp;sn=47fa496e9006bc7bef2cb631392eedee&amp;amp;chksm=fba065bbccd7ecadb587a04d8234298ac1bbc14a22a65ccf6e6ebfce4da08c91c888199d91c8&amp;amp;scene=21#wechat_redirect&#34;&gt;使用镜像加速 Rtools 下载与安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485120&amp;amp;idx=1&amp;amp;sn=fd89b8e93da6f0f37a4a6bd8aafb7c57&amp;amp;chksm=fba06590ccd7ec86c07582be02d0c3fc1ed0fa0415d69ae70fbb545881d109ea013e3c2085a2&amp;amp;scene=21#wechat_redirect&#34;&gt;ggplot2 调整绘图区域大小&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485097&amp;amp;idx=1&amp;amp;sn=c393c45211ad691721f4a8946f30cee4&amp;amp;chksm=fba065f9ccd7ecefbfd3af178fa2a61f37e683989b6561bd6896a41f7722cbc3fc0ff1d06f38&amp;amp;scene=21#wechat_redirect&#34;&gt;远程挂载 NFS 共享目录引发死机问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485085&amp;amp;idx=1&amp;amp;sn=ea674d20ebd3a321f6a0d238f09bcd87&amp;amp;chksm=fba065cdccd7ecdbafae87ef5a9adf63344c3eee699a9d8c008083c19afc02ee70fc4fecb8c0&amp;amp;scene=21#wechat_redirect&#34;&gt;如何卸载 python setup.py install 安装的包？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484830&amp;amp;idx=1&amp;amp;sn=c0ae8fb0543428766c8dc6a0f0a69fb8&amp;amp;chksm=fba066ceccd7efd8652730be5b3ae6bc22134c485d80337c0ea1ed16d7620b9d8192bda5fc14&amp;amp;scene=21#wechat_redirect&#34;&gt;小技巧 | 使用 mv 重命名文件无需两次键入文件名称&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484815&amp;amp;idx=1&amp;amp;sn=be6e85f20d163a80a9f62b896b0d1afb&amp;amp;chksm=fba066dfccd7efc9294b0f754ff0cb74500bd4456e7e75c3ea8163e7aacb6428356691297182&amp;amp;scene=21#wechat_redirect&#34;&gt;clusterProfiler 的 GO/KEGG 富集分析用法小结&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484801&amp;amp;idx=1&amp;amp;sn=9798979c2c36f743aca214aa4a440bdd&amp;amp;chksm=fba066d1ccd7efc79d0087194e2633e65f4bab2a886c0d86db26c56337bb42dff06af8587936&amp;amp;scene=21#wechat_redirect&#34;&gt;R 语言绘制环状热图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484795&amp;amp;idx=1&amp;amp;sn=d5f6de4a47e4a3bb593a8edcde395138&amp;amp;chksm=fba0662bccd7ef3d3347acd8a076e1716a6fb2c9347eea5819d8cedf240d787f4ebfcd936e2b&amp;amp;scene=21#wechat_redirect&#34;&gt;温故而知新，ggplot2 饼图的几点笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484785&amp;amp;idx=1&amp;amp;sn=19f73fd6d772278ae3db90c600f32f81&amp;amp;chksm=fba06621ccd7ef37a07606ac05256327a2a9ee3648608bba69dff5448e6d54014e5926d5c9fe&amp;amp;scene=21#wechat_redirect&#34;&gt;预测 motif 的计算原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484759&amp;amp;idx=1&amp;amp;sn=c1f52a21a5e35f230cc5e91a7a3af6ee&amp;amp;chksm=fba06607ccd7ef111061e65718f3a2d5f52c5d77efdd3cd94fd81deab6d7e89a146869ee84df&amp;amp;scene=21#wechat_redirect&#34;&gt;R 语言柱状图示例笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484755&amp;amp;idx=1&amp;amp;sn=8867c1439ab64bd3ef7dded256f042f0&amp;amp;chksm=fba06603ccd7ef1564d7ebe60b53d3b3f129194ff2d8353512ec6324bd330b74453d7b3f0c10&amp;amp;scene=21#wechat_redirect&#34;&gt;UpSetR 关联的 venneuler 包安装笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484726&amp;amp;idx=1&amp;amp;sn=03c9c25b3e27bc9034d37c73cbb24f6c&amp;amp;chksm=fba06666ccd7ef70b743c1f9c89c1c4eee7b5c9cc2844892919c18ffb1043bf35db47748bf2b&amp;amp;scene=21#wechat_redirect&#34;&gt;R 语言画图中英文字体解决方案&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489358&amp;amp;idx=1&amp;amp;sn=7c22a5037028a0ca719b469671e33338&amp;amp;chksm=fba0741eccd7fd08e25edd0fea1aa45e1ca027b1b58f3df08c937c5df2d611f9f02c7e46ec63&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy 生信平台(四)：邮件与管理员配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484698&amp;amp;idx=1&amp;amp;sn=333b4b6ed240ff1a5807cf22c57403ce&amp;amp;chksm=fba0664accd7ef5c3e37025f98c84177c54c5ff17062f29cd80bdb083af214bda2e17acd1806&amp;amp;scene=21#wechat_redirect&#34;&gt;一款英文文章阅读翻译精品工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484675&amp;amp;idx=1&amp;amp;sn=d61412eac916fcfd8a6fc1014d04225b&amp;amp;chksm=fba06653ccd7ef453a0501799139de1a2dfc774fe44f21e257ea70dec7fdeecb301f55790aa5&amp;amp;scene=21#wechat_redirect&#34;&gt;QQ 邮箱设置自定义域名邮箱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484663&amp;amp;idx=1&amp;amp;sn=39d591ff27eddc19fed6f88d73072b87&amp;amp;chksm=fba067a7ccd7eeb197de199c2e2be1981a84184871fe0bc26dc7b4fb90a8cd3c60de2802c14e&amp;amp;scene=21#wechat_redirect&#34;&gt;吐槽一下微信公众号的赞赏号&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484644&amp;amp;idx=1&amp;amp;sn=357e7249e3360d5fccba268662686b2c&amp;amp;chksm=fba067b4ccd7eea27dbe1f446d914502d06d07471ca6eaa62aab03bdaa97ad9c27390a501873&amp;amp;scene=21#wechat_redirect&#34;&gt;R EnhancedVolcano 绘制火山图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484637&amp;amp;idx=1&amp;amp;sn=6621ed0c5c9d8f4b69d4231080f75d49&amp;amp;chksm=fba0678dccd7ee9b9fc9a904baddc09eae33e59e4423ad483cb11e3688d1322efdc0f4cd68f4&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy 生信平台(三)：xlsx 上传与识别&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2020-图文消息&#34;&gt;▌2020  图文消息&lt;a class=&#34;headerlink&#34; href=&#34;#2020-图文消息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489984&amp;amp;idx=1&amp;amp;sn=75ccf473af2248e533d560931b015fe9&amp;amp;chksm=fba07a90ccd7f386d2b929f09540154292a1ab49b428b721e94486a699d31616d841e43afae6&amp;amp;scene=21#wechat_redirect&#34;&gt;一个  coding.net 的  DevOps 全流程操作任务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489358&amp;amp;idx=1&amp;amp;sn=7c22a5037028a0ca719b469671e33338&amp;amp;chksm=fba0741eccd7fd08e25edd0fea1aa45e1ca027b1b58f3df08c937c5df2d611f9f02c7e46ec63&amp;amp;scene=21#wechat_redirect&#34;&gt;安利一个 10 个月的语雀个人会员 VIP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489354&amp;amp;idx=1&amp;amp;sn=94e248edb52d78829dcd5f084d9bdb3b&amp;amp;chksm=fba0741accd7fd0c28618a5254df2b4bc00f72644f3c44dbff95965e902b37d0fbd0737a703a&amp;amp;scene=21#wechat_redirect&#34;&gt;发现了阿里云 OSS 对象存储的一个小 BUG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247489081&amp;amp;idx=1&amp;amp;sn=ee1d602e5fd3d8c8349ddd9c165ed4b8&amp;amp;chksm=fba07569ccd7fc7fdfd35f8005504909758f3ed480c0cab200ba7c9d9b537223a1104443eef1&amp;amp;scene=21#wechat_redirect&#34;&gt;感谢 preprocessCore 原作者的热心帮助&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488219&amp;amp;idx=1&amp;amp;sn=f9ac5f95747bd66f27ddfa8a2526d6b0&amp;amp;chksm=fba0718bccd7f89de6306984abc25ea07b4dca2b953e991245be4f1997ef4748c940c76670ce&amp;amp;scene=21#wechat_redirect&#34;&gt;云筏服务器 + Galaxy Project 的一些体验&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247488177&amp;amp;idx=1&amp;amp;sn=9644b7f3b4119932db23382c30023129&amp;amp;chksm=fba071e1ccd7f8f774fa31afa6c668009d7ed5a972a975ba90e3cb6a9a5b5891b5d9ce94df13&amp;amp;scene=21#wechat_redirect&#34;&gt;htop 和 bashtop 资源监视工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247486934&amp;amp;idx=1&amp;amp;sn=10b6fd37b5b7ec2437410b02124ca68d&amp;amp;chksm=fba06e86ccd7e79090126a77a08d5924b46b641413614d48daa668adee702299aab808d3d081&amp;amp;scene=21#wechat_redirect&#34;&gt;Ensembl API 发现官网 MySQL server 异常&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485800&amp;amp;idx=1&amp;amp;sn=7d44b605586ff3a008a02831dbfdd0d5&amp;amp;chksm=fba06a38ccd7e32ead1f34d5cd4b1fa8c30df3ae3536585fb0705c104e537308699dfb5c52ce&amp;amp;scene=21#wechat_redirect&#34;&gt;GitHub 经常看到 &amp;ldquo;WIP&amp;rdquo; 的分支是什么意思&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485796&amp;amp;idx=1&amp;amp;sn=83c1d3f2f299455c95dea3fbe101efe2&amp;amp;chksm=fba06a34ccd7e322deba4560aab4492e2b6deb015c8549d8a6f52c09e85f796cc8fd0b2a4f5c&amp;amp;scene=21#wechat_redirect&#34;&gt;推特用户做了一个实验，特拉普发什么推特，他就发一样的内容&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485702&amp;amp;idx=1&amp;amp;sn=51ca55510cb9fdaf0755b0ad4c726660&amp;amp;chksm=fba06a56ccd7e3409df83535d6c27c172b19bd471bf96396e2377e05386d83fa4ca7d4308055&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy Project 每个人都可以参与，并提交 PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247485480&amp;amp;idx=1&amp;amp;sn=b4a36078016c1c44006f9f4273291825&amp;amp;chksm=fba06b78ccd7e26e25abe221a2a1c865f4a9084b4ce8415d290ce20d5cf5178f3fc65d5f7673&amp;amp;scene=21#wechat_redirect&#34;&gt;Galaxy Project 开启无需重启持续开发和运维设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzU1MDQwMTU5OQ==&amp;amp;mid=2247484892&amp;amp;idx=1&amp;amp;sn=d21ca4504eb6a544de89c8328a8bf2c3&amp;amp;chksm=fba0668cccd7ef9a2e344128672d48b999ab6db69ffd7c8c6389d4141976a46d456f64683902&amp;amp;scene=21#wechat_redirect&#34;&gt;NAR  上关于 Galaxy 平台在几个独立面上的最新发展&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公众号运营从来都不是一件容易的事情，尤其在追求流量的今天，更不用目前只有一个人在运营的公众号。2020 年，做了一些公众号推广，有人的地方就有江湖，在公众号这个江湖里，做了一些妥协，但不忘初心：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商业化已经改变了写作的初衷。&lt;/li&gt;
&lt;li&gt;当写文章变成盈利的手段，那么，写出来的东西是没有灵魂的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;人在看不见你更期望的路标时总是会变得消极。2021 年尚需更加努力，如果借用熊老师在 &amp;ldquo;素材学习分享周刊&amp;rdquo; 的三句话来总结一下今年，你的 2020 又是怎么样的呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;今年我最大的收获是/最开心的是？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;今年我最遗憾的是？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;此时的我想对一年前的自己说什么？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;141&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-141/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-141/</guid>
      
    </item>
    
    <item>
      <title>2021 中秋之行</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2021 年的中秋跟以往有点不一样，没有和国庆连在一起而是中间隔了将近一周多的时间。因此，对有些人九月份的假期安排可能有些尴尬。但是，对于不喜欢假期的我，还算不错。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnCWM4YstHfatKu0YpuzFSmH4IvO.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;出发前&#34;&gt;出发前&lt;a class=&#34;headerlink&#34; href=&#34;#出发前&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;差不多一个月前就收到了岳父岳母的提醒：今年中秋前后老家新房子入住，回家一趟。所以，今年的中秋基本没有什么额外的 Plan B，就是回家，回家，回家！&lt;/p&gt;
&lt;p&gt;到了回家前一周（12 号）前后才最终确定新屋最终入住的日期，于是把回家时间成了 16 号返程，19 号回来。&lt;/p&gt;
&lt;p&gt;于是，开始请假、约车、确定回去的人、收拾东西、准备红包等等。怕小孩子在家里无所事事还专门给她下了好几部动画片（现在回想起来还真有点想多了），甚至把她最喜欢的几个玩具都带上了！&lt;/p&gt;
&lt;h2 id=&#34;出发&#34;&gt;出发&lt;a class=&#34;headerlink&#34; href=&#34;#出发&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;16 号一大早，坐上小舅子的车，一路狂奔，踏上归程。早 7:30 出发到下午 14:00 左右，终于回到。&lt;/p&gt;
&lt;h2 id=&#34;月是故乡圆&#34;&gt;月是故乡圆&lt;a class=&#34;headerlink&#34; href=&#34;#月是故乡圆&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;回家的头天，除了认人打招呼就是准备晚上的入住。&lt;/p&gt;
&lt;p&gt;顾不上归途的疲累，一切感觉还很新鲜。欣慰的是小孩子终于找到可以一起玩的小伙伴，对她来说这一次的回来，是会说话会走路后第一次回家见外公外婆，虽然认生，但总归是开心的。
&lt;img alt=&#34;6e3304f3d1c9307d33647f1f2fbf4eb.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhMKTJ5jWZuvc5QUAUQspIhUeIO5.jpeg&#34; /&gt;&lt;img alt=&#34;e54572ebca3f235bf52509c67ceb6d7.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fpj8sXMzXA8PhwWdDCHCEU96J7RH.jpeg&#34; /&gt;
挂大红花球、贴对联粘利是，凌晨 12 点 10 分整，新房子入住。老家的新房子入住很讲究仪式，拿锅、抬桌子、挑水、挑担、......，也算是再一次见识了。&lt;/p&gt;
&lt;p&gt;第二天的入伙宴，认人打招呼、接待、聊天，真心是身心疲惫、忙碌又热闹的一天，整个人都快累趴了。&lt;/p&gt;
&lt;p&gt;第三天，吃吃喝喝，终于可以歇歇！
&lt;img alt=&#34;0f97b4e7203804e514f7d112225e587.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fsn3Zc2v6LTJ5qknKbcwM6DhVJ_4.jpeg&#34; /&gt; &lt;img alt=&#34;efaa0bdb9278004378998c852eae7f0.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnWyIhqzRqlVPLrQH5iUUhLqxS2V.jpeg&#34; /&gt;
第四天，带着一堆孩子浩浩荡荡出来高州县城逛了一天。又折回到现住的家休息了半天（相比老家的闷热，还是这里干净舒服）。
&lt;img alt=&#34;9ae0f51d40605ef0350fa5f1fa18e15.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpUkGIcqmlgmw1gyjCeHlZGj_74y.jpeg&#34; /&gt; &lt;img alt=&#34;465f58f85811452af118257f2ddd0cc.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtFoT_mlS6cKniVfdSALzbsxVf-C.jpeg&#34; /&gt;
第五天，出发上来广州。同车是一个空军维修员的退伍老兵，一路听他讲了很多部队的事情，很是开眼界。&lt;/p&gt;
&lt;p&gt;中秋前的这趟回家，算是极其疲惫的一次。不管怎么说，在家乡看到一些人，经历了一些事。相比城市的喧嚣，农村小县城的安静温馨很能勾起我们一些久远的往事，想起十几年前在一中读书的点滴，想起自己许久未曾回去过的老家，想起自己这些年来的经历，时光飞逝年轻不在，不免心生感叹！&lt;/p&gt;
&lt;p&gt;值得一提的是，在老家接到了过过的电话，说通过了语雀天使计划的复试，后续会有专属礼物和官方认证聘书。除此以外，又收到了 CNGB 寄给我猛犸象信息（这里真心要感谢我曾经的同事小游姐给我送的这个这么有意义的礼物） ，心里很是高兴。&lt;/p&gt;
&lt;p&gt;语雀作为我记录和沉淀生活使用最多的平台，走到今天，我接受了它，它也认可了我，通过语雀天使计划的复试是这个独特中秋佳节的最大惊喜。&lt;/p&gt;
&lt;p&gt;我在 CNGB 从实习到工作呆了 4 年多，认识了一批非常可爱的华大人，度过了一段非常有意义和开心的时光，在这里祝福老东家的小伙伴们中秋节日快乐！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;146&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-146/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-146/</guid>
      
    </item>
    
    <item>
      <title>2021 年年终总结</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;如果说 2021 年发生的大事，除了中国共产党成立 100 周年印象最深，就是这一年来国内疫情的相对平缓——终于可以出门走走了。今天，是 2021 年的最后一天，恰好又是周五，盘点一下这一年自己的点滴。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;工作&#34;&gt;工作&lt;a class=&#34;headerlink&#34; href=&#34;#工作&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;工作上这一年其实也没有什么太多的变化，内容上依然是离不开集群、数据、Galaxy，以及生信。在舒适区呆的久了，一叶障目，对机器学习、自动化部署/运维、药物开发蠢蠢欲动，做了一些尝试，接下来的一年应该会在这些赛道继续深耕吧。&lt;/p&gt;
&lt;h2 id=&#34;生活&#34;&gt;生活&lt;a class=&#34;headerlink&#34; href=&#34;#生活&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这一年终于可以带娃周围走走了，但也仅限于黄埔附近的一亩三分地，总归是快活的。其他人与人之间的琐事磕碰，难免有些想法，回想起来依旧心绪难平，情绪的把控尚需修炼。值得一提的是还清一些贷款，终于又可以轻装上路，继续努力。&lt;/p&gt;
&lt;p&gt;自己喜欢的游戏，终于也有时间时不时的玩上几把了。&lt;/p&gt;
&lt;h3 id=&#34;网易云音乐&#34;&gt;网易云音乐&lt;a class=&#34;headerlink&#34; href=&#34;#网易云音乐&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这一年听得歌不多，偏爱粤语歌曲，用网易云的一句话总结：&lt;strong&gt;灵魂有点靓仔，梦回港风时代！&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;d4879da849c828aae07de0bfb87c0c9.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FoJnkqqI2Wb0NFtYPg2GM24Eda2Y.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;979c9f6c36dc5ad65603f9d4c4f924b.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtjGvFAklQtdJ6m5H5woT2S6Hrgn.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;87ae0b3643ec6c1a5bb56346d36ac64.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtutoJuwALuw8xqLXSs9wXBLT91p.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt=&#34;c4cce7dccb5b6dfd29ba664161cba18.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpizFMVTBnpUXDhRgFCCtZhOgcn5.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;3245b0c783cb345643dc18f83971a97.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FsihbAQCcnMICQKdUHerqvcFkXfa.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;b92cecf95c5240673233906376cf8d6.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FkP1DeRZGPYK3P1bpKk44LIwvP95.jpeg&#34; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt=&#34;da053180b3075d3331e118f70b406a7.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FuRsyBk9sT6JYXKZ6QCk06KN_5dS.jpeg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;写作&#34;&gt;写作&lt;a class=&#34;headerlink&#34; href=&#34;#写作&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;语雀&#34;&gt;语雀&lt;a class=&#34;headerlink&#34; href=&#34;#语雀&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2022-01-10 语雀的年度总结上线。我手写我心，自己消化，自己懵懂，自己释然，语雀好像已经成为了调节负能量的一个途径！
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fv81cCT_LajNLifPkZYSzX3EbYse.png&#34; /&gt;
&lt;img alt=&#34;语雀-2021-1.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtfprxZKomqBzkjwAjGkp5GTuYnD.jpeg&#34; /&gt;
&lt;img alt=&#34;语雀海报.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlGCJIvy7Eln5fzcru4esUqCY7b2.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;公众号&#34;&gt;公众号&lt;a class=&#34;headerlink&#34; href=&#34;#公众号&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;有幸读到陈皓老师的《&lt;a href=&#34;https://www.yuque.com/shenweiyan/articles/qw325a&#34;&gt;&lt;strong&gt;为什么我不在微信公众号上写文章&lt;/strong&gt;&lt;/a&gt;》这篇文章，的确给了我很多的启发，在 2021 年，关于写作这件事情上，想通了不少事情，心态自然而然发生了一些变化，开始变得更加佛系。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;我觉得一个人有一定的影响力，其中有很大一部份原因来自他的独立性，如果我开始写软文了，相当于我把自己卖了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以，我现在从来不通过写文章挣钱，因为我会写代码，我还是通过我的技能挣钱，通过给一些公司做咨询、培训、企业服务挣钱，老实说，靠自己的能力挣钱，比写文章挣钱挣得多多了，因为我觉得，&lt;strong&gt;像我写的这类的文章本来就是用来分享和传播的，不是用来挣钱的。写文章的目的是分享和影响，不是挣钱。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;写作是一种心灵的舞蹈，大多数都是舞给自己看的。&lt;/p&gt;
&lt;p&gt;回到公众号上，今年一共在公众号发了 68 篇推文（包括今天这篇），其中原创的 43 篇，转载的 7 篇，综合性文章 8 篇，图文记录 9 条，外加 1 个视频推文。&lt;/p&gt;
&lt;h4 id=&#34;2021-原创&#34;&gt;2021 原创&lt;a class=&#34;headerlink&#34; href=&#34;#2021-原创&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;生物信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12-17：&lt;a href=&#34;https://mp.weixin.qq.com/s/Cq40vsktvi-9mn2xiH9Dmg&#34;&gt;生物科学数据分析和数据管理本体论&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;11-19：&lt;a href=&#34;https://mp.weixin.qq.com/s/qojN2kYMLq4W_RC7jSyzrg&#34;&gt;Bioconductor 中的 R 包安装教程(续一)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-27：&lt;a href=&#34;https://mp.weixin.qq.com/s/vf5zmFI_ZS1bqrSRHKdz7Q&#34;&gt;Python 获取 NCBI 基因名 SSL 证书异常？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;06-12：&lt;a href=&#34;https://mp.weixin.qq.com/s/xlGyJeukJU_vc4M_39dvXg&#34;&gt;使用 Docker 分析高通量测序数据&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(云)服务器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10-16：&lt;a href=&#34;https://mp.weixin.qq.com/s/u1Dw8_2MzCdyjtci9cwJEQ&#34;&gt;服务器无法登录？教你如何解决 SSH Failed Permission Denied&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;09-30：&lt;a href=&#34;https://mp.weixin.qq.com/s/go0j82Lh6jDcexqmVec4FA&#34;&gt;腾讯云升级 Rocky Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-29：&lt;a href=&#34;https://mp.weixin.qq.com/s/n98ANL3Y1t38ZqWAyqu_dg&#34;&gt;后 CentOS 时代，作为服务器使用我们该选什么 Linux？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-03：&lt;a href=&#34;https://mp.weixin.qq.com/s/8yrs5j3HRBb59FkQIYrllg&#34;&gt;服务器崩溃日志 | 误删 OpenSSL 的那点事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;08-03：&lt;a href=&#34;https://mp.weixin.qq.com/s/hTk0wgb1sUIhsKESNTSbUg&#34;&gt;服务器又中毒了，得治一治！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;07-26：&lt;a href=&#34;https://mp.weixin.qq.com/s/twPGVKsdd7HsRkDQfDv91w&#34;&gt;生信服务器 | 防火墙基本配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;05-27：&lt;a href=&#34;https://mp.weixin.qq.com/s/eNU4YuHqxVY45raiCHXmtA&#34;&gt;生信服务器 | 更改 CentOS/RHEL 6/7 中的时区&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;01-21：&lt;a href=&#34;https://mp.weixin.qq.com/s/kF9_C23UYjjWoDg4fWyQzg&#34;&gt;生信服务器 | Linux 时间戳和标准时间&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静态网站&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12-24：&lt;a href=&#34;https://mp.weixin.qq.com/s/CosiH4w1wCTkc5H9TGGRBA&#34;&gt;腾讯云云开发 Webify 上手体验&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;02-05：&lt;a href=&#34;https://mp.weixin.qq.com/s/pDw6_zgl6wkJgpt6WuyvsA&#34;&gt;阿里云证书 | 套路太深，还是我打开姿势不对？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;01-08：&lt;a href=&#34;https://mp.weixin.qq.com/s/i4obfyd6aJ8HsKdR7cvz3g&#34;&gt;自定义 coding.net 静态网站域名&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;版本控制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12-10：&lt;a href=&#34;https://mp.weixin.qq.com/s/4P2A1zb8VRMg9VYi_QiehQ&#34;&gt;GitHub 代码实时同步 gitee 和 coding&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Galaxy Project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;11-04：&lt;a href=&#34;https://mp.weixin.qq.com/s/C5Av4qz1Vuxx7EBevDGyug&#34;&gt;Galaxy Release (v 21.09)，新的工具面板视图&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;06-17：&lt;a href=&#34;https://mp.weixin.qq.com/s/QxA2i-4H2QPotSzfOq_4fg&#34;&gt;Galaxy Release (v 21.05)，众多核心技术栈变更&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;05-19：&lt;a href=&#34;https://mp.weixin.qq.com/s/NrvlelvC6uLAnJhWMMLacQ&#34;&gt;Galaxy Project | 一些尝试与思考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;04-02：&lt;a href=&#34;https://mp.weixin.qq.com/s/JyL75dmUpz1tkDjv3DpAsg&#34;&gt;Galaxy v-21.01 发布，新的流程和历史栏体验&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;01-13：&lt;a href=&#34;https://mp.weixin.qq.com/s/BOHUzRbcCAH1LwihwBA4Yg&#34;&gt;Galaxy Project | 生信人最值得学习的开源项目之一&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;个人随笔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10-14：&lt;a href=&#34;https://mp.weixin.qq.com/s/mv6oHB7ZLw7fuz2PNtTepQ&#34;&gt;语雀天使&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;06-16：&lt;a href=&#34;https://mp.weixin.qq.com/s/SVfMMIMph7jap5UcykSo8w&#34;&gt;疫情下的广州&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;06-03：&lt;a href=&#34;https://mp.weixin.qq.com/s/dhhFLRh9RL_E2B8Vj9OSeg&#34;&gt;终于把 7 年前的 Docker Hub 账号恢复了&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编程技术&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;08-09：&lt;a href=&#34;https://mp.weixin.qq.com/s/ygCbt5nV8mOIax7FBXViCQ&#34;&gt;Python Excel 操作 | xlrd+xlwt 模块笔记&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;04-16：&lt;a href=&#34;https://mp.weixin.qq.com/s/HcNt-WzZjipGG6dDQAgHgw&#34;&gt;Python 中常见的 TypeError 是什么？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;04-09：&lt;a href=&#34;https://mp.weixin.qq.com/s/5w20SbS1PuiyqP5oTXn5ZQ&#34;&gt;R 语言中常见的 10 个错误，看到第 7 个会不会感觉很神奇？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-30：&lt;a href=&#34;https://mp.weixin.qq.com/s/-YLE-RjU0q8pBk9qlLsf1w&#34;&gt;Python 列表、字典、元组的一些小技巧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;03-02：&lt;a href=&#34;https://mp.weixin.qq.com/s/Cu8Q_mmkUfGGOrntPWVh1A&#34;&gt;R 语言 download.file 的几点知识&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;科研见闻&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;07-21：&lt;a href=&#34;https://mp.weixin.qq.com/s/S2JRu-F_-LQRt5LYh_QaOA&#34;&gt;沉痛悼念 pip search 一路走好&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;05-08：&lt;a href=&#34;https://mp.weixin.qq.com/s/uqydAoNRY0wSXqmdWCuq-Q&#34;&gt;英伟达人工智能和处理器驱动的制药、生命科学合作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;04-30：&lt;a href=&#34;https://mp.weixin.qq.com/s/hA6966BeDvk1-AY8TlL_JA&#34;&gt;科研杂谈 | 全球最大的数字图书馆&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;软件应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;12-08：&lt;a href=&#34;https://mp.weixin.qq.com/s/Zy1AGsM5rMJH9ngrfB1x1A&#34;&gt;文件传输命令 rz 与 sz 安装与使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;11-02：&lt;a href=&#34;https://mp.weixin.qq.com/s/0VrkNotpF6KlNVJq36sn9A&#34;&gt;微信 | PC 端使用 USB 共享网络备份&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-11：&lt;a href=&#34;https://mp.weixin.qq.com/s/GrSg8RdjlAAOTmgzpdf8zg&#34;&gt;SCL+Devtoolset 安装与使用笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-01：&lt;a href=&#34;https://mp.weixin.qq.com/s/IsPIGknkXLsHx7MgiCcz7g&#34;&gt;GLIBC 升级安装与 SCL 知识盲区&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;08-18：&lt;a href=&#34;https://mp.weixin.qq.com/s/_sVajE6uutLsdR4pHLmwmQ&#34;&gt;Python 包安装和 postgresql 的一些问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;07-17：&lt;a href=&#34;https://mp.weixin.qq.com/s/gVWGjxG9qd7qSyX3N8Zgag&#34;&gt;我给自己做了一个导航网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;04-24：&lt;a href=&#34;https://mp.weixin.qq.com/s/ArseLf89u76cHZzHE1l-JQ&#34;&gt;又爱又恨的 Microsoft Edge！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-26：&lt;a href=&#34;https://mp.weixin.qq.com/s/DXEmYz8akoDtshE1ziaG2g&#34;&gt;使用码云同步谷歌 Chrome 浏览器书签&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;02-26：&lt;a href=&#34;https://mp.weixin.qq.com/s/aHvkdwsPP3OBhUcXDMhkQQ&#34;&gt;Windows/Linux 下功能强大的桌面截图软件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;02-19：&lt;a href=&#34;https://mp.weixin.qq.com/s/2XId7dvAc_mMUszzRKeSiw&#34;&gt;为 Windows 系统替换优雅的苹果字体&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2021-转载&#34;&gt;2021 转载&lt;a class=&#34;headerlink&#34; href=&#34;#2021-转载&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;10-20：&lt;a href=&#34;https://mp.weixin.qq.com/s/nnE_M7isih3komrw3pccGw&#34;&gt;我和语雀的小欢喜呀&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;07-06：&lt;a href=&#34;https://mp.weixin.qq.com/s/2v1c_Nlk5OhSL3O8k2N9Tw&#34;&gt;RStuido Server 选择不同的 R 版本（conda 中的不同 R 版本）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;06-19：&lt;a href=&#34;https://mp.weixin.qq.com/s/w67bOn2FRO0B4gB8wULHIw&#34;&gt;Bash 编程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;05-24：&lt;a href=&#34;https://mp.weixin.qq.com/s/vE5FbxK7ZPC-_V3yFKojmA&#34;&gt;Docker 与 K8S 的区别与介绍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-17：&lt;a href=&#34;https://mp.weixin.qq.com/s/zY9-HHyUTFE7rTUMef_cuQ&#34;&gt;生信人实现“SCI 自由”的秘密竟然是…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-04：&lt;a href=&#34;https://mp.weixin.qq.com/s/OFGKfsAfqPU_o1PpKpKb7Q&#34;&gt;图解三代测序（SMRT Sequencing）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;01-06：&lt;a href=&#34;https://mp.weixin.qq.com/s/ggHhyN2Z38vJr64e7CYfyA&#34;&gt;深入浅出介绍聚类分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2021-综合&#34;&gt;2021 综合&lt;a class=&#34;headerlink&#34; href=&#34;#2021-综合&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;11-11：&lt;a href=&#34;https://mp.weixin.qq.com/s/FMMx943coYWvgr1uUbTCfQ&#34;&gt;一个专注于微信公众号 Markdown 排版的平台&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;10-22：&lt;a href=&#34;https://mp.weixin.qq.com/s/Jyxznyztoxx0NKalz7o_9A&#34;&gt;服务器推荐 | 2 核 4G 云服务，首年只需要 70 元&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-07：&lt;a href=&#34;https://mp.weixin.qq.com/s/iRbpQi6wS_lSdRchwVj8Fw&#34;&gt;收藏 | 服务器和存储技术知识&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-06：&lt;a href=&#34;https://mp.weixin.qq.com/s/ycc06QYh4Ef6sGBbCAKXHQ&#34;&gt;男女洗澡前后区别，太形象了！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-29：&lt;a href=&#34;https://mp.weixin.qq.com/s/61OBH4coZDeBHPbbAJekog&#34;&gt;Mdnice 简洁主题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-05：&lt;a href=&#34;https://mp.weixin.qq.com/s/_eBBAu_RotajMz4f0rY9EA&#34;&gt;肠道菌群机制研究及国自然课题设计专题会议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;01-16：&lt;a href=&#34;https://mp.weixin.qq.com/s/BWIKU-yCaDLxSedc7mxJBA&#34;&gt;机房布线的最高境界……&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;01-02：&lt;a href=&#34;https://mp.weixin.qq.com/s/5-PHC4myrc3FNzy0eqxs1Q&#34;&gt;一针重复 2 万亿段代码，我「逆向工程」了辉瑞疫苗！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2021-图文&#34;&gt;2021 图文&lt;a class=&#34;headerlink&#34; href=&#34;#2021-图文&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;11-08：&lt;a href=&#34;https://mp.weixin.qq.com/s/5WnnAeWxivE9XC1eBOfDvw&#34;&gt;Rocky Linux 阿里云镜像源来啦！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;10-09：&lt;a href=&#34;https://mp.weixin.qq.com/s/fMN41JojYEOs_RWfeztuQg&#34;&gt;Google 是要放弃中文搜索了吗？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;10-02：&lt;a href=&#34;https://mp.weixin.qq.com/s/eh8O7uxru1j6EqN22MsQpg&#34;&gt;《鸟哥的 Linux 私房菜》第四版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-24：&lt;a href=&#34;https://mp.weixin.qq.com/s/rcH6bNQw-fgh-NuCyHAHaA&#34;&gt;浏览器标准被大公司左右 - 科技爱好者周刊（第 177 期）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-21：&lt;a href=&#34;https://mp.weixin.qq.com/s/jT3s7OiDtT7WWobZXkdzKQ&#34;&gt;祝所有的读者中秋节快乐！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;09-09：&lt;a href=&#34;https://mp.weixin.qq.com/s/OL9SVmQTvXZS8fqoQwrmBw&#34;&gt;语雀的用户创作指数默默上线了！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;08-24：&lt;a href=&#34;https://mp.weixin.qq.com/s/mk1rdAEJhi9JnXvdrrQgKg&#34;&gt;Edge 浏览器新标签页出现广告区&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;06-14：&lt;a href=&#34;https://mp.weixin.qq.com/s/cEjIU8HkjvHiosOL2tmtHQ&#34;&gt;祝福所有的 Bio &amp;amp; IT 爱好者们，端午节安康！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;04-20：&lt;a href=&#34;https://mp.weixin.qq.com/s/9POhcHVTVTIV-26Dd01KBA&#34;&gt;阿里云网盘 PC 端内测版已经悄悄来了！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2021-视频&#34;&gt;2021 视频&lt;a class=&#34;headerlink&#34; href=&#34;#2021-视频&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;01-29：&lt;a href=&#34;https://mp.weixin.qq.com/s/OGwFPqPTsCR3HlW2Q7lceA&#34;&gt;欢迎加入 Galaxy 2021 年管理员培训课程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;最后&#34;&gt;最后&lt;a class=&#34;headerlink&#34; href=&#34;#最后&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你通过这个平台学到了一点东西，那么对我最好的奖赏就是请你也尝试教我些东西(可以通过邮箱、微信，或者其他社交平台和我联系)。&lt;/p&gt;
&lt;p&gt;希望所有读到此平台文章的读者都有所收获。&lt;/p&gt;
&lt;p&gt;希望我自己在学习工作生活中尽心尽力有所收获，于人于己问心无愧。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;121&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-121/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-121/</guid>
      
    </item>
    
    <item>
      <title>2022 年卡塔尔世界杯</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2022 年 12 月 18 日，有幸从头到尾看完了这一场精彩而刺激的世界杯决赛！！！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📢 阿根廷冠军！&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当地时间 2022 年 12 月 18 日，卡塔尔卢塞尔城 2022 卡塔尔世界杯决赛，阿根廷 3-3 法国（点球 4-2）！&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zhihu.com/question/573022232&#34;&gt;卡塔尔世界杯决赛算不算的上是有史以来最精彩的世界杯决赛？&lt;/a&gt; - 知乎&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;诸神黄昏，众神谢幕，最后一舞！一代人终将老去，但总有人正年轻！&lt;/p&gt;
&lt;p&gt;总裁 C 罗，内少内马尔，魔笛莫德里奇，武僧佩佩，梅老板梅西大，二娃穆勒，苏牙苏亚雷斯，大圣贝尔，本泽霸王龙本泽马，天使迪马利亚......&lt;/p&gt;
&lt;p&gt;诸神的黄昏带走了我们终将逝去的青春，少壮派的崛起又将镌刻他们喷薄的青春。&lt;/p&gt;
&lt;p&gt;冠军并不总是踢得漂亮华丽，而是摸爬滚打，瑕瑜互见磨出来的。所谓冠军，得能赢难看的比赛。
&lt;img alt=&#34;db1a900752bdcd6f9e01e5205b04592.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FkIaltEbQhb2b7VfLeU5zACnb7V3.jpeg&#34; /&gt; &lt;img alt=&#34;4d93bd34e765cde520f55f967fa125e.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgZDzx8D139g-zIBiyqQRiZbeoTP.jpeg&#34; /&gt; &lt;img alt=&#34;64379daa896155e07e4c6765978912d.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FsLzXEtELxz2ZWRztvfXW7Cp0wc5.jpeg&#34; /&gt; &lt;img alt=&#34;d707ddf6cd0a1344a87abb6bfc92dc4.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnhvPBlAAJ8Ugpgnng_qigd2hY90.jpeg&#34; /&gt;
许多年之后，人们将会回想起，2022 年，卡塔尔卢塞尔球场，见证了第三代球王梅西一个英雄般伟大宏伟的登基仪式。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnOmHGipGvbSj2W8T5888fOvKj4H.jpeg&#34; /&gt;
&lt;img alt=&#34;639f6ec4f3e82afe2b2a21cf.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgpnSQ6T-y3a1H2pzo7GkfT0PnU6.jpeg&#34; /&gt;
&lt;img alt=&#34;当地时间2022年12月18日，卡塔尔卢塞尔城，2022卡塔尔世界杯决赛，阿根廷3-3法国（点球4-2）。（图｜视觉中国）&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpBazmmmMeqI0jI_GLYIfZrbinU6.jpeg&#34; title=&#34;当地时间2022年12月18日，卡塔尔卢塞尔城，2022卡塔尔世界杯决赛，阿根廷3-3法国（点球4-2）。（图｜视觉中国）&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;126&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-126/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-126/</guid>
      
    </item>
    
    <item>
      <title>2022，虎年春节，吉祥团圆</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;大年初七，上班的第一天，终于也有时间可以把这几天春节的点滴记录一下了。之前在朋友圈分享过，但朋友圈是短暂的，而文章是长情的，我希望留住这份美好，能更久一点。    &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;2022.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpT1WdOuU76X6OfNoaJQe5FQt_xP.jpeg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;年前&#34;&gt;年前&lt;a class=&#34;headerlink&#34; href=&#34;#年前&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;疫情反复，导致今年的春节是否回家过年略微带上了一些不确定性，幸好早早做了规划，一切都还在计划之内。&lt;/p&gt;
&lt;p&gt;年廿五（1.27），老妈和老哥第一批返程，中午十二点半从广州出发经中山接上老爸。&lt;/p&gt;
&lt;p&gt;年廿七（1.29），和老婆孩子第二批返程，小舅子一个人开车早上九点出发到下午四点左右，一共七个小时才回到。这一次的返程之行，除了沿途气温骤降外，小孩子在车上大吐了两次也有点猝不及防。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;3cda996b528a192eb35da00573efbd3.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FubxsMD4nvAwnh9BMgdT3UA5QWa5.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;cac8d3647c5cabd6ce80068313e8ed4.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Ft62v-Fn4W5TpWQgdBYKQkOA2wqu.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;4223f03689f5c2ee6f45b91a2b80cc4.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fviz5IDI7ADFtjyPCIUO0zG6o8wv.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;年廿八（1.30），下午 16 点左右，从大姑家返回老家。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;d781e55610512ea69bf5d190579253f.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpBpM_0MuUv95PsOAHkC06PBQD7Y.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;afe463024dc9884e7eb3fa353bfcbee.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lgNaWpARjl2EGtO17vo0aqB6DoFR.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;fac410fa5487fd8b30d47191288ba38.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fn1D93EZfJqfNeAwBI4_lfZTPXzx.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;除夕&#34;&gt;除夕&lt;a class=&#34;headerlink&#34; href=&#34;#除夕&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;年廿九（1.31）是除夕，烧纸拜神，放鞭炮，吃团年饭。今年的除夕全家人都回来了，算得上一个真正意义上的团圆，圆满且开心。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;a8c4a7f04a897b45c3c21a4147b0e43.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FqeC-3Iy2WyWR4fC0q-Sx6QhCZjR.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;ac2e44439f9cf735c9823ad61c6da3b.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fg1Qu7PTOk9bTKIX39gVJMBY58Au.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;a52931041cf28da99d041b78c0268bf.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lu9_cZtq9x54hJABuEAMm55U74Xp.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;年后&#34;&gt;年后&lt;a class=&#34;headerlink&#34; href=&#34;#年后&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2022 年的春节是寒冷的，平均气温 10 度左右，加上小雨绵绵，把大家出行的欲望都冷成了蛰伏在家。雨停间隙的串门便成了唯一的消遣和娱乐。&lt;/p&gt;
&lt;p&gt;最温馨的，有多年未见的亲朋邻居寒暄问候；最开心的，是小孩子间嬉闹玩耍的瞬间 —— 她们又有了新的玩伴，放鞭炮玩游戏总是人多才热闹。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;878724c7cdbaf7268311d613c74e61c.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhLrSner9xGTraNgyyXHrIfdOe1P.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;5d4ddcfc9d94ce57bef737d8818574b.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgtSdmTyg4Amf8jBPsUAUcjk-atG.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;9ce797ee68f381b8d936581bf0bbd80.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fmws5LYxFo0nS88gWL7wXRIH0reo.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;年初二，岳父岳母姑姑姐夫一行的到来，热热闹闹的感动。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;4e18c109fdbf37e01999b88704d67a4.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtfpMqLIk_Sf0Uw-oiU_cIcwXBX2.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;f6b2172539e7ee77f8b113609837527.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmFNc_DwOcfDAQDSK2wGSWGv_vqc.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;c1f1d083c40849ead4343da23ea4088.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmjL-QRN-ANxLAnZ5DRaHXNJH2_R.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt=&#34;019ddce2548e9372685471d06fc6a20.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmM1ZnBXOYGACGeqw-bPLzn8rf44.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;5762d075ad4df3fb9ff82feae28818f.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lvHakUToRbtZIhp9H5Ol-vFb1rxu.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;ea01365a5d3d6f7dbb5ceeafd0f954e.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtOZUYjOyia0aTsSEmqDH6-X2mr9.jpeg&#34; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;年初三，初四，在岳父岳母家玩了两天，各种好吃的好玩的。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;7962b965c26f6a4f67c1640f5a099e9.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/ltW-Sx7oq4HP1fVDdxNJvcDXVlRG.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;13fde8e4cdc06e906bc999f12bb1f1c.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lv5z2LcR4cOTdUwB016QKtVFEoJo.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;d77af5ceae2d0ea650585e33f518ef3.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lmzgVgPXt_iYveM2K3Bsjlex7O9d.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt=&#34;abd7985b50faa56b1cca517385e064d.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lqtql02J8TXr-a4XcHZesb2tLkML.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;3b06937d1f1b05bdb6ecdd614176191.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lvYgOFy-Vcg7NfPqbLuoWV9Or2ft.jpeg&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt=&#34;91ed3c752568096ada59dd05512cf88.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lsJyvUtnBNznj7e0SGm2MB40Hj95.jpeg&#34; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;出发&#34;&gt;出发&lt;a class=&#34;headerlink&#34; href=&#34;#出发&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;开心的时光过的特别快，时至大年初五，山河远阔，人间烟火，再度出发！&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img alt=&#34;ef76228d712af93e9d6b192eb8d862a.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FighFS8kRz_bqtka-_P77aTEe3ps.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;c283f23436c74ab0e9efb0cbdd4071d.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/luCg7taqpN6OGYWCG9G9W3mpq0lC.jpeg&#34; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img alt=&#34;0f3bd35fb87df860774453b95e4da62.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lkyBcDbPMzsGmP4rnDFNA-a2QBik.jpeg&#34; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;122&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-122/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-122/</guid>
      
    </item>
    
    <item>
      <title>All in Yuque</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;语雀用了这么多年，有太多太多的东西保存在语雀了，这两天一直都在思考 All in Yuque 的这个问题。&lt;/p&gt;
&lt;p&gt;想先聊一下，为什么不再折腾个人的独立博客了。    &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;首先，独立博客的选择可以有很多，WordPress、Hexo、Jeykll、Hugo ......，每一次都是先被某一个主题（自己也在 &lt;a href=&#34;https://www.yuque.com/shenweiyan/wow/qzt4ul?view=doc_embed&#34;&gt;博客 | 那些好看有内涵的博客与模板&lt;/a&gt; 里面搜集了一些）吸引住，费了九牛二虎之力搭建起来，更新一段时间文章；然后又被其他的主题或者框架吸引，接着继续去折腾；反反复复，中间耗费了大量的时间，累计沉淀的文档知识反而不多，有种丢了西瓜拣芝麻的感觉。    &lt;/p&gt;
&lt;p&gt;其次，独立博客本身的限制。主要在于没法满足私有+分享的需求，大多独立博客的功能在于公开分享，私有文档的功能极其薄弱甚至根本没有。     &lt;/p&gt;
&lt;p&gt;第三，基本上从 2018 年以来，个人的所有知识文档就转移到语雀了。曾几何时，受&lt;a href=&#34;https://yihui.org/&#34;&gt;谢益辉老师博客&lt;/a&gt;的影响，自己也折腾了一个 &lt;a href=&#34;https://github.com/shenweiyan/ICS-Hugo-Theme&#34;&gt;ICS-Hugo-Theme&lt;/a&gt; 的 Hugo 主题，而基于这个主题的&lt;a href=&#34;https://www.shumlab.com/&#34;&gt;个人独立博客&lt;/a&gt;现在基本变成存档的状态了，只是有空的时候会偶尔去折腾更新一下。     &lt;/p&gt;
&lt;p&gt;第四，GitHub 上有一个&lt;a href=&#34;https://github.com/timqian/chinese-independent-blogs&#34;&gt;中文独立博客&lt;/a&gt;列表的项目，很不错，也很佩服那些十年如一日更新的人——他们给我的一个启示就是专注积累和沉淀，主题框架还是相对次要的(不值得花太多时间去折腾)。&lt;a href=&#34;https://www.foreverblog.cn/&#34;&gt;十年之约&lt;/a&gt; 和 &lt;a href=&#34;https://bf.zzxworld.com/&#34;&gt;BlogFinder&lt;/a&gt; 是比较出名的社群，稳定且用户量大。这些社群有自己的交流平台，帮助作者认识更多的人。&lt;/p&gt;
&lt;p&gt;也简单聊一下，为什么放弃了其他的一些如&lt;strong&gt;博客园&lt;/strong&gt;、&lt;strong&gt;掘金&lt;/strong&gt;之类的平台（CSDN 就算了，乌烟瘴气的）。     &lt;/p&gt;
&lt;p&gt;这些平台很大的一个特色是社区氛围挺好，对于互联网搜索分享也有一定优势，但是对私有文档文档支持很差，这也是我放弃的主要原因；其次是编辑体验也一般。     &lt;/p&gt;
&lt;p&gt;说到这里，顺便提一下博客园——个人加入博客园（&lt;a href=&#34;https://www.cnblogs.com/shenweiyan/&#34;&gt;https://www.cnblogs.com/shenweiyan/&lt;/a&gt;）也已经有 8 年多，对博客园的写作氛围和几十年如一日纯粹无广告的态度相当赞赏，但私有文档的支持的确也基本等于零（也许是我没有找到正确的打开方式吧）。&lt;/p&gt;
&lt;p&gt;最后，回到今天的话题。     &lt;/p&gt;
&lt;p&gt;All in Yuque 其实就目前来说是可以的，自己一直以来也基本上这么干了，只是还有些地方不够满意而已。&lt;/p&gt;
&lt;p&gt;例如，&lt;strong&gt;小记&lt;/strong&gt;，中规中矩但贵在编辑器支持的样式多；眼馋 Flomo 的 UI 简洁和逻辑清晰，但人家不支持插入代码。&lt;/p&gt;
&lt;p&gt;例如，&lt;strong&gt;知识库&lt;/strong&gt;，编辑体验已经很好了（虽然还有可以做得更好的细节，如 Web 端编辑同时展示左边大纲），但最大的遗憾还是互联网比较难搜索到语雀的内容（好像目前无能为力）。
还要吐槽一下知识库文档的段落距离——跟行距相似度太高了，简直分辨不出来——看的好难受！空一行行距又太高——我好难 😭&lt;/p&gt;
&lt;p&gt;例如，存量的&lt;strong&gt;话题知识库&lt;/strong&gt;，极好的一个知识库类型，可惜不能按照标题名称排序（相当简单的一个小功能，却一拖再拖，未能上线）；嵌入语雀内容在话题知识库知识库中也不如人意，最起码渲染速度就有点让人抓狂了；还有最坑的一点，话题知识库不能插入本地视频！&lt;/p&gt;
&lt;p&gt;例如，&lt;strong&gt;逛逛&lt;/strong&gt;，能看的东西好像太少了，也不能刷新换一批；另外还有一个感觉（不知道是不是我的错觉），就是语雀对于前端、设计、以及一些方法论的东西尤其看重，逛逛/推荐里面很多这些方面的文档内容，其他方向的内容极少。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;128&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-128/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-128/</guid>
      
    </item>
    
    <item>
      <title>一个纯粹的人</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;p&gt;我和白求恩同志只见过一面。后来他给我来过许多信。可是因为忙，仅回过他一封信，还不知他收到没有。对于他的死，我是很悲痛的。现在大家纪念他，可见他的精神感人之深。我们大家要学习他毫无自私自利之心的精神。从这点出发，就可以变为大有利于人民的人。一个人能力有大小，但只要有这点精神，就是一个高尚的人，一个纯粹的人，一个有道德的人，一个脱离了低级趣味的人，一个有益于人民的人。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是毛泽东同志在《纪念白求恩》原文中的一句话，时至今天看起来，依然让很多自以为是的那些人汗颜。抛开“有益于人民”的大高度，生活中没有脱离低级趣味的人也有不少。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p align=&#34;center&#34;&gt;
    &lt;img src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmuqcJBMECQ1QKbE8_4TjZLqpuo6.jpeg&#34; alt=&#39;Che Guevara&#39;&gt;&lt;br&gt;
    &lt;span&gt;切‧格瓦拉(Che Guevara)&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;一者，修养差且情绪管控弱，喜欢道德绑架。修养，指的是心境平和，度量大，成熟稳重等，那些动不动就看不惯别人的人，自然没有这些修养。这也跟性格和认知有关。只要等他知道了，别人怎样他是影响不了的，他也不需要去管，或许他就淡定了。&lt;/p&gt;
&lt;p&gt;二者，敏感好为人师，缺乏自知之明。一个成年人，一个孩童，都有独立于他人的世界、价值观念，有一些非亲非故的陌生人，偏偏喜欢动不动对你指手画脚，一副高高在上的长者姿态。这些像猴子一样的人还不自知，可笑之极。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;117&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-117/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-117/</guid>
      
    </item>
    
    <item>
      <title>一些好玩的命名风格</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;码云 gitee 名字的由来的一种解析：后缀 ee 附于动词后，表示动作的受动者。与之相应，动作的施动者则由后缀 er/or 表示。gitee 的意思就是“使用 git 的群体”，你懂了吗？ 反正我是懂了！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;于是有了我的 bioitee：&lt;/p&gt;
&lt;p&gt;一群从事与爱好 Bio IT 的群体。你懂了吗？反正我懂了！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;112&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-112/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-112/</guid>
      
    </item>
    
    <item>
      <title>不提供账号注销等于耍流氓</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;作为一个生信工程师，不知道大家平时是怎么管理和备份自己的一些流程和脚本？而我个人则比较喜欢用 git。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;zhanghao.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgjHQn_wdWob063qAiBlTG8nlKn2.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;说到 git 代码托管，国外的 GitHub、GitLab 相信大家都已经很熟悉；国内比较知名的，除了码云，CODING 应该也算得上一个。在最开始的前几年，甚至到 2017、2018 年，Coding.net 代码托管平台的用户体验都还挺不错的，但 2019 年和腾讯云开发者平台合并后，就开始变得越来越鸡肋了，合并后虽然说是不限存储不限项目提供代码托管。&lt;/p&gt;
&lt;p&gt;CODING 个人版有几点不太友好的体检经历：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在同一个产品中过多的嵌套 coding.net 和 dev.tencent.com 两个域名的链接跳转，用着用着就让人有一种分不清楚这个到底是原来的 CODING 还是腾讯云开发者平台！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CODING 个人版个人主页，公开的项目却显示的是仓库名称！这样，在仓库中设置项目名称的意义是什么？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FsIF_mY1Mplnv6WHf_Oc0LlOTAR3.png&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注销账号， CODING 只提供账号锁定功能！！！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《电信和互联网用户个人信息保护规定》（工业和信息化部令第 24 号）第九款第四款规定：“电信业务经营者、互联网信息服务提供者在用户终止使用电信服务或者互联网信息服务后，应当停止对用户个人信息的收集和使用，并为用户提供注销号码或账号的服务。”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;FhEmqoge2p383tBp-vjGxFoAw3gk&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhEmqoge2p383tBp-vjGxFoAw3gk.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后只想说，如果不是出于墙内网络的考虑，很多人应该都会选择 Github、Gitlab 的代码托管服务。当然，或许也有些人出于对  Github 账户/开源项目是否会受到美国出口管理条例管制的担心，或者追求更高的速度体验，而转向国内的代码托管服务。&lt;/p&gt;
&lt;p&gt;对于国内代码托管服务，开源中国旗下的 Gitee 应该是目前做的最好的，但对 git 空间和单个仓库都有一定限制。反观那些不限空间、不限项目的后来者，CODING 也好，腾讯云开发者平台也罢，用户体验不好，产品不过关，再多的免费空间也是白搭吧！&lt;/p&gt;
&lt;p&gt;不管怎么说，对于一些重要的生信分析流程脚本选择 git 进行管理个人觉得还是非常有必要的。你可以选择自建服务进行托管，也可以选择付费进行托管，重要的一点，如果你是土豪，就当我什么都没说。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;115&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-115/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-115/</guid>
      
    </item>
    
    <item>
      <title>五一喜与乐</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;从 2020 年初到 2021 年年初，将近整整一年，受疫情影响，大多数人基本都没怎么出行，好不容易等到了今年的五一黄金周，国内疫情好转，于是&amp;rdquo;报复性出游&amp;rdquo;出来了。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h3 id=&#34;第一天打球喝酒&#34;&gt;第一天，打球喝酒&lt;a class=&#34;headerlink&#34; href=&#34;#第一天打球喝酒&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;第一天，哪都没去。早上带着娃，把公交地铁超市都兜了一圈。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/li3mhmoER9OMehBlU7rtc7YXnJyP.png&#34; /&gt;
下午，羽毛球。完了，万达小聚，吃饭喝酒聊天，好久没喝的这么开心了 😆😍
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lqeZE36cEUqOCKO3Ro_Q-GQFcEWY.png&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;第二天万田生态公园&#34;&gt;第二天，万田生态公园&lt;a class=&#34;headerlink&#34; href=&#34;#第二天万田生态公园&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;增城的这个生态公园，面积是挺大的，人也不是很多，环境还算可以。不足的是树木有点小，可以乘凉的地方也少，太阳晒天气热的时候让人很抓狂，此外，&lt;strong&gt;打车极其非常不方便！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;地方还算可以，但如果搭上一个喜欢抬杠像麻雀一样吱吱不停的人，真心大煞风景！&lt;/p&gt;
&lt;h3 id=&#34;第三天广医&#34;&gt;第三天，广医&lt;a class=&#34;headerlink&#34; href=&#34;#第三天广医&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;阴雨开始，一早陪老婆去广医五院开始 B 超+血检，从早上折腾到下午 2 点多，身心俱疲。整个五一假期最心塞的一天！！！&lt;/p&gt;
&lt;h3 id=&#34;第四天爬山打球&#34;&gt;第四天，爬山打球&lt;a class=&#34;headerlink&#34; href=&#34;#第四天爬山打球&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;老婆一直叨念不休的火炉山之行终于成行。一路上吃吃玩玩走走停停，总算波澜不惊。天气阴晴，空气极好，路上人也不多。虽大多数时间抱着娃拾阶而上，体力相比上一次公司团建好上不少。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/lunXPcdsCJH67a2Z27N-LfDOab-s.jpeg&#34; /&gt;
最后，虽然没吃上老婆最喜欢的羊排（一般秋冬季才有的吃），但烧鸡和开胃的酸萝卜也是蛮好吃的。&lt;/p&gt;
&lt;p&gt;傍晚，晚来风急，一场昏天黑地的暴雨差点把既定的羽毛球活动给泡汤掉！球馆 PK，2:1 赢下了一场挑战赛，让人倍感开心和振奋！&lt;/p&gt;
&lt;h3 id=&#34;第五天充电休息&#34;&gt;第五天，充电休息&lt;a class=&#34;headerlink&#34; href=&#34;#第五天充电休息&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最后一天，回归充电学习，明天又是新的一天！&lt;/p&gt;
&lt;p&gt;总的来说，今年的五一过的还算满意。五天的假期，时间说长不长说短不短，没有给高速公路添堵，没有挥霍浪费。难得的是，一家三口终于可以开开心心的出去走了几圈，老妈子也如愿以偿出去串了一下亲戚，波澜不惊，岁月安好。&lt;/p&gt;
&lt;p&gt;平淡，简单，最好！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;143&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-143/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-143/</guid>
      
    </item>
    
    <item>
      <title>你若安好便是晴天</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一篇发布于 &lt;a href=&#34;https://www.yuque.com/shenweiyan/notebook/to-be-good&#34;&gt;语雀·随笔与乱弹&lt;/a&gt; 的笔记，本文章已经更新。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;anhao.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpWr71wB7ZaE5j8UmLUKhg3qFqAh.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;昨天，7 月 7 日，挺顺口的一个日子。公司体检和家里小孩子咳嗽感冒撞到了一起。&lt;/p&gt;
&lt;h2 id=&#34;关于体检&#34;&gt;关于体检&lt;a class=&#34;headerlink&#34; href=&#34;#关于体检&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从早 7 点开始，从公司集合到体检地点，从领号、报到取表、开始体检到体检结束，3 个半小时的折腾好不容易把今年的这一次身体小检查给完成了。总结起来就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人多。从早八点半到爱康国宾（广州天河体检分院），再到拿到号，前面已经熙熙攘攘排了 100 多号人，而窗口叫号取体检表的人工服务通道就只有 3 个。&lt;/li&gt;
&lt;li&gt;服务一般。窗口叫号取表和自助机刷身份证取表都是一样的，但是在服务指引上，工作人员的答复只有：等叫号办理取表。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;关于感冒&#34;&gt;关于感冒&lt;a class=&#34;headerlink&#34; href=&#34;#关于感冒&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;儿科医生不足，在现在各大医院都很常见。在广州绝大部分的医院，不管是三甲还是二甲，基本上都要提前预约，或者预约当天号。&lt;/p&gt;
&lt;p&gt;关于周末就医，还有一个问题就是很多医院，不管是三甲还是二甲，周末都不上班！例如距离我们家里最近的岭南医院（三甲）周六下午、周日都是不上班的。&lt;/p&gt;
&lt;p&gt;这是我们第一次试图通过微信公众号预约广州医科大学第五附属医院，有很大的一个体验就是在 &lt;strong&gt;&amp;ldquo;广医五院&amp;rdquo;&lt;/strong&gt; 的微信公众号进行预约时 &lt;strong&gt;&amp;ldquo;必须要先去医院办理诊疗卡，使用诊疗卡号才能在线预约&amp;rdquo;&lt;/strong&gt;。这对于第一次想预约看病的人而言，体验很不友好！&lt;/p&gt;
&lt;p&gt;从出生起，这一次也算是家里小孩第一次感冒的经历，在医院候诊遇到的各个奶爸宝妈、各种囧事锁事也算是另外一种体验吧！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;114&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-114/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-114/</guid>
      
    </item>
    
    <item>
      <title>公众号与语雀</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;首先，公众号发表后的文章是不支持大幅度和多次的修改的，作为技术类的很多文章，我希望我的文章能被修改，因为文章会有错误，也会需要时常更新。
第二，我希望我的文章能归档起来，方便检索。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;出于以上考虑，我想把个人公众号的文章在语雀做一个归档，这就引发了一个问题：&lt;strong&gt;我是用存量的知识小组，还是用现在的知识库，还是用语雀空间？还是新创建一个语雀账号？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存量的知识小组，不支持插入本地视频！&lt;/li&gt;
&lt;li&gt;语雀空间，子一级目录不能修改名称，还非得要登陆才能看！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建一个语雀账号就有点把工作复杂化，这样一看来用现有的语雀知识库貌似是一个最好的选择。出于把个人知识笔记跟公众号分隔开的最初目录，对个人账号下新建一个知识库用于公众号文章归档这样的做法总感觉有点事与愿违，总感觉有点别扭，总觉得哪里不对劲。&lt;/p&gt;
&lt;p&gt;心里总觉得语雀空间是理想的，现实告诉你个人知识库才是合适的，隐约有点理想被现实打脸的的错觉。&lt;/p&gt;
&lt;p&gt;语雀空间作为团队、公司使用，总有一些提供给其他客户或者用户的对外公开文档吧，这些文档用户不需要登录可以直接查看也是合情合理（而且语雀空间貌似也有这样的设置项，但作为一个语雀个人长期用户，居然也搞不清楚具体要怎么设置——是需要先在空间管理设置，然后再去具体知识库设置？）    &lt;br /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fg81kwjFQPZtTH99Zbs8ijEDSC0Z.png&#34; /&gt;      &lt;/p&gt;
&lt;p&gt;后来才折腾明白 ——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📢 &lt;strong&gt;设置互联网所有人可以访问是语雀的付费权益！！！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果知识库设置了公开到互联网可见，外部未注册的人拿到分享链接也可以查看。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgQ3IDgJa7cM_syRZFeARKfk7cL6.png&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果想要对外分享整个公开的知识库，在知识库首页右上角可以分享。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnhHk0d2S6NZyot0h5JS1suvVDa7.png&#34; /&gt;      &lt;/p&gt;
&lt;p&gt;好吧，算是折腾明白了！&lt;/p&gt;
&lt;p&gt;最后就剩一个问题了——个人用户已经开通了超级会员，囊中羞涩已经折腾不起付费的空间了。&lt;/p&gt;
&lt;p&gt;所以，写到最后，归根结底，还是 &lt;strong&gt;&amp;ldquo;钱&amp;rdquo;&lt;/strong&gt; 的问题 😕😵🤑&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;131&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-131/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-131/</guid>
      
    </item>
    
    <item>
      <title>写作与初衷</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;关于写作原本的想法，只是想写点自己在学习、工作、生活上的一些心得和体会，把一些知识点记录下来。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;xiezuo2.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fu0vY5O4M2i5Lxxtta0VfcXuNCq5.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;留言的初衷是，希望自己写下来的东西能够有人一起探讨。哪怕你把我的观点批评得一无是处也可以，哪怕你说我的句子狗屁不通也没关系，只要有评判，我相信总有一天我会变得更好。&lt;/p&gt;
&lt;p&gt;关于部分平台商业化的写作，只说两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商业化已经改变了写作的初衷。&lt;/li&gt;
&lt;li&gt;当写文章变成盈利的手段，那么，写出来的东西是没有灵魂的。&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;135&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-135/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-135/</guid>
      
    </item>
    
    <item>
      <title>动了谁的奶酪</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;活在自媒体时代，每个人都在利用各种平台打造个人品牌，几乎每个人都在会选择微信公众号。流量为王的今天，粉丝就是一切，是动不得的奶酪。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;个人觉得，不管任何平台，任何讨论组，个人宣传自己的文章都是可以被接受的，只要这些文章不是广告，只要不是恶意刷屏，只要没有明确的规则说禁止分享第三方的链接文章。&lt;/p&gt;
&lt;p&gt;一亩三分地内，如果真的动了你的奶酪，如果在你看来这就是广告，在没有任何沟通的情况下直接踢人，个人觉得这是极其野蛮的做法。&lt;/p&gt;
&lt;p&gt;现在的公众号都不容易，尤其是个人运营的公众号。奔着分享和交流学习的初心，内容至上，应该才是正道。&lt;/p&gt;
&lt;p&gt;今天在某交流群分享了一篇转载的 R 语言文章，没有任何沟通情况下直接被踢，有点想法，唠叨几句。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;137&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-137/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-137/</guid>
      
    </item>
    
    <item>
      <title>只要能坚持下来就是好博客</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;写博客、记录文字是一个好的习惯，相信很多人的初心都是很美好的。但是能真正坚持下来的，或许没有多少。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;blog2.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjFei9AbrugbaF_b3MEnmlL7PvK4.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;记得最早接触博客和云笔记，还是在大学刚毕业后，真正意义上开始使用编程语言学习项目分析的那段时间。作为一个菜鸟，在接受团队技术分享、在培训过程中接触到了各种各样的知识，出于知识梳理、快速查找原始需求，开始接触使用有道云笔记和印象笔记。但是让人失望的是，那时候的有道云和印象笔记都不支持代码插入，而且 UI  界面很 low，这对一个经常与代码打交道的人来说体验时非常糟糕的。&lt;/p&gt;
&lt;h4 id=&#34;2014-年youdao--cnblogs&#34;&gt;2014 年，YouDao + cnblogs&lt;a class=&#34;headerlink&#34; href=&#34;#2014-年youdao--cnblogs&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;作为一个清爽、简洁、无广告的纯技术分享平台，博客园似乎是最好的。在博客园趟了趟水，稀稀拉拉写了几篇文章，那时候对文章的理解其实就是自己对一些经常使用知识的体会。使用了几个月，发现了几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;博客园的定位是 IT 技术的分享平台，作为一个生信人而言，没太多共鸣。&lt;/li&gt;
&lt;li&gt;平时工作中的记录大多数记录在有道云或者印象笔记，发表到博客园，需要再次排版整理，很麻烦。那时候虽然可以使用 Windows Live Writer，但无法做到随手编辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2015-年oschina--wiznote&#34;&gt;2015 年，oschina + wiznote&lt;a class=&#34;headerlink&#34; href=&#34;#2015-年oschina--wiznote&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;2015 年的开源中国的博客系统长的也并不好看，而且自定义支持也不好。现如今开源中国的博客系统经过改版后已经清爽了很多，但在浏览过程中头部的广告却让人很是不爽。&lt;/p&gt;
&lt;p&gt;同年，接触到为知笔记，这是一款非常优秀的国产笔记。从功能和界面上来说，它可以说是国产笔记中做的最好的，各种插件能满足你日常工作和生活 99% 的需求。曾经在很长一段时间内，它一直是我作为个人知识管理最理想的工具之一。但有几个方面，仍有待完善：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;万年不变的 web 端。为知笔记的 web 端很不好看，体验也很差，不支持 markdown 预览编辑模式。&lt;/li&gt;
&lt;li&gt;建议反馈响应慢。为知笔记使用贴吧作为问题反馈平台，很多建议无法得到及时的响应。尤其是 web 端的问题，从 2015 到 2018 年一点变化都没有。&lt;/li&gt;
&lt;li&gt;到了 2019 年 7 月，好奇心作祟回去看了一眼，居然发现为知笔记更新了一个 beta 版的 web 端，颜值还算可以，但列表栏自由宽度调整、主题、字体定义等还不够完善，md 在线编辑依然不支持！&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;2017-年jekyll--leanote&#34;&gt;2017 年，jekyll + leanote&lt;a class=&#34;headerlink&#34; href=&#34;#2017-年jekyll--leanote&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;jekyll 和 hexo 是一个功能强大的博客系统，所有人都可以利用免费代码托管平台部署属于自己的 jekyll 与 hexo 博客，如 github pages，coding pages 和 gitee pages。这种博客模式可以让用户更加关注写作，而不需要把大量的时候花费在界面样式的调整上。不可否认的是，基于 jekyll/hexo 的博客系统，在部署和自定义特定功能上是需要一定的前端或者后端技术作为支持的。&lt;/p&gt;
&lt;p&gt;Leanote 的体验是非常好的，尤其是它附带的博客系统具有非常自由的可定制性，这一点也是最吸引我的地方。不足的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相比为知笔记的明文保存，Leanote 本地二进制的笔记保存方式很不利用笔记的迁移；&lt;/li&gt;
&lt;li&gt;开发、维护人员不足，很多 github issues 都没有响应；&lt;/li&gt;
&lt;li&gt;用户小众，更新及其缓慢。从 2019 年起基本没有任何的更新，很担心哪一天就跑路了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2019-年语雀专业的云端知识库&#34;&gt;2019 年，语雀：专业的云端知识库&lt;a class=&#34;headerlink&#34; href=&#34;#2019-年语雀专业的云端知识库&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;2019 年，发现了语雀，被友好的编辑体验吸引，加上蚂蚁金服的加持，于是开始把所有积累的文档迁移了上来。希望能基于这样一个专注于知识的平台能越来越好。&lt;/p&gt;
&lt;p&gt;总的来说，在坚持博客的道路上，有访问量的困惑，有不断追求其他一些博客简洁清爽页面样式的影响，有文字编辑时的体验需求，也有随着自媒体日趋发达多平台文章同步的需要，甚至博文多了网页加载的速度瓶颈等等，都会造成不断的更换博客的托管和部署平台，这对于很多喜欢折腾的人来说这应该是非常正常的一个事情。不管是 Github Pages，还是  WorldPress、Gitee Pages 这些托管平台，或者是对 Hexo、Jekyll、Hugo 搭建方式的选择，都足以让你眼花缭乱。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从根本上而言，博客的本质是记录，是与自己、他人的内心对话&lt;/strong&gt;。&lt;strong&gt;对话是记录的延伸。产生对话，需要传播，需要消息机制。博客就三个关键词：记录、传播、对话。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，不管选择哪一种方式，只要能坚持下来就是好博客，专注才是硬道理，内容才是王道。&lt;/p&gt;
&lt;p&gt;我个人的大部分文档目前都保存在语雀，部分公开文档也和本人托管在 Gihub 的 Jekyll 博客进行了自动同步，有兴趣的可以关注交流一下！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语雀：&lt;a href=&#34;https://www.yuque.com/shenweiyan&#34;&gt;https://www.yuque.com/shenweiyan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;博客：&lt;a href=&#34;https://weiyan.cc&#34;&gt;https://weiyan.cc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;后记&#34;&gt;后记&lt;a class=&#34;headerlink&#34; href=&#34;#后记&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;今天看到几个使用 github issues 安家博客的人，看着底下一个个的评论，感觉很有意思，分享一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《个人博客，最终选择》：&lt;a href=&#34;https://github.com/atian25/blog/issues/07.md&#34;&gt;https://github.com/atian25/blog/issues/07.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《博客是什么》：&lt;a href=&#34;https://github.com/lifesinger/blog/issues/123&#34;&gt;https://github.com/lifesinger/blog/issues/123&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;113&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-113/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-113/</guid>
      
    </item>
    
    <item>
      <title>吐槽一下公众号的那些事</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;微信公众号一直标榜 “再小的个体，也有自己的品牌”，这个也许是微信公众号上线的初衷。然而，有人的地方就有江湖，这个曾经看起来是个非常美好的事情，发展到现在，似乎也不见得那么十全十美。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;原作-抄袭-致敬区别.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhnSV5DLtc1qMO3I__R_wNZfzo5a.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;抛开一些大的槽点，今天要实锤几个公众号碰到的事情。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;很多公众号为了阅读量，也有一些是出于专项问题处理，都创建了自己的讨论群，在讨论群明确规定不能发广告，可以理解；但是对转发其他公众号的非广告类文章却如临大敌，动不动踢人，自己却天天发本公众号的各种推文，着实有点小家子气！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于一些从博客转载过来的文章，有一些公众号时不时玩小把戏，把转载声明藏到不起眼的文末；或者干脆迷迷糊糊的说什么文章来源于网络；甚至不做任何标注！如果文章的确是基于网络各种资料自己整理总结而来，还可以理解一下，如果的确有类似原文，却模糊化原创，这样的做法的确不可取。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最可恨的是，把一些未经原作者授权的文章标记为原创的侵权行为！前几天刚遇到类似的情况，本来已经跟原作者沟通过转载的事宜，却在转载那一刻发现被其他公众号把该文章标注为原创剽窃了过去，搞得所有想要转载该文章的人都要联系公众号开放白名单，真实可恨！欣慰的是，最后通过微信投诉成功，标记为原创的文章删稿。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;原创.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FqGqmAE7shH-b6kcONDAHCr0EY_t.png&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关于写文章挣钱，不多说，摘录几点酷壳网陈浩老师的原话！&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;首先，如果你觉得在微信公众号上写技术文章是可以挣钱的，那么恐怕你搞错了，营销文是可以的，技术文章还是比较难的。&lt;/p&gt;
&lt;p&gt;当然，你要挣点小钱是可以有的，但是，你需要写软文中植入广告，或是消费热点主题，比如前段时间的魏则西事件，有的公众号被打赏了一些钱。&lt;/p&gt;
&lt;p&gt;老实说，这对我来说完全无感，因为，我的逻辑是这样的：&lt;strong&gt;我觉得一个人有一定的影响力，其中有很大一部份原因来自他的独立性，如果我开始写软文了，相当于我把自己卖了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以，我现在从来不通过写文章挣钱，因为我会写代码，我还是通过我的技能挣钱，通过给一些公司做咨询、培训、企业服务挣钱，老实说，靠自己的能力挣钱，比写文章挣钱挣得多多了，因为我觉得，&lt;strong&gt;像我写的这类的文章本来就是用来分享和传播的，不是用来挣钱的。写文章的目的是分享和影响，不是挣钱。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;私以为对于文章转载，标明原出处和作者是对文章和作者的一个基本尊重，不要找理由说找不到原作者。我从来没有见过有人靠抄袭和盗用别人文章而成功的，无非就是收获几个赞罢了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;商业化已经改变了很多人写作的初衷。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分享是一种态度，不仅仅是停留在嘴上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有的人认认真真花时间写了好的文章，不管付费打赏，还是点赞支持，都无可厚非。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你的文章对读者有用，何必担心自己的粉丝被人家带跑，圈个墙也不见得能增加几个阅读量，开放的心态总比整天的提防要好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你是奔着钱去的，当我什么都没说。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，借用&lt;a href=&#34;http://kaopubear.top/&#34;&gt;思考问题的熊&lt;/a&gt;赵老师的一句话，希望自己在学习工作生活中尽心尽力有所收获，于人于己问心无愧。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;140&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-140/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-140/</guid>
      
    </item>
    
    <item>
      <title>吐槽一下微信公众号的赞赏号</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2018 年 6 月 6 号起，公众号每以同一作者名发表 3 篇或 3 篇以上的原创文章，即可创建一个赞赏账户，用于赞赏收款。同一公众号最多可以邀请开通 3 个赞赏账户。关于赞赏账户的创建和流程不多说，公众号平台官网的《&lt;a href=&#34;https://kf.qq.com/faq/170110yueMvA170110iIn2uI.html&#34;&gt;公众平台赞赏和喜欢作者功能介绍&lt;/a&gt;》上面有很详细的介绍，有两点值得注意。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;创建赞赏账户需要实名认证，实名信息需要填写作者真实的姓名、身份证号码（实名信息不会对外展示），且需与当前操作的个人微信实名信息一致，提交后实名信息不支持修改，&lt;strong&gt;每个人（以身份证统计）只能开通一个赞赏账户&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在“赞赏账户”小程序的管理端，点击名字 - “我的信息” - 名字，就可以进入改名流程。但是，请注意，跟微信号一样，&lt;strong&gt;每个赞赏帐号只有一次修改名字的机会&lt;/strong&gt;，因此，再修改赞赏账户名称前请您慎重考虑！&lt;/p&gt;
&lt;p&gt;其实，微信公众号赞赏号比较坑爹的地方也就在这里。一是一个身份证只能开通一个赞赏账户；二是跟微信号一样，只有一次修改名字的机会。第二点想必大家会很熟悉，但是对于第一点还有一个非常隐藏的坑。&lt;/p&gt;
&lt;p&gt;就是，赞赏账户一旦创建，就无法关闭，也无法注销。至少目前是没办法注销和关闭的。就算你把你的微信号注销掉，已经创建的赞赏账号依然无法关闭和注销。&lt;/p&gt;
&lt;p&gt;个人觉得，这其实是一个非常恶心的做法。原微信号申请注销不能用了，在新注册的微信号中，原赞赏账户不但无法移交，也不能注销，还占用了本人身份证信息，以至于新的微信号即不能创建新的赞赏账户，也不能沿用原来的赞赏账户。&lt;/p&gt;
&lt;p&gt;我在《&lt;a href=&#34;https://www.yuque.com/shenweiyan/cookbook/coding-cancel-account&#34;&gt;不提供账号注销等于耍流氓&lt;/a&gt;》中聊到过，在腾讯云开发者平台合并后的 CODING 代码管理平台也是不提供账号注销的功能。不知道这是腾讯一贯以来的作风，还是技术原因。&lt;/p&gt;
&lt;p&gt;最后，贴个啪啪打脸的信息保护规定和上个图镇楼。顺便问一句，对于腾讯系的产品，大家都是怎么看的呢？&lt;/p&gt;
&lt;p&gt;《电信和互联网用户个人信息保护规定》（工业和信息化部令第 24 号）第九款第四款规定：“电信业务经营者、互联网信息服务提供者在用户终止使用电信服务或者互联网信息服务后，应当停止对用户个人信息的收集和使用，并为用户提供注销号码或账号的服务。”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;加密排行榜.jpeg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpvGiW6UG9GQL2ZH5BgzALf-16L3.jpeg&#34; /&gt;
&lt;img alt=&#34;ly.gif&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlMO8jnjfaW7QalT7nyPkxQ4d37w.gif&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;138&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-138/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-138/</guid>
      
    </item>
    
    <item>
      <title>域名碎碎念</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最近总想着注册域名，折腾完域名又想这去折腾 Foxmail 和 QQ 邮箱，简直魔障了！&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;domain-register.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fs3nERCsQx7eP1CprAhM4vgRg2qB.jpeg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;顶级域名&#34;&gt;顶级域名&lt;a class=&#34;headerlink&#34; href=&#34;#顶级域名&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;顶级域名中四个纯字母以内的 com/net/org 之类顶级域名基本都被注册完了，好一点的四个字母的域名，如 top 虽然没有注册，但每年 4000 多大洋（白金域名），对于个人来说，真是望而却步！&lt;/p&gt;
&lt;h2 id=&#34;bio&#34;&gt;BIO&lt;a class=&#34;headerlink&#34; href=&#34;#bio&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;看上一个 bio 的域名，但即使普通的 bio 域名，续费也要将近 400 大洋/年，真是搞不懂了，为什么这个域名会这么贵！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;.bio 这个域名可以代表“生物”或“生物学”。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fu3V2lHxytHoOTMBy_3Mc7avm1vz.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fp_hVUG12CGWEBKRQfks-n3mY__-.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;123&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-123/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-123/</guid>
      
    </item>
    
    <item>
      <title>婚姻修养</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;婚姻是一种修行，体现了个人的素质和修养；婚姻是否平静、长久，取决于双方或其中一方的修养程度，这种修养，不是指文化修养，而是指婚姻修养——当然，文化修养必不可少，却不是决定性的——所谓的婚姻修养，是指一个人对于自身和他人欲望、心理的认识程度，反省能力，特别是自我调整和适应能力。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;hunyin.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiJnUwRJPylbDPyZXUlGGFMftjy5.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;婚姻修养好的人，善于控制自身的欲望，对人性，对自己，特别是爱人的心理、为人有不同程度的了解，情绪稳定，知足常乐，适应生活、爱人和婚姻的能力强。&lt;/p&gt;
&lt;p&gt;与此相对应，不少人的婚姻修养相对较差，有如下几个表现：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一，不容易满足&lt;/strong&gt;。比如，有些女人，明明过得不差，却喜欢和周围的家庭（比如亲朋好友，尤其是闺蜜）进行地位和经济上的对比，比不上人家，就心生不满，意有不足，嫌弃自家男人不如别人家的男人能干；有些女人，虽然自家男人不错，但女人觉得自己够性感够漂亮，本该嫁个更有钱、有地位的男人才对。有些男人则习惯于拿别人的老婆来比对，觉得自己老婆土气，不够时髦，不够有魅力，甚至不新鲜，等等。这些不满和不足，通常是出轨的诱因，为婚姻破裂埋下了根由。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二，偏执倾向明显&lt;/strong&gt;。有些人经历过初恋，感觉刻骨铭心，惯于以初恋为参照系来衡量以后的感情，如果今后的感情不能重复初恋的美好，就心有缺憾。有些人经历过最好的异性，恋恋不舍，经常把他们当作择偶的标准。还有不少人脱离实际，在心里塑造了一个理想而完美的女神或男神形象（或性感或清纯的女人，或者花样美男、猛男、幽默风趣的才子）……这类人，比较自恋，具有不切合实际的完美主义倾向，婚后的感情和配偶如果和内心的期待、标准有差距，往往心有不足，落下心结，郁郁寡欢。有一种男人，有处女情结，和非处女的女人结婚后，很难投入感情，也很难爱上对方。还有一些人，遇不到自己爱的人，或者爱自己的人，宁可不结婚……这些都属于情感和婚姻上的偏执症状，对感情、婚姻和爱人都有很深的偏见和成见，难以消除。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三，适应能力差&lt;/strong&gt;。本来，婚姻就是一种既来之则安之的事情，不管遇到谁，只要走向了婚姻，就应该学会接受并习惯；但有些人，在婚姻和情感上具有很大的排他性，通常只喜欢某一种人或某一类人，只看得上他们，和他们说得来，合得来，也乐于投入感情，除此之外，他们对其他类型的异性几乎不来电，也没有感觉，爱理不理，很难沟通，更难喜欢上、爱上——如果婚后的配偶凑巧不是自己所喜欢的类型，这些人就很容易和配偶发生口角或冷战。在生活中，夫妻发生口角时，也不善于排解，只会积郁在内心，习惯于生闷气，很容易造成夫妻之间的交流障碍。不善于改变自己和配偶，以便让自己的婚姻和配偶变得更好。总之，他们的婚姻适应能力很差，不懂得如何调整自己，既不善于适应其他种类的异性，更不善于适应婚姻生活。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四，反省能力不够&lt;/strong&gt;。婚姻，意味着现状，只要你接受了现状，你就得学会接受配偶，适应婚姻，而适应婚姻的关键在于反省能力。一个人婚后有这样那样的不满，通常和自身的欲求有关，有些人对于配偶和婚姻的欲求过高，总认为自己应该和更好的人结婚，有更好的家庭，并且不知道修正、调整对于婚姻和配偶的期望值，也不知道放下过高的标准，排遣并清理内心的心结，导致自身长期处于对婚姻和配偶不满的状态。还有些人喜欢才子或佳人，配偶却不是，难免心怀不足，却不知道才子稀罕，佳人难得。有些人以初恋为情感的标准，却不明白一个人终其一生初恋只有一次，并且不可复制。有些人生活在幻想之中，虽然自身的相貌和各方面条件平平，却渴望遇上一个完美无缺的白马王子，拥有一段风花雪月的圆满爱情，明明不切合实际，然而始终难以放下这种幻想。有些人只渴望别人来疼，来爱，却不知道情感上也没有免费的午餐，只有付出才有收获。有些人的老婆或丈夫其实很不错了，但这些人这山望着那山高，总认为老婆或丈夫是别人家的好，始终不知道满足。&lt;/p&gt;
&lt;p&gt;我在网络上帮人疏导，经常感到不少人对婚姻和人性的认识存在着偏见和误区，我想，这也就是为什么他们对婚姻有这么多疑惑和不解的原因，也是他们婚姻不幸的原因吧——非得遇上自己“喜欢”“爱”“有感觉”“来电”的才结婚，并且这些喜欢、爱、来电和感觉，往往都建立在对于情感和爱人偏执、成见甚至幻想的基础上，世界上哪有那么多的好事？可以想象，如果一个人预设一个标准，只“喜欢”某一类型的异性，那么，他（她）将失去很多的机会；实际上，“喜欢”带有很大的主观性，类似于人的口味，喜欢吃清淡的人，后来也可以喜欢上麻辣，对不对？如果你坚持你的清淡，你错过的将不仅仅是一道水煮鱼，而将错过整个川菜。&lt;/p&gt;
&lt;p&gt;例如，有个女人明明遇到一个很好的男人，但仅仅因为这个男人不是她喜欢的版型——这个女人喜欢韩版的花样美男，皮肤白皙，腿长脸瘦，长相清秀——就放弃了；对另一半的偏见和成见如此之深，让我觉得这个女人根本就是一个幼稚的人，婚姻修养远远不够，尤其是婚姻适应能力极差，并不适合结婚。&lt;/p&gt;
&lt;p&gt;《增广贤文》中说：“一日夫妻，百世姻缘。百世修来同船渡，千世修来共枕眠。”婚姻这些大学，更多需要夫妻双方相互理解、包容、扶持，才能长久经营，白头到老！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;118&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-118/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-118/</guid>
      
    </item>
    
    <item>
      <title>心灵鸡汤</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;现如今生活压力和成本越来越大，各种焦虑充斥，于是有了各种的心灵鸡汤，Chicken Soup。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;三观正，内容积极的鸡汤偶尔看看未尝不可，但是每个人的经历不同，对鸡汤的解读也不一样。有一些你觉得很对你口味，可以让你瞬间能量满满的鸡汤，在别人眼里可能恰恰成了对他(她)含沙射影的矛头。&lt;/p&gt;
&lt;p&gt;所以，心灵的鸡汤，有空的时候可以看一看，权当调节一下情绪。但是，请记住不要在公众场合轻易去转发，尤其是微信、朋友圈之类的社交平台。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;136&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-136/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-136/</guid>
      
    </item>
    
    <item>
      <title>心目中完美的知识管理工具</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最近对于笔记和博客，内心又开始有点躁动了——语雀、Obsidian、Notion 是我最爱三个候选，有时候一直在它们之间摇摆不定。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;V2EX 上《&lt;a href=&#34;https://www.v2ex.com/t/721418&#34;&gt;有没有一种知识管理工具，满足这些特性？&lt;/a&gt;》中作者列一些他心目中完美的知识管理工具，有一些共鸣：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;树状结构，代表了自己的知识体系。&lt;/li&gt;
&lt;li&gt;标签 tag，可以从不同的角度，组织自己的知识，作为树状知识体系的重要补充。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown&lt;/strong&gt;，编辑起来够方便，节约时间到知识管理上。&lt;/li&gt;
&lt;li&gt;本地加解密，多端同步，既有不同客户端的同步便利，又有&lt;strong&gt;明文数据只存储在本地的安全&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;笔记+博客&lt;/strong&gt;，既可以满足私密的记录，又可以满足公开内容的分享和归档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精准搜索&lt;/strong&gt;，方便从几百上千笔记定位到想要的记录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;语雀很好，但非明文的数据存储总让我如履薄冰，另外一边 Obsidian/Notion 也还没有强大到让我立马转移阵地的欲望。&lt;/p&gt;
&lt;h2 id=&#34;mark-一下&#34;&gt;Mark 一下&lt;a class=&#34;headerlink&#34; href=&#34;#mark-一下&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;看了一些工具，感觉还不错，先 Mark 一下，后续有需要可以研究一下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Obsidian + &lt;a href=&#34;https://github.com/abserari/quartz&#34;&gt;Quartz&lt;/a&gt; Publish Web HomePage（Eg. &lt;a href=&#34;https://notes.abser.top/&#34;&gt;https://notes.abser.top/&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tangly1024.com/article/notion-next&#34;&gt;NotionNext-快速免费搭建网站 | Tangly Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.v2ex.com/t/947306&#34;&gt;用 notion 搭建的博客上线，硬加一波友联&lt;/a&gt; - V2EX&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;132&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-132/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-132/</guid>
      
    </item>
    
    <item>
      <title>战地之王</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;作为战地之王《A.V.A》这一款游戏超过 10 年的老玩家，从国服于 2019 年 9 月 25 日 11:00:00 正式停止运营，到 2020 年开始进入台服，一直玩到现在，平淡无奇的生活也总能多了一点乐趣。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;2023.05.20.Sat. - 台服·极速危机&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmyzcrYd1zobC_Gc_fbMwM2TqQox.jpeg&#34; title=&#34;2023.05.20.Sat. - 台服·极速危机&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2023.06.05.Sun. - 台服·生化危机.Adv&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fi1zAGARBgwaoPflLSoWDpfO0Gad.jpeg&#34; title=&#34;2023.06.05.Sun. - 台服·生化危机.Adv&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;台服·铜箱子&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FplprU1jPMWJ8jdi3KG2EGLpgRqV.jpeg&#34; title=&#34;台服·铜箱子&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Steam 国际服&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fsc7_k15ieP_RPERKnG5_i3Jaa-6.jpeg&#34; title=&#34;Steam 国际服&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;134&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-134/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-134/</guid>
      
    </item>
    
    <item>
      <title>手续费和年利率</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;相信很多人在使用信用卡刷卡之后，都会收到银行的热心短信甚至是电话，提醒用户可以使用分期还款的服务。而银行给出的理由是，分期有很多好处，比如可以延长信用卡的还款期，减轻短期资金压力，避免造成信用卡逾期等等。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;card-1.jpeg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FndCPBAg8LCuDmr4Xr_GVfSguPVC.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;但是实际上银行也是无利不起早，如此热心肠的建议用户选择分期还款，显然没安好心。那么信用卡分期还款，对于银行来说究竟有什么好处呢?其实很简单，用户分期还款可以为银行带来收益，而最后还款日之前全额还款，银行从用户身上赚不到一毛钱。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;card-2.jpeg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FqkTCnKfIvPFkQe8NYlcmsW61xt9.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从银行的角度来说，大力推广信用卡业务，最终还是为了实现盈利。而如果大部分的信用卡用户，都正常刷卡消费，按时还款，不超额不取现，也没有分期还款，一切都循规蹈矩，那么其中就不会产生任何费用，银行就真得成了慈善机构了。&lt;/p&gt;
&lt;p&gt;因为用户从信用卡透支的资金额度，这些借出去的钱对于银行来说，是在不停产生利息费用的，如果不能从信用卡用户身上赚钱，那么银行实际上是在亏损的；除此之外，还要算上银行信用卡业务部门的运营费用等等，恐怕都是一笔不小的开支。&lt;/p&gt;
&lt;p&gt;所以银行会想尽一切办法从信用卡用户身上获得收益，目前信用卡产生收益的途径，除了分期还款的手续费，还有信用卡提现手续费、信用卡年费、逾期利息和滞纳金。逾期产生的收益对于银行来说存在一定的风险，而年费和提现手续费的收入显然是非常有限的，因此分期还款收益，就成为了银行信用卡业务的最重要利润点。&lt;/p&gt;
&lt;h2 id=&#34;错误的年利率计算&#34;&gt;错误的年利率计算&lt;a class=&#34;headerlink&#34; href=&#34;#错误的年利率计算&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;大多数银行信用卡账单分期，手续费约为 0.6%。一般人认为年利率也就是 0.6%*12=7.2%，乍一看不算高。以某银行信用卡 12000 元分 12 期为例，我们来看看信用卡分期手续费率到底有多高。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每期（月）应还款的金额：本金为 12000/12=1000 元，手续费为 72。&lt;/li&gt;
&lt;li&gt;每月实际还款数：1000+12000&lt;em&gt;0.6%=1072，那么 12 期下来总共的利息就是 72&lt;/em&gt;12=864，银行所谓的年息(年利率)也就是 864÷12000=7.2％。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是这样的计算方式是有问题的。这其中最重要的一点就是，&lt;strong&gt;持卡人并非一直欠银行 12000 元，而是随着每月的还款，资金占用是一直在降低的。&lt;/strong&gt;最后一个月时，持卡人实际上只欠银行 1000 ，但是仍然要按照 12000 的全额的 0.6% 还手续费，仍须归还 1072 元。&lt;/p&gt;
&lt;h2 id=&#34;正确的年化利率计算&#34;&gt;正确的年化利率计算&lt;a class=&#34;headerlink&#34; href=&#34;#正确的年化利率计算&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;假设贷款总额为 m，共分期 n 期，每期手续费 a%，实际年化利率为 b%。实际年化利率计算如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从最后一期到第一期，每期实际占用银行资金为 &lt;strong&gt;1m/n&lt;/strong&gt;、&lt;strong&gt;2m/n&lt;/strong&gt;、……、&lt;strong&gt;nm/n&lt;/strong&gt;，共 n 期；&lt;/li&gt;
&lt;li&gt;则总占用银行资金（以月为单位）为 &lt;strong&gt;m/n&lt;/strong&gt; + &lt;strong&gt;2m/n&lt;/strong&gt; + …… + &lt;strong&gt;nm/n&lt;/strong&gt;，为 &lt;strong&gt;(1+2+ …… +n)m/n&lt;/strong&gt;，简单的数列求和，化简后为 &lt;strong&gt;(n+1)m/&lt;/strong&gt;2；&lt;/li&gt;
&lt;li&gt;n 期共还银行利息为 &lt;strong&gt;m&lt;em&gt;a%&lt;/em&gt;n&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;实际年化利率 &lt;strong&gt;b% = amn%/m(n+1) /2 /12&lt;/strong&gt;，化简后为 &lt;strong&gt;b = 24 _ a _ n / (n+1&lt;/strong&gt;)；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以实际年化利率是：&lt;strong&gt;24 _ 每期手续费 a% _ 分期 n 期/(n+1) &lt;/strong&gt;；拿银行常见分期手续费每期 0.6% 来算，实际年利率：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 期为： 24 _ 0.6 _ 3 / 4 = 10.8%；&lt;/li&gt;
&lt;li&gt;6 期为： 24 _ 0.6 _ 6 / 7 = 12.34%；&lt;/li&gt;
&lt;li&gt;12 期为：24 _ 0.6 _ 12 / 13 = 13.29%；&lt;/li&gt;
&lt;li&gt;24 期为：24 _ 0.6 _ 24 / 25 = 13.82%；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以银行总是想办法让顾客分期，最少的 3 期分期，实际年化利率也要在 10% 以上。当然，大多数情况下，信用卡用户在有能力全额还款的情况下，都不会选择分期还款，但是也有一部分用户即使还得起，也禁不住银行的三言两语，认为反正银行的钱，不欠白不欠，反正也没有多少手续费，这种想法显然是大错特错了。&lt;/p&gt;
&lt;h2 id=&#34;息率和费率区别&#34;&gt;息率和费率区别&lt;a class=&#34;headerlink&#34; href=&#34;#息率和费率区别&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对于消费者，每个月还给银行的钱是不是都一样，如果不一样，哪个更划算？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;银行利率小编，《&lt;a href=&#34;https://www.yinhang123.net/dkzs/xiangguandaikuan/1173745.html&#34;&gt;银行贷款利息的把戏：你知道真正的银行贷款年化利率是多少吗？&lt;/a&gt;》，银行信息港&lt;/li&gt;
&lt;li&gt;Quinn，《&lt;a href=&#34;https://www.zhihu.com/question/29996548&#34;&gt;信用卡分期的实际利息是多少？具体怎么计算？&lt;/a&gt;》，知乎&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;139&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-139/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-139/</guid>
      
    </item>
    
    <item>
      <title>搜狗拼音输入法</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;这是关于输入法的第二篇乱弹笔记。专门聊一下我和搜狗输入法的那些事情~    &lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;搜狗拼音输入法.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgzbAuzkS4vpjdfgkVnYQOP4eaEe.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;收藏的皮肤&#34;&gt;收藏的皮肤&lt;a class=&#34;headerlink&#34; href=&#34;#收藏的皮肤&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;各大输入法的皮肤都很多，眼花缭乱。&lt;/p&gt;
&lt;p&gt;个人比较喜欢搜狗输入法的一款皮肤：&lt;a href=&#34;https://pinyin.sogou.com/skins/detail/view/info/572400&#34;&gt;【鹿】四君子-兰 - 搜狗输入法 - 搜狗皮肤&lt;/a&gt;，简洁，最重要的是纵向排列形 的状态栏不会把 Windows 的任务栏挡住！&lt;/p&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://pinyin.sogou.com/images/help/s_mkskin/makeskin(s).pdf&#34;&gt;https://pinyin.sogou.com/images/help/s_mkskin/makeskin(s).pdf&lt;/a&gt;    &lt;br /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgRemRjcu9D3Th3yX0WllRBBAv1L.png&#34; /&gt;
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiGsKAnk4g1awYIMj6WdVD9eQ4fW.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;皮肤无法解压&#34;&gt;皮肤无法解压&lt;a class=&#34;headerlink&#34; href=&#34;#皮肤无法解压&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;搜狗官网下载的皮肤基本都是没法用压缩软件打开的，具体原因参考《&lt;a href=&#34;https://linux.zone/5616/comment-page-1#comment-12770&#34;&gt;搜狗输入法 .ssf 格式皮肤无法解压的原因 | Linux 区&lt;/a&gt;》。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本来想给 Manjaro 的 fcitx 搜狗拼音多安装一些皮肤，结果发现从搜狗官方下载的大部分皮肤并不能如其所说修改为 zip 格式之后就可以用压缩软件打开。&lt;/p&gt;
&lt;p&gt;后来&lt;a href=&#34;http://pinyin.sogou.com/bbs/forum.php?mod=viewthread&amp;amp;tid=729709&amp;amp;highlight=ssf&#34;&gt;探索发现&lt;/a&gt;原来是因为“.ssf”皮肤还有一种 Flash 格式的，搜狗官方说“&lt;a href=&#34;https://pinyin.sogou.com/open/faq.php?id=85&#34;&gt;为了防止作者辛苦制作的 Flash 被盗用，维护作者权利，不允许对官方审核通过的 Flash 皮肤进行解压缩和编辑。&lt;/a&gt;”真没想到 Flash 这种优秀的闭源软件能够通过这种方式生存下去，而且还被用之于反抄袭反侵权，心里莫名感动了一下。&lt;/p&gt;
&lt;p&gt;再后来又发现，不能解压的 .ssf 皮肤不一定是 Flash 格式皮肤，就算普通 ssf 皮肤也受到了版权保护，有人在搜狗论坛上给出了答案：“&lt;a href=&#34;http://pinyin.sogou.com/bbs/forum.php?mod=viewthread&amp;amp;tid=2712039&amp;amp;extra=page%3D2&#34;&gt;为了防止作者的作品被修改盗用，官网下载的都是加密的&lt;/a&gt;”。&lt;/p&gt;
&lt;p&gt;通过加密的方式来防止修改盗用、保护劳动者的著作权，这简直是肥佬斯托曼 &lt;a href=&#34;https://www.linux.zone/archives/6211&#34;&gt;GNU 思想&lt;/a&gt;的“死敌”啊，不得不表示支持！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;异常问题处理&#34;&gt;异常问题处理&lt;a class=&#34;headerlink&#34; href=&#34;#异常问题处理&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;之前在《&lt;a href=&#34;https://www.yuque.com/shenweiyan/mind/input&#34;&gt;输入法，哪一个才是我的菜？ · 语雀&lt;/a&gt;》提到过搜狗中文输入法在 MobaXterm 异常的问题，有待修复。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yuque.com/shenweiyan/wow/srqyqv?view=doc_embed&amp;amp;inner=comment-21750872&#34;&gt;札记 | 2021&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjpghqJs-16Udl2XmpLT87Vs0g0m.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;120&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-120/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-120/</guid>
      
    </item>
    
    <item>
      <title>新冠那点事</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;距离 2022 年的圣诞也只剩下 4 天了 —— 2022 年的最后一个月是一个充满纷扰和闹心的灰色月！家庭永远是主旋律，只是有时候点点滴滴的琐事真是让人头大，身心俱疲。
其次就是新冠放开后的一些经历。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;珍惜&#34;&gt;珍惜&lt;a class=&#34;headerlink&#34; href=&#34;#珍惜&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从 12 月 1 日广州开始解封不用核酸开始，从核酸难、抢药（虽然自己没有加入抢药大军）备药、接种第四针、被羊群包围 ...... 的一堆经历算起，看着周围一个个的同事亲友先后加入羊群，自己一家人依然坚挺，相安无事，作为天选打工人，心底多少还有些侥幸的心理——该打球的时候一场不落，在做足预防情况下该出去玩还是继续出去 —— 只是暂时放弃了那些人多风险又大的场所。
&lt;img alt=&#34;871c3f9543ea508b375ad5609c408cc.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FqNT7d4e9nwmkYhHHM0AI5LaE57q.jpeg&#34; /&gt;
&lt;img alt=&#34;8d3ab4784f01d80fa7ef78ab9487a13.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fm5-9BT7zcBsr8brMDw2Fo6GfWjU.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;710f72f99338338f384828a6a49c402.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlTU3NvkQH5CydjWBnvLq8eCldUw.jpeg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;羊群小记&#34;&gt;羊群小记&lt;a class=&#34;headerlink&#34; href=&#34;#羊群小记&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;记录一下感染后的一些感受。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 21 日，星期三，冬至前一天&lt;/strong&gt;
醒来发现老妈咳嗽好几天今天愈发严重，于是老婆把奶奶和孩子的样本拿回去核酸检测 —— 奶奶阳了。真是应了那句话 ——“&lt;strong&gt;最终大家其实都会被感染的，就是感染的时间长或早还是晚而已。&lt;/strong&gt;”之前一直想着如果感染了，其实也没必要过分担心，就当普通感冒处理即可，但真到了那个点还是有点紧张。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 22 日，星期四，传统冬至&lt;/strong&gt;
但不幸的是我们一家全阳了：老婆孩子从晚上开始发烧+咳嗽，我也在咳但症状相对轻一些。于是给媳妇和孩子湿毛巾敷头降温——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;晚上睡觉总会惊醒——睡不踏实，小孩子每个 1、2 个小时就惊醒一次要起来喝水；&lt;/li&gt;
&lt;li&gt;媳妇低烧，头痛，发冷，扁桃体发炎，还来 M；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 23 日，星期五&lt;/strong&gt;
照顾着孩子折腾了大半夜，我迷迷糊糊的到了第二天，还能挣扎着勉强去上班，头晕，全身酸痛，发冷+发烧，虽然中午在公司做了一次核酸，但其实也心知肚明逃不掉了。。。整个人也还是没啥精神头，大部分时间就想躺着。反正今天正好周五了，等休整完这个周末再说吧。
到了晚上，实在扛不住头痛发烧头晕的滋味，吃了一片感康，才迷迷糊糊的睡去了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 24 日，星期六，西方平安夜&lt;/strong&gt;
周五在公司做的核酸结果出来了——正式加入羊群！
晚上不时惊醒+依然的怕冷，喉咙干+咳嗽+疼痛；白天虽然症状略好，但依旧有些许发烧头晕的感觉，也提不起什么精神，总想着躺下来休息。
相对前一天，喉咙的痰明显多了很多。
好吧，再来一片感康吧 😢&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 25 日，星期天，圣诞&lt;/strong&gt;
算起来，这是感染新冠的第三天了。
头痛发烧头晕的滋味终于是彻底消失了，喉咙干+咳嗽+痰多成了重点。
——从丈母娘那里要了个偏方：&lt;strong&gt;橘子肉上撒上少量的盐，蒸后吃&lt;/strong&gt;——颇有效果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 26 日，星期一&lt;/strong&gt;
第四天。
依旧是喉咙干+咳嗽+痰多，但整个精神相对好很多了，明显感到好转。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 27 日，星期二&lt;/strong&gt;
第五天。
偶尔的咳嗽，痰也少了很多，自行做了抗原，已经快要看到胜利的曙光了。
&lt;img alt=&#34;8ed1181a14c2a22a42b0d6d2d32c5fd.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhT2cjs390H5-wyIZilSm86cj9iC.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022 年 12 月 28 日，星期三&lt;/strong&gt;
第六天。
早上起来做了一次抗原，已经看到明显转阴！
&lt;img alt=&#34;4085e73e8cfefc93bc1be4d82fac2eb.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fl9OT9nj5TuksoGyrXNPaaGaWA6W.jpeg&#34; /&gt;
&lt;img alt=&#34;a534846014285c10c2d04f6dead516b.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fhwd0UAF_5J5m-1MygGo1LrxH77f.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;——开始回去上班了。。。。。。&lt;/p&gt;
&lt;h2 id=&#34;后话&#34;&gt;后话&lt;a class=&#34;headerlink&#34; href=&#34;#后话&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;虽说我也知道这个病毒有点狠，但是其传播范围和力度还是有点超乎自己的想象，几天时间就把全家老小都放倒了，实属匪夷所思。&lt;/p&gt;
&lt;p&gt;大家还是要多多注意和防护吧，希望大家都能健健康康，我们都能尽早回归正常的生活。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;127&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-127/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-127/</guid>
      
    </item>
    
    <item>
      <title>沉默的大多数</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;一个人要有自己独立的思想，任何想将个人的思想凌驾于大众或迫使大众去遵从的都是不对的。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;the-silent-majority&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlRC4s8ZvXXS3-sdVhPDW9i5vEYa.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;拿破仑说：一头狮子带领的一群羊可以打败一只羊带领的一群狮子。&lt;/p&gt;
&lt;p&gt;在小区的业主群，群主却整天私推他个人合作的产品，霸占群主却毫无作为，不知道大家是什么感觉。&lt;/p&gt;
&lt;p&gt;本来业主群就是一个团结广大业主，维护利益，促进交流的一个组织。当作为开发商、物业的服务性组织和业主群体出现利益冲突时，为争取广大业主的合法正当利益，很多时候都需要在这些群组织来集合众业主的力量，群策群力，努力去争取。比例小区停车收费，小区娱乐设施安全，环境卫生监督，......，等等，相信这一类事情上群体的意见总会比单个业主更有说服力，这时候，不管是信息传递公开，还是意见收集反馈，群主和群管理人员都是极其关键的。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;116&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-116/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-116/</guid>
      
    </item>
    
    <item>
      <title>清明节前，狂风暴雨时</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;距离 2022 年的清明节还有一周多的时间，时值星期五，而此刻窗外正大雨绵绵，人坐在办公室看着窗外人来人往，心中百感莫名。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;rain.jpeg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fo5_rSWBpQGFjwmSylWa12PI5iva.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近的一段时间，工作上的事情乏陈可数，一切都按部就班，整天一股混吃等死的心态。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FvyEoSGSOvS3oOG1mCEBDoF_oWLY.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;生活上越来越朝着问题叠着问题的常态化发展，大事没有小事不断。小区也在前几天刚经历了 3 天内两次被封的尴尬，第一次是在下午刚回到家就被告知整栋楼禁止出入，然后是核酸，第二天解封；第二次是周一刚起床想着去上班，到了楼下发现又被封掉了，到了九点多收到街道办通知解封。作为开放式小区，物业不作为，进出不管控，说封楼就封楼也没有任何官方文件通知，这样的物业难怪会被那么多租客业主骂。
&lt;img alt=&#34;cc1621762b0f0a5859ab75e441eef8e.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnqrPfQaTPx6wdEVYnjzQBXIqssE.jpeg&#34; /&gt; &lt;img alt=&#34;550cb7171f51062929306ad59cbdcab.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fm5-nmDs5xvUqfD1u0Vx3UNjrTLg.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;关于工作，虽然每个人都很辛苦，但你又凭什么要求所有人都了解你的辛苦。关于生活，古语说：“辱不及父母，骂不及妻儿，纵言辞不敬，亦不失风度。”
&lt;img alt=&#34;e99e42ffa041b6cbf8235d9b58caedb.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FrCLisEBWRCrRitWsdGO3n5jyeUt.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;有些事情，不必看的那么重，一场球的输赢不重要，有时候情商和宽心的话语可能更让人坦然，一些迟来才明白的道理，终归需要好好体会细品。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpXhN8ucCI0HowK_Bpwe30HhBxZu.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近有些事情想的太多，有时候就是自己的一厢情愿。它就像一根救命稻草，横在你心里，让你还有念想，还心存侥幸！&lt;/p&gt;
&lt;p&gt;胡言乱语的碎碎念无休无止，念念不忘的游戏跃然心头 —— 生活不休，至少还有游戏，还能写写文字。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;124&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-124/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-124/</guid>
      
    </item>
    
    <item>
      <title>热成狗</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2023 年广州酷热的天气好像比以往都要更早一些，从 5 月中下旬气温就开始陡升，一直持续在 38° 左右 🌞🌞🌞&lt;/p&gt;
&lt;p&gt;如此酷热的天气，让一切都变成了无精打采，就连写个文章记个小记都懒得动笔了；加上 5 月下旬又严重的病毒性感冒了两次，好不容易缓过来后，整个人感觉都要蔫掉了。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;e549b5af315700a9b3e7747b1623398.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiqCEjITPiIwdeNGXLvHmuCbyWSG.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;顶着酷热，参加了女儿在幼儿园的第一个六一儿童节亲子活动 🏃&lt;/p&gt;
&lt;p&gt;顶着夕阳，陪着女儿开始轮滑从零到一的入门 🌞&lt;/p&gt;
&lt;p&gt;夏天就这样悄然而至，我们就只想吹着空调，吃着冰镇西瓜，窝在家里，闻着花露水，穿着人字拖，晃悠，晃悠 。。。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;133&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-133/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-133/</guid>
      
    </item>
    
    <item>
      <title>电子产品魔怔</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;最近一段时间，对手机、耳机、笔记本、键盘......又开始有点走火入魔的感觉，总想着去逛闲鱼，刷 V2EX 的交易频道。作为一个家庭奶爸，奈何囊肿羞涩，也只能是看看。&lt;/p&gt;
&lt;p&gt;发现几点有意思和诡异的事情。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;ol&gt;
&lt;li&gt;2020 年 6 月 23 日，在华为商场入手了一台荣耀 20 PRO（8+128）才 2089 大洋，现在在荣耀商城（2020 年 11 月中，荣耀从华为拆分出售）反而需要 2699，而且没货！难道是因为 6.18 促销？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpzZbZZppRi0oju4m2EKoTIFv_vs.png&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;受美国制裁，感觉华为很多手机都处于缺货状态，甚至拆分出来后的荣耀很多手机也缺货。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3 月中，给老婆入手了一台 Redmi Note 9（8+128），发现 MINUI 在流畅度上跟华为的 EMUI 的确有一定差距，6000 毫安的电池居然比上一部荣耀 Play3 4000 毫安续航更差。第一次入手小米，体验略差。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Type-c 耳机有没有什么转接头可以插到 3.5mm 的手机耳机接口，发现目前貌似只有这一种的转接头，或者是 Type-c 转 USB 的！&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiK7dE_WbvLv7MJjCRgSA5AA47_y.jpeg&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;对于手机，自己更愿意接受 2000 以内的，最多不超过 3000。更关心拍照好和长续航的表现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上一部 iPhone 6S 用到最后，续航和信号都大打折扣，苹果好用是好用，贵！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于耳机，半入耳最舒服，更喜欢长续航的蓝牙耳机，要求不高，了解不多，持续关注一下。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;142&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-142/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-142/</guid>
      
    </item>
    
    <item>
      <title>疫情下的广州</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;2021 年，从 5 月 21 号以来，新冠疫情开始在广州出现反弹并引起了广泛的关注。——广州本次疫情肇始于 5 月 21 日，广州荔湾区陆续出现确诊病例和无症状感染者，成为此次疫情复发的核心区域。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;新冠防护&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgQa3Gs43JyUxwje5VTsiNY5IyXT.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;由于一直工作生活在黄埔区，对荔湾区、南沙区的新冠疫情也没有太大的关注。在 6 月 7 日前，遛娃、打球、逛逛万达，还是一切照旧，只是自觉的把活动范围缩小到了所在的小区附近。&lt;/p&gt;
&lt;p&gt;到了 6 月 8 日，收到了&lt;a href=&#34;http://wglj.gz.gov.cn/xxgk/gzdt/tzgsgg/content/post_7320215.html&#34;&gt;通知&lt;/a&gt;，&lt;strong&gt;要严格公共文化旅游场所疫情防控&lt;/strong&gt;，于是电影院、剧院、KTV、网吧都暂停了营业，各种吃饭的地方也开始&lt;strong&gt;限制堂食服务&lt;/strong&gt;。  &lt;br /&gt;
&lt;img alt=&#34;广州市文化广电旅游局关于进一步加强文化广电旅游业疫情防控工作的通知.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fnkgi5WbDiCC-q5TQMsmQC24rB_H.png&#34; /&gt;    &lt;/p&gt;
&lt;p&gt;最直观的影响是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;去楼下的肯德基，不能堂食了！&lt;/li&gt;
&lt;li&gt;不可以去网吧玩自己最喜欢的游戏！&lt;/li&gt;
&lt;li&gt;很多地方撤销了餐椅座位，像楼下的喜洋洋、旁边的肯德基、麦当劳等等！&lt;/li&gt;
&lt;li&gt;孩子每天去的万达宝贝王、红孩子都暂停营业，现只能在家、楼下滑梯玩！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于核酸检测，2021 年 6 月 4 日小区开始了第一轮全员核酸检测，由于缺乏排队经验+刚好是周五，从下班回到家 18 点开始排队折腾到 20 点以后才把一家 4 口的核酸搞完！
&lt;img alt=&#34;49aee5f8a483015c75cebe440dd10b2.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fh0y1NZkTXHOXI1L4pBdk5fpBw57.jpeg&#34; /&gt;
&lt;img alt=&#34;405efbf96251389a76964630b216213.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fto1hbZsf_kPzPWNBMYl7W-67_I9.jpeg&#34; /&gt;
相比个人的辛苦，真心要感谢无私奉献帮助我们的广大医务工作者和那些志愿者们！&lt;/p&gt;
&lt;p&gt;最后，想说一下的是端午节最后一天黄埔区联和社区临时通宵检测核酸！&lt;/p&gt;
&lt;p&gt;事情缘由是小区附近的龙光峰景华庭、万科城科景路发现异常（具体什么情况众说纷纭，有人说是发现核酸阳性人员；有人说是密切接触者在其他区核酸检测阳性，出于安全考虑对原居住地封锁排查；......）。&lt;/p&gt;
&lt;p&gt;后来才知道真实情况，其实是这样的：&lt;a href=&#34;https://mp.weixin.qq.com/s/7r6XQpCQqdXuZKwt9szxkA&#34;&gt;黄埔为何新增 2 个封闭重点场所？有病例发病前一周曾临时居住！联和街道管控区今开展第二轮核酸检测&lt;/a&gt;。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiX8O7C7HR6s88nCOnQvwpUYXHmw.png&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fpwpkik6Ly5AauN9rmKLMlxg4_iE.png&#34; /&gt;
这是距离新冠战场最近的一次核酸排查，由于最早就看到了信息，一早就去楼下的核酸检测点排队去了。&lt;/p&gt;
&lt;p&gt;本来通知的是 19 点开始，不知道什么原因一直等到差不多 19:40 左右才开始，而且这次的检测也由原来的 10 人一组调整为 5 人一组，所幸的是相比前两次，这一次临检增加了多个核酸的检测点，效率提升了很多！
&lt;a href=&#34;https://mp.weixin.qq.com/s/y4xx_aVk_7sz2hBWW_HIZw&#34;&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FkCySO1eJfP32jctok_nl5xLc4ve.png&#34; /&gt;&lt;/a&gt;
关于广州的疫情反弹：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;广东是疫情期间入境人数最多的省份，而境外输入是疫情传播的一个主要环境，恰恰很多境外游客的第一落地点广州，广东扛住了这大多数的风险。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;广东疫情无症状感染者多，这些人往往不知道自己感染了病毒，但却有同样的传播能力，还有部分新增感染者曾隐瞒行程也让筛查难度加大，给疫情增添了难度。但是广东的防控一直做的很好，并且没有更进一步扩大传播范围。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;专家研判分析认为，随着行之有效的聚集性疫情处置措施落实到位，本次广州疫情呈现阳性感染者逐渐减少的走势，疫情防控形势已经趋于缓和，在向着非常积极的方向发展，疫情处于可控状态，但不排除还会有散在病例发生的可能。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;广东的防控一直做的很好，并且没有更进一步扩大传播范围。专家认为，广东疫情用不了多长时间，就会得到一个很好的控制。建议大家非必要不离穗，暂不外出旅游，减少疫情传播的风险，共同努力争取疫情早日结束。&lt;/p&gt;
&lt;p&gt;感谢广大医务工作者和志愿者们，疫情期间不乱跑，减少出行，一起加油，一起努力！
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FgXYFUyv07iayiY2sO2BWkWmVLgt.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;144&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-144/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-144/</guid>
      
    </item>
    
    <item>
      <title>笔记的那些事</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;这些年来笔记换的比较少——主要是从 2018 年以来，一直用语雀作为主力笔记懒得去折腾了。但是到了 2022 年，事情似乎出现了一些转变。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://1.bp.blogspot.com/-sP6euyqs1pc/XUMAy04i4gI/AAAAAAAGpAM/MThDM11XjO8B3WoScwLaGsvnz_uVhaN-QCLcBGAs/s1600/StockSnap_TBJ9OPDGMK%2B%255B2%255D.jpg#from=url&amp;amp;id=Xwf5S&amp;amp;originHeight=903&amp;amp;originWidth=1600&amp;amp;originalType=binary&amp;amp;ratio=1&amp;amp;rotation=0&amp;amp;showTitle=false&amp;amp;status=done&amp;amp;style=none&amp;amp;title=&#34; /&gt;
首先，是语雀的个人用户的话题知识库下线——并入了空间；
其次，语雀的问题反馈，由原来的公开可讨论转变成了类似私信一样的单向反馈；
第三，语雀 2022 年秋季知识库大会的会员收费风波！——语雀的定位改变为&lt;strong&gt;创作工具&lt;/strong&gt;，而不在是&lt;strong&gt;内容社区&lt;/strong&gt;，相应的新的付费策略，也会造成了免费用户无法继续用语雀作为自己的个人博客。这是最致命的一次信任危机。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.yuque.com/docs/share/26348e63-d6f2-464c-889c-2af952f1144d&#34;&gt;语雀个人版新定价的细则和思考&lt;/a&gt; - 境同&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.yuque.com/yubo/morning/thinking-of-yuque-price&#34;&gt;语雀个人定价调整的致歉&lt;/a&gt; - 玉伯&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zhihu.com/question/562238887&#34;&gt;如何看待语雀付费策略？&lt;/a&gt; - 知乎&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然个人的语雀付费已经到了 2037 年，但是随着越来越多的文档托管在了语雀，不支持批量 md 导出的确让人心生忧虑。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmTgoSK6IXHA4fWaCxC0WVjS7dpU.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;几经考虑之下，在开始 Plan B 前先明确一下个人使用云端笔记无非基于几点考虑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;同步方便，现在更加注重数据自己可控，最好笔记可以批量导出，或者直接本地保存；&lt;/li&gt;
&lt;li&gt;同时支持私密、公开两种笔记模式；&lt;/li&gt;
&lt;li&gt;支持 markdown 语法；&lt;/li&gt;
&lt;li&gt;支持全文搜索；&lt;/li&gt;
&lt;li&gt;最好支持 web 直接使用；&lt;/li&gt;
&lt;li&gt;..............&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在 Obsidian 进行探索中，强悍的搜索，丰富的插件，算是吸引我的一个方面；如果不是官方提供的同步和发布插件价格相对贵了一些，或许早就从语雀开始往 Obsidian 进行迁移了吧！
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fn-sssMzVTYiuY-A7jth6NzAZGqH.png&#34; /&gt;
Obsidian 也是书本式的文章结构，这一点跟语雀是一致的，但界面的设计和逻辑要比语雀要好太多太多了，&lt;strong&gt;退一万步来说语雀甚至可以参考一下 Obsidian 的一些界面设计！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Obsidian 结合一些插件使用，可谓事半功倍。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhZ4GJBNWpfihTd4KUimGAzE0I1w.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不得不说的一点体验。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用语雀这么多年，转战其他笔记软件真是一件费心又纠结的事情——语雀的写作体验很好但界面逻辑和 UI 经常变，OBS 总体很完美但学习成本高。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;作为知识沉淀和管理，更希望能做到开箱即用，免去各种折腾的时间让用者专注于文字的组织和写作，从这一点来说，或许可以再给语雀一点时间，如果依旧是失望和粗暴，再做 Plan B 迁移也来得及。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还是选择继续回到语雀，且看它接下来一年的表现吧！&lt;/strong&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;125&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-125/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-125/</guid>
      
    </item>
    
    <item>
      <title>精致</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;陆陆续续找回了一些失联许久老同学/朋友的联系方式。&lt;/p&gt;
&lt;p&gt;打开他们的相册看曾经熟悉的面孔，感慨着那些没有被岁月这把杀猪刀蚀刻，不曾老去的容颜，脑海无缘由的就浮现出了这两个字。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;精致&#34; src=&#34;https://gi.weiyan.tech/2023/12/jingzhi.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;精致可以指容颜，更多时候还可以指生活的精致。这就是让自己过得更有品味，更加开心、舒适。而一些隐藏在日常里的小事，足以让我们变得精致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;爱好独特&lt;/strong&gt;、&lt;strong&gt;事业坚持&lt;/strong&gt;、&lt;strong&gt;感情独立&lt;/strong&gt;、&lt;strong&gt;居家讲究&lt;/strong&gt; ...... 可以说，追求精致生活是睿智的自然体现，注重低碳环保是一份博雅的情怀，更是一种静水深流的境界。&lt;/p&gt;
&lt;p&gt;学会去发现身边的美，然后把它们整理好。&lt;/p&gt;
&lt;p&gt;让自己有一种追求去做。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;130&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-130/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-130/</guid>
      
    </item>
    
    <item>
      <title>羽毛球</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;已经不记得自己最早接触羽毛球是什么时候了，但至少现在，它已经成为了我生命中最爱的运动之一。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;初中的时候，学校的教师宿舍楼前刚好有一个露天羽毛球场——那应该是我第一次知道羽毛球这个运动，那时候偶尔看到有人在打也没有怎么太在意。&lt;/p&gt;
&lt;p&gt;到了高中，尤其印象深刻的是一中游泳池旁边的那几个露天羽毛球场。由于寄宿住校，周末无聊的时候偶尔会约上同桌过来打上几场，那时候对羽毛球规则也不怎么了解，而且对于握拍基本也不得要领，更不要说步法、战术之类的，一切都是为了娱乐而娱乐。那个时候也不知道羽毛球还能双打，就只会一味的一对一在那里瞎挥拍。同桌那时候住在城区，家境比我好很多，见多识广的，前后吊球的打法经常把我打的上气不接下气——这一幕至今还历历在目。有时候遇上下雨，露天羽毛球馆用不了，球场的主席台有时候也能成为我们 &amp;ldquo;挥洒汗水&amp;rdquo; 的好去处。&lt;/p&gt;
&lt;p&gt;到了大学，延续了高中时期的爱好（高二开始，毽子开始风靡校园，也是从那时候开始到高中生涯结束，毽子成为了我高中后半段生涯的最爱，并延续到了大学），为此还特意加入了学校的毽球社（虽然毽子在大学并不是那么的风靡，但也总能找到不少喜欢这项运动的同窗）。对于羽毛球大学时期见的最多的也还是室外的场地，也是在那时候才第一次知道羽毛球还有室内的场馆，但由于室内场馆不多（也就偶尔上体育课自由活动玩了几回）。&lt;/p&gt;
&lt;p&gt;真正开始接触羽毛球是在华大实习的时候。主管领导们羽毛球都打的很好，于是提议部门组织经常打球，才真正开始接触并迷恋上这一项运动。有几点印象非常深刻。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次打球，不清楚大伙实力，私以为自己球技也能跟他们打上一打，没想到被啪啪啪打脸；&lt;/li&gt;
&lt;li&gt;打球就要好好打，要有打球的态度，虽然我们技术是业余的，但至少装备是专业的——&lt;strong&gt;衣服、鞋子、拍子是必备&lt;/strong&gt;。领导的这句话我到现在都还记得，并成为了我后面打球的一个标准。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于当时华大是有工会，并且每周有两次内部员工的羽毛球组织，加上部门小组的组织，一路打过来让自己的球技不断的提升。&lt;/p&gt;
&lt;p&gt;再后来，回到广州了。&lt;/p&gt;
&lt;p&gt;值得庆幸的是把羽毛球的这项运动坚持了下来！而且兜兜转转认识了现在的这一群球友，从 2020 一直玩到今天，中间有一些球友小伙伴离开了这座城市却也有一些新认识的小伙伴加了进来。打球，吃饭，吹水，平淡无奇的生活平添了更多的人间烟火气息。&lt;/p&gt;
&lt;p&gt;羽毛球是一项神奇的运动，也是一项比较烧钱的运动。人家说，&lt;strong&gt;没有一场球 (羽毛球) 是解决不了的，如果有那就再来一场。&lt;/strong&gt;深以为然，羽毛球打多了会上瘾，打完了这一场总期待着下一场，有熟悉经常一起打的小伙伴更是一种幸福。从另外一方面说，羽毛球的衣服、&lt;strong&gt;拍子&lt;/strong&gt;、鞋子、&lt;strong&gt;球&lt;/strong&gt;都是比较烧钱的必需品，尤其是拍子和球。&lt;/p&gt;
&lt;p&gt;个人最开始用的是胜利 &lt;a href=&#34;https://www.badmintoncn.com/eqm.php?a=view&amp;amp;eid=8504&amp;amp;mag_hide_progress=1&#34;&gt;CHA-9500C&lt;/a&gt;(挑战者 9500c) 这一款经典拍。
&lt;img alt=&#34;9500.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiBcredXmnwJAdwBbK9LOnyVRMma.jpeg&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;胜利羽毛球拍 9500 各版本区别&lt;/strong&gt;
9500 一共有四款，也就是 9500C、9500D、9500F 和 9500S，这四个版本各有什么区别呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;胜利 9500C 羽毛球拍和 9500D 羽毛球拍手感参数完全一致，只有涂装的不同！新涂装的 9500C，拍头涂装与 3 点 9 点与 9500 刚好相调换！其他地方几乎没有变化！&lt;/li&gt;
&lt;li&gt;9500C 和 9500F 属于老款，相对来说中杆较粗，72 孔。&lt;/li&gt;
&lt;li&gt;9500S 和 9500D 属于新款，中杆细，比较灵活，76 孔。&lt;/li&gt;
&lt;li&gt;在胜利羽毛球拍 9500 中，9500D 和 9500S 是此系列里的最新款，相比 9500C 和 9500F 来说，中杆变的更细了，中杆更改为 6.8mm 纤细中杆，其他就是涂装上的改变了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;后来，用过一段时间时间尤尼克斯的 NR-D11（现在好像已经下架了）。
&lt;img alt=&#34;79ad9ee19cb7b3ab45930ae15e606a5.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FmbE0yBR5I3RFnNiE-tHt-CoMjOq.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;现在，用着这一个从 2021 年中从中羽 200 来块买来的尤尼克斯 &lt;a href=&#34;https://www.yonex.cn/home/index/mall_detail/id/138&#34;&gt;AX69EX&lt;/a&gt;，太阳橙，3U，拉线 27 磅，95 线，打起来依旧杠杠！
&lt;img alt=&#34;AX69EX.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FsD-QpRkiRubiSXvqLXSlZcmvhcR.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如今，疫情远去，又到打球的好时机，以球会友，希望能越打越好，健康快乐。&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;129&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-129/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-129/</guid>
      
    </item>
    
    <item>
      <title>肘关节骨折</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;小孩子玩蹦蹦床不小心把手摔伤了，X 光拍片后诊断为骨折，需要打石膏治疗处理，脑补一下已经远去的解剖学知识。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;固定支架&#34;&gt;固定支架&lt;a class=&#34;headerlink&#34; href=&#34;#固定支架&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;关于骨折后的保守治疗是打石膏还是使用固定支架，可以参考这篇文章：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626836127&amp;amp;ver=3203&amp;amp;signature=5b*nem1TitY8KA1w6pJUR5TVVE7IjFVSP5mB7SOM2RGt8Tv0CgHeROa6IiHeV6bIuK7AdFYSl7WEc19XLArp0dPBhWEJBIWDz6VO4bQmAtGppxpClMFBVh-R3uG3OmOW&amp;amp;new=1&#34;&gt;骨折后，保守治疗选择石膏固定，还是支具固定？&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;根据骨折的稳定程度决定，稳定性好的骨折，可以采取支具固定；需要手法复位后再固定的，或者容易发生移位的骨折，建议打石膏固定，但可以缩短石膏固定的时间。比如常规石膏固定一个半月，可以石膏固定 3 周后改成支具固定。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FiensyyCY5JDCzGinx1RmUPgCblG.png&#34; /&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FhfwByktPr8Pf084YmPglSO0e4D2.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;肘关节解剖图&#34;&gt;肘关节解剖图&lt;a class=&#34;headerlink&#34; href=&#34;#肘关节解剖图&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;肘关节（elbow joint）是由肱骨下端与桡骨上端构成的复关节，包括三个关节：&lt;/p&gt;
&lt;p&gt;(1) 肱尺关节 （humeroulnar joint）：由肱骨滑车和尺骨滑车切迹构成。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlUF-EqlwGmYtSDHydq_IlI4BbLm.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;(2) 肱桡关节（humeroradial joint）：由肱骨小头和桡骨关节凹构成。
(3) 桡尺近侧关节（proximal radioulnar joint）：由桡骨环状关节面和尺骨桡切迹构成。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fpfdat_I-Yyk4zmR27f_qiKLjg-w.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上述 3 个关节包在一个关节囊内，肘关节囊前、后壁薄而松弛，两侧壁厚而紧张，并有韧带加强囊的后壁最薄弱，故常见桡、尺两骨向后脱位，移向肱骨的后上方。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fr-fmJUm3BnNndwQi0OpxgMPyMwZ.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;人体全身骨骼挂图&#34;&gt;人体全身骨骼挂图&lt;a class=&#34;headerlink&#34; href=&#34;#人体全身骨骼挂图&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;高清人体全身骨骼挂图(双语).jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjNy1VJvBVZJd3cqoFTRBRf7eCEF.jpeg&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;骨折的一些基础知识&#34;&gt;骨折的一些基础知识&lt;a class=&#34;headerlink&#34; href=&#34;#骨折的一些基础知识&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;骨裂和骨折&#34;&gt;骨裂和骨折&lt;a class=&#34;headerlink&#34; href=&#34;#骨裂和骨折&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;按程度不同，骨折可以分为不全骨折（断裂一部分，没全断）和完全骨折（全部断了）。完全骨折又分为无移位骨折和有移位骨折。&lt;strong&gt;在很多人的认知中，不全骨折和无移位的完全骨折被归类为骨裂，但它们其实都是骨折&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;骨裂往往由较小的暴力引起，没有明显移位，通常不需要手术治疗，只需要石膏、夹板、支具等外固定措施治疗就足够了。&lt;/p&gt;
&lt;p&gt;来源：郭树章，人卫健康《&lt;a href=&#34;https://mp.weixin.qq.com/s/Jgv1mBOY2p4q2LehbdJdag&#34;&gt;骨折与骨裂有没有区别，骨裂是不是骨折？&lt;/a&gt;》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;青枝骨折&#34;&gt;青枝骨折&lt;a class=&#34;headerlink&#34; href=&#34;#青枝骨折&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;青枝骨折多见于儿童，“青枝”两个是借用来的，在植物的青嫩枝条中，常常会见到折而不断的情况。儿童的骨骼中含有较多的有机物，外面包裹的骨外膜由特别的厚，因此在力学上就具有很好的弹性和韧性，不容易折断，遭受暴力发生骨折就会出现与植物青枝一样折而不断的情况，骨科医生就把这种特殊的骨折称之为青枝骨折。&lt;/p&gt;
&lt;p&gt;由于青枝骨折时，骨骼虽“折”却仍然未“断”，因而一般都属于稳定骨折，通常是不需要手术治疗的。四肢骨的青枝骨折用石膏外固定治疗都有很好的效果。&lt;/p&gt;
&lt;p&gt;来源：百度健康医典，《&lt;a href=&#34;https://www.baidu.com/bh/dict/ydxx_10940239469362560976?tab=%E6%A6%82%E8%BF%B0&amp;amp;title=%E9%9D%92%E6%9E%9D%E9%AA%A8%E6%8A%98&amp;amp;contentid=ydxx_10940239469362560976&amp;amp;query=%E9%9D%92%E6%9E%9D%E9%AA%A8%E6%8A%98&amp;amp;sf_ref=dict_home&amp;amp;from=dicta&#34;&gt;青枝骨折&lt;/a&gt;》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;石膏后一些注意事项&#34;&gt;石膏后一些注意事项&lt;a class=&#34;headerlink&#34; href=&#34;#石膏后一些注意事项&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;青枝骨折常常发生在儿童，主要就是由于骨折之后骨折没有出现完全的断裂，就像植物的青嫩条枝一样，常常出现折而不断的情况，对于这种骨折一般积极的进行保守治疗就会得到很好的缓解。&lt;/p&gt;
&lt;p&gt;需要积极的进行手法复位，然后进行石膏固定，一般固定的时间大约在 3-4 周。在进行石膏固定的时候，肢体要处于功能位。石膏固定之后要多注意休息 3-7 天，有利于骨折部位的固定和康复。&lt;/p&gt;
&lt;h3 id=&#34;注意观察血液循环&#34;&gt;注意观察血液循环&lt;a class=&#34;headerlink&#34; href=&#34;#注意观察血液循环&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;因骨折或手术肢体肿胀，石膏弹性较差，肢体受到石膏压迫易出现循环障碍，所以石膏固定后患者及家属应严密观察石膏固定肢体末端(如手、足)的变化，&lt;strong&gt;如果肢体末端出现皮肤苍白、青紫或皮肤温度降低，应该及时返院复诊。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;抬高患肢可促进血液回流，有利于消肿和缓解疼痛。&lt;/strong&gt;适当地活动肢体末端，可以促进血液循环，缓解肿胀。同时，如果患肢出现&lt;strong&gt;麻木、疼痛加重、感觉减退、脉搏减弱等现象&lt;/strong&gt;应及时复诊。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;石膏固定期间，尽量减少出汗，生活在干燥、凉爽的环境中。&lt;/strong&gt;石膏固定的肢体血液循环差，天气冷时要注意石膏固定部位保暖，以防冻伤&lt;strong&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;别沾水&#34;&gt;别沾水&lt;a class=&#34;headerlink&#34; href=&#34;#别沾水&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;无论石膏支具是不是防水材料，都建议别沾水。因为，即便是防水的玻璃纤维材料，遇水多了也会可能影响其机械强度。更重要的是，水分一旦进入石膏和皮肤之间，就会引起各种不适，比如：瘙痒、有异味，而且很难再完全干燥。甚至还会出现：局部细菌感染、浸渍、溃疡、皮疹以及接触性皮炎等。&lt;/p&gt;
&lt;h3 id=&#34;石膏过松及时更换&#34;&gt;石膏过松及时更换&lt;a class=&#34;headerlink&#34; href=&#34;#石膏过松及时更换&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如出现石膏过松，应及时更换石膏。&lt;/p&gt;
&lt;h3 id=&#34;没有被固定的部位适度活动&#34;&gt;没有被固定的部位适度活动&lt;a class=&#34;headerlink&#34; href=&#34;#没有被固定的部位适度活动&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;所有不能动的关节，医生已经使用石膏固定好了，你也动不了了。而那些可以活动的关节，骨科医生都会刻意的不固定，以方便患者活动。&lt;/p&gt;
&lt;p&gt;比如脚踝扭伤，石膏一般都不会固定脚趾头和膝关节，这样患者可以通过活动脚趾头和膝关节来促进血液循环，并预防僵硬。&lt;/p&gt;
&lt;p&gt;再比如，腕关节骨折，石膏一般不只固定手腕子，不会固定手指、胳膊肘和肩关节，这样就是为了让患者可以活动手指头、胳膊肘和肩关节。&lt;/p&gt;
&lt;h2 id=&#34;需要立即去医院的情况&#34;&gt;需要立即去医院的情况&lt;a class=&#34;headerlink&#34; href=&#34;#需要立即去医院的情况&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在医院用石膏、夹板、支具等固定后，一般医生会叮嘱一段时间后来复查，比如每周或每月。但是，如果出现以下 4 点，您可千万别等了，立即去医院吧：&lt;/p&gt;
&lt;p&gt;（1）严重的肿胀疼痛，或肿胀疼痛逐渐加重；
（2）肢体远端（手指或足趾）无法活动，或者颜色、温度改变，比如变紫，发白，变冷等；
（3）出现了石膏松动、过紧、裂开或折断，石膏被浸湿且无法使之干燥；
（4）石膏下皮肤有溃疡或裂口。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;a class=&#34;headerlink&#34; href=&#34;#参考资料&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626833733&amp;amp;ver=3203&amp;amp;signature=lw2bN5bePM1E8wH-3dd0svniMgEjoYPGtHWsbOzOY-rTYexXgyiTpQDtfg3sbRN21-TaSL47j2dcRVC7U8-dww-gom9ytf02M7mZex9ASaal-HOlciq3qLl2rvTAdh9r&amp;amp;new=1&#34;&gt;打完石膏回家，要特别注意这 4 个细节&lt;/a&gt;》，玖玖骨科，微信公众号&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626834716&amp;amp;ver=3203&amp;amp;signature=ofejkSNPeSCf1Ai2jkJCf79eRcqzsMSdLDqODcWbdM**xNct*06b0UTWSYuZMgSs6voER8jVvcCOE5ZnRcJ7oJrZVdNuzfThGvfKchbNOBmoMEO05fV5fdFp0L27MT3-&amp;amp;new=1&#34;&gt;打了石膏想洗澡？如何保持石膏干燥&lt;/a&gt;》，骨科时间&amp;rdquo;，微信公众号&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626832526&amp;amp;ver=3203&amp;amp;signature=lw2bN5bePM1E8wH-3dd0svniMgEjoYPGtHWsbOzOY-rwz2SVMCzxuGlmI9SR4iAXUCajRR0DNVbQVSLbU5bsdpEzqAQask5oPeXYFSERyewYK*CHpmnEENjv*BJKHsWP&amp;amp;new=1&#34;&gt;骨折、骨裂傻傻分不清楚？一文教你区分！&lt;/a&gt;》，玖玖骨科，微信公众号&lt;/li&gt;
&lt;li&gt;郭树章，《&lt;a href=&#34;https://mp.weixin.qq.com/s/Jgv1mBOY2p4q2LehbdJdag&#34;&gt;骨折与骨裂有没有区别，骨裂是不是骨折？&lt;/a&gt;》，人卫健康，微信公众号&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://www.baidu.com/bh/dict/ydxx_10940239469362560976?tab=%E6%A6%82%E8%BF%B0&amp;amp;title=%E9%9D%92%E6%9E%9D%E9%AA%A8%E6%8A%98&amp;amp;contentid=ydxx_10940239469362560976&amp;amp;query=%E9%9D%92%E6%9E%9D%E9%AA%A8%E6%8A%98&amp;amp;sf_ref=dict_home&amp;amp;from=dicta&#34;&gt;青枝骨折&lt;/a&gt;》，百度健康医典&lt;/li&gt;
&lt;li&gt;张昶，《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626832526&amp;amp;ver=3203&amp;amp;signature=Md1Pd80D2PPkcrBDkvWOoLu3iPTeTDOSa-nXkhMLroNC62Nx29*XfohLlgXF2LNPkg6yKxV715STq1gaegEuHMJ5P4p1OLQ4TJ9mgQv6tgJcNgnhatuN8TEsSwGxhI8f&amp;amp;new=1&#34;&gt;科普一下：骨折并不等于骨头断成两截！&lt;/a&gt;》，骨伤疼痛专家张昶博士，微信公众号&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626830352&amp;amp;ver=3203&amp;amp;signature=lw2bN5bePM1E8wH-3dd0svniMgEjoYPGtHWsbOzOY-qoXjJXXBCuF1A93OP*rZvhpbkftwyoZKpj5Usq5eU*go0G1B49RxR3A3c7mmsdWeu-SJBZDBRANOsO-jPH0JkA&amp;amp;new=1&#34;&gt;儿童常见肘关节骨折&lt;/a&gt;》，玖玖骨科，微信公众号&lt;/li&gt;
&lt;li&gt;《&lt;a href=&#34;https://mp.weixin.qq.com/s?src=11&amp;amp;timestamp=1626830065&amp;amp;ver=3203&amp;amp;signature=7gxCbrFZayPSh*J9nuFw7bMd0Y8W9JiTSC2dOQC089HU55GdXYmVBMdjsTVCR0GLUMDfX9Q*Hp9gf3OlCQvah34EQzaUnlHpeJiUTVU2gnzLGLT*ZwBO8nUnP1jvR0Wo&amp;amp;new=1&#34;&gt;手把手教你看儿童肘关节骨折&lt;/a&gt;》，医学影像服务中心，微信公众号&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;145&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-145/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-145/</guid>
      
    </item>
    
    <item>
      <title>语雀天使</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;从 2018 年开始接触语雀，一路走来把自己记过的各种文档都托管到了语雀，从原来的写给自己看方便自己查阅，到今天逐步面向大家公开交流，这是最大的变化。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;img alt=&#34;71bacefe8f8723f9fb80df1dae35f02.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjymRUVCcoqMDJQzoNAL60HGnj3v.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FtSri7LrQFUK5QjFeBtuhW6_e1BV.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一路走来，也折腾过语雀以外的很多笔记/在线文档平台，但最终还是选择了语雀。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/-QuX-z4KlBNXUiRT92uVOA&#34;&gt;只要能坚持下来就是好博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/F4eu2rK6aiyVrsX_sJldPw&#34;&gt;语雀图片与七牛云之间的迁移同步&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/ntOMVcsqfgDK_B7go16hcw&#34;&gt;快速拥有自己的博客，语雀或许是不错的选择&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;到今天（2021 年 10 月 14 日）个人在语雀一共写了 700 多篇文档，400 多篇是公开的，300 多个关注者，很平淡的一些数据。&lt;/p&gt;
&lt;p&gt;在 2021 年 9 月 26 日的&lt;a href=&#34;https://www.yuque.com/yuque/blog/iaidt8&#34;&gt;&lt;strong&gt;语雀知识大会&lt;/strong&gt;&lt;/a&gt;上收到了另外一个社会身份，叫&lt;strong&gt;首批语雀天使&lt;/strong&gt;，成为了幸运的 1/15，算是对这些年默默码字的一个肯定。
&lt;img alt=&#34;f3fa91b08ac80f46be1eeef6754f42b.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FsMA0G3DdG27_-nKrWT47BMwcOF5.jpeg&#34; /&gt;
&lt;img alt=&#34;240b78a46751eec3d3f0a335a75456d.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlHRIckh5mJ7PFZFz2Y1Qb2n0vt1.jpeg&#34; /&gt;
今天，终于收到了官方送的礼物，上几张图~
&lt;img alt=&#34;71bacefe8f8723f9fb80df1dae35f02.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjymRUVCcoqMDJQzoNAL60HGnj3v.jpeg&#34; /&gt; &lt;img alt=&#34;ff8c02f34eb75882b81aae4b3024e4e.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FnHN_g1qbAiZzaYON80lBraD16PH.jpeg&#34; /&gt;
未来不敢承诺什么，但至少还会坚持码码字，不管技术的还是生活，吐槽的还是失意的，若干年后当你回头看看你一路写过的东西，应该会有的心情吧。就好像你现在回去看看你当年 QQ 空间的日志一样，或许会有很多感触！&lt;/p&gt;
&lt;p&gt;而且，最值得期待的语雀移动端 APP 在今年下半年也要出来了，你还有什么好犹豫呢？&lt;/p&gt;
&lt;p&gt;和我一起，在语雀记录和沉淀你的点滴吧！&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;148&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-148/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-148/</guid>
      
    </item>
    
    <item>
      <title>语雀目录的一些困惑</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;p&gt;语雀的目录应该是语雀的一大特色，像书本一样清晰明了的结构的确能解决一些问题，但是随着文档越来越多，使用起来感觉越来越臃肿——最起码会有目录编排的逻辑困惑（我应该怎么系统设置我的目录？）。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;&lt;a href=&#34;https://www.yuque.com/shenweiyan/mind/whnegc?view=doc_embed&#34;&gt;语雀知识库文档分类的纠结&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;还有的就是目录层级太多，上下滚动，或者在看某一篇文档时，有种不知道自己在哪里的错觉。不清楚整个目录的逻辑是什么样的。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlqfKANn6DQsTEDdoTNQ21a76R8D.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;所以，还是想要类似的一个目录，虽然觉得官方不可能会支持，但想想总是可以的。如果可以支持多种目录样式，这对于没有系统分类的人来说应该算一种福利吧。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FuAD9wruzOFqtCy4QqXPuvxNSUxJ.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回到现有目录结构，认真想一下，一旦你的知识库目录想好了（可能要花不少时间去思考：知识库核心是什么，放什么内容，按照什么标准来划分层级......），后面的书写就会很顺理成章。其实就是先想好大纲，理清思路，再进行写作。
&lt;img alt=&#34;a557c65ea2805ab271fe885b00284f0.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FpQ3iwTyae-7t-zZOzpbeUcOhgY-.jpeg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;对于现有的目录结构，更喜欢 &lt;a href=&#34;http://www.wjjsoft.com/mybase_cn.html&#34;&gt;Mybase&lt;/a&gt; 这种树形大纲、树形标签样式的。
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Foz3UT1eeeM40gp0KS4gw-oB7HmO.png&#34; /&gt;
&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fot8QZF_MhgiUHR1ooyarNtdmzzw.jpeg&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;147&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-147/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-147/</guid>
      
    </item>
    
    <item>
      <title>输入法，哪一个才是我的菜？</title>
      
      
        
      <author>Steven Shum</author>
        
      
      
      
      <description>&lt;blockquote&gt;
&lt;p&gt;Categories: 博客/语雀&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;记录一下这些年来在电脑上使用的输入法的一些感受，以前在 Win10 使用自带微软拼音输入法倒也没发现什么问题，后来办公的 PC 变成了 Win7，强迫症作祟开始各种倒腾和记录。&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&#34;20220112修复&#34;&gt;20220112，修复&lt;a class=&#34;headerlink&#34; href=&#34;#20220112修复&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;搜狗输入法（PC）对用户的反馈的问题还是比较重视的，终于把这一个问题给修复了。
&lt;img alt=&#34;2c52da194b39fe60f660e4d989178da.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fq4slj-Qr0vXLUMGhYX2wQZwnpB4.jpeg&#34; /&gt;
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FjpghqJs-16Udl2XmpLT87Vs0g0m.png&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;20211018删除操作&#34;&gt;20211018，删除操作&lt;a class=&#34;headerlink&#34; href=&#34;#20211018删除操作&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;试了一下搜狗、百度和讯飞 PC 端的输入法，发现搜狗和百度在 Mobaxterm 中 Backspace 删除操作无法在候选区进行删除，只有讯飞可以正常使用！！！
&lt;a href=&#34;https://www.yuque.com/shenweiyan/notebook/input&#34;&gt;百度搜狗在 Mobaxterm 中无法通过 Backspace 键删除.mp4&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;20211012数据与账号同步&#34;&gt;20211012，数据与账号同步&lt;a class=&#34;headerlink&#34; href=&#34;#20211012数据与账号同步&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从 9 月中旬把移动端+PC 端的输入法从搜狗全线换成百度输入法后，一直在努力适应中，但今天居然发现账号/数据同步出现问题了！
&lt;img alt=&#34;百度输入法01.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fi9keXw1_rv7xDz83p_hfkhCt19d.jpeg&#34; /&gt;
&lt;img alt=&#34;百度输入法02.jpg&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fie1gLptxXtDyZ6x_m4sKxdHB23m.jpeg&#34; /&gt;
而且发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://shurufa.baidu.com/update&#34;&gt;百度 PC 端&lt;/a&gt;的输入法更新力度比不上&lt;a href=&#34;https://pinyin.sogou.com/changelog.php&#34;&gt;搜狗 PC 端&lt;/a&gt;的输入法。百度 PC 输入法在 2020 年基本没有任何更新，直到 2021.06 月才开始有所动作。&lt;/li&gt;
&lt;li&gt;问题反馈，都有微博，都有百度贴吧，搜狗有 QQ 群（虽然我没怎么用过）。个人试过微博反馈相关的问题，很快就收到了&lt;a href=&#34;https://weibo.com/u/2285231187&#34;&gt;搜狗技术支持&lt;/a&gt;的回馈；&lt;a href=&#34;https://weibo.com/u/1829860077&#34;&gt;百度输入法商务助手&lt;/a&gt;迟迟没有反应，反而是&lt;a href=&#34;https://weibo.com/u/2757484243&#34;&gt;百度输入法小助手&lt;/a&gt;很快就反馈了。&lt;/li&gt;
&lt;li&gt;在手机端百度输入法和搜狗输入法都感觉很顺畅，没什么大的问题；PC 端，百度输入法在切换不同的软件场景时会默认开启全角输入，非常不好。&lt;/li&gt;
&lt;li&gt;搜狗输入法的账号系统，个人感觉不太好用，尤其的 web 端！百度输入法的账号系统相对好一些，但是稳定性不够。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;搜狗输入法是搜狗(Sogou)公司于 2006 年 6 月推出的一款汉字输入法工具。2009 年 9 月开始，搜狗输入法陆续推出 Android、iOS 版本，成为智能手机时代最强大的第三方输入法之一。&lt;/p&gt;
&lt;p&gt;百度拼音输入法是百度公司免费提供的输入软件。2010 年 10 月推出，拥有百度搜索和云端技术的支持，百度输入法很快成为了新一代的输入产品。&lt;/p&gt;
&lt;p&gt;一点直观感受是，在流畅度上搜狗输入法要好一点点，但是百度输入法可能更值得期待。&lt;/p&gt;
&lt;h2 id=&#34;20210913使用百度&#34;&gt;20210913，使用百度&lt;a class=&#34;headerlink&#34; href=&#34;#20210913使用百度&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;百度输入法也终于在&lt;strong&gt;安卓手机&lt;/strong&gt;上支持&lt;strong&gt;左右滑动键盘&lt;/strong&gt;来&lt;strong&gt;移动光标&lt;/strong&gt;，我也把手机、PC 的输入法都换成百度了！&lt;/p&gt;
&lt;h2 id=&#34;20200820搜狗自定义并固定标点&#34;&gt;20200820，搜狗自定义并固定标点&lt;a class=&#34;headerlink&#34; href=&#34;#20200820搜狗自定义并固定标点&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;问：安卓手机中搜狗输入法左边的标点符号怎样自定义并且固定？&lt;/strong&gt;
&lt;strong&gt;答：设置 → 更多设置 → 输入习惯 → 自定义符号设置&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;20191016左右滑动键盘来移动光标&#34;&gt;20191016，左右滑动键盘来移动光标&lt;a class=&#34;headerlink&#34; href=&#34;#20191016左右滑动键盘来移动光标&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;现在移动端电脑端的输入法有很多。但有一个问题：&lt;strong&gt;安卓手机&lt;/strong&gt;上哪个输入法可以&lt;strong&gt;左右滑动键盘&lt;/strong&gt;来&lt;strong&gt;移动光标&lt;/strong&gt;？&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/Fp2xs-BpN1KDZPOpv_MxM7r7W635.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我用的是华为手机，经测试目前搜狗输入法是可以的，百度、讯飞暂不支持。&lt;/p&gt;
&lt;p&gt;第二个问题，左右角引号（「」）怎么打在搜狗输入法中怎么打出来？&lt;strong&gt;ctrl+shift+z&lt;/strong&gt; 快捷键弹出搜狗输入法特殊符号，在 &lt;strong&gt;&amp;ldquo;标点符号&amp;rdquo;&lt;/strong&gt; 中选择。
&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FlJaOTNYFhTbGfIcrRVVSZ3rjudX.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;艾媒咨询 (https://www.iimedia.cn/) 每年都有关于中国第三方手机输入法行业趋势研究报告，PC 端的不怎么看到，感兴趣的也可以去看看。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; src=&#34;https://shub.weiyan.tech/yuque/elog-notebook-img/FvF-dagzFM03BT3s0Ti7tkyIK8Eo.png&#34; /&gt;&lt;/p&gt;
&lt;script src=&#34;https://giscus.app/client.js&#34;
    data-repo=&#34;shenweiyan/Digital-Garden&#34;
    data-repo-id=&#34;R_kgDOKgxWlg&#34;
    data-mapping=&#34;number&#34;
    data-term=&#34;119&#34;
    data-reactions-enabled=&#34;1&#34;
    data-emit-metadata=&#34;0&#34;
    data-input-position=&#34;bottom&#34;
    data-theme=&#34;light&#34;
    data-lang=&#34;zh-CN&#34;
    crossorigin=&#34;anonymous&#34;
    async&gt;
&lt;/script&gt;</description>
      <link>https://shenwy.com/blog/discussions-119/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <source url="https://shenwy.com/rss.xml">维燕的数字花园</source>
      
      <guid isPermaLink="true">https://shenwy.com/blog/discussions-119/</guid>
      
    </item>
    
  </channel>
</rss>