<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Howe&#39;s Blog</title>
    <link>https://howe.wang/posts/</link>
    <description>Recent content in Posts on Howe&#39;s Blog</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 07 Jun 2025 14:02:08 +0800</lastBuildDate>
    <atom:link href="https://howe.wang/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ZFile学习笔记——启动！</title>
      <link>https://howe.wang/posts/zfile-start/</link>
      <pubDate>Sat, 07 Jun 2025 14:02:08 +0800</pubDate>
      <guid>https://howe.wang/posts/zfile-start/</guid>
      <description>&lt;h2 id=&#34;项目介绍&#34;&gt;项目介绍&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;ZFile 是一个适用于个人或小团队的在线网盘程序，可以将多种存储类型统一管理，再也不用登录各种网站管理文件，现在你只需要在 ZFile 中畅快使用！——GitHub README&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;我第一次见到这个项目是在折腾LG手机刷机的时候发现的，有人用它托管刷机包。后来我自己把它部署到服务器上试了一下，发现可以很方便的挂载OneDrive，并且可以直接生成下载链接。&lt;/p&gt;
&lt;p&gt;最近在学习Java项目，但是网上找到的学习项目都是玩具项目(黑马全家桶、各种知识星球项目)，他们很多都存在功能简陋、代码不规范、没有完善的配套前端等等问题&amp;hellip;&amp;hellip;最重要的是项目的需求和功能都是虚拟的，根本没有实际意义。于是想到了之前用过的ZFile恰好就是用Java开发的，并且复杂程度貌似并不高🤨(我猜的)，用来学习实际的Java项目岂不是完美？&lt;/p&gt;
&lt;h2 id=&#34;zfile使用的技术&#34;&gt;ZFile使用的技术&lt;/h2&gt;
&lt;p&gt;把项目从GitHub上克隆下来后我首先查看了maven的配置文件&lt;code&gt;pom.xml&lt;/code&gt;，从中可以查看该项目所使用到的技术。&lt;/p&gt;
&lt;h3 id=&#34;1-springboot与java版本&#34;&gt;1. SpringBoot与Java版本&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-parent&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.3.2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;relativePath/&amp;gt;&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 不要去本地找父 POM，而是直接去仓库下载它 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;java.version&amp;gt;&lt;/span&gt;21&lt;span class=&#34;nt&#34;&gt;&amp;lt;/java.version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;maven.compiler.source&amp;gt;&lt;/span&gt;21&lt;span class=&#34;nt&#34;&gt;&amp;lt;/maven.compiler.source&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;maven.compiler.target&amp;gt;&lt;/span&gt;21&lt;span class=&#34;nt&#34;&gt;&amp;lt;/maven.compiler.target&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用&lt;code&gt;Spring Boot 3.3.2&lt;/code&gt;作为基础框架并使用&lt;code&gt;Java 21&lt;/code&gt;，表明这个项目的技术是比较新的。&lt;/p&gt;
&lt;h3 id=&#34;2依赖&#34;&gt;2.依赖&lt;/h3&gt;
&lt;p&gt;依赖分为几大类，反映了项目的功能模块和技术栈：&lt;/p&gt;
&lt;h4 id=&#34;spring-boot相关&#34;&gt;&lt;strong&gt;Spring Boot相关&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;spring-boot-starter-web: 提供Web开发支持，用于构建RESTful API或Web应用。&lt;/li&gt;
&lt;li&gt;spring-boot-starter-aop: 支持面向切面编程（AOP），用于日志、事务等横切关注点。&lt;/li&gt;
&lt;li&gt;spring-boot-configuration-processor: 生成配置元数据，支持Spring Boot的自动配置。&lt;/li&gt;
&lt;li&gt;spring-boot-starter-data-redis: Redis支持，可能用于缓存或会话管理。&lt;/li&gt;
&lt;li&gt;spring-boot-starter-cache: 提供缓存支持，可能与Redis结合使用。&lt;/li&gt;
&lt;li&gt;spring-boot-starter-thymeleaf: Thymeleaf模板引擎，用于服务端渲染HTML页面。&lt;/li&gt;
&lt;li&gt;spring-boot-starter-validation: Hibernate Validator，用于参数校验。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;数据库相关&#34;&gt;&lt;strong&gt;数据库相关&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;mysql-connector-j: MySQL数据库驱动（运行时依赖）。&lt;/li&gt;
&lt;li&gt;sqlite-jdbc: SQLite数据库驱动，支持轻量级数据库。&lt;/li&gt;
&lt;li&gt;flyway-core, flyway-mysql: Flyway数据库迁移工具（版本10.12.0），用于数据库版本管理和Schema迁移。&lt;/li&gt;
&lt;li&gt;mybatis-plus-spring-boot3-starter: MyBatis-Plus（版本3.5.6），增强型ORM框架，简化数据库操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;存储策略相关&#34;&gt;&lt;strong&gt;存储策略相关&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;upyun java-sdk: 又拍云存储SDK。&lt;/li&gt;
&lt;li&gt;software.amazon.awssdk:s3: AWS S3存储支持。&lt;/li&gt;
&lt;li&gt;qiniu-java-sdk: 七牛云存储SDK。&lt;/li&gt;
&lt;li&gt;jsch: SSH/SFTP支持，可能用于文件传输。&lt;/li&gt;
&lt;li&gt;sardine: WebDAV协议支持。&lt;/li&gt;
&lt;li&gt;google-api-client: Google API客户端，可能用于Google Drive等存储服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;认证权限&#34;&gt;&lt;strong&gt;认证/权限&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;sa-token-spring-boot3-starter: Sa-Token（版本1.38.0），轻量级认证授权框架，可能用于用户登录、权限管理和会话控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;api文档&#34;&gt;&lt;strong&gt;API文档&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;knife4j-openapi3-jakarta-spring-boot-starter: Knife4j（版本4.5.0），基于OpenAPI 3的API文档生成工具，提供交互式API文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;工具类&#34;&gt;&lt;strong&gt;工具类&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hutool-all: Hutool工具库，提供丰富的Java工具方法。&lt;/li&gt;
&lt;li&gt;poi-ooxml: Apache POI，用于处理Excel、Word等Office文档。&lt;/li&gt;
&lt;li&gt;commons-compress: 文件压缩/解压支持。&lt;/li&gt;
&lt;li&gt;lombok: 简化Java代码（如自动生成Getter/Setter）。&lt;/li&gt;
&lt;li&gt;commons-net: 网络工具库，支持FTP、Telnet等协议。&lt;/li&gt;
&lt;li&gt;okhttp: HTTP客户端，用于网络请求。&lt;/li&gt;
&lt;li&gt;fastjson2: JSON处理库，性能优异。&lt;/li&gt;
&lt;li&gt;guava: Google Guava工具库，提供集合、缓存等功能。&lt;/li&gt;
&lt;li&gt;mapstruct: 对象映射工具，简化DTO与实体转换。&lt;/li&gt;
&lt;li&gt;commons-chain: 责任链模式实现。&lt;/li&gt;
&lt;li&gt;totp: 时间戳一次性密码（TOTP），可能用于双因素认证。&lt;/li&gt;
&lt;li&gt;jcommander: 命令行参数解析。&lt;/li&gt;
&lt;li&gt;json: JSON处理库。&lt;/li&gt;
&lt;li&gt;httpclient5, httpmime: Apache HttpClient，支持HTTP请求和文件上传。&lt;/li&gt;
&lt;li&gt;bcprov-jdk15on: Bouncy Castle加密库，支持加密操作。&lt;/li&gt;
&lt;li&gt;spring-retry: Spring重试机制，处理失败重试逻辑。&lt;/li&gt;
&lt;li&gt;commons-fileupload: 文件上传支持。&lt;/li&gt;
&lt;li&gt;dns-cache-manipulator: DNS缓存操作，可能用于优化网络请求。&lt;/li&gt;
&lt;li&gt;oshi-core: 系统监控库，用于获取系统资源信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;graalvm支持&#34;&gt;&lt;strong&gt;GraalVM支持&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;graal-sdk: GraalVM SDK（版本24.1.0，provided scope），用于支持GraalVM原生镜像编译。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;构建配置&#34;&gt;&lt;strong&gt;构建配置（&lt;build&gt;）&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;插件
&lt;ul&gt;
&lt;li&gt;spring-boot-maven-plugin: Spring Boot构建插件，支持打包可执行JAR。&lt;/li&gt;
&lt;li&gt;maven-compiler-plugin: 配置Java 21编译，启用MapStruct、Lombok等注解处理器。&lt;/li&gt;
&lt;li&gt;flyway-maven-plugin: Flyway数据库迁移插件，用于执行数据库迁移任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Profiles
&lt;ul&gt;
&lt;li&gt;使用 native-maven-plugin（GraalVM构建工具）。&lt;/li&gt;
&lt;li&gt;配置了特定的JVM参数和构建参数（如-march=compatibility, AddAllCharsets等）。&lt;/li&gt;
&lt;li&gt;启用了自定义的AOT（Ahead-of-Time）特性，包括Lambda、加密（Bouncy Castle）和SQLite支持。&lt;/li&gt;
&lt;li&gt;项目支持GraalVM原生编译，以提高启动性能和降低内存占用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;zfile的功能&#34;&gt;ZFile的功能&lt;/h2&gt;
&lt;p&gt;在深入ZFile的源码之前我打算先把它的基本功能搞清楚，然后按照不同的功能模块分别去细致地学习代码实现。&lt;/p&gt;</description>
    </item>
    <item>
      <title>搭建IPv6&#43;SSL中转服务器</title>
      <link>https://howe.wang/posts/v6-node/</link>
      <pubDate>Wed, 23 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/v6-node/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在一年多前我写了一个教程&lt;a href=&#34;https://howe.wang/2021/01/ipv6server/&#34;&gt;利用云服务器实现校园网免流&lt;/a&gt;，在这篇文章中介绍了如何搭建一个使用ShadowSocks协议的IPv6中转服务器，这种方式存在一些弊端，例如：非常容易被GFW嗅探到、客户端已经停更、一些软件的流量无法被接管&amp;hellip;经过研究，我找到了一个目前理论上安全性比较高速度也比较快的解决方案，即基于&lt;a href=&#34;https://trojan-gfw.github.io/trojan/protocol.html&#34;&gt;Trojan&lt;/a&gt;协议，利用TLS加密并且把我们的中转服务器伪装成一个站点。这种方案从技术上来说基本杜绝了被嗅探的可能，让我们的中转服务器更加的稳定。&lt;/p&gt;
&lt;h2 id=&#34;购买服务器&#34;&gt;购买服务器&lt;/h2&gt;
&lt;p&gt;目前支持IPv6的且价格便宜的云服务商也就一个Vultr了，如果还没有注册点击&lt;a href=&#34;https://www.vultr.com/?ref=9015661-8H&#34;&gt;这里&lt;/a&gt;注册。&lt;/p&gt;
&lt;p&gt;这里选择最普通的服务器就行&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择服务器类型&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;地区我选择的是纽约，因为这里有3.5$一个月的套餐&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择服务器地区&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;系统镜像选择CentOS 7&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择服务器系统&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-3.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;我这里选择的是3.5$一个月的套餐，每个月有500g的流量，如果你的需求比较大可以选择5$一个月的套餐&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择服务器套餐&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-4.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;查看服务器信息，用IP地址还有密码进行ssh登录&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;服务器信息&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-5.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;刚开通服务器的几分钟内是无法进行ssh连接的，需要等待系统安装完毕&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;系统安装中&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-6.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;要使用IPv6地址的话得先去设置里添加一个IPv6地址&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;开启IPv6&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-7.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;在域名的DNS解析里添加一条AAAA记录指向刚刚分配的IPv6地址&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;设置DNS&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-8.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;申请ssl证书&#34;&gt;申请SSL证书&lt;/h2&gt;
&lt;p&gt;使用Trojan协议需要一个SSL证书，在等待系统安装的时候我们去&lt;a href=&#34;https://www.sslforfree.com/&#34;&gt;SSL For Free&lt;/a&gt;申请一个。&lt;/p&gt;
&lt;p&gt;点击申请一个新的证书&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;申请&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-9.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;填入需要申请的域名&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;填入需要申请的域名&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-10.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;选择免费的90天证书&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择免费的90天证书&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-11.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个自动填入信息开着就好&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;自动填入信息&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-12.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;选择免费的套餐就行&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择套餐&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-13.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;在这里需要验证域名的所有权，点击通过DNS验证&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;验证域名&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-14.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;按照上一步的提示去设置域名的DNS解析&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;DNS解析&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-15.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;DNS设置完成后就回到申请页面点击验证&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;点击验证&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-16.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;验证通过后就可以点击下载证书把证书给下载下来&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;下载证书&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-17.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;将压缩包解压可以得到这几个文件&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;证书文件&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-18.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;将证书文件上传至服务器&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;上传&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-19.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装和配置x-ui&#34;&gt;安装和配置x-ui&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/vaxilu/x-ui&#34;&gt;x-ui&lt;/a&gt;是一个支持多协议多用户的 xray 面板，支持vmess、vless、trojan、shadowsocks、dokodemo-door、socks、http协议，功能非常强大，我们的trojan服务就是使用它创建和管理的。&lt;/p&gt;
&lt;h3 id=&#34;安装x-ui&#34;&gt;安装x-ui&lt;/h3&gt;
&lt;p&gt;在服务器终端输入命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash &amp;lt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后将会执行脚本自动安装，中途需要自行输入后台用户名密码还有端口号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;安装完成&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-20.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;安装完成后先停用CentOS的防火墙&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl stop firewalld
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在浏览器访问&lt;code&gt;服务器IP:你设置的端口号&lt;/code&gt;看看是否能够进入x-ui后台，如果成功进入则表示安装成功。&lt;/p&gt;
&lt;h3 id=&#34;配置x-ui&#34;&gt;配置x-ui&lt;/h3&gt;
&lt;p&gt;在面板设置里填入刚刚上传的SSL证书路径，点击重启面板，之后就可以通过&lt;code&gt;域名：端口号&lt;/code&gt;来访问x-ui面板了&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;设置SSL证书&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-21.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;在入站列表添加一个trojan节点，端口填443，公钥和密钥还是填刚刚上传的证书路径，最后点击添加即可&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;添加trojan节点&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/v6-node-22.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用clash连接&#34;&gt;使用Clash连接&lt;/h2&gt;
&lt;p&gt;虽然支持trojan的客户端有很多，但我最喜欢用的还是Clash，因为它的功能特别强大，甚至可以当作一个网关使用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hackintosh-黑苹果</title>
      <link>https://howe.wang/posts/hackintosh/</link>
      <pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/hackintosh/</guid>
      <description>&lt;h2 id=&#34;什么是黑苹果&#34;&gt;什么是黑苹果&lt;/h2&gt;
&lt;p&gt;根据&lt;a href=&#34;https://insights.stackoverflow.com/survey/2021/&#34;&gt;Stack Overflow在2021年的统计&lt;/a&gt;中显示：在专业的开发者中有30.04%的人选择使用macOS操作系统。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Stack Overflow 统计数据&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/hackintosh-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以看到包括macOS在内，类Unix操作系统的使用占比接近60%，这个统计结果足以说明大部分的专业程序员是更加偏向于与类Unix系统的。原因也很好解释，在各种开发过程中不可避免的要使用各式各样的命令行工具、配置各种环境，Windows操作系统的命令行使用体验实在谈不上优秀。&lt;/p&gt;
&lt;p&gt;但是为什么大家不直接使用Linux作为主力开发操作系统呢？原因是各大常用软件基本上都把Linux视作孤儿，例如“国民级软件”qq和微信到现在都无法在Linux上正常使用。&lt;/p&gt;
&lt;p&gt;然而macOS就很好的平衡了这些需求，有强大的终端、与Linux师出同门很多的命令可以通用、各种常用软件都有这与Windows同等级的支持&amp;hellip;由于本质上是属于闭源的定制系统，所以可以很好的和苹果其他设备例如：iPhone、iPad、AirPods或者另一台Mac设备协同使用。我觉得macOS相较于Windows的高分辨率屏幕体验要强太多，在4k甚至更高的分辨率下绝大多数软件仍然有着优秀的使用体验，但是Windows这边一旦开启了150%以上的缩放，很多常用软件都会变得模糊不堪。大体上我们可以把macOS当作一个深度定制的Linux发行版使用，但是代价是你必须花大价钱购入一台Mac电脑。&lt;/p&gt;
&lt;p&gt;那么我们有没有可能把macOS当作普通的操作系统一样安装在自己的电脑上呢？答案是肯定的。&lt;/p&gt;
&lt;p&gt;2005年6月的&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E8%8B%B9%E6%9E%9C%E5%85%A8%E7%90%83%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E4%BC%9A&#34;&gt;苹果全球开发者大会&lt;/a&gt;（WWDC 2005），当时苹果宣布他们将把其个人电脑从&lt;a href=&#34;https://zh.wikipedia.org/wiki/PowerPC&#34;&gt;PowerPC&lt;/a&gt;架构转向&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E8%8B%B1%E7%89%B9%E7%88%BE&#34;&gt;英特尔&lt;/a&gt;架构。所以从2005年开始一直到2020年苹果推出的最后一台基于英特尔架构的电脑从理论上都是可以运行在我们所熟知的英特尔x86架构PC上的。&lt;/p&gt;
&lt;h2 id=&#34;如何打造一台自己的mac&#34;&gt;如何打造一台自己的Mac&lt;/h2&gt;
&lt;p&gt;目前最流行的制作黑苹果方案是使用&lt;a href=&#34;https://github.com/acidanthera/OpenCorePkg&#34;&gt;OpenCore bootloader&lt;/a&gt;来引导进入macOS。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OpenCore bootloader 项目&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/hackintosh-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;既然想做那就一定要做一台完美的Mac，我们的目标不仅仅是要能运行macOS，而是要实现一台Mac电脑所能实现的所有功能(Wi-Fi、蓝牙、隔空投送、随航、通用控制&amp;hellip;)&lt;/p&gt;
&lt;p&gt;因为在macOS中无法自行安装驱动，所有的硬件驱动都是直接写入系统中的，所以我们需要使用已经在系统中写好了驱动的程序，俗称“免驱设备”。&lt;a href=&#34;https://dortania.github.io/OpenCore-Install-Guide/macos-limits.html&#34;&gt;在这里查看支持macOS的硬件设备&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;购买到合适的硬件后，根据OpenCore的文档定制属于自己硬件的引导程序就大功告成啦(实际上中间有很多的坑和困难，感兴趣的同学可以自行搜索教程)&lt;/p&gt;
&lt;h2 id=&#34;我的mac-pro-mini&#34;&gt;我的Mac Pro Mini&lt;/h2&gt;
&lt;p&gt;经过不断的折腾和捣鼓，我自己打造了一台Mac Pro Mini。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;我的Mac Pro Mini&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/hackintosh-3.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;它的具体配置如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;系统信息&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/hackintosh-4.webp&#34;&gt;&lt;/p&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;&lt;strong&gt;主板&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.asus.com.cn/Motherboards/ROG-STRIX-B460-I-GAMING/&#34;&gt;ROG STRIX B460-I GAMING&lt;/a&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;a href=&#34;https://www.intel.cn/content/www/cn/zh/products/sku/199328/intel-core-i910900-processor-20m-cache-up-to-5-20-ghz/specifications.html&#34;&gt;Intel® Core™ i9-10900&lt;/a&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;a href=&#34;https://www.sapphiretech.com/zh-cn/consumer/pulse-rx-580-8g-g5-oc_c&#34;&gt;蓝宝石 RX580 8G D5 白金版 OC&lt;/a&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;a href=&#34;https://cn.fenvi.com/product_detail_39.html&#34;&gt;BCM94352Z（fenvi）&lt;/a&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;a href=&#34;https://gskill.com/cn/product/204/218/1535687484/F4-3200C16S-16GVK&#34;&gt;芝奇 Ripjaws V 16Gx2&lt;/a&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;a href=&#34;https://shop.westerndigital.com/zh-cn/products/internal-drives/wd-black-sn750-nvme-ssd#WDS500G3X0C&#34;&gt;西数 WD_BLACK™ SN750 500G&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;基于OpenCore和以上硬件定制的EFI引导程序我已经开源至GitHub，欢迎各位有兴趣的同学来抄作业、提交issues。本项目持续更新，如果喜欢的话也可以给个star。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/aahowe/ROG-B460i_Hackintosh_OpenCore_EFI&#34;&gt;ROG-B460i_Hackintosh_OpenCore_EFI&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>计算机中的数字</title>
      <link>https://howe.wang/posts/number-in-computer/</link>
      <pubDate>Wed, 27 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/number-in-computer/</guid>
      <description>&lt;h2 id=&#34;计算机中的数字是如何表示的&#34;&gt;计算机中的数字是如何表示的&lt;/h2&gt;
&lt;p&gt;由于计算机所使用的硬件特性，导致了在计算机的底层数字只能以二进制的形式进行表达。二进制和十进制一样，也是一种进位计数制，但是它的基数是 2。二进制表达式中 0 和 1 的位置不同，它所代表的数值也不同。例如，二进制数 &lt;code&gt;0000 1010&lt;/code&gt; 表示十进制数 10。&lt;strong&gt;一个二进制数具有两个基本特点：两个不同的数字符号，即 0 和 1，逢二进一。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://zh.wikipedia.org/zh-cn/%E4%BA%8C%E8%BF%9B%E5%88%B6&#34;&gt;关于二进制的维基百科解释&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;无符号数&#34;&gt;无符号数&lt;/h2&gt;
&lt;p&gt;无符号数顾名思义就是单纯的数字，没有正负号也没有小数点，是非负整数。这一类型的数字表示起来最简单，只需用二进制的方式写出即可。&lt;/p&gt;
&lt;p&gt;为了更加清楚的解释无符号数的表示方法CSAPP中介绍了一种图形化的表示方法来帮助读者理解无符号数的编码方式。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;二进制数从右往左的第&lt;code&gt;i&lt;/code&gt;位即表示为$2^{i-1}$，将不为0的项相加得到所表示的无符号数。&lt;/p&gt;
&lt;h2 id=&#34;有符号数&#34;&gt;有符号数&lt;/h2&gt;
&lt;p&gt;在现实世界中，无符号数的局限性是相当大的，那么拥有正负号的数字该如何进行编码呢？&lt;/p&gt;
&lt;p&gt;计算机中使用&lt;a href=&#34;https://zh.wikipedia.org/zh-cn/%E4%BA%8C%E8%A3%9C%E6%95%B8&#34;&gt;补码&lt;/a&gt;来表示有符号数，简单的来说就是在无符号数表示方法的基础上新增了一个符号位以表示正负。最高位若为&lt;code&gt;0&lt;/code&gt;则表示正数，最高位若为&lt;code&gt;1&lt;/code&gt;则表示负数。需要注意的是，符号位并不是单纯的表示数的正负性，它代表负权重的概念。&lt;/p&gt;
&lt;p&gt;若一个有符号数的二进制形式如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;那么它的十进制的计算方法为：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-3.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;两个例子：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-4.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;为了便于理解，补码也有对应的图形化表示方式：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-5.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;其中蓝色代表正数，灰色代表负数，由图可知当最高位为&lt;code&gt;1&lt;/code&gt;时得到的必定为负数。&lt;/p&gt;
&lt;h2 id=&#34;数字的表示范围&#34;&gt;数字的表示范围&lt;/h2&gt;
&lt;h3 id=&#34;无符号数的表示范围&#34;&gt;无符号数的表示范围&lt;/h3&gt;
&lt;p&gt;对于无符号数，当字长为n时，其能表示的最大数为：$$1\times 2^{0} +1\times 2^{1} +\dots +1\times 2^{n-1} =2^{n} -1$$&lt;/p&gt;
&lt;p&gt;字长为&lt;code&gt;8&lt;/code&gt;到&lt;code&gt;64&lt;/code&gt;的无符号数所能表示的范围图表：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图片来自b站up九曲阑干&#34; loading=&#34;lazy&#34; src=&#34;https://images.howe.wang/number-6.webp&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;有符号数的表示范围&#34;&gt;有符号数的表示范围&lt;/h3&gt;
&lt;p&gt;有符号数与无符号数的区别在于其最高位充当符号位，所以只有&lt;code&gt;n-1&lt;/code&gt;位能够表示数的大小。&lt;/p&gt;
&lt;p&gt;所能表示的最大值为：$$1\times 2^{0} +1\times 2^{1} +\dots +1\times 2^{n-2} - 0\times 2^{n-1} =2^{n-1} -1$$&lt;/p&gt;
&lt;p&gt;所能表示的最小值为：$$0\times 2^{0} +0\times 2^{1} +\dots +0\times 2^{n-2} - 1\times 2^{n-1} =-2^{n-1}$$&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git基础命令</title>
      <link>https://howe.wang/posts/git-use/</link>
      <pubDate>Fri, 08 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/git-use/</guid>
      <description>&lt;h2 id=&#34;获取-git-仓库&#34;&gt;获取 Git 仓库&lt;/h2&gt;
&lt;p&gt;通常有两种获取 Git 项目仓库的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将尚未进行版本控制的本地目录转换为 Git 仓库；&lt;/li&gt;
&lt;li&gt;从其它服务器&lt;strong&gt;克隆&lt;/strong&gt;一个已存在的 Git 仓库。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。&lt;/p&gt;
&lt;h3 id=&#34;在已存在目录中初始化仓库&#34;&gt;在已存在目录中初始化仓库&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该命令将创建一个名为&lt;code&gt; .git&lt;/code&gt;的子目录，这个子目录含有你初始化的 Git 仓库中所有的必须文件，这些文件是Git 仓库的骨干。 但是，在这个时候，我们仅仅是做了一个初始化的操作，你的项目里的文件还没有被跟踪。&lt;/p&gt;
&lt;h3 id=&#34;克隆现有的仓库&#34;&gt;克隆现有的仓库&lt;/h3&gt;
&lt;p&gt;克隆仓库的命令是 &lt;code&gt;git clone &amp;lt;url&amp;gt;&lt;/code&gt;。比如，要克隆 Git 的链接库&lt;strong&gt;libgit2&lt;/strong&gt;，可以用下面的命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/libgit2/libgit2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会在当前目录下创建一个名为&lt;code&gt;libgit2&lt;/code&gt;的目录，并在这个目录下初始化一个&lt;code&gt; .git&lt;/code&gt;文件夹， 从远程仓库拉取下所有数据放入&lt;code&gt; .git&lt;/code&gt;文件夹，然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的&lt;code&gt; libgit2&lt;/code&gt;文件夹，你会发现所有的项目文件已经在里面了，准备就绪等待后续的开发和使用。&lt;/p&gt;
&lt;p&gt;如果你想在克隆远程仓库的时候，自定义本地仓库的名字，你可以通过额外的参数指定新的目录名：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/libgit2/libgit2 mylibgit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会执行与上一条命令相同的操作，但目标目录名变为了&lt;code&gt;mylibgit&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;记录每次更新到仓库&#34;&gt;记录每次更新到仓库&lt;/h2&gt;
&lt;p&gt;现在我们的机器上有了一个&lt;strong&gt;真实项目&lt;/strong&gt;的 Git 仓库，并从这个仓库中检出了所有文件的&lt;strong&gt;工作副本&lt;/strong&gt;。 通常，你会对这些文件做些修改，每当完成了一个阶段的目标，想要将记录下它时，就将它提交到仓库。&lt;/p&gt;
&lt;p&gt;请记住，你工作目录下的每一个文件都不外乎这两种状态：&lt;strong&gt;已跟踪(tracked)&lt;strong&gt;或&lt;/strong&gt;未跟踪(untracked)&lt;/strong&gt;。 已跟踪的文件是指那些被纳入了版本控制的文件，在上一次快照中有它们的记录，在工作一段时间后， 它们的状态可能是未修改，已修改或已放入暂存区。简而言之，已跟踪的文件就是 Git 已经知道的文件。&lt;/p&gt;
&lt;p&gt;工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有被放入暂存区。 初次克隆某个仓库的时候，工作目录中的所有文件都属于已跟踪文件，并处于未修改状态，因为 Git刚刚检出了它们， 而你尚未编辑过它们。&lt;/p&gt;
&lt;p&gt;编辑过某些文件之后，由于自上次提交后你对它们做了修改，Git 将它们标记为已修改文件。 在工作时，你可以选择性地将这些修改过的文件放入暂存区，然后提交所有已暂存的修改，如此反复。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;文件的状态变化周期&#34; loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/screen_2022-04-08%2022.25.14.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;检查当前文件状态&#34;&gt;检查当前文件状态&lt;/h3&gt;
&lt;p&gt;可以用 &lt;code&gt;git status&lt;/code&gt;命令查看哪些文件处于什么状态。如果在克隆仓库后立即使用此命令，会看到类似这样的输出：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git status 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;On branch master
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Your branch is up-to-date with &lt;span class=&#34;s1&#34;&gt;&amp;#39;origin/master&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nothing to commit, working directory clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;跟踪新文件&#34;&gt;跟踪新文件&lt;/h3&gt;
&lt;p&gt;使用命令&lt;code&gt;git add&lt;/code&gt;开始跟踪一个文件。所以，要跟踪&lt;code&gt;README&lt;/code&gt;文件，运行：&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQL语句笔记</title>
      <link>https://howe.wang/posts/sql/</link>
      <pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/sql/</guid>
      <description>&lt;h2 id=&#34;本文所使用的数据库&#34;&gt;本文所使用的数据库&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;err&#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;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;姓名&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sname&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;err&#34;&gt;性别&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Ssex&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;err&#34;&gt;年龄&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sage&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;err&#34;&gt;所属系别&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，班级&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sclass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Student&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;S&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;char&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;n&#34;&gt;Sname&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#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;span class=&#34;n&#34;&gt;Ssex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&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;Sage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D&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;char&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;Sclass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;err&#34;&gt;院系：系别&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，系名&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dname&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;err&#34;&gt;系主任&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dept&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;D&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;char&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;Dname&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#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;span class=&#34;n&#34;&gt;Dean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#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;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;err&#34;&gt;课程：课号&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;C&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;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;课名&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cname&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;err&#34;&gt;教师编号&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&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;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;学时&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Chours&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，学分&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Credit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Course&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;C&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;char&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;n&#34;&gt;Cname&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Chours&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Credit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;float&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;n&#34;&gt;T&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;char&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;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;err&#34;&gt;教师：教师编号&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，教师名&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Tname&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;err&#34;&gt;所属院系&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，工资&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Salary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Teacher&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;T&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;char&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;n&#34;&gt;Tname&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#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;span class=&#34;n&#34;&gt;D&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;char&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;Salary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;float&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;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;err&#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;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;课号&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;C&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;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;成绩&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Score&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SC&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;S&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;char&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;k&#34;&gt;C&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;char&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;n&#34;&gt;Score&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;float&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;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;建立数据库&#34;&gt;建立数据库&lt;/h2&gt;
&lt;h3 id=&#34;定义数据库和表&#34;&gt;定义数据库和表&lt;/h3&gt;
&lt;h4 id=&#34;创建database&#34;&gt;创建Database&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据库(Database&lt;/strong&gt;)是若干具有相互关联关系的&lt;code&gt;Table/Relation&lt;/code&gt;的集合&lt;/li&gt;
&lt;li&gt;数据库可以看作是一个集中存放若干&lt;code&gt;Table&lt;/code&gt;的大型文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建数据库的简单语法形式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;database&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例：创建课程学习数据库SCT&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;database&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SCT&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;创建table&#34;&gt;创建Table&lt;/h4&gt;
&lt;p&gt;创建table简单语法形式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;表名&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;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Primary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Unique&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Notnull&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;err&#34;&gt;列名&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Primary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Unique&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Notnull&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“[ ] ”表示其括起的内容可以省略，“| ”表示其隔开的两项可取其一&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Android系统获取root权限教程</title>
      <link>https://howe.wang/posts/android-root/</link>
      <pubDate>Fri, 18 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/android-root/</guid>
      <description>&lt;p&gt;众所周知Android系统在获取root权限之后可以解锁各种各样的玩法(超频、删温控、刷模块、修改系统配置&amp;hellip;)没有root权限的安卓机是没有灵魂的。现在的主流方法是用magisk修补boot镜像来获取root权限，操作十分简单。&lt;/p&gt;
&lt;h2 id=&#34;详细的视频教程和相关链接&#34;&gt;详细的视频教程和相关链接&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;《玩机必看！带你入坑安卓刷机，小白也能看懂的ROOT基础指南来啦！》&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1BY4y1H7Mc&#34;&gt;https://www.bilibili.com/video/BV1BY4y1H7Mc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;各种玩机地址/工具/命令汇总：http://wanji.jamcz.com/&lt;/p&gt;
&lt;p&gt;Android SDK（ADB和Fastboot电脑端工具）：https://developer.android.google.cn/studio/releases/platform-tools?hl=zh-cn&lt;/p&gt;
&lt;p&gt;ADB/Fastboot驱动：https://cz-jam.lanzouj.com/iZICY02v2k8j&lt;/p&gt;
&lt;p&gt;TWRP：https://twrp.me/&lt;/p&gt;
&lt;p&gt;Magisk：https://github.com/topjohnwu/Magisk&lt;/p&gt;
&lt;p&gt;小米解锁工具：https://www.miui.com/unlock/index.html&lt;/p&gt;
&lt;p&gt;小米ROM下载：https://xiaomirom.com/series/&lt;/p&gt;
&lt;p&gt;小米刷机工具：https://cdn.alsgp0.fds.api.mi-img.com/micomm/MiFlash2020-3-14-0.rar&lt;/p&gt;
&lt;p&gt;一加ROM下载：https://www.oneplus.com/cn/support/softwareupgrade&lt;/p&gt;
&lt;p&gt;三星刷机工具：https://odindownload.com/&lt;/p&gt;
&lt;p&gt;三星ROM下载：https://www.sammobile.com/firmwares/&lt;/p&gt;
&lt;p&gt;魅族ROOT链接：https://mroot.flyme.cn/&lt;/p&gt;
&lt;p&gt;OPPO解锁：https://www.oppo.cn/thread-397164526-1&lt;/p&gt;
&lt;p&gt;OPPO ROM：https://www.coloros.com/rom&lt;/p&gt;
&lt;p&gt;Realme解锁：https://www.realmebbs.com/post-details/1275426081138028544&lt;/p&gt;
&lt;p&gt;Realme刷机工具：https://www.realmebbs.com/post-details/1271082970484060160&lt;/p&gt;
&lt;p&gt;Realme ROM：https://www.realme.com/support/software-update&lt;/p&gt;
&lt;p&gt;索尼解锁：https://developer.sony.com/develop/open-devices/get-started/unlock-bootloader&lt;/p&gt;
&lt;p&gt;索尼ROM：https://xperifirm.com/&lt;/p&gt;
&lt;p&gt;MOTO解锁：https://motorola-global-portal.custhelp.com/app/standalone/bootloader/unlock-your-device-a&lt;/p&gt;
&lt;p&gt;MOTO ROM：https://mirrors.lolinet.com/firmware/motorola/&lt;/p&gt;
&lt;p&gt;payload-dumper解包工具：https://mrzzoxo.lanzouw.com/iR65zpaueyd&lt;/p&gt;
&lt;p&gt;酷安（玩机社区）：https://www.coolapk.com/&lt;/p&gt;
&lt;p&gt;XDA（海外玩机论坛）：https://forum.xda-developers.com/&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;解锁bootloader&#34;&gt;解锁bootloader&lt;/h2&gt;
&lt;p&gt;手机厂商会出场默认锁定bootloader(用来防止系统启动文件被替换)，刷入magisk的第一步就是把这个bootloader解开，每家厂商的解锁方法不尽相同，这里放出一个b站教程。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『解BL锁』B站最强 之 一个视频解决你手机的BL锁困扰&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1tT4y1d7ao&#34;&gt;https://www.bilibili.com/video/BV1tT4y1d7ao&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;获取系统镜像中的bootimg文件&#34;&gt;获取系统镜像中的boot.img文件&lt;/h2&gt;
&lt;p&gt;刷入magisk获取root的核心步骤就是要利用magisk对boot.img进行修补然后替换掉原厂的boot文件，所以第一步就是要获取原厂镜像的boot.img。这里以&lt;strong&gt;Google Pixel 4&lt;/strong&gt;为例，下拉状态栏查看当前系统版本。&lt;/p&gt;
&lt;img src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root1.png&#34; alt=&#34;如图版本为 SP2A.220305.012&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;p&gt;进入手机镜像官网下载该版本的刷机包。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;下载完成后解压该系统镜像可以看到里面还有一个zip压缩文件&#34; loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;解压这个image-flame-sp2a.220305.012.zip&#34; loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;把它解压，我们想要的boot.img就在这里，将它传入待root手机&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;图上第二行boot.img&#34; loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root4.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用magisk修补bootimg&#34;&gt;使用magisk修补boot.img&lt;/h2&gt;
&lt;p&gt;下载并安装magisk：&lt;a href=&#34;https://github.com/topjohnwu/Magisk/releases&#34;&gt;https://github.com/topjohnwu/Magisk/releases&lt;/a&gt;，此时超级用户选项还无法进入&lt;/p&gt;
&lt;img src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root5.png&#34; alt=&#34;我们可以看到目前是“无法获取”状态&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;p&gt;点击安装-选择并修补一个文件-选择刚刚传入手机的boot.img-开始&lt;/p&gt;
&lt;img src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root6.png&#34; alt=&#34;选择修补文件&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;img src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root7.png&#34; alt=&#34;修补boot&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;p&gt;完成后在/Download目录中会出现一个被修补好的boot文件，将它传回电脑&lt;/p&gt;
&lt;img src=&#34;https://cdn.jsdelivr.net/gh/aahowe/image@main/root8.png&#34; alt=&#34;图中名为magisk\_patched-24300\_95wLm.img&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;h2 id=&#34;刷入bootimg&#34;&gt;刷入boot.img&lt;/h2&gt;
&lt;p&gt;手机进入开发者模式，开启USB调试功能连接电脑&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果不会配置adb环境和驱动这里推荐使用酷安晨钟酱开发的《搞机工具箱》&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://jamcz.com/gjgjx/&#34;&gt;https://jamcz.com/gjgjx/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;进入bootloader&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;adb reboot bootloader
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;由于Pixel系列在Android12直接刷入修补后的boot.img会开不了机(我在写这篇博客的时候就翻车了，其他手机保险起见也可以用下列方法，头铁直接fastboot flash刷入也行)所以先不刷入，使用修补后的boot开机。&lt;strong&gt;如果你不小心直接刷入无法开机，可以Google一下有没有关闭verify的方法，或者把各个分区单独刷回官方固件，如果都无法启动，只能丢失数据重刷系统了。&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fastboot boot /你的boot.img存放路径/修改后的boot.img
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;启动后打开magisk可以看到超级用户已经可以打开了，但是重启后root就没了，还差最后一个步骤&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用云服务器实现校园网免流</title>
      <link>https://howe.wang/posts/ipv6-server/</link>
      <pubDate>Sat, 02 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://howe.wang/posts/ipv6-server/</guid>
      <description>&lt;p&gt;学校的宽带每个月限流60g的问题困扰我很久了。虽然下载基本都去pt站，但是看视频没有办法免流，因此有了自己做一个ipv6节点用来免流的想法&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;首先是找vps服务器，国内绝大部分都没有分配ipv6地址，并且宽带小的可怜，所以决定使用国外的服务器，这样带来的另一个好处是可以同时实现科学上网。最终我选择了vultr的东京数据中心，在国内的延迟尚可接受，并且最低5usd一个月的价格也不错&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果你所在学校分配了edu邮箱，可以申请&lt;a href=&#34;https://education.github.com/&#34;&gt;GitHub Education&lt;/a&gt;项目，省去服务器费用&lt;/li&gt;
&lt;li&gt;服务器的购买和连接参考&lt;a href=&#34;https://zhuanlan.zhihu.com/p/112198146&#34;&gt;https://zhuanlan.zhihu.com/p/112198146&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;购买服务器是注意是否支持ipv6地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我使用的操作系统是CentOS 7，理论上Ubuntu/Debian都可以&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;进入控制台后使用秋水逸冰大神的&lt;a href=&#34;https://teddysun.com/486.html&#34;&gt;一键安装脚本&lt;/a&gt;安装shadowsocks，在控制台输入如下代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x shadowsocks-all.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./shadowsocks-all.sh 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  tee shadowsocks-all.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;选择Shadowsocks-Python版本，期间会询问密码，加密方式，端口等，等待安装完毕，最终得到类似下面这样的提示&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ongratulations, shadowsocks install completed!
Your Server IP:your_server_ip
Your Server Port:4396
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/486.html
Enjoy it!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为我们需要使用ipv6所以需要对shadowsocks的配置作一点简单的修改&lt;/p&gt;
&lt;p&gt;vim 打开配置文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim /etc/shadowsocks-python/config.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按i进入编辑模式在第一行增加ipv6监听(此方法在新python版本ss中会拒绝IPv4的访问)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;server&amp;#34;:&amp;#34;::&amp;#34;,

...
...
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;重点是server那里的&lt;code&gt;::&lt;/code&gt;这样可以同时监听ipv4和ipv6&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ctrl+c退出编辑模式 输入 “:x” （英文冒号+x）保存并退出&lt;/p&gt;
&lt;p&gt;重启 shadowsocks&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/init.d/shadowsocks-python restart
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用方法&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/init.d/shadowsocks-python start # 开启
/etc/init.d/shadowsocks-python stop # 关闭
/etc/init.d/shadowsocks-python restart # 重启
/etc/init.d/shadowsocks-python status # 状态
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;至此，服务端的shadowsocks搭建完毕&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
