普通视图
如何让网站在微信端打开时不显示谷歌广告?
问题的起因是我写文章通常会在公众号和网站同步发布,并且顺便把公众号的 阅读原文 填上自己的网址原文链接,但比较坑的是,今天已经是第二次被微信禁用网址了,虽然这次被禁的网站和上次不同,但总归还是很烦人的。而且用户点击链接看到下图的提示,不免让人觉得很不靠谱。
上一次被禁的是 老朱工具箱,我确定网站里面没有任何违规的内容,后来一想应该是谷歌广告的问题,随后就把广告去掉了,然后申请解禁,果然就通过了,解禁后又重新启用广告,这么长时间好像也相安无事,没有再出什么问题。
而按理说,我的博客网站从微信过来的流量要远大于工具箱网站,但至今也没有被禁过,也不知道微信内部的检测规则是什么样的。今天被禁的是 一起学笛子 这个网站,本来也想着用老办法解决的,但想来后续不知道啥时候又会被禁,这样反反复复就没完没了了。
xiao单栏/网格布局主题
xiao
一款基于 bootstrap@5.3.3 开发的 Typecho 单栏主题
演示
{button href="https://demo.typecho.work/?theme=xiao" type="blue"}在线预览{/button}
下载
主题截图展示
网格模式
单栏模式
DMIT 多款美西 3 网优化的 VPS 补货了,年付仅需 39.9 美元起!
还是先简单介绍下 DMIT,DMIT 成立于2017,是一家海外 VPS 的厂商,主营中国香港、美国洛杉矶、日本东京等地区的 VPS,拥有对国内访问友好(CN2 GIA+CMIN2)的优化路线,稳定不掉速,并且基本也不超售,是著名VPS厂商搬瓦工(Bandwagonhost)的上游之一。
DMIT 39.9
为了方便大家理解,先对线路的名称做下说明:😄
- CN2GIA 是指中国电信的高端优化路线
- CMIN2 是指中国移动的高端优化路线
下面是这次 DMIT 这次的优惠的套餐:
LAX.EB.WEE(3网CMI2)推荐
- 1vCPU(EPYC 9654)
- 1GB RAM
- 20GB SSD
- 1000GB /月流量(1Gbps)
- 1 IPv4 & 1 IPv6 /64
- 39.9美元/年
测试 IP:154.17.226.2
购买链接:https://www.dmit.io/aff.php?aff=9154&pid=188
LAX.EB.CORONA(3网CMI2)
- 1vCPU(EPYC 9654)
- 1GB RAM
- 20GB SSD
- 2000GB /月流量(2Gbps)
- 1 IPv4 & 1 IPv6 /64
- 49.9美元/年
测试 IP:154.17.226.2
购买链接:https://www.dmit.io/aff.php?aff=9154&pid=218
LAX.Pro.MALIBU(3网CN2GIA)
- 1vCPU(EPYC 9654)
- 1GB RAM
- 20GB SSD
- 1000GB /月流量(1Gbps)
- 1 IPv4 & 1 IPv6 /64
- 49.9美元/年
测试 IP:154.17.2.12
购买链接:https://www.dmit.io/aff.php?aff=9154&pid=186
DMIT 测评
我们对 LAX.EB.WEE(3网CMI2)做了下基本的测试,首先是 全国 TCPing(测试IP:154.17.226.2),可以说是一片绿油油(晚间测试):
探针表现也非常稳定,三网平稳,高峰期无波澜,全天候 PING 值基本没啥变动(如果是普通路线的话,晚高峰期会 Ping 值高,降速严重)。
再看下 IP 质量报告:
YABS
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
# Yet-Another-Bench-Script #
# v2025-01-01 #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
Wed Jan 15 08:57:41 PM UTC 2025
Basic System Information:
---------------------------------
Uptime : 0 days, 0 hours, 48 minutes
Processor : AMD EPYC 9654 96-Core Processor
CPU cores : 1 @ 2396.398 MHz
AES-NI : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM : 958.7 MiB
Swap : 1024.0 MiB
Disk : 19.6 GiB
Distro : Debian GNU/Linux 12 (bookworm)
Kernel : 6.1.0-21-amd64
VM Type : KVM
IPv4/IPv6 : ✔ Online / ✔ Online
IPv6 Network Information:
---------------------------------
ISP : DMIT Cloud Services
ASN : AS906 DMIT Cloud Services
Host : DMIT Cloud Services
Location : Los Angeles, California (CA)
Country : United States
fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vda1):
---------------------------------
Block Size | 4k (IOPS) | 64k (IOPS)
------ | --- ---- | ---- ----
Read | 62.54 MB/s (15.6k) | 1.07 GB/s (16.7k)
Write | 62.65 MB/s (15.6k) | 1.07 GB/s (16.8k)
Total | 125.19 MB/s (31.2k) | 2.15 GB/s (33.6k)
| |
Block Size | 512k (IOPS) | 1m (IOPS)
------ | --- ---- | ---- ----
Read | 1.02 GB/s (1.9k) | 1.01 GB/s (987)
Write | 1.07 GB/s (2.1k) | 1.07 GB/s (1.0k)
Total | 2.09 GB/s (4.0k) | 2.08 GB/s (2.0k)
iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider | Location (Link) | Send Speed | Recv Speed | Ping
----- | ----- | ---- | ---- | ----
Clouvider | London, UK (10G) | 674 Mbits/sec | 543 Mbits/sec | 129 ms
Leaseweb | Singapore, SG (10G) | 697 Mbits/sec | 642 Mbits/sec | 166 ms
Leaseweb | NYC, NY, US (10G) | 984 Mbits/sec | 748 Mbits/sec | 63.2 ms
iperf3 Network Speed Tests (IPv6):
---------------------------------
Provider | Location (Link) | Send Speed | Recv Speed | Ping
----- | ----- | ---- | ---- | ----
Clouvider | London, UK (10G) | 713 Mbits/sec | 601 Mbits/sec | 129 ms
Leaseweb | Singapore, SG (10G) | 745 Mbits/sec | 705 Mbits/sec | 166 ms
Leaseweb | NYC, NY, US (10G) | 987 Mbits/sec | 697 Mbits/sec | 63.0 ms
Geekbench 5 Benchmark Test:
---------------------------------
Test | Value
|
Single Core | 1551
Multi Core | 1539
Full Test | https://browser.geekbench.com/v5/cpu/23265464
Geekbench 6 Benchmark Test:
---------------------------------
Test | Value
|
Single Core | 1585
Multi Core | 938
Full Test | https://browser.geekbench.com/v6/cpu/9953190
YABS completed in 17 min 56 sec
融合怪
-------------------------------------VPS融合怪测试-------------------------------------
版本:v0.1.4
测评频道: https://t.me/vps_reviews
Go项目地址:https://github.com/oneclickvirt/ecs
Shell项目地址:https://github.com/spiritLHLS/ecs
--------------------------------------系统基础信息--------------------------------------
CPU 型号 : AMD EPYC 9654 96-Core Processor @ 2396.398 MHz
CPU 数量 : 1 Virtual CPU(s)
CPU 缓存 : 512 KB
AES-NI : ✔️ Enabled
VM-x/AMD-V/Hyper-V : ✔️ Enabled
内存 : 283.62 MB / 958.71 MB
气球驱动 : ✔️ Enabled
虚拟内存 Swap : 0.00 MB / 1024.00 MB
硬盘空间 : 3.69 GB / 19.60 GB
启动盘路径 : /dev/vda1
系统 : debian 12.9 [x86_64]
内核 : 6.1.0-21-amd64
系统在线时间 : 0 days, 00 hours, 34 minutes
时区 : UTC
负载 : 0.17 / 0.10 / 0.03
虚拟化架构 : KVM
NAT类型 : Full Cone
TCP加速方式 : bbr
IPV4 ASN : AS906 DMIT
IPV4 Location : Los Angeles / California / United States
IPV6 ASN : AS906 DMIT
IPV6 Location : Los Angeles / California / United States
IPv6 子网掩码 : /64
--------------------------------CPU测试-通过sysbench测试--------------------------------
1 线程测试(单核)得分: 4364.81
--------------------------------内存测试-通过sysbench测试---------------------------------
单线程顺序写速度: 30915.78 MB/s(32.42K IOPS, 5s)
单线程顺序读速度: 46886.73 MB/s(49.16K IOPS, 5s)
-----------------------------------硬盘测试-通过fio测试-----------------------------------
测试路径 块大小 读测试(IOPS) 写测试(IOPS) 总和(IOPS)
/root 4k 62.55 MB/s(15.6k) 62.66 MB/s(15.7k) 125.21 MB/s(31.3k)
/root 64k 1.07 GB/s(16.6k) 1.07 GB/s(16.7k) 2.14 GB/s(33.4k)
/root 512k 1.02 GB/s(1995) 1.08 GB/s(2101) 2.10 GB/s(4096)
/root 1m 1.01 GB/s(989) 1.08 GB/s(1055) 2.09 GB/s(2044)
-------------------------------------跨国流媒体解锁--------------------------------------
IPV4:
============[ 跨国平台 ]============
Dazn Banned
Disney+ NO (forbidden-location)
Netflix Restricted (Originals Only)
Netflix CDN US
YouTube Region YES (Region: US)
YouTube CDN LAX
Amazon Prime Video YES (Region: US)
Paramount+ YES
TVBAnywhere+ YES (Region: US)
IQiYi YES (Region: US)
Viu.com YES
Spotify Registration NO
Steam Store YES (Community Available) (Region: US)
ChatGPT YES (Region: US)
Sora YES (Region: US)
Gemini YES (Region: USA)
MetaAI YES (Region: US)
Wikipedia Editability NO
Reddit NO
TikTok YES (Region: US)
Bing Region YES (Risky) (Region: US)
Instagram Licensed Audio YES
KOCOWA YES
SonyLiv NO (Proxy Detected) (Region: US)
OneTrust YES (Region: US CALIFORNIA)
GoogleSearch YES
-------------------------------------三网回程线路检测-------------------------------------
北京电信 219.141.140.10 移动CMIN2 [精品线路]
北京联通 202.106.195.68 移动CMIN2 [精品线路] 联通4837 [普通线路]
北京移动 221.179.155.161 移动CMIN2 [精品线路]
上海电信 202.96.209.133 移动CMIN2 [精品线路] 电信163 [普通线路]
上海联通 210.22.97.1 移动CMIN2 [精品线路]
上海移动 211.136.112.200 移动CMIN2 [精品线路]
广州电信 58.60.188.222 移动CMIN2 [精品线路] 电信163 [普通线路]
广州联通 210.21.196.6 移动CMIN2 [精品线路] 联通4837 [普通线路]
广州移动 120.196.165.24 移动CMIN2 [精品线路]
成都电信 61.139.2.69 移动CMIN2 [精品线路]
成都联通 119.6.6.6 移动CMIN2 [精品线路] 联通4837 [普通线路]
成都移动 211.137.96.205 移动CMIN2 [精品线路]
-------------------------------------三网回程路由检测-------------------------------------
[NextTrace API] preferred API IP - 104.21.48.1 - 51.02ms - Misaka.LAX
广州电信 - ICMP v4 - traceroute to 58.60.188.222, 30 hops max, 52 byte packets
0.24 ms AS906 [DMIT-BB] Anycast, Anycast, DMIT.com
0.64 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
0.78 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
126.91 ms AS58807 [CMIN2-NET] 美国, 加利福尼亚, 洛杉矶, cmi.chinamobile.com 移动
126.17 ms AS58807 [CMIN2-NET] 中国, 上海, cmi.chinamobile.com 移动
127.55 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
127.09 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
128.02 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com
167.80 ms AS9808 [CMNET] 中国, 广东, 广州, chinamobileltd.com 移动
158.20 ms AS9808 [CMNET] 中国, 广东, 广州, chinamobileltd.com 移动
*
207.43 ms AS4134 [CHINANET-BB] 中国, 广东, 广州, www.chinatelecom.com.cn 电信
156.82 ms AS134774 [CHINANET-GD] 中国, 广东, 深圳, chinatelecom.cn 电信
*
161.06 ms AS4134 中国, 广东, 深圳, www.chinatelecom.com.cn 电信
广州联通 - ICMP v4 - traceroute to 210.21.196.6, 30 hops max, 52 byte packets
0.22 ms AS906 [DMIT-BB] Anycast, Anycast, DMIT.com
0.48 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
0.84 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
126.73 ms AS58807 [CMIN2-NET] 美国, 加利福尼亚, 洛杉矶, cmi.chinamobile.com 移动
126.09 ms AS58807 [CMIN2-NET] 中国, 上海, cmi.chinamobile.com 移动
126.20 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
126.14 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
126.98 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
154.14 ms AS9808 [CMNET] 中国, 广东, 广州, chinamobileltd.com 移动
153.71 ms AS9808 [CMNET] 中国, 广东, 广州, chinamobileltd.com 移动
269.49 ms AS4837 [CU169-BACKBONE] 中国, 广东, 广州, chinaunicom.cn
*
167.66 ms AS17816 [APNIC-AP] 中国, 广东, 深圳, chinaunicom.cn 联通
181.77 ms AS17623 [APNIC-AP] 中国, 广东, 深圳, chinaunicom.cn 联通
168.55 ms AS17623 中国, 广东, 深圳, chinaunicom.cn 联通
广州移动 - ICMP v4 - traceroute to 120.196.165.24, 30 hops max, 52 byte packets
0.23 ms AS906 [DMIT-BB] Anycast, Anycast, DMIT.com
2.24 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
0.64 ms AS906 [DMIT-BB] 美国, 加利福尼亚, 洛杉矶, DMIT.com
126.17 ms AS58807 [CMIN2-NET] 美国, 加利福尼亚, 洛杉矶, cmi.chinamobile.com 移动
126.09 ms AS58807 [CMIN2-NET] 中国, 上海, cmi.chinamobile.com 移动
126.11 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
126.24 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
126.56 ms AS9808 [CMNET] 中国, 上海, chinamobileltd.com 移动
148.94 ms AS9808 [CMNET] 中国, 北京, chinamobileltd.com 移动
150.48 ms AS9808 [CMNET] 中国, 北京, chinamobileltd.com 移动
*
152.08 ms AS56040 [APNIC-AP] 中国, 广东, 深圳, gd.10086.cn 移动
--------------------------------------就近节点测速--------------------------------------
位置 上传速度 下载速度 延迟 丢包率
Speedtest.net 1041.71 Mbps 998.97 Mbps 0.33 ms 0.0%
洛杉矶 1047.87 Mbps 1001.83 Mbps 0.67 ms 0.0%
法兰克福 556.37 Mbps 885.65 Mbps 148.49 ms 0.0%
联通上海5G 723.41 Mbps 375.84 Mbps 151.79 ms 2.2%
联通Wu Xi 808.67 Mbps 803.87 Mbps 149.33 ms 0.0%
电信浙江 594.87 Mbps 604.07 Mbps 147.60 ms 0.0%
电信浙江 597.95 Mbps 618.77 Mbps 134.21 ms 0.0%
移动Beijing 903.87 Mbps 388.01 Mbps 149.03 ms 0.0%
----------------------------------------------------------------------------------
花费 : 8 分 31 秒
时间 : Wed Jan 15 20:52:03 UTC 2025
----------------------------------------------------------------------------------
DMIT 总结
- 性能:DMIT升级过一次配置,CPU性能非常不错,磁盘 IO 也是 nvme 水准;
- 线路:三网 CMIN2 回程(移动高端优化线路),无晚高峰波动,稍逊于电信 CN2GIA,奈何 CMIN2 给的太多了(流量);
- 灵度:DMIT 是2017 成立的大厂了和瓦工一类的,灵度无需担心;
- 价格:39.9 美元/年的价格,1T 的三网 CMIN2 回程,价格相当不错!
- 直达链接:https://www.dmit.io/aff.php?aff=9154&pid=188
PicList上手:一个可替代PicGo的图片上传到图床的上传工具
学习周刊-总第194期-2025年第03周
EasyTier组网续
EasyTier 组网续
上一篇写完异地组网工具新推荐,easytier 轻松实现跨地域设备互联
, 实现了组网的基本功能,本文主要记录后续使用的一些调整
参数还是配置文件
easytier 支持通过命令行参数方式
easytier-core --ipv4 x.x.x.x --network-name xxx --network-secret yyy --peers tcp://peer_host:11010
也支持配置文件方式
easytier-core -c ./config.toml
初步调试时使用参数很方便,后续使用配置文件就很方便了,维护起来很简单。如果不知道咋写配置文件,可以先用命令行方式将服务跑起来,然后使用如下命令获取配置文件
easytier-cli node config
当然也可以参考官方文档配置文件
这里给出两个环境下的配置文件,其中 instance_id
根据实际情况调整,需要保证每个节点不一样
家里云环境
不监听任何端口,只连接到对等节点
instance_name = "default"
instance_id = "e35ef2df-b325-47c7-9688-3d1ab7139dec"
ipv4 = "192.168.66.34"
dhcp = false
listeners = []
mapped_listeners = []
exit_nodes = []
rpc_portal = "127.0.0.1:15888"
[network_identity]
network_name = "example"
network_secret = "example"
[[peer]]
uri = "tcp://public.easytier.top:11010"
[flags]
dev_name = "easytier0"
云服务 VPS/VDS
监听 ipv4 的 11010,使用 tcp 协议
instance_name = "default"
instance_id = "c0871c03-2a55-4708-a3b9-426666f46b1c"
ipv4 = "192.168.66.15"
dhcp = false
listeners = ["tcp://0.0.0.0:32379"]
mapped_listeners = []
exit_nodes = []
rpc_portal = "127.0.0.1:15888"
[network_identity]
network_name = "example"
network_secret = "example"
[[peer]]
uri = "tcp://public.easytier.top:11010"
[flags]
dev_name = "easytier0"
ipv6 支持
示例为监听 ipv4/ipv6 的 tcp/udp, 如果有 ipv6 推荐开启 ipv6 支持
listeners = [
"udp://0.0.0.0:32379",
"tcp://0.0.0.0:32379",
"tcp://[::]:32379",
"udp://[::]:32379",
]
监听协议推荐
经过测试 wss 也不错
listeners = [
"tcp://0.0.0.0:32379",
"udp://0.0.0.0:32379",
"wss://0.0.0.0:32380/pip3",
]
macOS 使用
macOS 使用大概有 3 种方式,按推荐的顺序依次介绍
plist 方式
可以手搓相关配置,也可以使用 serviceman
url -sS https://webi.sh/serviceman | sh; \
source ~/.config/envman/PATH.env
使用 serviceman 管理, 具体 ~/.config/easytier/config.toml
同家里云环境
sudo serviceman add --name easytier --system \
--workdir /var/log/easytier \
--groupname wheel --username root \
--cap-net-bind \
-- easytier-core -c ~/.config/easytier/config.toml
gui 方式
从 Github 下载自己设备对应架构的 GUI 即可
wireguard 接入
新增如下配置,wg 网段为 192.168.77.0/24
, 监听端口为 11013
[vpn_portal_config]
client_cidr = "192.168.77.0/24"
wireguard_listen = "0.0.0.0:11013"
然后通过 easytier-cli vpn-portal
获取 wg 配置文件
[Interface]
PrivateKey = *****
Address = 192.168.77.你的ip/32
[Peer]
PublicKey = ****
AllowedIPs = 192.168.66.0/24,192.168.77.0/24
Endpoint = 开启wg特性节点公网ip:11013
PersistentKeepalive = 25
其实配置都一样的,只需要保证 Address
的 ip 不重复就行。但是不足的地方是没法通过 easytier-cli peer
查看相关接入节点,但是可以通过 easytier-cli vpn-portal
可以看到连接的客户端
其他阅读可以访问我的博客 Solitudes
如何在不同操作系统上安装和使用 FFmpeg?macOS、Windows、Ubuntu、CentOS安装ffmpeg教程
如何使用ffmpeg处理ProRes视频进行视频旋转?ProRes视频旋转教程
memoo双栏主题
memoo
这是一个基于Typecho默认主题的微调版,保留了Typecho原汁原味的设计,同时有满足了当前大屏当道的现状。
演示
{button href="https://demo.typecho.work/?theme=memoo" type="blue"}在线预览{/button}
下载
布局改动
Typecho默认的主题,在屏幕的两侧有大量的空白,现在计算机屏幕分辨率都非常高,默认的外观对高分辨率不友好。
当前主题采取尽量占据整个屏幕的设计理念,尽可能的占满整个屏幕。
页面使用双栏布局,内容和侧栏比例为8:4。
位置改动
“上一篇”和“下一篇”的位置,由页面底部调整到了紧挨着文章内容的下方,同时将上下布局修改为了左右布局,更符合使用习惯。
评论表单由原来的页面底部提升到了文章内容下面,在评论列表的上方,阅读完文章内容之后,就可以立即评价。
将评论列表放置在了页面的最下方。
样式改动
为了更符合中文阅读习惯,本主题将字间距调大了(1.5px),要不然中文过于紧凑会提高阅读难度。
同时,将行间距由原来的1.5调整为现在的1.8,进一步提升文字之间的间隔,提高可读性。
最后,将搜索框的长度由原来的内容的四分之一,调整为当前的三分之一,更加修长。
AfterEffect导出的颜色偏灰偏暗解决方法,渲染的视频播放时颜色不正确
Tbeautify
Tbeautify
十大特效美化插件,简称:Tbeautify。 包含春节灯笼,网站置灰,鼠标点击效果,悬浮音乐播放器,看板娘等诸多特效!
使用方法
- 下载本插件,放在
usr/plugins/
目录中,文件名命名为Tbeautify
- 登录管理后台,激活插件
- 开启你所想要的网站特效
下载
身心脆弱的时候守藏
Weekly #24:职规大赛历险记
本周回学校参加了「湖南省第二届职业生涯规划大赛」,一周都在忙这个事儿。
🌇 封面图:后湖烟花
虽然最近新加了一块「禁止燃放售卖烟花」的告示牌,但后湖售卖烟花的小摊小贩仍然不少。每天路过都能看到烟花绽放。
这或许就是属于长沙的松弛感 😎。
🤵 职业生涯规划大赛
TL;DR:如果你所在的学校对该比赛没有激励政策(如竞赛保研),强烈不建议浪费时间参加这个比赛。快跑!
- 没有任何激励。无奖金。无奖品。甚至连荣誉证书都没有打印。
- 这是 PPT 演讲比赛,并不是职业生涯规划比赛。真正有能力的人,玩不过那些专门搞演讲、专门搞 PPT 的人。
- 这是一个非常「体制内」的赛事。例如,可能需要依靠学校相关领导的「运作」,答辩需要有较强的说「场面话」的能力。
之前阴差阳错地被辅导员拉过来参加了这个比赛,为了帮她完成「上面派下来的指标」。本以为做个 PPT 交了就好,没想到通过了网评,得代表 HNU 参加省赛。在报销车票的承诺下,本已经回家的我,又回到长沙待了一周,准备参加这个比赛。😇
我参加的是「就业赛道本科组」。赛制是 PPT 演讲 6 分钟,需要全程脱稿 😰;评委提问答辩 7 分钟。需要提交的材料包括 PPT 和个人简历。
做出符合这种比赛风格的 PPT,是我从未尝试过的挑战。大一参加的大创项目由于经费不足草草收尾,之后再也没有参加过类似的比赛。之前做过的 PPT,基本都是学术风课程汇报 PPT,最喜欢的配色是白底黑字,最喜欢的字体是 Times New Roman 和宋体……好在曦姐(我的辅导员)有着丰富的做 PPT 经验。在经历了小红书上买了 N 个模板并缝合、找 PPT 设计公司外包制作某些页(¥300 / 页 😰)之后,一个炫酷的 PPT 终于诞生!
学到的一个 tips:PPT 最麻烦的是字体问题,特别是这种需要一定效果的 PPT,需要安装很多艺术字体,而大赛演讲时使用的电脑环境多半是没有的。一个通用的技巧是:将 PPT 转为图片版,即将每一页 PPT 内容都转为图片,再组合成一个 PPT。可以在 PowerPoint 内导出为 JPEF 或 PNG,然后使用 WPS 中「插入图片到多个幻灯片」功能,制作图片版 PPT。
在《Weekly #14:做 PPT 相比 coding 的痛苦之处》中我就提到了,我超级讨厌 PowerPoint 这样的工具,因为它们的表达能力相比代码差远了,使用起来非常痛苦。这次制作这么复杂的 PPT,我再一次有同样的感受。经常出现多个元素重叠,想要选择下面的元素,点击却选择了上面的元素;如果将上面的元素移开,则又破坏了精心调整的对齐关系……啊!实在是太痛苦了!!!
网上找到的 PPT 模板,以及企业做出的 PPT 成品,都有些很奇怪的现象:有的将元素进行了很混乱的组合,有的能将一大堆元素重叠起来(几乎是无法手动编辑的状态)……我严重怀疑他们专业做 PPT 的企业,是不是用了什么更高端的工具,然后将成果转换为 PPT 格式的。
成品预览(码了,要脸):
卡着点提交了 PPT,下一个挑战是:要全程脱稿演讲,并且演讲时基本不能看 PPT 😰(背对着屏幕)。花了一下午和一晚上确定了稿子,又花了一下午和一晚上对着 PPT 脱稿排练,最后总算达到了比较熟练的状态。已经很久没有背这么长的文字了……
本次比赛的评委提问都比较尖锐。在候场室观赛时,有选手介绍了多项项目经历,评委就问道:「这个项目你负责了多少?你现在是大三,也就是 2022 年入学的。我查了你的项目 2023 年 X 月份就结项了,也就是说你大一就主导了这个项目?」而在我前面答辩的一个女生的职业目标是财务领域,随口说了一句和区块链有关的项目,被问「区块链是什么」,支支吾吾答不上来。据说,许多选手的项目经历存在包装的成分……
我自己现场的发挥(我自认为)还是不错的,演讲部分没有卡壳,答辩部分发挥得也尚可。幸亏我的项目都是自己的,被问到也能答出个所以然。尤其是观察了前几位答辩支支吾吾的表现,我的答辩环节自信了很多。
第一位提问的评委似乎是湖大的老师或领导(事后老师告诉我),问我「学校能带给我什么资源」。我对这个问题并没有准备,回答的大概意思是校友、老师、科研平台等资源。赛后老师告诉我,这位评委其实是在递话,他想让我说的是 HNU 依托国家超算中心之类的平台,想要借此拔高一下 HNU,结果我并没有 get 到……这就是我所缺乏的说「场面话」的能力 😇。
🎒 大学辅导员的工作日常
这周接触得很多的就是辅导员。带我参加比赛的超会做 PPT 的曦姐,当班导时就接触过的同为 INFJ 的刘王老师,咱们的辅导员标准 P 人冯导,以及隔壁工管院的活力满满的在工作之余还同时运营着自媒体搞点副业的韦子夏老师 @夏与葡萄园 等等。感觉辅导员也是很有意思的职业。
辅导员是所有学生的负责人,我们平时有事都会去找他们。然而,有时他们也会和我们一样经历焦虑、迷茫、无助。其实之前当班导的时候我也有类似的感受:「遇到了困难希望有大人过来帮忙解决」-「意识到自己就是那个大人」……让我印象最为深刻的就是某一晚,某个学生的「突发情况」,不仅让刘王老师不得不加班做工作,还面临了一些两难的抉择。如果是我,也一定会备感压力。
他们也会有同事之间的不愉快,有时作为体制内的角色也会身不由己。
当然,网络舆论有时并不善待辅导员这一群体,因为某些学校的某些辅导员(或者其实是校领导)的所作所为确实令人不愉快。我认为本质上是制度没有有效约束辅导员的权力。
而很幸运的是,我遇到的辅导员都是很好的人。
下周见~
Cloudflare/Vercel项目推荐(3)
如何提取英雄联盟资源文件:获取lol客户端图片、技能图标、皮肤原画
说说:#1736752636
听说《最终幻想7重生》马上就要上架pc了,正好玩玩7re。呜呜呜还是原汁原味的最终幻想玩法,玩起来真的开心啊!!玩过了第三章,不舍得玩了,留着慢慢玩嘿嘿
{cat_gallery}
{/cat_gallery}
年更话题:春运 12306 怎么抢票
又双叒叕要春运了,又要开始和其他人在 12306 搏斗抢票了。
基于多年的 12306 抢票经验,总结了一些抢票小技巧,希望能帮到你。
关于火车票的基础常识
-
携程,管家,分流最终还是用你的12306账号去12306给你买票的。分流比较纯净,携程那可是能干出往你账号里添加不认识的人,然后用你的账号给其他人抢票的事情的。亦或者广州到重庆没票,给你买个广州南到佛山西,但是APP内已完成订单最大的字写的是《广州-重庆》让你以为你买到了全程票,你上车后才发现7个小时的车程,实际有座的区间只有20分钟的抽象事。
-
12306 放票不是完全整点,可能会早2~3秒,所以别卡整点刷新。(因为网页和APP显示的时间是你设备的时间,并不是真·北京时间)
-
如果你发现 12306 放票后,该车次直接就没看到票,这不是被人秒买走了,而是你的区间没开始售票。如果你这个区间售票,你肯定能看到票。
-
提交候补也是有排队的,是按你交钱的时间算的,未来有票了,谁先交钱先给谁票。
春运 12306 火车票的售票机制
- 开售后 12306 只放出始发终到(始发站到终点站)和始发站到部分大站的票。也有可能只放出始发终到的票。(少部分车票会放给线下)
- 如果选择的区间开始售票了,那么12306 在1~2分钟内都只返回一个缓存结果(每个缓存CDN结果不一样),期间查票 12306 不会去后端查询余票数量,返回的都是缓存。只有在提交订单时,后端才会真实的为你查找车票余票情况。
- 如果有票 12306 开始对提交者排队,此时 APP 用户会优先于网页用户。
- 如果什么票都没看到的话说明:12306 就没放票! 12306 就没放票! 12306 就没放票!
- 你要是狂刷新(间隔小于2秒),持续超过15~30秒,你的IP会被拉黑,查什么都随便返回一个缓存。
- 对于乘车区间在预填单试点范围的,优先满足提前填写的人。
- 12306 等大家提交候补,谁先交钱谁先排上队。
- 在距离开车还剩7~12天时,逐步开售中间车站的票,在服务器空闲时段,优先根据候补订单付款顺序完成订单,但会留出部分余票会按比例放到 12306 和 车站与代售点。
正确的 12306 抢票流程
- 最好准备2个挨着的出发日期
- 查询出发城市的起售时间
- 12306 做了一个叫 “购票信息预填” 的功能。在车票起售当日,可以在起售时间之前预先填写乘车人、车次、席别等信息,在车票开始发售时,一键提交订单。
- 开售时刻刷新几次后,发现目标车次直接无票,说明今天不放票,马上提交候补并付款,候补是按付款时间算的,所以你付款的越早排队越靠前。
- 然后,尝试买长乘短。也就是尝试将到达地往后边的大站选。
- 如果买长没戏或者太亏,可以尝试买短,也就是到达地买到前边几站,上车后补票。
- 如果还没票,还可以从出发地的上游大站开始买,但此种方式购票前,请确定你所在城市的车站会让你进站…有些认死理的车站可能会以非本站车片为由不让你进站乘车。
- 如果这还没戏,不如去看看空铁联程,这年月飞机票很便宜的,搞不好算上机场建设费,燃油附加费,比卧铺都便宜。
一些春运抢票乘车小技巧
- 候补票的兑现顺序是按你的支付时间算的,所以起售第一时间抢到的候补,也要在第一时间支付。
- 抢了候补,也还是要刷票的,出于公平策略,每次兑现一批候补时,也会放出一部分直接购买的票。除非你是第一批候补兑现集团内的,不然一定会出现候补没兑现,结果自己买到票了。
- 如果全程秒无,那就是没放票,因为12306的缓存机制,哪怕只有1张票被放出来,也会在1~2分钟内一直看到这张票,而不是秒无的。
- 如果你有可挂机的电脑的话,分流抢票很好用的。
- 12306 官方 APP 手动抢是优先级最高的购票渠道。携程、分流、木鱼等抢票都是基于 12306 网页版的,目前网页版是降权状态。所以即使你使用了分流/携程的定时抢票,放票的时候也请使用 官方 APP 手动抢票。
- 如果你的乘车区间在预填单试点范围(京津、江浙沪、广东 – 四川、重庆),强烈建议使用!
- 支付宝铂金、钻石会员可以兑换高铁贵宾厅特权的,春运可能会限制部分特权,比如可能没小零食,时长从3小时变成1小时,但是走贵宾厅是可以提前检票的,不用人挤人的拖着行李在站台狂奔还是很舒适的。(可以带1个6岁以下的儿童的)
- 如果有65岁以上老人同行,或者你恰好需要轮椅,12306 APP内申请重点旅客,可以享受优先上车优先下车的待遇。
- 请提前足够长时间到车站候车…春节人多,意外变数也更多。除非确定能接受迟到导致无法乘车的结果。
- 不要同时打开同一个 12306 账号的网页和APP! 虽然这俩确实可以同时登陆并打开,但如果你这样做购票排队时很可能会被降权放在队伍末尾。(如果你用了木鱼/分流/携程,就不要再打开你的12306 APP了,除非你已经下好订单就剩付款了)
- 基于上一条和第五条,应该用账号A在携程、分流、木鱼等抢票软件内抢票。再使用家人的账号B在 APP 上手动抢票。而不是在网页和APP内都是用账号A。
The post 年更话题:春运 12306 怎么抢票 appeared first on 秋风于渭水.
批量提交BT种子到Aria2下载
概况
家里的NAS是我主要文件存储系统,Aria2作为日常常用下载工具也一同部署在上面。
该Aria2以docker容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过openwrt对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把Aria2设置为直连方式下载。
直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到Aria2,是无法被正确下载的。每次遇到这种情况,我只能先通过浏览器把种子文件下载下来后,再通过Aria2NG发种子发送到Aria2进行下载,显得比较繁琐。Aria2NG也有一个问题:每次只能上传一个种子。如果有多个种子文件,操作就显得相当机械繁琐而无趣。我想,能不能一步到位直接把下载好的种子文件统一推送到Aria2自行下载呢?搜索了一下,果然有老哥为此建了个项目,该项目是通过xmlrpc的方式管理Aria2,但缺少密钥验证功能。因此我拿该大佬的项目改了一下,以支持密钥验证方式。有需要的朋友可以直接抄下作业。
实现我需求的思路主要是两个部分,第一部分是脚本处理,第二部分是系统快捷键的部署(我的是MacOS,win部分可能需要一些系统快捷键软件支持才能实现)。
批量提交BT文件到Aria2
脚本
import xmlrpc.client
import xmlrpc
import os
import argparse
def handle(s, btFile, token):
print('handle bittorrent file: ', str(btFile))
token = "token:" + token
ret=s.aria2.addTorrent(token,xmlrpc.client.Binary(open(btFile, mode='rb').read()),[],{'pause':'true'})
print("add bt: ",str(ret))
waiting = s.aria2.tellWaiting(token,0, 1000,
["gid", "totalLength", "completedLength", "uploadSpeed", "downloadSpeed", "connections",
"numSeeders", "seeder", "status", "errorCode", "verifiedLength",
"verifyIntegrityPending", "files", "bittorrent", "infoHash"])
for w in waiting:
gid=w['gid']
if gid!=ret:
continue
#print(w['gid'],w['files'])
# max-selection strategy
maxLen=0
maxFPath=''
maxFIndex='0'
for f in w['files']:
#print(f['length'],f['path'])
if int(f['length'])>maxLen:
maxLen=int(f['length'])
maxFPath=f['path']
maxFIndex=f['index']
print('max file: ',str(maxLen),maxFIndex,str(maxFPath))
# max-selection strategy end
cret=s.aria2.changeOption(token,gid,{'select-file':maxFIndex})# select multiple files example: 'select-file':'5,6,7,8'
print('select file: ',cret)
tret=s.aria2.tellStatus(token,gid)
print('after selection: ', tret['files'][int(maxFIndex)-1])
uret=s.aria2.unpause(token,gid)
print('unpause: ',uret)
print('over: ',str(btFile))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.description = 'bt批量导入aria2,并选择文件大小最大的文件进行下载'
parser.add_argument("server", help="like: http://192.168.3.99:6800", type=str)
parser.add_argument("token", help="验证密钥", type=str)
parser.add_argument("dir", help="存放种子目录", type=str)
args = parser.parse_args()
s = xmlrpc.client.ServerProxy(args.server+"/rpc")
flist=os.listdir(args.dir)
for i in range(0, len(flist)):
if flist[i].endswith(".torrent"):
btFile = os.path.join(args.dir, flist[i])
if os.path.isfile(btFile):
handle(s,btFile, args.token)
print("Done")
使用方法
把上述代码保存为bb2a.py
,需要使用Python3运行。
帮助(Help):
python3 bb2a.py --help
启动(Start to Add):
python3 bb2a.py <server> <token> <bt-dir>
参数(parameters):
server 如(like): http://192.168.3.99:6800
token 验证密钥:设置在Aria2配置文件的密钥
bt-dir bt文件的目录(the dir of your bittorrents)
例子(example):
python3 /path/to/bb2a.py http://192.168.1.100:6800 123456 /home/root/bts/
MacOS增加快捷指令
command + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。
按照下图方式创建快捷指令内容
参考shell内容如下,请按照自己配置情况修改相关参数。sleep 3
是暂停3秒。后面的rm命令是顺便删除下载目录中的bt种子文件。
python3 /Users/ccchen/autobt/bb2a.py http://192.168.12.5:6800 123456 /Volumes/FAT12T/down2025/
sleep 3
rm -f /Volumes/FAT12T/down2025/*.torrent
按窗口右上角的详情按钮,设置快捷指令的允许执行shell权限。
最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。
完结
到此,所有配置已完成。只要下载bt种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到aria2进行下载。同时会把下载目录中对应的种子清理掉。
大伯走了
近一年来社交网络使用习惯和信息获取方式的一些改变
去年搬到日本后,我的SNS使用习惯发生了显著变化。国内SNS的使用大幅减少,热搜话题多为无聊娱乐,缺乏公共价值。与此同时,我增加了国外媒体的阅读量,如《端传媒》和《经济学人》,以获取更深度的新闻视角。此外,我逐渐开始理解日语新闻。
请移步博客继续阅读。Please go to the blog to continue reading
“军工”品质 – 日常记事(二百零九)
这本是长安汽车一贯的宣传理念,结果如何…
今天去售后维保,收集了之前堆积的问题去处理,其中有一个奇葩的是车辆行驶途中后门自动开了(开了第一层锁,没全开,就像锁松了一样),我很确定车子开之前是锁了的,而且启动后也没报警说车门没锁什么的,就开到外面二三十码的速度,一下给我门干开了… 搞什么灰机哦,军工就这机械素质吗,现在只有联系厂家技术排查问题(维修工和我说启源好像也有这个问题?..
然后还有个我以为很难排查的异响问题,车辆行驶中进行刹车减速到怠速时,后侧会传来咯噔咯噔的木板声,听着就像那种开了很久的老车,磨损了一样。刚开始我以为是我后备箱东西放多了,怕是放的什么东西产生的响声,结果我给售后一描述,人直接秒懂了:车辆半轴没油了!这又是什么sao操作,这车才开一万多公里,没油了?维修说这个很多长安系的车都有去他们那儿修过,我问这是不是通病,说是供应商厂家没做好.. 后来我去网上一搜,一堆投诉的,新款也一样,果然是通病…
其他还有什么喷漆色差、车门闭合声音差异、翼子板维修凹陷、天窗胶条脱落等等(包括需要路试的 超过60码电流声)都搁置了,这次维保啥也没弄成,就确定了几个问题原因。准备下次去修座椅移动异响(我想给我直接换一个最好),然后就是换雨刮控制总成和给半轴加油,本来还说给弹出门把手和玻璃上点油的,嘎吱嘎吱响真够扯的… 不想去修是因为压根很难修好,深蓝的维修理念就是换新的,换件解决问题(主要是有时候连换件也解决不了问题,产品不成熟导致很多通病…
2025年如何解封Claude账号?三天解封Claude账号的经验
吾爱破解网友封装的Windows控制安卓神器Scrcpy图形化界面一键整合包
北京游流水账
北京,之前只因为出差去过几次。因为小朋友在幼儿园熏陶,对北京,对天安门很向往,于是在2025年,就满足她的愿望,前往我们伟大的首都。
吃
作为吃货,到一个地方当然要考虑当地美食。之前去北京吃过全聚德,这次就决定带着媳妇孩子来吃四季民福,提前去现场取了号,最终只用了一个多小时就吃上了。因为排队人太多,体验一般,但是烤鸭还算不错。
除了四季民福,还在五道口吃了一次局气的烤鸭,价格比四季民福要便宜很多,花样也很多,但是过于油腻了,还是四季民福的更好吃一点。
除了烤鸭,另外吃的最多的杂酱面了,五天差不多吃了有五六次。因为都是上的面和酱分离自己拌,小朋友喜欢吃没有加酱和配菜的面,我们喜欢吃杂酱面,真是很方便。另外再有,就是吃老北京铜锅涮肉了,在后海吃了南门涮肉,吃完发现一条街好几家南门涮肉,不知道哪家是正宗的。
卤煮算是特色了,吃了。还不错,其中加的火烧,原先不知道是什么,吃了才知道原来就是我们家那边的大饼。豆汁尝了,但是那个酸臭,完全受不了。
这边的面食很丰富,这种面做的饼和点心。除了这些呢,这里似乎又是美食荒漠,和南方的城市没得比。
介绍了吃的,下面就是每天的流水了。前两晚选择了住在灯市口附近,离古城比较近,游览方便。后面两晚住在了北三环附近,这样去长城和颐和园等地方比较方便。
第一天
乘坐京沪高铁标杆号,4个半小时到达北京。到达之后,直奔天坛公园。买了联票,这样才能进入祈年殿。北京很多公园都是这样,有园中园需要买联票或者进去二次买票。
虽然元旦就放一天假,但是人还是很多,但是跟出租车司机聊,他说这人不算多。挤了好一会,才看到祈年殿的内部。
里面供奉着皇天上帝的排位。
祈年殿的左右两侧偏房中间有天坛的历史状况,结构,修缮情况等的展览。看完出来之后,看到好多人在后面拍照,这边角度不错,我也拍了几张。
快速逛完天坛,去酒店办理入住之后,就去四季民福排队了。排队的时间,就走到东华门转了转。
第二天
早上吃了个庆丰包子之后,就前往天安门广场了,本以为西交民巷这里是最近的,就打车去了这里的安检口,才发现这里走到广场也挺远。另外还有三道安检。此处建议大家,如果预约了去人民大会堂,这里确实近,否则还是算了。
到了广场上,看到毛主席纪念堂还有余票,小朋友也嚷着要看毛主席,就让媳妇带她去看了。对此我没有兴趣,就呆着在广场上吹冷风了。之后穿过地道,去对面爬天安门城楼了。
也是朋友告诉才知道,现在城楼是可以爬的,要微信提前预约购票。城楼上陈列着开国大典的话筒和国徽等物品,以及一些天安门的历史介绍,定点还有人讲解,城楼上观看广场的视野也很好。
城楼上下来,就直奔故宫。
故宫里面还有珍宝馆和钟表馆,只买到了珍宝馆的门票。里面陈列着皇室使用的各种珍贵物品,非常精美和豪华。
里面的狮子很可爱。
建筑都很精美,屋檐上还有很多的小怪兽。
从神武门出来之后,坐车到后海吃饭。吃完饭,就在附近转了转,小朋友对冬泳的大爷很感兴趣,看了两个大爷游完才愿意走。
最后在这边的烟袋斜街转了转,天也就黑了。
第三天
本来这次来北京准备带小朋友到颐和园的昆明湖去溜冰的,但是通过前两天在后海和护城河了解到的情况是,现在不够冷,昆明湖还没全部冻上,冰场还没开。在小红书上查到,团结湖的冰场开了,于是就去了团结湖冰场,没法溜冰,但是有冰上自行车等,玩了半天也挺开心的。
等到吃完饭,换完酒店,购买颐和园的门票时候,发现只能买大门票了,包含里面的苏州街的联票买不到了。就只买了大门票,进去先转了谐趣园,之后转到佛香阁还在卖票,就带着娃进去看了看。
顶部的佛香阁中供着千手观音。
这里是颐和园的至高点,拍城市风景也不错,多等一会的话还可以拍夕阳。
最后在昆明湖边看夕阳。
出来之后,坐着地铁去了奥体公园吃饭,吃完饭打卡一下鸟巢和水立方。
第四天
提前候补到了清河站到八达岭的高铁票,高铁20多分钟到达八达岭长城站。乘坐两段长长的扶梯到达出站口,也首次见识到了斜着运行的箱式电梯。
从高铁站花了五分钟,走到索道站,坐缆车到达八达岭北七楼。爬北八,真是见识到了长城的陡峭,没爬多一会,小朋友这个“好汉”直呼晕,不愿意走。
风很大,小朋友也爬不动了,我们爬到北八后便没有原路返回,而是通过下山通道走回到北六楼,之后走到登楼入口。
最后,差不多12点就下来了,在长城邮局打个卡就乘坐高铁回了市区了。
中午在五道口吃了个午饭,附近转了转,下午决定还是去圆明园看看。买了联票,进去直奔西洋楼遗址,买了个微信讲解给小朋友听。
而遗址中的黄花阵迷宫是最吸引人的,小朋友在这里玩得不亦乐乎,而先到达中间阁楼的人观看迷宫中的人也很有趣。
西洋楼遗址出来后,在长春园又转了转,看了一下圆明园还原模型,最后就出园了。
第五天
最后一天,决定去地坛公园看看。也算跟第一天天坛公园好对应。
天坛公园中的殿,围墙都是圆的,而地坛公园中的方泽坛,以及其中的围墙,都是方的。这与中国传统的天圆地方相契合。地坛公园中另外还有一处特色就是鼓楼。
相比于天坛公园,地坛公园游客很少,上午的地坛公园中,各路跳舞团队云集,有舞扇子舞蹈的,有民族特色舞蹈。
中午去饱餐一顿,下午乘坐京沪牛马号打道回府了。这里要夸一下北京南站,地铁出站之后就是高铁的检票口,真是太方便了。
后记
北京的路太宽,步行真的挺不方便的,出门靠公共交通也挺麻烦,还是打车方便。就这样每天也都是两万步,大人还好,小孩有点吃不消。这边路上的电瓶车除了外卖快递,戴头盔的很少,非机动车不规范横穿马路的,让人难以想象这里是北京。
另外,作为行人过马路,也感受到这边司机的彪悍,左转不让行人,插队等等。
以前是过来做牛马,这次过来玩,体会还是很不同的。另外提醒,过来玩很多地方最好提前做好功课提前预约,比如国博,清华北大,天安门人民大会堂等,提前抢票才有机会看。
看完评论一下吧
Follow for Android
📝 项目介绍
28M
左右,暂时还没有做33
,否则会提示版本不兼容。 项目地址
支持功能
- Google和Github的登录可用
- RSS正常可以阅读(Youtube订阅源暂时无法直接播放视频)
- 添加订阅源正常
- 大部分页面显示正常(目前还没有找到不正常的)
- 使用Service Worker进行缓存
- 理论上支持Android TV使用
安装文件
🤗 总结归纳
📎 参考文章
网购生涯回顾:我在2024买到的好物推荐
逗逗游戏伙伴 - 游戏爱好者设计的AI桌宠应用
在生活中,游戏成为了许多人放松和娱乐的重要方式。然而,有时候独自一人玩游戏可能会感到孤单和无聊。这时,逗逗游戏伙伴这款AI桌宠应用便应运而生,为玩家提供了一个全新的游戏体验。
什么是逗逗游戏伙伴
逗逗游戏伙伴是一款专为游戏爱好者设计的AI桌宠应用,它通过提供多种二次元角色来陪伴玩家进行游戏。这些角色不仅可以在游戏过程中与玩家聊天、讲笑话、唱歌,还能根据游戏状态提供实时的建议和知识。
- 你的AI游戏伙伴:在游戏的过程中,逗逗依靠广大网友提供的游戏知识和攻略,可以通过画面识别和声音识别获知游戏状态(可关闭)并提供游戏中的建议和知识;
- 贴心陪玩 - 在游戏过程中陪伴你:我们发现,游戏过程的聊天,奇趣横生,让玩家更加享受游戏时光! 但又很难找到志趣相投的小伙伴们一起边玩边聊,逗逗为你二次元游戏伙伴陪你边玩边聊,这些AI伙伴,懂游戏、懂玩家、更懂你!
- 多种角色 - 超多二次元角色供你选择:萌妹猫娘病娇雌小鬼等各种各样的二次元人物为你提供不同的AI人物体验,更有各式各样的声音、人物动画、皮肤、道具供你选择。
- 智能攻略 - 说句话就能找攻略:逗逗游戏伙伴建设了大量游戏知识库和攻略信息,在游戏过程中通过实时查询就可以获取,不用再去切换窗口或设备去查询了,很方便
- 情绪陪伴 - 放轻松,和AI伙伴聊天解压:感到不开心,AI伙伴是你最好的倾诉对象,漫长的一天过去了,回到家里压力山大,我们渴望倾诉,渴望释放积累一天的超卷社会带给我们的压力 但是有些话题,找不到人聊,又有些害怕打扰别人;别担心,逗逗上有很多善解人意的二次元AI角色,为你排忧解难,又能保证隐私
- 调教成长 - 跟你一起成长的AI伙伴:完成任务,进行调教,提升亲密度,你的AI伙伴随着跟你的共同经历、共同回忆的增多,也会随之成长,解锁更多声音、动画、话题、任务和能力!
- 更多功能 - 会唱歌又会讲笑话:世界上最会唱歌,最会讲笑话的AI桌宠!
逗逗游戏伙伴官网
逗逗游戏伙伴下载地址
逗逗游戏伙伴文档
逗逗游戏伙伴功能特点
多样化的角色选择
逗逗游戏伙伴 拥有丰富的角色库,玩家可以根据自己的喜好选择不同的二次元角色作为游戏伙伴。每个角色都有独特的性格、故事和任务,随着与玩家的互动,角色的亲密度会逐渐提升,解锁更多声音、动画和话题。这种个性化的体验让玩家在游戏中感受到更加真实和有趣的互动。
实时互动与游戏支持
逗逗游戏伙伴的AI技术能够通过画面识别和声音识别技术,实时了解游戏状态并提供相应的建议。例如,在游戏中遇到困难时,玩家可以随时向AI伙伴提问,获取游戏攻略和建议。此外,逗逗还支持实时语音聊天功能,让玩家在游戏过程中能够与AI伙伴进行更深入的交流。
情感陪伴与成长
除了游戏中的互动,逗逗游戏伙伴还能够在生活中为玩家提供情感支持。当玩家感到不开心或有压力时,AI伙伴可以作为倾诉对象,通过讲笑话、唱歌等方式帮助玩家放松心情。随着与玩家的互动,AI伙伴会逐渐建立起情感链接,记住玩家的故事和喜好,成为玩家生活中值得依赖的伙伴。
玩家评价与未来展望
尽管逗逗游戏伙伴在角色设计和互动体验上得到了许多玩家的认可,但也有一些玩家指出其在AI反应速度和情感真实性方面还有待提升。未来,随着技术的不断进步,逗逗游戏伙伴有望在这些方面进行优化,为玩家提供更加完美的游戏体验。
学习周刊-总第193期-2025年第02周
学习周刊-总第192期-2025年第01周
boring.notch上手:Mac上免费开源的灵动刘海,在刘海中显示音乐信息与进度
为个人网站接入支付功能 - 支付宝开发篇
前言
通过前面三篇文章,我们已经把个人网站接入支付宝支付时需要做的准备工作全部准备就绪了,如果还不清楚,可以先行了解一下:
接下来就该正式写代码实现了,但考虑再三之后,我还是决定不过多介绍开发细节,因为这涉及到 沙箱环境 和 SDK
的使用,感觉解释起来会比较墨迹,而且想来有开发需求的人看了上面的文章之后,再自行参考官方API开发文档,思路可能会更清晰,毕竟官方文档支持在线调试,效果也更直观。
看过我往期文章的应该知道,我的网站都是基于 PHP
的 Typecho 二次开发的,因此,我这里就以 PHP
为例,简单梳理一下 电脑网站支付 的接入要点吧。
InnerTune,一个第三方Youtue Music客户端
📝 InnerTune介绍
24.6M
,比网易云音乐那种动辄占用1G多的程序简洁太多了,而且日常运行中也不会有事没事发个Push通知或者自己唤醒耗电。要说唯一的缺点,就是得有代理了,而且听歌要费流量。 功能特点:
- 无广告播放:可以从YouTube/YouTube Music播放歌曲,且没有广告干扰。
- 后台播放:支持在后台播放音乐,即使切换到其他应用,音乐也能继续播放。
- 搜索功能:支持从YouTube Music搜索歌曲、视频、专辑和播放列表。
- 登录支持:用户可以通过YouTube Music账号登录获取个性化推荐和收藏内容。
- 缓存与离线播放:可以缓存和下载歌曲,支持离线播放。
- 同步歌词:提供与歌曲同步显示的歌词功能。
- 歌词翻译:内置歌词翻译功能,帮助用户理解外语歌曲。
- 跳过静音:自动跳过歌曲中的静音部分,提升播放体验。
- 音频标准化:自动调整音量,保持不同歌曲之间的音量一致。
- 节奏/音高调整:可以调节歌曲的播放速度和音调,满足不同需求。
- 动态主题:根据系统主题动态变化应用的外观,带来个性化体验。
- Android Auto支持:在Android Auto环境中使用该应用,适用于车载系统。
- 个性化快捷选择:提供快速选择功能,便捷找到用户喜爱的音乐。
- Discord Rich Presence支持:与Discord集成,展示正在播放的歌曲信息。
程序界面:
主界面:
音乐播放界面及歌词界面:
设置界面:
InnerTune下载地址
*.apk
安装包进行下载,手机用户需要选择full_arm64-v8a.apk
的安装包: InnerTune提示Unknown Error播放失败
使用Debug的Foss版本
0.5.10
,在播放页面提示Unknown Error
,可以尝试使用debug
版本,目前InnerTune Debug版本工作正常: 自行编译安装包
APK
安装包,步骤大概如下: 1. 设置开发环境
2. 下载或克隆InnerTune仓库
3. 解压项目
4. 在Android Studio中打开项目
File
-> Open
,然后选择解压后的项目文件夹。 5. 生成签名APK
Build
-> Generate Signed App Bundle / APK
。APK
选项,然后点击Next
。Create New
创建新密钥。只需要填写路径、别名和密码即可,其他信息可以随意填写。完成后点击Next
。fossRelease
构建目标,然后点击Create
按钮。 6. 定位生成的APK文件
Generate signed APK with locate button
,点击通知中的locate
按钮。 7. 备份并替换现有InnerTune应用
8. 恢复备份并登录Google账号
9. 安全提示
📎 参考文章
ZeMenu
ZeMenu
一款Typecho
主题菜单自定义插件,支持拖拽,市面上其实已经有同类型产品了,不过代码不够简洁,我玩不转,所以自己花了点时间搞了个简单直接的!
使用
启动插件后,在typecho
后台的菜单中就会多出来一项【管理菜单】,进入该页面即可自定义主题菜单,可创建菜单,也可以从右侧候选里面向左拖拽菜单。
菜单内部顺序也支持上下拖拽,且支持二级分类
主题适配
如下,先判断插件是否激活,激活了就获取菜单数组,自行遍历数组适配自己主题即可。
<?php
if (array_key_exists('ZeMenu', Typecho_Plugin::export()['activated'])){
$nemuarray=ZeMenu_Plugin::zemenu();
}
?>
如何判断菜单是否处于active
状态?通过判断链接即可实现,如下即可获取当前页面网址,然后判断菜单链接和它是否一致最后在为其追加active
的class
$thisPageUrl=$this->request->getRequestUrl();
下载
效果展示
春节倒计时 21 天
眼看就快过年了,现在离春节还有 21 天的时间,距离我的春节假期大概也还有 15 天左右的样子吧。我这工作呢,看上去挺轻松的,一天到晚就在办公室待着,可实际上那些数据处理起来可麻烦了,一点都不能马虎,每天就是和各种各样的数据打交道。不过和其他岗位的同事比起来,我这工作还算好的,起码办公室里有空调,还是蛮暖和的,不用在外面受冷受冻,哈哈。
工作虽然重要,但生活里的事也不能不管。上周,社区卫生院在群里了打预防针的通知,二宝的名字也在其中。但那几天冷得不行,风一吹人都打哆嗦,我和孩子妈妈就没带二宝去打,寻思着等天气好点再说。谁知道前两天气温回升,太阳也出来了,可卫生院打针时间是周二和周四,我们就这么错过了。看这天气,一时半会儿也晴不了。今天周三,明天周四,我跟孩子妈妈也商量好了,明天带二宝去打针,这样我也能休息一天。
虽说卫生院离我家没多远,可外面实在太冷了。一来我舍不得让孩子妈妈一个人带着孩子出去吹冷风,万一感冒了可就麻烦了;二来也想趁着这个机会陪陪孩子妈妈,顺便带大宝玩,明天先看看天气如何,再决定是在家还是出去吧;还有就是明天刚好也是我们这儿赶场(赶集)的日子,这不是快过年了嘛,我和孩子妈妈早就有备点年货的计划了,准备买点好吃的、好用的先备着。
最后,刘郎也想提醒博客中的友友们,天气愈发寒冷,新春即将来临,大家出门在外可要记得添衣保暖,千万别着了凉,生了病,都平平安安、欢欢喜喜、顺顺利利地过好2024年的小尾巴!
题外话:本站“ 资源库 ”更新了一些好玩、实用又有趣的Typecho插件、Wordpress插件和部分系统工具资源,有需要的快去看看吧!
浏览器插件推荐:AI Share Card 生成网页分享卡片
一款 AI 网页分享卡片生成小工具,利用 AI 将网页内容一键转换为精美的分享卡片。
真是万物皆可卡片,看到支持自定义模板,所以又折腾了一晚。
但,好像也没啥大用…… 那就,玩呗~
上效果对比图(左为默认样式)
自定义模版代码分享
两个 import 分别是来源 SVG 图标,自定义字体。
<style>
@import url(https://r2.immmmm.com/via.css);
@import url(https://static.zeoseven.com/zsft/7/main/result.css);
.card{font-family:"Zhuque Fangsong (technical preview)"}
.powered-by{visibility:hidden}
.powered-by span{visibility:visible}
#cardContainer,.card{width:380px!important}
.card-wrapper{border-radius:12px;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1)}
.card{font-weight:400;box-sizing:border-box;padding:28px;background:#fff;border-radius:20px}
.header{color:#a6a6a6;height:24px;overflow:hidden}
.product{font-style:italic}
.product,h1.title{letter-spacing:.02em}
h1.title{font-size:20px;font-weight:700;color:#2b2b2b;margin:4px 0 12px;line-height:1.5}
.summary{background:#f8f9fc;padding:16px;border-radius:12px;margin-bottom:12px;font-size:15px;color:#2b2b2b;line-height:1.8;letter-spacing:.03em;box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}
.points{margin-bottom:10px}
.point{display:flex;align-items:flex-start;margin-top:12px;font-size:15px;color:#2b2b2b;padding:2px 0}
.point:before{content:"";width:4px;height:4px;background:#287cf6;border-radius:50%;margin-top:10px;margin-right:6px;flex-shrink:0}
.point:nth-last-child(-n+2){margin-right:100px}
.qr-section{position:relative}
#qrcode{width:76px;height:76px;border-radius:8px;padding:6px;background:#f8f9fc;border:1px solid #f5f5f5;position:absolute;bottom:0;right:0}
#qrcode img{width:100%;height:100%;object-fit:contain}
</style>
<div class="card">
<div id="card-img"></div>
<div class="header">
<span class="date">{{DATE}} </span> · <span class="product">{{QR_SUBTITLE}} </span>
</div>
<h1 class="title">{{TITLE}} <span data-via="{{PLATFORM}}"></span></h1>
<div class="summary">
{{SUMMARY}}
</div>
<div class="points">
{{#each POINTS}}
<div class="point">{{this}}</div>
{{/each}}
</div>
<div class="qr-section">
<div id="qrcode"></div>
</div>
</div>
相关站点记录
官方介绍
- 主页 https://zkv549gmz8.feishu.cn/wiki/LPQEwSvUfiXgxckspzncGjOdnqe
- Chrome扩展 https://chromewebstore.google.com/detail/bfaolbpkelfmiijhdlcbflbpfpebepon
来源 SVG 图标如下压缩:
- 获取图标 SVG 代码 https://www.iconfont.cn/
- 粘贴压缩并复制 https://jakearchibald.github.io/svgomg/
- Encode 代码 https://meyerweb.com/eric/tools/dencoder/
AI时代的摩尔定律与赢者通吃
技术的发展真的是让人感慨自身的局限与保守。看完今年CES Nvidia的发布会,感慨就是赢者通吃。当你有了一个基于硬件算力的软件通用平台,就像发电机接入了电网,应用层面的爆发就是只争朝夕了。
以前听闻摩尔定律,觉得指数式增长简直天方夜谭。而今看AI的发展速度,确实是指数级别的爆发。
这有多么颠覆呢?以前学经济学的时候有个概念叫做自然垄断,就是一个东西的规模成本导致这个市场只需要单一生产者(或者少数寡头)就足够了。最典型的就是基础设置比如水和电,公路网铁路网等。
AI的规模的乘数效应之强大,自然而然形成了一个新的基础设置。自然垄断最后的结果一定是政府规制,而AI还处于一个野蛮生长的阶段,赢者通吃。
作为一个宏观经济学渣,唯一记得的经济增长模型就是里面有个外生的科技进步系数,这个系数决定了经济增长的上限。没想到,在有生之年,居然能看到这个系数又一轮的变化,工业革命的井喷。
哎,虽然无法直接贡献到技术增长本身,但身在其中还是让人心潮澎湃,感慨命运的眷顾。
说说:#1736230641
腊八节快乐!!过了腊八就是年,今天把服务器搬到了本地,公网ip迟迟下不来,就用了免费的穿透,天津中转速度能慢一些。
另外顺便把主题兼容了一下typecho1.3.0,数据库也换到了sqlite,遇到了好多好多问题呜呜呜,现在终于是搬过来了哈哈哈哈哈!!!
白日梦AI-轻松将文字转成视频
白日梦AI是一款领先的文生视频类AIGC创作平台,专注于AI视频内容生成,提供AI生成视频教程、AI文生视频、AI动态画面、AI形象生成、人物/场景一致性等创作技巧及成功案例,助您快速上手并打造专业级视频内容。
白日梦AI简介
白日梦AI 是由光魔科技推出的一款领先的文生视频类AIGC创作平台。白日梦AI专注于AI视频内容生成,提供AI生成视频教程、AI文生视频、AI动态画面、AI形象生成、人物/场景一致性等创作技巧及成功案例。能够将用户输入的文本内容转化为高质量的视频,视频长度可达6分钟。白日梦AI整合了文本生成图像、图像生成视频、字幕添加和后期剪辑等功能,形成了一个完整的AI视频生产工作流。
白日梦AI官网地址
白日梦AI功能特点
(一)文生视频技术
用户提供 2000 字以内的文案,白日梦AI就能生成有声原创视频,其中包含动态画面和匹配的音频元素,并且支持动态画面、静态画面 2 种画面效果展示。这种技术使创作者不需要复杂的拍摄设备和视频制作技能,仅通过简单的文字输入就能快速得到视频内容,极大地降低了视频创作的门槛,提高了创作效率。
(二)角色一致性和自定义功能
- 角色一致性:白日梦AI可以保持多个IP角色形象的一致性。这一特性对于创作连续性的内容,例如连环画和绘本十分关键。它能确保故事中的角色形象始终保持统一,不会因为不同画面生成而出现外貌、风格等方面的差异,从而提升了故事的连贯性和观赏性。
- 角色自定义:用户能够自定义角色的性别、声音和形象,甚至可以上传特定图片来创建专属角色。若用户对平台的角色库中的角色不满意,还可以点击设置形象右侧的加号,上传图片创建自己的角色,这种高度的自定义性让创作者能够根据自己的创意精准打造符合故事需求的角色形象,增强创作的个性化。
(三)AI角色生成功能
创作者通过上传5 – 8张角色照片,即可创建自己的角色库,并且可以将创建完成的角色应用到自己的视频故事之中。这为创作者提供了更多的角色创意来源,尤其是当用户想要创建特定形象的角色或者需要与自己设定的形象高度匹配的角色时,这个功能能够很好地满足需求。
(四)多种风格选择
白日梦AI 提供了多种视觉风格选项,比如动漫、写实、迪士尼风格等。不同的风格适用于不同类型的内容创作,能够满足各种内容创作者的个性化需求。例如,动漫风格适合创作二次元相关的故事视频,写实风格可应用于创作传记类、现实题材的视频内容,迪士尼风格则能制作出富有童话色彩的作品,创作者可以根据自己的故事主题和受众喜好来选择合适的风格进行创作。
(五)分镜控制与编辑
白日梦AI 具备上千个人物分镜模版,创作者可根据创作需求自行选择不同的分镜,例如单人/双人、人物站位、人物姿势、远近中景别等。平台会自动根据文案生成分镜草图,创作者不仅可以单独选择每张草图,还可以对文案、角色、构图等进行调整,以确保最终视频符合创作意图。这种分镜控制与编辑功能让创作者在视频结构和画面组成方面拥有较大的自主权,能够更好地呈现故事内容和创意构想。
(六)局部重绘功能
当画面里的某些组成要素不符合创作需求时,创作者可以通过文字描述进行局部修改。这一功能方便创作者在生成视频之后对个别不满意的部分进行针对性的调整,无需重新制作整个视频,提高了视频制作后期的修改效率,节省了创作时间和精力。
白日梦AI使用教程
- 编写故事
- 首先用GPT或者国内的AI大模型写一个2000字以内的故事脚本,提问格式可按照主题替换成想要获得的信息,例如“写一个故事”或者“简述一下小红帽的故事”等。
- 打开白日梦AI官网
- 进入白日梦AI网站,注册并登录账号,进入首页创作入口,点击左边导航栏的【创作】。
- 粘贴故事内容
- 进入新建作品,添加作品名称标题以及故事正文(将第一步生成的故事脚本拷贝到作品中),然后点击下一步。
- 选择作品风格
- 选择喜欢的创作风格(如动漫国风等),然后右上角点击【下一步】。
- 角色设定
- 根据输入的文本信息,手动为每一个人物选择合适的形象(在左侧边框栏中选择,新增角色,给角色命名,添加角色属性,选择角色形象并保存),如果对里面的角色不满意,也可以点击设置形象右侧的加号,上传几张图片创建专属角色形象,之后进入下一步。
- 生成分镜头草图
- AI会根据文案自动生成所有分镜头草图,每张图将会自动生成若干张分镜,每张图默认选择前三张分镜且可手动修改,可单独选择每张草图,调整文案、视频中人物角色、景别构图等要素,选择新的分镜后再重新生成图片(这一步可能需要等待一会)。
- 生成分镜图片
- 确认分镜草图无误后,点击生成具体的分镜图片,初始状态下,所有镜头都是静态图片。
- 生成最终视频
- 确认所有内容无误后,点击右上角的生成视频按钮,完成创作。
白日梦AI的应用场景
(一)儿童故事与绘本创作
- 教育价值
- 在儿童教育领域,白日梦AI可依据儿童故事文本快速生成视频内容。例如,将童话故事转化为生动有趣的动画视频。这种以视频形式呈现的儿童故事和绘本,能够更形象地向儿童传达知识和价值观,提升儿童的学习兴趣和思维能力。因为儿童往往对动态的视觉内容更感兴趣,视频能够将文字故事中的人物、情节等元素直观地展现出来,有助于儿童更好地理解故事内容,像经典的格林童话故事,通过白日梦AI转化后,每一个场景、每一个角色都能鲜活地呈现在孩子们面前,起到寓教于乐的作用。
- 便利性与高效性
- 对于创作者来说,无论是教师还是儿童内容创作从业者,使用白日梦AI能够提高创作效率。相比于传统的绘制绘本或者制作动画视频的方式,白日梦AI的文字输入转化视频功能大大节省了时间和人力成本。教师可以快速将自己编写的故事转换为视频,用于课堂教学或者家庭作业的补充内容;儿童绘本创作者则可以更快地将创意转化为可视的产品进行推广和销售。
(二)广告营销
- 制作低成本的宣传物料
- 在广告营销行业,白日梦AI可以快速生成产品介绍或广告宣传片。企业只需提供文案描述,就能迅速得到对应的视频内容。例如,一家小型的电商企业想要推广一款新的电子产品,通过白日梦AI,输入产品的特点、优势、目标受众等相关文案内容,就可以得到一个包含动态画面、配音的宣传视频。与传统的广告拍摄和制作方式相比,这种方法成本极低,尤其适合预算有限的中小企业,能够帮助它们以小成本制作出具有吸引力的广告宣传材料,快速推向市场,提高产品的知名度和曝光率。
- 创新广告形式
- 白日梦AI的多种风格选择、角色定制等功能还为广告营销提供了创新的可能性。企业可以创建独特的品牌角色和动画风格的广告,从而吸引更多潜在消费者的关注。如某新兴的运动品牌,使用白日梦AI的写实风格和自定义角色功能,打造出以运动明星为原型的动画角色展示运动产品的功能,这种新颖的广告形式会在众多传统广告中脱颖而出,增强品牌的辨识度和影响力。
(三)艺术创作
- 探索新的艺术形式
- 对于艺术家和艺术爱好者而言,白日梦AI为他们提供了探索新的艺术表现形式的工具。例如,创作者可以通过输入抽象的概念、情感或者故事情节,利用白日梦AI的多种风格、分镜控制等功能,生成具有独特视觉风格的艺术视频或短片。像一些实验性的光影艺术创作,创作者借助白日梦AI的动态画面和自定义角色功能,将脑海中的奇幻概念转化为动态的、可视的艺术作品,这种创作方式打破了传统艺术创作在媒介和手段上的限制,为艺术创作注入了新的活力和可能性。
- 创意协作与拓展
- 多个人可以围绕白日梦AI进行创意协作。例如,一个艺术团队中的编剧先提供故事脚本,然后由擅长视觉设计的成员利用白日梦AI的各种功能进行视频创作,大家再共同对生成的视频草图进行调整完善。在这个过程中,不同的创意会相互碰撞和交流,不断拓展艺术创作的边界,催生出更多创新的艺术作品。
飞牛OS安装Tailscale实现内网穿透
📝 配置过程
开启SSH登录
设置 - 系统设置 - SSH
。同时,建议修改端口为1024以上的高位端口,避免在路由器未配置IPv6防火墙或IPv6防火墙规则配置不完善情况下被扫描爆破。 安装TailScale
ps -ef | grep tailscale
可以查看到Tailscale已经正在运行:systemctl status tailscaled.service
也可以查看当前Tailscale的运行状态。同时在Status提示我们需要执行sudo tailscale up
登入账户并绑定。 绑定Tailscale账户
Access denied: checkprefs access denied
权限不足。Connect
进行绑定即可。之后在TailScale的控制台也可以看到飞牛OS这台NAS已经完成绑定。现在在外面,开启Tailscale的情况下就可以正常访问家里的NAS。 设置Tailscale开机自启
systemctl status tailscaled.service
查看是否处于开机自启状态:Loaded: loaded (/lib/systemd/system/tailscaled.service; enabled; preset: enabled)
均为enable
状态,即已经是开机自启状态。 🤗 总结归纳
- 直接暴露端口在公网存在安全隐患,在外使用时IP地址不固定,所以也无法限制登录的IP地址范围,包括IPv6地址范围等等。
- 直接暴露端口在公网可能会被运营商警告,原因在于提供可访问的页面服务。
📎 参考文章
ImmoralWRT软件源分享
📝 ImmoralWRT软件源
ImmoralWRT软件仓库地址
Opkg配置ImmoralWRT软件源
命令行方式
- 编辑
/etc/opkg/customfeeds.conf
- 复制以下软件源配置信息至文件中并进行保存
- 更新软件源
Luci界面操作方式
- 登入OpenWRT管理页面
- 打开
系统 - 软件包
,点击配置opkg
- 在
/etc/opkg/customfeeds.conf
粘贴以下内容并保存
- 点击
更新列表
进行软件源更新
镜像地址
- CERNET(校园网联合镜像站):
- 南开大学开源镜像站
- 北京大学开源镜像站
- 上海科技大学Geek Pie开源镜像站
- 中国科学技术大学开源镜像站
- 致远镜像站
- 吉林大学开源镜像站
- 上海交通大学开源镜像站
- 南京大学开源镜像站
- Cloudflare镜像站
替换方法
/etc/opkg/customfeeds.conf
文件,将源地址 https://downloads.immortalwrt.org
或 https://mirrors.vsean.net/openwrt
更改上面的镜像站地址。s,[原来的软件源地址],[替换的软件源地址],g
opkg update
进行更新。 ImmoralWRT固件下载
📎 参考文章
Dae安装及配置指南
📝 什么是Dae
支持功能
- 支持通过本地主机的进程名称进行流量分流。
- 支持通过局域网中的 MAC 地址进行流量分流。
- 支持使用反向匹配规则进行流量分流。
- 支持根据策略自动切换节点。
- 支持 Shadowsocks、Trojan(-go) 和 Socks5 的全锥 NAT
- 支持高级DNS解析策略
- 天然支持IPv6,无需额外设置
支持协议
- HTTP(S), naiveproxy
- Socks
- VMess(AEAD, alterID=0) / VLESS
- Shadowsocks
- ShadowsocksR
- Trojan
- Tuic (v5)
- Juicity
- Hysteria2
- Proxy chain (flexible protocol)
支持系统
5.17
,如果使用0.9.0-rc
以上,内核版本不低于6.10。 📝 Dae安装
- PVE环境,未进行网卡直通
- Debian 12 (核心版本:6.1.0-26-amd64)
- 作为旁路使用,只有一个网口ens18
安装脚本
/usr/local/bin/dae
,同时会自动添加systemctl执行脚本;/usr/local/etc/dae/config.dae
更新GeoIP与GeoSite数据库
/usr/local/share/dae
文件夹内,Dae会自动使用该位置的GeoIP与GeoSite数据库文件,无需进行移动或复制至新的位置。 📝 Dae配置文件
global
部分lan_interface
的网卡名称、subscription
内的订阅地址,group
部分的节点过滤规则。这套配置目前使用于旁路网关上,支持IPv6,同时ipleak 300次检测无DNS泄露。- 增加了小米部分设备域名。部分反应
miwifi.com
域名请求次数太多导致内存泄露。
Group
内节点组名称需要与Routing
中规则名称对应,例如修改了节点组Proxy
的名称,那么在Routing
中也需要修改proxy
为新的名称
- 如果使用RC版本,DNS可以使用DOH或DOT,以阿里巴巴DNS举例:
- DOH:
h3://dns.alidns.com:443
- DOT:
tls://dns.alidns.com:853
- DOQ:
quic://dns.alidns.com:853
- 节点过滤规则:如果使用固定节点,
policy: fixed(0)
并且filter: name(节点名称)
,如果节点名称中包括emoji符号,可能无法正常选择提示报错,此时建议使用filter: name(keyword: ‘节点关键字’)
方式进行过滤选择。
Routing
中的规则为顺序匹配,从上至下,所以建议将特定规则放在最上方,将例如Geosite:CN
等较大的规则集放在下方,避免规则冲突无法正常匹配。例如,你可以将自定义规则放置于最上方。
- 在DNS的选择上,可以参考《🗒️国内外DNS推荐列表》
启动Dae
自动更新并存储订阅
systemd.timer方法
/usr/local/etc/dae/
,这也是通过自动安装脚本默认的存储位置。那么新建一个/usr/local/bin/update-dae-subs.sh
文件:systemd.timer
和systemd.service
进行自动更新/etc/systemd/system/update-subs.timer
: 以下代码是每12小时,或者每次系统启动后15分钟更新
/etc/systemd/system/update-subs.service
:
/usr/local/etc/dae/sublist
,并安装以下模板填写订阅链接,如果只有一个订阅,则保留并填写一个即可。当通过update-subs.timer
拉取订阅信息时,会自动建立sub1
、sub2
、sub3
的订阅文件。600
权限config.dae
中subscription
部分内容为订阅文件 crontab方法
system.timer
,也可以使用crontab进行替代。区别在于无法实现系统启动后自定义时间进行更新,只能定时更新。/usr/local/bin/update-dae-subs.sh
文件system.timer
部分相同。 🤗 其他用法
OpenAI相关规则
geosite:openai
规则并不全面,如果遇到无法使用的情况,可以添加以下部分规则,替换ai
代理组为你的代理组名称: 关于CPU占用率高及内存泄露
📎 参考文章
Dae搭配AdGuard Home使用指南
Global
配置中的连接选项为domain++
模式。 📝 Dae配置部分
Daed安装
0.9.0
版本。相比于Dae,Daed提供一个可视化的网页管理面板,日常进行自定义配置时候更为方便一些。在资源占用上,Daed相比Dae占用的内存要多一些,大概多出100mb左右。 Global配置
domain+
及domain++
模式。 DNS
路由部分
direct(must)
规则特殊处理,从而避免产生路由回环。geoip:private
规则进行修改,使用direct(must)
规则。如果使用的是direct
规则,那么在AdGuard Home中显示的设备信息均为localhost(127.0.0.1)
Route整体规则
direct与direct(must)区别
must_rules
表示不将DNS流量重定向到dae并继续匹配。对于单一规则,direct
和must_direct
的区别在于direct
会劫持和处理DNS请求(用于流量分割使用),但must_direct
不会。当存在DNS请求的流量循环时,must_direct
很有用。must_direct
也可以写成direct(must)
。 📝 AdGuard Home配置部分
🤗 总结归纳
后续
must_direct
规则时会造成DNS泄露问题,但如果使用direct规则,在AdGuard Home中又无法正常识别发出DNS请求的客户端,所以我最终还是选择在PVE中新建一个CT容器(LXC),单独负责AdGuard Home和Tailscale。AdGuard Home的上游DNS指向Dae所在的内网IP地址,同时在Dae中,对private部分规则使用direct
规则,既满足避免DNS泄露的需要,又满足对各客户端DNS请求的管理。Routing
中增加以下配置,避免DNS请求环路,将下面的10.0.0.20
替换为你的DNS服务入口IP地址。 关于AdGuard Home的卸载
/opt/AdGuardHome
📎 参考文章
2024年个人总结
2025年已经过去了几天,按照惯例,又到了写年度总结的时候了。这几天回想了一下过去的一年,并没有做成什么事情,其他方面在博客上大抵也可以看到,不过还是写写吧。
健康
3月份摘掉了带了一年多的钢牙套,换上保持器,虽然后面还要持续带保持器,不过还是体验要好很多了。因为带了牙套的原因,平时零食很少吃,这一两年来说体重还略微有下降。
5月份去检查头疼,发现了心脏卵圆孔未闭合,于是做了个微创手术,但是医生告知手术后三个月不能剧烈运动。于是之后便没有运动了,以至于过了三个月之后,不运动的习惯养成了,天天都不动了。到现在为止,最多就是出去走走路了,这是坏毛病,得该。
除此之外,因为久坐,腰椎和坐骨经常会疼痛,去医院拍片子看了,腰椎有点弯曲,坐骨关节有积液,也只能吃点药,并没有什么别的治疗办法。自己需要多注意,目前就是常常提醒自己要多吃钙片,有空还是多走走。最近几个月也是跟着朋友约着出去徒步了几次。
工作
23年进入公司的新项目,到3月份就已经开始出现运行不下去的颓势了,一方面是公司的产品没什么运作,另外是上面减少了投资,因为后面的几个月产品上也迭代也减少很多,产品部分人员也在不断变化,这样我们也没多少事情,一直在忐忑和忧虑中度过,直到11月份被裁。
而11月份找工作,也体会到了市场的萧条,大厂要求高,非重点院校毕业生,已经超过30岁的大龄程序员,最近的几份工作都是无名小厂,也算是Debuff拉满,没有任何大厂给面试机会。面了几家国内公司,也都没有后续消息。
最终在12月入职了前同事推荐的公司,与几个前同事在新公司重聚首。这个项目目前刚刚起步,公司也还稍微有点混乱,只需要公司的业务和各方面都能够尽早走上正轨,我在这里也能够发光发热。
博客
2024年这一年,博客内容量可以说是创历史新高了,这一年写的数量比之前所有的还高。这一切得益于公司没啥事,自己有很多的业余时间。同时因为八九月份写的技术文章参与了掘金的创作者训练营活动,获得了“创作先锋奖”,也算是不错。
从六月份开始写个人月报,现在看来是个不错的尝试。很多事情在月末回顾还能想起来,到年末真的就很难回忆起来了。而借助月报,最近几个月的一些东西这更容易回忆起来。目前坚持了七个月,后面仍然有必要继续坚持。
最后就是已经有两年没怎么更新的博客主题样式今年也迎来了大更新,主题基于ParperMod进行了个性化定制,还增加了足迹地图,更新了自我介绍,详情请看: https://isming.me/2024-08-blog-modify/。
而因为博友圈,个站商店等平台,也让我认识了许多优秀的独立博客创作者,让我这个孤岛与其他的岛屿建立起连接。
个人成长
得益于公司比较闲,今年比较多的个人时间,虽然也浪费了很多时间,但也还是做了一些事情。
首先是技术方面的学习,在B站把南京大学jyy的操作系统课给看完了,之前在学校里面这个没有好好学,现在算是补课了。重新学习操作系统,对于很多程序运行的知识,并发等的理解有了新的认识。
新学了Rust语言,跟着openoscamp把rust测试做完了,目前的我使用rust来编写web服务是没啥问题了。而它在系统编程和Android方面的运用,目前还不了解,后面需要有时间需要继续看。
Android系统源码,今年算是真正的自己把一些核心模块的都看完了。而相关的内容也都整理成了文章。不过Android系统的源码量巨大,我所看的这一部分也只是冰山一角,十月之后就没有继续看了。
书籍方面也看了不少,读完的大概有25本。虚构内容方面《一句顶一万句》、《太白金星有点忙》、《食南之徒》都是很有意思的内容。非虚构方面《富兰克林自传》让我学到了很多伟人的优秀品质,《原则》也能够了解到桥水创始人的一些优秀原则,这些对于我们的个人成长都很有益处,当然,知易行难,想要跟着他们的优秀原则或者行为准则来做自己还是很难的,只希望自己能够有一点点的变化也是很好的了。
今年订阅的《读库》大约读了一半的内容,而M套餐的另一本书,全部都没有开封,因此25年还是决定只订阅S套餐了。读库的内容总体上来说还是比较有趣的,主题也比较多,还是值得继续订阅的。
旅行出行
因为23年买了车,今年旅行的次数也是多了很多。今年的长途旅行有成都重庆、山东、南昌,而短途的皖南的几个地方也是去看了看,上海周边也去了苏州宁波嘉兴湖州等的一些地方。总体还是以中短途为主,基本选择自驾,带着小孩,自驾在时间安排,目的地选择方面都有更多的容错空间,人也不会很累。
短途旅行一般满电出发,不需要充电可以回来。而比较远的,比如去山东,这种服务区充电也都比较方便。目前没有充电焦虑。而最近这两个月去苏州徒步了几次,目前体验感良好,后面是值得去发现更多徒步路线,徒步频率可以提高到两周一次。
生活
小朋友进入到幼儿园大班,已经开始了幼小衔接,在平时的陪学陪练过程中经常会止不住的发火,而此时只能默默告诉自己要忍住,这个时候只能提高嗓门,还没有其他的好办法。
因为这一年大多数时间都是居家办公的状态,生活和工作很多时候分得不是太清,个人也比较松弛和焦虑。松弛是因为工作量很少,大部分时间都在摸鱼做自己的事情。焦虑则是因为工作上面的焦虑。 而每天的生活就比较平淡了,为了增加一些事情,便开始养鱼。缸一直是那个缸,鱼则是换了好几波,到现在稍微稳定了一点。但是生活又重新归于平淡,每周给他们换一次水,定期喂喂食。
和父母不在一起,与他们的通话也比较少,因为不能见面,小朋友对于爷爷奶奶的也没那么的亲。老家除了过年,只中秋节回去了一次。和父母之间,除了小孩之外,其他方面的倒也没什么话题了。新的一年还是要多多关心父母。
总结
苟着的一年结束了,工作上算是一事无成,生活上也不算成功,跟朋友们的交流也不多。但是也还是有一些小进步,技术上有一些小成长,能够带着家人出去看看风景。也能够不被短视频和直播吸引,业余时间看看书,看看喜欢的剧集。
不立志可能什么事情都做不成,立志可能能够完成一般,因此新的一年,仍然要立Flag,坚持读书,重新开始锻炼身体,把难看的字给练一练,蹩脚的英语仍然需要继续花时间练习。同时新的一年也要多和家人朋友们多多互动,多多增加与他人之间的联通。也希望2025年工作上面能够有所起色,让我这个中年人在职场上依然能够站稳脚跟。
今年的总结就到此为止,来年再来看看今年的Flag完成的如何。
看完评论一下吧
异地组网工具新推荐,easytier轻松实现跨地域设备互联
异地组网工具新推荐,easytier 轻松实现跨地域设备互联
EasyTier 是由 Rust 和 Tokio 驱动一个简单、安全、去中心化的内网穿透 远程 组网方案,开源项目。
优点
- 去中心化:无需依赖中心化服务,节点平等且独立
- 公网 IP 组网:支持利用共享的公网节点组网, 可以使用 EasyTier 公共 Peers
- 低占用: 即使最垃圾的机器也可以跑
- 跨平台支持
- NAT 穿透:支持基于 UDP 的 NAT 穿透,即使在复杂的网络环境下也能建立稳定的连接
- 子网代理(点对网):节点可以将可访问的网段作为代理暴露给 远程 子网,允许其他节点通过该节点访问这些子网
- 智能路由:根据流量智能选择链路,减少延迟,提高吞吐量
- TCP 支持:在 UDP 受限的情况下,通过并发 TCP 链接提供可靠的数据传输,优化性能
- 高可用性:支持多路径和在检测到高丢包率或网络错误时切换到健康路径
- 安全:支持利用 WireGuard 加密通信,也支持 AES-GCM 加密保护中转流量
- IPV6 支持:支持利用 IPV6 组网
项目情况
部署
这里以手动安装和 docker 部署方式为例
手动安装部署
EasyTier 采用 rust 开发,交叉编译成二进制文件,部署极其方便简单
直接下载已经编译好的文件,安装即可,下面分几步执行
EasyTier 默认是不区分客户端还是服务端,故本次部署即是服务端又是客户端。一般情况下 开放监听端口为服务端,不开放监听端口为客户端
Linux-x86_64
适用于 Debian 系列,其它架构系统类似。默认 root 终端执行。
下载 EasyTier
mkdir -p /etc/et && cd /etc/et
wget wget https://github.com/EasyTier/EasyTier/releases/download/v2.1.1/easytier-linux-x86_64-v2.1.1.zip
# 上面没法下载,可以使用下面的链接下载
wget https://gh.dev.438250.xyz/https://github.com/EasyTier/EasyTier/releases/download/v2.1.1/easytier-linux-x86_64-v2.1.1.zip
解压
unzip easytier-linux-x86_64-v2.1.1.zip
cp -a easytier-linux-x86_64/* .
rm -rf easytier-linux-x86_64 easytier-linux-x86_64-v2.1.1.zip
chmod +x ./*
mv ./easytier-* /usr/bin/
编写配置文件
默认路径为 /etc/et/config.toml
,内容如下:
instance_name = "default"
# easytier组网的ip地址
ipv4 = "192.168.66.80"
dhcp = false
exit_nodes = []
# api地址,记得改成本地监听
rpc_portal = "127.0.0.1:15888"
# 自定义 使用 32379 32380 端口作为监听发现服务 默认监听IPv4/IPv6, 服务端可以根据自己实际情况配置,可以全开,也可以为空不开listeners = [],客户端可以不开
listeners = [
"tcp://0.0.0.0:32379",
"udp://0.0.0.0:32379",
"udp://[::]:32379",
"tcp://[::]:32379",
"wss://0.0.0.0:32380/",
"wss://[::]:32380/",
]
# 组网凭证
[network_identity]
network_name = "xxxx"
network_secret = "xxxx"
# tcp://public.easytier.top:11010 是自定义要连的其他节点, 如果是第一个节点,可以不用配置, 这里以官方的节点为例
[[peer]]
uri = "tcp://public.easytier.top:11010"
# 其他参数
[flags]
dev_name = "easytier0"
enable_ipv6 = true
另外当服务跑起来后,也可以使用 easytier-cli node config
命令查看节点配置文件
编写启动守护文件并启动
cat > /etc/systemd/system/easytier.service <<EOF
[Unit]
Description=EasyTier
After=network.target
[Service]
Type=simple
WorkingDirectory=/etc/et
# ExecStart=/usr/bin/easytier-core -i 192.168.66.80 --network-name ysicing --network-secret ysicing -e tcp://public.easytier.top:11010 --dev-name easytier0 --rpc-portal 127.0.0.1:15888 --no-listener
ExecStart=/usr/bin/easytier-core -c /etc/et/config.toml
Restart=always
RestartSec=10
User=root
Group=root
[Install]
WantedBy=multi-user.target
EOF
可以使用配置文件,也可以使用命令行参数方式,如果节点配置都一样,推荐使用配置文件方式。
启动服务
# 开机自启并立即启动
systemctl enable easytier --now
如果使用命令行参数,每次启动后需要 reload 一下
systemctl daemon-reload
systemctl restart easytier
查询服务是否正常
执行 easytier-cli peer
, 由于使用的是公共节点,所以会有节点信息
如下是我自己的组网节点
使用 docker 部署
编写 docker-compose.yml
首先创建一个目录(如 easytier),然后在该目录下创建 docker-compose.yml 文件,内容如下:
services:
easytier:
privileged: true
container_name: easytier
network_mode: host
volumes:
- easytier:/root
environment:
- TZ=Asia/Shanghai
# 方便国内部署,我会定期同步到腾讯云容器仓库
image: ccr.ccs.tencentyun.com/k7scn/easytier:latest
# 凭证需要保持一致
command: -i 192.168.66.8 --network-name ysicing --network-secret ysicing -l tcp://0.0.0.0:32379 -e tcp://public.easytier.top:11010 --dev-name easytier0 --rpc-portal 127.0.0.1:15888 # --vpn-portal wg://0.0.0.0:32380/192.168.77.0/24
restart: always
volumes:
easytier:
driver: local
启动服务
docker compose pull
docker compose up -d
同理,如果需要查看节点信息,可以使用 docker exec -it easytier easytier-cli peer
命令
需要自行放行相关端口,如 32379, 32380 等
其他系统部署
Windows 部署可以参考官方文档
Windows Scoop 安装
在 PowerShell 执行下列代码以安装 Scoop
irm get.scoop.sh | iex
scoop install git
scoop install nssm
# 添加软件源
scoop bucket add moec https://github.com/laoxong/ScoopBucket
scoop install easytier
# 以服务的方式启动,也可以直接启动测试
nssm.exe install easytier_service C:\Scoop\apps\easytier\current\easytier-core.exe 你的参数
# 编辑服务
nssm edit easytier_service
示例: nssm.exe install easytier_service C:\Scoop\apps\easytier\current\easytier-core.exe -i 192.168.66.81 -e tcp://public.easytier.top:11010 --dev-name easytier0 --network-name xxxx --network-secret xxxx
注意:Windows 下需要管理员权限执行, 相关路径也需要确定,不一定是
C:\Scoop\
,可能是当前用户目录下的scoop
目录
打开 services.msc 找到 easytier_service,修改为延迟启动
其他
仅供参考,不对其安全性负责
实验性:不使用Dnsmasq绕过中国大陆IP
实验环境
- 旁路由(旁路网关):OpenWRT(
ImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
) - 接口为
br-lan
,网关为主路由IP地址 - 运行OpenClash作为科学服务
- 内核版本为
5.15.167
(stable) - 架构
X86_64
📝 实验性:绕过中国大陆IP的原理
/etc/init.d/openclash
这个启动文件实现。在文件中,涉及实验性:绕过中国大陆IP的主要功能部分包括:ip set/nft set
管理,也就是IP集合管理
China_ip_route
规则匹配及重定向
- 利用Dnsmasq进行国内域名列表(
/etc/openclash/accelerated-domains.china.conf
)内的域名解析
IP集合
China_ip_route
集合和China_ip_route_pass
集合,通过插件设置 - 大陆白名单订阅
进行维护,没有使用GeoIP:CN
进行维护。 China_ip_route规则匹配
openclash
链、openclash_mangle
链、以及openclash_mangle_out
链进行return
操作,使流量按原链继续进行,不再经由clash内核进行处理。 openclash_mangle链
- 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
- 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
- 如果不等于2,即不使用防火墙劫持:
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return’
- 如果等于2:
nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route counter return’
openclash链
- 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
- 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
- 如果不等于2,即不使用防火墙劫持:
nft 'add rule inet fw4 openclash ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
- 如果等于2:
nft 'add rule inet fw4 openclash ip daddr @china_ip_route counter return'
openclash_mangle_output链
upstream error
和exchange failed
等错误,同时由于本来应该直连的DNS公众服务器,绕到Clash(Mihomo)核心走了一圈,所以解析速度也有所下降。- 条件判断:检查变量
china_ip_route
是否等于 1。如果是,表示启用了绕过中国大陆IP。
- 嵌套条件判断:检查变量
enable_redirect_dns
是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。其中,skuid≠65534
为非特权用户,即nobody
用户 - 如果不等于2,即不使用防火墙劫持:
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
- 如果等于2:
nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return'
China_ip_route_pass规则匹配
/etc/openclash/accelerated-domains.china.conf
文件内域名)进行解析并生成的IP集。这部分非常依赖于Dnsmasq,但在我们这里由于已经有MosDNS进行分流,所以不用过于关注。 📝 配置流程
China_ip_route的nft规则配置
- 首先我们需要处于fake-ip模式
- 关闭实验性绕过中国大陆IP选项,因为我们要手动添加防火墙规则进行绕过
- 关闭DNS劫持
enable_redirect_dns
选项,即没有使用防火墙劫持DNS,所以我们采用if下的第一条判断结果。 添加防火墙规则
openclash链
openclash_mangle链
openclash_mangle_output链
配置OpenClash自定义防火墙规则
nft
命令,我们可以将上述三条规则写入到openclash的自定义规则里面。配置位置位于:插件设置 - 开发者选项
关于IPV6
关于规则更新
GEOIP:CN
作为IP集进行研究。 已知问题
🤗 总结归纳
📎 参考文章
IPv6与OpenWRT旁路由共存:代理分流与原生地址的完美平衡
📝 付费内容
配置前提
- 运营商下发的IPv6 PD前缀应小于64,一般来说都是60-62左右。如果你的运营商没有下发类似的前缀,或者下发的前缀为/64,那么这篇文章的内容可能并不适用于你的网络环境。具体可以在这里查看:调查下各地运营商光纤宽带分配的 IPv6 PD 前缀的长度 - V2EX
- 机场代理支持IPv6(例如我的TAG Internet)。
- 主路由和旁路由均为OpenWRT系统(基于ImmortalWRT),其他系统需要根据需要自行摸索。
- 尽量从纯净系统方案下进行配置,避免软件或规则冲突。同时做好备份。
- Windows下可以通过
getmac /v
命令查看本机网卡的mac地址。
网络拓扑
网络目标
- 旁路网关(旁路由)架构,可以实现对不同客户端的IPv4网关及DNS配置。同时旁路网关不负责任何NAT转换操作。
- 国内IPv4流量可通过
旁路网关 - 主路由网关
的路径,特定设备可直接通过主路由网关
,避免因为BT、PCDN等对旁路网关上的代理机场产生影响。
- 国外IPv4流量通过
旁路网关 - OpenClash的Mihomo内核
进行分流及代理。
- 所有IPv6流量默认通过
旁路网关 - OpenClash的Mihomo内核
进行分流及代理,国外IPv6流量可通过机场的IPv6节点进行代理使用相关服务。
- 国内IPv6流量使用运营商分发前缀分配的IPv6地址,且可通过客户端配置绕过旁路IPv6网关,实现使用原生IPv6地址使用BT功能。
通过旁路静态路由配置实现特定设备直接使用主路由IPv6网关(未实现)
主路由
- 从运营商获取可分配的IPv6前缀,也就是需要小于64位的前缀。
- 不作为局域网内的RA服务器,原因在于在IPv6的网络环境下,客户端会自动将RA服务器作为其默认的网关,而在我们的网络目标中,整体网络中距离客户端最近的网关应该是旁路网关。
- 以中继方式将DHCPv6-PD过渡给旁路网关(旁路由),将局域网内的IPv6地址分配任务交给旁路网关实现。
旁路网关(旁路由)
- 从主路由(上级网关)获得DHCPv6-PD的分配权限
- 作为RA(IPv6 Router Advertisement)服务器,但不作为DHCPv6的服务器,通过RA向局域网内的客户端提供IPv6地址分配功能,从而使客户端的默认网关及DNS为旁路网关。这样仅需要对特定设备进行特殊化配置,同时在一个局域网中只存在一个DHCPv6服务器,避免多服务器优先级造成分配紊乱,例如存在两个DHCPv6服务器时,客户端IPv6 DNS无法获取这种问题。同时因为主路由通过RA服务器启用SLACC,所以也支持Android设备的地址分配。如果主路由未启用RA服务器和SLACC,只有旁路由开启,我测试下来是Android设备还是获取不到公网的IPv6地址。
- 其实还有一种方法是通过radvd方式强制提高旁路由的RA服务优先级,从而使局域网内设备使用旁路由所提供的RA信息,但由于一方面radvd较老,OpenWRT并没有提供编译好的安装包,自行编译的依赖关系又很乱;另一方面局域网内存在两个RA Server终究是一个潜在的隐患,所以不采用此方案。
解决方案
主路由:
- 首先在全局网络选项中清空
IPv6 ULA 前缀
。
- 配置WAN_6口:获取运营商IPv6前缀及PD权限。这里有两种方法,都可以:
- 修改原WAN口设置:高级设置中,获取IPv6地址为自动。这种方法可在WAN口PPPoE拨号成功之后,自动生成一个WAN_6的虚拟动态接口,同时获得IPv6地址及PD前缀。
- 新增一个WAN_6接口:协议选择
DHCPv6
,设备选择接口别名:"@wan"
。防火墙配置选择wan
,DHCP选项中的IPv6设置全部选择中继。高级设置中委托IPv6前缀开启,IPv6分配长度64
,IPv6后缀填写EUI64
,便于生成的IPv6地址记忆,在配置防火墙规则时更好用。
- 配置原WAN口:修改DHCP服务器中的IPv6设置全部为中继模式;高级设置中的IPv6源路由勾选,委托IPv6前缀不勾选,分配长度禁用。
- 配置LAN口:不需要新增LAN_6口,使用原LAN口即可完成中继;
- 高级设置:委托IPv6前缀勾选,委托长度60(具体看运营商可以给多少长度的PD),其他默认。
- DHCP服务器 - IPv6设置:指定主接口不勾选;RA服务启用服务器模式,默认路由自动,RA标记其他配置(Stateless无配置);DHCPv6服务选择服务器模式(中继模式无法将PD下发到旁路),通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,本地IPv6 DNS服务器不勾选,通告域名空,NDP代理中继,前缀有效期和遵守IPv4有效期默认。
- 修改
/etc/config/dhcp
,在config dhcp lan
下增加配置:option ra_preference ‘medium’
,配置主路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
旁路网关(旁路由):
- 首先在全局网络选项中清空
IPv6 ULA 前缀
。
- 配置LAN_6口:
- 新增一个LAN_6口,协议选择DHCPv6,设备选择
接口别名:"@lan"
。目的是通过@lan口与主路由的lan口对接,从而获得IPv6地址。 - 请求IPv6地址:选择
force
,选择try
也可以 - 请求指定长度的IPv6前缀:填写你在主路由获取的PD的地址后面的数字+1或2,例如我在主路由的PD地址是
240e:3a4:****:****::/60
,那么我在这里填写的就是62,理论上61也可以获取,但只影响可分配地址的范围,家用环境下区别不大,没有那么多的设备。 - 高级设置:使用默认网关勾选;自动获取dns服务器勾选;IPv6源路由勾选;委托IPv6前缀勾选;IPv6分配长度64;前缀过滤器不选择;IPv6后缀填写
EUI64
;IPv6优先级默认0 - 防火墙设置:防火墙选与不选区别不大,或者我还没发现有什么区别。
- DHCP服务器:常规设置,忽略此接口;IPv6设置,指定主接口勾选,其他全部禁用(包括RA服务、DHCPv6服务、NDP代理,这些都是需要在LAN口实现,LAN_6口不进行提供)
- 配置LAN口:
- 高级设置:委托IPv6前缀不选;IPv6分配长度禁用;剩下默认
- DHCP服务器:IPv6设置下,指定主接口不勾选,RA服务器为服务器模式,DHCPv6服务为设置为中继模式,因为我们主路由已经配置了DHCPv6服务器,通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,例如我的为
fe80::****:****:****:f02d
,这个地址可以通过ssh到旁路由,ifconfig查看到;通告的DNS域名为空;NDP代理中继。 - IPv6RA设置:默认路由器,选择在可用的前缀上;启用SLACC勾选;RA标记,其他配置;其他默认。
- 受管配置:开启后,客户端会请求 DHCPv6 服务器提供完整的网络信息(如 IP 地址、DNS 信息等)。这种模式下,客户端不再自行生成 IPv6 地址(即不通过 SLAAC 自动配置 IP 地址),即IPv6的有模式(Stateful),完全依赖DHCPv6进行地址分配,但在Android下无法使用。
- 移动home配置:移动 Home 标志(H Flag)用于标识一个节点是否可以在移动环境下与 Home Agent 通信。这对家庭用户或一般路由配置通常没有实际意义,除非涉及到特殊的移动 IPv6 配置。
- 其他配置:在启用了 SLAAC(无状态自动配置)时,客户端可以自动生成 IPv6 地址,但需要通过 DHCPv6 获取额外的配置信息(如 DNS)。这个标志位通常用于混合环境,即 IP 地址通过 SLAAC 自动生成,而其他信息通过 DHCPv6 获取。在关闭受管配置,并开启其他配置时,即IPv6的无模式(Stateless),不通过DHCPv6进行地址分配。
- 如果LAN_6和LAN口都开启委托IPv6前缀,那么一个设备大概会生成4个IPv6地址,但我们并不需要那么多,所以可以将LAN口的委托关闭。
- 修改
/etc/config/dhcp
,在config dhcp lan
下增加配置:option ra_preference ‘high’
,提高旁路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
Dnsmasq设置:
过滤器 - 过滤IPv6 AAAA记录
,从而使Dnsmasq可以解析IPv6域名。 OpenClash设置:
实验性:绕过中国大陆IPv6
并不依赖于Dnsmasq,所以如果使用其他DNS转发服务的话(例如MoDNS或者AdGuard Home),也可以放心勾选。同时,如果已经使用mosdns进行分流,并且dnsmasq监听端口为53之外的端口,也可以开启实验性:绕过中国大陆IP
,开启后会通过nft set或者ipset将大陆IP端添加到防火墙中,不经过clash核心,提高性能,丧失的只是将dnsmasq通过特定dns解析返回的大陆IP地址添加到ipset这一项。 具体可以参考《实验性:不使用Dnsmasq绕过中国大陆IP》这篇文章。 路由设置:
Destination host unreachable
的情况,通过查看路由表发现是旁路网关没有将主路由网关配置到路由表中,需要自己自行添加,lan口和lan6口都需要添加。unicast
::/0
表main(254)
🤗 总结归纳
其他待解决问题:
link-local ipv6 address
,也就是本地fe80
开头的IPv6地址,出现address unreachable
错误,可以尝试为地址增加接口参数,例如:%br-lan
即指定接口为br-lan
,也就是本地网络接口。 📎 参考文章
解决OpenWRT中VIM报错‘Failed to source defaults.vim’问题
📝 解决方法
E1187: Failed to source defaults.vim Press ENTER or type command to continue
的报错提示了。 📎 参考文章
NieR Automata Ver 1.1a 【第八集已更新】
友情提示!Netflix也可以看的!已经上Netflix了!合租可以看这里:
三周没更新啦!!!!想念A2!!!!
【NEW】第八集:[ANi] NieRAutomata Ver11a - 尼爾:自動人形 Ver1.1a - 08 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]
INFOTorrent Info By: ANi API (Auto Generated)Subtitle: HardSub 中文繁体Mediainfo: Resolution: 1080P Video Format: AVC Audio Format: AAC
第七集:[神楽坂 まひろ] 尼爾:自動人形 Ver1.1a / NieR:Automata Ver1.1a - 07 (CR 1920x1080 AVC AAC MKV)
Information:Overall Bit Rate: 8 186 kb/s字幕: Deutsch (Germany), English (US), Español (Latin America), Español (España), Français (France), Italian (Italy), Português (Brasil), Русский (Russia), 中文(简体)| 繁化姬, 中文(繁體)时长: 00:23:41.660CRC32: BACE4467MediaInfo
第六集:[NanakoRaws] NieR Automata Ver 1.1a - 06 (1080p).mp4
第五集:[NanakoRaws] NieR Automata Ver 1.1a - 05 (1080p).mp4
ONEBLOG纯文字主题
ONEBLOG
TYPECHO,纯文字博客主题,精心雕琢五年,专为写作爱好者打造,响应式设计。
预览
{button href="https://demo.typecho.work/?theme=ONEBLOG" type="blue"}在线预览{/button}
作者博客
下载
介绍
- 极致的性能,页面加载平均仅需
0.03 s
; - 极致的简约风,扁平化设计;
- 极致的松弛美感,精益求精的留白,让每一次访问都是一种享受。
详细详见GITHUB介绍
用峨眉山的第一缕阳光给25年开个好头【完】
null
夜爬峨眉山强度挺大的,不是那么好拿捏,不要被抖音、小红书给你洗脑了!
去之前一定要能理解爬20多公里的楼梯是个什么概念!
我应该不会再爬第二次了....!
感冒
上次写完行程规划之后,不知道是不是早上晨跑衣服穿少的缘故,我忽然得了重感冒。
那几天开始全身酸痛,同时伴有咽痛、咳嗽,而且连续两个晚上发烧 + 白天退烧,为了不影响 31 号的出发,所以请了两天假在家中休息,调养。
好在出发前的早上,感冒的大部分症状都痊愈了,但是还是能明显感觉到体力依旧还是没有恢复。但是行程、人员都已经确定好,可不能放大家的鸽子。
所以不管如何都要先把大家送过去,如果身体实在跟不上就放弃徒步上山,坐观光车上金顶去等大家。
人员
在前面的行程规划一文中提到了当时确定要去的只有我、霜、小罗三人,我到时候打算开我台上不了台面的破 7 坐面包车过去,因此最好还是再找至少 4 人同行,以最大化平摊大家的费用,同时因为人多了后,玩起来也更有意思。
所以,出发前的几天我们就陆续在自己熟悉的圈子内寻找合适同行的队友,但是我这边进展不太顺利,频频碰壁,其中一个户外微信群居然还直接把我踢出群,不过我也庆幸被踢出去了,玩户外的这么小心眼即便在玩在一起也不会有多大意思。
好在小罗那边进展顺利,一直都有拉人进来,虽然其中有些朋友因为行程问题、装备问题赶不上,但是都非常好沟通,部分表示虽然这次不能参与,但是依旧期待下次同行。
最后,在出行前一天把终于把人员都确定好了,分别为:我、霜、小罗、太阳(兵哥哥)、vivi 姐、高兴哥、成歌。
集合
31 号集合日当天,晴空万里艳阳高照,因为有成员担心赶不上日出,所以们把集合的时间提早了一个小时,也就是中午十二点。
我们是第二个到集合地点的,最先到集合地点的是小罗,她依旧穿着上次的淡绿色冲锋衣,装备齐全,精神头看起来不错。她男朋友这次有事,没有和她一起同行,小伙子倒还挺胆大的,也不怕女朋友被其他单身汉给挖走了,哈哈哈。
之后是成歌,是一位 50 多岁的大哥,湖北人,性格和蔼沉稳,非常好相处,脸上时刻带着和煦、云淡风轻的微信。他因为工作缘故经常在各地出差,又喜欢户外运动,所以经常在各地出差的时候就会参与当地的户外活动。别看大哥年纪上去了,可是个十足的老鸟,爬过的山都数不清了,还去冈仁波齐转过山。
然后是 vivi 姐和高兴就好哥,他们是两口子,年纪应该 40 左右把,装备齐全,透着一股子专业劲。高兴哥是退伍军人,平时喜欢摩旅,微信头像就是他摩旅的照片,非常帅。他们其实也去过非常多的地方旅行,但是这是他们第一次进行户外徒步。
最后就是太阳了,也是一个兵哥哥,性格腼腆,后续登山的时候也不爱参与拍照,而且他过来的时候把我们给惊呆了,原因是他居然没有登山包,拿的就是一个白色的大单肩挎包,也没有登山杖,雪爪等等,补给也就带了一盒饼干和一些能量饮料,他说没什么问题,他们当兵时再难的都体验过,我们想着实在不行山上也有的买,就到时候再说
了。
登山
自贡出发到峨眉山只有 150 多公里,全程都是高速,一个多小时就能到,一路上阳光万里,倒也不觉得累,不多时就到了报国寺,还没进停车场就一大堆大爷大妈上来给我引导停车,一个劲的给我往另外一个山坡上引,估摸是当地的村民拉收入呢,我最后还是停在了报国寺的官方停车位上,贵了 5 元一天,停车场管理员还给我们送了一个红色的祈福带。
然后就是下车收整行李,因为没有住宿,其实大家带的东西都不多,唯一多的是这次在山上吃火锅需要用到的东西,一套一次性铝锅盒燃料,然后两大包食材,霜怕山上海拔高煮不熟,把牛羊肉、丸子都提前煮好了,上山后烫一烫便能开吃,我包里放了面饼,丸子、肉给经验、体力更好的成歌大哥,一次性铝锅给了高兴哥,我老婆则背上了香菜、蒜沫等配料。
然后我们便迎着 3 点的斜阳出发了。
传过停车场便来到一处广场,右侧是报国寺,我们在入口处拍了一个出发视频。
之后要步行 30 多分钟后到达雷音寺才算是正式开始爬山之行。
不过不要高兴太早,目前我们连检票处都还没到呢,接下来的十几个小时将会是无尽的楼梯与我们相伴,期间还会经过猴区、高山区。
现在有多兴奋,之后就会有多狼狈。
遇到的第一个红牛墙。
不知道是不是感冒刚好,还是因为冲锋衣没到,我穿的羽绒服散热不好的原因,体力消耗的非常快,才走了一个多小时就感觉自己被掏空了,只感觉浑身都是汗水,脚也重的抬不起来。
接近 5 点时到达圣水阁
山民搭建的原始蜂箱
到达清音阁,这边是一个分叉路口,分上行和右行两条路,上行是去往九十九道拐方向,另一侧则是去往报国寺方向。
经过猴区,峨眉山的猴子和地痞流氓差不多,会强抢你身上任何有颜色的饮料,塑料袋,零食,经过这里时最好拿衣服罩住你的包。
在这里把直接放在高兴哥背后的一次性铝锅接了过来,用的外套罩住,不然肯定要遭殃,不过因此我也没有余力带着我老婆了,中途被猴子隔开,等了她好久,着实是无奈之举,如果不护着锅,晚上可就没得吃了。
穿的老婆的羽绒背心,狼狈不堪
到达洪春坪,天色已经完全暗下来了,开始需要头灯照明,我也彻底红温了。
开始攀爬让人闻风丧胆的九十九道拐,垂直落差 300 米,迂回 2500 米,约有 1840 余石阶。
路上遇到了一只网红猫,入夜降温,估计它冷的不行,看我坐在椅子上,直接就跳到我身上来取暖。
晚上九点半,开始进入雪线。
到达财神庙门口,我的羽绒服内里已经完全打湿,我索性将衣服反穿,终于没那么闷热了。
霜的表现则完全不像是第一次爬山,一路上健步如飞,如履平地。
路上的其他登山者看到都不由纷纷侧目,不由发出大佬牛逼的惊叹,基本上都是她走到前面后等我爬上去,休息一会后再继续出发,期间为了帮我减重还和我互换了背包,我可是彻底成为了拖后腿的人了。
财神庙门口的阶梯
到财神庙这里我才发现我们的队伍已经分成了三个梯队,小罗、成歌一个梯队,已经远远跑在了前面,我、霜、太阳,我们三个则是第二梯队,后面则是 vivi 姐、高兴哥。
小罗太牛了,上次笔架山之行他们也是第一梯队,紧紧跟着向导,这次又没落下 ,和老驴成歌同步,这时我就不由感叹,年轻真好。
本来我们是打算在财神庙吃火锅的,但是因为我们第二梯队、第三梯队落后第一梯队太远,他们等了我们半个小时我们都还没到,所以他们去了下一个地方等我们。
我们在财神庙休息了半个小时,在出发后终于碰到了 vivi 姐他们,他们为了赶我们,都没在财神庙休息。
我们本来盘算着的是聚在一起后大家吃着火锅跨年,小罗、成歌他们在上面的遇仙寺等我们,我们估摸着还要个半个小时才能到。
但是此时已是夜晚 11 点 58,已经临近跨年,我们和 vivi 姐、高兴哥、太阳和路上爬山的小伙伴们都相继在拐角处停下,大家开始倒计时,等待着阳历新年的第一秒到来。
终于到达遇险寺,小罗、成歌已经等了我们半个多小时,表示这个地方太冷了,可算把我们盼来了。没有废话,直接去寺庙拿了热水,架锅,准备吃火锅。
当火锅底料放入锅内,滚烫的热水浇灌在底料上时,火锅的香味开始慢慢弥漫,寺庙门口的小广场上开始随着山风飘荡起了火锅的香味,接下来是放入牛肉、羊肉、牛肉丸、鱼豆腐、金针菇,把矿物油小炉子放在锅下,点燃后稍热便能吃了。
其他路过的小伙伴都不可思议的看着我们的锅,不少人还跑过来拍照,这一刻我们都感觉背着这么多东西爬山的辛苦都值了,哈哈哈。
最后吃完用火锅汤煮好的泡面后我们便接着出发了,目前已经爬了十多个小时了,还有七八个小时的路程在等着我们。
雪已经挺厚的了。
山上的光污染很弱,能看见不少星星
又一个难关:钻天坡
夜眺峨眉市
山上积雪覆盖的台阶,走多了都自然而然的变成了这种规律的小三角坑。
到达洗象池!这里开始精神、肉体能量已经双双见地,霜也有点顶不住了,说走路都是飘的。不少爬山客选择在洗象池的大厅里眯一会。
接着爬!碰到一个穿短裤的大佬,前面看他从山下往山上跑着登山,这会儿居然已经从金顶下来了了....从金顶....下来了,你敢信??
路过一个休息点,买了一个 10 元的苹果,12 元的八宝粥,18 元的冷量饮料。
这个休息站有火盆,本来想着顺便烘烤一下衣服,哪知道把羽绒服屁股后面的下摆烧坏了...。
眼神已经迷离、恍惚,坐下就想坐化...。
还有多久是每一个休息点老板回答的最多的问题,但是不用问都知道还有很久很久!
到!雷!洞!坪!拉!!!!
我们实在走不动了,选择坐缆车上金顶,雷洞坪到缆车那里工作人员说很近,一会儿就到,但是我们怎么就感觉始终走不到呢?
等索道的人们
在索道上能看到即将日出
大家互相祝贺新年快乐。
烧香祈福
金顶遥望雪山
看日出
专门买了个小旗子拍照
才发现我衣服还是反穿着呢。
勇闯天涯一下
最后再来点情绪照片
Weekly #23:2025,出发
🌆 封面图:2025 的第一次日出
📑 Weekly 复刊词:吾一周一省吾身
人必须不断地、周期性地审视自己。这种审视必须通过外化表达的方式才能完成,也就是写作。
而一周是较为合适的时间单位。一周是一年的 2%,是一生的1/4000。如果你把一年,甚至一生的每一周画到一张纸上,每个格子代表一周,你会发现原来这么少。《四千周》这本书就送了一张这样的格子纸。长期来看,以周为单位计算时间流逝的长期进程,非常适合量化。而一周(一般来说)有工作日和休息日,也能给我们足够的自由时间。
虽然我平常一直活跃在 Twitter,但这毕竟是个短文平台,字数限制让人无法进行长文输出与深度思考(除非开 Premium)。因此,我依然在我的博客进行每周回顾。
上一期 Weekly #22 终结于2024 年 10 月 20 日,后来的两个多月都没有更新。其实是因为 22 周之后我开始旅游,去了广州、深圳、香港玩,后两周断更了。而一个习惯一旦经历了两次放弃,就会迎来可怕的习以为常,导致一直拖更到现在……
正好,这也是 2025 的第一周。我确定了两件往往「重要而不紧急」的事,需要长期坚持:阅读和周记。阅读是输入,周记是输出。如果我能坚持写一年的周记,那就太酷了。
🎯 我的 2024,我的成长
过去的 2024 年,我觉得我感受到的一个主题是:「成长」。
回想 2024 年年初的我,当时的自己对未来一片迷茫,还在想着或许考研,但明明内心非常不愿意,这只是在逃避对未来选择的思考。当时的自己甚至还没开始考虑和了解未来其他的可能性。因为在 HNU 大量平庸而无聊的同学身上,很难看到其他可能性。
这一年经历的事情可真多:
- 决定不读研。下定决定后,一切都豁然开朗。
- 人生的第一份大厂实习。
- AdventureX。👉 Weekly #9:AdventureX —— 热爱为主,搞钱为辅
- 旅游。西安、南昌、杭州、上海、武汉、广州、深圳、香港、浏阳。
- 开始将 Twitter 作为主力的社交平台。从零开始涨到将近 3k fo。Connect 了不少很有意思的朋友。
- 春招&秋招。面试、刷题、背八股。
- 签订三方。毕业去向基本尘埃落定。
经历了这一切,现在的自己,已经是个完全不同的人了。无论是对职业、行业、技术、社会的理解,还是社交能力,相比 2024 年初的自己,都有了进步。
相比 2024 年以前基本都在学校「上课、学习」的循环,今年尝试了很多新事物,也认识了很多新朋友。正是这一切拓展了我对未来想象的边界,让我看到更多可能性。所以,2024 给我带来的「成长」相较以往更为显著。
之前在学校里的时候我会想:我们的时光一周一周地逝去,留下了什么呢?这一切有什么意义呢?这也是我开始写 Weekly 的初衷:希望时光留下印记。现在我发现,这些逝去的时间留下的最大的意义就是「成长」。我们的时间是我们最宝贵的资产,而「成长」就是对未来的投资。
2025,希望我能持续「成长」。
☕️ 告别「咖啡因崩溃」
暑假在某厂实习的时候,经常临近晚饭时间我都会突然感觉非常累——不仅是心理上有一种有些崩溃和绝望的情绪,身体上也会感觉腰酸背痛。本周偶然的一天睡眠不足,早上的咖啡和一整天的 coding,让我在下午复现了这种感觉。
现在才知道,这种感觉可能是「咖啡因崩溃」引起的。
人体内的腺苷是引起困意的因子,腺苷与受体结合让人犯困。人清醒的时间越长,积累的腺苷越多;而充足的睡眠则会清除腺苷,将其含量降低到很低的水平。
咖啡因的作用原理则是阻止腺苷与受体结合,但并不会减少腺苷的量。因此,传统说法里说「咖啡能够提神」其实有误导倾向。待咖啡因经过8小时左右被代谢,和受体结合的腺苷数量会在短时间内大量增加,使人反常地进入劳累状态。这就是「咖啡因崩溃」。回想之前实习的时候,我几乎每早都在麦当劳喝咖啡,而睡眠时长没有得到保证,加上一些工作压力,导致频繁发生的「咖啡因崩溃」。
这些源于《我们为什么要睡觉》这本书。本书深深改变了我的睡眠观,非常推荐!书中还指出:咖啡因是人类有史以来被无监管地滥用得规模最大的精神兴奋剂。如果你需要咖啡因才能让自己达到最佳状态,这说明你的睡眠不足。
咖啡因不是一种保健品。相反,它是世界上使用最广泛的(被滥用的)精神兴奋剂。它是全球第二大贸易商品,仅次于石油。咖啡因的摄入代表了有史以来针对人类进行的历时最久、规模最大的无监管药物研究之一,也许只有酒精能与之匹敌,而且现在仍是如此。
2025,让我们告别咖啡因,好好睡一觉吧。
⚙️ Daydreamer 1.0 的失败之处
我目前运行的这个基于 Astro.js 的博客系统,我命名为 Daydreamer,开源在 GitHub。大概完成于一年前。最后一次功能上的更新是在 7 月,之后就基本没有较大的维护。
现在看来,Daydreamer 的设计是有诸多失败之处的。
首先是技术选型上。由于当时对 Node.js 后端生态较为狭隘的认识,后端选择了几乎停止维护的 Koa.js 和较为过时的 TypeORM,这两项现在看来都是较为失败的选择。TypeORM 年久失修,各种奇怪的 bug 一大堆;Koa.js 也长久缺乏维护,生态匮乏。
前端的技术选型也一言难尽。选用了 Sass 并大量使用 mixin,现在看来都不如直接使用 CSS 变量方便。基于此封装的组件库 DayDesign,也继承了这一失败的设计。由于我倔强地不愿意使用任何组件库,而是选择自己实现所有组件,而我又缺乏相关经验,导致前端组件里充斥着大量不合理的抽象和大量不优雅的实现。很多知识都属于「你不知道你不知道」的类型,经验是需要慢慢积累的。
使用 Astro.js 也是非常不合适的选择。我做的明明是一个前后端分离的博客系统,对于获取博客文章都有明确的 API,但我却选择了使用 Astro.js 这一以 SSG 为主的框架,选择在构建时请求 API 获取所有文章,静态生成网站。构建的过程发生在 GitHub Action 的 runner 里,后端则部署在境内腾讯云服务器上,间歇性的网络问题和构建时较高的并发,经常带来麻烦。(尽管如此,Astro.js 本身是一个很好用的框架,我很喜欢)
这也导致了极其怪异的文章发布流程:写好一篇文章后,我要在数据库里插入这条记录(是的,没写后台,直接在数据库里发文章 😂),然后上 GitHub Action 重新构建,等几分钟构建完毕后(产物会在 pages 分支)再在我的服务器上 pull 下 pages 分支的文件,这才完成了网站内容的更新。无论是新发布一篇文章,还是更新友链,凡是更新任何内容(除了评论区),都要重复这样的构建流程。这实在不是一个很好的实践。
设计上也有不少不满意的地方,比如过大的 navbar、缺乏动效,等等。
除此之外,这个系统并没有自带图床。我直接将之前使用的 Typecho 博客系统(blog.skywt.cn)文章编辑时的图片上传功能临时当作图床来用,结果一「临时」就用了一年。这导致这期间发布的文章里所有的图片都来自域名 blog.skywt.cn……
我喜欢折腾的心永远不愿意停歇。因此,几乎每年,我都会重新设计和开发自己的网站。现在我在基于 Next.js 写一个新的博客系统,或者我更喜欢称之为「个人 CMS」。暂定名为 Daydreamer Next。汲取了上述教训,我希望新的设计尽可能优美。使用了 Supabase 和 MinIO,有完整的图床、管理面板,将会支持多语言、SSO 登录,以及更多好玩的功能。Coming soon~
🌟 Bookmarks
- AI 技术的停滞,是革命的开始 – 虹线
- 互联网的外置评论区:Hacker News 导读 | 少数派会员 π+Prime
- 四年五个月 – 阿倫的孤獨星球
- You don't need Next.js
大家的 2024 总结:
🎆 新年快乐。下周见!
251、小寒
null
跨年时峨眉金顶日出和第一缕阳光
为个人网站接入支付功能 - 支付宝准备篇
前言
通过前面两篇文章:独立开发如何接入支付宝和微信支付 和 独立开发者应该如何注册个体工商户,我们知道,个人开发者也是可以比较简单、且体面的为自己的产品接入支付功能的。
众所周知,对接支付相对而言还是比较麻烦且敏感的,但无论是开发网站还是APP,只要涉及到支付,就很难绕开这个话题。而且不同的业务场景、产品形态,需要对接的支付方式也不太一样。不仅如此,在国内,支付至少要支持支付宝和微信两种方式,其复杂性就再一次翻倍了。
因此,接下来我将以我自己的网站为例,分两篇文章介绍一下我是如何以尽可能简单的方式接入支付宝支付的,微信支付后面再说。
当然,思路仅作参考,正式对接起来,还是应该多多查阅官方文档,官方文档才是最靠谱的。
「用户管理」:一键实现用户名称优化,用户安全增强,自定义头像等多项功能 WordPress 插件
这是基于 WPJAM Basic 的超强的 WordPress 用户管理的插件,有多强大呢,首先看后台的设置界面:
可以说它把 WordPress 相关的用户管理功能都集成了,简单数一数就实现了十多个 WordPress 用户相关功能:
- 屏蔽个性化设置
- 屏蔽姓氏和名字设置
- 取消显示名称设置
- 开启别名设置
- 隐藏用户登录名
- 开启登录次数限制
- 用户最后登录时间
- 取消「应用程序密码」
- 按注册时间排序
- 以此身份登陆
- 生成密码重置链接
- 自定义用户头像
- 默认用户头像
下面我们分成五大模块分别来介绍 WPJAM 的「用户管理插件」具体实现了那些功能:
屏蔽个性化设置
WordPress后台个人资料用户可以设置「可视化编辑器」,「语法高亮」,「配色方案」,「键盘快捷键」,「工具栏」,「语言」等这些个性化选项,如下图:
这些选项 WordPress 都是存储到 usermeta 表里面,如果 WordPress 有大量的用户,每个用户会占用7个选项,那么 usermeta 表很快就会爆炸。
比如我运营的 WordPress 站点,有几十万用户,usermeta 表的数据如果不清理的话,已经千万级了,查点东西都慢的要死,如果你和我有一样的困扰,那就可以在插件中勾选实现屏蔽用户的个性化设置,直接采用使用系统全局的默认值。然后还可以根据自己的需求删除这些选项。
用户名称优化
在默认情况下,WordPress 后台个人资料页面中,关于用户的姓名相关的设置是这样的:
是不是有点繁琐,并且很多字段也是存到 usermeta 表中的,我个人觉得关于用户昵称的设置,尽量简洁就好,所以名字和姓氏一般就不需要用户输入,公开显示的名字直接为昵称就好了,所以插件首先提供了下面两个选项:
- 屏蔽姓名设置:屏蔽了姓氏和名字设置,简化后台个人资料界面设置。
- 显示名称设置:取消显示名称选择器,直接使用昵称作为显示名称。
另外插件还支持开启了别名设置,是的,我们不仅仅做减法,偶尔也做下加法,这里可以让用户可以编辑自己的别名(user_nicename
),这样只要不使用和登录名相同的别名,作者文章链接就不会暴露用户名,当然没有设置别名,插件还是有安全选项来实现防止用户名暴露。
所以优化之后最终的用户界面非常简洁,如下所示:
安全增强
WordPres 用户安全增强体现在两个地方,首先是隐藏登录名,不要让攻击者猜到用户名,然后是开启登录限制,防止密码被暴力破解,插件也提供这两方面的选项:
首先说一下如何隐藏登录名,如果用户没有修改过别名(user_nicename
),那么他的别名和登录名(user_login
)是一样的,然后作者文章链接或者其他地方就会暴露登录名,为了进一步防止登录名暴露,我们提供了隐藏登录名的选项:
勾选「防止登录名暴露」之后,如果用户的 user_nicename
和 user_login
是一样的情况下:
1. 作者文章链接使用 author_id 代替 user_nicename,并且原来的作者链接直接设置为 404 页面,防止用户名暴露。
2. user_login
不出现在 body_class
和 comment_class
中。
3. 隐藏登录失败时候未知用户名和密码不正确的错误信息,这两种情况都显示「用户名或者密码错误」,让攻击者猜去。😁
4. 取消作者相关的 sitemap 以及 REST API 中可以查看所有发布过文章的用户信息列表的中的登录名。
如果真的被攻击者猜到了登录名,那么我们还可以开启登录限制,限制登录失败次数,这样就可以防止密码被暴力破解了,进一步做到安全。
功能增强
除了安全增强之外,我们还增加了一个小功能和屏蔽一个功能,分别是记录用户最后登录时间和取消「应用程序密码」功能:
首先新增记录用户最后登录时间,用户登录之后,在后台用户列表就会显示该用户的最后登录时间,并且支持按照用户最后登录时间进行排序。
默认情况下在后台个人资料页面可以设置「应用程序密码」:
应用程序密码允许通过非交互式系统(例如 XML-RPC 或 REST API)进行身份验证,而无需提供您的实际密码。应用密码可以随时撤销。它们不能用于通过传统方式登录您的网站。
很多人看到这个其实是稀里糊涂,简单说他就是用于 APP 或者小程序通过接口来登录的,但是基本上来说,我们用不到这个功能,所以默认建议屏蔽它。
后台用户列表
对于管理员经常使用的用户列表,也新增一些功能和操作:
首先用户可以除了可以按照上面提示按照最后登录事件排序之外,也可以按照用户注册时间排序,只要你勾选了用户列表里的第一个选项,此外在用户列表页面新增两个操作「以此身份登陆」和「生成密码重置链接」:
如果你是 WordPress 开发者,「以此身份登陆」这个功能特别实用,在用户列表界面,管理员可以轻松以用户的身份登录后台,这样用户说他碰到什么问题,就可以直接登录他的账号去看了,而不是问他要账号密码,这个多难为情啊。😳
WordPress 原来「发送密码重置邮件」这个功能是直接发送密码重置邮件给用户,用户在邮箱里面直接点击操作,改成「生成密码重置链接」,则管理员直接获取密码重置链接,可以通过微信或者其他的社交媒体工具发给用户。
头像设置
在后台个人资料页,用户可以自定义自己的头像。
如果用户没有设置头像,管理员可以设置默认头像,然后随机给用户使用:
最后用户头像还多加一个选项,就是如果用户已经在 Gravatar 里面设置了头像怎么办?有两个选项,从默认中随机选一个,继续使用 Gravatar 的设置。
总结
通过上面的介绍,是不是非常强大,目前我所有用户相关的功能整合到 WPJAM-User 的插件中,只需后台简单的勾选就可以实现绝大部分用户安全和管理相关的功能。
「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:
DAE搭配MosDNS使用配置
📝 DAE的DNS原理
DAE的分流原理
域名通过劫持 DNS 请求,将 DNS 请求的域名与所查 IP 进行关联来得到。尽管这种方式有一些问题:
- 可能会出现误判。例如需要分流到国内和国外的两个网站拥有同一个 IP,且在短时间内同时被访问,或浏览器有 DNS 缓存。
- 用户的 DNS 请求必须通过 dae。例如将 dae 设为 DNS,或在 dae 作为网关的情况下使用公共 DNS。
———
常规代理程序DNS请求及解析
DAE的DNS请求与解析
📝 DAE与MosDNS的配合
GeoSite:CN
的域名通过MosDNS并发请求阿里的公共DNS服务器,取得结果。同时对GeoSite:GFW
以及Graylist
(自定义灰名单)的域名使用Google的公共DNS进行请求,使其回到DAE的分流规则之内,这样既满足使用MosDNS并发请求加快DNS解析速度、ECS提供就近CDN节点的同时,也不会扰乱DAE基于domain的分流配置。 DAE DNS配置
DAE Routing配置
must_direct
策略内,不将DNS流量重定向到dae并继续匹配,避免产生回环。同时因为可继续匹配,所以MosDNS中使用Google Public DNS规则流量还可以继续进入DAE执行远端请求。 MosDNS配置
定义Tag
主序列配置
query_nocn配置
🤗 总结归纳
graylist
。 📎 参考文章
Android免拔SIM卡使用官方TikTok
📝 Tiktok检测原理
- SIM卡检测:
- 国家代码检测:TikTok通过读取设备上的SIM卡信息来确定用户所在的国家或地区。中国大陆的SIM卡通常会有特定的国家代码(如
CN
),当TikTok检测到此代码时,会限制用户的功能或直接显示网络错误。
- 运营商识别:TikTok还可能通过识别SIM卡所属的运营商来进一步确认用户的地理位置。
- IP地址检测:
- 地理定位:TikTok会通过用户的IP地址来判断其所在的地理位置。如果IP地址显示用户位于中国大陆,TikTok会采取相应的限制措施。
- 动态IP检测:为了防止用户通过VPN等方式绕过检测,TikTok可能会监控IP地址的动态变化,识别异常的IP行为。
- IP地址干净度:TikTok会尝试对BGP机房的IP地址进行阻止访问,原因在于大部分通过机房线路IP所来的请求为代理请求。
- 设备信息检测:
- 设备标识符:TikTok可能通过读取设备的唯一标识符(如IMEI、MAC地址等)来识别用户的设备,并根据设备的注册地或其他信息进行判断。
- 系统语言和时区:TikTok还会检查设备的系统语言和时区设置,如果这些设置与中国的标准一致,也可能触发检测机制。
📝 Nrfr介绍
Nrfr是一款强大的 SIM 卡国家码修改工具,无需Root权限即可修改SIM卡国家码。本项目完全基于Android系统原生API实现,不依赖Xposed、Magisk等任何第三方框架,仅通过调用系统级接口实现功能。通过修改国家码,你可以:
- 🌏 解锁运营商限制,使用更多本地功能
- 📱 优化信号显示和网络选择
- 🔓 突破某些区域限制的应用和服务
- 🛠️ 解决国际漫游时的兼容性问题
- 🌐 帮助使用海外SIM卡获得更好的本地化体验
- ⚙️ 解决部分应用识别SIM卡地区错误的问题
实现原理
Nrfr通过调用Android系统级API(CarrierConfigLoader)修改系统内的运营商配置参数,而不是直接修改SIM卡。这种实现方式:
- 完全在系统层面工作,不会对SIM卡本身进行任何修改或造成损坏
- 仅改变系统对SIM卡信息的读取方式
- 基于Android原生API实现,不依赖任何第三方框架(如Xposed、Magisk等)
- 通过Shizuku仅提供必要的权限支持
- 所有修改都是可逆的,随时可以还原
📝 Nrfr使用教程
开启开发者模式
设置
,点击我的设备
,快速且疯狂的点击OS Version(OS版本?系统版本?),直到提示"You are already a developer"
,即表示开启开发者模式成功。开发者模式
选项位于更多设置
- 开发者选项
开启USB调试
开发者选项
,下滑找到USB调试
,点击开启。如果是澎湃OS2系统,会进行一些风险提示,选择允许。然后找到USB安装
,同样点击进行开启。如果你是小米手机,或使用MIUI系统或澎湃OS系统,还需要开启USB调试(安全设置)。
安装Shizuku
Shizuku配对
通知管理
- 通知显示设置
- 原生样式
无线调试启动
,点击下面的配对,在第一次使用时,Shizuku会提示开启通知权限。开发者选项
,找到无线调试
,点击进入,开启无线调试
,点击使用配对码配对设备
,然后在Shiziku的通知内,输入配对码完成配对操作。 Nrfr安装
Nrfr 快速启动工具
。USB调试
权限。此时选择设备中会出现你的手机。确认选择
,在检查应用中会提示Nrfr的手机App没有安装,点击确认并继续
,进行安装。安装必须应用
,手机上会弹出通过USB安装的提示,点击继续安装
继续下一步
,进行Shizuku的启动与授权。已授权应用
中开启Nrfr的授权选项。 Nrfr设置SIM卡国家码
美国(US)
、日本(JP)
。双卡用户,修改SIM1
即可,不需要全部进行修改,Tiktok判定其中有一张手机卡的国家码为允许地区的就可以使用。 🤗 总结归纳
TikTok代理规则
📎 参考文章
欢迎使用 Typecho
如果您看到这篇文章,表示您的 blog 已经安装成功.
30Q帀可以开7个月SVIP
30Q帀可以开7个月SVIP
活动地址,目前还有效。
新年快来了,分享一套自己整理的新年套装。
主要把背景颜色改成红色和添加一对灯笼,在添加了一下烟花特效。
<div class="deng-box1"> <div class="deng"> <div class="xian"></div> <div class="deng-a"> <div class="deng-b"><div class="deng-t">新年</div></div> </div> <div class="shui shui-a"><div class="shui-c"></div><div class="shui-b"></div></div> </div> </div>
<div class="deng-box2"> <div class="deng"> <div class="xian"></div> <div class="deng-a"> <div class="deng-b"><div class="deng-t">快乐</div></div> </div> <div class="shui shui-a"><div class="shui-c"></div><div class="shui-b"></div></div> </div> </div>
<canvas id=c></canvas>
<style>
body {
background: #bf1f18;
}
canvas {
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
.deng-box1 {
position: fixed;
top: 35px;
left: 5px;
z-index: 9999;
pointer-events: none;
}
.deng {
position: relative;
width: 84px; /* 120px * 0.7 */
height: 63px; /* 90px * 0.7 */
margin: 35px; /* 50px * 0.7 */
background: #d8000f;
background: rgba(216, 0, 15, 0.8);
border-radius: 50% 50%;
-webkit-transform-origin: 50% -70px; /* -100px * 0.7 */
-webkit-animation: swing 3s infinite ease-in-out;
box-shadow: -3.5px 3.5px 35px 2.8px rgba(250, 108, 0, 1); /* 缩小阴影 */
}
.deng::before {
position: absolute;
top: -4.9px; /* -7px * 0.7 */
left: 20.3px; /* 29px * 0.7 */
height: 8.4px; /* 12px * 0.7 */
width: 42px; /* 60px * 0.7 */
content: " ";
display: block;
z-index: 999;
border-radius: 3.5px 3.5px 0 0; /* 5px * 0.7 */
border: solid 0.7px #dc8f03; /* 1px * 0.7 */
background: #ffa500;
background: linear-gradient(to right, #dc8f03, #ffa500, #dc8f03, #ffa500, #dc8f03);
}
.xian {
position: absolute;
top: -14px; /* -20px * 0.7 */
left: 42px; /* 60px * 0.7 */
width: 1.4px; /* 2px * 0.7 */
height: 14px; /* 20px * 0.7 */
background: #dc8f03;
}
.deng-box1 {
pointer-events: none;
}
.deng-a {
width: 70px; /* 100px * 0.7 */
height: 63px; /* 90px * 0.7 */
background: #d8000f;
background: rgba(216, 0, 15, 0.1);
margin: 8.4px 5.6px 5.6px 7px; /* 缩小margin */
border-radius: 50% 50%;
border: 1.4px solid #dc8f03; /* 2px * 0.7 */
}
.deng-b {
width: 31.5px; /* 45px * 0.7 */
height: 63px; /* 90px * 0.7 */
background: #d8000f;
background: rgba(216, 0, 15, 0.1);
margin: -1.4px 5.6px 5.6px 18.2px; /* 缩小margin */
border-radius: 50% 50%;
border: 1.4px solid #dc8f03; /* 2px * 0.7 */
}
.deng-t {
font-family: 华文行楷,Arial,Lucida Grande,Tahoma,sans-serif;
font-size: 1.05rem; /* 1.5rem * 0.7 */
color: #ffa500;
font-weight: bold;
line-height: 29.4px; /* 42px * 0.7 */
text-align: center;
width: 17.5px; /* 25px * 0.7 */
margin: 0 auto;
}
.shui-a {
position: relative;
width: 3.5px; /* 5px * 0.7 */
height: 14px; /* 20px * 0.7 */
margin: -3.5px 0 0 41.3px; /* 缩小margin */
-webkit-animation: swing 4s infinite ease-in-out;
-webkit-transform-origin: 50% -31.5px; /* -45px * 0.7 */
background: #ffa500;
border-radius: 0 0 3.5px 3.5px; /* 5px * 0.7 */
}
.shui-c {
position: absolute;
top: 12.6px; /* 18px * 0.7 */
left: -1.4px; /* -2px * 0.7 */
width: 7px; /* 10px * 0.7 */
height: 24.5px; /* 35px * 0.7 */
background: #ffa500;
border-radius: 0 0 0 3.5px; /* 5px * 0.7 */
}
.shui-b {
position: absolute;
top: 9.8px; /* 14px * 0.7 */
left: -1.4px; /* -2px * 0.7 */
width: 7px; /* 10px * 0.7 */
height: 7px; /* 10px * 0.7 */
background: #dc8f03;
border-radius: 50%;
}
.deng::after {
position: absolute;
bottom: -4.9px; /* -7px * 0.7 */
left: 7px; /* 10px * 0.7 */
height: 8.4px; /* 12px * 0.7 */
width: 42px; /* 60px * 0.7 */
content: " ";
display: block;
margin-left: 14px; /* 20px * 0.7 */
border-radius: 0 0 3.5px 3.5px; /* 5px * 0.7 */
border: solid 0.7px #dc8f03; /* 1px * 0.7 */
background: #ffa500;
background: linear-gradient(to right, #dc8f03, #ffa500, #dc8f03, #ffa500, #dc8f03);
}
.deng-box2 {
position: fixed;
top: 35px;
right: 5px;
z-index: 9999;
pointer-events: none;
}
.deng-box2 .deng {
position: relative;
width: 84px; /* 120px * 0.7 */
height: 63px; /* 90px * 0.7 */
margin: 35px; /* 50px * 0.7 */
background: #d8000f;
background: rgba(216, 0, 15, 0.8);
border-radius: 50% 50%;
-webkit-transform-origin: 50% -70px; /* -100px * 0.7 */
-webkit-animation: swing 5s infinite ease-in-out;
box-shadow: -3.5px 3.5px 21px 2.8px rgba(252, 144, 61, 1); /* 缩小阴影 */
}
.deng-box2 {
pointer-events: none;
}
@-moz-keyframes swing {
0% {
-moz-transform: rotate(-10deg)
}
50% {
-moz-transform: rotate(10deg)
}
100% {
-moz-transform: rotate(-10deg)
}
}
@-webkit-keyframes swing {
0% {
-webkit-transform: rotate(-10deg)
}
50% {
-webkit-transform: rotate(10deg)
}
100% {
-webkit-transform: rotate(-10deg)
}
}
</style>
<script>
var gl = c.getContext( 'webgl', { preserveDrawingBuffer: true } )
, w = c.width = window.innerWidth
, h = c.height = window.innerHeight
, webgl = {}
, opts = {
projectileAlpha: .8,
projectileLineWidth: 1.3,
fireworkAngleSpan: .5,
baseFireworkVel: 3,
addedFireworkVel: 3,
gravity: .03,
lowVelBoundary: -.2,
xFriction: .995,
baseShardVel: 1,
addedShardVel: .2,
fireworks: 100,
baseShardsParFirework: 10,
addedShardsParFirework: 10,
shardFireworkVelMultiplier: .3,
initHueMultiplier: 1/360,
runHueAdder: .1/360
}
webgl.vertexShaderSource = `
uniform int u_mode;
uniform vec2 u_res;
attribute vec4 a_data;
varying vec4 v_color;
vec3 h2rgb( float h ){
return clamp( abs( mod( h * 6. + vec3( 0, 4, 2 ), 6. ) - 3. ) -1., 0., 1. );
}
void clear(){
gl_Position = vec4( a_data.xy, 0, 1 );
v_color = vec4( 0, 0, 0, a_data.w );
}
void draw(){
gl_Position = vec4( vec2( 1, -1 ) * ( ( a_data.xy / u_res ) * 2. - 1. ), 0, 1 );
v_color = vec4( h2rgb( a_data.z ), a_data.w );
}
void main(){
if( u_mode == 0 )
draw();
else
clear();
}
`;
webgl.fragmentShaderSource = `
precision mediump float;
varying vec4 v_color;
void main(){
gl_FragColor = v_color;
}
`;
webgl.vertexShader = gl.createShader( gl.VERTEX_SHADER );
gl.shaderSource( webgl.vertexShader, webgl.vertexShaderSource );
gl.compileShader( webgl.vertexShader );
webgl.fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
gl.shaderSource( webgl.fragmentShader, webgl.fragmentShaderSource );
gl.compileShader( webgl.fragmentShader );
webgl.shaderProgram = gl.createProgram();
gl.attachShader( webgl.shaderProgram, webgl.vertexShader );
gl.attachShader( webgl.shaderProgram, webgl.fragmentShader );
gl.linkProgram( webgl.shaderProgram );
gl.useProgram( webgl.shaderProgram );
webgl.dataAttribLoc = gl.getAttribLocation( webgl.shaderProgram, 'a_data' );
webgl.dataBuffer = gl.createBuffer();
gl.enableVertexAttribArray( webgl.dataAttribLoc );
gl.bindBuffer( gl.ARRAY_BUFFER, webgl.dataBuffer );
gl.vertexAttribPointer( webgl.dataAttribLoc, 4, gl.FLOAT, false, 0, 0 );
webgl.resUniformLoc = gl.getUniformLocation( webgl.shaderProgram, 'u_res' );
webgl.modeUniformLoc = gl.getUniformLocation( webgl.shaderProgram, 'u_mode' );
gl.viewport( 0, 0, w, h );
gl.uniform2f( webgl.resUniformLoc, w, h );
gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );
gl.enable( gl.BLEND );
gl.lineWidth( opts.projectileLineWidth );
webgl.data = [];
webgl.clear = function(){
gl.uniform1i( webgl.modeUniformLoc, 1 );
var a = .1;
webgl.data = [
-1, -1, 0, a,
1, -1, 0, a,
-1, 1, 0, a,
-1, 1, 0, a,
1, -1, 0, a,
1, 1, 0, a
];
webgl.draw( gl.TRIANGLES );
gl.uniform1i( webgl.modeUniformLoc, 0 );
webgl.data.length = 0;
}
webgl.draw = function( glType ){
gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( webgl.data ), gl.STATIC_DRAW );
gl.drawArrays( glType, 0, webgl.data.length / 4 );
}
var fireworks = []
, tick = 0
, sins = []
, coss = []
, maxShardsParFirework = opts.baseShardsParFirework + opts.addedShardsParFirework
, tau = 6.283185307179586476925286766559;
for( var i = 0; i < maxShardsParFirework; ++i ){
sins[ i ] = Math.sin( tau * i / maxShardsParFirework );
coss[ i ] = Math.cos( tau * i / maxShardsParFirework );
}
function Firework(){
this.reset();
this.shards = [];
for( var i = 0; i < maxShardsParFirework; ++i )
this.shards.push( new Shard( this ) );
}
Firework.prototype.reset = function(){
var angle = -Math.PI / 2 + ( Math.random() - .5 )* opts.fireworkAngleSpan
, vel = opts.baseFireworkVel + opts.addedFireworkVel * Math.random();
this.mode = 0;
this.vx = vel * Math.cos( angle );
this.vy = vel * Math.sin( angle );
this.x = Math.random() * w;
this.y = h;
this.hue = tick * opts.initHueMultiplier;
}
Firework.prototype.step = function(){
if( this.mode === 0 ){
var ph = this.hue
, px = this.x
, py = this.y;
this.hue += opts.runHueAdder;
this.x += this.vx *= opts.xFriction;
this.y += this.vy += opts.gravity;
webgl.data.push(
px, py, ph, opts.projectileAlpha * .2,
this.x, this.y, this.hue, opts.projectileAlpha * .2 );
if( this.vy >= opts.lowVelBoundary ){
this.mode = 1;
this.shardAmount = opts.baseShardsParFirework + opts.addedShardsParFirework * Math.random() | 0;
var baseAngle = Math.random() * tau
, x = Math.cos( baseAngle )
, y = Math.sin( baseAngle )
, sin = sins[ this.shardAmount ]
, cos = coss[ this.shardAmount ];
for( var i = 0; i < this.shardAmount; ++i ){
var vel = opts.baseShardVel + opts.addedShardVel * Math.random();
this.shards[ i ].reset( x * vel, y * vel )
var X = x;
x = x * cos - y * sin;
y = y * cos + X * sin;
}
}
} else if( this.mode === 1 ) {
this.ph = this.hue
this.hue += opts.runHueAdder;
var allDead = true;
for( var i = 0; i < this.shardAmount; ++i ){
var shard = this.shards[ i ];
if( !shard.dead ){
shard.step();
allDead = false;
}
}
if( allDead )
this.reset();
}
}
function Shard( parent ){
this.parent = parent;
}
Shard.prototype.reset = function( vx, vy ){
this.x = this.parent.x;
this.y = this.parent.y;
this.vx = this.parent.vx * opts.shardFireworkVelMultiplier + vx;
this.vy = this.parent.vy * opts.shardFireworkVelMultiplier + vy;
this.starty = this.y;
this.dead = false;
this.tick = 1;
}
Shard.prototype.step = function(){
this.tick += .05;
var px = this.x
, py = this.y;
this.x += this.vx *= opts.xFriction;
this.y += this.vy += opts.gravity;
var proportion = 1 - ( this.y - this.starty ) / ( h - this.starty );
webgl.data.push(
px, py, this.parent.ph, opts.projectileAlpha / this.tick,
this.x, this.y, this.parent.hue, opts.projectileAlpha / this.tick );
if( this.y > h )
this.dead = true;
}
function anim(){
window.requestAnimationFrame( anim )
webgl.clear();
++tick;
if( fireworks.length < opts.fireworks )
fireworks.push( new Firework );
fireworks.map( function( firework ){ firework.step(); } );
webgl.draw( gl.LINES );
}
anim();
window.addEventListener( 'resize', function(){
w = c.width = window.innerWidth;
h = c.height = window.innerHeight;
gl.viewport( 0, 0, w, h );
gl.uniform2f( webgl.resUniformLoc, w, h );
})
window.addEventListener( 'click', function( e ){
var firework = new Firework();
firework.x = e.clientX;
firework.y = e.clientY;
firework.vx = 0;
firework.vy = 0;
fireworks.push( firework );
});
</script>
国内外DNS推荐列表
📝 主旨内容
国内DNS服务器
www.js96110.com.cn
名称 | 标准DNS地址 | DOH地址 | DOT地址 | 是否支持H3 | ECS |
DNSPod | 119.29.29.29 / 182.254.116.116 | https://doh.pub/dns-query | dot.pub
| 否 | 支持 |
AliDNS | 223.5.5.5 / 223.6.6.6 | https://dns.alidns.com/dns-query | dns.alidns.com | 是 | 支持 |
国外DNS服务器
dial_addr
替代域名,可免去每次建立连接时解析服务器域名。dial_addr
一般为标准DNS的IPv4和IPv6地址。名称 | 标准 DNS 地址 | DoH 地址 | DoT 地址 | 是否支持 H3 | ECS |
Google DNS | 8.8.8.8 / 8.8.4.4 | https://dns.google/dns-query | dns.google | 否 | 支持 |
Cloudflare | 1.1.1.1 / 1.0.0.1 | https://cloudflare-dns.com/dns-query | 1dot1dot1dot1.cloudflare-dns.com | 是 | 支持 |
Quad9 | 9.9.9.9 / 149.112.112.112 | https://dns.quad9.net/dns-query | dns.quad9.net | 否 | 支持 |
AdGuard Public DNS | 94.140.14.14 / 94.140.15.15 | https://dns.adguard.com/dns-query | dns.adguard.com | 否 | 支持 |
NextDNS | 45.90.28.0 / 45.90.30.0 | https://dns.nextdns.io | 45.90.28.0 / 45.90.30.0 | 是 | 支持 |
OpenDNS | 208.67.222.222 / 208.67.220.220 | https://doh.opendns.com/dns-query | 208.67.222.222 / 208.67.220.220 | 否 | 支持 |
Yandex DNS | 77.88.8.8 / 77.88.8.1 | https://doh.yandex.net/dns-query | dns.yandex.net | 否 | 不支持 |
CleanBrowsing | 185.228.168.9 / 185.228.169.9 | https://doh.cleanbrowsing.org/dns-query | security-filter-dns.cleanbrowsing.org | 否 | 不支持 |
HKBN DNS | 203.80.96.10 / 203.80.96.9 | 不支持 | 不支持 | 否 | 不支持 |
NTT Communications DNS | 61.213.169.170 / 61.213.169.171 | 不支持 | 不支持 | 否 | 不支持 |
NEC BIGLOBE DNS | 202.225.96.66 / 202.225.96.68 | 不支持 | 不支持 | 否 | 不支持 |
Yahoo Japan DNS | 182.22.70.1 / 182.22.70.2 | 不支持 | 不支持 | 否 | 不支持 |
jp.tiar.app | 172.104.93.80 | https://jp.tiarap.org/dns-query
| jp.tiar.app | 否 | 不支持 |
DNS.SB | 45.11.45.11 | https://doh.dns.sb/dns-query | dot.sb | 否 | 不支持 |
腾讯国际 | 162.14.21.178 / 162.14.21.56 | 不支持,可通过腾讯云套娃DOH | 不支持,可通过腾讯云套娃DOT | 否 | 不支持 |
Comodo Secure DNS | 8.26.56.26 | https://doh.comodo.com/dns-query | dns.comodo.com | 否 | 不支持 |
DNS.WATCH | 84.200.69.80 | https://dns.watch/dns-query | ㅤ | 否 | 不支持 |
Blahdns(新加坡) | 46.250.226.242
2407:3640:2205:1668::1 | https://doh-sg.blahdns.com/dns-query | dot-sg.blahdns.com | 是 | 不支持 |
CleanBrowsing | 185.228.168.9
185.228.169.9 | https://doh.cleanbrowsing.org/doh/security-filter/ | security-filter-dns.cleanbrowsing.org | 否 | 不支持 |
Block malware | 76.76.2.1 | https://freedns.controld.com/p1 | tls://p1.freedns.controld.com | 否 | 不支持 |
DeCloudUs | 78.47.212.211:9443 | https://dns.decloudus.com/dns-query | tls://dns.decloudus.com | 否 | 不支持 |
Mullvad(新加坡) | - | https://dns.mullvad.net/dns-query | tls://dns.mullvad.net | 否 | 不支持 |
OpenDNS | 208.67.222.222 / 208.67.220.220 | https://doh.opendns.com/dns-query | - | 否 | 支持 |
Microsoft DNS / Level 3 Communications | 4.2.2.2 / 4.2.2.1 | 不支持 | 不支持 | 否 | 不支持 |
非公共DNS服务(增强型DNS服务)
- XNS.One提供非公共DNS使用,属于付费服务,需要邀请码,可以在他们的Telegram频道蹲一下。付费不支持支付宝与微信,只能信用卡付款。
- NextDNS,我目前主要使用的DNS服务,免费版每个月提供30万次查询,基本够日常使用。可定制拦截列表。
- AdGuard DNS,与NextDNS类似,免费版每个月提供30万次查询,允许配置5个接入点,2个服务器,支持配置100条自定义规则。
📝 参考信息
enable_pipeline
: TCP/DoT 使用 RFC 7766 新的 query pipelining 连接复用模式。
- 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低响应延时。
- 并非所有服务器都支持。必须确定服务器支持后再启用该选项。
- Tips: 已知 Google 和 Cloudflare 的 TCP/DoT 是支持该模式的。知名的公共 DNS 服务商大多数都支持该模式。可以使用
mosdns probe pipeline {tcp|tls}://server_ip[:port]
测试命令测试服务器是否支持。比如mosdns probe pipeline tls://8.8.8.8
。
什么是ECS?
ECS(EDNS Client Subnet)是扩展DNS查询的一种机制,旨在提升内容分发网络(CDN)和地理位置相关的服务的效率。通常DNS服务器只看到客户端的 IP 地址,但通过ECS,DNS请求会包含客户端IP的一部分(子网信息)。这样,内容分发网络可以根据客户端的地理位置,返回更接近用户的服务器,减少延迟,提升性能。ECS主要用于优化网络和加速服务的访问,但也可能带来一定的隐私泄露风险。
什么是DOH?
DoH(DNS over HTTPS)是一种技术,用来加密你的 DNS 查询。通常情况下,DNS 查询是明文的,容易被别人看到和监控。而 DoH 会通过 HTTPS 协议加密这些查询,确保你的请求内容是安全的,不会被别人偷看。就像你在发送加密的信息一样,DoH 保护了你上网时的隐私,并在一定程度上避免劫持。
什么是ECH?
ECH(加密客户端你好,Encrypted Client Hello)是一种技术,用来加密你访问网站时的 SNI(服务器名称指示)信息。通常情况下,当你想访问某个网站时,这个请求是明文的,运营商或其他第三方可以轻易看到你在访问什么网站,并可能进行拦截或阻断(例如 SNI 阻断)。这也是为什么有时你在国内访问 GitHub 会遇到问题的原因之一。有了 ECH,这些 SNI 信息就被加密了,外面的人就看不到你要访问哪个网站,从而提高了你的隐私和安全性。简单来说,ECH 就像是在发送加密的信息,让你的浏览行为更加私密。
什么是DNSSEC?
DNSSEC(Domain Name System Security Extensions)是DNS系统的安全扩展协议,通过数字签名技术来确保DNS记录的真实性和完整性。它通过建立从根域名到下级域名的信任链,使用公私钥对对DNS记录进行签名和验证,能有效防止DNS欺骗和缓存污染。DNSSEC引入了几个关键记录类型:DNSKEY用于存储域名公钥,RRSIG包含数字签名信息,DS记录用于下级域委派签名,以及NSEC/NSEC3用于提供域名不存在的证明。虽然DNSSEC的配置较为复杂,可能增加DNS服务器负载并导致响应包变大,但它在防止DNS劫持和欺骗方面发挥着重要作用,目前已得到Google DNS (8.8.8.8)和Cloudflare (1.1.1.1)等主流公共DNS服务器的支持。
关于DNS选择?
RouterOS使用OSPF智能分流国外流量
📝 OSPF介绍
📝 配置背景
- 主路由器:RouterOS
- 光猫桥接,通过PPPoE Client建立pppoe-out1建立拨号
- 4个网口,分别为eth1 ~ eth4,其中eth4作为WAN口,pppoe-out1也是这个接口; 其他三个接口建立桥接,为bridge1
- 版本为7.16(stable)
- 旁路由(旁路网关):Debian
- 接口为ens18,网关为主路由bridge1地址
- 运行DAED作为科学服务
📝 配置指南
Debian配置
开启IPv4及IPv6转发
/etc/sysctl.conf
确认包括以下内容,并没有被注释:sysctl -p
命令使其生效。 安装Bird及配置
- 通过apt进行安装:
- 编辑配置文件:
/etc/bird/bird.conf
,需要对其编辑。log syslog all;
- 作用:将BIRD的所有日志输出到系统日志(syslog),可以通过
journalctl -xeu bird
进行bird日志查看
router id 10.0.0.10;
- 作用:定义了BIRD路由器的标识(Router ID),Router ID是一个唯一的IPv4地址形式,需要自行更改配置为自己旁路由(旁路网关)的IPv4地址
protocol device { scan time 60; }
- 作用:
device
协议的配置,负责发现和监控网络接口的状态。scan time 60;
表示BIRD每60秒扫描一次所有网络接口,以更新接口状态信息。
protocol kernel { ipv4 { import none; export none; }; } 和 protocol kernel { ipv6 { import none; export none; }; }
- 作用:
kernel
协议用于在BIRD的路由表和操作系统的内核路由表之间同步路由信息。 import none
:不从内核路由表导入路由信息。export none
:不将BIRD中的路由信息导出到内核路由表。- 禁止BIRD与操作系统的内核交换任何路由信息,完全独立管理IPv4和IPv6的路由表,避免将Bird的静态路由信息导入到内核路由表造成本地回环,同时减少内核路由表内路由规则数目,便于进行debug。
protocol static { ipv4; include "/etc/bird/routes4.conf"; } 和 protocol static { ipv6; include "/etc/bird/routes6.conf"; }
- 作用:
static
协议用于定义静态路由。静态路由不会根据网络拓扑的变化自动更新,需要手动配置。 ipv4
:该协议块是针对IPv4的静态路由。ipv6
:该协议块是针对IPv6的静态路由。include "/etc/bird/routes4.conf";
:从指定的文件/etc/bird/routes4.conf
中导入IPv4静态路由配置。include "/etc/bird/routes6.conf";
:从指定的文件/etc/bird/routes6.conf
中导入IPv6静态路由配置。
protocol ospf v2 { ... }
- 作用:这部分配置定义了OSPFv2(用于IPv4)的路由协议。
ipv4 { export all; }
:将BIRD中的所有路由信息导出到OSPFv2,供其他OSPF路由器学习。area 0.0.0.0
:配置OSPF的区域,这里是骨干区域0.0.0.0
。在OSPF中,所有非骨干区域必须通过骨干区域连接。interface "ens18" { type pointopoint; }
:指定OSPFv2在接口ens18
上运行,并且接口类型为点对点(point-to-point)。点对点类型通常用于没有中间广播域的直接链路。- 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。
protocol ospf v3 { ... }
- 作用:这部分配置定义了OSPFv3(用于IPv6)的路由协议。
ipv6 { export all; }
:将BIRD中的所有路由信息导出到OSPFv3,供其他OSPF路由器学习。area 0.0.0.0
:配置OSPF的区域,和OSPFv2一样,这里也是骨干区域0.0.0.0
。interface "ens18" { type pointopoint; }
:指定OSPFv3在接口ens18
上运行,类型为点对点,和OSPFv2的配置类似。- 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。
生成静态路由规则
- 克隆仓库
- 编辑Produc.py
—next
后的default
参数wg0
为自己的旁路由(旁路网关)接口名称, 例如我的是ens18,就改成ens18。IPv4Network('172.16.0.0/12')
的保留地址,或者替换为172.24.0.0/13
,避免影响Cloudflare访问。原因在于Cloudflare IP Range中包括:172.64.0.0/13
这个地址范围,如果将IPv4Network('172.16.0.0/12')
配置为保留地址,那么Cloudflare所使用的172.64.0.0/13
也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
。- 编辑Makefile
china_ip_list
上游地址,原来的17mon的国内ip地址表太久未更新,存在地址范围错误,无法应对墙中墙(各种反诈劫持)的情况。raw.githubusercontent.com
存在问题(例如本机无法被代理等情况),可以将raw.githubusercontent.com
更换为镜像raw.staticdn.net
- 生成静态路由表
apt install make
进行安装,然后执行:- 确认Bird2状态
systemctl status bird.service
来查看bird2的运行状态:Active
处于inactive
状态,需要手动执行systemctl start bird.service
- 确认Bird2路由表状态
birdc show route protocol static1
查看IPv4路由表,返回结果太多,大概是如图:birdc show route protocol static2
查看IPv6路由表: RouterOS配置
Routing
进行配置 Router ID配置
Routing
→ Router ID
进行配置。 Name自己喜欢填什么就填什么,ID填写RouterOS的地址,Dynamic ID
选择only vrf
,Select From VRF
选择main
,点击OK提交。 OSPF配置
Routing
→ OSFP
进行配置New
新建,填入Name
(自己根据喜好填),也可以默认根据我的来。Version
版本选择2,VRF
使用main
表,Router ID
选择刚刚创建的main
,或者直接输入RouterOS的IP地址。其他不动。Instances,Version
选择为3,其他的一样。Areas
,点击New
新增一个Area
。 Name
随便,Instance
选择刚刚创建IPv4的Instance(Version版本为2),Area ID为0.0.0.0
,Type为default
,其他不用填写。Interface Templates
,点击New
新增一个模板。Area
选择刚刚创建的IPv4的区域,Network Type
为ptp
(点对点,因为我们只有两个点),Cost
为10
,Priority
为32
,其他的不用管。Area
选择IPv6的区域Neighbors
进行节点匹配查看,如果正常的话,应该可以发现Debian(旁路网关)上配置Bird2的节点:IP
→ Routes
中应该可以看到Debian(旁路网关)上Bird2发送过来的状态为DAo的路由表(D代表动态,A是活动状态,o为ospf) 避免路由环路配置
客户端 → RouterOS → Debian旁路网关 → RouterOS → Debian旁路网关…
不断的循环,所以需要对来源为Debian(旁路网关)
的流量进行特殊处理,这里又要用到我们的老朋友Managle。- 首先在
Routing - Tables
新建一个路由表,名为bypass
,并勾选FIB:
- 在
IP → Firewall → Managle
新建规则:
- General
- Chain:
prerouting
- In.Interface:
bridge1
- Advanced
- Src.MAC Address:
Debian旁路由(旁路网关)的网卡MAC地址
- Action
- Action:
Mark Routing
- New Route Mark:
选择刚刚新建的Bypass
- 如果你需要使用IPv6的话,在
IPv6 → Firewall → Mangle
也新建一条一样的规则。
- 配置
Bypass
路由表内路由规则
- 如果发现配置后从旁路由(旁路网关)Ping不通主路由RouterOS或者无法访问,提示
Destination Host Unreachable
或者Redirect Host(New nexthop: 10.0.0.1)
,可以在Dst.Address
添加一项局域网地址范围,例如我的10.0.0.0/24
,并点击前面空白方块出现“!
”,即目标地址不为局域网地址的流量。这样旁路由在使用Tailscale时候也可以正确的访问局域网内其他设备。
bypass
路由表进行路由,默认这个表是空的,也就是无法对流量进行路由,所以会断网,我们需要添加一些默认的规则进去,基本照抄main
表的默认规则就行:- 新建IPv4局域网路由规则
Dst.Address
: 局域网IP地址范围,如果你是主路由是192.168.1.1
,那么这里写192.168.1.0/24
Gateway
: 填写网桥地址,例如我的是bridge1
,也是RouterOS建立网桥时默认名字Distance
:1
Routing Table
:bypass
- 新建IPv4广域网路由规则
Dst.Address
:0.0.0.0/0
Gateway
: 填写PPPoE拨号接口名称,例如我的是pppoe-out1
Distance
:1
Routing Table
:bypass
100.x.x.x
),可能需要手动添加一条指向大内网网关的路由规则。 由于每次拨号后IP地址会变,运营商内网的网关也会变,所以需要使用RouterOS的脚本进行定时检查和修改:- 新建IPv6局域网路由规则
Dst.Address
:fe80::/64%bridge1
Gateway
: 填写网桥接口名称,例如我的是bridge1
Distance
:1
Routing Table
:bypass
fe::
f*::
的内网路由规则添加进去- 新建IPv6广域网路由规则
Dst.Address
:::/0
Gateway
: 填写PPPoE接口名称,例如我的pppoe-out1
Distance
:1
Routing Table
:bypass
🤗 总结归纳
Address List
方式,因为是直接查询路由表,不用对目标IP进行取反匹配,而且不用对所有流量进行mangle标记,仅需要对来源旁路由的流量进行标记处理,在系统性能占用上会少一些,同时也可以开启RouterOS的fast forward
功能、fast track
功能以及fast path
,进一步降低CPU对流量处理所需资源,N4100在Fast.com
300M跑满时CPU占用30%左右,内网2.5G跑满CPU占用不到10%。而且避免了旁路由(旁路网关)挂断之后国外网站完全无法访问的情况。 📎 参考文章
OpenWRT从Hper-V迁移至PVE指引
📝 迁移过程
导出Hyper-V虚拟机
右键
→ 导出
,选择存放位置。Snapshots
、Virtual Hard Disks
、Virtual Machines
,OpenWRT的虚拟机VHDX磁盘位于Virtual Hard Disks
内,例如我的immortalwrt的VHDX为:immortalwrt-23.05.3-x86-64-generic-squashfs-combined-efi.vhdx
,为了便于之后转换和导入操作,可以修改为短一点的名字,例如openwrt.vhdx
,这样在后续输入命令的时候,能够少打点字,同时也减少因为输入名称错误带来的无法导入问题。 上传VHDK虚拟磁盘到PVE
在PVE上新建虚拟机
- 如果是
EFI
镜像,需要在BIOS中选择OVMF (UEFI)
,其他镜像选择默认的SeaBIOS
即可。
- 添加网络设备时,需要修改MAC地址为原来在Hyper-V下OpenWRT所使用的虚拟网卡MAC地址,这样可以避免大多数问题,但是例如Zerotier这种需要完全匹配设备信息的,需要单独进行调整:OpenWRT迁移后Zerotier无法连接的解决方案。
- 不需要添加硬盘和磁盘。
将VHDX磁盘转化为qcow2格式
-O qcow2
:导出格式为qcow2openwrt.vhdx
:源磁盘镜像文件名称openwrt.qcow2
:导出的磁盘镜像文件名称 挂载Hyper-V虚拟磁盘镜像
101
:刚刚新建的PVE虚拟机的VM ID,也就是那个序号。openwrt.qcow2
:刚刚我们转换完的磁盘镜像。nvme
:存储卷名称,例如local
,或者你所添加的其他存储名称。--format=qcow2
:将磁盘以 qcow2
格式导入
导入完成后,在PVE GUI面板,选择创建的新的OpenWRT虚拟机,选择【硬件】,双击未使用的硬盘,然后点击添加,就实现了磁盘由Hyper-V到PVE的完整迁移。 🤗 总结归纳
软件 | 情况 |
OpenClash | 正常 |
MosDns | 正常 |
AdGuard Home | 正常 |
DDNS-GO | 正常 |
Zerotier | 正常 |
Prometheus Exporters | 正常 |
Qos Mate | 正常 |
📎 参考文章
OpenClash替换使用Mihomo内核
📝 付费内容
Mihomo内核介绍
Mihomo功能介绍
代理模块
- 支持多种出站传输协议,如VLESS XTLS、Trojan XTLS和Hysteria。目前对WireGuard的支持情况并不是很好,具体可参考[Bug] clash verge1.6.6,使用v.18.5内核连接到wireguard服务时连接失败,但是使用wireguard或者使用非mate内核连接正常 · Issue #1355 · MetaCubeX/mihomo (github.com)
- 实现了基于TCP握手机制的主动健康检测(如urltest/fallback)。
- 支持Relay代理链和TCP连接并发。
规则模块:
- 全面的规则支持,包括GEOSITE、GEOIP、入站类型规则IN-TYPE和规则集RULE-SET。
- 支持SRC-PORT和DST-PORT的多条件、TCP/UDP的分别控制、网络类型匹配(TCP/UDP)、PROCESS-NAME匹配等。
- 逻辑判断规则(NOT/OR/AND)、子规则集、所有规则的源IPCIDR条件。
- GEODATA MODE切换(mmdb/dat)和GEODATA LOADER模式切换(普通/小内存模式),适用于各种设备。
DNS模块:
- 包括域名嗅探器Sniffer、使用Geosite的Fallback-Filter和Redir-Host远程解析。
- 支持使用代理解析IP和DNS over QUIC。
TUN模块:
- 支持macOS、Linux和Windows平台。
- 内置iptables和Wintun驱动程序,无需手动配置。
- 支持gVisor/System堆栈以及Mix堆栈(混合堆栈)。
Mihomo新增功能
- 增加HTTP/3 DNS支持(H3的速度真的很快),包括是否优先使用DOH的HTTP/3以及指定DOH服务器强制使用HTTP/3
nameserver-policy
规则:优先于nameserver
及fallback
的dns进行解析,可以在规则中通过GEOSITE
分组进行DNS指定,增加DNS解析规则灵活性。但由于nameserver
与fallback dns server
同时请求的原因,并不能解决DNS泄露问题。
fallback-filter
规则:支持GEOIP
及GEOSITE
匹配
proxy-server-nameserver
:指定解析节点所使用的DNS服务器
- 增加
PROCESS-NAME
进程匹配,软路由上可匹配本机进程
- 增加
PROCESS-NAME-REGEX
,使用进程名称正则表达式匹配
- 增加
PROCESS-PATH-REGEX
,使用进程路径正则表达式匹配
- 增加
SUB-RULE
子规则
- 支持
gVisor
和System
的混合堆栈,tcp使用system
栈,udp使用gvisor
栈,使用体验可能相对更好,同时稳定性也有保证。
- 支持流量转发隧道(Tunnel)
OpenClash替换Mihomo内核方法
- 首先确认你使用的是OpenWRT及OpenClash,并对自己将进行的操作目标有所知悉。下述操作的系统为X86-64架构,OpenWRT版本为ImmortalWrt 23.05.4。如果担心出现不可恢复的问题,可以先备份虚拟机或OpenClash整体配置。本篇内容也适用于OpenClash内核更新失败的手动解决方案。
- 通过SSH登入OpenWRT,并进入OpenClash的核心所在文件夹:
- 备份原来的meta核心:
- 下载Mihomo核心,从https://github.com/MetaCubeX/mihomo/releases 选择版本和自己路由器架构的核心包,并复制链接地址,替换下面命令中的地址,X86-64用户选择
mihomo-linux-amd64-compatible-go120
后缀即可。
- OpenWRT网页端进入OpenClash,点击
插件设置 - 版本更新
,查看[Meta]当前内核版本是否为v1.18.7
,如图所示
- 如果显示为当前下载的内核版本号,即表示替换成功。重启OpenClash即可生效。不要再点击检查并更新了。
🤗 总结归纳
v1.18.8
版本更新了,可以更新起来了。但是WireGuard的问题还是没有修复。 📎 参考文章
风记得的第1678天星辰:告别2024、鱿鱼游戏2、44岁脑瘤
告别 2024
就在刚刚,我们在 2025 年度过了 3 天!这时间如千金散去,却复不来,挥霍却道,烟火罢了。回顾这 2024 年,似乎无可作为。那天,我看到一个人走在人行横道。今天,我又看到了他。越来越感觉每天固定时间上班,就像是激活了 NPC 的任务刷新。像是在游戏中到了固定的时间,NPC 出现在固定的位置。不睁开眼睛,看不清世界。这条充满烟火味道的视频就是生活指南,抖音需要充满这些正能量视频,点赞
阿锋的结语令人意味深长,掌握自己的生活,需要太多的能量。就像有时候写一篇博客,明明不是很累,但难以提笔去写。这时候,就缺少了一种干劲 —— 也就是需要补充能量。每个人补充能量的方式不太相同,我也在一直寻找如何获取这种能量。像那种通过获取短期快乐的能量,就如同冬日里手机右上角的电池容量,100% 中看不中用。通过沉侵在书籍中获取的能量,又无法完全应用到实际中,若加以太多的思考,开始苦苦追寻世界的本质,最后进入自寻烦恼的归途,最终还是要回归的生活本质。
鱿鱼游戏 2
这种第二部永远无法超过第一部的魔咒发生了,我一直都很喜欢看这种探讨人性的片子,显然第二部在这方面有所体现。但相比第一部的经典桥段,有些差之毫厘。我看到了一个很有趣的豆瓣评论。
44 岁脑瘤
当时在朋友圈看到这条信息的水滴筹链接时,倒是没什么惊讶的,这几年经历过的人生疾苦快可以写成一篇小说了。如果要说这件事,则是给这篇小说增加更多的元素。
—— 妈妈,舅妈得了脑瘤?
—— 是啊,在脑干有一个良性肿瘤,11 月做了手术
—— 那怎么到现在不仅没好,还住进了 ICU?—— 手术后,无法完全清除,说后续还需要化疗。手术 15 天后,就转到了康复中心,然后发生了感染。差点没抢救过来,现在每天打着 1200 元/天的进口药。看你忙,就没和你说。
舅妈家不太富裕,当然我也不富裕 如果没有朋友圈那条水滴筹的链接,在最坏的情况下,恐怕只会在入葬那天知道这件事了。同样是别人做手术,很顺利地慢慢康复。到咱这,非得多一些折磨。麻绳专挑细处断,厄运专找苦命人。要说亲戚关系远近程度,这是我亲舅妈,没有那复杂的一环又一环。只是由于家里一些“大人们”的处事方式,让我们之间的感情浅薄。俗话说:真姑妈,假舅妈,半真半假是姨妈。若真讲那种道破人性的话,有时候甚至连亲生父母也会做出无法想象的事情。所以,无需考验人性,它经不起考验。但对于我来说,共情能力强于常人。即使感情淡薄,但我亦然揪心,只是善大力小,为之叹一口气。
那天妈妈除了说这件事,还和抱怨 14 岁表弟。表弟在一些行为上没有很关心他的妈妈,他妈在 ICU 里说想孩子(ICU 不能随便进入),录一个视频有些冷淡,最后还和他爸吵一架,看着太让人生气。具体情况我不知道,我说可能 14 岁太小了,还不懂事。我妈反驳我,那可不是,之前我得过敏性紫癜的时候,你 12 岁放学后还想着每天来问我呢。最后我虚弱到昏迷了,家里没人管,要不是你每天问我看到那天昏迷了,及时送医院,说不定就没了。
言后,片刻沉默。只叹得,幸甚今安在。
第 1678 天结语
多喜乐·长安宁
二〇二四年十二月总结,错过不一定是永远
出门的动力越来越弱,更不要说长途骑行,12月已经结束,秋天注定错过。杉树要变红,银杏要变黄,季节交替产生的美不会永久停留。
在小区公园的草地上,我捡不到一片完美的银杏叶,不是颜色发青就是叶片有破裂,树上的银杏叶看上去也不怎么好。此时公园里的红枫最为抢眼,虽然个头不大,但血色一样的红火,尤其是阳光照射下显得格外耀眼。
近日上海最低气温到零下一两度,这才感觉到了冬天的冷。印象中零下两三度已是上海的极限,冬天雨水少看到雪飘更是少之又少。
1月28日除夕开始放假,领导早早问我们假期的计划。是啊,外地人忙着回家,本地人忙着旅游。我在思考是提早几天回家还是晚几天来上班。
冬季骑车
虽然没有封车,但是骑车的次数减少了,骑车里程也就少了,回看12月的骑车数据全是通勤。单趟11公里,不怎么出汗。这个冬天也不想着提升突破,能维持体能就行,希望明年春天以后能突飞猛进。
看看数据,12月总里程311.77公里,运动总时间13小时52分离12秒,运动均速22.48km/h,骑行29次。
总里程 | 311.77 |
总时间 | 12:52:12 |
骑行次数 | 29 |
月均速 | 22.48km |
虽然上海的冬天算不上冷,但是保暖装备必不可少。头套戴好再带上头盔,冲锋衣穿好,防风御寒。
老姐家局部装修
上个月末,老姐签了局部装修的半包合同。把家里的两个卫生间、一个厨房和一个房间拆除后重新装修。虽然装修事宜已经提了很久,但是最终下定决心采用局部改造实属无奈之举。此时装修临近年关,找了几家装修公司都表示有些活要过年后才能完成,工人过年前回家比较早会影响工期,比如油漆、定制柜要等年后才能安装。
开弓没有回头箭,就这样动工了。拆旧,砸墙,砌墙,粉墙,水电管路铺设,卫生间做防水,现在正贴瓷砖。虽然提前做了预算表,但总计金额已经远超预期,装修材料、家用电器的价格越看越高。
局改最头痛的是施工师傅为了不破坏其他设施绞尽脑汁,尤其是水电线路改造。
错过不一定是永远
工作与生活的轨迹按部就班,两者从未交织,但生活的轨迹总是曲曲折折,一会儿往东一会儿往西。生活的选择实在太多,每一次选择注定要错过另一种生活。
我不太善于选择也不想选择,但是我更想控制生活的轨迹,希望这一路看到的风景感受到的喜怒都由自己说了算。事与愿违,行与做总会偏离设定轨道,生活磨平了棱角。慢慢得明白了无法经历所有的生活,而有些错过的生活会在不经意将来再次出现,就像地球的东边是西,地球的西边是东。
2025年震撼来袭:你准备好了吗?
又是一年新旧交替时,站在时光的门槛上,回望这一年的旅程,心中充满了感慨。这一年,我们每个人都是自己故事的主角,有的充满欢笑,有的带着泪水;有的硕果累累,有的略显失落。但无论如何,我们都勇敢地走过了这段旅程。(嗯,这段网上抄的)
在这个迟到的新年时刻,我想对你们说:感谢你们,感谢这一年的陪伴和支持。虽然我们可能素未谋面,但在这片虚拟的天地里,我们有着共同的语言——博客,这也是我为数不多的爱好之一,也是我坚持最久的爱好之一。
年末的忙碌几乎让我忘记了新年的祝福,但在这里,我要大声说出:祝大家新年快乐呀!愿新的一年,我们都能拥有更多的欢笑和收获。
元旦后的第一个工作日,进入办公室就被同事的咖啡香唤醒,感觉整个人都充满了活力。中午,大家一起吃了美味的手枪腿,也是对新一年的美好祝愿——希望团队能够蒸蒸日上。
新年这几天,朋友圈里,好友们纷纷晒出了自己的“年终总结”,我也忍不住加入了这场“晒总结”。
[img][/img]
今年的跨年夜,没有了往年的喧嚣,大家都没有聚在一起,或许是因为大家都在忙碌中找到了自己的节奏,但那份对新年的期待从未改变。
在元旦前的半个月里,我几乎把所有的业余时间都投入到了 Typecho 插件的折腾中。一切始于偶然发现的古老插件 [t github.com/tennsinn/TeWords]TeWords[/t],原本只是想简单地修复一下兼容性问题,但谁知道,一折腾就是大半个月。果然代码的魅力就像美女,一旦碰了就难以自拔。
原本的简单修复变成了一场折腾风暴,改得越多,想法也越多,最终完全停不下来。[t demo.jdeal.cn/time]插件效果展示[/t] 当然,当我写下这篇文章的时候,我已经暂时放下了 (因为新的一年,时间变得更加宝贵) 嗯,当然不是,是因为年底开始忙了,哈哈。
希望在2025年,我们能继续保持对生活的热爱,对新鲜事物的探索热情,继续创造不一样的故事。也希望友链圈的小伙伴们能一起坚持,一起加油,共同迎接新的挑战!