Treesystem - 2024年1月
type: channel
link: https://www.treesystem.cn/2024/01/
description: Just some essays
items: MySQL 批量转换表字符集以及排序方式
items: [译] NAT 穿透是如何工作的：技术原理及企业级实践（Tailscale, 2020）
items: NVM小笔记

MySQL 批量转换表字符集以及排序方式
type: item
date: 2024-01-18T11:14:00+08:00
description: [scode type="red" size=""]⚠ 数据安全须知！！！数据无价！！！在做转换前需要先备份再操作，操作过程中出现异常，作者不负任何责任！[/scode]1·选择您的数据库：USE your_database_name;2.获取所有表的名称并生成ALTER TABLE语句。您可以通过执行以下命令来完成这个步骤：SELECT CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS _sql FROM information_schema.TABLES WHERE table_schema = "your_database_name" AND table_type = "BASE TABLE";这个查询会为您的数据库中的每个表生成一个 ALTER TABLE语句。注意将 your_database_name替换成您实际的数据库名称。将上述查询的结果复制到一个SQL脚本文件中或者直接在MySQL命令行中运行它们。3.验证您的服务是否正常，返回结果是否在预期内。

[译] NAT 穿透是如何工作的：技术原理及企业级实践（Tailscale, 2020）
type: item
date: 2024-01-17T22:55:00+08:00
description: 译者序本文翻译自 2020 年的一篇英文博客： How NAT traversal works。设想这样一个问题：在北京和上海各有一台==局域网的机器==（例如一台是家里的台式机，一 台是连接到星巴克 WiFi 的笔记本），二者都是私网 IP 地址，但可以访问公网， ==如何让这两台机器通信呢？==既然二者都能访问公网，那最简单的方式当然是在公网上架设一个中继服务器： 两台机器分别连接到中继服务，后者完成双向转发。这种方式显然有很大的性能开销，而 且中继服务器很容易成为瓶颈。有没有办法不用中继，让==两台机器直接通信==呢？如果有一定的网络和协议基础，就会明白这事儿是可能的。Tailscale 的这篇==史诗级长文==由浅入深地展示了这种“可能”，如果完全实现本文所 介绍的技术，你将得到一个企业级的 NAT/防火墙穿透工具。 此外，如作者所说，==去中心化软件==领域中的许多有趣想法，简化之后其实都变成了 ==跨过公网（互联网）实现端到端直连== 这一问题，因此本文的意义并不仅限于 NAT 穿透本身。由于译者水平有限，本文不免存在遗漏或错误之处。如有疑问，请查阅原文。以下是译文。网页版目录在右侧小程序目录在底层在前一篇文章 How Tailscale Works 中， 我们已经用较长篇幅介绍了 Tailscale 是如何工作的。但其中并没有详细描述我们是 ==如何穿透 NAT 设备，从而实现终端设备直连的== —— 不管这些终端之间 有什么设备（防火墙、NAT 等），以及有多少设备。本文试图补足这一内容。1 引言1.1 背景：IPv4 地址短缺，引入 NAT全球 IPv4 地址早已不够用，因此人们发明了 NAT（网络地址转换）来缓解这个问题。简单来说，大部分机器都使用==私有 IP 地址==，如果它们需要访问公网服务，那么，出向流量：需要经过一台 NAT 设备，它会对流量进行 SNAT，将私有 srcIP+Port 转 换成 NAT 设备的公网 IP+Port（这样应答包才能回来），然后再将包发出去；应答流量（入向）：到达 NAT 设备后进行相反的转换，然后再转发给客户端。整个过程对双方透明。更多关于 NAT 的内容，可参考 (译) NAT - 网络地址转换（2016）。 译注。以上是本文所讨论问题的==基本背景==。1.2 需求：两台经过 NAT 的机器建立点对点连接在以上所描述的 NAT 背景下，我们从最简单的问题开始：如何在两台经过 NAT 的机器之间建立 ==点对点连接==（直连）。如下图所示：直接用机器的 IP 互连显然是不行的，因为它们都是私有 IP（例如 192.168.1.x）。 在 Tailscale 中，我们会建立一个 ==WireGuard® 隧道== 来解决这个问题 —— 但这并不是太重要，因为我们将==过去几代人努力==都整合到了一个工具集， ==这些技术广泛适用于各种场景==。例如，==WebRTC== 使用这些技术在浏览器之间完成 peer-to-peer 语音、视频和数据传输，==VoIP 电话和一些视频游戏==也使用类似机制，虽然不是所有情况下都很成功。接下来，本文将==在一般意义上讨论这些技术==，并在合适的地方拿 Tailscale 和其他一些东西作为例子。1.3 方案：NAT 穿透1.3.1 两个必备前提：UDP + 能直接控制 socket如果想==设计自己的协议来实现 NAT 穿透==，那必须满足以下两个条件：==协议应该基于 UDP==。理论上用 TCP 也能实现，但它会给本已相当复杂的问题再增加一层复杂性， 甚至还需要定制化内核 —— 取决于你想实现到什么程度。本文接下来都将关注在 UDP 上。如果考虑 TCP 是想在 NAT 穿透时获得==面向流的连接==（ stream-oriented connection），可以考虑用 ==QUIC== 来替代，它构 建在 UDP 之上，因此我们能将关注点放在 UDP NAT 穿透，而仍然能获得一个 很好的流协议（stream protocol）。对收发包的 ==socket 有直接控制权==。例如，从经验上来说，无法基于某个现有的网络库实现 NAT 穿透，因为我们 ==必须在使用的“主要”协议之外，发送和接收额外的数据包==。某些协议（例如 WebRTC）将 NAT 穿透与其他部分紧密集成。但如果你在构建自己的协议， ==建议将 NAT 穿透作为一个独立实体，与主协议并行运行==，二者仅 仅是共享 socket 的关系，如下图所示，这将带来很大帮助：1.3.2 保底方式：中继在某些场景中，直接访问 socket 这一条件可能很难满足。退而求其次的一个方式是设置一个 local proxy（本地代理），主协议与这个 proxy 通信 ，后…

NVM小笔记
type: item
date: 2024-01-12T09:51:00+08:00
description: 安装Github安装链接curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashGitee安装链接（含设定淘宝镜像源，适用中国大陆）curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash更新nvm安装时可能使用旧版的nvm程序，可在安装后执行一次更新命令。nvm update上述命令执行时，请确保有权限。例外操作可能会遭遇受限权限写入或者需要重载环境等情况，通常执行以下命令可恢复正常。# 更新权限 chmod +x ~/.nvm/nvm.sh # 重新加载环境变量 source ~/.bashrcnvm指令查看当前机器安装版本nvm ls查看可以云端版本nvm ls-remote安装指定版本Node.jsnvm install [<version>]卸载指定Node.js版本nvm uninstall [<version>]使用指定Node.js版本nvm use [<version>]当前使用Node.js版本nvm current在对应项目中切换不同Node.js版本在项目中创建项目所需要的版本声明touch .nvmrc echo "v18.19.0" >> .nvmrc在指定目录下使用nvm use即可切换到对应版本也可以使用其他方式在使用npm时自动辨识项目的版本文件进行切换操作。NVM命令输出选项原文Node Version Manager (v0.39.5) Note: <version> refers to any version-like string nvm understands. This includes: - full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1) - default (built-in) aliases: node, stable, unstable, iojs, system - custom aliases you define with `nvm alias foo` Any options that produce colorized output should respect the `--no-colors` option. Usage: nvm --help Show this message --no-colors Suppress colored output nvm --version Print out the installed version of nvm nvm install [<version>] Download and install a <version>. Uses .nvmrc if available and version is omitted. The following optional arguments, if provided, must appear directly after `nvm install`: -s Skip binary download, install from source only. -b Skip source download, install from binary only. --reinstall-packages-from=<version> When installing, reinstall packages installed in <node|iojs|node version number> --lts When installing, only select from LTS (long-term support) versions --lts=<LTS name> When installing, only select from versions for a specific LTS line --skip-default-packages When installing, skip the default-packages file if it exists --latest-npm After installing, attempt to upgrade to the latest working npm on the given node version --no-progress Disable the progress bar on any downloads --al…