<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AXUM中文博客</title>
    <description>The latest articles on DEV Community by AXUM中文博客 (@axum).</description>
    <link>https://dev.to/axum</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2641048%2F12b59891-4c92-4f80-9214-3adbbfd10f76.png</url>
      <title>DEV Community: AXUM中文博客</title>
      <link>https://dev.to/axum</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axum"/>
    <language>en</language>
    <item>
      <title>《Mastering Postgres》示例数据的导入</title>
      <dc:creator>AXUM中文博客</dc:creator>
      <pubDate>Fri, 19 Sep 2025 07:32:17 +0000</pubDate>
      <link>https://dev.to/axum/-shi-li-shu-ju-de-dao-ru-3mk3</link>
      <guid>https://dev.to/axum/-shi-li-shu-ju-de-dao-ru-3mk3</guid>
      <description>&lt;p&gt;&lt;a href="https://masteringpostgres.com" rel="noopener noreferrer"&gt;该教程&lt;/a&gt;的示例数据库并不能使用 &lt;code&gt;pg_store&lt;/code&gt; 导入，网上找了很多资料，终于整合出来了正确的导入方法。（这个教程的作者也不说明一下他是什么工具导出的数据、需要如何导入。大无语 😑）&lt;/p&gt;

&lt;h2&gt;
  
  
  下载示例数据库：
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://assets.tryhardassets.com/mp_demo_data.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  导入
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="nt"&gt;-dc&lt;/span&gt; mp_demo_data.gz | psql &lt;span class="nt"&gt;-U&lt;/span&gt; postgres mastering_pg_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;（如有需要）请将 &lt;code&gt;postgres&lt;/code&gt; 改为你的数据库用户名&lt;/li&gt;
&lt;li&gt;请将 &lt;code&gt;mastering_pg_data&lt;/code&gt; 该为你实际的数据库名称，示例数据将导入到该数据中&lt;/li&gt;
&lt;li&gt;如果使用的是 docker 部署的 PostgreSQL，请先使用 &lt;code&gt;docker cp&lt;/code&gt; 命令将下载的 &lt;code&gt;mp_demo_data.gz&lt;/code&gt; 拷贝到容器内&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgressql</category>
      <category>postgres</category>
    </item>
    <item>
      <title>使用 Zhparser 插件实现 PostgreSQL 中文全文检索</title>
      <dc:creator>AXUM中文博客</dc:creator>
      <pubDate>Fri, 19 Sep 2025 02:08:43 +0000</pubDate>
      <link>https://dev.to/axum/shi-yong-zhparser-cha-jian-shi-xian-postgresql-zhong-wen-quan-wen-jian-suo-92j</link>
      <guid>https://dev.to/axum/shi-yong-zhparser-cha-jian-shi-xian-postgresql-zhong-wen-quan-wen-jian-suo-92j</guid>
      <description>&lt;h2&gt;
  
  
  Docker 容器
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--name&lt;/span&gt; postgres &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PRC &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;PGDATA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/postgresql/data/pgdata &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-v&lt;/span&gt; /var/docker/postgres:/var/lib/postgresql/data &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-p&lt;/span&gt; 5432:5432 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-d&lt;/span&gt; postgres

docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; postgres bash &lt;span class="c"&gt;# 进入 pg 容器&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  编译安装 Zhparser
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;以下步骤都是在 PG 容器中操作。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;安装依赖：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;postgresql-server-dev-18&lt;/code&gt; 改成对应版本，也可以在 &lt;code&gt;docker run&lt;/code&gt; 中明确指定拉取的镜像版本，以便保持统一。&lt;br&gt;
如果不确定 docker 拉取的是那个版本的 postgres，可以在 psql 里运行 &lt;code&gt;SELECT VERSION();&lt;/code&gt; 查看&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class="nb"&gt;install &lt;/span&gt;wget gcc make git bzip2 postgresql-server-dev-18 &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;编译 Zhparser：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-jxvf&lt;/span&gt; scws-1.2.3.tar.bz2 
&lt;span class="nb"&gt;cd &lt;/span&gt;scws-1.2.3
./configure &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install

cd&lt;/span&gt; ..
git clone https://github.com/amutu/zhparser.git
&lt;span class="nb"&gt;cd &lt;/span&gt;zhparser/
make &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;验证安装。首先连接到 PG 服务器：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-U&lt;/span&gt; postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;zhparser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- 启用 Zhparser 扩展&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;SEARCH&lt;/span&gt; &lt;span class="n"&gt;CONFIGURATION&lt;/span&gt; &lt;span class="n"&gt;chinese&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARSER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zhparser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- 中文全文检索&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;SEARCH&lt;/span&gt; &lt;span class="n"&gt;CONFIGURATION&lt;/span&gt; &lt;span class="n"&gt;chinese&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;MAPPING&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;simple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- 修改词性&lt;/span&gt;
&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;ts_token_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'zhparser'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- 词性列表&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;测试：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;to_tsvector&lt;/code&gt; 测试：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'chinese'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'人生得意须尽欢，莫使金樽空对月。天生我材必有用，千金散尽还复来。Hello world'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;结果：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                                         to_tsvector
------------------------------------------------------------------------------------------------------------------------------
 'hello':12 'world':13 '人生':1 '使':4 '千金':8 '复来':11 '天生我材必有用':7 '对月':6 '尽':10 '尽欢':3 '得意':2 '散':9 '空':5
(1 row)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;to_tsquery&lt;/code&gt; 测试：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'chinese'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'金风玉露一相逢，便胜却人间无数。It &amp;amp; works'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;结果：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                          to_tsquery
--------------------------------------------------------------
 '金风玉露' &amp;lt;-&amp;gt; '相逢' &amp;lt;-&amp;gt; '胜' &amp;lt;-&amp;gt; '人间' &amp;lt;-&amp;gt; 'it' &amp;amp; 'works'
(1 row)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  官方镜像
&lt;/h2&gt;

&lt;p&gt;Zhparser 官方提供了 &lt;a href="https://hub.docker.com/r/zhparser/zhparser" rel="noopener noreferrer"&gt;docker 镜像&lt;/a&gt;，但它使用的是 PostgreSQL 16，好在版本不算太低。偷懒的或者想要快速体验的朋友可以使用。&lt;/p&gt;

&lt;p&gt;使用方法很简单，就是把 docker 镜像的名称换成 &lt;code&gt;zhparser/zhparser:bookworm-16&lt;/code&gt; 即可：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--name&lt;/span&gt; postgres &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PRC &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;PGDATA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/postgresql/data/pgdata &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-v&lt;/span&gt; /var/docker/postgres:/var/lib/postgresql/data &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-p&lt;/span&gt; 5432:5432 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-d&lt;/span&gt; zhparser/zhparser:bookworm-16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;参考：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.fdevops.com/2023/02/05/postgres-zhparser-31246" rel="noopener noreferrer"&gt;https://www.fdevops.com/2023/02/05/postgres-zhparser-31246&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/amutu/zhparser" rel="noopener noreferrer"&gt;https://github.com/amutu/zhparser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>fulltext</category>
      <category>zhparser</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>使用自签证书在局域网部署 HTTPS 并让浏览器识别为『安全』</title>
      <dc:creator>AXUM中文博客</dc:creator>
      <pubDate>Fri, 03 Jan 2025 01:24:18 +0000</pubDate>
      <link>https://dev.to/axum/shi-yong-zi-qian-zheng-shu-zai-ju-yu-wang-bu-shu-https-bing-rang-liu-lan-qi-shi-bie-wei-an-quan--41j7</link>
      <guid>https://dev.to/axum/shi-yong-zi-qian-zheng-shu-zai-ju-yu-wang-bu-shu-https-bing-rang-liu-lan-qi-shi-bie-wei-an-quan--41j7</guid>
      <description>&lt;h2&gt;
  
  
  自签证书
&lt;/h2&gt;

&lt;p&gt;我们将使用 openssl 来自签证书，请确保你已安装了该工具。&lt;/p&gt;

&lt;h3&gt;
  
  
  自签IP证书
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 3650 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; &amp;lt;私钥路径&amp;gt;.key &lt;span class="nt"&gt;-out&lt;/span&gt; ./&amp;lt;证书路径&amp;gt;.crt &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s1"&gt;'/CN=&amp;lt;组织名称&amp;gt;'&lt;/span&gt; &lt;span class="nt"&gt;-addext&lt;/span&gt; &lt;span class="s1"&gt;'subjectAltName=IP:&amp;lt;局域网IP地址&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;私钥路径&amp;gt;&lt;/code&gt;：要保存私钥的路径&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;证书路径&amp;gt;&lt;/code&gt;：要保存证书的路径&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;组织名称&amp;gt;&lt;/code&gt;：签发证书的组织的名称&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;局域网IP地址&amp;gt;&lt;/code&gt;：本机IP地址&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 3650 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; ./oneplus.key &lt;span class="nt"&gt;-out&lt;/span&gt; ./oneplus.crt &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s1"&gt;'/CN=ONEPLUS'&lt;/span&gt; &lt;span class="nt"&gt;-addext&lt;/span&gt; &lt;span class="s1"&gt;'subjectAltName=IP:192.168.1.13'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  自签“域名”证书
&lt;/h3&gt;

&lt;p&gt;和 IP 证书类似，自签“域名”证书的唯一不同的是 &lt;code&gt;subjectAltName&lt;/code&gt; 要修改为 &lt;code&gt;DNS:&amp;lt;域名&amp;gt;&lt;/code&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 3650 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; &amp;lt;私钥路径&amp;gt;.key &lt;span class="nt"&gt;-out&lt;/span&gt; &amp;lt;证书路径&amp;gt;.crt &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s1"&gt;'/CN=&amp;lt;组织名称&amp;gt;'&lt;/span&gt; &lt;span class="nt"&gt;-addext&lt;/span&gt; &lt;span class="s1"&gt;'subjectAltName=DNS:&amp;lt;域名&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;域名&amp;gt;&lt;/code&gt;：绑定到该局域网的域名。通常，我们可以在客户机上修改 hosts 文件进行绑定。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 3650 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; ./oneplus.key &lt;span class="nt"&gt;-out&lt;/span&gt; ./oneplus.crt &lt;span class="nt"&gt;-subj&lt;/span&gt; &lt;span class="s1"&gt;'/CN=ONEPLUS'&lt;/span&gt; &lt;span class="nt"&gt;-addext&lt;/span&gt; &lt;span class="s1"&gt;'subjectAltName=DNS:oneplus.axum.rs'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  修改 hosts
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Linux/MacOS：&lt;code&gt;/etc/hosts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows：&lt;code&gt;C:\Windows\System32\drivers\etc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在文件末尾加上：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;IP地址&amp;gt; &amp;lt;域名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.13 oneplus.axum.rs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Windows 安装根证书
&lt;/h2&gt;

&lt;p&gt;将上一步骤生成的 &lt;code&gt;.crt&lt;/code&gt; 文件通过 SFTP 等软件，复制到 Windows 中。然后双击该文件，点击安装，然后选择&lt;code&gt;受信任的根证书颁发机构&lt;/code&gt;即可&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;termux 中 proot-distro debian 的 &lt;code&gt;root&lt;/code&gt; 用户的家目录位于：  &lt;code&gt;/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/debian/root&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Code Server 设置
&lt;/h2&gt;

&lt;p&gt;修改 Code Server 配置文件：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;// ...&lt;/span&gt;
&lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;证书路径&amp;gt;.crt&lt;/span&gt;
&lt;span class="na"&gt;cert-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;私钥路径&amp;gt;.key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;// ...&lt;/span&gt;
&lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/root/.config/code-server/oneplus.crt&lt;/span&gt;
&lt;span class="na"&gt;cert-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/root/.config/code-server/oneplus.key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;重启 Code Server。&lt;/p&gt;

</description>
      <category>tls</category>
      <category>局域网</category>
    </item>
    <item>
      <title>让安卓手机不再吃灰：在安卓手机上搭建 Rust 开发环境</title>
      <dc:creator>AXUM中文博客</dc:creator>
      <pubDate>Fri, 03 Jan 2025 00:40:24 +0000</pubDate>
      <link>https://dev.to/axum/rang-an-zhuo-shou-ji-bu-zai-chi-hui-zai-an-zhuo-shou-ji-shang-da-jian-rust-kai-fa-huan-jing-3ggb</link>
      <guid>https://dev.to/axum/rang-an-zhuo-shou-ji-bu-zai-chi-hui-zai-an-zhuo-shou-ji-shang-da-jian-rust-kai-fa-huan-jing-3ggb</guid>
      <description>&lt;p&gt;如果你还在把旧手机拿去换不锈钢脸盆，那真是暴殄天物。何不将它变成包括 Rust 在内的开发环境呢。&lt;/p&gt;

&lt;h2&gt;
  
  
  安装 termux
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;打开 termux 的&lt;a href="https://f-droid.org/en/packages/com.termux/" rel="noopener noreferrer"&gt;官网&lt;/a&gt;，点击【DOWNLOADF-DROID】下载 APK 文件。&lt;/li&gt;
&lt;li&gt;运行下载好的 APK 文件进行安装。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  启用 SSH 服务
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;由于要兼容未进行 root 的手机，所以 termux 的 SSH 服务监听的是 8022 端口，而不是标准的 22 端口。（小端口监听需要 root 权限）。&lt;/li&gt;
&lt;li&gt;同样的原因，termux 的用户名并不是 &lt;code&gt;root&lt;/code&gt;，而是每次安装 termux 自动生成的、形如 &lt;code&gt;u0_axxx&lt;/code&gt;（其中，&lt;code&gt;xxx&lt;/code&gt;是数字）的用户。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  安装 SSH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 更新 termux 软件源&lt;/span&gt;
pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 安装 openssh 提供的 SSH 服务端和客户端&lt;/span&gt;
pkg &lt;span class="nb"&gt;install &lt;/span&gt;openssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  修改当前用户的密码
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输入以上命令后，按提示设置密码&lt;/p&gt;

&lt;h3&gt;
  
  
  查看当前用户
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;将会显示形如 &lt;code&gt;u0_axxx&lt;/code&gt; 的用户名，把它记录下来。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;举例：&lt;code&gt;u0_a117&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  查看当前IP
&lt;/h3&gt;

&lt;p&gt;你可以通过手机的 WLAN 查看当前局域网 IP，也可以通过 &lt;code&gt;ifconfig&lt;/code&gt; 命令来查看：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ifconfig | greap inte
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;举例：&lt;code&gt;192.168.0.13&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  运行 SSH 服务
&lt;/h3&gt;

&lt;p&gt;通过 &lt;code&gt;sshd&lt;/code&gt; 命令启动运行 SSH 服务：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  连接该 SSH 服务
&lt;/h3&gt;

&lt;p&gt;现在，局域网内的其它设备，比如电脑等，可以通过 SSH 连接该手机了：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-P&lt;/span&gt; 8022 u0_a117@192.168.0.13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;u0_a117&lt;/code&gt; 改为你实际的用户名&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;192.168.0.13&lt;/code&gt; 改为你实际的IP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  安装 debian
&lt;/h2&gt;

&lt;p&gt;termux 自带的是一个非完整的 Linux 环境，好在我们可以在不需要对手机进行 root 的情况下，通过 &lt;code&gt;proot-distro&lt;/code&gt; 安装完整的 Linux 环境，比如 debian 系统。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 更新 termux 软件源&lt;/span&gt;
pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 安装 proot-distro&lt;/span&gt;
pkg &lt;span class="nb"&gt;install &lt;/span&gt;proot-distro &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 使用 proot-distro 安装 debian&lt;/span&gt;
proot-distro &lt;span class="nb"&gt;install &lt;/span&gt;debian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;安装好之后，便可以登录 debian：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proot-distro login debian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;proot-distro login&lt;/code&gt; 是以 &lt;code&gt;root&lt;/code&gt; 身份登录 debian，所以享有完全的权限。首先要做的是给 debian 安装一些必要的工具：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 更新软件源&lt;/span&gt;
apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 更新软件包&lt;/span&gt;
apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 安装需要的工具&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; wget curl unzip tmux build-essential cmake pkg-config libssl-dev libtool git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  安装 Rust 环境
&lt;/h2&gt;

&lt;p&gt;参照&lt;a href="https://www.rust-lang.org/tools/install" rel="noopener noreferrer"&gt;官网&lt;/a&gt;，我们可以在 debian 里一键安装 Rust 环境：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  安装
&lt;/h3&gt;

&lt;p&gt;在 Code Server 的&lt;a href="https://github.com/coder/code-server/releases" rel="noopener noreferrer"&gt;release&lt;/a&gt;页面，找到最新版本的压缩包下载。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 版本&lt;/span&gt;
&lt;span class="nv"&gt;CODE_SERVER_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'4.96.2'&lt;/span&gt;
&lt;span class="c"&gt;# 下载&lt;/span&gt;
wget &lt;span class="s2"&gt;"https://github.com/coder/code-server/releases/download/v&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODE_SERVER_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/code-server-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODE_SERVER_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-arm64.tar.gz"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 确保 ~/.local 存在&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# 解压到 ~/.local&lt;/span&gt;
&lt;span class="nb"&gt;tar &lt;/span&gt;zxvf code-server-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODE_SERVER_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-linux-arm64&lt;/span&gt;.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; ~/.local
&lt;span class="c"&gt;# 重命名&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; ~/.local/code-server-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODE_SERVER_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-linux-arm64&lt;/span&gt; ~/.local/code-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;必须选择 &lt;code&gt;arm64&lt;/code&gt; 架构，因为手机 CPU 就是这个架构&lt;/li&gt;
&lt;li&gt;本例使用的是 &lt;code&gt;.tar.gz&lt;/code&gt; 压缩包，你也可以选择 &lt;code&gt;.deb&lt;/code&gt; 等&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  运行
&lt;/h3&gt;

&lt;p&gt;我们使用 tmux 来保证断开 SSH 之后 Code Server 依然在运行。首先创建 tmux 会话：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 创建一个 tmux 会话&lt;/span&gt;
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; code-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;运行 Code Server：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.local/code-server/bin/code-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  修改配置
&lt;/h3&gt;

&lt;p&gt;配置文件位于 &lt;code&gt;~/.config/code-server/config.yaml&lt;/code&gt;。根据你的需要进行更改&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bind-addr&lt;/code&gt;：监听地址。为了让局域网能访问到，需要将监听的IP改为 &lt;code&gt;0.0.0.0&lt;/code&gt;。比如：&lt;code&gt;0.0.0.0:58080&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth&lt;/code&gt;：鉴权方式。由于我们是部署在局域网，给自己用的，完全没必要使用任何鉴权方式，所以将其改为 &lt;code&gt;none&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cert&lt;/code&gt;：证书路径。我们将在下一篇进行讲解。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;修改配置之后，需要重新启动 Code Server。&lt;/p&gt;

&lt;h3&gt;
  
  
  启用 SSL
&lt;/h3&gt;

&lt;p&gt;由于 Code Server 是以 Web 形式运行，而很多功能需要 HTTPS，比如复制/粘贴、预览 Markdown、执行 REST Client 等。我们将在下一篇博文讨论如何在局域网签发 SSL 证书。&lt;/p&gt;

&lt;h2&gt;
  
  
  自问自答
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么不用 VSCODE 的远程 SSH 连接，而用 Code Server？
&lt;/h3&gt;

&lt;p&gt;因为 termux 并不是完整的 Linux 环境，而 VSCODE 远程 SSH 连接需要在服务端安装对应的软件，termux 并不满足它的条件，所以只能退而求之，使用 VSCODE 的 Web 版本──Code Server。&lt;/p&gt;

&lt;p&gt;你也可以尝试在 proot-distro 安装的 Linux 里安装 SSH 服务，它应该满足 VSCODE 的要求，但需要配置的地方可能很多，本文不作尝试。 &lt;/p&gt;

&lt;h3&gt;
  
  
  相较于云服务器，使用手机有什么优势？
&lt;/h3&gt;

&lt;p&gt;手机基本上都是 4G RAM 起步，内部存储更是 64G 起步，普通的 VPS 根本没法和它比。试想一下，购买一台相同配置的 VPS 每年需要花费多少钱？&lt;/p&gt;

&lt;p&gt;另外，手机都是通过局域网连接，而包括 VPS 在内的云服务器都是公网连接，甚至是跨洲绕全球的连接，网络响应不是一个级别的。&lt;/p&gt;

</description>
      <category>termux</category>
      <category>rust</category>
      <category>debian</category>
      <category>ssh</category>
    </item>
  </channel>
</rss>
