BNU-FZH

fengzhenhua@outlook.com

最近在使用校园网时,发现这有限的流量消耗的特别快,其中一项就是自己维护这个博客。经过考虑,对此博客做一些优化.

屏蔽掉不需要源备份的文件

这时遵守一个原则:网站必备的文件,包括主题、基本配置和文章MarkDown文件, 其他的内容都不必存放在私人仓库中。屏蔽掉这些内容,可以极大的减少数据传输量,提高效率的同时,也节省的仓库空间。

.gitignore
1
2
3
.deploy_git/
public/
db.json
  • .gitignore: 这是一个git的配置文件,里面定义了不列入git管理的内容设置
  • .deploy_git: 这个应该是git部署用的文件。比如你写好的博客想部署到 GitHub Pages上去的话,可以用git部署插件,那个插件会创建这个目录. 为了确保每次增删博客时能够准确执行,则每次都要重建,所以它可以不用备份。
  • public: 这应该是hero编译之后的网站的目录, 每次生成博客都是存放在此处,所以其也不用备份。
  • db.json: 搜索插件的数据库文件,由于每次增删博客后它也是会发生变化,且可以随时生成,所以也不用备份。

设置主力仓库

原本在GitHub上建立了三个仓库,以https://fungzhenhua.github.io 作为主力, 最初的一个仓库准备弃用,辅助的博客如果也要同步更新就会产生双份的流量,这在目前不合算,于是准备将辅助博客间隔较长时间更新。

参考文章

大厂运营

厂商 网址 备注
cdnjs cdnjs.com cdnjs
jsdelivr www.jsdelivr.com jsdelivr
饿了么 npm.elemecdn.com 阿里云境内 CDN;未公开发布,曾经有段时间暂停回源;仅包含 npm(unpkg)
360奇舞团 cdn.baomitu.com 北京联通+上海电信;包含 cdnjs 以及 Google Fonts;好像有段时间没有更新了
字节跳动 cdn.bytedance.com 字节自家 CDN,电信:北京电信,移动:河北廊坊移动,联通:河北廊坊联通;境外:北京(但是依然很快);仅包含 cdnjs
又拍云赞助 www.zstatic.net 又拍云 CDN;仅同步 cdnjs

 

个人运营

个人 网址 备注
7ED Services www.7ed.net 非常全的镜像站,几乎啥都有;前端文件镜像 CDN 为境内华为云,境外 Vercel
jsdelivr mirror site / China Jsdelivr cdn.jsdmirror.com blog.jsdmirror.com 境内腾讯云 EdgeOne / 百度云,境外CF;反代 jsdelivr;挺好
webcache webcache.cn fonts: HK 单节点 反代 (电信绕日NTT,线路爆炸,不可用;移动CMI->HE,勉强能用;联通绕日NTT,勉强能用);ajax 阿里云CDN/CF;cdnjs 阿里云境内CDN/HK单节点;npm 阿里云境内CDN/HK单节点;github 阿里云境内
晓白/AKASS cdn.akass.cn 境内多吉云 CDN,境外 Cloudflare;回源使用自建 CDN;npm(unpkg), cdnjs, Github Raw, jsd;自建 CDN 偶有污染,被刷绕自建 CDN
玉兔/未闻花名静态资源加速 cdnjs.snrat.com 境内白山云 CDN,境外301官方;回源南方科技大
GamerNoTitle cdn.bili33.top Vercel反代jsdelivr
烧饼 u.sb/css-cdn Cloudflare 自选,速度一般,污染比官方严重,除了被墙的Gravatar,其他基本不如使用官方原版;cdnjs, Google Fonts, Gravatar
zkeq cdn.onmicrosoft.cn 全部使用cloudflare,打赢复活赛了。

Gravatar 镜像

镜像 网址 备注
Gravatar https://cravatar.cn/ 速度快
Weavatar https://weavatar.com/ 速度快

知名院校

镜像 网址 备注
南方科技大学 https://mirrors.sustech.edu.cn/help/cdnjs.html 速度快

路由器品牌或类型 后台登录 IP 后台登录网址 品牌官网
TP-Link 路由器 192.168.1.1 tplogin.cn www.tp-link.com.cn
D-Link 路由器 192.168.0.1 www.dlink.com.cn
华为路由器 192.168.3.1 consumer.huawei.com
192.168.101.1 consumer.huawei.com
荣耀路由器 192.168.3.1 www.hihonor.com
192.168.101.1 www.hihonor.com
网件(Netgear)路由器 192.168.1.1 routerlogin.com www.netgear.com.cn
华硕(Asus)路由器 192.168.1.1 router.asus.com www.asus.com.cn
192.168.50.1 router.asus.com www.asus.com.cn
小米路由器 192.168.31.1 miwifi.com www.miwifi.com
360安全路由 192.168.0.1 luyou.360.cn luyou.360.cn
192.168.100.1 luyou.360.cn luyou.360.cn
水星(MERCURY)路由 192.168.1.1 melogin.cn www.mercurycom.com.cn
腾达(Tenda)无线路由器 192.168.0.1 tendawifi.com www.tenda.com.cn
H3C 路由器 192.168.0.1 www.h3c.com
京东云无线宝路由 192.168.68.1 jdcloudwifi.com jdbox.jdcloud.com
ZTE 中兴路由 192.168.5.1 zte.home www.zte.com.cn
极路由 192.168.199.1 官网已关闭
Newifi 智能路由器 192.168.99.1 官网已关闭
斐讯(PHICOMM)路由 192.168.2.1 p.to 官网已关闭

Firefox 是 Linux 下最流行的浏览器,但是有时候访问网站会受到 DNS 污染,特别是有时候一些不良 DNS 服务返回的 IP 会跳转到广告、挂马的恶意网站。 为了避免上述情况,本文记录针对 Firefox 的关键配置。

启用基于 HTTPS 的 DNS

设置隐私与安全“基于HTTPS的DNS”启用策略增强防护Cloudflare(默认)

选择增强防护的原因

在上一节,启用方法中如果选择默认保护,则基于HTTPS的DNS是关闭的,这可能会导致有此DNS服务器返回被污染的IP. 如果选择最大保护, 则所有的网站都会使用基于HTTPS的DNS, 这会严重降低网站的访问速度。所以选择增强防护是一个折中的选择,它只在安全 DNS出现问题时才使用默认 DNS 解析器,因此这是一个兼顾速度和安全的方案。

Git 删除本地的所有分支

在本文中,我们将介绍如何使用Git命令来删除本地的所有分支。Git是一个非常流行的版本控制工具,可以帮助我们管理代码库的变更历史和分支。有时候,在开发过程中我们可能需要删除一些不再需要的本地分支。

查看本地分支

在开始删除本地的所有分支之前,我们首先需要查看目前的所有本地分支。我们可以使用以下命令来列出所有的本地分支:

1
git branch

这将会列出所有本地分支的列表,当前分支会被标记为一个特殊符号(通常是一个星号 *)。示例输出如下:

1
2
3
4
* master
feature-branch
fix-bug-branch
dev

在这个示例中,我们有四个本地分支:master、feature-branch、fix-bug-branch和dev。

删除指定分支

如果我们只想删除特定的本地分支,可以使用以下命令:

1
git branch -d <branch-name>

其中<branch-name>是要删除的分支名称。例如,要删除名为feature-branch的分支,我们可以运行以下命令:

确认删除操作后,该分支将被彻底删除。如果分支合并到了其他分支中,但是我们要强制删除某个分支可以使用以下命令:

1
git branch -D <branch-name>

删除所有本地分支

要删除本地的所有分支,我们可以使用以下命令:

1
git branch | grep -v "master" | xargs git branch -D

这个命令首先列出所有的本地分支,然后通过grep命令过滤掉master分支(我们通常不希望删除主分支)。接下来,xargs命令将每个分支名称作为参数传递给git branch -D命令,实现逐个删除。

删除所有已合并的本地分支

如果我们只想删除已经合并的本地分支,可以使用以下命令:

1
git branch --merged | grep -v "master" | xargs git branch -d

这个命令与上一个命令类似,只是使用了--merged参数来列出已经合并的分支。

删除除主分支外的所有本地分支

有时候,我们希望保留主分支(通常是master分支),而删除其他所有本地分支。我们可以使用以下命令来实现:

1
git branch | grep -v "master" | xargs git branch -D

这个命令与删除所有本地分支的命令类似,只是没有排除任何分支。

总结

在本文中,我们介绍了如何使用Git命令删除本地的所有分支。我们可以通过查看本地分支列表、删除指定分支以及删除所有分支来完成这个过程。如果你需要删除已合并的分支或者只保留主分支,我们也有相应的命令来帮助你完成。使用Git命令删除本地分支可以帮助我们保持代码库的整洁性和可维护性。

本文原始地址

时光匆匆,转眼间到了2024年的最后一天,似乎2024还没有写习惯,又不得不写2025。 这是切换回 github 的第一篇文章,在此恭祝大家2025元旦快乐,学业有成!

问题描述

今天遇到了无法使用git拉取仓库的问题, 同时百度获知有好多人遇到了同样的问题,其的原因是"DNS 污染"。 同样也有人遇到了下面的错误:

1
2
3
4
5
6
$ git pull
ssh: connect to host github.com port 22: Connection refused
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

同样,在使用ssh克隆仓库时也会遇到相同的问题,表现为:

1
2
3
4
5
6
7
8
$ ssh -vT git@github.com
OpenSSH_9.0p1, OpenSSL 1.1.1o 3 May 2022
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to github.com [::1] port 22.
debug1: connect to address ::1 port 22: Connection refused
debug1: Connecting to github.com [127.0.0.1] port 22.
debug1: connect to address 127.0.0.1 port 22: Connection refused
ssh: connect to host github.com port 22: Connection refused

解决方法

/etc/hosts文件中,增加一条github.com的域名映射:

/etc/hosts
1
140.82.113.4 github.com

参考文章

今天升级syndns.sh脚本,升级为默认DNS 服务器为多个,当一个DNS服务器探测失败后使用下一个DNS服务器继续探测,从而大大提高了脚本的探测能力。在升级过程中,需要用到将默认DNS服务器数组作为参数传递到函数的问题,于是有了本文。

遍历所有参数: $@

1
2
3
4
#!/bin/bash
for para in "$@" ; do
echo $para
done

在上述例子中,使用for循环和$@遍历传递给脚本的所有参数,并逐个输出这些参数。其优点在于简洁,但也存在缺点,即无法指定输出哪一个参数。所以,对于不需要识别参数具体位置的情况,使用变量$@来遍历参数是个不错的方案。

参数的数量:$#

变量$#返回参数的数量,使用它配合$@可以指定输出确定位置的参数。例如

1
2
3
4
5
6
test(){
local paras=("$@")
for ((k = 0; k < $#; k++)); do
echo ${paras[$k]}
done
}

展开数组:${arr[@]}${arr[*]}

for的展开位置,可以使用上述两条命令,来逐一调用数组变量。例如

1
2
3
for ipc in ${SYN_IP[*]}; do
echo "$ipc"
done

数组作为参数传递给函数

需要注意的是,在将数组作为参数传递给函数时,参数形式只能使用"${Arr[*]}"才行。例如

1
SYN_DN2IP "${SYN_GITHUB[*]}" "$SYN_REC"

syndns.sh V2.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#! /bin/sh
#
# Program : syndns.sh
# Version : v2.1
# Date : 2024-12-28 12:10
# Author : fengzhenhua
# Email : fengzhenhua@outlook.com
# CopyRight: Copyright (C) 2022-2025 FengZhenhua(冯振华)
# License : Distributed under terms of the MIT license.
#
# 检测软件依懒, 若未检测到,则自动安装
SYNDNS_DEPEND(){
for VAR in $1 ;do
pacman -Qq $VAR &> /dev/null
if [[ $? != 0 ]]; then
sudo pacman -S $VAR
fi
done
}
# 变量
SYN_EXE="/usr/local/bin/${0%.sh}"
SYN_AUTO="$HOME/.config/autostart/${0%.sh}.desktop"
SYN_SUDO="/etc/sudoers.d/01_$USER"
SYN_HOS="/etc/hosts"
SYN_REC=$(grep "addn-hosts" /etc/dnsmasq.conf |grep "/dev/shm/")
SYN_REC=${SYN_REC#*=}
SYN_ADD="$HOME/.host_dns_autoadd.txt"
SYN_DNSIP=(8.8.8.8 119.29.29.29) # 默认DNS服务器
# Github 网站涉及的所有域名
SYN_GITHUB=(github.githubassets.com central.github.com desktop.githubusercontent.com \
assets-cdn.github.com camo.githubusercontent.com github.map.fastly.net github.global.ssl.fastly.net \
gist.github.com github.io github.com api.github.com raw.githubusercontent.com user-images.githubusercontent.com \
favicons.githubusercontent.com avatars5.githubusercontent.com avatars4.githubusercontent.com \
avatars3.githubusercontent.com avatars2.githubusercontent.com avatars1.githubusercontent.com \
avatars0.githubusercontent.com avatars.githubusercontent.com codeload.github.com \
github-cloud.s3.amazonaws.com github-com.s3.amazonaws.com \
github-production-release-asset-2e65be.s3.amazonaws.com \
github-production-user-asset-6210df.s3.amazonaws.com \
github-production-repository-file-5c1aeb.s3.amazonaws.com githubstatus.com github.community \
media.githubusercontent.com objects.githubusercontent.com raw.github.com copilot-proxy.githubusercontent.com)
#
# 参数1为域名数组,参数2 保存文件, 使用 SYN_DN2IP "${DOMAN[*]}" "outfile"
SYN_DN2IP(){
for hubweb in $1; do
unset SYN_IP
for ((k = 0; k < ${#SYN_DNSIP[@]}; k++)); do
SYN_IP="$(dig @${SYN_DNSIP[$k]} +short $hubweb)"
if [[ ! "$SYN_IP" =~ "#" ]]; then
k=${#SYN_DNSIP[@]}
fi
done
if [[ ! "$SYN_IP" =~ "#" ]]; then
for ipc in ${SYN_IP[*]}; do
echo "$ipc $hubweb" >> $2
done
fi
done
}
# 主程序
SYNDNS_PROCESS(){
cat $SYN_HOS |grep -v '^$'|grep -v '^#'|sort |uniq |sed -r 's/ * / /g' > $SYN_REC
# 需要专门对Github探测
SYN_DN2IP "${SYN_GITHUB[*]}" "$SYN_REC"
if [ -e $SYN_ADD ]; then
cat $SYN_ADD |grep '^[0-9]' |grep -v '^$'|grep -v '^#'|sort |uniq |sed -r 's/ * / /g' >> $SYN_REC
fi
cat $SYN_REC |grep '^[0-9]' |grep -v '^$'|grep -v '^#'|sort |uniq |sed -r 's/ * / /g' > $SYN_REC
echo "$(hostname -i) localhost:" >> $SYN_REC
systemctl is-active --quiet dnsmasq
if [[ $? == 0 ]]; then
sudo systemctl restart dnsmasq.service
else
sudo systemctl start dnsmasq.service
fi
}
# 安装和更新
if [ $# -gt 0 ]; then
if [ $1 == "-i" -o $1 == "-I" ]; then
SYNDNS_DEPEND "dnsutils inetutils dnsmasq jq"
sudo cp -f $0 $SYN_EXE
sudo chmod +x $SYN_EXE
if [ ! -e $SYN_AUTO ]; then
sudo touch $SYN_AUTO
cat > $SYN_AUTO <<EOF
[Desktop Entry]
Name=SynDns
TryExec=syndns
Exec=$SYN_EXE
Type=Application
Categories=GNOME;GTK;System;Utility;TerminalEmulator;
StartupNotify=true
X-Desktop-File-Install-Version=0.22
X-GNOME-Autostart-enabled=true
Hidden=false
NoDisplay=false
EOF
sudo sh -c "cat > /etc/dnsmasq.conf" <<EOA
domain-needed
bogus-priv
resolv-file=/etc/resolv.conf
no-poll
interface=lo
listen-address=127.0.0.1
bind-interfaces
no-hosts
addn-hosts=/dev/shm/dnsrecord.txt
cache-size=9999
port=53
EOA
fi
if [ ! -e $SYN_SUDO ]; then
sudo touch $SYN_SUDO
sudo sh -c "cat > $SYN_SUDO" <<EOB
$USER ALL=(ALL) NOPASSWD: /bin/systemctl restart dnsmasq.service, /bin/systemctl start dnsmasq.service
EOB
fi
elif [[ $1 =~ ".json" || $1 =~ ".dom" ]]; then
if [[ $1 =~ ".json" ]]; then
Address=($(cat $1|jq -r '.children[]' |grep "\"uri\":"))
Address=(${Address[*]#*//})
Address=(${Address[*]/\"uri\":})
Address=(${Address[*]%%/*})
Address=(${Address[*]%%\"*})
Address=(${Address[*]%%*[0-9]}) # 去除非域名
Address=(`echo ${Address[@]}|sed -e 's/ /\n/g'|sort |uniq`)
elif [[ $1 =~ ".dom" ]]; then
Address=($(cat $1))
fi
if [ ! -e $SYN_ADD ]; then
touch $SYN_ADD
fi
SYN_DN2IP "${Address[*]}" "$SYN_ADD"
cat $SYN_ADD |grep '^[0-9]' |grep -v '^$'|grep -v '^#'|sort |uniq -u |sed -r 's/ * / /g' > $SYN_ADD
SYNDNS_PROCESS
fi
fi
# 默认执行主程序
SYNDNS_PROCESS

参考文章

近日决定升级一下路由器,最初从京东自营店购买的TP-BE5100, 但是发现收到的货是二手的,所以果断决定退货。经过对比,选择了口碑良好的华硕TUF-GAMING 小旋风 WiFi7 BE3600, 以过一下午的使用发现这款路由器确实值得购买。

AiDisk 共享USB 硬盘设置

TUF-GAMING 配置了一个 USB3.0 接口,通过这个接口我们可以设置自己的网络硬盘,这是一个相当实用的功能。下面是其设置方法:

  • 连接好路由,然后在游览器地址栏输入: http://www.asusrouter.com, 输入帐户名和密码进入到路由器管理页面。
  • 点击 外部网络(WAN)DDNS, 然后输入一个主机名,如果没有被占用,则可以成功开启,如果被占用则要更改新的主机名。
  • 点击 USB相关应用AiDisk, 然后根据向导设置就可以了。设置完成的样子:
    1
    2
    3
    4
    5
    您曾经设置过AiDisk向导,现在可参考以下信息来访问硬盘:
    Internet FTP address: ftp://yourhost.asuscomm.cn
    LAN FTP address: ftp://192.168.50.1
    若您需要更专业的文件共享设置,例如多组共享权限的规划,共享文件夹的修改,请至 这里设置。
    警告:AiDisk 已设置。若您再次设置,之前的帐号/密码与存取 权限都将重置。 欲添加更多帐号,选择 这里 以编辑帐户信息。

之后在文件管理器中输入上述 InternetLANftp地址,输入帐号名和密码就可以访问路由器U盘接口上连接的U盘了。

AiCloud 2.0 个人云应用

AiCloud提供了外网通过浏览器访问U盘接口上连接的U盘的功能。直接点击AiCloud 2.0 个人云2.0 应用根据提示设置就好。但是这里设置遇到了一些问题,比如

  • ASUS Router 在 HTTP 下外网可以连接路由器,HTTPS 下不可以。
  • AiCloud 内网情况下 Web 和 App 都可以登陆,外网情况下 Web 可以登陆,App 不能。
  • 参考文章:求助 AiCloud app外网登陆问题

应用下载

参考文章

在 neovim 中编辑 LaTeX 使用 vim-latex 插件是一个绝佳选择。然而,有时候写论文需要使用官方的 LaTeX的模板,但是不同出版社的模板设置多少有些不符合 LaTeX 规范,于是就会有字体等 Warning 信息出现,但是这些信息又不是 LaTeX 必须处理的,它们是可以忽略的。如果不忽略它们,每次编译 quicfix 窗口都会弹出提示,这极大的影响的写作体验,为此本文提供屏蔽这些信息的方法。

Neovim 中设置

~/.config/nvim/lua/plg/vim-latex.lua
1
2
3
4
5
6
7
8
9
-- 控制统计过程中的警告信息
vim.g['Tex_IgnoredWarnings'] = [[
LaTeX Font Warning:
LaTeX Warning:
Warning:
Overfull
]]
vim.g['Tex_IgnoreLevel'] = 4
vim.g['Tex_GotoError'] = 0

Vim 中设置

~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
" 控制编译过程中的警告信息
let g:Tex_IgnoredWarnings =
\'Underfull'."\n".
\'Overfull'."\n".
\'specifier changed to'."\n".
\'You have requested'."\n".
\'Missing number, treated as zero.'."\n".
\'There were undefined references'."\n".
\'Citation %.%# undefined'."\n".
\"LaTeX hooks Warning"
let g:Tex_IgnoreLevel = 8
let g:Tex_GotoError = 0

注意:如果您想追加需要过滤的消息,请按上述标格式对应添加到Tex_IgnoredWarnings变量中即可,这样在nvimvim中输入\ll时,系统直接编译不再弹出quicfix窗口。

MbpsMB/s 转换计算器允许用户将转换为,这有助于理解不同单位的数据传输速率。

历史背景

Mbps(兆位每秒)和MB/s(兆字节每秒)这两个术语常用于计算和网络中描述数据传输速率。它们的区别在于测量单位:

1字节=8比特,这意味着从Mbps到MB/s的转换需要将Mbps值除以8。

此转换对于理解互联网速度、文件下载时间和网络设备的性能非常重要。例如,广告宣传的互联网速度为100 Mbps,转换为12.5 MB/s,这表明数据实际下载或上传的速度。

转换公式

Mbps转换为MB/s的公式很简单:

\[\begin{equation}\label{eq:translate} MB/s=\frac{Mbps}{8} \end{equation}\]

  • Mbps是以兆位每秒为单位的数据速率.
  • MB/s是以兆字节每秒为单位的数据速率.

在线转换