ONE NOTE

Rage, rage against the dying of the light.

对于大部分不重要网站,采用hash+salt的方式生成唯一密码,方便管理

在线工具

生成的密码:

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
hashpw() {
site="$1"
[ -n "$site" ] || { echo "Usage: hashpw sitename"; return 1; }

seed="seed"

echo -n "Enter HMAC key: "
read -s key
echo

pw=$(printf '%s' "${seed}|${site}" \
| openssl dgst -sha256 -hmac "${key}" -binary \
| openssl base64 \
| tr -dc 'A-Za-z0-9' \
| cut -c1-12)

echo "$pw"
}
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
import * as crypto from "crypto";
import * as readline from "readline";

/**
* 异步命令行输入
* @param query 提示信息
* @param hidden 是否隐藏输入(适合密码)
* @returns 用户输入的字符串
*/
async function prompt(query: string, hidden = true): Promise<string> {
return new Promise((resolve) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});

if (!hidden) {
rl.question(query, (answer) => {
rl.close();
resolve(answer);
});
} else {
// 隐藏输入
process.stdout.write(query);
const input: string[] = [];

const onData = (char: Buffer) => {
const str = char.toString();
if (str === "\n" || str === "\r" || str === "\u0004") {
process.stdin.removeListener("data", onData);
rl.close();
process.stdout.write("\n");
resolve(input.join(""));
} else {
process.stdout.write("*"); // 输出星号
input.push(str);
}
};

process.stdin.on("data", onData);
}
});
}

async function hashpw() {
const site = process.argv[2];
if (!site) {
console.log("Usage: ts-node hashpw.ts sitename");
return;
}

const seed = "seed";
const key = await prompt("Enter HMAC key: ", true);

const hmac = crypto.createHmac("sha256", key);
hmac.update(`${seed}|${site}`);
const digest = hmac.digest("base64");

const pw = digest.replace(/[^A-Za-z0-9]/g, "").slice(0, 12);

console.log(pw);
}

hashpw();

出会い

くらいです「强调程度」

変化が早くて、私たちもついていけないくらいです

これは中学校のテストですが、大人でもわからないくらい難しい問題です

Before

家里有台联想G400老古董,之前装了ubuntu,太卡,这次决定换成arch试试 (也是第一次装,记录一下安装过程)。

arch的逻辑和ubuntu不同,基本什么都要自己动手安装配置,下面从制作启动盘开始介绍:

步骤

下载&制作启动盘

1
2
3
4
5
6
7
8
wget wget https://geo.mirror.pkgbuild.com/iso/2024.01.01/archlinux-2024.01.01-x86_64.iso
wget https://geo.mirror.pkgbuild.com/iso/2024.01.01/b2sums.txt

# check
b2sum -c b2sums.txt

# write in udisk
cat path/to/archlinux-version-x86_64.iso > /dev/disk/by-id/usb-My_flash_drive

然后插上U盘,切换到主板的引导界面

启动盘系统的配置

从u盘启动后会进入一个shell,这是启动盘的系统,运行在ram,所作的配置重启后会消失。

1
2
3
4
5
timedatectl set-ntp true
timedatectl status

# 更新软件源
pacman -Sy pacman-mirrorlist

硬盘分区&挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lsblk -l

# 使用cfdisk进行分区,考虑到设备硬盘本身太过老旧,不设置swap分区
cfdisk /dev/sda

# 格式化分区
# EFI分区
mkfs.fat -F32 /dev/sda1
# root分区
mkfs.ext4 /dev/sda2

mount /dev/sda2 /mnt
mount --mkdir /dev/sda1 /mnt/boot

# 安装内核与基本软件
pacstrap -K /mnt base linux linux-firmware

# 生成分区表
genfstab -U /mnt >> /mnt/etc/fstab

系统预设

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 切换到真正的系统
arch-chroot /mnt

# 时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 硬件时间
hwclock --systohc

# 安装自定义软件
pacman -S vim grub efibootmgr intel-ucode networkmanager openssh zsh git

# 语言
vim /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

# 主机名与密码
echo "j1900" > /etc/hostname
passwd

安装引导(GRUB)

1
2
3
4
5
6
7
8
9
10
11
12
13

# 写入grub
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
# 部分主板:https://wiki.archlinuxcn.org/wiki/GRUB#缺省/后备启动路径
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable

# 配置&生成grub.cfg
vim /etc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg

exit
umount -R /mnt
reboot

配置zsh(可选)

1
2
3
4
5
6
7
8
9
10
11
12
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# 写入.zshrc
plugins=(
# other plugins...
zsh-autosuggestions
zsh-syntax-highlighting
)

配置ssh

1
2
3
4
5
# 生成密钥
ssh-keygen

# 加入公钥
cat key.pub > ~/.ssh/authorized_keys

注意

  1. 退出u盘系统后发现启动失败不要慌,插上u盘后重新挂载硬盘,进入启动盘系统操作。
  2. networkmanager需要提前装好,不然装好的系统没法联网

安装桌面(可选)

1
2
3
4
5
6
7
8
9
10
pacman -S xorg xorg-xinit gnome

# 写入.xinitrc
export XDG_SESSION_TYPE=x11
export GDK_BACKEND=x11
exec gnome-session

systemctl enable gdm
# 或者直接启动
startx

注意最好不要直接root登陆桌面,新建一个用户

参考

https://wiki.archlinux.org/title/Installation_guide

https://arch.icekylin.online/guide/rookie/basic-install.html

周先生は明日日本へ行かれます

文法

敬语体系

  • 尊他语
  • 自谦语
  • 礼貌语:です、ます等。

られます【尊他语】

动词的被动也可以作为一种尊他语,但这里不是被动句,而是单纯将动词改为被动形式,不改变句子成分位置与助词。

今朝何時に 起きられましたか。

部長は 毎朝公園を 散歩されるそうです。

お/ご になります【尊他语】

  • お+一类/二类动词+になります 【这个三类动词不能用】
  • ご+三类动词汉字部分

但是,一二类动词去掉ます只有一个音节的词不能用,如 寝ます 見ます

ます型连用形(去ます)お ~になります
一类动词読みますよみお読みになります
二类动词決めますきめお決めになります

お客様はもうお帰りになりました。

お食事はもう お済み「すみ」になりましたか?

お/ご ください【尊他语】

同上,表示劝说

どうぞ お座りください

尊他语特殊形式

特例

敬语程度

从高到低:

  1. 特殊形式
  2. お になる
  3. 被动形式

慣用語

  1. あっ、そう
  2. じゃないか「降调使用,相当于ね」
  3. ~ていっらゃいます「来る、行く、いる的敬语」

お荷物は私がお持ちします

与上一课相对,这一课学习自谦语是用在自己一方,表示谦让。

文法

お + 動詞 + します

ます型お~します
一类动词話します話しお話しします
二类动词見せます見せお見せします
三类动词連絡しますれんらくお連絡します

自谦语特殊形式【能看懂就行】

  • 明日、私がそちらへ伺います。(明天我去您那儿拜访。)
  • 中国の北京から参りました。(我从北京来。)
  • コピーは私がいたします。(复印的事我来做。)
  • 黄教授に論文を見ていただきました。(我请黄教授给我看了论文。)
  • 案内状、拝見いたしました。(开业通知,我们已经拜读了。)

て~いただけますか

请求对方为自己办事将 いただきます 换成 いただけます ,后者是前者的可能形式。

させていただきます

动词使役形式+いただきます、意为:请允许我~

早速「さっそく」、資料を届「とど」けさせています

ございます

あります ー ございます

です ー でございます

慣用語

  1. 动词以外,名字与形容词有时也加上 ご、お表示尊敬。
  2. 自谦语
    わたくし
    会社しゃ
    私たち私ども「私共」
    もの「者」
  3. 明日有三种读法,郑重程度递增:あした、あす、みょうにち
  4. 昨日同理:きのう、さくじつ
  5. 何もお構い「かまい」もしませんで「招待不周」
  6. 右「みぎ」も左「ひだり」も分かりません 表示自己什么都不懂
  7. いますーおります、ていますーております。

少子化「しょうしか」が進んで、日本の人口「じんこう」はだんだん減「へ」って行くでしょう

文法

動詞+てきました/てきます

  • 表示持续,变化

    日本の人口はだんだん減って行くでしょう。

  • 某种状态开始出现

    ずっと本を読んでいたので、目が疲れ来ました。

小句し 小句し 小句

相当于中文的“又… 又… 所以…”

美味しいし、手軽「てがる」だし、私は冷凍食品「れいとうしょくひん」をよく食べます。

休みだし、天気もいいし、どこかに出かけませんか。

動詞/一类形容词ば 動詞/一类形容词ほど 小句

性质的正比例关系,相当于“越…越…”

この本は 読めば 読むほど、面白いです。

結婚式「けっこんしき」のスピーチは 、短「みじか」ければ 短いほど いいと言われていますね。

で/へ/から/まで/と + の

北京から 東京への 便「びん」は 一日に 十便以上「いじょう」あります。

これは 母への プレゼントです。

慣用語

  1. 交通の便がいい 交通便利
  2. ライトアップきれています 景观照明,打光
  3. 以前 前面不能加修饰语
  4. なんか 总觉得,有点
  5. ~に 似「に」ています 表示相似
  6. アクセスがよくなりました access是否方便
  7. 軽く食べていきましょう 味道清淡,或者分量少

これは柔らかくて、まるで本物の毛皮「けがわ」のようです

文法

名詞/動詞(简体形) + ようです/みたいです

表示比喻,常与まるで连用。

この野菜、まるで果物みたいですね。

先生みたいに 上手に 日本語が話せる ように なりました。

名詞1 らしい 名詞2

2具有1的代表性,典型特征

この着物はいかにも 日本らしい 柄「がら」ですね。

今日は春らしい天気ですね。

仕事らしい仕事は したことが ありません。

時間までに

表示deadline

名詞の/动词简体形 + 間「あいだ」/間に

动作持续时间段

名詞 + ような味「あじ」 / においがします

感觉到某种气味

この牛乳、変な味がするけど、いつ買ったの?

この野菜、レモンのような味がしますね。

慣用語

  1. 済「す」ませたい:他动,结束某事;済みます:自动,事情结束。
  2. んじゃないですか?:委婉表示意见
  3. いかにも:浓厚地具有某种性质,常与らしい呼应

    いかにも 子供らしい 夢ね。

这个周基本没干别的,全在clash的定制化上花时间了,下面总结一下进度。

ClashConfigConverter

一个轻量化的基于 Golang 的 Clash 订阅链接转换器。支持以下功能:

  • 精确到单个订阅链接的 udp 控制与请求头自定义
  • 读取自定义的本地规则列表
  • 预加载节点
  • 正则排除节点

目前只能算一个半成品,没有做太多测试,也没有写readme,项目已经开源:

https://github.com/hinak0/ClashConfigConverter

有时间打磨一下。

Clash

对开源clash内核的二次开发。

开发遵循以下几个原则:

  • 兼容现有的配置文件格式
  • 沿袭现有的项目结构,只做加减法。
  • 代码可读性与性能同样重要

clash采用总线模式组织代码,各个模块相对独立,总线也就是hub模块。

  1. 总线负责解析配置文件,触发全局热更新
  2. 总线向各个子模块传递参数,一般只包括基本类型,constant类型,以及配置文件。
  3. 各个子模块之间不相互引用,需要的数据类型定义在constant模块里。

远端解析功能

之前就发现clash所有的dns解析都是直接解析,如果配置了境外的dns,解析速度就要打折扣,更多时候境外dns根本不通,必须等到5秒超时时间。(尤其是配置了fallback,而且fallback全是境外dns的时候)。

于是开发一个dns自定义传输层(也就是远端解析)的功能,就军训上面的原则,开发有以下几个步骤:

  1. 不能直接引用tunnel中的函数(模块之间要相互独立),而是由总线传入一个ConnContext的通道,传输层使用这个通道
  2. 需要的ConnContext由总线传入dns模块。
  3. 在inbound模块新建一个newINVODKE方法,用于创建invoke的net.conn对象
  4. 最后将创建好的net.conn用在需要的传输层自定义方法。

相对于之前的直接走本机监听地址,有以下几点优点:

  1. 使用net.Pipe(),在内存中进行数据交换,减少了系统调用,优化了性能。
  2. 避免了硬编码,或者跨层读取配置文件来获得代理地址。
  3. 新增的invoke调用或许可以用于后面的其他模块。

这个功能目前运行良好,体感上响应速度快了不少,但是存在以下几个问题。

  1. outbound的dns解析也要依赖resolver来进行,但是resolver解析需要outbound就循环了。[解决办法是至少配置一个境内dns,直接命中direct]
  2. 如果outbound的延迟太高,仍然要等5秒超时时间。[这个也不是代码可以解决的问题]

下一步打算优化:命中代理的域名直接使用fallback,不使用mainserver。[已实现]

优化日志表现

考虑到clash本身有完善的控制面板api,本着”没有日志就是运行正常”的理念,去除了大部分无用的正常日志输出,加强了各种错误日志输出,更有利于掌握运行状态。

重构resolver模块(2024/01/03更新)

针对resolver模块,进行了代码重构,对resolver增加参数ResolvePolicy,可以指定解析策略。

  • Unspecified 未指定,遵循以前的policy服务器->main&fallback服务器流程。
  • DefaultOnly 只使用默认服务器(不加密的直连境内dns)
  • MainOnly 只使用主要服务器(境内加密dns)
  • FallbackOnly 只使用fallback服务器(境外加密dns)
  • 后面有需要可以加入其他的策略,如Mainfirst等。

同时现在由于远端解析功能+可以指定解析策略,整个boot的解析链是这样的:

  1. default必须是dns协议的直连服务器
  2. main与fallback交给default解析
  3. 其他的outbound交给main解析
  4. 入站流量根据规则匹配情况,交给main或者fallback解析

之前提到的命中代理的域名直接使用fallback已经实现了,但是有一定的限制:由于match中部分rule(比如IP-CIDR,GEOIP等)需要解析ip才可以进行匹配,这时候只能使用Unspecified Policy进行解析。

不过好在IP-CIDR一般有no-resolve配置项,GEOIP一般在规则集末尾位置,这个倒不怎么影响指定策略解析。

现在境内流量解析只走境内,境外流量解析只走境外,有这么几个好处:

  1. 降低系统负载,需要发送的解析减少
  2. 可以享受dns加速,优化流量路径。
  3. 减少隐私泄露,现在解析过程,default只解析几个加密dns地址,main只解析境内地址,fallback只解析境外地址,可以说是最小化了dns解析导致的数据泄露。

现在已知有几个issue,但是对于我个人使用没有影响,没有动力去完善了:

  1. tls协议没有实现远端解析
  2. GLOBAL模式和DIRECT模式不可用(由于dns解析功能的限制,global模式和direct模式破坏了解析链。其实已经有几个解决方案了[比如invoke指定SpecialProxy,或者创建新的tunnel队列],但是不够优雅,暂时就不去完善了[已完成]。)
  3. 具体的outbound实现,有可能直接把host给proxy(比如ss协议),算是一种性能损失(解析两遍);还会泄露隐私;还有爱国节点屏蔽[已解决]。

细节完善(2024/1/12更新)

上面提到的一些问题,已经解决了:

  • 关于global模式与direct模式,最总采用了dns指定specialProxy的方式实现,最终还是改变了配置文件格式。
  • outbould主要通过metadata.AddrType()辨别通过ip还是域名,通过修改这个函数实现ip优先。
  • outbound实现一个新的钩子函数用来解析host,除了direct外全部使用fallback解析。

完善版本已经使用接近一个周了,没发现什么问题。

陳さん、息子をアメリカに留学させます

文法

使役形式

动词类别基本形使役形式
一类动词書く書かせる
急ぐ急がせる
読む読ませる
話す話させる
二类动词食べる食べさせる
見る見させる
三类动词来るこさせる
するさせる

名詞 は 名詞 を 動詞(自動) させる

部長は 李さんを 出張させます。

部长让小李出差。

田中さんは 公園で 子供を 遊ばせています。

田中让小孩在公园玩。

名詞は 名詞に 動詞(他动)を させる

在日语中, に 具有与 を 相似的作用,表示被施加作用的对象。

因此,在被动句与使役句子中,可能出现两个”被”的对象。但是,一个句子中不能有两个「を」,于是出现了使用「に」的用法。

陳さんは 森さんに 歌を歌わせます。

老陈让老森唱歌。

動詞 させてください

この仕事は 私に やらせてください。

请让我干这份工作。

動詞 やすいです/にくいです

对应汉字是易い・難い

このペンは とても 書きやすいです。

この本は 読みやすいです

慣用語

  1. お手伝い「おてつだい」

    动词转名词,ます型去掉ます、有时加上表示尊敬的お。

    休み、考え「かんがえ」、手伝い、持ち帰り

  2. 行ってもらいます/行かせます

    前者语气更柔和,更礼貌。

  3. ~のではないでしょうか?「表达委婉的肯定」

  4. ぐっと「拟声词,表达变化幅度大,动作迅速」

玄関「げんかん」のところにだれがいるようです

文法

「好像似乎」的不同说法

  1. 小句/名词の + ようです 好像
  2. 小句 + みたいです 好像(比较随意的说法)
  3. 小句 + らしいです(推测,传闻)

過ぎ「すぎ」です 某种动作超过了正常的量

昼ご飯を食べ過ぎました。

この説明「せつめい」は複雑「ふくざつ」すぎます

一类形容词 + さ 表示某种状态

この夏さはいつまでつづくんでしょう。「炎热的天气什么时候是个头」

某些二类形用词也有这种用法,但不普遍,如可以说便利さ、複雑さ、但是没有綺麗さ、暇さ

慣用語

  1. 試験に合格「ごうかく」しました
  2. おかげさまで「托您的福」
  3. けっこう「一种用法是表示比自己预想的要高」

    ここのレストラン、初めて来たけど、けっこう美味しいね。

  4. 何と言っても「不管怎么说」
  5. デザインがしゃれていて「设计新颖」
  6. 受「う」ける「受到赞赏或欢迎」
  7. パワー「power」
  8. 控「ひか」えめ「谨慎,节制」