无影的博客
type: channel
link: http://www.darktool.cn/
description: Your description here.
items: EasyTier组网
items: jasypt-配置文件加密使用说明
items: 自动计算从A向量变换到B向量的旋转矩阵和缩放因子
items: Proxifier注册码序列号
items: Python pyppeteer库
items: 通过微信文件监控实现防撤回
items: redis安装和更新
items: Voyagers of Nera
items: Windows修改Docker Desktop(WSL2)内存分配大小
items: 下载JDK

EasyTier组网
type: item
date: 2026-01-02T16:26:00+08:00
description: 资料地址文档GitHub Release 页面EasyTier 管理器EasyTier 游戏联机启动器EasyTier 鸿蒙版安装 (命令行程序)1、手动下载命令行程序访问 ⬇️下载页面 下载适用于您操作系统和硬件架构的 EasyTier 命令行程序。下载后为 ZIP 压缩包，解压后既可直接使用。Linux / MacOS / FreeBSD:./easytier-core --versionWindows:.\easytier-core.exe --version2、DockerHubDockerHub 镜像地址# docker.io 镜像 docker pull easytier/easytier:latest docker run -d --privileged --network host easytier/easytier:latest # 国内用户可以使用 DaoCloud 镜像 docker pull m.daocloud.io/docker.io/easytier/easytier:latest docker run -d --privileged --network host m.daocloud.io/docker.io/easytier/easytier:latest请继续阅读 快速组网 文档以了解参数含义和使用方法。3、通过Docker Compose安装不含Web控制台的docker-compose.ymlservices: watchtower: # 用于自动更新easytier镜像，若不需要请删除这部分 image: containrrr/watchtower container_name: watchtower restart: unless-stopped environment: - TZ=Asia/Shanghai - WATCHTOWER_NO_STARTUP_MESSAGE volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 3600 --cleanup --label-enable easytier: image: easytier/easytier:latest # 国内用户可以使用 m.daocloud.io/docker.io/easytier/easytier:latest hostname: easytier container_name: easytier labels: com.centurylinklabs.watchtower.enable: 'true' restart: unless-stopped network_mode: host cap_add: - NET_ADMIN - NET_RAW environment: - TZ=Asia/Shanghai devices: - /dev/net/tun:/dev/net/tun volumes: - /etc/easytier:/root - /etc/machine-id:/etc/machine-id:ro # 映射宿主机机器码 command: -d --network-name <用户> --network-secret <密码> -p tcp://public.easytier.cn:11010含Web控制台的docker-compose.ymlversion: '3.8' services: easytier-web: image: easytier/easytier:latest container_name: easytier-web restart: always network_mode: host # 使用主机网络，注意：host模式下ports映射不生效 labels: com.centurylinklabs.watchtower.enable: 'true' # 启用watchtower自动更新 entrypoint: easytier-web-embed command: - "-a" - "12121" # web网页打开端口 - "-l" - "12121" # web网页里面的api端口，注册和验证码需要 - "-c" - "21212" # web服务端给设备下发信息用的端口，也是设备连接web用的端口，使用方式看最后一段 watchtower: # 用于自动更新easytier镜像，若不需要请删除这部分 image: containrrr/watchtower container_name: watchtower restart: unless-stopped environm…

jasypt-配置文件加密使用说明
type: item
date: 2025-12-05T14:00:49+08:00
description: 第一步引入依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>第二步application.yml中增加jasypt配置# 如果密文加盐，需要配置盐值 jasypt: encryptor: password: # 密钥（该值不应该写在配置文件中，使用时建议通过【-Djasypt.encryptor.password=盐值】在启动命令传入） algorithm: PBEWITHHMACSHA512ANDAES_256 # 算法 iv-generator-classname: org.jasypt.iv.RandomIvGenerator # 盐生成器第三步加密数据通过Jasypt Jar包加密数据获取Jar包：首先需要拥有 jasypt-x.x.x.jar 文件。如果你使用Maven，可以在本地仓库（通常是 ~/.m2/repository/org/jasypt/jasypt/）找到；也可以在Maven中央仓库下载。执行加密命令：在命令行中运行以下命令（参数根据实际情况替换）：java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="明文" password="密钥" algorithm="算法"java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="yourpassword" password="yourMasterKey" algorithm=PBEWITHHMACSHA512ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator解密：java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="密文" password="密钥" algorithm="算法"PBEWITHHMACSHA512ANDAES_256算法加密时需要指定盐生成器否则会报错，如：ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator获取结果：命令执行后，在 OUTPUT 部分输出的字符串即为加密后的密文通过Spring Boot 编程方式加密数据@Autowired private StringEncryptor encryptor; public void testEncrypt() { String plainText = "yourpassword"; String encryptedText = encryptor.encrypt(plainText); System.out.println("加密后的密文: " + encryptedText); // 例如输出：qzVuB4VpQYoW0CkIUPNV1A== }第四步在配置文件中使用加密值格式：将密文用 ENC() 包裹起来# application.properties 示例 my.secret.property=ENC(qzVuB4VpQYoW0CkIUPNV1A==)# application.yml 示例 spring: datasource: password: ENC(qzVuB4VpQYoW0CkIUPNV1A==)关键配置：为了让Jasypt在应用启动时能自动解密，必须为其提供用于解密的主密码（Master Password）。出于安全考虑，主密码不应直接写在配置文件中。推荐的做法是通过系统属性、环境变量或启动命令传入java -jar your-application.jar -Djasypt.encryptor.password=yourMasterKey

自动计算从A向量变换到B向量的旋转矩阵和缩放因子
type: item
date: 2025-11-10T09:11:04+08:00
description: 1. 基础数学原理对于两个向量 v₁ 和 v₂，我们要找到旋转矩阵 R 和缩放因子 s，使得：v₂ = s × R × v₁2. Java实现public class VectorTransform { private double[][] rotationMatrix; private double scaleFactor; public VectorTransform(double[] sourceVector, double[] targetVector) { if (sourceVector.length != targetVector.length) { throw new IllegalArgumentException("Vectors must have same dimension"); } calculateTransform(sourceVector, targetVector); } private void calculateTransform(double[] v1, double[] v2) { int n = v1.length; // 计算缩放因子 (向量模长的比值) double normV1 = norm(v1); double normV2 = norm(v2); if (normV1 == 0) { throw new IllegalArgumentException("Source vector cannot be zero vector"); } this.scaleFactor = normV2 / normV1; // 计算旋转矩阵 if (n == 2) { calculateRotation2D(v1, v2); } else if (n == 3) { calculateRotation3D(v1, v2); } else { calculateRotationND(v1, v2); } } // 计算二维旋转 private void calculateRotation2D(double[] v1, double[] v2) { double[] u1 = normalize(v1); double[] u2 = normalize(v2); double cosTheta = dot(u1, u2); double sinTheta = u1[0] * u2[1] - u1[1] * u2[0]; // 2D叉积 rotationMatrix = new double[][]{ {cosTheta, -sinTheta}, {sinTheta, cosTheta} }; } // 计算三维旋转 (使用罗德里格斯旋转公式) private void calculateRotation3D(double[] v1, double[] v2) { double[] u1 = normalize(v1); double[] u2 = normalize(v2); double[] axis = cross(u1, u2); double axisNorm = norm(axis); if (axisNorm < 1e-10) { // 向量平行或反平行 if (dot(u1, u2) > 0) { // 平行 - 单位矩阵 rotationMatrix = new double[][]{ {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }; } else { // 反平行 - 180度旋转 (任意轴) rotationMatrix = new double[][]{ {-1, 0, 0}, {0, -1, 0}, {0, 0, -1} }; } } else { double[] unitAxis = normalize(axis); double cosTheta = dot(u1, u2); double sinTheta = axisNorm; // 罗德里格斯旋转公式 double x = unitAxis[0], y = unitAxis[1], z = unitAxis[2]; double c = cosTheta; double s = sinTheta; double t = 1 - c; rotationMatrix = new double[][]{ {t*x*x + c, t*x*y - s*z, t*x*z + s*y}, {t*x*y + s*z, t*y*y + c, t*y*z - s*x}, {t*x*z - s*y, t*y*z + s*x, t*z*z + c} }; } } // 计算N维旋转 (使用Householde…

Proxifier注册码序列号
type: item
date: 2025-11-03T21:41:30+08:00
description: Proxifier注册码序列号(包括最新4.0以上版本均可注册。)L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C（Portable Edition）#免安装版本 5EZ8G-C3WL5-B56YG-SCXM9-6QZAP（Standard Edition）#安装版本 P427L-9Y552-5433E-8DSR3-58Z68（MAC） #mac版本Proxifier下载Proxifier Downloads 需科学上网下载兼容以下系统Windows (x86, x64, ARM) 7, 8, 10, 11Server 2008, 2012, 2016, 2019, 2022macOS Big Sur, Monterey, Ventura

Python pyppeteer库
type: item
date: 2025-10-27T22:16:00+08:00
description: 一、pyppeteer是什么？pyppeteer是Puppeteer的Python非官方端口，通过CFFI技术绑定Chromium浏览器，实现自动化操作。它专为现代网页设计，能高效处理动态内容加载、JavaScript渲染等反爬虫机制，是爬虫工程师对抗反爬的利器。二、核心特性1、无头浏览器控制支持无界面模式运行，节省资源且隐蔽性强：browser = await launch(headless=True) # 默认无头模式2、动态内容渲染完美处理SPA（单页应用）和AJAX加载内容：await page.waitForSelector('.dynamic-content') # 等待动态元素加载3、反爬虫对抗代理支持：await page.authenticate({ 'username': 'proxyUser', 'password': 'proxyPass' })指纹伪装：await page.evaluateOnNewDocument(''' Object.defineProperty(navigator, 'webdriver', {get: () => false}) ''')4、高性能异步基于asyncio实现原生异步，支持高并发请求：async def main(): browser = await launch() # 并行处理多个页面...三、安装指南系统要求Python 3.6+（推荐3.8+）Linux/macOS/Windows（Windows需安装Visual Studio Build Tools）安装步骤pip install pyppeteer验证安装import asyncio from pyppeteer import launch async def check(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') print(await page.title()) await browser.close() asyncio.run(check()) # 应输出"Example Domain"四、基础用法详解启动浏览器# 指定Chromium路径（如使用系统自带Chrome） browser = await launch( executablePath='/usr/bin/google-chrome', headless=False # 显示浏览器界面调试 )页面操作# 导航与截图 await page.goto('https://httpbin.org/get', waitUntil='networkidle2') await page.screenshot({ 'path': 'screenshot.png', 'fullPage': True }) # 执行JavaScript dimension = await page.evaluate('''() => { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } }''')元素交互# 输入与点击 await page.type('#username', 'my_user') await page.click('#submit', delay=100) # 添加100ms延迟模拟人类操作 # 下拉框选择 await page.select('#country', 'US')五、高级特性解析动态内容处理# 无限滚动加载 async def scroll_to_bottom(page): while True: await page.evaluate('window.scrollBy(0, 1000)') await asyncio.sleep(1) if await page.evaluate('document.documentElement.scrollTop >= document.body.scrollHeight - 1000'): break网络请求拦截# 拦截并修改请求 async def intercept_request(page): await page.setRequestInterception(True) page.on('request', lambda req: asyncio.create_task(handle_request(req))) async def handle_request(request): if…

通过微信文件监控实现防撤回
type: item
date: 2025-10-27T11:41:00+08:00
description: 监控指定后缀的文件import logging from logging.handlers import TimedRotatingFileHandler import os import shutil import time # 配置日志基本设置 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 日志文件路径 log_file_path = 'log/output.log' # 确保日志目录存在 log_directory = os.path.dirname(log_file_path) if not os.path.exists(log_directory): os.makedirs(log_directory) # 创建TimedRotatingFileHandler，每天轮换日志文件 handler = TimedRotatingFileHandler(log_file_path, encoding='utf-8', when="midnight", interval=1, backupCount=30) # 使用日志格式器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 为日志记录系统添加handler logging.getLogger().addHandler(handler) try: from watchdog.observers import Observer from watchdog.events import * except ImportError: logging.info("错误：未找到watchdog模块。") logging.info("请通过以下命令安装：pip install watchdog") sys.exit(1) # 退出程序，返回非0状态码表示错误 # 处理器 class FileEventHandler(PatternMatchingEventHandler): def __init__(self, base_path, save_path): # 设置匹配模式 # 关键参数说明： # patterns：一个字符串列表，定义要监控的文件模式，例如 ['*.txt', '*.csv']。 # ignore_patterns：一个字符串列表，定义要忽略的文件模式。 # ignore_directories：设置为 True 可以忽略目录事件。 # case_sensitive：设置为 True 则进行大小写敏感匹配。 super().__init__(patterns=['*.dat', '*.jpg', '*.png', '*.mp3', '*.mp4'], ignore_directories=True, case_sensitive=False) self.base_path = base_path # 监控的根目录 self.save_path = save_path # 保存的根目录 def is_file_ready(self, file_path): """检查文件是否准备就绪（未被其他进程占用）""" try: # 尝试以读写方式打开文件，如果文件被占用，则会失败 with open(file_path, 'a+b'): return True except IOError: return False def on_moved(self, event): if event.is_directory: logging.info("directory moved from {0} to {1}".format(event.src_path, event.dest_path)) else: logging.info("file moved from {0} to {1}".format(event.src_path, event.dest_path)) localtime = time.strftime("%Y-%m-%d_%H_%M_%S",time.localtime(time.time())) i = 1 while i <= 5: i += 1 # os.system("copy \"{0}\" \"F:\image\{1}_moved_{2}\"".format(event.dest_path, localtime…

redis安装和更新
type: item
date: 2025-10-15T09:27:53+08:00
description: redis安装 https://download.redis.io/releases/解压reids tartar -zxvf redis-7.2.0.tar.gz安装make make install PREFIX=/usr/local/redis修改配置或直接使用配置文件cp /redis-7.2.0/redis.conf /usr/local/redis/bin/vim /usr/local/redis/bin/redis.conf （1）bind 127.0.0.1 -::1 ---> bind 0.0.0.0 （2）daemonize no ---> daemonize yes （3）requirepass foobared注释去掉并在后加上密码（注意中间加个空格）requirepass foobared ---> requirepass 123456（4）设置redis记录日志，默认不记录日志（redis.log为文件名）logfile " " ---> logfile "redis.log" 运行./redis-server redis.confcentos防火墙开放端口firewall-cmd --statefirewall-cmd --zone=public --add-port=16379/tcp --permanent firewall-cmd --reloadredis更新查询程序ps aux | grep redis停止sudo kill redis-server将旧版本移动到新目录备份sudo mv /usr/local/redis /usr/local/redis_old执行redis安装步骤进行更新

Voyagers of Nera
type: item
date: 2025-09-24T01:02:00+08:00
description: https://treehousegames.notion.site/How-to-Host-Dedicated-Servers-1debc50b8edb803b9d5bd4dbfdb32c2c#271bc50b8edb80a18b4bc1ea4eaf674fsteamcmd.exe +login anonymous +force_install_dir ./voyagersOfNera +app_update 3937860 validate +quit《Nera远征者》默认使用7777端口，因此您可能需要在路由器上将协议为UDP的7777端口进行端口转发至运行专用服务器的主机。要在单独端口上运行，请使用命令行参数 -port=<端口> 启动服务器。默认情况下，您的专用服务器应用程序会广播其运行设备的公网IP。如果需要客户端连接至其他IP地址，必须设置 宿主机/容器操作系统环境变量 EOS_OVERRIDE_HOST_IP=<IP>。若以命令行参数形式提供，该设置将无效。Download via SteamCMDTo download the dedicated server build without purchasing the game, you must use SteamCMD, a command line tool often used for downloading dedicated servers. To install from SteamCMD, run### In steamcmd.exe console login anonymous app_update 3937860How to Run the ServerAssuming your install directory is C:\Nera, you’ll find the server executable shortcut at C:\Nera\BoatGameServer.exe. Or to find the actual binary: C:\Nera\BoatGame\Binaries\Win64\BoatGameServer-Win64-Shipping.exe.By default when you run the Server application it will not create a console or log output. To get a console output, supply the command line argument -log. Additionally if you want to enable writing log files (located at C:\Nera\BoatGame\Saved\Logs ) supply the command line argument -LoggingInShippingEnabled=true. Just note that log files can get very large, especially as your server runs for long periods of time. If you use this setting, we recommend periodically restarting your server and cleaning up old or very large log files.Note: Verify your server has write access to your save directory on your machine! If the game does not have write access, it will not be able to save your progress. Your save directory is within the server install directory: {INSTALL_DIRECTORY}\BoatGame\Saved\PersistedData .Configuring Your ServerDedicated Server settings are configured in different INI files, which are special text files the game uses to configure things like Server Display Name, Passwords, Gameplay Settings, and more. Follow these steps when se…

Windows修改Docker Desktop(WSL2)内存分配大小
type: item
date: 2025-08-13T14:42:00+08:00
description: Windows查看docker信息docker info解决方案(官方文档找到了答案)：新增wsl全局配置文件(.wslconfig文件)：windows路径栏输入：%UserProfile%，找到目录C:\Users\Administrator，默认是没有这个配置文件的，可以自己新增增加配置项：# 设置在wsl2上运行 [wsl2] # 设置分配给WSL VM 的内存大小（默认是1/2的电脑内存） memory=8GB # 设置要分配给 WSL 2 VM 的逻辑处理器数（默认和Windows 上相同数量的逻辑处理器） processors=10其它的WSL配置可以去WSL官方文档查找，文档很全

下载JDK
type: item
date: 2025-07-03T14:56:27+08:00
description: https://blog.csdn.net/Lwehne/article/details/135867512如果提示需要登录Oracle账号，这里提供一个：# 提醒：为了大伙的方便，请不要随便用该邮箱重新注册Oracle账号！ 账号：yawoniu@163.com 密码：Oracle.123