肇鑫的日常博客

肇鑫 / Owen Zhao

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

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

最新文章

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发行版也采用了类似的策略。但是,自动改变的类型,导致之前能自动登录的不能成功,这的确造成了一些问题。

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.

ClashX配置Trojan

技术

更新说明

  • 将ClashXR,因为Clash核心支持SSR之后,ClashXR宣布放弃后续开发。(更新日期2020年9月17日)

安装

brew cask install clashx

配置

  1. 打开ClashX。
  2. 点击菜单栏的图标,配置->打开本地配置文件夹
  3. 复制config.yaml,修改为trojan.yaml
  4. 使用编辑器打开trojan.yaml

Proxy:下,添加新内容:

Proxy::
-   name: "tro"
    type: trojan
    server: server # 服务器的IP地址
    port: 443
    password: yourpsk #密码
    # udp: true
    sni: tro.example.com # 用于trojan识别的二级域名
    # alpn:
    #   - h2
    #   - http/1.1
    # skip-cert-verify: true

修改服务器ip,密码和二级域名。保存,切换配置到新配置。出站规则选全局连接,然后选择设置为系统代理

ClashXR的配置对于tab十分敏感。如果tab不对,即便配置是对的,也不会生效。
选全局代理的原因是因为ClashXR本身不自带任何规则。选全局之后,可以上几个网站尝试一下看看是不是生效了。
https://github.com/paradiseduo/ClashXR

添加规则

https://github.com/Hackl0us/SS-Rule-Snippet/blob/master/LAZY_RULES/clash.yaml

上面的是其它人提供的一个Clash的模板,需要规则的,可以从上面复制规则到你自己的配置中。规则从Rule:开始一直到结尾。复制粘贴规则时,同样要注意到tab。

它的规则中定义了Proxy,我们原本的配置里没有。因此我们需要添加。找到Proxy Group:,添加如下的内容。

Proxy Group:
# select 用来允许用户手动选择 代理服务器 或 服务器组
# 您也可以使用 RESTful API 去切换服务器,这种方式推荐在 GUI 中使用
  - name: Proxy
    type: select
    proxies:
      - tro

添加好规则后,重新加载配置,我们就可以将全局连接改成规则判断了。

https://lancellc.gitbook.io/clash/clash-config-file/proxies/config-a-torjan-proxy

其它

Ubuntu 18.04下将Apache2多站点改为Nginx多站点,同时开启Trojan

不建议购买混合多口的PD快充

技术

由于之前的事情,iPad Pro 9.7无法充电之后发生的事,这段时间我使用过多款混合多口(1A1C,2A1C)PD快充充电器。最终,我把混合多口的充电器都退货了,选择了单口的充电器。

充电器的选择,多口VS单口

选择多口的充电器,不仅可以在插排上节约多个接口,并且旅行时,也可以少带几个充电器,减轻重量,这也是为什么大家都喜欢选择多口的充电器。

我以前也买过多口的充电器,比如紫米的18W双A口充电器,就很好用。因此,在选择C口PD快充充电器的时候,我最初也是选择了多口的。结果2A1C的63W绿巨能充电器和1A1C的30W omthing充电器,都让我失望了。

我们先来了解一个概念——打嗝。

打嗝是支持多协议的充电器,在与设备连接,匹配最佳协议时,不能第一时间获得最佳协议的而产生的多次匹配充电协议的状态。其表现是充电设备显示瞬间断电并再次充电。

比如,一款充电器,支持5V1A,5V2A,Apple 2.4A,PD快充18W,那么它在与苹果的iPhone连接时,可能一开始并没有直接匹配到PD快充18W,而是使用了5V2A连接上了。之后,它又检测到设备实际上支持PD快充的,最终采用PD快充18W进行充电。

这个过程,表现在iPhone上,就是一开始发出充电的嘟的一声,然后很短的时间内,又发出嘟的一声。

小结

打嗝本来是一种设计缺陷。但是由于它过于普遍,居然被网友们认为是正常的,更有甚者,认为只有打嗝了,出了两声嘟,才是真正的PD快充,只有一声就是快充不成功。

这种错误观点甚至造成了在技术进步之后,有些充电器,直接一次就连上PD快充了,还要在产品的购买的页面额外注明,一声还是两声嘟不能作为PD快充是否成功的证据,唯一的证明是在0%充电,30分钟能够充50%就是PD快充。

混合多口

以前的多口,都是多个A口,所以是属于单一多口。但是现在随着PD快充的普及,目前的多口充电器,多口多是混合多口。即又有A口,又有C口。

但是A口和C口不是简单的外观不同。实际上,混合多口充电器,在技术的复杂性上,要高于单一多口。而每个接口本身又是支持多协议的,厂家为了成本,多口之间肯定是有共享的电路,而不是设计两套单独的电路。这也就造成了,混合多口之间,是互相干扰的,最明显的就是,单口输出的时候,充电器的上限高于多口同时输出。比如63W的绿巨能充电器,多口同时使用,最高输出只有45W。而30W的omthing充电器,多口同时使用,最高也只有25W。

这种干扰还体现在当一个口在充电时,如果你再使用另一个口充电,前面充电的会瞬间断流,并重新匹配协议。

这些问题,在我之前使用的单一双A口充电器的时候,都没有出现过。

更严重的断流问题

特别的,我在使用iPhone 6s Plus通过A口充电的时候,我还发现。这些混合多口的充电器,在单独通过A口充电的时候,会随机出现断流的情况,特别的,在小电流的时候尤其明显。比如这两款充电器,在手机充电99%以上的时候,都不同程度地出现了瞬间断流的问题。特别的,如果C口同时还有设备在充电,这种瞬间断流会更加频繁。

结论

基于上面的理由,我建议大家在购买PD快充的时候,尽量选择单口的充电器。单口的充电器不仅可以达到标称的上限,并且由于设计更为精简,出现打嗝的几率更小,更不会有混合多口充电器互相干扰的问题。

此外,如果还是要选多口的产品,建议你直接购买单一多口的充电器,即多个C的PD快充,而不要购买混合多口的。

因为即便是不支持PD快充的iPhone,也可以通过C转L的充电线,使用支持Apple 2.4A协议的充电器进行快速充电。

不过有一点要注意。即便你的充电器支持Apple 2.4A的协议,也需要C转L线同时支持也才可以。我以前以为不需要线的配合,后来我遇到了有不支持的线,导致虽然充电器支持,也还是无法使用Apple 2.4A快充的情况。

其它

iPad Pro 9.7无法充电之后发生的事

iOS/iPadOS设备充电全面总结

技术

迄今为止,苹果的iOS/iPadOS设备,共支持4种有线充电方式,2种无线充电方式。

  • 早于iPhone 6的iPhone,仅支持5w充电。
  • iPhone 6开始,iPhone都支持12w充电。
  • iPhone 8开始,iPhone支持PD快充18w,无线充电5w/7.5w。
  • iPad支持10w充电和12w充电。iPad Pro 10.5开始支持PD快充。

只要支持Apple 2.4A协议,充电器就可以支持苹果的快充功能,无论原本的接口是USB-C,还是USB-A。这一点,在网上没有明确的说法,但是充电头的评测有检测到有支持Apple 2.4A协议的USB-C接口的充电器,而在我实际使用的时候,也发现,USB-C转Lightning接口的确也可以为iPad Pro 9.7快速充电。

关于不在充电

当iOS设备在充电,但是充电速率过低时(远小于5w),设备会提示不在充电。但是此时设备还是在以极慢的速度充电。这个“不在充电”其实是在提示你,充电遇到了速度过低的问题,但是同时连接是成功的。

5W充电

一些不兼容苹果协议的充电设备,比如一些10w甚至更高的PD充电器,连接到最高支持Apple 2.4A协议的苹果设备时,只能以5w的速度充电。因此,如果你有PD快充的设备,没有支持Apple 2.4A的协议时,可以买一些比较便宜的PD快充充电器。但如果你同时还有其它的旧设备,选购的时候就得买支持Apple 2.4A协议的。遗憾的是,这个协议经常不被厂家标注,比较简单的办法是查询充电头网站,对于该充电器的评测。如果有支持该协议,充电头的评测都会单独说明。

相关

iPad Pro维修篇

绿巨能1C2A 63w充电器退货历险记,淘宝客服的套路与解法

为MWeb添加推特卡片的支持

技术

当我们分享链接到推特时,如果链接对应的网站支持推特卡片。推特就会生成相应的卡片,效果如下图,这比单纯的文字加链接的效果要好很多。

twitter_card_summary_larget_image

特别提示:本文是对于MWeb的深度定制,建议你看完全文之后,再决定是否动手。

新建一个网站

强烈建议你新建一个网站用来练手。右键MWeb的库,选择新建分类,然后选择做为站点,选择一个主题(我们以octopress主题为例),然后点右侧的编辑,选择“复制当前主题到新主题”。这样做的好处是,你对于主题的修改,都是在复制后的主题进行的,一旦出现问题,删掉这个主题就可以了,不会影响到已有的主题。

copy_theme_to_modify

自定义扩展

双击进入主题的文件夹,你会看到一个叫extensions的文件夹。双击进入这个文件夹。里面一般会有一个或者两个文件,分别叫site.jsondocument.json。这两个文件对应了MWeb设置中的站点扩展和文档扩展。

extension_preferences

虽然也可以在MWeb中直接添加站点扩展和分享扩展。但是那个添加的方式MWeb应该是做错了。添加的内容成了全局的,一旦添加,所有的站点就都有了,而不是指定的站点才有。
直接编辑这两个文件,生成的扩展,是只针对当前主题对应的站点的,不会引起混乱。

站点扩展

用文本编辑器打开site.json。复制下面的内容,插入到文件的第二行。

{
    "title":"twitter:site",
    "variableName":"twitter:site",
    "inputFieldHeight":22,
    "exampleText":"@owenzhao"
},
{
    "title":"twitter:creator",
    "variableName":"twitter:creator",
    "inputFieldHeight":22,
    "exampleText":"@owenzhao"
},
{
    "title":"og:image",
    "variableName":"og:image",
    "inputFieldHeight":50,
    "exampleText":"图片路径或地址"
},

文档扩展

打开document.json文件。(如果不存在,可以复制一份site.json,然后改名为document.json,删除掉第一行左中括号和最后一行又中括行中间的内容。)复制下面的内容,插入到文件的第二行。

{
    "title":"og:description",
    "variableName":"og:description",
    "inputFieldHeight":240,
    "exampleText":"文章摘要"
}

如果原本document.json中就有内容,上面代码最后的}之后需要加一个英文的逗号。

为了方便 ,我将og:image属性放在了站点扩展,这样只需指定一张图片,就可以一直使用了。
如果你想要每个文章都单独指定一张图片,可以将og:image那一段大括号的内容,从站点扩展,移动到文档扩展。
一旦og:image放在了文档扩展,你就必须每个文件都单独指定一张图片。不然,生成网站的时候就会遇到错误。

填写内容

打开MWeb,添加必要的属性。

站点扩展

fill_site_extensions

  • twitter:site,是你站点对应的推特,如果没有,就填成你自己的。
  • twitter:creator,是作者,也就是你自己的推特。
  • og:image,是卡片的题图。需要把它放在主题的asset/img/下。建议图片大小不要小于1600x900。
    • 如果你的是在文档中指定的,那就是是media/开头的地址。

注意:站点扩展,每个站点都需要单独设置。

文档扩展

打开你要修改的文章,点开最右侧的ℹ️标志,粘贴一段文字,或者编写文档摘要到og:description文本框即可。

修改模版

之后就是修改模板了。一个MWeb生成的模版,大致可以分成headbodyfooter三部分。

  • head对应,主题中的header.html文件。
  • body,根据性质的不同,分别对应主题中的post.htmlpage.htmlcategory.htmlarchives.html文件。
  • footer就对应footer.html

根据推特的要求,它的信息,必须写在html文件的head的meta中,这个是在模版的header.html中。这里,我们遇到了一个较大的困难。我们的一部分内容,是只有在post.html才可以得到。header.html无法取到相应的数据。

我的解决方案是修改header.html文件,将/head及之后的内容移动到对应body的部分,即需要移动内容到post.htmlpage.htmlcategory.htmlarchives.html文件中。

注意:如果你使用的是其他的主题,可能对应body的不是我写的这几个文件,有可能是别的文件,或者甚至更多。但修改的原理是相同的。

删减head.html

用文本编辑器打开head.html。剪切</header>以及以后的内容,我这里对应的是第42行开始。

修改其他模版文件

将剪切的内容粘贴到post.htmlpage.htmlcategory.htmlarchives.html文件的顶部。

插入推特信息

将下面的代码,插入到post.htmlpage.html的顶部。另外两个文件不必插入。

<!--Twitter Meta-->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="{{ext_twitter:site}}" />
<meta name="twitter:creator" content="{{ext_twitter:creator}}" />
<meta name="twitter:title" content="{{post.title}}" />
<meta property="og:url" content="{{siteURL}}{{post.url}}" />
<meta property="og:title" content="{{pageTitle}}" />
<meta property="og:description" content="{{post.ext_og:description}}" />
<meta property="og:image" content="{{siteURL}}{{ext_og:image}}" />

完成

保存所有文件,在MWeb中的站点,选择清空并重新生成网站,然后同步网站到你的服务器就可以了。

以后,你只要分享任意该网站的文章链接到推特,就可以同步生成推特卡片了。

参考资料

网件R8000路由刷第三方固件,从入门到放弃

技术Openwrt

使用这个路由已经4年多了,期间多次尝试过第三方固件。前几次都是因为刷完固件之后,无线网掉速严重,最后又刷回了官方的。

网件R8000这个路由还是很不错的。当年,还在小伙伴们信誓旦旦地说房子装修一定要埋百兆有线,因为无线路由的文件复制速度只有几MB/s的时候。我已经用上了苹果的时光胶囊,我的时光胶囊是802.11n版本的,内网复制文件速度大概20MB/s左右。从时光胶囊换成网件R8000,速度变成了50-60MB/s。

上个月下旬,网件发布了R8000的新固件。令人意外的是,除了常规的错误修正外,网件还移除了R8000原本自带的多项功能。

netgear_r8000_firmware_1.0.4.46

去功能这件事,让我对于网件的好感大减。不过好在我也可以不升级啊。

也许是多事之秋吧。几天之后我就遇到了印象中从来没有过的无法登录路由管理界面的问题,我最终不得不关掉了电源重开机。

这使得我不得不重新面对这个更新。“错误修正:修正了重负载下的稳定性问题。”也许我需要的就是这个。从心的我安装了新的更新。

不过,此时我的内心已经再次对于第三方固件蠢蠢欲动了。

为什么要使用第三方固件?

对于我有两大理由:SS和去广告。虽然我已经在每个设备都安装了SS,但是如果每次创建一个虚拟机,都需要装一次SS也是挺麻烦的事情。至于去广告,因为最新版macOS的Safari已经没法通过浏览器完美去广告了。我现在使用的收费的AdGuard。因此,我对于新的去广告的方式总是保持开放态度。

选择哪个第三方固件?

第三方的固件有很多,最大的是DD-WRT、OpenWRT和Merlin。我的选择的OpenWRT。

安装OpenWRT

上贼船总是比下贼船要容易的。按照这里的提示就能按照OpenWRT了。简述步骤如下:

备份旧版并恢复到出厂

  1. 现在来到这个界面,备份当前固件的设置。
  2. 然后选择恢复到出厂。

netgear_r8000_backup_and_restore_factory

安装OpenWRT固件

重新进入路由后,选择左侧升级路由,上传你下好的OpenWRT固件,等待刷完之后。输入192.168.1.1。

设定一个管理员密码之后,就可以使用新固件了。

如果你看到这里还不知道我在说什么。那么我强烈建议你使用原厂固件。不要折腾了。

失败的尝试

用了两天的时间,我尝试了我曾经想用的SS和去广告功能。结果都不令人满意。在路由上开启SS的最大问题就是不够灵活,每次要修改都需要通过路由的设置界面。而去广告就更别提了,开了去广告之后,我的YouTube的首页几乎处于无法打开的状态。也许是路由的性能不够强吧。

但是以上两点并不是我放弃第三方固件的根本原因。因为,就算这两个功能都不够好用,也顶多没有额外的加分。实际上,第三方的路由还是有好处的。比如我使用原厂固件的时候,如果iOS开小火箭,访问微博的时候,图片和视频加载就会很慢。但是使用第三方固件没有这个问题。

导致我不得不返回原厂的原因是,无线的覆盖出现了问题。使用原厂路由的时候,我家里的任何角落都是有信号的。但是换成了第三方的固件之后,我躺在床上的时候,iPad Pro的网就不稳定了,经常断流。我必须刷回原厂了。

艰难的返回原厂之路

tftp刷机大法

OpenWRT的网站似乎不是很鼓励刷回原厂,它的WiKi上没提如何刷回原厂。论坛中帖子提到刷原厂,也只是提到网件官方的一个使用tftp刷机的办法,针对的是变砖的机器。如果你是Mac用户,还需要同时参考这篇

简述一下这个方法:

  1. 通过有线连接路由,手动指定静态ip。
  2. 移除与路由相连的其它设备的网线,只留刷机的这台机器的。
  3. 关路由,等10秒,重开路由。观察路由上的电源灯,当灯变成黄色时(也称琥珀色,可能是常亮也可能是闪烁,根据型号的不同),开始刷机。

我反复尝试了很多次这个方法,都没成功。路由始终能ping通,但是就是无法传数据上去。

迂回之路,使用DD-WRT

OpenWRT的管理程序,不能够刷机网件原厂的固件,提示格式不对。但是DD-WRT的固件可以。而OpenWRT的固件,可以通过DD-WRT的升级固件,转成DD-WRT。于是我有了一个大胆的想法。

  1. 重置OpenWRT固件。(重置之前先备份,万一你没成功只能回来呢?)
  2. 升级固件,选择下好的DD-WRT升级固件
  3. 多等待一些时间。保守估计5分钟,怕不保险可以等10分钟。清空浏览器的缓存,输入192.168.1.1。

注意:这里必须清空浏览器的缓存。不然无法看到DD-WRT的管理界面。只能看到OpenWRT的管理界面说连不上。

进入管理界面,重置设置。然后刷新网件原厂的固件,再重置,再恢复一开始的备份,就一切恢复原状了。

关于刷机的一些额外说明

每次刷机的步骤是:

  1. 备份旧固件设置。
  2. 重置旧固件到出厂。
  3. 刷新新固件。
  4. 重置新固件到出厂。
  5. 开始使用。

每次都额外的重置固件,原因是怕有残余的设置干扰。

此外,如果你忘记了固件的密码,无法登录路由。可以找一个牙签,捅住路由电源按钮旁边的复位开关,一般15秒就可以了。

R8000的5G热点1的性能问题

如果你单独使用R8000每个热点的话,你会发现5G的热点1,即对应数字40左右的那个,性能会比149左右的性能要差。5G热点1有时最高只能开到40Mhz的带宽,而不能想5G热点2那样开到80Mhz的带宽。

解决的办法很简单,将频段的国家从中国或者其它的设置,改成美国,然后点击应用就可以了。

参考资料

为MWeb添加图片点击新窗口打开大图的功能

技术

最近写文章需要在博客中插入较大的图片,如果用户可以点击看到大图,则可以看到更多的细节。实现步骤如下:

创建JavaScript代码文件

  1. 用文本编辑器(比如macOS自带的TextEdit)创建一个新文件,保存它到下载文件夹,并命名为dealing_images.js
  2. 复制下面的代码到上面提到的js文件,保存并关闭这个文件。
function openInNewWindow(image) {
  window.open(image.src);
}

var images = document.querySelectorAll("img");
var index;

for (index = 0; index < images.length; index++) {
  let image = images[index];

  if (image.src.includes("/media/")) {
    image.addEventListener("click", function() { openInNewWindow(image); }, true)
  }
}

复制文件到对应文件夹

  1. 右键点击你要修改的网站对应的MWeb的分类,点编辑。
  2. 在弹出的窗口中,点击主题最右侧的编辑。这时MWeb会自动打开Finder窗口。
  3. 进入选择你网站正在使用的主题。然后复制dealing_images.js到主题所在的assets/js/文件夹。

添加脚本到生成html文件的模版

  1. 同样是刚刚的主题所在的文件夹,用文本编辑器打开footer.html文件。
  2. 在文件的末尾的</body></html>行之间,插入脚本。
<script src="asset/js/dealing_images.js"></script>

最终效果如下。

</body>
<script src="asset/js/dealing_images.js"></script>
</html>

重新生成网站

  1. 回到MWeb,右键点击网站对应的分类,选择清空并重建网站
  2. 然后再次右键,选择预览网站。就可以看到效果了。

修改完成后,第一次必须清空并重建网站,不然的话,dealing_images.js不会被复制到MWeb搜生成的文件夹里。