普通视图

发现新文章,点击刷新页面。
今天 — 2025年1月18日技术

针对我昨天的言论被使者同步给开发商这件事儿做一些回应

2025年1月19日 02:54
如要阅读全文,点击标题跳转。我们的房子在24年年底交付之后,出现了一些问题,然后不少业主开始组织到售楼处讨说法,但事实上很少有人主动梳理大家遇到的问题有哪些,以及主动推动封窗方案的统一。我于是在群里,引导大家往这条路上走,在当晚,收到我的销售顾问的电话(当然她很好,没说什么,也是受到上级压力,例行公事),于是我知道,一定有人在把群里消息给开发商同步。于是,我将计就计,敞开胸怀,写了下边的内容,分享在群里。随后受到广大业主的认可与赞许。

如何让网站在微信端打开时不显示谷歌广告?

2025年1月18日 12:26

问题的起因是我写文章通常会在公众号和网站同步发布,并且顺便把公众号的 阅读原文 填上自己的网址原文链接,但比较坑的是,今天已经是第二次被微信禁用网址了,虽然这次被禁的网站和上次不同,但总归还是很烦人的。而且用户点击链接看到下图的提示,不免让人觉得很不靠谱。

上一次被禁的是 老朱工具箱,我确定网站里面没有任何违规的内容,后来一想应该是谷歌广告的问题,随后就把广告去掉了,然后申请解禁,果然就通过了,解禁后又重新启用广告,这么长时间好像也相安无事,没有再出什么问题。

而按理说,我的博客网站从微信过来的流量要远大于工具箱网站,但至今也没有被禁过,也不知道微信内部的检测规则是什么样的。今天被禁的是 一起学笛子 这个网站,本来也想着用老办法解决的,但想来后续不知道啥时候又会被禁,这样反反复复就没完没了了。

[...]

昨天 — 2025年1月17日技术

DMIT 多款美西 3 网优化的 VPS 补货了,年付仅需 39.9 美元起!

2025年1月16日 22:59

还是先简单介绍下 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的图片上传到图床的上传工具

2025年1月17日 10:19
这篇文章介绍了一款名为PicList的图片上传工具,它被视为PicGo的替代品。文章详细说明了PicList在主界面设计、功能扩展以及用户体验上的改进,例如支持快捷键设置、一键从PicGo迁移以及无缝对接现有图床配置。同时,PicList提供了重命名功能和上传前自动转换图片格式为WebP的插件。此外,文章还提到PicList兼容最新版Typora,并强调避免与PicGo的Server服务冲突的设置步骤。总体来说,PicList是一款功能丰富、持续维护的高效工具,适合有图床需求的用户。
昨天以前技术

EasyTier组网续

2025年1月16日 21:39

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教程

2025年1月16日 16:14
这篇文章介绍了如何在不同操作系统上安装和使用 FFmpeg。文章详细说明了在 macOS、Windows、Ubuntu 和 CentOS 上安装 FFmpeg 的步骤,包括使用 Homebrew、APT、YUM 或手动下载的方式。每个操作系统的安装过程都配有具体命令,并提供了验证安装是否成功的方法。此外,文章还介绍了 FFmpeg 的基本使用方法,如转换视频格式和提取音频,为用户提供了简单易懂的指南,帮助读者顺利安装并使用 FFmpeg。

如何使用ffmpeg处理ProRes视频进行视频旋转?ProRes视频旋转教程

2025年1月16日 15:48
这篇文章介绍了如何使用FFmpeg处理ProRes视频进行旋转。文章首先分析了ProRes和H.264的编码差异,解释了为什么ProRes视频在旋转时需要重新编码,而H.264则通过修改元数据就能实现旋转。然后,作者提供了FFmpeg的命令行操作方法,通过指定旋转参数和输出格式,来实现ProRes视频的旋转,同时保持视频质量。文章还解答了常见问题,如旋转后文件大小变化,并提醒用户如果需要固定码率或编码格式,需额外设置参数。

memoo双栏主题

2025年1月16日 13:10
memoo基于默认主题修改的typecho双栏主题

memoo

这是一个基于Typecho默认主题的微调版,保留了Typecho原汁原味的设计,同时有满足了当前大屏当道的现状。

演示

{button href="https://demo.typecho.work/?theme=memoo" type="blue"}在线预览{/button}

下载

布局改动

Typecho默认的主题,在屏幕的两侧有大量的空白,现在计算机屏幕分辨率都非常高,默认的外观对高分辨率不友好。
当前主题采取尽量占据整个屏幕的设计理念,尽可能的占满整个屏幕。
页面使用双栏布局,内容和侧栏比例为8:4。

位置改动

“上一篇”和“下一篇”的位置,由页面底部调整到了紧挨着文章内容的下方,同时将上下布局修改为了左右布局,更符合使用习惯。
评论表单由原来的页面底部提升到了文章内容下面,在评论列表的上方,阅读完文章内容之后,就可以立即评价。
将评论列表放置在了页面的最下方。

样式改动

为了更符合中文阅读习惯,本主题将字间距调大了(1.5px),要不然中文过于紧凑会提高阅读难度。
同时,将行间距由原来的1.5调整为现在的1.8,进一步提升文字之间的间隔,提高可读性。
最后,将搜索框的长度由原来的内容的四分之一,调整为当前的三分之一,更加修长。

AfterEffect导出的颜色偏灰偏暗解决方法,渲染的视频播放时颜色不正确

2025年1月15日 15:08
这篇文章介绍了在After Effects中导出视频时颜色偏灰偏暗的问题,并提供了解决方案。作者指出问题可能源于色彩管理设置不当,并建议在项目中依次选择“编辑 > 项目设置 > 颜色设置”,将颜色空间调整为适合的选项,如Rec.709,并将位深度设置为8位。通过这些设置调整后,导出的视频颜色可以被播放器正确识别,从而避免颜色失真问题。

Tbeautify

2025年1月15日 11:04

Tbeautify

十大特效美化插件,简称:Tbeautify。 包含春节灯笼,网站置灰,鼠标点击效果,悬浮音乐播放器,看板娘等诸多特效!

使用方法

  • 下载本插件,放在 usr/plugins/ 目录中,文件名命名为Tbeautify
  • 登录管理后台,激活插件
  • 开启你所想要的网站特效

下载

身心脆弱的时候守藏

2025年1月14日 07:01
如要阅读全文,点击标题跳转。最近流感高发,我也不幸中招,然而我感知到自己可能感冒了竟然已经是在感冒了两三天后,可见感冒的确来之隐匿。在老家的时候,我已自感嗓子的火上来了,于是在镇上抓了三天的药,医生说你这火已经很大了,为了能够彻底拦住,再给你开两天的中药配合着吃,于是中西结合,我抓了一大包药,这个医生的药吃了之后特别容易困,而且我每次吃了之后,就会内里郁积,继而引发顽固性打嗝。于是在接下吃药的两三天里,我始终不算是一个舒服的状态,但好在嗓子上火对应的症状随着吃药也在逐渐好转。我仍在上班,顽固性打嗝让我不太能体面地任性工作,于是我的一部分精力就分配给关注自己的打嗝上,尽量打出来是一个闷嗝,而不要是一个响嗝。谢天谢地,我的工位是一个角落,从而让我偶尔打出响嗝的时候,不至于太过尴尬。另一方面,我也积极地在角落里把之前积累过抑制打嗝的偏方付诸实践,偶尔有效,偶尔失效,我发现,失效的那些,除了打嗝自身已耐受偏方的因素之外,极大的可能性是自己没有认真实施偏方的步骤。我的顽固性打嗝随着两天后用药的停止,而逐渐消失,我以为我应该可以把精力投注在工作当中了,然而我却忽然发现,我的精神无法集中了,就连我的视力也变得模糊了,这个时候,上火的症状似乎消失,咳嗽,起浓痰的症状略有加重,一开始我以为这是上火症状的延续。连续两天的工作无法集中精力,让我恍然意识到,我可能是感冒了。不知道这是否是一个正常情况,第二天起来,我的视力模糊的情况有所加重,我想,高度近视可能大概就是这个样子吧,只能聚焦看眼前手机电脑上的东西,再远一些,就全都是模糊一片,这种感觉实在不好受,我担心这会不会是一种病变,我担心一向令我骄傲的视力不会再恢复了。无法集中的精力使我无法进行工作,我开始变得畏难,遇到稍微困难一些的工作项,我从一开始就在心里打退堂鼓,然而这在我健康的时候,是完全不会发生的情况。好在,这次感冒始终没有发烧,让我的痛苦没有那么深重。可能有很多人得了感冒之后就像没有感觉一样,然而最了解我的老婆深知,一米八高的我,魁梧强壮,然而一旦遇上感冒发烧,则瞬间如霜打了的茄子,精神全无,气力全无,浑身瘫软,仿佛像是得了致命的大病。我变得畏难,不愿转动脑筋,遇到需要思索的事情,就想逃避。于是,这两天需要交际的,需要认真思索分析的,我都一一规避,不挂心上,守藏住脆弱的躯体,关注于饮食和睡眠。这几天我都是晚上八九点就睡下了,竟也都长长地睡了一整夜,周五也早早下班,去药店买了些止咳祛痰的药,便回到家中,周末大多数的时间都是在床上躺着,元气也在逐渐恢复。担心眼睛在这个时候比较脆弱,于是周末也不玩手机与电脑,放下光阴虚度的自责,躺在那里听播客。经过休养,我终于慢慢感觉精神恢复到了九成,视力也渐渐有所恢复了,看远处的东西不再是模糊一片,虽然也并没清晰可见,想必是需要多一些休息,过几天就能恢复了吧。

Weekly #24:职规大赛历险记

2025年1月13日 19:45

本周回学校参加了「湖南省第二届职业生涯规划大赛」,一周都在忙这个事儿。

🌇 封面图:后湖烟花

后湖烟花

虽然最近新加了一块「禁止燃放售卖烟花」的告示牌,但后湖售卖烟花的小摊小贩仍然不少。每天路过都能看到烟花绽放。

这或许就是属于长沙的松弛感 😎。

🤵 职业生涯规划大赛

TL;DR:如果你所在的学校对该比赛没有激励政策(如竞赛保研),强烈不建议浪费时间参加这个比赛。快跑!

  1. 没有任何激励。无奖金。无奖品。甚至连荣誉证书都没有打印。
  2. 这是 PPT 演讲比赛,并不是职业生涯规划比赛。真正有能力的人,玩不过那些专门搞演讲、专门搞 PPT 的人。
  3. 这是一个非常「体制内」的赛事。例如,可能需要依靠学校相关领导的「运作」,答辩需要有较强的说「场面话」的能力。

之前阴差阳错地被辅导员拉过来参加了这个比赛,为了帮她完成「上面派下来的指标」。本以为做个 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 😰(背对着屏幕)。花了一下午和一晚上确定了稿子,又花了一下午和一晚上对着 PPT 脱稿排练,最后总算达到了比较熟练的状态。已经很久没有背这么长的文字了……

本次比赛的评委提问都比较尖锐。在候场室观赛时,有选手介绍了多项项目经历,评委就问道:「这个项目你负责了多少?你现在是大三,也就是 2022 年入学的。我查了你的项目 2023 年 X 月份就结项了,也就是说你大一就主导了这个项目?」而在我前面答辩的一个女生的职业目标是财务领域,随口说了一句和区块链有关的项目,被问「区块链是什么」,支支吾吾答不上来。据说,许多选手的项目经历存在包装的成分……

我自己现场的发挥(我自认为)还是不错的,演讲部分没有卡壳,答辩部分发挥得也尚可。幸亏我的项目都是自己的,被问到也能答出个所以然。尤其是观察了前几位答辩支支吾吾的表现,我的答辩环节自信了很多。

第一位提问的评委似乎是湖大的老师或领导(事后老师告诉我),问我「学校能带给我什么资源」。我对这个问题并没有准备,回答的大概意思是校友、老师、科研平台等资源。赛后老师告诉我,这位评委其实是在递话,他想让我说的是 HNU 依托国家超算中心之类的平台,想要借此拔高一下 HNU,结果我并没有 get 到……这就是我所缺乏的说「场面话」的能力 😇。

🎒 大学辅导员的工作日常

这周接触得很多的就是辅导员。带我参加比赛的超会做 PPT 的曦姐,当班导时就接触过的同为 INFJ 的刘王老师,咱们的辅导员标准 P 人冯导,以及隔壁工管院的活力满满的在工作之余还同时运营着自媒体搞点副业的韦子夏老师 @夏与葡萄园 等等。感觉辅导员也是很有意思的职业。

辅导员是所有学生的负责人,我们平时有事都会去找他们。然而,有时他们也会和我们一样经历焦虑、迷茫、无助。其实之前当班导的时候我也有类似的感受:「遇到了困难希望有大人过来帮忙解决」-「意识到自己就是那个大人」……让我印象最为深刻的就是某一晚,某个学生的「突发情况」,不仅让刘王老师不得不加班做工作,还面临了一些两难的抉择。如果是我,也一定会备感压力。

他们也会有同事之间的不愉快,有时作为体制内的角色也会身不由己。

当然,网络舆论有时并不善待辅导员这一群体,因为某些学校的某些辅导员(或者其实是校领导)的所作所为确实令人不愉快。我认为本质上是制度没有有效约束辅导员的权力。

而很幸运的是,我遇到的辅导员都是很好的人。

下周见~

Cloudflare/Vercel项目推荐(3)

2025年1月14日 00:31
前面发布了关于 Cloudflare 和 Vercel 项目推荐的文章,收到了不少好评,许多小伙伴因此找到了实用的工具。因此,我决定将这一系列内容长期更新。考虑到 Cloudflare 和 Vercel 等 Serverless 平台有许多通用之处,这次将二者的推荐内容合并在一起,希望对大家有所帮助!

如何提取英雄联盟资源文件:获取lol客户端图片、技能图标、皮肤原画

2025年1月13日 16:03
这篇文章介绍了如何提取《英雄联盟》客户端中的资源文件,包括技能图标、皮肤原画及英雄模型等内容。首先安装Obsidian并关联游戏文件夹,然后通过搜索关键词查找所需图标或音频资源。文章还分享了提取皮肤和导出模型的方法,包括选择目标皮肤数据、使用Lol2dae工具转换文件格式、加载纹理等详细步骤,帮助用户将游戏模型导入3D软件进行进一步处理。

说说:#1736752636

2025年1月13日 15:17

听说《最终幻想7重生》马上就要上架pc了,正好玩玩7re。呜呜呜还是原汁原味的最终幻想玩法,玩起来真的开心啊!!玩过了第三章,不舍得玩了,留着慢慢玩嘿嘿

{cat_gallery}



{/cat_gallery}

年更话题:春运 12306 怎么抢票

2025年1月13日 10:21

又双叒叕要春运了,又要开始和其他人在 12306 搏斗抢票了。
基于多年的 12306 抢票经验,总结了一些抢票小技巧,希望能帮到你。


关于火车票的基础常识

  1. 携程,管家,分流最终还是用你的12306账号去12306给你买票的。分流比较纯净,携程那可是能干出往你账号里添加不认识的人,然后用你的账号给其他人抢票的事情的。亦或者广州到重庆没票,给你买个广州南到佛山西,但是APP内已完成订单最大的字写的是《广州-重庆》让你以为你买到了全程票,你上车后才发现7个小时的车程,实际有座的区间只有20分钟的抽象事。

  2. 12306 放票不是完全整点,可能会早2~3秒,所以别卡整点刷新。(因为网页和APP显示的时间是你设备的时间,并不是真·北京时间)

  3. 如果你发现 12306 放票后,该车次直接就没看到票,这不是被人秒买走了,而是你的区间没开始售票。如果你这个区间售票,你肯定能看到票。

  4. 提交候补也是有排队的,是按你交钱的时间算的,未来有票了,谁先交钱先给谁票。

春运 12306 火车票的售票机制

  1. 开售后 12306 只放出始发终到(始发站到终点站)和始发站到部分大站的票。也有可能只放出始发终到的票。(少部分车票会放给线下)
  2. 如果选择的区间开始售票了,那么12306 在1~2分钟内都只返回一个缓存结果(每个缓存CDN结果不一样),期间查票 12306 不会去后端查询余票数量,返回的都是缓存。只有在提交订单时,后端才会真实的为你查找车票余票情况。
  3. 如果有票 12306 开始对提交者排队,此时 APP 用户会优先于网页用户。
  4. 如果什么票都没看到的话说明:12306 就没放票! 12306 就没放票! 12306 就没放票!
  5. 你要是狂刷新(间隔小于2秒),持续超过15~30秒,你的IP会被拉黑,查什么都随便返回一个缓存。
  6. 对于乘车区间在预填单试点范围的,优先满足提前填写的人。
  7. 12306 等大家提交候补,谁先交钱谁先排上队。
  8. 在距离开车还剩7~12天时,逐步开售中间车站的票,在服务器空闲时段,优先根据候补订单付款顺序完成订单,但会留出部分余票会按比例放到 12306 和 车站与代售点。

正确的 12306 抢票流程

  1. 最好准备2个挨着的出发日期
  2. 查询出发城市的起售时间
  3. 12306 做了一个叫 “购票信息预填” 的功能。在车票起售当日,可以在起售时间之前预先填写乘车人、车次、席别等信息,在车票开始发售时,一键提交订单。
  4. 开售时刻刷新几次后,发现目标车次直接无票,说明今天不放票,马上提交候补并付款,候补是按付款时间算的,所以你付款的越早排队越靠前。
  5. 然后,尝试买长乘短。也就是尝试将到达地往后边的大站选。
  6. 如果买长没戏或者太亏,可以尝试买短,也就是到达地买到前边几站,上车后补票。
  7. 如果还没票,还可以从出发地的上游大站开始买,但此种方式购票前,请确定你所在城市的车站会让你进站…有些认死理的车站可能会以非本站车片为由不让你进站乘车。
  8. 如果这还没戏,不如去看看空铁联程,这年月飞机票很便宜的,搞不好算上机场建设费,燃油附加费,比卧铺都便宜。

一些春运抢票乘车小技巧

  1. 候补票的兑现顺序是按你的支付时间算的,所以起售第一时间抢到的候补,也要在第一时间支付。
  2. 抢了候补,也还是要刷票的,出于公平策略,每次兑现一批候补时,也会放出一部分直接购买的票。除非你是第一批候补兑现集团内的,不然一定会出现候补没兑现,结果自己买到票了。
  3. 如果全程秒无,那就是没放票,因为12306的缓存机制,哪怕只有1张票被放出来,也会在1~2分钟内一直看到这张票,而不是秒无的。
  4. 如果你有可挂机的电脑的话,分流抢票很好用的。
  5. 12306 官方 APP 手动抢是优先级最高的购票渠道。携程、分流、木鱼等抢票都是基于 12306 网页版的,目前网页版是降权状态。所以即使你使用了分流/携程的定时抢票,放票的时候也请使用 官方 APP 手动抢票。
  6. 如果你的乘车区间在预填单试点范围(京津、江浙沪、广东 – 四川、重庆),强烈建议使用!
  7. 支付宝铂金、钻石会员可以兑换高铁贵宾厅特权的,春运可能会限制部分特权,比如可能没小零食,时长从3小时变成1小时,但是走贵宾厅是可以提前检票的,不用人挤人的拖着行李在站台狂奔还是很舒适的。(可以带1个6岁以下的儿童的)
  8. 如果有65岁以上老人同行,或者你恰好需要轮椅,12306 APP内申请重点旅客,可以享受优先上车优先下车的待遇。
  9. 请提前足够长时间到车站候车…春节人多,意外变数也更多。除非确定能接受迟到导致无法乘车的结果。
  10. 不要同时打开同一个 12306 账号的网页和APP! 虽然这俩确实可以同时登陆并打开,但如果你这样做购票排队时很可能会被降权放在队伍末尾。(如果你用了木鱼/分流/携程,就不要再打开你的12306 APP了,除非你已经下好订单就剩付款了)
  11. 基于上一条和第五条,应该用账号A在携程、分流、木鱼等抢票软件内抢票。再使用家人的账号B在 APP 上手动抢票。而不是在网页和APP内都是用账号A。

The post 年更话题:春运 12306 怎么抢票 appeared first on 秋风于渭水.

批量提交BT种子到Aria2下载

2025年1月12日 21:35

概况

家里的NAS是我主要文件存储系统,Aria2作为日常常用下载工具也一同部署在上面。

该Aria2以docker容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过openwrt对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把Aria2设置为直连方式下载。

aria2NG
aria2NG

直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到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 + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。

新增快速指令1.png
新增快速指令1.png

按照下图方式创建快捷指令内容

新增快速指令2.png
新增快速指令2.png

参考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权限。

新增快速指令3.png
新增快速指令3.png

最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。

新增快速指令4.png
新增快速指令4.png

完结

到此,所有配置已完成。只要下载bt种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到aria2进行下载。同时会把下载目录中对应的种子清理掉。

大伯走了

2025年1月13日 03:51
如要阅读全文,点击标题跳转。2024年元旦,我调休了几天假期,得以在老家办一些事情,不想却遇上了大伯的事儿,于是刚好人在家里,能够顶当上去,把事儿过渡过去。在12月11日,当时中午我刚吃过午饭,接到大哥打来的视频电话,了解到原来大伯在南阳做了一个手术,是腰部长了一个肿瘤,在南阳中心医院做了切除手术,手术效果不错,大伯恢复的也不错,因为医院信号不太好,视频中没说太多话。后来了解到,当时大概在医院住了一周多,然后就出院回家了。12月27日我回到家里,忙了两天事情,在家里时,母亲就告诉我,大伯从南阳回来之后,一直有发烧的情况,这两天在是你大娘用三轮拉着他去到镇上输水,你抽空了去看看他。我记在了心里,想着抽个时间去看看大伯。30号中午的时候,母亲说大娘让我去帮忙看看电三轮的钥匙,可能是坏了关不上了。我于是来到了大伯家,看到钥匙的锁芯断掉了,于是跟大娘说吃过饭之后去换一下锁芯就好了,现在关了反而骑不走了。这事儿说完,大伯在院子里坐着,我找个凳子搬过来,也坐在他旁边聊起天来。通过和大伯的聊天,我大概了解了一些他这次生病的情况,大约一个月前,还在南阳牧原干活的时候,他感觉到背部非常疼,当时在厂里弄到了药,吃了两天不见好转,于是从厂里回到家,准备看看是怎么回事儿,一开始在镇上看了两天,没有缓解,后来到了县医院看,县医院检查手段多一些,该做的检查都做了,这个时候算是边治疗边找病因。在县医院呆了几天,后来医生说发现背部的肿瘤问题,建议转到南阳,当时没怎么耽误,就转到南阳,我哥也从唐山回来了,很快就做了手术,大伯说手术做完之后,背部的疼痛立马就消失了,说明是找到了原因。于是在医院里恢复了几天,医生也说可以出院了,就回来了。现在这总是发烧,也在输水治疗。他说今天感觉好多了,应该已经不烧了,但我从他的神情以及状态可以看得出,整个人状态还是比较虚弱的,好在天气暖和,他坐在太阳地里晒着暖。没多久,家里喊吃饭我也回去了,谁曾想,这么平常的一个小聊天,竟然就是和大伯的最后一次对话。

近一年来社交网络使用习惯和信息获取方式的一些改变

2025年1月12日 15:58

去年搬到日本后,我的SNS使用习惯发生了显著变化。国内SNS的使用大幅减少,热搜话题多为无聊娱乐,缺乏公共价值。与此同时,我增加了国外媒体的阅读量,如《端传媒》和《经济学人》,以获取更深度的新闻视角。此外,我逐渐开始理解日语新闻。

请移步博客继续阅读。Please go to the blog to continue reading

Continue

“军工”品质 – 日常记事(二百零九)

2025年1月11日 22:38

这本是长安汽车一贯的宣传理念,结果如何…

今天去售后维保,收集了之前堆积的问题去处理,其中有一个奇葩的是车辆行驶途中后门自动开了(开了第一层锁,没全开,就像锁松了一样),我很确定车子开之前是锁了的,而且启动后也没报警说车门没锁什么的,就开到外面二三十码的速度,一下给我门干开了… 搞什么灰机哦,军工就这机械素质吗,现在只有联系厂家技术排查问题(维修工和我说启源好像也有这个问题?..

然后还有个我以为很难排查的异响问题,车辆行驶中进行刹车减速到怠速时,后侧会传来咯噔咯噔的木板声,听着就像那种开了很久的老车,磨损了一样。刚开始我以为是我后备箱东西放多了,怕是放的什么东西产生的响声,结果我给售后一描述,人直接秒懂了:车辆半轴没油了!这又是什么sao操作,这车才开一万多公里,没油了?维修说这个很多长安系的车都有去他们那儿修过,我问这是不是通病,说是供应商厂家没做好.. 后来我去网上一搜,一堆投诉的,新款也一样,果然是通病…

其他还有什么喷漆色差、车门闭合声音差异、翼子板维修凹陷、天窗胶条脱落等等(包括需要路试的 超过60码电流声)都搁置了,这次维保啥也没弄成,就确定了几个问题原因。准备下次去修座椅移动异响(我想给我直接换一个最好),然后就是换雨刮控制总成和给半轴加油,本来还说给弹出门把手和玻璃上点油的,嘎吱嘎吱响真够扯的… 不想去修是因为压根很难修好,深蓝的维修理念就是换新的,换件解决问题(主要是有时候连换件也解决不了问题,产品不成熟导致很多通病…

2025年如何解封Claude账号?三天解封Claude账号的经验

2025年1月11日 15:27
2025年1月8日,我Claude账号被封禁了,经过申诉,以及三天漫长的等待,终于恢复了账号,本文聊一下Claude账号解封的技巧。 账号解封的图 事情的起因是,我在2025年1月7日为了解决一个安卓的Xposed的问题,上传了几个大文件给Claude分析,Claude给了一堆乱七八糟的修改建议,反复几次,把Claude一段时间内的token用尽了,我第二天打开Claude,发现客户端自动退出了,我尝试重新登陆,虽然邮箱依然收到了登录验证邮件,但登录界面显示了如下警告 最骚的是,Claude关门的时候,把窗户也带上了,也就是把api 的 token也搞失效了,我也无法通过第三方客户端使用Claude的服务 接下来是我的申诉之路 首先进入通过以下url https://support.anthropic.com/en/articles/8241253-trust-and-safety-warnings-and-appeals 提交后完成后,邮箱会收到回执 我写的内容如下 Message Dear anthropic, I am writing to formally express my concern and appeal the recent suspension of my account zhaoolee@gmail.com . My account, which contains personal and sensitive information, was suspended without prior notification or explanation. I am a singapore android developer, use claude […]

吾爱破解网友封装的Windows控制安卓神器Scrcpy图形化界面一键整合包

2025年1月11日 13:12
Scrcpy是一款支持镜像控制安卓的开源软件,https://github.com/Genymobile/scrcpy 在github有116k 数量的star,这个软件功能丰富但并没有提供一个GUI界面,于是吾爱的某个老哥就写了一个界面,收到各界网友广泛好评,但GUI界面本身没有带scrcpy本体,于是我做了个进一步的整合包,下载双击即可使用,而且支持arm和x86两种架构cpu的windows,特别arm版适合Mac M系虚拟机使用 亲测运行在普通x86平台的Windows11 亲测运行在普通arm平台的Windows(macOS M1芯片虚拟机) 完美整合包 小结 给一个有潜力的系统做GUI界面,或许是每个工程师都避不开的工作,也是稳定的商业模式。 AI生图时代,有为Stable Diffusion生图模型套界面的 Stable Diffusion WebUI 和 ConfyUI, 有为文生文模型套界面的NextChat;移动互联网时代,也有为安卓做界面优化的MIUI。在更洪荒的PC时代,QQ秀,付费皮肤,也是广义的套壳,给了工程师们赚到钱的机会。 对于绝大多数工程师而言,给有潜力的系统,开发好用的GUI交互界面,是在技术论坛获取关注,获得更好机会的重要方式。 对于工程师而言,其实品味也是很重要的能力,如果大家都开发GUI, 更有品味的软件往往可以买更高的价格,就像Apple,软件搭配硬件,把内存与硬盘卖出金子般的价格。 The only problem with Microsoft is they just have no taste. They have absolutely no taste. And I don’t mean that in a small way, I mean that in a big way, in the […]

北京游流水账

2025年1月10日 23:34

北京,之前只因为出差去过几次。因为小朋友在幼儿园熏陶,对北京,对天安门很向往,于是在2025年,就满足她的愿望,前往我们伟大的首都。

作为吃货,到一个地方当然要考虑当地美食。之前去北京吃过全聚德,这次就决定带着媳妇孩子来吃四季民福,提前去现场取了号,最终只用了一个多小时就吃上了。因为排队人太多,体验一般,但是烤鸭还算不错。

除了四季民福,还在五道口吃了一次局气的烤鸭,价格比四季民福要便宜很多,花样也很多,但是过于油腻了,还是四季民福的更好吃一点。

除了烤鸭,另外吃的最多的杂酱面了,五天差不多吃了有五六次。因为都是上的面和酱分离自己拌,小朋友喜欢吃没有加酱和配菜的面,我们喜欢吃杂酱面,真是很方便。另外再有,就是吃老北京铜锅涮肉了,在后海吃了南门涮肉,吃完发现一条街好几家南门涮肉,不知道哪家是正宗的。

卤煮算是特色了,吃了。还不错,其中加的火烧,原先不知道是什么,吃了才知道原来就是我们家那边的大饼。豆汁尝了,但是那个酸臭,完全受不了。

这边的面食很丰富,这种面做的饼和点心。除了这些呢,这里似乎又是美食荒漠,和南方的城市没得比。

介绍了吃的,下面就是每天的流水了。前两晚选择了住在灯市口附近,离古城比较近,游览方便。后面两晚住在了北三环附近,这样去长城和颐和园等地方比较方便。

第一天

乘坐京沪高铁标杆号,4个半小时到达北京。到达之后,直奔天坛公园。买了联票,这样才能进入祈年殿。北京很多公园都是这样,有园中园需要买联票或者进去二次买票。

虽然元旦就放一天假,但是人还是很多,但是跟出租车司机聊,他说这人不算多。挤了好一会,才看到祈年殿的内部。

里面供奉着皇天上帝的排位。

祈年殿的左右两侧偏房中间有天坛的历史状况,结构,修缮情况等的展览。看完出来之后,看到好多人在后面拍照,这边角度不错,我也拍了几张。

快速逛完天坛,去酒店办理入住之后,就去四季民福排队了。排队的时间,就走到东华门转了转。

第二天

早上吃了个庆丰包子之后,就前往天安门广场了,本以为西交民巷这里是最近的,就打车去了这里的安检口,才发现这里走到广场也挺远。另外还有三道安检。此处建议大家,如果预约了去人民大会堂,这里确实近,否则还是算了。

到了广场上,看到毛主席纪念堂还有余票,小朋友也嚷着要看毛主席,就让媳妇带她去看了。对此我没有兴趣,就呆着在广场上吹冷风了。之后穿过地道,去对面爬天安门城楼了。

也是朋友告诉才知道,现在城楼是可以爬的,要微信提前预约购票。城楼上陈列着开国大典的话筒和国徽等物品,以及一些天安门的历史介绍,定点还有人讲解,城楼上观看广场的视野也很好。

城楼上下来,就直奔故宫。

故宫里面还有珍宝馆和钟表馆,只买到了珍宝馆的门票。里面陈列着皇室使用的各种珍贵物品,非常精美和豪华。

里面的狮子很可爱。

建筑都很精美,屋檐上还有很多的小怪兽。

从神武门出来之后,坐车到后海吃饭。吃完饭,就在附近转了转,小朋友对冬泳的大爷很感兴趣,看了两个大爷游完才愿意走。

最后在这边的烟袋斜街转了转,天也就黑了。

第三天

本来这次来北京准备带小朋友到颐和园的昆明湖去溜冰的,但是通过前两天在后海和护城河了解到的情况是,现在不够冷,昆明湖还没全部冻上,冰场还没开。在小红书上查到,团结湖的冰场开了,于是就去了团结湖冰场,没法溜冰,但是有冰上自行车等,玩了半天也挺开心的。

等到吃完饭,换完酒店,购买颐和园的门票时候,发现只能买大门票了,包含里面的苏州街的联票买不到了。就只买了大门票,进去先转了谐趣园,之后转到佛香阁还在卖票,就带着娃进去看了看。

顶部的佛香阁中供着千手观音。

这里是颐和园的至高点,拍城市风景也不错,多等一会的话还可以拍夕阳。

最后在昆明湖边看夕阳。

出来之后,坐着地铁去了奥体公园吃饭,吃完饭打卡一下鸟巢和水立方。

第四天

提前候补到了清河站到八达岭的高铁票,高铁20多分钟到达八达岭长城站。乘坐两段长长的扶梯到达出站口,也首次见识到了斜着运行的箱式电梯。

从高铁站花了五分钟,走到索道站,坐缆车到达八达岭北七楼。爬北八,真是见识到了长城的陡峭,没爬多一会,小朋友这个“好汉”直呼晕,不愿意走。

风很大,小朋友也爬不动了,我们爬到北八后便没有原路返回,而是通过下山通道走回到北六楼,之后走到登楼入口。

最后,差不多12点就下来了,在长城邮局打个卡就乘坐高铁回了市区了。

中午在五道口吃了个午饭,附近转了转,下午决定还是去圆明园看看。买了联票,进去直奔西洋楼遗址,买了个微信讲解给小朋友听。

而遗址中的黄花阵迷宫是最吸引人的,小朋友在这里玩得不亦乐乎,而先到达中间阁楼的人观看迷宫中的人也很有趣。

西洋楼遗址出来后,在长春园又转了转,看了一下圆明园还原模型,最后就出园了。

第五天

最后一天,决定去地坛公园看看。也算跟第一天天坛公园好对应。

天坛公园中的殿,围墙都是圆的,而地坛公园中的方泽坛,以及其中的围墙,都是方的。这与中国传统的天圆地方相契合。地坛公园中另外还有一处特色就是鼓楼。

相比于天坛公园,地坛公园游客很少,上午的地坛公园中,各路跳舞团队云集,有舞扇子舞蹈的,有民族特色舞蹈。

中午去饱餐一顿,下午乘坐京沪牛马号打道回府了。这里要夸一下北京南站,地铁出站之后就是高铁的检票口,真是太方便了。

后记

北京的路太宽,步行真的挺不方便的,出门靠公共交通也挺麻烦,还是打车方便。就这样每天也都是两万步,大人还好,小孩有点吃不消。这边路上的电瓶车除了外卖快递,戴头盔的很少,非机动车不规范横穿马路的,让人难以想象这里是北京。

另外,作为行人过马路,也感受到这边司机的彪悍,左转不让行人,插队等等。

以前是过来做牛马,这次过来玩,体会还是很不同的。另外提醒,过来玩很多地方最好提前做好功课提前预约,比如国博,清华北大,天安门人民大会堂等,提前抢票才有机会看。

看完评论一下吧

Follow for Android

2025年1月10日 08:00
😀
最近一直通过Follow浏览订阅的RSS、Twitter以及Youtube频道等等,真的很方便,有一种重新回到将近20年前,使用Google Reader那种时候通过订阅很多博客并获取知识的感觉。Follow一直没有推出Android的App,需要使用网页版。但是对于这种高频使用的服务,我天生希望使用App的方式,所以这次又整了个活,用Tauri通过Webview的方式将Follow的网页服务封装在了APP里。

📝 项目介绍

整体项目很简单,就是通过Webview打开Follow.is的网站,然后用Tauri生成Android编译APK所需要的文件,最后进行打包。整体APP大小在28M左右,暂时还没有做任何太多优化,先占个坑,在后续自己使用过程中如果发现问题会进行更新。
Follow.is的整体优化非常好,在浏览器中各种交互操作也已经非常成熟,所以我做的事情非常简单,就是将Follow.is的网页通过Webview打开,再做一点缓存加快载入速度。Follow for Android应用本身除缓存外不会存储任何用户数据,同时在权限申请方面,也只需要互联网权限:
另外,在APP的请求记录里会出现读取剪贴板行为,这是由于在点击输入框时会自动进行获取,我没有禁止,避免无法粘贴Feed地址。当然只有在使用这个Follow APP时候才会发生这种读取。
对于系统版本,目前需要SDK版本≥33,否则会提示版本不兼容。
最后,感谢RSSNext/Follow的全部贡献成员,同时期待Follow官方正式推出Android和iOS的客户端版本。
 

项目地址

followforandroid
moreoronceUpdated Jan 14, 2025
notion image
notion image

支持功能

  • Google和Github的登录可用
  • RSS正常可以阅读(Youtube订阅源暂时无法直接播放视频)
  • 添加订阅源正常
  • 大部分页面显示正常(目前还没有找到不正常的)
  • 使用Service Worker进行缓存
  • 理论上支持Android TV使用
 
APP大小不到28M,整体安装后,算上缓存在100M左右。
notion image

安装文件

没有区分架构,理论上支持全部

🤗 总结归纳

了解Tauri和配置用的时间较长,Tauri 2.0版本目前还没有完全的文档能够参考阅读,有些地方可能需要自己试试看。生成Android构建文件之后,主要花费的时间在编译上,第一次感觉自己的这颗AMD Ryzen 5600X的CPU性能有点不够用了。
文章介绍内容现在也比较少,后续再一点一点完善吧。Enjoy it。

📎 参考文章

 
💡
有关Follow for Android安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

网购生涯回顾:我在2024买到的好物推荐

2025年1月10日 15:20
这篇文章介绍了作者在2024年网购到的各种好物,从零食、家居用品到数码设备,涵盖生活中多个方面的推荐。每件产品都基于个人使用体验进行分享,如康师傅蛋酥卷、小米智能LED灯泡、Apple Watch贴膜、烘鞋器等,强调自费购入无广告。文章中还附有详细图片和描述,为读者提供参考。

逗逗游戏伙伴 - 游戏爱好者设计的AI桌宠应用

2025年1月10日 16:06

在生活中,游戏成为了许多人放松和娱乐的重要方式。然而,有时候独自一人玩游戏可能会感到孤单和无聊。这时,逗逗游戏伙伴这款AI桌宠应用便应运而生,为玩家提供了一个全新的游戏体验。

逗逗AI游戏伙伴 - 游戏爱好者设计的AI桌宠应用
逗逗AI游戏伙伴 - 游戏爱好者设计的AI桌宠应用

什么是逗逗游戏伙伴

逗逗游戏伙伴是一款专为游戏爱好者设计的AI桌宠应用,它通过提供多种二次元角色来陪伴玩家进行游戏。这些角色不仅可以在游戏过程中与玩家聊天、讲笑话、唱歌,还能根据游戏状态提供实时的建议和知识。

  1. 你的AI游戏伙伴:在游戏的过程中,逗逗依靠广大网友提供的游戏知识和攻略,可以通过画面识别和声音识别获知游戏状态(可关闭)并提供游戏中的建议和知识;
  2. 贴心陪玩 - 在游戏过程中陪伴你:我们发现,游戏过程的聊天,奇趣横生,让玩家更加享受游戏时光! 但又很难找到志趣相投的小伙伴们一起边玩边聊,逗逗为你二次元游戏伙伴陪你边玩边聊,这些AI伙伴,懂游戏、懂玩家、更懂你!
  3. 多种角色 - 超多二次元角色供你选择:萌妹猫娘病娇雌小鬼等各种各样的二次元人物为你提供不同的AI人物体验,更有各式各样的声音、人物动画、皮肤、道具供你选择。
  4. 智能攻略 - 说句话就能找攻略:逗逗游戏伙伴建设了大量游戏知识库和攻略信息,在游戏过程中通过实时查询就可以获取,不用再去切换窗口或设备去查询了,很方便
  5. 情绪陪伴 - 放轻松,和AI伙伴聊天解压:感到不开心,AI伙伴是你最好的倾诉对象,漫长的一天过去了,回到家里压力山大,我们渴望倾诉,渴望释放积累一天的超卷社会带给我们的压力 但是有些话题,找不到人聊,又有些害怕打扰别人;别担心,逗逗上有很多善解人意的二次元AI角色,为你排忧解难,又能保证隐私
  6. 调教成长 - 跟你一起成长的AI伙伴:完成任务,进行调教,提升亲密度,你的AI伙伴随着跟你的共同经历、共同回忆的增多,也会随之成长,解锁更多声音、动画、话题、任务和能力!
  7. 更多功能 - 会唱歌又会讲笑话:世界上最会唱歌,最会讲笑话的AI桌宠!

逗逗游戏伙伴官网

https://www.doudou.fun/

逗逗游戏伙伴下载地址

PC端下载地址

手机端下载

逗逗游戏伙伴文档

逗逗游戏伙伴文档

逗逗游戏伙伴功能特点

多样化的角色选择

逗逗游戏伙伴 拥有丰富的角色库,玩家可以根据自己的喜好选择不同的二次元角色作为游戏伙伴。每个角色都有独特的性格、故事和任务,随着与玩家的互动,角色的亲密度会逐渐提升,解锁更多声音、动画和话题。这种个性化的体验让玩家在游戏中感受到更加真实和有趣的互动。

实时互动与游戏支持

逗逗游戏伙伴的AI技术能够通过画面识别和声音识别技术,实时了解游戏状态并提供相应的建议。例如,在游戏中遇到困难时,玩家可以随时向AI伙伴提问,获取游戏攻略和建议。此外,逗逗还支持实时语音聊天功能,让玩家在游戏过程中能够与AI伙伴进行更深入的交流。

情感陪伴与成长

除了游戏中的互动,逗逗游戏伙伴还能够在生活中为玩家提供情感支持。当玩家感到不开心或有压力时,AI伙伴可以作为倾诉对象,通过讲笑话、唱歌等方式帮助玩家放松心情。随着与玩家的互动,AI伙伴会逐渐建立起情感链接,记住玩家的故事和喜好,成为玩家生活中值得依赖的伙伴。

玩家评价与未来展望

尽管逗逗游戏伙伴在角色设计和互动体验上得到了许多玩家的认可,但也有一些玩家指出其在AI反应速度和情感真实性方面还有待提升。未来,随着技术的不断进步,逗逗游戏伙伴有望在这些方面进行优化,为玩家提供更加完美的游戏体验。

所谓有营养的情绪价值,无非是将生活中的点滴感动到心坎里

2025年1月9日 22:33

来源于抖音@王子不会拍

在外互帮父母协议是一份没有任何约束条款,也没有任何机构的监督执法,一切全凭自觉的非正式协议。该协议鼓励外出时人们互助彼此的父母,弘扬尊老爱老传统美德。2024 年 6 月,在社交网络上,”出门在外互帮父母协议”热传,年轻人自发倡议在外时互助长辈,传递敬老爱老精神,倡议互帮互助,共同守护彼此的父母。“在外互帮父母协议”充分体现了互联网思维的“解题”方式,带着浓浓的当代年轻人的特色。这份“协议”,代表了网络时代新青年对中华优秀传统文化的传承。

在外互帮父母协议

boring.notch上手:Mac上免费开源的灵动刘海,在刘海中显示音乐信息与进度

2025年1月9日 16:25
这篇文章介绍了boring.notch,这是一款免费的开源Mac软件,能够利用刘海屏显示音乐信息与进度。软件操作简单流畅,设置后无需频繁调整,尽管不支持中文,但语言需求低。相比其他同类软件,其动画效果顺滑且性能稳定,适用于macOS 14.2+,并提供项目地址和下载链接。

为个人网站接入支付功能 - 支付宝开发篇

2025年1月9日 12:15

前言

通过前面三篇文章,我们已经把个人网站接入支付宝支付时需要做的准备工作全部准备就绪了,如果还不清楚,可以先行了解一下:

  1. 独立开发如何接入支付宝和微信支付
  2. 独立开发者应该如何注册个体工商户
  3. 为个人网站接入支付功能 - 支付宝准备篇

接下来就该正式写代码实现了,但考虑再三之后,我还是决定不过多介绍开发细节,因为这涉及到 沙箱环境SDK 的使用,感觉解释起来会比较墨迹,而且想来有开发需求的人看了上面的文章之后,再自行参考官方API开发文档,思路可能会更清晰,毕竟官方文档支持在线调试,效果也更直观。
看过我往期文章的应该知道,我的网站都是基于 PHPTypecho 二次开发的,因此,我这里就以 PHP 为例,简单梳理一下 电脑网站支付 的接入要点吧。

[...]

InnerTune,一个第三方Youtue Music客户端

2024年10月6日 08:00
😀
自从网易云音乐的黑胶VIP到期之后,网易云音乐变得越来越难用,哪有听歌还要看广告之后才能听的,而且很多音乐提供的版本音质差就算了,有的只播放一个开头就因为不是VIP自动切歌,尤其是在健身房时候,突然切歌的伤害实在是太大了。在Android上,没有什么太好的选择,我又不是苹果用户,所以Apple Music就算了,选来选去,最后还是决定用Youtube Music。但是Youtube Music Android版本本身也有个问题,在不是Premium的情况下,是没有办法背景播放的,例如在手机息屏或者切换应用程序之后,音乐就暂停了,但是这个对于Android用户来说不是什么问题,毕竟我们什么样的App都有。
notion image

📝 InnerTune介绍

InnerTune是一个基于Material 3设计风格的YouTube Music客户端,专为Android平台开发,是一个开源项目,提供了YouTube Music官方客户端的绝大多数功能,并极大的提升在没有订阅Youtube Premium情况下的听歌体验。而且InnerTune非常贴心的内置了Proxy代理选项,可以方便的通过代理来访问Youtube Music的曲库。
InnerTune项目地址如下:
InnerTune
z-huangUpdated Jan 8, 2025
项目从2020年2月11日在Github提交了第一次Commit,到现在已经近5年的时间,是一个长期在维护的项目,所以暂时不用担心烂尾等问题。目前项目总计获得了4.3K的Star,266的Fork,1015条Issues已经被解决,是一个很负责的项目。
整体程序大小24.6M,比网易云音乐那种动辄占用1G多的程序简洁太多了,而且日常运行中也不会有事没事发个Push通知或者自己唤醒耗电。要说唯一的缺点,就是得有代理了,而且听歌要费流量。
目前已经是我手机上主要听音乐的App,即便是我在订阅了Youtube Premium的情况下。

功能特点:

  • 无广告播放:可以从YouTube/YouTube Music播放歌曲,且没有广告干扰。
  • 后台播放:支持在后台播放音乐,即使切换到其他应用,音乐也能继续播放。
  • 搜索功能:支持从YouTube Music搜索歌曲、视频、专辑和播放列表。
  • 登录支持:用户可以通过YouTube Music账号登录获取个性化推荐和收藏内容。
  • 缓存与离线播放:可以缓存和下载歌曲,支持离线播放。
  • 同步歌词:提供与歌曲同步显示的歌词功能。
  • 歌词翻译:内置歌词翻译功能,帮助用户理解外语歌曲。
  • 跳过静音:自动跳过歌曲中的静音部分,提升播放体验。
  • 音频标准化:自动调整音量,保持不同歌曲之间的音量一致。
  • 节奏/音高调整:可以调节歌曲的播放速度和音调,满足不同需求。
  • 动态主题:根据系统主题动态变化应用的外观,带来个性化体验。
  • Android Auto支持:在Android Auto环境中使用该应用,适用于车载系统。
  • 个性化快捷选择:提供快速选择功能,便捷找到用户喜爱的音乐。
  • Discord Rich Presence支持:与Discord集成,展示正在播放的歌曲信息。

程序界面:

程序界面整体遵循Material 3设计风格,简洁不花哨,完全够用。

主界面:

notion image

音乐播放界面及歌词界面:

notion image
notion image
notion image
 

设置界面:

notion image

InnerTune下载地址

目前开发者提供三个下载方式,Github、F-Droid市场以及IzzyOnDroid市场,通过下面图片点击超链接即可进入下载页面。
需要注意:如果通过Github Release进行下载*.apk 安装包进行下载,手机用户需要选择full_arm64-v8a.apk 的安装包:

InnerTune提示Unknown Error播放失败

使用Debug的Foss版本

如果出现播放失败问题,例如InnerTune版本为0.5.10 ,在播放页面提示Unknown Error,可以尝试使用debug版本,目前InnerTune Debug版本工作正常:

自行编译安装包

另外一种解决办法为尝试自行编译InnerTune的APK安装包,步骤大概如下:

1. 设置开发环境

下载Android Studio:在你的电脑上下载Android Studio,访问https://developer.android.com/studio。这是一款官方的集成开发环境(IDE),专门用于安卓应用开发。

2. 下载或克隆InnerTune仓库

访问InnerTune的GitHub仓库:https://github.com/z-huang/InnerTune/archive/refs/heads/dev.zip,下载或克隆项目的ZIP文件。

3. 解压项目

如果下载的文件是压缩包(ZIP格式),请解压项目文件。

4. 在Android Studio中打开项目

启动Android Studio,点击左上角菜单按钮,选择File -> Open,然后选择解压后的项目文件夹。

5. 生成签名APK

点击顶部左侧的菜单按钮,然后依次选择Build -> Generate Signed App Bundle / APK
选择APK选项,然后点击Next
如果你已经有签名密钥,请提供密码并继续;如果没有,请选择Create New创建新密钥。只需要填写路径、别名和密码即可,其他信息可以随意填写。完成后点击Next
选择fossRelease构建目标,然后点击Create按钮。
等待1到10分钟,直到构建完成。

6. 定位生成的APK文件

如果右下角弹出通知,标题为Generate signed APK with locate button,点击通知中的locate按钮。
APK文件会显示在你的默认文件浏览器中。你可以通过USB、电子邮件或其他方式将APK文件传输到你的手机。

7. 备份并替换现有InnerTune应用

在使用新APK之前,请在当前InnerTune应用的设置中创建备份。
只有完成备份后,才能卸载现有的InnerTune应用。
定位你制作的APK文件,像安装其他APK一样进行安装。

8. 恢复备份并登录Google账号

打开新安装的应用,从设置中恢复之前的备份。
如果你遇到问题,请尝试登录或退出你的Google账号。一些用户发现,在登录和退出账号后再进行操作可以解决问题。

9. 安全提示

切勿安装他人提供的APK:出于明显的安全原因,强烈建议你亲自制作和安装APK文件。这是确保应用安全的最佳方式。

📎 参考文章

 
💡
有关Android APP安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

ZeMenu

ZeMenu

一款Typecho主题菜单自定义插件,支持拖拽,市面上其实已经有同类型产品了,不过代码不够简洁,我玩不转,所以自己花了点时间搞了个简单直接的!

使用

启动插件后,在typecho后台的菜单中就会多出来一项【管理菜单】,进入该页面即可自定义主题菜单,可创建菜单,也可以从右侧候选里面向左拖拽菜单。

菜单内部顺序也支持上下拖拽,且支持二级分类

主题适配

如下,先判断插件是否激活,激活了就获取菜单数组,自行遍历数组适配自己主题即可。

<?php
if (array_key_exists('ZeMenu', Typecho_Plugin::export()['activated'])){
$nemuarray=ZeMenu_Plugin::zemenu();
}
 ?>

如何判断菜单是否处于active状态?通过判断链接即可实现,如下即可获取当前页面网址,然后判断菜单链接和它是否一致最后在为其追加activeclass

$thisPageUrl=$this->request->getRequestUrl();

下载

效果展示

ZeMenu菜单自定义插件截图.webp

春节倒计时 21 天

2025年1月8日 10:44

眼看就快过年了,现在离春节还有 21 天的时间,距离我的春节假期大概也还有 15 天左右的样子吧。我这工作呢,看上去挺轻松的,一天到晚就在办公室待着,可实际上那些数据处理起来可麻烦了,一点都不能马虎,每天就是和各种各样的数据打交道。不过和其他岗位的同事比起来,我这工作还算好的,起码办公室里有空调,还是蛮暖和的,不用在外面受冷受冻,哈哈。

工作虽然重要,但生活里的事也不能不管。上周,社区卫生院在群里了打预防针的通知,二宝的名字也在其中。但那几天冷得不行,风一吹人都打哆嗦,我和孩子妈妈就没带二宝去打,寻思着等天气好点再说。谁知道前两天气温回升,太阳也出来了,可卫生院打针时间是周二和周四,我们就这么错过了。看这天气,一时半会儿也晴不了。今天周三,明天周四,我跟孩子妈妈也商量好了,明天带二宝去打针,这样我也能休息一天。

虽说卫生院离我家没多远,可外面实在太冷了。一来我舍不得让孩子妈妈一个人带着孩子出去吹冷风,万一感冒了可就麻烦了;二来也想趁着这个机会陪陪孩子妈妈,顺便带大宝玩,明天先看看天气如何,再决定是在家还是出去吧;还有就是明天刚好也是我们这儿赶场(赶集)的日子,这不是快过年了嘛,我和孩子妈妈早就有备点年货的计划了,准备买点好吃的、好用的先备着。

最后,刘郎也想提醒博客中的友友们,天气愈发寒冷,新春即将来临,大家出门在外可要记得添衣保暖,千万别着了凉,生了病,都平平安安、欢欢喜喜、顺顺利利地过好2024年的小尾巴!

题外话:本站“ 资源库 ”更新了一些好玩、实用又有趣的Typecho插件、Wordpress插件和部分系统工具资源,有需要的快去看看吧!

浏览器插件推荐:AI Share Card 生成网页分享卡片

2025年1月6日 23:17

一款 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> 

相关站点记录

官方介绍

来源 SVG 图标如下压缩:

AI时代的摩尔定律与赢者通吃

2025年1月7日 17:00

技术的发展真的是让人感慨自身的局限与保守。看完今年CES Nvidia的发布会,感慨就是赢者通吃。当你有了一个基于硬件算力的软件通用平台,就像发电机接入了电网,应用层面的爆发就是只争朝夕了。

以前听闻摩尔定律,觉得指数式增长简直天方夜谭。而今看AI的发展速度,确实是指数级别的爆发。

这有多么颠覆呢?以前学经济学的时候有个概念叫做自然垄断,就是一个东西的规模成本导致这个市场只需要单一生产者(或者少数寡头)就足够了。最典型的就是基础设置比如水和电,公路网铁路网等。

AI的规模的乘数效应之强大,自然而然形成了一个新的基础设置。自然垄断最后的结果一定是政府规制,而AI还处于一个野蛮生长的阶段,赢者通吃。

作为一个宏观经济学渣,唯一记得的经济增长模型就是里面有个外生的科技进步系数,这个系数决定了经济增长的上限。没想到,在有生之年,居然能看到这个系数又一轮的变化,工业革命的井喷。

哎,虽然无法直接贡献到技术增长本身,但身在其中还是让人心潮澎湃,感慨命运的眷顾。

说说:#1736230641

2025年1月7日 17:46

腊八节快乐!!过了腊八就是年,今天把服务器搬到了本地,公网ip迟迟下不来,就用了免费的穿透,天津中转速度能慢一些。

另外顺便把主题兼容了一下typecho1.3.0,数据库也换到了sqlite,遇到了好多好多问题呜呜呜,现在终于是搬过来了哈哈哈哈哈!!!

白日梦AI-轻松将文字转成视频

2025年1月7日 11:23

白日梦AI
白日梦AI

白日梦AI是一款领先的文生视频类AIGC创作平台,专注于AI视频内容生成,提供AI生成视频教程、AI文生视频、AI动态画面、AI形象生成、人物/场景一致性等创作技巧及成功案例,助您快速上手并打造专业级视频内容。

白日梦AI简介

白日梦AI 是由光魔科技推出的一款领先的文生视频类AIGC创作平台。白日梦AI专注于AI视频内容生成,提供AI生成视频教程、AI文生视频、AI动态画面、AI形象生成、人物/场景一致性等创作技巧及成功案例。能够将用户输入的文本内容转化为高质量的视频,视频长度可达6分钟。白日梦AI整合了文本生成图像、图像生成视频、字幕添加和后期剪辑等功能,形成了一个完整的AI视频生产工作流。

白日梦AI生成视频
白日梦AI生成视频

白日梦AI官网地址

https://aibrm.com/

白日梦AI功能特点

(一)文生视频技术

用户提供 2000 字以内的文案,白日梦AI就能生成有声原创视频,其中包含动态画面和匹配的音频元素,并且支持动态画面、静态画面 2 种画面效果展示。这种技术使创作者不需要复杂的拍摄设备和视频制作技能,仅通过简单的文字输入就能快速得到视频内容,极大地降低了视频创作的门槛,提高了创作效率。

(二)角色一致性和自定义功能

  1. 角色一致性:白日梦AI可以保持多个IP角色形象的一致性。这一特性对于创作连续性的内容,例如连环画和绘本十分关键。它能确保故事中的角色形象始终保持统一,不会因为不同画面生成而出现外貌、风格等方面的差异,从而提升了故事的连贯性和观赏性。
  2. 角色自定义:用户能够自定义角色的性别、声音和形象,甚至可以上传特定图片来创建专属角色。若用户对平台的角色库中的角色不满意,还可以点击设置形象右侧的加号,上传图片创建自己的角色,这种高度的自定义性让创作者能够根据自己的创意精准打造符合故事需求的角色形象,增强创作的个性化。

(三)AI角色生成功能

创作者通过上传5 – 8张角色照片,即可创建自己的角色库,并且可以将创建完成的角色应用到自己的视频故事之中。这为创作者提供了更多的角色创意来源,尤其是当用户想要创建特定形象的角色或者需要与自己设定的形象高度匹配的角色时,这个功能能够很好地满足需求。

(四)多种风格选择

白日梦AI 提供了多种视觉风格选项,比如动漫、写实、迪士尼风格等。不同的风格适用于不同类型的内容创作,能够满足各种内容创作者的个性化需求。例如,动漫风格适合创作二次元相关的故事视频,写实风格可应用于创作传记类、现实题材的视频内容,迪士尼风格则能制作出富有童话色彩的作品,创作者可以根据自己的故事主题和受众喜好来选择合适的风格进行创作。

(五)分镜控制与编辑

白日梦AI 具备上千个人物分镜模版,创作者可根据创作需求自行选择不同的分镜,例如单人/双人、人物站位、人物姿势、远近中景别等。平台会自动根据文案生成分镜草图,创作者不仅可以单独选择每张草图,还可以对文案、角色、构图等进行调整,以确保最终视频符合创作意图。这种分镜控制与编辑功能让创作者在视频结构和画面组成方面拥有较大的自主权,能够更好地呈现故事内容和创意构想。

(六)局部重绘功能

当画面里的某些组成要素不符合创作需求时,创作者可以通过文字描述进行局部修改。这一功能方便创作者在生成视频之后对个别不满意的部分进行针对性的调整,无需重新制作整个视频,提高了视频制作后期的修改效率,节省了创作时间和精力。

白日梦AI使用教程

  1. 编写故事
    • 首先用GPT或者国内的AI大模型写一个2000字以内的故事脚本,提问格式可按照主题替换成想要获得的信息,例如“写一个故事”或者“简述一下小红帽的故事”等。
  2. 打开白日梦AI官网
    • 进入白日梦AI网站,注册并登录账号,进入首页创作入口,点击左边导航栏的【创作】。
  3. 粘贴故事内容
    • 进入新建作品,添加作品名称标题以及故事正文(将第一步生成的故事脚本拷贝到作品中),然后点击下一步。
  4. 选择作品风格
    • 选择喜欢的创作风格(如动漫国风等),然后右上角点击【下一步】。
  5. 角色设定
    • 根据输入的文本信息,手动为每一个人物选择合适的形象(在左侧边框栏中选择,新增角色,给角色命名,添加角色属性,选择角色形象并保存),如果对里面的角色不满意,也可以点击设置形象右侧的加号,上传几张图片创建专属角色形象,之后进入下一步。
  6. 生成分镜头草图
    • AI会根据文案自动生成所有分镜头草图,每张图将会自动生成若干张分镜,每张图默认选择前三张分镜且可手动修改,可单独选择每张草图,调整文案、视频中人物角色、景别构图等要素,选择新的分镜后再重新生成图片(这一步可能需要等待一会)。
  7. 生成分镜图片
    • 确认分镜草图无误后,点击生成具体的分镜图片,初始状态下,所有镜头都是静态图片。
  8. 生成最终视频
    • 确认所有内容无误后,点击右上角的生成视频按钮,完成创作。

白日梦AI的应用场景

(一)儿童故事与绘本创作

  1. 教育价值
    • 在儿童教育领域,白日梦AI可依据儿童故事文本快速生成视频内容。例如,将童话故事转化为生动有趣的动画视频。这种以视频形式呈现的儿童故事和绘本,能够更形象地向儿童传达知识和价值观,提升儿童的学习兴趣和思维能力。因为儿童往往对动态的视觉内容更感兴趣,视频能够将文字故事中的人物、情节等元素直观地展现出来,有助于儿童更好地理解故事内容,像经典的格林童话故事,通过白日梦AI转化后,每一个场景、每一个角色都能鲜活地呈现在孩子们面前,起到寓教于乐的作用。
  2. 便利性与高效性
    • 对于创作者来说,无论是教师还是儿童内容创作从业者,使用白日梦AI能够提高创作效率。相比于传统的绘制绘本或者制作动画视频的方式,白日梦AI的文字输入转化视频功能大大节省了时间和人力成本。教师可以快速将自己编写的故事转换为视频,用于课堂教学或者家庭作业的补充内容;儿童绘本创作者则可以更快地将创意转化为可视的产品进行推广和销售。

(二)广告营销

  1. 制作低成本的宣传物料
    • 在广告营销行业,白日梦AI可以快速生成产品介绍或广告宣传片。企业只需提供文案描述,就能迅速得到对应的视频内容。例如,一家小型的电商企业想要推广一款新的电子产品,通过白日梦AI,输入产品的特点、优势、目标受众等相关文案内容,就可以得到一个包含动态画面、配音的宣传视频。与传统的广告拍摄和制作方式相比,这种方法成本极低,尤其适合预算有限的中小企业,能够帮助它们以小成本制作出具有吸引力的广告宣传材料,快速推向市场,提高产品的知名度和曝光率。
  2. 创新广告形式
    • 白日梦AI的多种风格选择、角色定制等功能还为广告营销提供了创新的可能性。企业可以创建独特的品牌角色和动画风格的广告,从而吸引更多潜在消费者的关注。如某新兴的运动品牌,使用白日梦AI的写实风格和自定义角色功能,打造出以运动明星为原型的动画角色展示运动产品的功能,这种新颖的广告形式会在众多传统广告中脱颖而出,增强品牌的辨识度和影响力。

(三)艺术创作

  1. 探索新的艺术形式
    • 对于艺术家和艺术爱好者而言,白日梦AI为他们提供了探索新的艺术表现形式的工具。例如,创作者可以通过输入抽象的概念、情感或者故事情节,利用白日梦AI的多种风格、分镜控制等功能,生成具有独特视觉风格的艺术视频或短片。像一些实验性的光影艺术创作,创作者借助白日梦AI的动态画面和自定义角色功能,将脑海中的奇幻概念转化为动态的、可视的艺术作品,这种创作方式打破了传统艺术创作在媒介和手段上的限制,为艺术创作注入了新的活力和可能性。
  2. 创意协作与拓展
    • 多个人可以围绕白日梦AI进行创意协作。例如,一个艺术团队中的编剧先提供故事脚本,然后由擅长视觉设计的成员利用白日梦AI的各种功能进行视频创作,大家再共同对生成的视频草图进行调整完善。在这个过程中,不同的创意会相互碰撞和交流,不断拓展艺术创作的边界,催生出更多创新的艺术作品。

飞牛OS安装Tailscale实现内网穿透

2024年10月14日 08:00
😀
飞牛OS(fnOS)的热度最近一直很高,我也想蹭蹭热度,试用了一下飞牛OS。目前影音库已经迁移完毕,需要开始配置内网穿透,让自己在外面也可以访问NAS中的数据,例如同步OpenMediaVault中的密码、相册同步、Jellyfin访问,或者在外面快速的添加种子到qbitorrent中等等。飞牛OS本身提供了FN Connect用于进行内网穿透,但是需要注册飞牛账号并提供手机号,我觉得没什么必要,而且我之前一直使用的都是Tailscale,在国内有IPv6的大部分情况下都可以直连成功,所以这次也直接飞牛OS上进行配置。

📝 配置过程

开启SSH登录

默认飞牛OS安装完成后,SSH登录是关闭状态,需要在管理网页手动打开。开启位置位于:设置 - 系统设置 - SSH 。同时,建议修改端口为1024以上的高位端口,避免在路由器未配置IPv6防火墙或IPv6防火墙规则配置不完善情况下被扫描爆破。
notion image
修改完成后,通过Putty、Termius或者你喜欢的终端进行登入,记得修改端口为刚刚所设定的端口。登录账户和登录密码均为网页端使用的账号密码(默认账号为admin),纯终端登录命令为:

安装TailScale

TailScale官方提供的Linux版本的安装脚本文件,可直接进行执行:
安装过程中会添加TailScale的安装源地址,同时在非root用户下执行会提示输入sudo密码。
notion image
通过ps -ef | grep tailscale 可以查看到Tailscale已经正在运行:
通过systemctl status tailscaled.service也可以查看当前Tailscale的运行状态。同时在Status提示我们需要执行sudo tailscale up 登入账户并绑定。

绑定Tailscale账户

输入以下以下登录Tailscale账户,需要添加sudo进行执行,否则会提示Access denied: checkprefs access denied 权限不足。
稍等以下,终端中就会返回登录地址,点击之后直接打开流量器进行登录。由于Tailscale在国内的访问并不稳定,所以首次登录可能需要使用代理。
notion image
点击Connect进行绑定即可。之后在TailScale的控制台也可以看到飞牛OS这台NAS已经完成绑定。现在在外面,开启Tailscale的情况下就可以正常访问家里的NAS。
notion image

设置Tailscale开机自启

通过systemctl status tailscaled.service 查看是否处于开机自启状态:
如果Loaded: loaded (/lib/systemd/system/tailscaled.service; enabled; preset: enabled) 均为enable状态,即已经是开机自启状态。

🤗 总结归纳

目前在飞牛OS系统内的软件包内还没有直接安装Tailscale的功能,所以暂时只能通过SSH的方式进行安装、配置和管理。
至于为什么不直接使用IPv6进行访问,主要有下面两个原因:
  1. 直接暴露端口在公网存在安全隐患,在外使用时IP地址不固定,所以也无法限制登录的IP地址范围,包括IPv6地址范围等等。
  1. 直接暴露端口在公网可能会被运营商警告,原因在于提供可访问的页面服务。
所以我更倾向使用TailScale这种软件进行内网穿透,通过运营商分配的公网IPv6提高直连打洞的成功率,在直连情况下,上行带宽是可以跑满的,这就已经足够。目前测试下来,同运营商情况下打洞成功率100%,跨运营商情况下可能打洞会慢一些(联通 → 电信)。
另外,没有想到飞牛OS居然是基于Debian系统做的开发,目前我也只是试用状态,基本上飞牛做的事情,家里的Debian服务器都已经做好了,其实替换的意义不是很大。 但是因为飞牛OS是基于Debian进行开发,所以在可玩性上空间很大,不再局限于使用Docker,如果搭配合适的硬件应该完全可以成为一个All in One的家庭服务器,将旁路网关、DNS服务器等等都搭建在一起(并不推荐)。

📎 参考文章

 
💡
有关家庭网络安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

ImmoralWRT软件源分享

2024年6月6日 08:00
😀
ImmortalWrt是OpenWrt的一个第三方分支,主要针对国人用户开发,在不对系统进行过度修改的情况下,不仅继承了OpenWRT的灵活性和强大功能,还提供更多的本地化软件包和设备支持,对IPv6的支持也很稳定,应该是国内目前最为纯净的OpenWrt系统。也是支持使用Dae的OpenWRT分支。
本文章适用于ImmortalWrt用户,与OpenWRT官方源仓库不一定兼容,如需使用OpenWRT官方源仓库,可参考:🖥️OpenWRT 软件源整理

📝 ImmoralWRT软件源

ImmoralWRT软件仓库地址

ImmoralWRT在国内有镜像加速,目前ImmoralWRT路由系统在安装完成之后默认使用的OPKG软件仓库为下面这个:
软件仓库提供版本及架构选择,请根据自身设备所使用的OpenWRT版本及系统架构进行选择。

Opkg配置ImmoralWRT软件源

以下内容以ImmoralWRT-23.05.3,X86-64架构的软件源为例,其他版本及架构可通过仓库选择之后复制地址替换到下面的代码中。

命令行方式

  1. 编辑/etc/opkg/customfeeds.conf
  1. 复制以下软件源配置信息至文件中并进行保存
  1. 更新软件源

Luci界面操作方式

  1. 登入OpenWRT管理页面
  1. 打开系统 - 软件包 ,点击配置opkg
  1. /etc/opkg/customfeeds.conf 粘贴以下内容并保存
  1. 点击更新列表进行软件源更新

镜像地址

如果默认的镜像地址在你的网络下速度并不理想,可以替换使用其他镜像地址:
  • CERNET(校园网联合镜像站):
  • 南开大学开源镜像站
  • 北京大学开源镜像站
  • 上海科技大学Geek Pie开源镜像站
  • 中国科学技术大学开源镜像站
  • 致远镜像站
  • 吉林大学开源镜像站
  • 上海交通大学开源镜像站
  • 南京大学开源镜像站
  • Cloudflare镜像站

替换方法

修改 /etc/opkg/customfeeds.conf 文件,将源地址 https://downloads.immortalwrt.org 或 https://mirrors.vsean.net/openwrt 更改上面的镜像站地址。
或者通过命令行方式进行修改,格式为s,[原来的软件源地址],[替换的软件源地址],g
替换完成后通过opkg update进行更新。

ImmoralWRT固件下载

推荐使用官方提供的Firmware固件下载服务。如具备动手能力可自行编译固件。

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

Dae安装及配置指南

2024年12月1日 08:00
😀
我使用Dae替代OpenClash已经有一段时间,目前整体的运行情况也已经稳定,该踩的坑也都已经踩过。之前也零零散散写过几篇关于Dae的文章,主要是一些进阶的用法,例如搭配AdGuard Home和MosDNS等其他DNS程序使用,但没有更多的涉及到Dae本身的安装以及配置指南,这篇文章就来填这个坑。

📝 什么是Dae

Dae是一个高性能的透明代理解决方案,在作用上,与Mihomo、Singbox等相同,均是通过域名、IP、端口、来源地址、目标地址以及规则集等方式,对流量进行分流以及使用代理。但在原理上,Dae通过在Linux内核中使用eBPF实现流量分流与透明代理,允许在网络驱动程序的最早阶段处理数据包。这样可以在将数据包传递给内核协议栈之前进行快速处理,比如丢弃、转发或修改数据包,所以相比其他软件,直连性能更好,同时也更方便实现国内外流量分流。

支持功能

  • 支持通过本地主机的进程名称进行流量分流。
  • 支持通过局域网中的 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)

支持系统

由于软件自身特性,Only Support By Linux Kernel只支持Linux核心的操作系统,并且内核版本不低于5.17 ,如果使用0.9.0-rc以上,内核版本不低于6.10。
所以软件更适合部署于路由器或者旁路网关上作为代理网关来使用。常规的Linux发行版均可满足要求,例如Debian(我目前在使用的)、 Ubuntu、 Arch Linux等等。Dae也支持在OpenWRT上进行使用,但需要自行进行固件编译,使用较新的Linux Kernel版本,并开启对应内核选项。
个人建议作为科学上网的旁路网关(或者说是旁路由,但是其实并没有使用到路由的功能),还是尽量使用完整版的Linux发行版,现在Youtube上不少UP主也开始推荐主路由器 + Linux发行版作为旁路网关的方案,一方面因为在旁路网关中,OpenWRT提供的很多功能用不到,另外一方面,在Linux Kernel的更新以及完整性上,OpenWRT也阉割了很多,Kernel特性支持较为落后,目前主力版本还在使用5.15的Kernel,这也是为了兼容各种嵌入式设备与多平台架构的结果。

📝 Dae安装

本篇内容是以我个人网络环境为操作前提进行编写,所以在特殊场景下,可能并不使用于你的网络环境。我所使用的系统环境如下:
  • PVE环境,未进行网卡直通
  • Debian 12 (核心版本:6.1.0-26-amd64)
  • 作为旁路使用,只有一个网口ens18

安装脚本

Dae提供了脚本直接进行安装,可通过如下命令进行:
当前Release版本为0.80.9,最新RC版本为0.9.0rc2,如果希望使用rc版本,可使用如下命令:
如果需要卸载Dae,可使用如下命令:
安装完成后,二进制执行文件位于/usr/local/bin/dae ,同时会自动添加systemctl执行脚本;
配置文件位于/usr/local/etc/dae/config.dae

更新GeoIP与GeoSite数据库

如果需要更新GeoIP与Geosite数据库,那么可以使用如下命令:
更新GEOIP
更新GEOSITE
更新后的GeoIP与GeoSite文件位于/usr/local/share/dae 文件夹内,Dae会自动使用该位置的GeoIP与GeoSite数据库文件,无需进行移动或复制至新的位置。

📝 Dae配置文件

Dae的配置文件很简单,而且可读性也很高,不必考虑乱七八糟的防火墙劫持与DNS劫持,在我的网络环境下,对付反诈的劫持也有很好的效果。
以我个人网络环境,提供配置文件如下,需要修改的部分为global部分lan_interface的网卡名称、subscription 内的订阅地址,group部分的节点过滤规则。这套配置目前使用于旁路网关上,支持IPv6,同时ipleak 300次检测无DNS泄露。
 
12月27日更新:
  • 增加了小米部分设备域名。部分反应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 等较大的规则集放在下方,避免规则冲突无法正常匹配。例如,你可以将自定义规则放置于最上方。

启动Dae

使用如下命令可以启动Dae。
如果需要在前台使用Dae,便于查看Dae运行情况,可以使用:
当修改配置文件后,需要重载Dae配置文件时,可以使用:

自动更新并存储订阅

由于Dae每次启动时均需要重新读取订阅信息,本身并不存取订阅信息,当订阅链接被墙或者无法访问时,就无法正常获取到订阅信息及分组信息,造成访问异常。以下方法可以实现订阅信息存储和自动订阅更新。

systemd.timer方法

假设你的dae配置文件存储于/usr/local/etc/dae/ ,这也是通过自动安装脚本默认的存储位置。那么新建一个/usr/local/bin/update-dae-subs.sh文件:
赋予这个文件可执行权限:
配置systemd.timersystemd.service进行自动更新
  • /etc/systemd/system/update-subs.timer: 以下代码是每12小时,或者每次系统启动后15分钟更新
  • /etc/systemd/system/update-subs.service:
新建订阅链接文件:/usr/local/etc/dae/sublist ,并安装以下模板填写订阅链接,如果只有一个订阅,则保留并填写一个即可。当通过update-subs.timer 拉取订阅信息时,会自动建立sub1sub2sub3 的订阅文件。
赋予订阅链接文件600权限
修改config.daesubscription 部分内容为订阅文件
启动Timer
 

crontab方法

如果你的系统没有system.timer ,也可以使用crontab进行替代。区别在于无法实现系统启动后自定义时间进行更新,只能定时更新。
编写/usr/local/bin/update-dae-subs.sh 文件
通过crontab实现定时更新,以下例子为12小时执行一次。你可以使用crontab计算器查询定时规则。
剩余步骤与上面system.timer部分相同。

🤗 其他用法

如果需要图形界面进行配置,可以选择Daed,配置文件内容大同小异,主要就是DNS和Routing部分,对应截取之后粘贴到控制台里面就好。

OpenAI相关规则

geosite:openai 规则并不全面,如果遇到无法使用的情况,可以添加以下部分规则,替换ai 代理组为你的代理组名称:
以上规则包括Gemini,Openai,Copilot,Apple Intelligence, Claude
最后打个广告,我一直在使用的OpenAI是由Dream API提供,相对于合租车来说,使用起来更灵活一些。
 

关于CPU占用率高及内存泄露

建议添加如下规则禁止Quic。Daed也建议添加该规则。

📎 参考文章

 
💡
有关Dae安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

Dae搭配AdGuard Home使用指南

2024年11月7日 08:00
😀
在之前配置好家庭网络环境后,稳定运行了很久,大致上也基本满足日常需要,但是还有一些小的问题需要去解决。之前使用的是Dae + MosDNS配置,由DAE劫持流量进行最后的分流和代理,MosDNS主要用于DNS的并发请求和使用DOH、DOT服务,同时也负责DNS去广告。在使用过程中,由于MosDNS的队列化和无图形界面配置,进行特殊规则配置过于麻烦,最终决定还是在整体的DNS链路中增加AdGuard Home单独负责去广告和相关特殊规则的指定,MosDNS仅作为DNS转发器使用,不再兼顾过滤器的作用。
由于Dae的DNS处理方式与OpenClash、Singbox等不同,是通过劫持流量方式实现,无法直接指定端口进行DNS劫持,所以主要的配置部分在于Dae,MosDNS与AdGuard Home的配置部分基本维持原有配置即可。
另一个配置前提:由于我在主路由RouterOS上已经使用ospf进行了国内外流量的分流,所以此教程可能不一定适合于完全使用Dae进行分流的用户,如果存在分流错误等问题,可以尝试修改Global配置中的连接选项为domain++模式。

📝 Dae配置部分

Daed安装

其实这部分说明文档里面已经很完善,可以参考Github上的教程。我自己使用的是Daed,目前最新的Daed版本是0.9.0版本。相比于Dae,Daed提供一个可视化的网页管理面板,日常进行自定义配置时候更为方便一些。在资源占用上,Daed相比Dae占用的内存要多一些,大概多出100mb左右。
Debian或者Ubuntu安装执行如下命令:
其他系统可参考:
getting-started.md
daeuniverse

Global配置

连接选项使用domain模式,其他无需修改。不需要使用Dae的domain+domain++ 模式。

DNS

由于处理DNS分流和解析不再由Dae负责,所以DNS部分的配置非常简单:
其中adg即AdGuard Home,配置为AdGuard Home监听的地址和端口。此处我使用的默认53端口,如果53端口已经被占用或者存在其他问题,可替换为其他非标端口。

路由部分

路由部分需要在原有的配置基础上,对AdGuard Home进程、MosDNS进程以及系统默认的NetworkManager进程使用direct(must)规则特殊处理,从而避免产生路由回环。
同时,为了在AdGuardHome中可以正确的显示各设备的IP地址,需要对geoip:private 规则进行修改,使用direct(must)规则。如果使用的是direct规则,那么在AdGuard Home中显示的设备信息均为localhost(127.0.0.1)
 

Route整体规则

整体规则大致如下,里面有一些自定义的配置,可以根据自己需要进行删减。

direct与direct(must)区别

must_rules表示不将DNS流量重定向到dae并继续匹配。对于单一规则,directmust_direct的区别在于direct会劫持和处理DNS请求(用于流量分割使用),但must_direct不会。当存在DNS请求的流量循环时,must_direct很有用。must_direct也可以写成direct(must)
在上述配置中,以AdGuard Home为例,即进程AdGuardHome匹配的规则不进行DNS流量的劫持和处理且为直连,由AdGuard Home及其上游进行处理,同时由于规则:
将通过Google DNS的流量使用代理处理,从而避免DNS污染。

📝 AdGuard Home配置部分

AdGuard Home部分没有什么需要特别注意配置的,只需要指定上游DNS为Dae所在机器IP地址即可。需要注意的是,如果使用MosDNS作为Dae的DNS解析服务程序,AdGuard Home中不要指向MosDNS的地址,会造成内存泄露以及高CPU占用。公共DNS服务器可以参考:国内外DNS推荐列表 | Dolingou
我所使用的MosDNS配置文件可以参考:mosdns-config-with-no-leak
notion image

🤗 总结归纳

目前情况良好,暂时没有出现错误问题,且能够更方便的对特定客户端、域名进行放行。
 

后续

由于AdGuard Home与Dae处于同一台机器,在使用must_direct规则时会造成DNS泄露问题,但如果使用direct规则,在AdGuard Home中又无法正常识别发出DNS请求的客户端,所以我最终还是选择在PVE中新建一个CT容器(LXC),单独负责AdGuard Home和Tailscale。AdGuard Home的上游DNS指向Dae所在的内网IP地址,同时在Dae中,对private部分规则使用direct规则,既满足避免DNS泄露的需要,又满足对各客户端DNS请求的管理。
这也是我第一次使用LXC,CT模板使用的是alpine,目前对效能感到满意,在未开启AdGuard Home时,CPU占用几乎没有,内存占用13MB左右,开启AdGuard Home的情况下,单核CPU占用0.4%,内存占用不到50MB。
在使用局域网其他机器作为DNS入口时,需要在Dae的Routing中增加以下配置,避免DNS请求环路,将下面的10.0.0.20 替换为你的DNS服务入口IP地址。
 
同时由于内存泄露问题,建议使用Dae而非Daed,同样配置文件,在Dae下内存占用不到500M,但是Daed基本要奔着1G去了,长时间使用情况下,Daed的内存泄露问题更为严重。在Dae的版本上,目前我在使用Dae 0.9rc2情况下,存在CPU占用虚高问题,0.8版本未出现问题。
我自身配置问题,与Daed无关,配置正确情况下,未发现Daed出现内存泄露情况。同时初始内存占用也没有1G。
另外,如果使用其他机器作为DNS入口,那么其指向的DNS应为Dae所在机器的IP,不要直接指向MosDNS,由Dae再指向MosDNS,避免DNS重复劫持,造成内存泄露与CPU高占用,配置文件大致如下:
AdGuard Home中的上游DNS指向Dae所在机器IP,同时Dae的DNS部分配置指向MosDNS端口

关于AdGuard Home的卸载

由于已经在LXC容器中单独部署了AdGuard Home,所以原来Debian机器上的AdGuard Home就可以卸载了,首先找到AdGuard Home二进制文件的位置,Debian/Ubuntu系统的位置一般位于/opt/AdGuardHome
执行以下命令注销AdGuard Home相关服务
删除AdGuard Home工作文件夹

📎 参考文章

 
💡
有关AdGuard Home安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

2024年个人总结

2025年1月6日 22:05

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轻松实现跨地域设备互联

2025年1月6日 22:01

异地组网工具新推荐,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

2024年9月6日 08:00
⛏️
OpenClash的“实验性:绕过中国大陆IP“功能是通过Dnsmasq进行实现,旨在将国内IP通过防火墙转发规则,国内IPv4和IPv6的流量不经过Clash(Mihomo)内核处理,增强直连性能,降低OpenWRT软路由的资源占用。对于进阶使用用户来说,在使用上存在诸多不便,例如无法与MosDNS、Adguard Home完美配合。我作为一个只能看懂一部分代码,完全不会写的选手,在ChatGPT和Cursor的帮助下,尝试找到一个不依赖于Dnsmasq,也可以使中国大陆IP流量不经过Clash(Mihomo)内核的方法。
 
本篇的配置项目前还未经过长时间生产环境使用,可能存在不稳定、规则冲突、未知问题等可能。在操作之前,请进行备份,避免无法恢复的网络宕机。

实验环境

  • 旁路由(旁路网关):OpenWRTImmortalWrt 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的原理

OpenClash的大部分核心外功能实现基本都是通过/etc/init.d/openclash这个启动文件实现。在文件中,涉及实验性:绕过中国大陆IP的主要功能部分包括:
  • ip set/nft set 管理,也就是IP集合管理
  • China_ip_route规则匹配及重定向
  • 利用Dnsmasq进行国内域名列表(/etc/openclash/accelerated-domains.china.conf)内的域名解析

IP集合

OpenClash内置了两个IP集合,分别为China_ip_route集合和China_ip_route_pass集合,通过插件设置 - 大陆白名单订阅 进行维护,没有使用GeoIP:CN进行维护。

China_ip_route规则匹配

在Openclash选择绕过大陆IP时,通过fw4进行进行流量检测,当检测到目标IP地址属于中国大陆时,通过openclash链、openclash_mangle链、以及openclash_mangle_out链进行return操作,使流量按原链继续进行,不再经由clash内核进行处理。

openclash_mangle链

openclash_mangle链的作用是用于修改流量的特性,通常用于更改数据包的标记、TTL(生存时间)等,对流量进行细颗粒度控制,标记流量进行后续处理等。
  • 条件判断:检查变量 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链

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链

openclash_mangle_output链专门用于处理输出流量,即从本地系统发出的流量(路由器本机流量)。之前我只配置了mangle链和openclash链,没有对openclash_mangle_output链进行防火墙配置,导致mosdns的还是会经过clash(mihomo)核心,也造成在多并发进行DNS请求时,upstream errorexchange 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规则匹配

China_ip_route_pass这个IP集是通过劫持Dnsmasq,使用设定的dns对国内常见域名(也就是/etc/openclash/accelerated-domains.china.conf 文件内域名)进行解析并生成的IP集。这部分非常依赖于Dnsmasq,但在我们这里由于已经有MosDNS进行分流,所以不用过于关注。

📝 配置流程

China_ip_route的nft规则配置

通过对上面fw4表内openclash链、openclash_mangle链以及openclash_mangle_output链的分析,可以基本明确我们要进行带操作。
  • 首先我们需要处于fake-ip模式
  • 关闭实验性绕过中国大陆IP选项,因为我们要手动添加防火墙规则进行绕过
  • 关闭DNS劫持
在关闭DNS劫持的同时,我们符合enable_redirect_dns 选项,即没有使用防火墙劫持DNS,所以我们采用if下的第一条判断结果。

添加防火墙规则

由于防火墙规则采用顺序匹配,如果我们采用add的方式,无论如何只会附加规则至每条防火墙规则链的底部,所以这里采用insert方式。

openclash链

openclash_mangle链

openclash_mangle_output链

 
添加完成之后,在Openclash的页面进行重置所有链接,同时观察是否有匹配国内IP的流量进入列表,如果没有即表示成功。同时在OpenWRT的防火墙页面,应该可以找到我们添加的规则以及对应规则匹配的计数,通过这个也可以观察是否绕过成功。
notion image

配置OpenClash自定义防火墙规则

为了避免每次OpenClash重启或者路由器重启后需要手动重复执行nft命令,我们可以将上述三条规则写入到openclash的自定义规则里面。配置位置位于:插件设置 - 开发者选项
notion image

关于IPV6

由于openclash的实验性:绕过中国大陆IPv6不完全依赖于dnsmasq,所以可以放心开启,不用做特别的配置。

关于规则更新

由于目前使用的是大陆白名单提供的IP地址集,所以可以通过OpenClash提供的Web端页面进行更新,也可以在页面配置定时更新,不必过多担心IP地址变化带来的白名单错乱。之后我也会尝试使用GEOIP:CN作为IP集进行研究。

已知问题

会使之前配置的DNS防泄漏无效,目前还在研究是哪个环节出现的问题。

🤗 总结归纳

这次主要折腾的原因在于很羡慕Dae的直连性能,但是还没有把Dae放在生产环境真正的使用过,所以想看看有没有什么办法在不使用dnsmasq,仅通过防火墙进行一些修改,让mosdns+openclash这套配置更为完善,同时也能让自己更为熟悉fw4、nftable以及OpenWRT的防火墙配置。
通过上面对nft命令以及规则的了解,也可以通过nft进行局域网设备的黑名单配置,使特定设备流量不进入到Clash(Mihomo)内核,避免违反机场的TOS规则,例如BT、PCDN等等。

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

IPv6与OpenWRT旁路由共存:代理分流与原生地址的完美平衡

2024年8月19日 08:00
🚧
搬家之后,原来的网络拓扑结构放在新家里总会出现奇奇怪怪的问题,尤其是在IPv6这方面。一方面我非常希望家里可以用上体验良好的IPv6(远程串流、BT、内网穿透等等都不用受制于没有公网IP),同时又不想因为IPv6而在IPv4的外网方面有所妥协,比如无法使用Netflix一类,或者无法使用到IPv6这种无NAT的,可以端到端的特性。目前整体的网络算是调整完毕,也将整体的调整过程写一篇博客进行记录,希望可以帮到面临相同问题的朋友。
为什么要使用IPv6? 我只能说,这是一个趋势:《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》。目前国内IPv6基本已经处于可用状态,线路优化相比之前也有了很大提升。不过需要注意的是,目前国内的IPv6是禁止国外IPv6请求入站,至少是禁Ping,部分运营商因为PCDN的缘故,也会直接禁止IPv6入站。

📝 付费内容

配置前提

  1. 运营商下发的IPv6 PD前缀应小于64,一般来说都是60-62左右。如果你的运营商没有下发类似的前缀,或者下发的前缀为/64,那么这篇文章的内容可能并不适用于你的网络环境。具体可以在这里查看:调查下各地运营商光纤宽带分配的 IPv6 PD 前缀的长度 - V2EX
  1. 机场代理支持IPv6(例如我的TAG Internet)。
  1. 主路由和旁路由均为OpenWRT系统(基于ImmortalWRT),其他系统需要根据需要自行摸索。
  1. 尽量从纯净系统方案下进行配置,避免软件或规则冲突。同时做好备份。
  1. Windows下可以通过getmac /v 命令查看本机网卡的mac地址。

网络拓扑

notion image

网络目标

整体的网络设计是需要有一个清晰的目标所谓导向,所有的解决方案都是为了实现这个目标。那么我在新家的网络目标如下:
  1. 旁路网关(旁路由)架构,可以实现对不同客户端的IPv4网关及DNS配置。同时旁路网关不负责任何NAT转换操作。
  1. 国内IPv4流量可通过旁路网关 - 主路由网关 的路径,特定设备可直接通过主路由网关 ,避免因为BT、PCDN等对旁路网关上的代理机场产生影响。
  1. 国外IPv4流量通过旁路网关 - OpenClash的Mihomo内核进行分流及代理。
  1. 所有IPv6流量默认通过旁路网关 - OpenClash的Mihomo内核进行分流及代理,国外IPv6流量可通过机场的IPv6节点进行代理使用相关服务。
  1. 国内IPv6流量使用运营商分发前缀分配的IPv6地址,且可通过客户端配置绕过旁路IPv6网关,实现使用原生IPv6地址使用BT功能。
  1. 通过旁路静态路由配置实现特定设备直接使用主路由IPv6网关(未实现)
针对网络目标的1、2、3点,已经有很多的教程指导如何实现。包括但不限于通过主路由的dnsmasq实现自定义给客户端下发的网关地址、DNS等等。我在之前也写过一篇文章,可以参考:Dnsmasq进阶技巧:为不同设备定制DNS服务器
针对文中的4、5点,可以进行拆分,将主路由和旁路网关(旁路由)在网络中的职责进行细化:

主路由

  1. 从运营商获取可分配的IPv6前缀,也就是需要小于64位的前缀。
  1. 不作为局域网内的RA服务器,原因在于在IPv6的网络环境下,客户端会自动将RA服务器作为其默认的网关,而在我们的网络目标中,整体网络中距离客户端最近的网关应该是旁路网关。
  1. 以中继方式将DHCPv6-PD过渡给旁路网关(旁路由),将局域网内的IPv6地址分配任务交给旁路网关实现。

旁路网关(旁路由)

  1. 从主路由(上级网关)获得DHCPv6-PD的分配权限
  1. 作为RA(IPv6 Router Advertisement)服务器,但不作为DHCPv6的服务器,通过RA向局域网内的客户端提供IPv6地址分配功能,从而使客户端的默认网关及DNS为旁路网关。这样仅需要对特定设备进行特殊化配置,同时在一个局域网中只存在一个DHCPv6服务器,避免多服务器优先级造成分配紊乱,例如存在两个DHCPv6服务器时,客户端IPv6 DNS无法获取这种问题。同时因为主路由通过RA服务器启用SLACC,所以也支持Android设备的地址分配。如果主路由未启用RA服务器和SLACC,只有旁路由开启,我测试下来是Android设备还是获取不到公网的IPv6地址。
  1. 其实还有一种方法是通过radvd方式强制提高旁路由的RA服务优先级,从而使局域网内设备使用旁路由所提供的RA信息,但由于一方面radvd较老,OpenWRT并没有提供编译好的安装包,自行编译的依赖关系又很乱;另一方面局域网内存在两个RA Server终究是一个潜在的隐患,所以不采用此方案。

解决方案

主路由:

  1. 首先在全局网络选项中清空IPv6 ULA 前缀
  1. 配置WAN_6口:获取运营商IPv6前缀及PD权限。这里有两种方法,都可以:
    1. 修改原WAN口设置:高级设置中,获取IPv6地址为自动。这种方法可在WAN口PPPoE拨号成功之后,自动生成一个WAN_6的虚拟动态接口,同时获得IPv6地址及PD前缀。
    2. 新增一个WAN_6接口:协议选择DHCPv6,设备选择接口别名:"@wan" 。防火墙配置选择wan,DHCP选项中的IPv6设置全部选择中继。高级设置中委托IPv6前缀开启,IPv6分配长度64,IPv6后缀填写EUI64 ,便于生成的IPv6地址记忆,在配置防火墙规则时更好用。
  1. 配置原WAN口:修改DHCP服务器中的IPv6设置全部为中继模式;高级设置中的IPv6源路由勾选,委托IPv6前缀不勾选,分配长度禁用。
  1. 配置LAN口:不需要新增LAN_6口,使用原LAN口即可完成中继;
    1. 高级设置:委托IPv6前缀勾选,委托长度60(具体看运营商可以给多少长度的PD),其他默认。
    2. DHCP服务器 - IPv6设置:指定主接口不勾选;RA服务启用服务器模式,默认路由自动,RA标记其他配置(Stateless无配置);DHCPv6服务选择服务器模式(中继模式无法将PD下发到旁路),通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,本地IPv6 DNS服务器不勾选,通告域名空,NDP代理中继,前缀有效期和遵守IPv4有效期默认。
  1. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘medium’ ,配置主路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。

旁路网关(旁路由):

我的旁路网关只有一个LAN口,没有配置WAN口。
  1. 首先在全局网络选项中清空IPv6 ULA 前缀
  1. 配置LAN_6口:
    1. 新增一个LAN_6口,协议选择DHCPv6,设备选择接口别名:"@lan" 。目的是通过@lan口与主路由的lan口对接,从而获得IPv6地址。
    2. 请求IPv6地址:选择force,选择try也可以
    3. 请求指定长度的IPv6前缀:填写你在主路由获取的PD的地址后面的数字+1或2,例如我在主路由的PD地址是240e:3a4:****:****::/60 ,那么我在这里填写的就是62,理论上61也可以获取,但只影响可分配地址的范围,家用环境下区别不大,没有那么多的设备。
    4. 高级设置:使用默认网关勾选;自动获取dns服务器勾选;IPv6源路由勾选;委托IPv6前缀勾选;IPv6分配长度64;前缀过滤器不选择;IPv6后缀填写EUI64;IPv6优先级默认0
    5. 防火墙设置:防火墙选与不选区别不大,或者我还没发现有什么区别。
    6. DHCP服务器:常规设置,忽略此接口;IPv6设置,指定主接口勾选,其他全部禁用(包括RA服务、DHCPv6服务、NDP代理,这些都是需要在LAN口实现,LAN_6口不进行提供)
  1. 配置LAN口:
    1. 高级设置:委托IPv6前缀不选;IPv6分配长度禁用;剩下默认
    2. DHCP服务器:IPv6设置下,指定主接口不勾选,RA服务器为服务器模式,DHCPv6服务为设置为中继模式,因为我们主路由已经配置了DHCPv6服务器,通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,例如我的为fe80::****:****:****:f02d ,这个地址可以通过ssh到旁路由,ifconfig查看到;通告的DNS域名为空;NDP代理中继。
    3. IPv6RA设置:默认路由器,选择在可用的前缀上;启用SLACC勾选;RA标记,其他配置;其他默认。
      1. 受管配置:开启后,客户端会请求 DHCPv6 服务器提供完整的网络信息(如 IP 地址、DNS 信息等)。这种模式下,客户端不再自行生成 IPv6 地址(即不通过 SLAAC 自动配置 IP 地址),即IPv6的有模式(Stateful),完全依赖DHCPv6进行地址分配,但在Android下无法使用。
      2. 移动home配置:移动 Home 标志(H Flag)用于标识一个节点是否可以在移动环境下与 Home Agent 通信。这对家庭用户或一般路由配置通常没有实际意义,除非涉及到特殊的移动 IPv6 配置。
      3. 其他配置:在启用了 SLAAC(无状态自动配置)时,客户端可以自动生成 IPv6 地址,但需要通过 DHCPv6 获取额外的配置信息(如 DNS)。这个标志位通常用于混合环境,即 IP 地址通过 SLAAC 自动生成,而其他信息通过 DHCPv6 获取。在关闭受管配置,并开启其他配置时,即IPv6的无模式(Stateless),不通过DHCPv6进行地址分配。
    4. 如果LAN_6和LAN口都开启委托IPv6前缀,那么一个设备大概会生成4个IPv6地址,但我们并不需要那么多,所以可以将LAN口的委托关闭。
    5. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘high’ ,提高旁路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
 
通过以上配置之后,主路由大概是这样:
notion image
旁路由大概是这样:
notion image
同时,现在旁路由作为整个局域网中唯一的RA服务器,也就成为了唯一的通告网关。

Dnsmasq设置:

如果你还在使用Dnsmasq作为DNS转发器,那么需要关闭过滤器 - 过滤IPv6 AAAA记录,从而使Dnsmasq可以解析IPv6域名。
notion image

OpenClash设置:

OpenClash这里没什么好说的,我选择的是mihomo内核(clash_meta内核)。废话不多说,直接上图,就是把IPv6配置项这页配置一下。代理模式可以根据需要进行选择,由于我是Fake-IP的混合模式很久了,且需要代理一些UDP流量,所以这里选择的TUN模式,同时在ipv6我也使用的是tun模式。tproxy可能性能会更好一些,但不清楚是否会有其他NAT问题出现。
值得一提的是,这里的实验性:绕过中国大陆IPv6并不依赖于Dnsmasq,所以如果使用其他DNS转发服务的话(例如MoDNS或者AdGuard Home),也可以放心勾选。同时,如果已经使用mosdns进行分流,并且dnsmasq监听端口为53之外的端口,也可以开启实验性:绕过中国大陆IP ,开启后会通过nft set或者ipset将大陆IP端添加到防火墙中,不经过clash核心,提高性能,丧失的只是将dnsmasq通过特定dns解析返回的大陆IP地址添加到ipset这一项。 具体可以参考《实验性:不使用Dnsmasq绕过中国大陆IP》这篇文章。
notion image

路由设置:

在以上配置完成之后,可能存在客户端ping外网出现Destination host unreachable的情况,通过查看路由表发现是旁路网关没有将主路由网关配置到路由表中,需要自己自行添加,lan口和lan6口都需要添加。
路由类型:unicast
目标:::/0
网关:主路由的本地IPv6网关地址,fe80::开头,可以通过SSH登录主路由之后ifconfig查看,LAN口的就是。
高级设置:表main(254)
notion image

🤗 总结归纳

通过以上设置的话, 现在局域网内设备应该是可以获取到/64位的IPv6地址,且所获得的IPv6地址的默认网关及DNS服务器为旁路网关,达到了整个局域网内的IPv6使用代理。在Test your IPv6. (test-ipv6.com)上也可以检测出IPv6地址为代理的IPv6地址,同时针对不需要代理的服务,我们的IPv6地址还是运营商分发的前缀。
notion image
notion image
其他针对BT客户端这种,我是通过单独虚拟一张网卡给qBitorrent使用,并单独配置这张网卡的网关为主路由网关,避免BT流量经过旁路由,可以正常使用。
notion image
 

其他待解决问题:

目前网心云可以获取到运营商分发的前缀的IPv6地址,但状态显示IPv6待联通,通过Hyper-V虚拟机内部可以ping通外部IPv6地址,需要再进行观察一下,看看是否需要单独进行配置。目前在尝试通过静态路由或者防火墙的方式进行解决。
 
如果你从主路由无法ping通局域网下设备的link-local ipv6 address ,也就是本地fe80开头的IPv6地址,出现address unreachable 错误,可以尝试为地址增加接口参数,例如:
其中%br-lan即指定接口为br-lan,也就是本地网络接口。
 
2024/09/30更新:
网心云X86虚拟机默认只会接收一个RA服务器发送的SLACC,所以如果网络中存在多个RA服务器,那么网心云X86即便可以获取到正确的公网IPv6地址,也无法配置正确的网关和DNS,所以在网心云App中会显示IPv6待连通的情况。解决办法只能修改局域网的网络拓扑,变更为局域网只有一个RA服务器,且停用DHCPv6服务器。在OpenWRT下的具体方法我还在研究,目前仅能提供RouterOS作为主路由情况下的解决办法:RouterOS自动分流方案(支持IPv4 & IPv6)

📎 参考文章

 
💡
有关OpenWRT IPv6安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

解决OpenWRT中VIM报错‘Failed to source defaults.vim’问题

2024年3月30日 08:00
通过OpenWRT的包管理器opkg进行vim-9.0安装后,在使用时会报错:
即便是安装vim-full没有办法解决,所以应该不是缺少依赖一类的问题。这个错误虽然不影响正常使用,但是每次编辑文件时都需要再按一下回车键,也很烦,所以我找了一下解决办法。

📝 解决方法

在OpenWRT终端中输入下面命令:
返回结果:
即可。
再次进入Vim就不会有E1187: Failed to source defaults.vim Press ENTER or type command to continue的报错提示了。
还有一种方法,通过建立软链接方式:
如果是非root用户:
也可以解决问题。

📎 参考文章

 
💡
有关OpenWRT和VIM安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

NieR Automata Ver 1.1a 【第八集已更新】

2023年5月6日 08:00
⚠️
《尼尔:自动人形 Ver1.1a》是一部备受期待的动画作品,改编自广受好评的游戏《尼尔:机械纪元》。由A-1 Pictures制作,益山亮司执导。该动画于2023年1月7日开始播出,融合了科幻、哲学、动作元素与二次元,完美呈现了原作游戏的魅力和性癖。本文提供最新的第八集更新信息,包括高清下载链接和字幕资源。无论是游戏粉丝还是动画爱好者,这部2023年的热门作品都值得一看。
 
notion image

友情提示!Netflix也可以看的!已经上Netflix了!合租可以看这里:

三周没更新啦!!!!想念A2!!!!

【NEW】第八集:[ANi] NieRAutomata Ver11a - 尼爾:自動人形 Ver1.1a - 08 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]

INFO
Torrent Info By: ANi API (Auto Generated)Subtitle: HardSub 中文繁体Mediainfo: Resolution: 1080P Video Format: AVC Audio Format: AAC
Magnet

第七集:[神楽坂 まひろ] 尼爾:自動人形 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
中文字幕需要手动调整,提前5秒钟左右。后续更新字幕组版本。
默认屏蔽迅雷客户端。
织梦字幕组版本为:[织梦字幕组][尼尔:机械纪元 NieR Automata Ver1.1a][07集][1080P][AVC][简日双语]
Magnet

第六集:[NanakoRaws] NieR Automata Ver 1.1a - 06 (1080p).mp4

阿里云盘中为4K版本
Magnet

第五集:[NanakoRaws] NieR Automata Ver 1.1a - 05 (1080p).mp4

阿里云盘中为4K版本
Magnet
#尼尔:机械纪元 动画版 尼尔:人工生命
 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

ONEBLOG纯文字主题

ONEBLOG纯文字typecho主题

ONEBLOG

TYPECHO,纯文字博客主题,精心雕琢五年,专为写作爱好者打造,响应式设计。

预览

{button href="https://demo.typecho.work/?theme=ONEBLOG" type="blue"}在线预览{/button}

作者博客

https://blog.luziyang.cn/

下载

介绍

  • 极致的性能,页面加载平均仅需0.03 s
  • 极致的简约风,扁平化设计;
  • 极致的松弛美感,精益求精的留白,让每一次访问都是一种享受。
    详细详见GITHUB介绍

用峨眉山的第一缕阳光给25年开个好头【完】

2025年1月6日 12:54

null

夜爬峨眉山强度挺大的,不是那么好拿捏,不要被抖音、小红书给你洗脑了!
去之前一定要能理解爬20多公里的楼梯是个什么概念!
我应该不会再爬第二次了....!

感冒

上次写完行程规划之后,不知道是不是早上晨跑衣服穿少的缘故,我忽然得了重感冒。

那几天开始全身酸痛,同时伴有咽痛、咳嗽,而且连续两个晚上发烧 + 白天退烧,为了不影响 31 号的出发,所以请了两天假在家中休息,调养。

好在出发前的早上,感冒的大部分症状都痊愈了,但是还是能明显感觉到体力依旧还是没有恢复。但是行程、人员都已经确定好,可不能放大家的鸽子。

所以不管如何都要先把大家送过去,如果身体实在跟不上就放弃徒步上山,坐观光车上金顶去等大家。

人员

在前面的行程规划一文中提到了当时确定要去的只有我、霜、小罗三人,我到时候打算开我台上不了台面的破 7 坐面包车过去,因此最好还是再找至少 4 人同行,以最大化平摊大家的费用,同时因为人多了后,玩起来也更有意思。

所以,出发前的几天我们就陆续在自己熟悉的圈子内寻找合适同行的队友,但是我这边进展不太顺利,频频碰壁,其中一个户外微信群居然还直接把我踢出群,不过我也庆幸被踢出去了,玩户外的这么小心眼即便在玩在一起也不会有多大意思。

好在小罗那边进展顺利,一直都有拉人进来,虽然其中有些朋友因为行程问题、装备问题赶不上,但是都非常好沟通,部分表示虽然这次不能参与,但是依旧期待下次同行。

最后,在出行前一天把终于把人员都确定好了,分别为:我、霜、小罗、太阳(兵哥哥)、vivi 姐、高兴哥、成歌。

1.太阳 2. 小罗 3. 霜 4.我 5. 成歌
1. 高兴哥 2. 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年1月6日 02:40

🌆 封面图:2025 的第一次日出

2025 的第一次日出

📑 Weekly 复刊词:吾一周一省吾身

人必须不断地、周期性地审视自己。这种审视必须通过外化表达的方式才能完成,也就是写作。

而一周是较为合适的时间单位。一周是一年的 2%,是一生的1/4000。如果你把一年,甚至一生的每一周画到一张纸上,每个格子代表一周,你会发现原来这么少。《四千周》这本书就送了一张这样的格子纸。长期来看,以周为单位计算时间流逝的长期进程,非常适合量化。而一周(一般来说)有工作日和休息日,也能给我们足够的自由时间。

虽然我平常一直活跃在 Twitter,但这毕竟是个短文平台,字数限制让人无法进行长文输出与深度思考(除非开 Premium)。因此,我依然在我的博客进行每周回顾。

上一期 Weekly #22 终结于2024 年 10 月 20 日,后来的两个多月都没有更新。其实是因为 22 周之后我开始旅游,去了广州、深圳、香港玩,后两周断更了。而一个习惯一旦经历了两次放弃,就会迎来可怕的习以为常,导致一直拖更到现在……

正好,这也是 2025 的第一周。我确定了两件往往「重要而不紧急」的事,需要长期坚持:阅读和周记。阅读是输入,周记是输出。如果我能坚持写一年的周记,那就太酷了。

🎯 我的 2024,我的成长

过去的 2024 年,我觉得我感受到的一个主题是:「成长」。

回想 2024 年年初的我,当时的自己对未来一片迷茫,还在想着或许考研,但明明内心非常不愿意,这只是在逃避对未来选择的思考。当时的自己甚至还没开始考虑和了解未来其他的可能性。因为在 HNU 大量平庸而无聊的同学身上,很难看到其他可能性。

这一年经历的事情可真多:

  1. 决定不读研。下定决定后,一切都豁然开朗。
  2. 人生的第一份大厂实习。
  3. AdventureX。👉 Weekly #9:AdventureX —— 热爱为主,搞钱为辅
  4. 旅游。西安、南昌、杭州、上海、武汉、广州、深圳、香港、浏阳。
  5. 开始将 Twitter 作为主力的社交平台。从零开始涨到将近 3k fo。Connect 了不少很有意思的朋友。
  6. 春招&秋招。面试、刷题、背八股。
  7. 签订三方。毕业去向基本尘埃落定。

经历了这一切,现在的自己,已经是个完全不同的人了。无论是对职业、行业、技术、社会的理解,还是社交能力,相比 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

大家的 2024 总结:

🎆 新年快乐。下周见!

251、小寒

2025年1月5日 18:07

null

跨年时峨眉金顶日出和第一缕阳光
### columns1 Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa protulit, sed sed aere valvis inhaesuro Pallas animam: qui quid, ignes. Miseratus fonte Ditis conubia. --shortcode--
### 副标题 Markdown内容。

为个人网站接入支付功能 - 支付宝准备篇

2025年1月5日 15:53

前言

通过前面两篇文章:独立开发如何接入支付宝和微信支付独立开发者应该如何注册个体工商户,我们知道,个人开发者也是可以比较简单、且体面的为自己的产品接入支付功能的。

众所周知,对接支付相对而言还是比较麻烦且敏感的,但无论是开发网站还是APP,只要涉及到支付,就很难绕开这个话题。而且不同的业务场景、产品形态,需要对接的支付方式也不太一样。不仅如此,在国内,支付至少要支持支付宝和微信两种方式,其复杂性就再一次翻倍了。

因此,接下来我将以我自己的网站为例,分两篇文章介绍一下我是如何以尽可能简单的方式接入支付宝支付的,微信支付后面再说。

当然,思路仅作参考,正式对接起来,还是应该多多查阅官方文档,官方文档才是最靠谱的。

[...]

「用户管理」:一键实现用户名称优化,用户安全增强,自定义头像等多项功能 WordPress 插件

2025年1月4日 19:22

这是基于 WPJAM Basic 的超强的 WordPress 用户管理的插件,有多强大呢,首先看后台的设置界面:

可以说它把 WordPress 相关的用户管理功能都集成了,简单数一数就实现了十多个 WordPress 用户相关功能:

  1. 屏蔽个性化设置
  2. 屏蔽姓氏和名字设置
  3. 取消显示名称设置
  4. 开启别名设置
  5. 隐藏用户登录名
  6. 开启登录次数限制
  7. 用户最后登录时间
  8. 取消「应用程序密码」
  9. 按注册时间排序
  10. 以此身份登陆
  11. 生成密码重置链接
  12. 自定义用户头像
  13. 默认用户头像

下面我们分成五大模块分别来介绍 WPJAM 的「用户管理插件」具体实现了那些功能:

屏蔽个性化设置

WordPress后台个人资料用户可以设置「可视化编辑器」,「语法高亮」,「配色方案」,「键盘快捷键」,「工具栏」,「语言」等这些个性化选项,如下图:

这些选项 WordPress 都是存储到 usermeta 表里面,如果 WordPress 有大量的用户,每个用户会占用7个选项,那么 usermeta 表很快就会爆炸。

比如我运营的 WordPress 站点,有几十万用户,usermeta 表的数据如果不清理的话,已经千万级了,查点东西都慢的要死,如果你和我有一样的困扰,那就可以在插件中勾选实现屏蔽用户的个性化设置,直接采用使用系统全局的默认值。然后还可以根据自己的需求删除这些选项。

用户名称优化

在默认情况下,WordPress 后台个人资料页面中,关于用户的姓名相关的设置是这样的:

是不是有点繁琐,并且很多字段也是存到 usermeta 表中的,我个人觉得关于用户昵称的设置,尽量简洁就好,所以名字和姓氏一般就不需要用户输入,公开显示的名字直接为昵称就好了,所以插件首先提供了下面两个选项:

  • 屏蔽姓名设置:屏蔽了姓氏和名字设置,简化后台个人资料界面设置。
  • 显示名称设置:取消显示名称选择器,直接使用昵称作为显示名称。

另外插件还支持开启了别名设置,是的,我们不仅仅做减法,偶尔也做下加法,这里可以让用户可以编辑自己的别名(user_nicename),这样只要不使用和登录名相同的别名,作者文章链接就不会暴露用户名,当然没有设置别名,插件还是有安全选项来实现防止用户名暴露。

所以优化之后最终的用户界面非常简洁,如下所示:

安全增强

WordPres 用户安全增强体现在两个地方,首先是隐藏登录名,不要让攻击者猜到用户名,然后是开启登录限制,防止密码被暴力破解,插件也提供这两方面的选项:

首先说一下如何隐藏登录名,如果用户没有修改过别名(user_nicename),那么他的别名和登录名(user_login)是一样的,然后作者文章链接或者其他地方就会暴露登录名,为了进一步防止登录名暴露,我们提供了隐藏登录名的选项:

勾选「防止登录名暴露」之后,如果用户的 user_nicenameuser_login 是一样的情况下:

1. 作者文章链接使用 author_id 代替 user_nicename,并且原来的作者链接直接设置为 404 页面,防止用户名暴露

2. user_login 不出现在 body_classcomment_class 中。

3. 隐藏登录失败时候未知用户名和密码不正确的错误信息,这两种情况都显示「用户名或者密码错误」,让攻击者猜去。😁

4. 取消作者相关的 sitemap 以及 REST API 中可以查看所有发布过文章的用户信息列表的中的登录名。

如果真的被攻击者猜到了登录名,那么我们还可以开启登录限制,限制登录失败次数,这样就可以防止密码被暴力破解了,进一步做到安全。

功能增强

除了安全增强之外,我们还增加了一个小功能和屏蔽一个功能,分别是记录用户最后登录时间和取消「应用程序密码」功能:

首先新增记录用户最后登录时间,用户登录之后,在后台用户列表就会显示该用户的最后登录时间,并且支持按照用户最后登录时间进行排序。

默认情况下在后台个人资料页面可以设置「应用程序密码」:

应用程序密码允许通过非交互式系统(例如 XML-RPC 或 REST API)进行身份验证,而无需提供您的实际密码。应用密码可以随时撤销。它们不能用于通过传统方式登录您的网站。

很多人看到这个其实是稀里糊涂,简单说他就是用于 APP 或者小程序通过接口来登录的,但是基本上来说,我们用不到这个功能,所以默认建议屏蔽它。

后台用户列表

对于管理员经常使用的用户列表,也新增一些功能和操作:

首先用户可以除了可以按照上面提示按照最后登录事件排序之外,也可以按照用户注册时间排序,只要你勾选了用户列表里的第一个选项,此外在用户列表页面新增两个操作「以此身份登陆」和「生成密码重置链接」:

如果你是 WordPress 开发者,「以此身份登陆」这个功能特别实用,在用户列表界面,管理员可以轻松以用户的身份登录后台,这样用户说他碰到什么问题,就可以直接登录他的账号去看了,而不是问他要账号密码,这个多难为情啊。😳

WordPress 原来「发送密码重置邮件」这个功能是直接发送密码重置邮件给用户,用户在邮箱里面直接点击操作,改成「生成密码重置链接」,则管理员直接获取密码重置链接,可以通过微信或者其他的社交媒体工具发给用户。

头像设置

在后台个人资料页,用户可以自定义自己的头像。

如果用户没有设置头像,管理员可以设置默认头像,然后随机给用户使用:

最后用户头像还多加一个选项,就是如果用户已经在 Gravatar 里面设置了头像怎么办?有两个选项,从默认中随机选一个,继续使用 Gravatar 的设置。

总结

通过上面的介绍,是不是非常强大,目前我所有用户相关的功能整合到 WPJAM-User 的插件中,只需后台简单的勾选就可以实现绝大部分用户安全和管理相关的功能。


「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:

插件 简介
抓取公众号图文

支持一键同步微信公众号文章到 WordPress 博客,并支持一键将文章中所有图片都下载到 WordPress 媒体库。

搜索优化

WordPress 最强的搜索优化插件,支持限制每个 IP 每分钟搜索次数,达到上限之后屏蔽搜索时长,还可以限制搜索关键词的长度,搜索结果页面限制只显示「搜索结果」,还有以下搜索功能增强:

1. 只搜索文章标题,不搜索文章内容和摘要。
2. 当搜索关键词为空时重定向到首页,只有一篇文章时重定向到文章
3. 后台文章列表支持搜索ID。
4. 支持搜索自定义字段。

编辑器优化

一键增强 WordPress 经典 TinyMCE 编辑器:

1. 增加下划线,背景颜色,两端对齐,字体和大小设置,以及内容分页按钮。
2. 新增插入表格功能。
3. 直接插入屏幕截图。

标题设置

一键设置 WordPress 所有页面的页面标题,通过规则方式让博主可以自定义 WordPres 首页,分类,文章类型,文章详情都所有页面的页面标题。

登录优化

一键优化 WordPress 登录注册界面,并支持第三方账号登录和绑定,目前已经支持微信公众号(所有类型),微信小程序,手机号码第三方平台。

内容模板

实现在内容中插入一段共用的内容模板,通过短代码(shortcode)的方式来实现的,支持统一修改,目前支持普通的内容模板,表格内容模板和卡片内容模板三种类型。

用户管理

最强 WordPress 一键用户管理插件,一键实现以下12个功能:

1. 屏蔽个性化设置
2. 屏蔽姓氏和名字设置
3. 取消显示名称设置
4. 开启别名设置
5. 隐藏用户登录名
6. 开启登录次数限制
7. 用户最后登录时间
8. 按注册时间排序
9. 以此身份登陆
10. 生成密码重置链接
11. 自定义用户头像
12. 默认用户头像

分类管理

这是一个全能的 WordPress 分类管理插件:

1. 层式管理分类
2. 限制分类层级
3. 分类拖动排序
4. 使用数字固定链接
5. 首页文章支持分类过滤
6. 后台文章列表支持分类筛选过滤
7. 后台文章列表支持分类多重筛选

评论增强

这是一个 WordPress 评论增强插件,支持评论置顶,评论点赞和按照点赞数排序。

图片集

1. 给媒体创建个分类「图片集 | collection」
2. 图片分类限制为二级
3. 取消图片编辑入口
4. 附件页面直接图片链接。

配置器

全自动 WordPress 配置器,不用一行代码就可以开发。
支持自定义文章类型,自定义字段,自定义分类,分类选项,全局选项。

Script Loader

通过恢复 WordPress 联合加载方式来优化 WordPress 后台脚本加载。

外部链接

将文章或评论中的外部链接加上安全提示的中间页。
让用户确认之后再跳转,并还支持添加 nofollow rel 属性。

话题标签

文章中插入 #话题标签#。
如果是内部链接,直接跳转,
标签或者分类,则自动转换成标签或分类链接,
否则跳转到搜索链接。

格式文章

在 WordPress 实现真正的文章格式

草稿分享

一键生成草稿临时分享链接
并可设置分享链接的有效期

文章专题

设置文章专题,并在文章末尾显示一个文章专题列表。

文章隐藏

设置文章在列表⻚不显示,并且可以根据不同平台进行设置

Meta Data

可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据:
Post Meta,Term Meta,User Meta 和 Comment Meta。

站点选项

查看和管理所有非 WordPress 系统自动生成的站点选项。
如果你觉得某个选项无用,可以直接删除它。

后台论坛

WordPress 后台论坛,支持创建帖子,分组,消息。

微信小程序

微信小程序 WordPress 基础插件,包含基础类库和管理。

微信群二维码

轮询显示微信群二维码,突破微信群100人限制。

文章置顶

支持置顶文章排序和分类文章置顶的 WordPress 插件

静态文件

一键合并 WordPress 插件和主题的 JS 和 CSS 文件,加快页面加载速度

Debug

一键检测 WordPress 运行效率。

DAE搭配MosDNS使用配置

2024年10月12日 08:00
😀
本篇文章并非DAE及DAED的安装配置入门文章。关于DAE与DAED的安装方法之后会单独编写。本篇文章主要内容为在使用DAE或DAED的情况下,如何搭配MosDNS使用,提供一个高兼容性、高可用性的配置方案。以下内容基于Debian系统。

📝 DAE的DNS原理

DAE的分流原理

域名通过劫持 DNS 请求,将 DNS 请求的域名与所查 IP 进行关联来得到。尽管这种方式有一些问题:
  1. 可能会出现误判。例如需要分流到国内和国外的两个网站拥有同一个 IP,且在短时间内同时被访问,或浏览器有 DNS 缓存。
  1. 用户的 DNS 请求必须通过 dae。例如将 dae 设为 DNS,或在 dae 作为网关的情况下使用公共 DNS。
———
DAE对程序所在网关进行全部流量的处理,且与其他代理程序不同,并不提供DNS的转发端口,而是采用对只有经过该网关的全部DNS请求才会分流,所以无法直接使用原有代理程序那些套娃的DNS行为。
 
更新:
需要注意的是,如果上游MosDNS采用并发策略,一段时间后,可能会存在造成Dae内存泄露的情况,内存占用由原来的500M左右,增加至1G左右。目前原因还在排查。
MosDNS关系不大,如果手机使用相同订阅代理并连接同网WIFI,在内网会产生环回请求造成泄露。

常规代理程序DNS请求及解析

notion image
在未通过公共DNS或者代理远端DNS请求解析的情况下,常规代理软件是可以进行DNS的无限套娃的,并不会返回给客户端解析的结果。在套娃的过程中可以不断针对不同的DNS请求进行过滤和分流,在日常使用中能够极大的提供便利,例如AdGuard Home的广告过滤与可视化控制面板、MosDNS的并发DNS请求、ECS请求等等。

DAE的DNS请求与解析

notion image
DAE的不同点在于,在流量进入网关开始即进行分流,且基于Domain的分流模式必须将DAE作为唯一的DNS入口,在顺序上相当于将将代理程序前置作为入口,且由于DAE并不提供DNS转发的监听端口,所以无法后置于其他DNS程序。

📝 DAE与MosDNS的配合

DAE提供了一份使用外置DNS程序的指南:
external-dns.md
daeuniverse
根据这份指南我们可以对整体家庭局域网内的DNS请求链路进行梳理如下:
notion image
例如我在使用MosDNS的情况下,将GeoSite:CN的域名通过MosDNS并发请求阿里的公共DNS服务器,取得结果。同时对GeoSite:GFW以及Graylist(自定义灰名单)的域名使用Google的公共DNS进行请求,使其回到DAE的分流规则之内,这样既满足使用MosDNS并发请求加快DNS解析速度、ECS提供就近CDN节点的同时,也不会扰乱DAE基于domain的分流配置。

DAE DNS配置

主要配置为红色字体部分,DAE的DNS部分仅作为流量的监听,所有DNS的解析均发往MosDNS进行解析,无论是否被污染,由MosDNS中的规则进行DNS分流。

DAE Routing配置

主要部分为红色部分,将MosDNS进程放在must_direct策略内,不将DNS流量重定向到dae并继续匹配,避免产生回环。同时因为可继续匹配,所以MosDNS中使用Google Public DNS规则流量还可以继续进入DAE执行远端请求。

MosDNS配置

定义Tag

主序列配置

query_nocn配置

主DNS服务由Google Public DNS提供,副DNS服务由NextDNS服务提供,在使用Google Public DNS时流量会重新进入DAE,完成解析,获得无污染结果。

🤗 总结归纳

目前这套方法是我用下来最为舒服的,在解析速度和识别被污染域名方面均可以满足我的需要,同时对劫持到反诈页面也有很好的规避效果,例如Linux.do等网站打开也不会被劫持了。唯一不太方便的地方在于对于污染域名的配置上,在添加DNS的自定义规则时,需要在MosDNS的自定义文件内添加,例如我的是graylist
理论上,在此基础上还可以进行套娃,例如使用AdGuard Home等,但由于DAE作为入口劫持所有的流量,所以AdGuard Home的客户端会仅显示为DAE客户端。所以建议如果使用AdGuard Home,可将AdGuard Home放置于另外的容器或主机上作为DNS入口,同时上游配置DAE所在主机IP。

📎 参考文章

 
💡
有关DAE安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
 

Android免拔SIM卡使用官方TikTok

2025年1月4日 08:00
😀
TikTok(抖音国际版)在中国(大陆及香港地区)无法正常使用,原因在于TikTok会检测SIM卡的国家代码,若为中国大陆或香港用户则会直接提示“TikTok 网络错误”或无法使用完整功能,即便已经使用纯净IP的家宽节点。目前常见的解决方法包括拔除SIM卡或修改TikTok应用,即所谓的解锁版,出于账号安全原因,并不建议使用这种Tiktok破解版。今天,我们将介绍一种无需拔卡即可使用官方TikTok的方法。

📝 Tiktok检测原理

TikTok检测中国大陆及香港地区用户的原理主要基于以下三个方面:
  1. SIM卡检测
    • 国家代码检测:TikTok通过读取设备上的SIM卡信息来确定用户所在的国家或地区。中国大陆的SIM卡通常会有特定的国家代码(如CN),当TikTok检测到此代码时,会限制用户的功能或直接显示网络错误。
    • 运营商识别:TikTok还可能通过识别SIM卡所属的运营商来进一步确认用户的地理位置。
    1. IP地址检测
      • 地理定位:TikTok会通过用户的IP地址来判断其所在的地理位置。如果IP地址显示用户位于中国大陆,TikTok会采取相应的限制措施。
      • 动态IP检测:为了防止用户通过VPN等方式绕过检测,TikTok可能会监控IP地址的动态变化,识别异常的IP行为。
      • IP地址干净度:TikTok会尝试对BGP机房的IP地址进行阻止访问,原因在于大部分通过机房线路IP所来的请求为代理请求。
      1. 设备信息检测
        • 设备标识符:TikTok可能通过读取设备的唯一标识符(如IMEI、MAC地址等)来识别用户的设备,并根据设备的注册地或其他信息进行判断。
        • 系统语言和时区:TikTok还会检查设备的系统语言和时区设置,如果这些设置与中国的标准一致,也可能触发检测机制。
        以上检测部分,第二点IP地址检测我们可以通过代理方式进行解决,使用纯净的家宽节点完全可以规避检测。第三点可以通过修改手机语言方式进行解决,时区部分我实测目前没有影响。
        所以剩下的就是第一点,SIM卡检测。这也是为什么现在大多数的Tiktok使用教程均需要将SIM卡从手机移除。而现在通过Nrfr这个开源软件,即可实现SIM卡国家码的修改,从而完全避开TikTok检测,正常使用TikTok,无需ROOT,而且也不用担心各种Tiktok解锁版、Tiktok破解版的程序后门。在Google Play应用商店也可以同步进行更新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使用教程

        开启开发者模式

        这里以我的小米15(澎湃OS2)为例,不同手机品牌与系统可能存在差异。
        打开设置 ,点击我的设备 ,快速且疯狂的点击OS Version(OS版本?系统版本?),直到提示"You are already a developer" ,即表示开启开发者模式成功。
        开发者模式选项位于更多设置 - 开发者选项

        开启USB调试

        进入开发者选项 ,下滑找到USB调试 ,点击开启。如果是澎湃OS2系统,会进行一些风险提示,选择允许。然后找到USB安装 ,同样点击进行开启。如果你是小米手机,或使用MIUI系统或澎湃OS系统,还需要开启USB调试(安全设置)。

        安装Shizuku

        Nrfr的使用需要通过Shizuku获得Android系统的调试权限。所以第一步需要安装Shizuku。你可以通过Google Play进行下载安装,或者通过Shizuku的Github下载最新的Released版本。
        Google Play:Shizuku
        Github Released: GitHub Release

        Shizuku配对

        首先将手机连入一个无线网络(WIFI),有无互联网连接都无所谓,其他手机的热点也可以。原因在于,在未连接WIFI的情况下,无法启用Android开发者模式的无线调试。
        同时,小米手机用户(澎湃OS2)需要修改通知样式为Android默认样式,否则无法在通知栏输入配对码。位置在通知管理 - 通知显示设置 - 原生样式
        打开已经安装的Shizuku,找到通过无线调试启动,点击下面的配对,在第一次使用时,Shizuku会提示开启通知权限。
        点击Shizuku内的开发者选项 ,找到无线调试 ,点击进入,开启无线调试 ,点击使用配对码配对设备 ,然后在Shiziku的通知内,输入配对码完成配对操作。
        配对完成后,可以将通知样式改回原来的样式。

        Nrfr安装

        从Github下载Nrfr。
        下载完成后,解压并打开Nrfr 快速启动工具
        将手机通过USB线连接到电脑,保持开启USB调试权限。此时选择设备中会出现你的手机。
        notion image
        点击确认选择 ,在检查应用中会提示Nrfr的手机App没有安装,点击确认并继续 ,进行安装。
        notion image
        notion image
        点击安装必须应用,手机上会弹出通过USB安装的提示,点击继续安装
        notion image
        点击继续下一步 ,进行Shizuku的启动与授权。
        notion image
        此时会弹出Shizuku未授权的提示,需要我们打开Shizuku,在已授权应用中开启Nrfr的授权选项。
        notion image
        然后在Nrfr 快速启动工具中,点击启动Nrfr
        notion image

        Nrfr设置SIM卡国家码

        在手机上打开Nrfr,显示如下界面
        notion image
        如果是单卡用户,则直接选择SIM卡,然后选择国家码为美国(US)日本(JP) 。双卡用户,修改SIM1 即可,不需要全部进行修改,Tiktok判定其中有一张手机卡的国家码为允许地区的就可以使用。
        另外需要提示,修改的国家码尽量与你的代理节点出口地址相同,防止因IP与国家码不同所出现的账号问题。同时,建议在登录账号时使用纯净度较高的落地IP,避免Tiktok使用三方登录出现问题。
        最后需要注意的是,因为Android开发者权限的原因,每次手机重启之后,需要重新通过打开Android开发者模式中的无线调试功能,启动Shizuku及Nrfr,否则Tiktok还是会提示网络错误。

        🤗 总结归纳

        至此已完成全部的配置工作,此时通过Google Play安装Tiktok并打开,所有功能已经可以全部正常使用,包括登录自己的Tiktok账号。最近我也是高强度的刷了几天Tiktok,把原本睡前刷抖音的时间全部用来刷了Tiktok,发现短视频这个东西真的是毒,几乎没有什么语言障碍,画面表达的内容有时候无需语言,难怪全世界的人们都上瘾。
        不过随着1月19日Tiktok禁令的即将生效,以及大量国外用户涌入小红书(Red Note),估计这篇文章的内容也没有太多的意义了。
        notion image

        TikTok代理规则

        如果你也使用Dae,那么可以增加以下规则用于TikTok分流。请将分流指向JP、SG等出口用于正常使用TikTok,香港出口无法使用TikTok。其他软件根据文件格式可自行修改添加。建议使用国外无污染DNS,避免因为解析结果被判定为国内用户。

        📎 参考文章

         
        💡
        有关TikTok安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
        版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

        新年快来了,分享一套自己整理的新年套装。

        2025年1月4日 12:24

        主要把背景颜色改成红色和添加一对灯笼,在添加了一下烟花特效。
        请输入图片描述

        <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推荐列表

        2024年9月5日 08:00
        😀
        之前介绍了不少关于MosDNS的内容,里面绕不开的一个部分就是用来解析国外域名的DNS服务器应该选择哪家,或者说有哪些无污染的公共DNS服务器可以选择。

        📝 主旨内容

        DNS服务器的主要作用是将域名转换为IP地址,同时支持负载均衡、高可用性、反向解析、缓存加速等功能。DNS是互联网的基础设施之一,几乎所有的网络通信都依赖于DNS服务。所以选择一个稳定、高速且无污染的DNS的重要性不言而喻。在使用DNS分流的情况下,对国内域名与国外域名分别配置DNS可以有效提升解析速度与准确性。

        国内DNS服务器

        国内的公共DNS服务选择不多,我认为国内DNS只有三个选择,AliDNS(阿里巴巴)、DNSPod(腾讯)以及各省市运营商下发的DNS。Ali和DNSPod均支持ECS(edns-client-subnet)协议,在一定程度上可以缓解整体解析速度不如运营商DNS的情况。其他例如114、360、百度等等,均有前科,不太推荐选择。
        同时在国内DNS的选择及使用上,我个人更推荐使用DOH、DOT方式,避免DNS泄露给运营商,从而产生DNS劫持。在部分省份,运营商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服务器

        我个人一般会用Google DNS、NextDNS、以及AdGuard DNS作为主要无污染DNS使用,NextDNS的免费额度足够家庭使用,当免费额度用完就切换到AdGuard DNS。在Google DNS存在国内访问问题的时候,会选择Quad9或者OpenDNS。Cloudflare DNS在我这里的稳定性和速度并不好,所以很少选择。大多数的国外公共DNS均可以返回无污染的DNS解析结果,这些公共DNS服务基本都支持DNSSEC。
        在衡量与选择国外公共DNS服务时,延迟与丢包一般是我首先考虑的因素,其次就是DOH和DOT的支持,如果能够支持H3(http3)或者pipeline的话,那么一般就会是首选的DNS服务。其他次级考虑的因素还包括是否支持ECS,如果可以支持ECS,我会选择代理出口位置附近的IP。通过MosDNS的ECS功能,可以自定义ECS地址,使解析的CDN结果更靠近所配置的IP地址,从而提高解析结果的访问速度,例如我喜欢配置国外的ECS地址为代理的出口地址,这样通过代理访问时,可以获得最佳速度及可用性。
        同时在使用DOT或DOH使,可使用dial_addr替代域名,可免去每次建立连接时解析服务器域名。dial_addr一般为标准DNS的IPv4和IPv6地址。
        由于一些公共DNS使用DNSCRYPT,需要使用DNS服务器公钥,存在局限性,所以暂时未列入表单内,也不作为DNS选择与衡量的指标。
        同时大部分公共解析服务均为IPv4和IPv6双栈,即使用IPv4的DNS公共解析服务也可以解析IPv6地址,所以列表内不再进行IPv4和IPv6的区分。
        在设备支持的情况下,非常建议选用支持DoH与DoT的DNS服务器。
        名称
        标准 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服务

        这里的非公共DNS是指提供具有用户唯一标识的DNS服务,允许用户自定义DNS过滤与隐私保护,提供访问控制,提供查询日志,提供部分路由优化等。相当于免费的公共DNS服务,这种DNS服务在部分情况下访问速度可能会更好一些。基础的DOH、DOT、DNSSEC、ECS基本都支持。
        • 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选择?

        💡
        有关DNS上的问题,欢迎您在底部评论区留言,一起交流~

        RouterOS使用OSPF智能分流国外流量

        2024年10月3日 08:00
        😀
        前一篇文章尝试使用RouterOS Address List配合防火墙Mangle的Prerouting规则进行国内外流量的自动分流,效果还不错,秉承着不把家里网络搞塌就不算完的态度,我又尝试寻找更好(更复杂)的分流方法,原来在2020年就已经有人在使用Ospf进行路由表分流,那我也来尝试配置一下看看。在通过ospf分流后,我的旁路网关这时候才真的称得上是一个旁路由,因为真的在进行路由路径的分流。

        📝 OSPF介绍

        OSPF(开放最短路径优先)是一种常用的路由协议,一般用于大型企业和网络服务提供商的网络中,家庭网络使用有点杀鸡用牛刀。它的主要功能是帮助路由器找到通往目标网络的最短路径,并自动更新这些路径信息。OSPF的工作原理是通过收集整个网络的路径信息,然后使用一种算法计算出到每个目的地的最优路径。当网络中的某条线路发生变化时,OSPF可以迅速做出调整,保证数据能够继续以最快的方式传输。

        📝 配置背景

        整体是All In One(All in Boom),采用PVE虚拟机方式,以下所有设备均在PVE内。
        • 主路由器: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及配置

        在网络中使用OSPF协议时,需要一个路由守护进程来实现其功能,Bird作为轻量且高性能的解决方法,同时支持IPv4及IPv6路由表。Bird是一款支持多种路由协议的软件,广泛使用于Unix类系统,例如Linux和FreeBSD,在大多数常见系统中均可找到安装及使用方法。
        • 通过apt进行安装:
        bird2安装完成后默认为运行状态,我们需要先将其关闭:
        • 编辑配置文件:
        Deiban系统在安装Bird后,配置文件默认存放位置位于/etc/bird/bird.conf ,需要对其编辑。
        配置说明如下:
        1. log syslog all;
        • 作用:将BIRD的所有日志输出到系统日志(syslog),可以通过journalctl -xeu bird 进行bird日志查看
        2. router id 10.0.0.10;
        • 作用:定义了BIRD路由器的标识(Router ID),Router ID是一个唯一的IPv4地址形式,需要自行更改配置为自己旁路由(旁路网关)的IPv4地址
        3. protocol device { scan time 60; }
        • 作用device协议的配置,负责发现和监控网络接口的状态。scan time 60;表示BIRD每60秒扫描一次所有网络接口,以更新接口状态信息。
        4. 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。
        5. 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静态路由配置。
        6. 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)。点对点类型通常用于没有中间广播域的直接链路。
          • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。
        7. 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的配置类似。
          • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。

        生成静态路由规则

        与上一篇文章RouterOS自动分流方案(支持IPv4 & IPv6)所使用的方式不同,这次我们需要生成所有非中国大陆地区的IPv4和IPv6地址信息,在Github上有dndx/nchnroutes: !chnroutes - chnroutes negated可以使用。
        • 克隆仓库
        • 编辑Produc.py
        在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是ens18,就改成ens18。
        2024年12月28日更新:
        删除48行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
        取消5、6、7行的注释。因为使用的是Bird2,没有Birdc6命令,所以不做修改。
        2024年12月28日更新:
        更换china_ip_list上游地址,原来的17mon的国内ip地址表太久未更新,存在地址范围错误,无法应对墙中墙(各种反诈劫持)的情况。
        delegated-apnic-latest是一个37M左右的大文件,下载速度会有点慢,需要耐心等待。
        如果在你的旁路网关上访问raw.githubusercontent.com 存在问题(例如本机无法被代理等情况),可以将raw.githubusercontent.com 更换为镜像raw.staticdn.net
        • 生成静态路由表
        需要确保你已经安装make,如果没有安装可以通过apt install make进行安装,然后执行:
        返回结果:
        即表示Bird2生成OSPF动态路由表成功。
        • 确认Bird2状态
        执行systemctl status bird.service来查看bird2的运行状态:
        如果Active处于inactive状态,需要手动执行systemctl start bird.service
        • 确认Bird2路由表状态
        执行命令birdc show route protocol static1查看IPv4路由表,返回结果太多,大概是如图:
        notion image
        执行命令birdc show route protocol static2查看IPv6路由表:
        notion image
        到这里Debian(旁路网关)的Bird2配置完成,下面可以开始进行RouterOS配置

        RouterOS配置

        在WinBox中点击左侧菜单Routing进行配置

        Router ID配置

        点击RoutingRouter ID进行配置。 Name自己喜欢填什么就填什么,ID填写RouterOS的地址,Dynamic ID选择only vrfSelect From VRF选择main,点击OK提交。
        notion image

        OSPF配置

        点击RoutingOSFP进行配置
        Instances配置
        点击New新建,填入Name(自己根据喜好填),也可以默认根据我的来。Version版本选择2,VRF使用main表,Router ID选择刚刚创建的main,或者直接输入RouterOS的IP地址。其他不动。
        notion image
        如果你使用IPv6,那么需要再新建一个Instances,Version选择为3,其他的一样。
        notion image
         
        Areas配置
        点击Areas,点击New新增一个AreaName随便,Instance选择刚刚创建IPv4的Instance(Version版本为2),Area ID为0.0.0.0 ,Type为default ,其他不用填写。
        notion image
        同样,如果你需要使用IPv6,那么也需要新建一个Area,并在Instance中选择刚刚创建的Version版本为3的Instance。
        notion image
         
        Interface Templates配置
        点击Interface Templates,点击New新增一个模板。Area选择刚刚创建的IPv4的区域,Network Typeptp(点对点,因为我们只有两个点),Cost10Priority32,其他的不用管。
        notion image
        同样,如果使用IPv6再新建一个Templates,Area选择IPv6的区域
        notion image
         
        查看结果
        上述配置完成后,点击Neighbors进行节点匹配查看,如果正常的话,应该可以发现Debian(旁路网关)上配置Bird2的节点:
        notion image
        同时在IPRoutes中应该可以看到Debian(旁路网关)上Bird2发送过来的状态为DAo的路由表(D代表动态,A是活动状态,o为ospf)
        notion image
         

        避免路由环路配置

        在以上配置完成后,在我们访问国外流量时会发生环路,即客户端 → RouterOS → Debian旁路网关 → RouterOS → Debian旁路网关… 不断的循环,所以需要对来源为Debian(旁路网关) 的流量进行特殊处理,这里又要用到我们的老朋友Managle。
        1. 首先在Routing - Tables新建一个路由表,名为bypass,并勾选FIB:
        notion image
        1. IP → Firewall → Managle新建规则:
        • General
          • Chain: prerouting
          • In.Interface: bridge1
        • Advanced
          • Src.MAC Address: Debian旁路由(旁路网关)的网卡MAC地址
        • Action
          • Action: Mark Routing
          • New Route Mark: 选择刚刚新建的Bypass
         
        notion image
        1. 如果你需要使用IPv6的话,在IPv6 → Firewall → Mangle也新建一条一样的规则。
        1. 配置Bypass路由表内路由规则
        1. 如果发现配置后从旁路由(旁路网关)Ping不通主路由RouterOS或者无法访问,提示Destination Host Unreachable或者Redirect Host(New nexthop: 10.0.0.1),可以在Dst.Address添加一项局域网地址范围,例如我的10.0.0.0/24 ,并点击前面空白方块出现“”,即目标地址不为局域网地址的流量。这样旁路由在使用Tailscale时候也可以正确的访问局域网内其他设备。
        通过以上规则,在来源为Debian旁路由(旁路网关)的流量进入到RouterOS后,使用bypass路由表进行路由,默认这个表是空的,也就是无法对流量进行路由,所以会断网,我们需要添加一些默认的规则进去,基本照抄main表的默认规则就行:
         
        • 新建IPv4局域网路由规则
          • Dst.Address: 局域网IP地址范围,如果你是主路由是192.168.1.1 ,那么这里写192.168.1.0/24
          • Gateway: 填写网桥地址,例如我的是bridge1 ,也是RouterOS建立网桥时默认名字
          • Distance: 1
          • Routing Table: bypass
          • notion image
         
        • 新建IPv4广域网路由规则
          • Dst.Address: 0.0.0.0/0
          • Gateway: 填写PPPoE拨号接口名称,例如我的是pppoe-out1
          • Distance: 1
          • Routing Table: bypass
        notion image
         
        如果你没有公网IP,运营商分配给你的是一个大内网的IP地址(100.x.x.x),可能需要手动添加一条指向大内网网关的路由规则。 由于每次拨号后IP地址会变,运营商内网的网关也会变,所以需要使用RouterOS的脚本进行定时检查和修改:
        • 新建IPv6局域网路由规则
          • Dst.Address: fe80::/64%bridge1
          • Gateway: 填写网桥接口名称,例如我的是bridge1
          • Distance: 1
          • Routing Table: bypass
        notion image
        然后依葫芦画瓢,把其他相关的fe:: f*:: 的内网路由规则添加进去
        • 新建IPv6广域网路由规则
          • Dst.Address: ::/0
          • Gateway: 填写PPPoE接口名称,例如我的pppoe-out1
          • Distance: 1
          • Routing Table: bypass
        notion image
        但是这样配置完成后,我们的IPv6还是没有办法访问互联网,通过与main表比对发现,因为缺少一条上级网关的地址:
        notion image
        但是这个地址是动态的,所以我们需要通过一个RouterOS脚本来进行动态处理:
        至此,RouterOS部分的全部配置完成,同时整体的基于OSPF动态路由的国内外分流也已经完成。但分流的基础还是基于IP地址,所以需要使用无污染的DNS公共服务器,同时尽量使用DOH、DOT等方式进行查询,避免运营商的DNS劫持。

        🤗 总结归纳

        相比上一篇使用的Address List方式,因为是直接查询路由表,不用对目标IP进行取反匹配,而且不用对所有流量进行mangle标记,仅需要对来源旁路由的流量进行标记处理,在系统性能占用上会少一些,同时也可以开启RouterOS的fast forward功能、fast track功能以及fast path,进一步降低CPU对流量处理所需资源,N4100在Fast.com300M跑满时CPU占用30%左右,内网2.5G跑满CPU占用不到10%。而且避免了旁路由(旁路网关)挂断之后国外网站完全无法访问的情况。
        我认为即便是在使用Dae这种直连效率非常高的透明代理解决方案的情况下,直连流量尽可能的不经过旁路由(旁路网关)才是最佳的效率选择,所以相比使用Mihomo或者其他的软件,在分流规则的第一层通过路由表方式将国内流量直接发出去才能避免产生更多的问题(例如NAT等等等)并获得最佳的访问速度。
        至于为什么要实用RouterOS来做,当然是因为RouterOS相对来说配置起来更为顺手,稳定性更好一些。当然,这些通过OpenWRT也可以实现。

        📎 参考文章

         
        💡
        有关旁路由(旁路网关)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

        OpenWRT从Hper-V迁移至PVE指引

        2024年9月28日 08:00
        😀
        本篇文章主要介绍如何将Hyper-V的VHDX虚拟磁盘导入到PVE(Proxmox Virtual Environment)下,从而实现将OpenWRT直接从Hyper-V平台迁移到PVE平台,避免重新配置的繁琐过程,最大程序保留原OpenWRT系统的可用性。
        迁移的原因是原来我的旁路网关所使用的OpenWRT部署在日常使用PC的Hyper-V里。而因为自己买了新的N4100工控机,4个2.5G网口,这样就可以实现全屋2.5G,提升内网的传输速度,同时将软路由(以及附带的旁路网关、旁路由、DNS服务器等等七七八八)从日常使用的PC中分离出去,减少家里网络因为我电脑问题产生的波动,同时日常使用的PC专注用于工作和使用Moonlihgt + Sunshine串流Steam打游戏。而且换了之后,日常使用的PC也可以休眠或者关机,省点电费(并没有)。另外还有就是软路由数据与系统的分离,可以将PVE的备份数据存放在smb挂载的磁盘上,减少All in Boom之后的工作量和损失。

        📝 迁移过程

        导出Hyper-V虚拟机

        在Hyper-V Manager(Hyper-v管理中心)选择想要导出的虚拟机,我们以OpenWRT为例:右键导出,选择存放位置。
        notion image
        导出后的文件夹里包括:SnapshotsVirtual Hard DisksVirtual Machines ,OpenWRT的虚拟机VHDX磁盘位于Virtual Hard Disks 内,例如我的immortalwrt的VHDX为:immortalwrt-23.05.3-x86-64-generic-squashfs-combined-efi.vhdx ,为了便于之后转换和导入操作,可以修改为短一点的名字,例如openwrt.vhdx ,这样在后续输入命令的时候,能够少打点字,同时也减少因为输入名称错误带来的无法导入问题。

        上传VHDK虚拟磁盘到PVE

        由于VHDX不属于ISO镜像或者CT模板,所以无法通过PVE Gui(网页管理器)进行上传,需要自己通过sftp或者共享文件夹的方式上传,例如winscp,可以通过SSH账号密码登录并进行文件传输,文件存放位置选择自己能找到的位置,例如用户目录下。
        notion image

        在PVE上新建虚拟机

        这里按照正常的虚拟机创建流程即可,需要注意有三点:
        1. 如果是EFI镜像,需要在BIOS中选择OVMF (UEFI) ,其他镜像选择默认的SeaBIOS 即可。
        1. 添加网络设备时,需要修改MAC地址为原来在Hyper-V下OpenWRT所使用的虚拟网卡MAC地址,这样可以避免大多数问题,但是例如Zerotier这种需要完全匹配设备信息的,需要单独进行调整:OpenWRT迁移后Zerotier无法连接的解决方案
        1. 不需要添加硬盘和磁盘。
        notion image
        完成后不需要启动虚拟机。

        将VHDX磁盘转化为qcow2格式

        这里需要通过SSH或者PVE Sehll进入节点机终端,并执行转换命令:
        -O qcow2 :导出格式为qcow2
        openwrt.vhdx :源磁盘镜像文件名称
        openwrt.qcow2:导出的磁盘镜像文件名称
        转换可能需要一点时间,请耐心等待。

        挂载Hyper-V虚拟磁盘镜像

        这里需要通过SSH或者PVE Sehll进入节点机终端,并执行导入命令:
        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
        正常
        Zerotier的修复办法也已经同步进行了更新:《OpenWRT迁移后Zerotier无法连接的解决方案

        📎 参考文章

         
        💡
        有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

        OpenClash替换使用Mihomo内核

        2024年8月29日 08:00
        🚧
        OpenClash是我在OpenWRT旁路网关(旁路由)上使用时间最长的插件,其依赖于Clash的内核文件使用,在功能的完整性和使用顺手程度上,目前还没有可完全替代的选项。目前Clash-meta内核分支已经改名为Mihomo,OpenClash也已经大概2个月没有更新了,插件自带的内核更新功能暂时还不能自动更新使用Mihomo内核,为了使OpenClash支持Mihomo内核所带来的一些新的功能,所以有了这篇文章。
        notion image

        📝 付费内容

        Mihomo内核介绍

        Mihomo内核并不是一个新的Clash内核,其前身是Clash-Meta内核,但是由于Clash For Windows删库风波问题,所以改名为Mihomo(原神!启动!)Mihomo继承了Clash的核心功能,综合原始Clash及Clash Premium核心功能,并在此基础上根据需要持续更新迭代,是目前Clash最为主流的核心。

        Mihomo功能介绍

        代理模块
        • 实现了基于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新增功能

        除上述功能外,在Clash-Meta更名为Mihomo之后,又增加了如下功能支持:
        DNS模块:
        • 增加HTTP/3 DNS支持(H3的速度真的很快),包括是否优先使用DOH的HTTP/3以及指定DOH服务器强制使用HTTP/3
        • nameserver-policy规则:优先于nameserverfallback的dns进行解析,可以在规则中通过GEOSITE分组进行DNS指定,增加DNS解析规则灵活性。但由于nameserverfallback dns server同时请求的原因,并不能解决DNS泄露问题。
        • fallback-filter规则:支持GEOIPGEOSITE匹配
        • proxy-server-nameserver:指定解析节点所使用的DNS服务器
        策略组模块 - 路由规则:
        • 增加PROCESS-NAME进程匹配,软路由上可匹配本机进程
        • 增加PROCESS-NAME-REGEX,使用进程名称正则表达式匹配
        • 增加PROCESS-PATH-REGEX,使用进程路径正则表达式匹配
        • 增加SUB-RULE子规则
         
        Tun模块:
        • 支持gVisorSystem的混合堆栈,tcp使用system栈,udp使用gvisor栈,使用体验可能相对更好,同时稳定性也有保证。
        • 支持流量转发隧道(Tunnel)
        主要我们所使用到的,还是在DNS模块的部分,可以更为精准的控制DNS的解析,包括IPv6 DNS的解析。

        OpenClash替换Mihomo内核方法

        1. 首先确认你使用的是OpenWRT及OpenClash,并对自己将进行的操作目标有所知悉。下述操作的系统为X86-64架构,OpenWRT版本为ImmortalWrt 23.05.4。如果担心出现不可恢复的问题,可以先备份虚拟机或OpenClash整体配置。本篇内容也适用于OpenClash内核更新失败的手动解决方案。
        1. 通过SSH登入OpenWRT,并进入OpenClash的核心所在文件夹:
        1. 备份原来的meta核心:
        1. 下载Mihomo核心,从https://github.com/MetaCubeX/mihomo/releases 选择版本和自己路由器架构的核心包,并复制链接地址,替换下面命令中的地址,X86-64用户选择mihomo-linux-amd64-compatible-go120后缀即可。
        1. OpenWRT网页端进入OpenClash,点击插件设置 - 版本更新,查看[Meta]当前内核版本是否为v1.18.7,如图所示
        notion image
        1. 如果显示为当前下载的内核版本号,即表示替换成功。重启OpenClash即可生效。不要再点击检查并更新了。

        🤗 总结归纳

        因为Notion AI到期,所以没有课代表总结。反正就是一个简单的Mihomo内核替换,也没什么难度。
        Mihomov1.18.8版本更新了,可以更新起来了。但是WireGuard的问题还是没有修复。
        OpenClash目前已完全支持Mihomo内核,可以直接使用自带的更新功能进行更新。

        📎 参考文章

         
        💡
        有关OpenWRT和Mihomo安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

        风记得的第1678天星辰:告别2024、鱿鱼游戏2、44岁脑瘤

        2025年1月3日 21:38

        告别 2024

        就在刚刚,我们在 2025 年度过了 3 天!这时间如千金散去,却复不来,挥霍却道,烟火罢了。回顾这 2024 年,似乎无可作为。那天,我看到一个人走在人行横道。今天,我又看到了他。越来越感觉每天固定时间上班,就像是激活了 NPC 的任务刷新。像是在游戏中到了固定的时间,NPC 出现在固定的位置。不睁开眼睛,看不清世界。这条充满烟火味道的视频就是生活指南,抖音需要充满这些正能量视频,点赞 👍👍👍

        我不太善于选择也不想选择,但是我更想控制生活的轨迹,希望这一路看到的风景感受到的喜怒都由自己说了算。事与愿违,行与做总会偏离设定轨道,生活磨平了棱角。慢慢得明白了无法经历所有的生活,而有些错过的生活会在不经意将来再次出现,就像地球的东边是西,地球的西边是东。

        摘抄自阿锋《二〇二四年十二月总结,错过不一定是永远》

        阿锋的结语令人意味深长,掌握自己的生活,需要太多的能量。就像有时候写一篇博客,明明不是很累,但难以提笔去写。这时候,就缺少了一种干劲 —— 也就是需要补充能量。每个人补充能量的方式不太相同,我也在一直寻找如何获取这种能量。像那种通过获取短期快乐的能量,就如同冬日里手机右上角的电池容量,100% 中看不中用。通过沉侵在书籍中获取的能量,又无法完全应用到实际中,若加以太多的思考,开始苦苦追寻世界的本质,最后进入自寻烦恼的归途,最终还是要回归的生活本质。

        鱿鱼游戏 2

        https://movie.douban.com/subject/35656342/

        这种第二部永远无法超过第一部的魔咒发生了,我一直都很喜欢看这种探讨人性的片子,显然第二部在这方面有所体现。但相比第一部的经典桥段,有些差之毫厘。我看到了一个很有趣的豆瓣评论。

        《鱿鱼游戏》第二季居然拍出了无产阶级斗争的味道了。
        成奇勋率领底层游戏参与者向顶层游戏规则制定者发起革命。
        “没有枪怎么办?”
        “抢敌人的啊!”
        听到这个台词的时候,我瞬间麻了。

        豆瓣用户冷蛋《成奇勋,虽败犹荣》

        44 岁脑瘤

        当时在朋友圈看到这条信息的水滴筹链接时,倒是没什么惊讶的,这几年经历过的人生疾苦快可以写成一篇小说了。如果要说这件事,则是给这篇小说增加更多的元素。

        —— 妈妈,舅妈得了脑瘤?
        —— 是啊,在脑干有一个良性肿瘤,11 月做了手术
        —— 那怎么到现在不仅没好,还住进了 ICU?

        —— 手术后,无法完全清除,说后续还需要化疗。手术 15 天后,就转到了康复中心,然后发生了感染。差点没抢救过来,现在每天打着 1200 元/天的进口药。看你忙,就没和你说。

        舅妈家不太富裕,当然我也不富裕 😅 如果没有朋友圈那条水滴筹的链接,在最坏的情况下,恐怕只会在入葬那天知道这件事了。同样是别人做手术,很顺利地慢慢康复。到咱这,非得多一些折磨。麻绳专挑细处断,厄运专找苦命人。要说亲戚关系远近程度,这是我亲舅妈,没有那复杂的一环又一环。只是由于家里一些“大人们”的处事方式,让我们之间的感情浅薄。俗话说:真姑妈,假舅妈,半真半假是姨妈。若真讲那种道破人性的话,有时候甚至连亲生父母也会做出无法想象的事情。所以,无需考验人性,它经不起考验。但对于我来说,共情能力强于常人。即使感情淡薄,但我亦然揪心,只是善大力小,为之叹一口气。

        那天妈妈除了说这件事,还和抱怨 14 岁表弟。表弟在一些行为上没有很关心他的妈妈,他妈在 ICU 里说想孩子(ICU 不能随便进入),录一个视频有些冷淡,最后还和他爸吵一架,看着太让人生气。具体情况我不知道,我说可能 14 岁太小了,还不懂事。我妈反驳我,那可不是,之前我得过敏性紫癜的时候,你 12 岁放学后还想着每天来问我呢。最后我虚弱到昏迷了,家里没人管,要不是你每天问我看到那天昏迷了,及时送医院,说不定就没了。

        言后,片刻沉默。只叹得,幸甚今安在。

        第 1678 天结语

        梦虽遥,追则能达;愿虽艰,持则可圆。中国式现代化的新征程上,每一个人都是主角,每一份付出都弥足珍贵,每一束光芒都熠熠生辉。
        河山添锦绣,星光映万家。让我们满怀希望,迎接新的一年。祝祖国时和岁丰、繁荣昌盛!祝大家所愿皆所成,多喜乐、长安宁!

        选自习主席《2025 年新年贺词》

        多喜乐·长安宁

        二〇二四年十二月总结,错过不一定是永远

        2025年1月3日 15:45

        出门的动力越来越弱,更不要说长途骑行,12月已经结束,秋天注定错过。杉树要变红,银杏要变黄,季节交替产生的美不会永久停留。

        在小区公园的草地上,我捡不到一片完美的银杏叶,不是颜色发青就是叶片有破裂,树上的银杏叶看上去也不怎么好。此时公园里的红枫最为抢眼,虽然个头不大,但血色一样的红火,尤其是阳光照射下显得格外耀眼。

        近日上海最低气温到零下一两度,这才感觉到了冬天的冷。印象中零下两三度已是上海的极限,冬天雨水少看到雪飘更是少之又少。

        1月28日除夕开始放假,领导早早问我们假期的计划。是啊,外地人忙着回家,本地人忙着旅游。我在思考是提早几天回家还是晚几天来上班。

        冬季骑车

        虽然没有封车,但是骑车的次数减少了,骑车里程也就少了,回看12月的骑车数据全是通勤。单趟11公里,不怎么出汗。这个冬天也不想着提升突破,能维持体能就行,希望明年春天以后能突飞猛进。

        看看数据,12月总里程311.77公里,运动总时间13小时52分离12秒,运动均速22.48km/h,骑行29次。

        总里程311.77
        总时间12:52:12
        骑行次数29
        月均速22.48km

        虽然上海的冬天算不上冷,但是保暖装备必不可少。头套戴好再带上头盔,冲锋衣穿好,防风御寒。

        老姐家局部装修

        上个月末,老姐签了局部装修的半包合同。把家里的两个卫生间、一个厨房和一个房间拆除后重新装修。虽然装修事宜已经提了很久,但是最终下定决心采用局部改造实属无奈之举。此时装修临近年关,找了几家装修公司都表示有些活要过年后才能完成,工人过年前回家比较早会影响工期,比如油漆、定制柜要等年后才能安装。

        开弓没有回头箭,就这样动工了。拆旧,砸墙,砌墙,粉墙,水电管路铺设,卫生间做防水,现在正贴瓷砖。虽然提前做了预算表,但总计金额已经远超预期,装修材料、家用电器的价格越看越高。

        局改最头痛的是施工师傅为了不破坏其他设施绞尽脑汁,尤其是水电线路改造。

        错过不一定是永远

        工作与生活的轨迹按部就班,两者从未交织,但生活的轨迹总是曲曲折折,一会儿往东一会儿往西。生活的选择实在太多,每一次选择注定要错过另一种生活。

        我不太善于选择也不想选择,但是我更想控制生活的轨迹,希望这一路看到的风景感受到的喜怒都由自己说了算。事与愿违,行与做总会偏离设定轨道,生活磨平了棱角。慢慢得明白了无法经历所有的生活,而有些错过的生活会在不经意将来再次出现,就像地球的东边是西,地球的西边是东。

        冬日恋歌:自制简易下雪特效

        2025年1月3日 15:18

        寒冷的冬日,没有什么比窗外纷纷扬扬的雪花更能带来浪漫与宁静的氛围了。但你知道吗,即使窝在温暖的室内盯着电脑屏幕,我们也能让这唯美雪景触手可及!今天给大家分享如何利用一段神奇的 jаvascript 代码,在博客上打造属于自己的梦幻冬景。

        2025年震撼来袭:你准备好了吗?

        2025年1月3日 12:00

        又是一年新旧交替时,站在时光的门槛上,回望这一年的旅程,心中充满了感慨。这一年,我们每个人都是自己故事的主角,有的充满欢笑,有的带着泪水;有的硕果累累,有的略显失落。但无论如何,我们都勇敢地走过了这段旅程。(嗯,这段网上抄的)

        在这个迟到的新年时刻,我想对你们说:感谢你们,感谢这一年的陪伴和支持。虽然我们可能素未谋面,但在这片虚拟的天地里,我们有着共同的语言——博客,这也是我为数不多的爱好之一,也是我坚持最久的爱好之一。

        年末的忙碌几乎让我忘记了新年的祝福,但在这里,我要大声说出:祝大家新年快乐呀!愿新的一年,我们都能拥有更多的欢笑和收获。

        元旦后的第一个工作日,进入办公室就被同事的咖啡香唤醒,感觉整个人都充满了活力。中午,大家一起吃了美味的手枪腿,也是对新一年的美好祝愿——希望团队能够蒸蒸日上。

        276.jpg

        新年这几天,朋友圈里,好友们纷纷晒出了自己的“年终总结”,我也忍不住加入了这场“晒总结”。

        [img]279.png278.png280.png277.png[/img]

        今年的跨年夜,没有了往年的喧嚣,大家都没有聚在一起,或许是因为大家都在忙碌中找到了自己的节奏,但那份对新年的期待从未改变。

        在元旦前的半个月里,我几乎把所有的业余时间都投入到了 Typecho 插件的折腾中。一切始于偶然发现的古老插件 [t github.com/tennsinn/TeWords]TeWords[/t],原本只是想简单地修复一下兼容性问题,但谁知道,一折腾就是大半个月。果然代码的魅力就像美女,一旦碰了就难以自拔。

        281.jpg

        原本的简单修复变成了一场折腾风暴,改得越多,想法也越多,最终完全停不下来。[t demo.jdeal.cn/time]插件效果展示[/t] 当然,当我写下这篇文章的时候,我已经暂时放下了 (因为新的一年,时间变得更加宝贵) 嗯,当然不是,是因为年底开始忙了,哈哈。

        希望在2025年,我们能继续保持对生活的热爱,对新鲜事物的探索热情,继续创造不一样的故事。也希望友链圈的小伙伴们能一起坚持,一起加油,共同迎接新的挑战!

        Docker国内加速镜像

        2024年10月12日 08:00
        😀
        最近国内使用Docker不是很顺畅,遭遇DNS污染+SNI阻断,在拉取Docker Hub上的docker时无法正常使用。国内的Docker加速镜像又部分关闭,自己手头还有一台闲置的HK小鸡,拿出来做个Docker加速镜像供网友使用。
        notion image

        📝 主旨内容