肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTapRooster Time,以及 Markdown Writer 相关工具。

最新文章

Ubuntu 20.04下安装Nginx与Trojan,并使用HTTP/2

原以为20.04的安装会比18.04方便很多。但是没想到坑也不少。

安装Nginx

Ubuntu 18.04自带的Nginx本身没有开启ngx_stream_ssl_preread_module。我们安装Nginx官方提供的版本,这个版本开启了所有的可开启扩展。

sudo vi /etc/apt/sources.list

在文件最下面添加并保存

# for latest nginx
deb http://nginx.org/packages/mainline/ubuntu/ focal nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ focal nginx

添加服务器签名,签名在这里nginx_signing.key

wget http://web.archive.org/web/20180805232520/http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

安装Nginx并开启防火墙端口

因为防火墙默认是关闭的,所以ufw的那步可以不做。

sudo apt update
sudo apt install nginx
sudo ufw allow 80
sudo ufw allow 443
sudo systemctl start nginx
sudo systemctl enable nginx

你现在可以打开浏览器,然后输入vps的ip地址,如果看到了nginx的欢迎界面,就代表nginx配置成功了。

配置Nginx多站点

单独安装的nginx,只包含一个最基本的配置,多站点的文件夹默认都没有配置。我们需要手动建立文件夹。

mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled

然后编辑nginx.conf文件,将后者加入其中

vi /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;,之后插入一行,粘贴include /etc/nginx/sites-enabled/*;

保存并退出。

假设你有一个网站叫example.com,网页位置在/var/www/html/example.com/html。新建一个配置文件。

sudo vi /etc/nginx/sites-available/example.com

内容如下

server {
	listen 80;
	listen [::]:80;

	server_name example.com www.example.com;

	root /var/www/html/example.com/html;
	index index.html;

	location / {
		try_files $uri $uri/ =404;
	}
}

我们不用添加443端口,因为等下添加证书的时候,Certbot会帮我们自动生成新的配置文件。

将网站配置生效

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled
sudo systemctl reload nginx

参考上面的步骤,添加你所有的站点。之后,再额外添加一个站点,用于Trojan的识别。

最后添加的站点,一定要是一个不需要用的二级域名,而不要使用一级域名。因为我发现Nginx的预读有bug。如果你使用了一级域名,那么它的二级域名也都会匹配。这将导致错误。
一级域名指的是example.com这种,二级指的是mail.example.com这种。

这里我们假设额外配置一个叫tro.example.com的二级域名站点。

为Nginx添加SSL证书

通过浏览器访问网站https://certbot.eff.org,选择Nginx和Ubuntu 20.04,安照网站的提示安装certbot。

sudo apt update
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

申请证书

sudo certbot --nginx

按照提示进行操作。完成之后,你再通过浏览器访问网站,你会发现已经是https的了。

查看证书

cd /etc/letsencrypt/live/
ls

记住证书所在的文件夹名称,假设是“example.com”。

安装Trojan

虽然20.04自带了trojan,但是经过我的测试,20.04自带的trojan无法与nginx共同运行。trojan无法正常启动。所以,我们还是通过老办法进行安装。
如果你尝试了自带的trojan。自带的安装之后,配置文件在/etc/trojan。而不是/usr/local/etc/trojan。

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"

修改Trojan配置

sudo vi /usr/local/etc/trojan/config.json

找到"local_port",将443,改成4433或者你希望的端口。
找到"password",修改为你想要设置的密码。
找到"ssl",将"cert"设置为“/etc/letsencrypt/live/example.com/fullchain.pem"。将"key"设置为"/etc/letsencrypt/live/example.com/privkey.pem"。

保存并退出。运行Trojan。设置为开机启动。

sudo systemctl start trojan
sudo systemctl enable trojan

检查trojan是否正确启动

sudo systemctl reload trojan

如果命令不返回任何消息。证明trojan正常启动了。如果提示没有在运行的trojan,无法重载,就证明trojan没有启动。

配置Trojan+Nginx共存

sudo vi /etc/nginx/nginx.conf

在events和http两段之间,插入

stream {
    map $ssl_preread_server_name $name {
        tro.example.com trojan;
        default nginx;
    }
    upstream trojan {
        server 127.0.0.1:4433;
    }
    upstream nginx {
        server 127.0.0.1:4443;
    }
    server {
        listen 443;
        listen [::]:443;
        proxy_pass $name;
        ssl_preread on;
    }
}

保存,修改之前设置的所有网站的设置。打开/etc/nginx/sites-enable/中所有的网站的配置,将所有的443端口,改成4443端口,然后保存。

sudo systemctl reload nginx

在好多支持Trojan的客户端中,域名是可选的。但是由于我们需要使用域名来进行跳转,所以在设置客户端时,域名是必填的,必须填写为tro.example.com
Module ngx_stream_ssl_preread_module

开启HTTP/2

进入/etc/nginx/sites-enabled/目录,修改其中的每个文件。

cd /etc/nginx/sites-enabled/
sudo vi example.com

将其中的

listen [::]:4443 ssl; # managed by Certbot
listen 4443 ssl; # managed by Certbot

改为

listen [::]:4443 ssl http2; # managed by Certbot
listen 4443 ssl http2; # managed by Certbot

找到include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot,注释掉,并在下面添加新行。

#    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

保存并关闭。重新加载nginx。

sudo systemctl reload nginx

测试HTTP/2已经生效

退出SSH与服务器的连接。在终端输入

curl -I https://example.com

输出结果如果有“HTTP/2 200”,就代表HTTP/2设置成功了。

其它

修改Mac中iOS/iPadOS设备默认备份的位置

技术

起因

我的iCloud只买了50G的,其中iPhone和iPad的备份占了大头。终于有一天,提示空间不够了,要加钱。于是我选择手动备份iPad,但是我发现,苹果默认备份是在主磁盘,并且没有改存储设置的选项。让一个很少用到的备份,占用主磁盘,实在是太不划算了。于是我查找修改的办法。

原理

访达中默认备份的位置是~/Library/Application\ Support/MobileSync/Backup文件夹。我们只需要将这个位置通过ln转移到我们需要的位置即可。

实践

  1. 打开访达(Finder),按下cmd+shift+o,输入~/Library/Application\ Support/MobileSync/,跳转到这个文件夹。
  2. 如果上面的文件夹不存在,就创建一个,名字一定要拼对。
  3. 查看底下是否有Backup文件夹,如果有,执行4、5、6。如果没有执行4、6。
  4. 打开另一个访达窗口,找到你想要保存备份的文件夹位置,我这里是/Volumes/1T/MobileSync/Backup/
  5. 将3中Backup内部的文件夹复制并粘贴到4的文件夹中。完成后,删掉3中的Backup文件夹。
  6. 打开一个终端(Terminal),输入命令ln -s /Volumes/1T/MobileSync/Backup/ ~/Library/Application\ Support/MobileSync/Backup
  7. 在Finder中点击备份,你会看到新备份保存在指定的位置了。

参考

SSH升级后,key自动发生变化导致不能自动登录问题的处理

技术

最近遇到一个奇怪的问题,原本能够通过key自动登录的ssh,突然不能登录了。

经过调查,我发现原本的key类型是“ecdsa-sha2-nistp256”,但是服务器现在要求的key是“ed25519”类型。此时在客户端(本机),删除掉“~/.ssh/config”和“~/.ssh/known_hosts”里对应的服务器端的信息。重新用ssh连接。此时,虽然不能自动登录,但是可以通过密码登录。

登录成功后,在服务器端修改“vi .ssh/authorized_keys ”。将原本的“ecdsa-sha2-nistp256”类型的key,替换为“ed25519”的新key。保存并关闭。

重新用ssh登录,这下自动登录又好用了。

生成“ed25519”的方法,可以看github的说明

结论

从上个月起,github改变了策略,新上传的key必须是“ed25519”类型,之前的类型不再接受。一些Linux发行版也采用了类似的策略。但是,自动改变的类型,导致之前能自动登录的不能成功,这的确造成了一些问题。

联通需要对员工加强教育

我的宽带只开通了IPV4,没有开通IPV6,于是我找联通要求它给我开通。

我首先打的是10010,客服和我说,这个需要去营业厅办理。于是,我又去了营业厅,营业厅说,你这个需要报修才能办理。于是我有打10010报修。结果我10010报修的时候,联通所谓的技术专家竟然问我,是不是要办理高清电视的央视6台。我说不是,是宽带相关的。

下午,联通的维修人员来我家查看光猫。结果发现我的光猫只有一个关于IPV6的设置,就是状态显示。并且显示是空的状态。也就是联通后台那边没有开通。但是联通负责后台的人根本不懂什么是IPV6,他们有人办宽带,就是默认开通IPV4就完事了。

结语

联通从10010客服,到10010技术专家,到营业厅工作人员,到上门维修的技术员,到后台工程师,全部对于IPV6一无所知。这个方面,联通需要加强培训。联通怎么说也算是个科技公司啊。

OPPO Enco X无线主动降噪耳机,苹果用户主观入手三日小结

enco_x_full

从左到右依次是华为送的文具盒、苹果笔1代、华为送的玩偶、Enco X充电盒保护套(淘宝购入)/Sandisk U盘、小米蓝牙温湿度计、华为送的玩偶。

我是从拼多多买的。算是没有翻车吧。一切都好,就是保修卡被撕破了。不知道是碰巧,还是拼多多的都这样?价格是512元包邮。所以我讨论的价位就是500块左右的耳机。

我之前用过两个主动降噪的耳机,均是QC 20i,一个是苹果直营店买的,花了2500多,那个后来坏了,我就又从淘宝买了个二手的,这次只花了500多。只有上一个的零头。这次二手购买,彻底改变了我的购买习惯。如果一个耳机注定只能用两三年,那么直接花几千块买全新的,不如花个零头买个二手的。

对于QC20i的降噪和音质,我是满意的。不过它戴着的确不是那么方便,尤其是在耳机口已经从手机上取消了之后。我现在用的iPhone 6s Plus,没问题。但是以后换手机,肯定是没有3.5接口的了。

先谈谈这个耳机优点。

优点

低延迟,看电影没问题

我的使用场景最多的时候是在室内,而非室外。比如我的iMac不支持H265的加速,在观看4K H265的视频的时候,CPU风扇会狂转,同时如果我开了空调的话,这时,用苹果表测出的室内噪音为41分贝,此时如果使用iMac内置的扬声器看电影,声音需要达到50分贝以上,同时观看体验不好,还能听到各种其他的噪音。

此时,带上主动降噪的耳机,开启强降噪模式,顿时一切都安静下来。可以安心地刷剧。

Enco X的蓝牙传输距离很远,戴上耳机之后我可以放心地在家里走来走去。只要别走到最南和最北的窗台,基本上都没问题。但是如果出现了卡顿。回来时就会遇到音画不同步的问题。此时,拖动视频的滚动条是没有用的。延迟也会被同步。解决办法是切换音源,即先切到iMac内置扬声器,然后再切换回耳机。这样音画就重新同步了。

另外,在观看电影。我发现Enco X耳机有爆音。不过,经过研究我发现。爆音的原因是我在播放软件中选择了音量提升为原始音频的150,改成100就可以了。

iina_volumes

系统可以显示电量

bluetooth_battery

缺点

  • 不能像AirPods那样在设备之间自由切换。如果想要切换,需要先暂停,然后另一个设备才能成功连接上。
  • 左右耳的操作是重复的。左右耳虽然都能操控,但是二者的操控是相同的,而不能设定为左耳是一个操作,右耳是另一个。
  • 有时候会误触。
  • 模式切换只有两种状态,只能从通透、强降噪、弱降噪三个中选两个。
  • 控制软件只有安卓版。作为苹果用户,通过App来进一步设置耳机。不过这也不能算完全的坏事。因为没有App就无法升级固件到最新,而论坛上有人反映,如果安装了最新的固件,苹果用户的延迟会增加。

enco_x_open

时光机备份的最佳策略

macOS自带了时光机功能,但是要用好它,还是存在一些技巧的。下面是我总结的最佳策略,以及原因。

多机备份的最佳策略

如果你有多台Mac,那么可以使用网络功能进行备份。即在其中一台Mac作为服务器,开启文件共享服务,然后创建一个共享文件夹,将这个文件夹做为时光机的备份磁盘来使用。因为macOS现在可以直接在Finder中,限定时光机的大小。这样,你的磁盘整体空间也完全不会被浪费。

步骤

s01

s02

s03

单机备份的最佳策略

单机,就不能使用文件夹的方式,而只能使用分区。这时需要注意的是加密的问题。

时光机在使用时,会一直写入到磁盘,直到写满才会按照策略删掉最旧的。因此,如果你想要限制,就需要单独未它创建一个分区。

时光机可以在创建备份时开启磁盘加密,但是这种方式我强烈不推荐。因为速度实在是太慢了,还可能会出现bug而卡住。一旦卡住,加密不能完成,这个磁盘就废了,只能格式化才能继续使用。

所以,如果你想要使用加密的磁盘,那么最佳策略就是在分区格式话的时候,同时选择格式化为加密分区。这样之后再用于备份,就可以直接备份,不用再给全盘二次加密了。这样速度也会快很多。

More Details On Installing macOS Monterey 12 Beta On Unsupported Macs

技术

If you want to install macOS Monterey on your Mac and you Macs are not officially supported by Apple. I suggest you to follow this video.

Monterey on Unsupported Mac - OpenCore Legacy Patcher! Install the Latest Beta on 2012-2014 Macs!!!

I installed two of my Macs to macOS Monterey 12 beta 2 today, and I found for beginners that video was not enough. There were also something important that were missing. That was this article for.

Foundation Knowledges

Before installing the system, it is better to know how the booting process works.

Normal Boot With a Internal SSD

normal booting

When a user presses the power button, a Mac searches all disk partitions. The EFI partitions normal are hidden and load first by default. So If a user chooses to boot from the internal SSD, the EFI are loaded first and then the APFS partition.

There are hardware related drivers on the EFI and this affects the macOS that loads after EFI. This is very important. So keep the EFI of you internal SSD and don't override them unless you are 100% certain.

Booting With Installing USB Disk

booting with usb disk

After a user presses the power button, the user hold the Options button of the keyboard until a list shows. The list shows the Internal SSD, the EFI and macOS Monterey Installer on the USB Disk as well.

The user has to choose the EFI first then choose the macOS Monterey Installer. If the user chooses the Installer first, the system will show no disk error as the driver is not ready.

Installing macOS To External SSDinstalling to external SSD

Installing to external SSD is as easy as to choose the external SSD. However, after installing, you should install the EFI by OpenCore Legacy Patcher to the external SSD as well.

dual booting

Conclusion

Installing macOS on an unsupported Mac means installing both EFI and macOS on the Mac. Without the EFI, the Mac won't boot properly with the new macOS.

Others

You will need at least 35GB free space to install macOS Monterey 12 beta 2.

For your USB disk, partition it in GUID format. It is request to use EFI with GUID.

For iMac 5K users, DO NOT install EFI on your internal SSD. Or your screen will only get resolution at 3840x2160 most, even on macOS Big Sur 11.4. That is because currently the EFI by third-party can't do as well as Apple's.

《花木兰》中文IMAX 3D版观影感受(剧透版)

电影

p2616770846

这篇主要谈谈剧情。先来看看《木兰辞》:

木兰辞

第一段

唧唧复唧唧,木兰当户织。不闻机杼声,惟闻女叹息。

木兰织布的情节,电影里是没有的。电影里木兰从小就是一个活泼好动的孩子。还因为捉鸡上了房顶。

第二、三段

问女何所思,问女何所忆。女亦无所思,女亦无所忆。昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。

东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。旦辞爷娘去,暮宿黄河边,不闻爷娘唤女声,但闻黄河流水鸣溅溅。旦辞黄河去,暮至黑山头,不闻爷娘唤女声,但闻燕山胡骑鸣啾啾。

“阿爷无大儿,木兰无长兄”结合后面的“爷娘闻女来,出郭相扶将;阿姊闻妹来,当户理红妆;小弟闻姊来,磨刀霍霍向猪羊。”我们可以知道,木兰已知的人物关系,是有健在的父、母、姐、弟。木兰同辈排行在中间。但是电影中,木兰的父亲只有两个女儿,并且木兰是大女儿。

电影中木兰家中就有马,而且是匹好马,名字叫“黑风”。并且木兰的父亲有一把宝剑,上面刻着“忠勇真”三个字。

第四段

万里赴戎机,关山度若飞。朔气传金柝,寒光照铁衣。将军百战死,壮士十年归。

这段的“将军百战死,壮士十年归。”是比兴的手法。十年是虚指,不是实际用了十年。诗的后面有提到“同行十二年,不知木兰是女郎。”这个是实指。一共12年,这是长时间的战争。而电影中大大的简化了。变成了一个营的兵力,参与了两场战斗。一场是和敌军保护商路的战斗。一场是迅速回防救驾的京城保卫战。

其余部分

归来见天子,天子坐明堂。策勋十二转,赏赐百千强。可汗问所欲,木兰不用尚书郎,愿驰千里足,送儿还故乡。

爷娘闻女来,出郭相扶将;阿姊闻妹来,当户理红妆;小弟闻姊来,磨刀霍霍向猪羊。开我东阁门,坐我西阁床。脱我战时袍,著我旧时裳。当窗理云鬓,对镜帖花黄。出门看火伴,火伴皆惊忙:同行十二年,不知木兰是女郎。

雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?

兔子,木兰骑马的时候有提到,说是见到两只兔子,不知道公母,但是自己猜是一公一母。

有关西方人理解的中国故事

核心剧情

迎击敌军的是皇帝陛下的卫队。这在西方人看来很正常。因为西方(欧洲)的国家都很小。有一个城堡,就敢号称自己是个国王。所以国家最精锐的部队必然是国王的卫队。打仗派出的也是国王的卫队。

但是中国不同。中国皇帝的疆域可比欧洲的国王大多了。打仗也不可能是排出皇帝陛下的卫队。因为皇帝亲军的存在的目的就是为了拱卫京师。而外族打仗,那是边军的事。因此电影中调虎离山,然后袭击都城的事情,在欧洲可能成立。在中国是不可能成立的。

这是电影情节最大的硬伤。剧情不成立。

仙娘

巩俐饰演的仙娘是一名巫女。巫女(女巫)是西方世界常见的角色。并且有一段时间,教廷还追杀她们,认为她们是邪恶的。现代西方社会,女巫被认为是不存在的。并且存在一个词,叫“猎巫”,含义是借助不存在的罪名迫害某人。

中国文化中,即便有巫女(神婆),也不会被迫害,反而会受到尊敬。所以,巫女因为遭到迫害而加入敌方这件事。剧情也是不成立。

从电影的结构来说,木兰是明线。仙娘是暗线。二者有着类似的成长经历,身怀天赋,但是因为是女性,才能不被世人认可。仙娘选择了反抗,加入了外族军队。而木兰选择了相信自己的同伴,最终才能得到承认。

木兰

影片的前半段,其实拍得还是中规中矩的。电影中的木兰更像是古龙笔下的人物,一开场就有极高的实力。而没有修炼过程。比如在军营中,其余的人都是受训并提高实力。而木兰,从一开始就是想办法掩盖自己的实力。

故事的转折发生在木兰与仙娘的相遇。仙娘看出了她是女的,并不停地问你是谁。木兰却说自己是花军,是效忠皇帝陛下的骑士。结果……花军就被打死了。然后仙娘跑去了别的战场,而木兰因为先祖(凤凰)的庇佑,又重生了过来。之后,她决定不在隐藏自己的身份,以女人的身份进行战斗。

从这时起,木兰的主角光环就来了。不仅获得胜利,并且反派也纷纷降智。甚至在被逐出军队后,又回到军队时,将军不仅没有杀她。还在军队中采用了民主制,因为大家都支持她,就把回都城的任务交给她,并且突击骑兵队由她来指挥。要知道,将军也是一起回防的。

关于功夫和场面

平心而论,几场打斗还是精彩的。只和李连杰和甄子丹都无关,这难免让观众失望。

最终得分

6分。剧情硬伤严重。给外国人看没什么,但是给中国人看漏洞就过大了。服化道方面,由于我本身对于南北朝时人们穿成什么样都没什么研究。所以这个就不说了。来张刘亦菲的"华为"造型作为结尾。

p2619664675.jpg