<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Homurax&#39;s Blog</title>
  
  <subtitle>Do have faith in what you&#39;re doing.</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.homurax.com/"/>
  <updated>2025-07-09T15:41:01.245Z</updated>
  <id>https://blog.homurax.com/</id>
  
  <author>
    <name>Homurax</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Windows 设置驱动器盘符 diskpart</title>
    <link href="https://blog.homurax.com/2025/07/10/windows-diskpart/"/>
    <id>https://blog.homurax.com/2025/07/10/windows-diskpart/</id>
    <published>2025-07-09T16:38:45.000Z</published>
    <updated>2025-07-09T15:41:01.245Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;Windows 将盘符分配信息存储在注册表中（主要在 &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices&lt;/code&gt; 下），即这个设置仅对执行该操作的当前计算机生效。&lt;/p&gt;
&lt;p&gt;运行 diskpart 进入磁盘管理命令模式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 列出当前所有的驱动器
list volume

# 选择当前U盘的卷标
select volume 4

# 设置驱动器号为U
assign letter=U
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="Windows" scheme="https://blog.homurax.com/categories/Windows/"/>
    
    
      <category term="diskpart" scheme="https://blog.homurax.com/tags/diskpart/"/>
    
  </entry>
  
  <entry>
    <title>Windows 定时任务 schtasks</title>
    <link href="https://blog.homurax.com/2025/07/09/windows-schtasks/"/>
    <id>https://blog.homurax.com/2025/07/09/windows-schtasks/</id>
    <published>2025-07-09T15:20:17.000Z</published>
    <updated>2025-07-09T15:35:56.780Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;语法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schtasks /change
schtasks /create
schtasks /delete
schtasks /end
schtasks /query
schtasks /run
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可运行 &lt;code&gt;taskschd.msc&lt;/code&gt; 打开任务计划程序查看。&lt;/p&gt;
&lt;h1 id=&quot;schtasks-create&quot;&gt;&lt;a href=&quot;#schtasks-create&quot; class=&quot;headerlink&quot; title=&quot;schtasks create&quot;&gt;&lt;/a&gt;schtasks create&lt;/h1&gt;&lt;p&gt;语法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schtasks /create /sc &amp;lt;scheduletype&amp;gt; /tn &amp;lt;taskname&amp;gt; /tr &amp;lt;taskrun&amp;gt; [/s &amp;lt;computer&amp;gt; [/u [&amp;lt;domain&amp;gt;\]&amp;lt;user&amp;gt; [/p &amp;lt;password&amp;gt;]]] [/ru {[&amp;lt;domain&amp;gt;\]&amp;lt;user&amp;gt; | system}] [/rp &amp;lt;password&amp;gt;] [/mo &amp;lt;modifier&amp;gt;] [/d &amp;lt;day&amp;gt;[,&amp;lt;day&amp;gt;...] | *] [/m &amp;lt;month&amp;gt;[,&amp;lt;month&amp;gt;...]] [/i &amp;lt;idletime&amp;gt;] [/st &amp;lt;starttime&amp;gt;] [/ri &amp;lt;interval&amp;gt;] [{/et &amp;lt;endtime&amp;gt; | /du &amp;lt;duration&amp;gt;} [/k]] [/sd &amp;lt;startdate&amp;gt;] [/ed &amp;lt;enddate&amp;gt;] [/it] [/np] [/z] [/xml &amp;lt;xmlfile&amp;gt;] [/v1] [/f] [/rl &amp;lt;level&amp;gt;] [/delay &amp;lt;delaytime&amp;gt;] [/hresult]
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="Windows" scheme="https://blog.homurax.com/categories/Windows/"/>
    
    
      <category term="schtasks" scheme="https://blog.homurax.com/tags/schtasks/"/>
    
  </entry>
  
  <entry>
    <title>VMware 中安装 VMware Tools 为灰色不可点击</title>
    <link href="https://blog.homurax.com/2024/11/14/vmware-tools-disabled/"/>
    <id>https://blog.homurax.com/2024/11/14/vmware-tools-disabled/</id>
    <published>2024-11-14T15:32:25.000Z</published>
    <updated>2024-11-14T15:36:21.305Z</updated>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;编辑虚拟机设置 - 硬件 - CD/DVD（IDE）- 连接，选择「使用 ISO 映像文件」，选择为 &lt;code&gt;..\VMware\VMware Workstation\linux.iso&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;开机后将映像中的
        
      
    
    </summary>
    
    
      <category term="Virtual machine" scheme="https://blog.homurax.com/categories/Virtual-machine/"/>
    
    
  </entry>
  
  <entry>
    <title>Docker 代理设置</title>
    <link href="https://blog.homurax.com/2024/11/14/docker-proxy/"/>
    <id>https://blog.homurax.com/2024/11/14/docker-proxy/</id>
    <published>2024-11-14T15:11:11.000Z</published>
    <updated>2024-11-14T15:13:45.826Z</updated>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;[!info]&lt;br&gt;守护进程配置优先于环境变量&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/daemon/proxy/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.docker.com/engine/daemon/proxy/&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://docs.docker.com/engine/cli/proxy/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.docker.com/engine/cli/proxy/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;docker-container&quot;&gt;&lt;a href=&quot;#docker-container&quot; class=&quot;headerlink&quot; title=&quot;docker container&quot;&gt;&lt;/a&gt;docker container&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;[!info]&lt;br&gt;容器运行阶段：&lt;br&gt;可以在 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; 中配置守护进程的代理&lt;br&gt;也可以使用 &lt;code&gt;dockerd&lt;/code&gt; 的 &lt;code&gt;--http-proxy&lt;/code&gt; 或 &lt;code&gt;--https-proxy&lt;/code&gt; 标志来配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;{
  &amp;quot;proxies&amp;quot;: {
    &amp;quot;http-proxy&amp;quot;: &amp;quot;http://proxy.example.com:3128&amp;quot;,
    &amp;quot;https-proxy&amp;quot;: &amp;quot;https://proxy.example.com:3129&amp;quot;,
    &amp;quot;no-proxy&amp;quot;: &amp;quot;*.test.example.com,.example.org,127.0.0.0/8&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更改配置文件后，重新启动守护进程：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="Docker" scheme="https://blog.homurax.com/categories/Docker/"/>
    
    
  </entry>
  
  <entry>
    <title>Dell G15 5530 下 Windows 11 + Ubuntu 20.04 双系统安装</title>
    <link href="https://blog.homurax.com/2024/10/29/dell-G15-5530-Windows11-Ubuntu20-04/"/>
    <id>https://blog.homurax.com/2024/10/29/dell-G15-5530-Windows11-Ubuntu20-04/</id>
    <published>2024-10-29T13:57:58.000Z</published>
    <updated>2024-10-29T14:08:32.326Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;基本信息&quot;&gt;&lt;a href=&quot;#基本信息&quot; class=&quot;headerlink&quot; title=&quot;基本信息&quot;&gt;&lt;/a&gt;基本信息&lt;/h1&gt;&lt;p&gt;笔记本：Dell G15 5530（Intel Core i7-13650HX，NVIDIA GeForce RTX 4060 Laptop GPU）&lt;br&gt;当前安装系统：Windows 11 23H2 22631.4317&lt;br&gt;安装 Ubuntu 版本：Ubuntu 20.04.6 LTS (Focal Fossa)&lt;/p&gt;
    
    </summary>
    
    
      <category term="操作系统" scheme="https://blog.homurax.com/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="Windows" scheme="https://blog.homurax.com/tags/Windows/"/>
    
      <category term="Ubuntu" scheme="https://blog.homurax.com/tags/Ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>JSch 的使用（SSH、SFTP）</title>
    <link href="https://blog.homurax.com/2024/09/28/jsch-ssh/"/>
    <id>https://blog.homurax.com/2024/09/28/jsch-ssh/</id>
    <published>2024-09-28T11:06:38.000Z</published>
    <updated>2024-09-28T11:09:05.434Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;JSch-概要&quot;&gt;&lt;a href=&quot;#JSch-概要&quot; class=&quot;headerlink&quot; title=&quot;JSch 概要&quot;&gt;&lt;/a&gt;JSch 概要&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;[!info]&lt;br&gt;首先明确现在应当使用的是 &lt;code&gt;com.github.mwiede:jsch&lt;/code&gt;，而不是 &lt;code&gt;com.jcraft:jsch&lt;/code&gt;&lt;br&gt;注意所需的最低 Java 版本为 Java 8&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;项目地址：&lt;br&gt;&lt;a href=&quot;https://github.com/mwiede/jsch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mwiede/jsch&lt;/a&gt;&lt;br&gt;示例代码：&lt;br&gt;&lt;a href=&quot;https://github.com/mwiede/jsch/tree/master/examples&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mwiede/jsch/tree/master/examples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如&lt;a href=&quot;https://www.matez.de/index.php/2020/06/22/the-future-of-jsch-without-ssh-rsa/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;这一篇博文&lt;/a&gt;中解释的一样，应当替换的主要原因有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenSSH 在 8.8 中默认禁用了 &lt;code&gt;ssh-rsa&lt;/code&gt;，因此需要一个支持 &lt;code&gt;rsa-sha2-256&lt;/code&gt; 和 &lt;code&gt;rsa-sha2-512&lt;/code&gt; 的库。&lt;/li&gt;
&lt;li&gt;替换方便：只需更改依赖关系坐标即可。&lt;/li&gt;
&lt;li&gt;JCraft 发布的 JSch 在 2018 年后就停止了维护。&lt;/li&gt;
&lt;li&gt;与 OpenJDK 功能保持同步，因此无需额外依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将坐标&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;!-- https://mvnrepository.com/artifact/com.jcraft/jsch --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.jcraft&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jsch&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.1.55&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;替换为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;!-- https://mvnrepository.com/artifact/com.github.mwiede/jsch --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.github.mwiede&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jsch&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.2.19&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可。&lt;/p&gt;
    
    </summary>
    
    
      <category term="JSch" scheme="https://blog.homurax.com/categories/JSch/"/>
    
    
      <category term="SSH" scheme="https://blog.homurax.com/tags/SSH/"/>
    
  </entry>
  
  <entry>
    <title>Docker 安装（rpm 仓库、rpm 软件包、二进制文件、银河麒麟环境）</title>
    <link href="https://blog.homurax.com/2024/09/11/docker-install-kylin/"/>
    <id>https://blog.homurax.com/2024/09/11/docker-install-kylin/</id>
    <published>2024-09-11T15:10:57.000Z</published>
    <updated>2024-09-11T15:25:20.984Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;参考 Install Docker Engine&lt;br&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.docker.com/engine/install/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;常规安装&quot;&gt;&lt;a href=&quot;#常规安装&quot; class=&quot;headerlink&quot; title=&quot;常规安装&quot;&gt;&lt;/a&gt;常规安装&lt;/h1&gt;&lt;h2 id=&quot;使用-rpm-仓库安装&quot;&gt;&lt;a href=&quot;#使用-rpm-仓库安装&quot; class=&quot;headerlink&quot; title=&quot;使用 rpm 仓库安装&quot;&gt;&lt;/a&gt;使用 rpm 仓库安装&lt;/h2&gt;&lt;p&gt;移除现有版本。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    -y
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!info]&lt;br&gt;卸载 Docker 时，存储在 &lt;code&gt;/var/lib/docker/&lt;/code&gt; 中的 images, containers, volumes, 和 networks 不会自动移除。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;设置 Docker 资源库。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;yum install -y yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 Docker Engine、containerd 和 Docker Compose。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;# yum list docker-ce --showduplicates | sort -r

yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!info]&lt;br&gt;命令会安装 Docker，但不会启动 Docker。&lt;br&gt;它还创建了一个 docker group，但默认情况下并不向该组添加任何用户。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动 Docker。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;systemctl start docker
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="Docker" scheme="https://blog.homurax.com/categories/Docker/"/>
    
    
  </entry>
  
  <entry>
    <title>Peewee：简单、轻量化的 ORM</title>
    <link href="https://blog.homurax.com/2024/08/14/python-peewee/"/>
    <id>https://blog.homurax.com/2024/08/14/python-peewee/</id>
    <published>2024-08-14T14:00:31.000Z</published>
    <updated>2024-08-14T14:33:48.679Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h1&gt;&lt;p&gt;Peewee 是一个简单、轻量化的 ORM，支持 sqlite, mysql, mariadb, postgresql 和 cockroachdb。&lt;br&gt;Peewee 没有自带 driver，当前使用的是 postgres 数据库，所以需要安装 psycopg2。&lt;/p&gt;
&lt;p&gt;requirements.txt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;peewee==3.17.6
psycopg2==2.9.9
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;数据库连接、表与-Model-的映射&quot;&gt;&lt;a href=&quot;#数据库连接、表与-Model-的映射&quot; class=&quot;headerlink&quot; title=&quot;数据库连接、表与 Model 的映射&quot;&gt;&lt;/a&gt;数据库连接、表与 Model 的映射&lt;/h1&gt;&lt;p&gt;连接数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import peewee

db = peewee.PostgresqlDatabase(&amp;#39;database&amp;#39;,  
                               host=&amp;#39;ip&amp;#39;,  
                               port=5432,  
                               user=&amp;#39;postgres&amp;#39;,  
                               password=&amp;#39;password&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;表映射的 class 实体需要继承 &lt;code&gt;peewee.Model&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;class 中属性需要指定 &lt;code&gt;Field class&lt;/code&gt;，用于明确属性与数据库列的映射。&lt;/li&gt;
&lt;li&gt;模型配置通过 Model 类的内部类 Meta 进行实例化（该约定借鉴于 Django），Meta 配置会传递给子类。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;字段映射关系详见：&lt;br&gt;&lt;a href=&quot;https://docs.peewee-orm.com/en/latest/peewee/models.html#fields&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.peewee-orm.com/en/latest/peewee/models.html#fields&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.homurax.com/categories/Python/"/>
    
    
      <category term="Peewee" scheme="https://blog.homurax.com/tags/Peewee/"/>
    
  </entry>
  
  <entry>
    <title>Java 21 新特性（18 ~ 21）</title>
    <link href="https://blog.homurax.com/2024/05/13/java-features-21/"/>
    <id>https://blog.homurax.com/2024/05/13/java-features-21/</id>
    <published>2024-05-13T15:16:11.000Z</published>
    <updated>2024-05-13T15:20:27.128Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Java-18&quot;&gt;&lt;a href=&quot;#Java-18&quot; class=&quot;headerlink&quot; title=&quot;Java 18&quot;&gt;&lt;/a&gt;Java 18&lt;/h1&gt;&lt;h2 id=&quot;JEP-408：简单-Web-服务器&quot;&gt;&lt;a href=&quot;#JEP-408：简单-Web-服务器&quot; class=&quot;headerlink&quot; title=&quot;JEP 408：简单 Web 服务器&quot;&gt;&lt;/a&gt;JEP 408：简单 Web 服务器&lt;/h2&gt;&lt;p&gt;JEP 408: Simple Web Server&lt;br&gt;&lt;a href=&quot;https://openjdk.org/jeps/408&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://openjdk.org/jeps/408&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The jwebserver Command&lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/en/java/javase/21/docs/specs/man/jwebserver.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.oracle.com/en/java/javase/21/docs/specs/man/jwebserver.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以使用 &lt;code&gt;jwebserver&lt;/code&gt; 命令启动一个简易的静态 Web 服务器。&lt;/p&gt;
&lt;p&gt;从目标来说，提供了一个命令行工具来启动仅提供静态文件的最小 Web 服务器。&lt;br&gt;主要用于原型设计、临时编码和测试目的场景，具有简单的设置和最少的功能。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;public static void main(String[] args) {  
    InetSocketAddress addr = new InetSocketAddress(8000);  
    HttpServer server = SimpleFileServer.createFileServer(  
            addr, Path.of(System.getProperty(&amp;quot;user.dir&amp;quot;)), SimpleFileServer.OutputLevel.INFO);  
    server.start();  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等价于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jwebserver -p 8000 -d / -b 127.0.0.1 -o info
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;-b：绑定地址&lt;/li&gt;
&lt;li&gt;-d：供服务的目录&lt;/li&gt;
&lt;li&gt;-o：输出级别&lt;/li&gt;
&lt;li&gt;-p：端口&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
    
      <category term="Java" scheme="https://blog.homurax.com/categories/Java/"/>
    
    
      <category term="Feature" scheme="https://blog.homurax.com/tags/Feature/"/>
    
  </entry>
  
  <entry>
    <title>Java 21 虚拟线程（Virtual Threads）</title>
    <link href="https://blog.homurax.com/2024/05/13/virtual-threads/"/>
    <id>https://blog.homurax.com/2024/05/13/virtual-threads/</id>
    <published>2024-05-12T16:06:54.000Z</published>
    <updated>2024-05-12T16:15:09.653Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Java-线程和虚拟线程&quot;&gt;&lt;a href=&quot;#Java-线程和虚拟线程&quot; class=&quot;headerlink&quot; title=&quot;Java 线程和虚拟线程&quot;&gt;&lt;/a&gt;Java 线程和虚拟线程&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;JEP 444: Virtual Threads&lt;br&gt;&lt;a href=&quot;https://openjdk.org/jeps/444&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://openjdk.org/jeps/444&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;动机&quot;&gt;&lt;a href=&quot;#动机&quot; class=&quot;headerlink&quot; title=&quot;动机&quot;&gt;&lt;/a&gt;动机&lt;/h2&gt;&lt;p&gt;首先考虑一个问题，&lt;a href=&quot;https://www.zhihu.com/question/23096638/answer/29617153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JVM 中的线程模型是用户级的么？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个问题只能针对具体 JVM 实现来回答，在 JVM 规范里是没有规定的，具体实现用 1:1（内核线程）、N:1（用户态线程）、M:N（混合）模型的任何一种都可以。&lt;br&gt;Java 并不暴露出不同线程模型的区别，上层应用是感知不到差异的，只是性能特性会不太一样。&lt;/p&gt;
&lt;p&gt;Java SE 最常用的 JVM 是 Oracle/Sun 研发的 HotSpot VM。&lt;br&gt;在这个 JVM 的较新版本所支持的所有平台上，它都是使用 1:1 线程模型的。&lt;br&gt;Solaris 系统是一个特例，HotSpot VM 在 Solaris 上支持多对多和一对一，参考 &lt;a href=&quot;https://reins.altervista.org/java/Java_and_Solaris_Threading.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Java(TM) and Solaris(TM) Threading&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一直以来 Java 并发单元是 Thread，而每个 Thread 都提供了一个堆栈来存储局部变量和方法调用，以及线程上下文等相关信息。&lt;br&gt;由于 JDK 将 Thread 实现为操作系统线程的包装器，相对成本较高数量有限，因此通常需要通过线程池来管理线程。&lt;/p&gt;
&lt;p&gt;对于每个请求一个线程的方式来说，如果线程过多，每个线程消耗一个操作系统线程，那么在其他资源（例如 CPU 或网络连接）耗尽之前，线程数量通常会成为限制因素。&lt;br&gt;即使线程被池化，也会发生这种情况，因为池化有助于避免启动新线程的高成本，但不会增加线程总数。&lt;/p&gt;
&lt;p&gt;对于通过异步方式来提高扩展性来说，请求处理代码不是在一个线程上从头走到尾，而是在等待另一 I/O 操作完成时将其线程返回到池中，以便该线程可以为其他请求提供服务。&lt;br&gt;这种方式需要使用所谓的异步编程，必须将请求处理逻辑分解为小阶段，通常编写为 lambda 表达式，然后使用 API 将它们组合成顺序管道（比如 Java 中的 CompletableFuture 或所谓的「反应式」框架）。&lt;br&gt;这种方式下，堆栈上下文信息都变得难以追踪，代码 debug 无法单步执行，并且和 Java 本身的编程风格有冲突。&lt;/p&gt;
    
    </summary>
    
    
      <category term="Java" scheme="https://blog.homurax.com/categories/Java/"/>
    
    
      <category term="Feature" scheme="https://blog.homurax.com/tags/Feature/"/>
    
  </entry>
  
  <entry>
    <title>Java 17 新特性（9 ~ 17）</title>
    <link href="https://blog.homurax.com/2024/05/09/java-features-17/"/>
    <id>https://blog.homurax.com/2024/05/09/java-features-17/</id>
    <published>2024-05-09T15:40:04.000Z</published>
    <updated>2024-05-09T15:44:53.644Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Java-9&quot;&gt;&lt;a href=&quot;#Java-9&quot; class=&quot;headerlink&quot; title=&quot;Java 9&quot;&gt;&lt;/a&gt;Java 9&lt;/h1&gt;&lt;h2 id=&quot;Stream-takeWhile&quot;&gt;&lt;a href=&quot;#Stream-takeWhile&quot; class=&quot;headerlink&quot; title=&quot;Stream.takeWhile&quot;&gt;&lt;/a&gt;Stream.takeWhile&lt;/h2&gt;&lt;p&gt;使用一个断言作为参数，返回给定 Stream 的子集直到断言语句第一次返回 false。&lt;br&gt;可以用于有序流中获取第一个不满足条件之前的元素。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;// 1 2
Stream.of(1, 2, 3, 4, 5).takeWhile(x -&amp;gt; x &amp;lt; 3).forEach(System.out::println);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Stream-dropWhile&quot;&gt;&lt;a href=&quot;#Stream-dropWhile&quot; class=&quot;headerlink&quot; title=&quot;Stream.dropWhile&quot;&gt;&lt;/a&gt;Stream.dropWhile&lt;/h2&gt;&lt;p&gt;使用一个断言作为参数，直到断言语句第一次返回 false 才返回给定 Stream 的子集。&lt;br&gt;适用于有序流中获取从第一个不满足条件的元素开始的元素。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;// 3 4 5
Stream.of(1, 2, 3, 4, 5).dropWhile(x -&amp;gt; x &amp;lt; 3).forEach(System.out::println);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;IntStream-iterate&quot;&gt;&lt;a href=&quot;#IntStream-iterate&quot; class=&quot;headerlink&quot; title=&quot;IntStream.iterate&quot;&gt;&lt;/a&gt;IntStream.iterate&lt;/h2&gt;&lt;p&gt;使用初始种子值创建顺序流。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;// 3 6 9
IntStream.iterate(3, x -&amp;gt; x &amp;lt; 10, x -&amp;gt; x + 3).forEach(System.out::println);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;Collectors-flatMapping&quot;&gt;&lt;a href=&quot;#Collectors-flatMapping&quot; class=&quot;headerlink&quot; title=&quot;Collectors.flatMapping&quot;&gt;&lt;/a&gt;Collectors.flatMapping&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;Set&amp;lt;Integer&amp;gt; set = Stream.of(&amp;quot;a&amp;quot;, &amp;quot;ab&amp;quot;, &amp;quot;abc&amp;quot;).collect(Collectors.flatMapping(v -&amp;gt; v.chars().boxed(), Collectors.toSet()));
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="Java" scheme="https://blog.homurax.com/categories/Java/"/>
    
    
      <category term="Feature" scheme="https://blog.homurax.com/tags/Feature/"/>
    
  </entry>
  
  <entry>
    <title>中国业余无线电台 A 类操作技术能力验证</title>
    <link href="https://blog.homurax.com/2024/03/20/crac-licence-a/"/>
    <id>https://blog.homurax.com/2024/03/20/crac-licence-a/</id>
    <published>2024-03-20T13:15:51.000Z</published>
    <updated>2024-03-20T13:39:39.901Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;入门&quot;&gt;&lt;a href=&quot;#入门&quot; class=&quot;headerlink&quot; title=&quot;入门&quot;&gt;&lt;/a&gt;入门&lt;/h1&gt;&lt;p&gt;因为各种原因，进了业余无线电（&lt;del&gt;无限垫&lt;/del&gt;）的坑。&lt;br&gt;写这篇博客的目的是介绍并且记录如何考取业余无线电操作证和执照，以及对 A 类题目的总结。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;业余无线电的「业余」不是说技术不专业，而是指用于「业余业务」，或者理解为民用。&lt;br&gt;同时没有「专业无线电」，对应的是「非业余电台」，也就是航空航天、海事船舶、铁路交通、广播通信等部门使用的非业余业务。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;用驾驶举例，驾照对应的就是操作证，行驶证对应的就是执照。即一个是能力的证明，一个是对设备的认证。&lt;/p&gt;
    
    </summary>
    
    
      <category term="业余无线电" scheme="https://blog.homurax.com/categories/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5/"/>
    
    
      <category term="A类操作技术能力验证" scheme="https://blog.homurax.com/tags/A%E7%B1%BB%E6%93%8D%E4%BD%9C%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E9%AA%8C%E8%AF%81/"/>
    
  </entry>
  
  <entry>
    <title>在群晖 NAS 上基于 AList 的 docker 镜像挂载夸克网盘</title>
    <link href="https://blog.homurax.com/2024/01/20/synology-alist-quark/"/>
    <id>https://blog.homurax.com/2024/01/20/synology-alist-quark/</id>
    <published>2024-01-20T08:16:00.000Z</published>
    <updated>2024-01-20T09:02:12.156Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;为什么不考虑直接在 PC 上安装夸克网盘的应用？&lt;/p&gt;
&lt;p&gt;因为这些垃圾应用喜欢做出非常多类似牛皮藓的行为，包括但不限于添加网盘映射驱动器，影响右键菜单，以及自动向浏览器添加插件等行为。&lt;/p&gt;
&lt;p&gt;为了避免安装应用对我的环境造成污染，所以采用在 AList 中挂载夸克网盘的方式来使用，以群晖为例。&lt;/p&gt;
    
    </summary>
    
    
      <category term="NAS" scheme="https://blog.homurax.com/categories/NAS/"/>
    
    
      <category term="AList" scheme="https://blog.homurax.com/tags/AList/"/>
    
  </entry>
  
  <entry>
    <title>pgloader 安装 &amp; 命令语法</title>
    <link href="https://blog.homurax.com/2024/01/07/install-pgloader-and-command/"/>
    <id>https://blog.homurax.com/2024/01/07/install-pgloader-and-command/</id>
    <published>2024-01-07T12:13:14.000Z</published>
    <updated>2024-01-07T12:23:26.224Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;2019 年的时候已经简单写过一篇类似的内容，但是当时写的比较粗糙，使用也比较简单。&lt;/p&gt;
&lt;p&gt;恰好 2023 年的时候在处理类似的迁移需求时，面对的数据量较大，情况也较为复杂，所以本次进一步完善 pgloader 的安装与使用说明。&lt;/p&gt;
    
    </summary>
    
    
      <category term="PostgreSQL" scheme="https://blog.homurax.com/categories/PostgreSQL/"/>
    
    
      <category term="pgloader" scheme="https://blog.homurax.com/tags/pgloader/"/>
    
  </entry>
  
  <entry>
    <title>MySQL 5.7 RPM 包方式安装</title>
    <link href="https://blog.homurax.com/2024/01/07/install-mysql-from-rpm/"/>
    <id>https://blog.homurax.com/2024/01/07/install-mysql-from-rpm/</id>
    <published>2024-01-07T12:03:10.000Z</published>
    <updated>2024-01-07T12:08:17.216Z</updated>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;近期在整理文档资料，顺便发出来好了。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="MySQL" scheme="https://blog.homurax.com/categories/MySQL/"/>
    
    
  </entry>
  
  <entry>
    <title>SSH 密钥登录及问题记录</title>
    <link href="https://blog.homurax.com/2024/01/07/ssh-login-key/"/>
    <id>https://blog.homurax.com/2024/01/07/ssh-login-key/</id>
    <published>2024-01-07T11:27:32.000Z</published>
    <updated>2024-01-07T11:44:14.632Z</updated>
    
    <summary type="html">
    
      
      
        
        
          &lt;blockquote&gt;
&lt;p&gt;其实配置本身没有什么好说的，但是最近遇到了一个 Windows 环境的问题，所以一并记录下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;本地&quot;&gt;&lt;a href=&quot;#本地&quot; class=&quot;headerlink&quot;
        
      
    
    </summary>
    
    
      <category term="Server" scheme="https://blog.homurax.com/categories/Server/"/>
    
    
      <category term="SSH" scheme="https://blog.homurax.com/tags/SSH/"/>
    
  </entry>
  
  <entry>
    <title>Jasypt 为 SpringBoot 提供配置文件的加密支持</title>
    <link href="https://blog.homurax.com/2023/09/07/jasypt-spring-boot/"/>
    <id>https://blog.homurax.com/2023/09/07/jasypt-spring-boot/</id>
    <published>2023-09-06T16:21:55.000Z</published>
    <updated>2023-09-06T16:30:47.238Z</updated>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Jasypt&quot;&gt;&lt;a href=&quot;#Jasypt&quot; class=&quot;headerlink&quot; title=&quot;Jasypt&quot;&gt;&lt;/a&gt;Jasypt&lt;/h1&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jasypt.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.jasypt.org/&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/ulisesbocchio/jasypt-spring-boot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ulisesbocchio/jasypt-spring-boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Jasypt Spring Boot 可以为 SpringBoot 程序提供配置文件的加密支持。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;有三种方式可以在项目中集成 jasypt-spring-boot。&lt;/p&gt;
    
    </summary>
    
    
      <category term="Java" scheme="https://blog.homurax.com/categories/Java/"/>
    
    
      <category term="Jasypt" scheme="https://blog.homurax.com/tags/Jasypt/"/>
    
  </entry>
  
  <entry>
    <title>Exif 信息的读取与删除（Pillow、Piexif、ExifTool）</title>
    <link href="https://blog.homurax.com/2023/04/13/exif-meta-info/"/>
    <id>https://blog.homurax.com/2023/04/13/exif-meta-info/</id>
    <published>2023-04-13T14:36:24.000Z</published>
    <updated>2023-04-13T16:42:24.828Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;我想要删除约百 G 图片中的一些信息，具体是：标题、主题、标记、备注、图像 ID。&lt;/p&gt;
&lt;p&gt;虽然可以选中若干图片，属性 - 删除属性和个人信息，然后进行删除。&lt;/p&gt;
&lt;p&gt;但是这种方式删除不了图像 ID，并且图片也不在同一个文件夹之中，因此还是要考虑写一个 Python 脚本来处理。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.homurax.com/categories/Python/"/>
    
    
      <category term="图片处理" scheme="https://blog.homurax.com/tags/%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>北京健康宝连续出现弹窗 3 及应对</title>
    <link href="https://blog.homurax.com/2022/10/12/beijing-health-kit-pop-up-alert-3/"/>
    <id>https://blog.homurax.com/2022/10/12/beijing-health-kit-pop-up-alert-3/</id>
    <published>2022-10-12T04:58:09.000Z</published>
    <updated>2022-10-12T05:03:32.669Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;国庆回了老家（后称 A），10 月 6 日从 A 乘坐高铁返京。&lt;/p&gt;
&lt;p&gt;候车厅是司空见惯的进京车次二次安检，以及核对北京健康宝状态。&lt;/p&gt;
&lt;p&gt;列车上在还有半小时抵京的时候，乘务员开始再次检查乘客的北京健康宝状态以及 24 小时内的核酸记录。&lt;/p&gt;
&lt;p&gt;有些人这个时候已经出现了弹窗，或者不满足核酸要求，会被乘务员收走身份证，以防其出站。&lt;/p&gt;
&lt;p&gt;我之前也担心北京国庆后恰逢二十大，是否会更加严格管制，并且无法预测国庆假期期间 A 地是否会出现新增病例影响返京，但是最后从结果来看返京的过程中还是很顺利的。&lt;/p&gt;
    
    </summary>
    
    
      <category term="杂谈" scheme="https://blog.homurax.com/categories/%E6%9D%82%E8%B0%88/"/>
    
    
  </entry>
  
  <entry>
    <title>为 Hexo 的任何主题添加数学公式（LaTeX）的支持</title>
    <link href="https://blog.homurax.com/2022/08/21/hexo-theme-latex/"/>
    <id>https://blog.homurax.com/2022/08/21/hexo-theme-latex/</id>
    <published>2022-08-21T09:29:43.000Z</published>
    <updated>2022-08-21T09:33:56.833Z</updated>
    
    <summary type="html">
    
      &lt;p&gt;之前在用 markdown 写东西的时候会下意识避免使用 LaTeX 语法。&lt;/p&gt;
&lt;p&gt;因为尽管当前使用的 Typora 对 LaTeX 的支持还不错，但是当前使用的 hexo 的主题  &lt;a href=&quot;https://github.com/SumiMakito/hexo-theme-typography&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Typography&lt;/a&gt; 并不支持。&lt;/p&gt;
&lt;p&gt;最近觉得对于有些场景，还是使用 LaTeX 展示效果会更好，所以决定为当前主题添加 LaTeX 支持。&lt;/p&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://blog.homurax.com/categories/Hexo/"/>
    
    
  </entry>
  
</feed>
