如何远程给女儿放动画片之iPhone篇

上一篇写了部署动态域名、端口映射、SSH隧道的架设,然后在新电脑上用「屏幕共享」来访问家中的旧苹果电脑。那么如果是在半路上,只有一台iPhone手机,没有电脑在手或者操作电脑不方便,就没法弄了。所以接下来就是解决用手机远程连接的问题。

在手机上策略仍然一样,首先仍然是要在iPhone和旧电脑间架设起SSH隧道,然后通过隧道来访问旧电脑上的屏幕共享接口即可。macOS上系统自带的「屏幕共享」(Screen Sharing.app)本质上就是一个VNC客户端,因此在iPhone上使用一个通用的VNC客户端即可完成访问。

步骤一、在iPhone和旧电脑间建立SSH隧道。

这里需要找到这样一款App,它可以通过RSA密钥对来建立SSH隧道,还要能成为全局代理,因为下一步的VNC客户端需要通过它来转发网络通讯。经过一番搜索和尝试后,找到了「Termius」这款App,选它主要是它不仅能建立SSH隧道,重要的是可以在后台运行。

安装完Termius后,分四步完成设置:

(一)在「Valuts」-「Keychain」中新建一组RSA密钥对。

点右上角「+」按钮选「Generate Key」,Type选「RSA」(其实默认ED25519更好,如有兴趣可自行尝试),点「Save」按钮完成创建。然后长按刚创建的密钥对,选「Edit」,将其中的Public Key复制,发送(通过微信、QQ、iMessage皆可)并保存旧电脑的~/.ssh/authorized_keys中。

(二)在「Valuts」-「Hosts」中新建一个Host:

Label:home-mac
IP or Hostname:example.ddns.com
Use SSH:勾选
Port:35791
Username:YOUR_USERNAME
Password:不要填
Key:刚才创建的密钥

注意:这里的YOUR_USERNAME要换成你的旧电脑上的用户名,后面的example.ddns.com要换成你注册的动态域名。

如果配置成功,在这里点击「home-mac」,就会登录到旧电脑的命令行了。

(三)在「Valuts」-「Port Forwarding」中新建一个配置:

Label:back-to-home-mac
Local Port:5900
Bind Address:0.0.0.0
Intermediate Host:刚才创建的Host
Destination address:127.0.0.1
Destination port number:5900

(四)在「Profile」-「Settings」中,勾选上「Save Location Data」。

这个功能看起来无厘头,但其实是App为了保持住在后台持续运行的一个讨巧之法。如果不开启,一切换到别的App去,刚建立的SSH隧道连接很快就会中断。

一切就绪后,回到「Valuts」-「Port Forwarding」,点击「back-to-home-mac」,SSH隧道就启动了。此时即使退出Termius,在灵动岛或导航栏上会看到它仍在后台运行的状态提示。

步骤二、使用VNC客户端连接回旧电脑。

一般的VNC客户端基本上都可行,比如「RealVNC Viewer」。下面就以它为例,安装完后在Address Book新创建一个配置:

Address:127.0.0.1:5900
Name:home-mac

保存后,点「Connect」按钮即可。顺利的话,此时就会连接上旧电脑了。

至此,所有的配置就已完成。有时在回家的半路上,女儿来微信说要看动画片,我就会掏出手机,打开「Termius」App,点击「Port Forwarding」-「home-mac」启动SSH隧道,然后切到「RealVNC Viewer」App,点击「home-mac」远程连到家中旧电脑,开始给她放动画片。

对了,每次放动画片前,我还会问她喝完今天的牛奶没有,没有喝完牛奶,是不给放动画片的哟。

如何远程给女儿放动画片

家里有一台闲置的旧MacBook苹果电脑,平时会连在电视上给女儿放动画片。在家时我会用手头的新苹果电脑通过「屏幕共享」(Screen Sharing.app),连接上局域网里的旧电脑来操作播放。但如果我不在家,就没办法连回这台旧电脑了。于是我开始研究如何解决这个问题。

最简单的办法莫过于使用第三方的远程控制/远程登录/远程管理类的软件,如TeamViewer。但这类软件一般并不免费且不便宜,或者免费但限制可用机器数量,实在不想折腾时,可作为备选方案。

那么还是从苹果自带的软件入手。既然在局域网中可以使用「屏幕共享」来远程连接,那么只要在路由器上配置一下端口映射,理应就可以从外网来连上旧电脑。查询了一下「屏幕共享」的默认端口为5900,在路由器上配置完端口映射,查询了路由器的公网IP地址,然后在新电脑上打开「屏幕共享」App,输入公网IP,果然成功连上。

但这样把旧电脑的连接端口暴露在公网上,还可以直接通过输入用户名和密码登录,安全性实在堪忧,所以更好的办法显然是建立SSH隧道来实现连接。同时,还可以通过路由器的端口映射隐藏真实的SSH连接端口,并强制要求用RSA密钥验证建立隧道连接,这样在新电脑上只要建立好SSH隧道连接,就可以像在本地网络中一样访问旧电脑的「屏幕共享」了。

其次是公网IP的问题,路由器的公网IP可能会被网络服务商动态更换,因此还需要利用动态域名服务来自动更新公网IP。由于家里的小米路由器支持动态域名功能,只要找一家动态域名商注册个域名即可。

接下来就是详细的流程:

步骤一、在新电脑上创建RSA密钥对。估计大部分程序员已经可以省掉这一步,当然也可以专门再生成一套密钥对。

步骤二、找一家动态域名服务商注册,并部署到路由器中。为了方便下面引用,假设注册的动态域名是example.ddns.com。

步骤三、在路由器上设置端口映射。以小米路由器为例,找到「端口转发」,填上旧电脑的局域网IP地址,外部端口填写一个随机端口号比如35791,内部端口号也填写一个随机端口号比如36922。注意下面步骤中不同地方对应的这两个端口号。

步骤四、配置部署SSH隧道。

在旧电脑上做如下操作:

1、修改sshd服务的配置文件/etc/ssh/sshd_config:

Port 36922  #对应上路由器中配置的内部端口号
PubkeyAuthentication yes  #启用公钥验证
PasswordAuthentication no  #取消密码验证
PermitTunnel yes  #允许建立隧道。

2、添加新电脑上的RSA公钥到~/.ssh/authorized_keys

3、在「系统设置」-「通用」-「共享」中启用「屏幕共享」和「远程登录」。

4、[可选] 打开Terminal或iTerm终端,执行一句命令:

sudo defaults write /Library/Preferences/com.apple.RemoteManagement RestoreMachineState -bool NO

用新电脑远程登录上旧电脑后如果断开连接,旧电脑就会自动锁屏,执行这句命令后,可以确保旧电脑仍会继续播放动画片而不锁屏。

在新电脑上做如下操作:

1、修改~/.ssh/config,添加

Host home-mac
Hostname example.ddns.com
Port 35791
User YOUR_USERNAME
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 120

注意:(1)35791对应于路由器端口映射处设置的外部端口;(2)要将上面的YOUR_USERNAME修改为旧电脑上的用户名;(3)这里私钥使用的默认路径和名称,如果步骤一中生成了专门的密钥对,这里记得改成相应的路径和名称。

2、创建一个back-home.sh文件,添加下面的脚本代码

!/usr/bin/env bash

ssh -Nv -L 5901:localhost:5900 home-mac

创建完用chmod a+x back-home.sh给文件加上可执行权限,然后执行它就可以建立起SSH隧道了。

步骤五、在新电脑上打开「屏幕共享」App,新建一个连接并输入localhost:5901,然后点连接按钮,如果一切顺利就可以看到旧电脑的屏幕了。

至此,完整的苹果电脑远程控制就已实现。每次当女儿给我发来微信要看动画片时,我就会用新电脑先在iTerm里执行back-home.sh建立SSH隧道,然后再打开「屏幕共享」远程登录回家中旧电脑,给她播放动画片。

不过如果电脑不在身边,或正好在路上,而手上只有一部iPhone该怎么办呢?下一篇继续讲用iPhone远程连回旧电脑的办法。

哪些基础设施支撑了“夜骑开封”

biking-to-kaifeng
夜骑开封

“夜骑开封”活动的突然爆火引人注目,年轻人挥洒青春的热情引来无数人的赞美和羡慕,整个活动意外地激起了广泛的社会效应。当然,同时也出现了一些负面影响,如瘫痪交通、垃圾遍地、车辆乱停等等,社会上批评此活动的人也不在少数,目前此活动已经被全面叫停。

毫无疑问地,没有完善的社会基础设施,是无法在这么短的时间内,自发产生这样一个大规模的活动的。因此除了常规被讨论的那些议题外,本文更想探讨的是哪些基础设施支撑了“夜骑开封”。

(一)郑开大道

完善的道路基建为夜骑活动提供了安全、便捷的交通环境。根据官方资料,郑开大道全长39.11公里,其中郑州境内30.13公里,开封境8.98公里,道路红线宽100米,有绿化带、人行道、分隔带、非机动车道、机动车道和双黄线,其中两侧人行道宽10米,非机动车道宽18米,机动车道宽40.5米,绿化带和分隔带宽共21米,比一些城市的主干道还宽。全线设大桥2座,中桥11座,分离式立交桥1座,道路设计标准为双向10车道,设计时速为80公里/小时,是全省目前设施最齐全的高等级城市道路。

郑开大道作为”郑汴一体化”建设的起步性工程,全程按城市道路标准建设。这条连接郑州和开封的道路为骑行爱好者提供了理想路线。其宽阔的车道、平整的路面和完善的照明系统大大提升了夜间骑行的安全性和舒适度。

(二)共享单车

正是有共享单车这种便捷的交通工具存在,夜骑活动才得以实现。共享单车的特点包括:价格低廉,使得参与活动的门槛大大降低;质量可靠,确保了骑行的安全性和舒适度;巨量投放,满足了大规模参与者的需求;快速租赁,简化了获取车辆的流程。这些特点使得共享单车成为支撑”夜骑开封”活动的重要基础设施之一。它不仅为没有自己单车的参与者提供了便利,还增加了活动的灵活性和可参与性。

(三)移动支付

作为金融基础设施,移动支付在”夜骑开封”活动中发挥了关键作用。所有参与活动的学生或市民都可以通过智能手机上的移动支付平台(如支付宝、微信支付等)快速、方便地完成共享单车的租赁。移动支付的优势尤为突出:用户只需扫描二维码,就能在几秒钟内完成支付并解锁车辆,大大提高了租赁效率。此外,移动支付还为用户提供了更灵活的押金方案,包括传统的押金支付和信用免押金服务。这种灵活性不仅降低了参与门槛,还提高了用户体验,使得更多人能够轻松加入到夜骑活动中来。移动支付的普及和应用,无疑为”夜骑开封”这样的大规模自发性活动提供了强有力的金融信用支持。

(四)社交平台

社交媒体在”夜骑开封”活动的传播中扮演了至关重要的角色。这些平台,如抖音、微博、微信等,为活动提供了一个强大的信息传播渠道。通过这些平台,参与者可以轻松地分享他们的骑行体验,包括精彩的视频片段、美丽的夜景照片,以及生动的文字描述。这些丰富多样的内容不仅吸引了更多人的注意,还激发了他们参与活动的兴趣。

社交平台的算法推荐机制进一步扩大了信息的传播范围,使得原本可能只在小圈子内流传的活动信息迅速传播到更广泛的受众群体。这种病毒式的传播效应让”夜骑开封”从一个地方性活动迅速演变成为一个引人注目的社会现象。值得注意的是,尽管活动本身是自发性的,没有正式的组织者,但正是这种去中心化的特性在社交媒体上引起了更多人的共鸣,使得活动呈现出一种自然、真实、充满活力的氛围。

此外,社交平台还为参与者提供了一个实时交流和互动的场所。人们可以在这里分享骑行路线、安全提示、以及相关的实用信息,这不仅增强了参与者之间的联系,还为新加入的骑行者提供了宝贵的指导。总的来说,社交平台作为一种现代化的信息基础设施,极大地促进了”夜骑开封”活动的传播和发展,让这一独特的文化现象得以在更大范围内引起共鸣和参与。

(五)高铁

高速铁路系统也发挥了重要作用。它为郑州以外的学生和市民前往郑州提供了便捷的交通选择,这大大扩展了活动的参与范围。通过高铁,人们可以以相对经济的价格,快速、舒适地抵达郑州,从而参与到这场独特的夜骑活动中。高铁的高频次、大容量特性可以使更多远道而来的骑行爱好者能够汇聚一堂,丰富活动的规模和氛围。同时,对于已经到达开封的学生而言,高铁也提供了一个安全、快速、价格合理的返程选择。这种双向的便利不仅增加了活动的吸引力,还为参与者提供了更大的时间灵活性,使得他们可以根据自己的日程安排来参与和结束骑行。高铁的存在,实际上打破了地域的限制,使得”夜骑开封”从一个地方性活动演变为一个更具区域影响力的文化现象。

(六)城市公共安全

城市的公共安全是夜间骑行活动得以顺利进行的基础保障。一个安全、有序的城市环境为参与者提供了安心骑行的条件。良好的治安状况、必要的交通管理、完善的应急响应系统以及完备的供电、路政等,共同构成了城市公共安全的重要组成部分。这些要素的协同作用不仅降低了夜间骑行的风险,还增强了参与者的安全感,从而吸引更多人加入到这一充满活力的夜间活动中来。此外,城市管理部门的有效监管和及时干预也是确保活动安全进行的关键因素,它们共同构筑了”夜骑开封”活动的安全屏障。

综上,正是这些线上线下基础设施的无缝融合和协同作用,为”夜骑开封”活动的突然爆发式流行奠定了坚实基础。完善的道路系统、便捷的共享单车、普及的移动支付、强大的社交媒体平台、高效的高铁网络以及完备的城市公共安全,共同构建了一个支持大规模自发性活动的现代化基础设施生态系统。这种基础设施的综合效应不仅降低了参与门槛,提高了活动的可访问性,还极大地促进了信息的快速传播和参与者之间的互动,最终导致了”夜骑开封”活动的迅速走红和广泛参与。

尽管活动目前已被叫停,但希望政府部门能够充分总结经验、重新规划,将这个深受群众喜爱的活动正式办起来,使之成为郑州市、开封市乃至整个河南省的亮点项目。届时,再广邀全国的骑行爱好者齐聚郑州,共同参与一场安全、有序、欢乐的骑行嘉年华。

清歌输入法十周年记

转眼间,清歌输入法已经十岁了!

还记得十年前的今天,2013年10月25日,清歌输入法v1.0正式发布。从输入法软件到项目官网,忙碌开发了一个多月,终于在那一天发布上线。一个普普通通的日子,从此对我却不再普通。

由于在苹果电脑上找不到称手的五笔输入法,于是我就自己开发了一个。现在回想起来,这个缘起真是让人感慨。若是当时犯犯懒,也就不会有后来清歌输入法的十年历程了。

这十年里,清歌输入法在众多五笔爱好者的支持下不断前进,相比起最初的版本,已经有了很多不一样的变化。大家的建议和意见总是让我万分欣喜,每一封来信我都会仔细拜读、尽力回复。十年历程,正是大家的齐力共推,才让清歌输入法走到今天。尤其是有了十年前「清歌输入法Mac版」这个起步,才有了后来「清歌输入法iOS版」和「清歌写字板」的接续面世。

最重要的是,无数清歌输入法的支持者不断地给这个项目捐赠,支持回馈我的开发工作,在此真的要非常诚挚地向大家说一声感谢,谢谢大家!

十年是一个里程碑,更是对未来期许的一个起点。清歌输入法的待办清单上,还有很多等待完善和更新的地方,我还会持续做下去。只要Mac还在,清歌输入法就还不会停止。

期待下一个十年节点到来时,清歌输入法依然是所有五笔爱好者在Mac上最好的打字伙伴。

终于正面对决新冠病毒

2022年12月,新冠病毒爆发的3年后,我终于在北京亲身感受到了它。接下来,计划分几篇文章来记录一下这一波病毒冲击下的真实故事和经验教训。那么先从我们全家人的感染过程说起吧。

第一天——嗓子异常,抗原异常

周四(12-8)的下午,突然觉得嗓子有些不舒服,问家人也都有类似的感觉,甚至还比我严重。

晚饭完等宝宝睡着后,先给我妈做了抗原测试。起初看了单一条的C红线还挺高兴——阴性。没想到过了10多分钟,T红线竟然隐约闪现。虽然很淡,但已经明显可以观察到。至此家里第一个阳性出现,而因为前期的疫情严重,我妈其实已经居家20几天没出门,竟然也还是阳了。

第一支抗原测试阳性

好在我和老婆测试都是阴性,当晚虽然心中忐忑,还是有些暗暗心惊,没想到病毒说来就真的来了。

第二天——发烧,疼痛

周五(12-9),我仍然只是嗓子不舒服,也不觉得疼痛,就是有种说话说久了后的那种沙哑感。但老婆这一天已经不对了,直接开始发烧,头痛,勉强能活动。不过她早上测抗原依旧是阴性。而单独隔离在房间的我妈已经开始了她昏睡、低烧、干咳、头痛、眼痛、鼻痛的一天,还好有储备的泰诺,还能撑过去。而我家宝宝就厉害了,一整天竟然一点反应也没有,依旧的活蹦乱跳。

第三天——高烧,身体酸软

周六(12-10)成了这次感染进程中最艰难的一天。早上起来我就觉得不对劲了,身体感到一阵酸软,头也晕乎乎的。因为宝宝的妈妈和奶奶都已经隔离在房间,症状最轻的我只好戴上口罩在客厅带宝宝。但到了中午已经明显感觉到体温上来了,一测果然已到37.5,马上测抗原,果然T线是秒红,红得发艳。后面整个下午人一直处于这样的低烧状态。傍晚时分,最高烧到了38.4。感觉已经不能再忍的我,吃了一颗对乙酰氨基酚退烧。效果确实明显,40分钟左右,大汗出尽,体温回落,精神状态也恢复回来。

测试液流过T线秒红,红得发艳

老婆这一天基本上已经进入了最严重的状态。一整天的高烧,一度烧至39.2,基本只能全天卧床休息。吃布洛芬退烧,也基本只能降到38.5左右。而我妈则似乎开始有所好转,体温回落,精神状态好了许多,症状开始转为喉咙痛与积痰。而小宝宝还是生龙活虎,既为她高兴,也开始隐隐有些担忧。

第四天——咳嗽,高烧

周日(12-11)三个大人的情况都开始向好。老婆不再持续高烧,基本维持在37-38之间的低烧,总算也可以下床活动了,但咳嗽的症状开始出现。我妈的症状也基本全部转向了咳嗽。而我这一天,也基本不再发烧,也转向咳嗽。这种咳嗽和平常咽喉发炎时不一样,像是喉咙被针突然扎了一下,就开始控制不住地持续咳嗽。感觉是免疫系统在咽喉部位和病毒干仗,然后释放了什么物质刺激到附近的神经,然后身体反射式地引发咳嗽,从而排出混杂着死病毒的痰液。

这一天也开始让人揪心起来,因为宝宝终于还是有症状了。早起她就有点鼻塞,并开始咳嗽,说起来她出生这2年多,我还从来没见她怎么咳嗽过,显然不对劲。到了下午,已经进展到发烧,并且一度烧到了39.1。立即准备给她喂服儿童版泰诺混悬液。虽然她不肯喝,几个大人还是合力强行给灌了进去。用药后体温降至了38左右,午睡醒后还降到过37以下。不过到了傍晚时分,大概是药效已过,体温再次上升,又来到了38.5,不得不再次强行喂服儿童泰诺,到睡前体温也再次得到控制。这晚宝宝睡前没有像往常一样在小床上乱滚一阵,几乎是倒头即睡,显然是身体太过不适。这一夜不断醒来给她测体温,基本一直维持在38左右,没有再高,也没有降到正常。

第五天——持续咳嗽

周一(12-12)三个大人基本上已能恢复平常生活状态,除了那持续不断地剧烈咳嗽。不知道这一天我们身体干死了多少病毒,也不知道咳出了多少病毒,总之就是三个人轮流持续地咳嗽、咳痰、喝水、恢复正常,再咳嗽、再咳痰、再喝水、再恢复正常。

焦点还是在宝宝身上。从6点她就不肯再睡了,一测体温又到了39.2,把泰诺悄悄弄到吸管杯里骗她喝了一口,她发觉不对后怎么也不肯再喝。这一口也还起了点效,7点时体温也回到了38.4,但倔强的她也不睡了,非要一直坐着。持续到7点40分,体温再次回升至39.2,决定还是要采取强制措施,几个大人再次强行将药灌进了她的嘴里。喝完药,她再也支持不住地睡着了。后面一整天始终处于低烧状态,在37.8-38.3之间徘徊,也没有再给她喂药。

第六天——依旧咳嗽

周二(12-13)咳嗽继续成为日常,每当你感觉这个症状已经基本好转的时候,总能再给你安排一次剧烈的突袭。我妈作为咱家的首阳,又测了一次抗原,结果还是深红,我们也不再浪费抗原了,静待症状彻底消失再说。

宝宝这一天也终于不再发烧了,除了偶尔轻微的咳嗽,这个可爱的小宝贝又回到了活蹦乱跳的状态,真为她高兴!

第七天——仍然咳嗽

周三(12-14)所有四个人都还会咳嗽,但宝宝是最轻的。胜利就在眼前。

第八天——转阴

周四(12-15)早上再次测试抗原,我仍旧还是阳性,但我妈已经转阴了!历经整整一周的病程后,终于重现一条杠。我和老婆还在继续咳嗽中,仍然阳性也不意外了,好在咳嗽的频次已经明显降低。从发烧测出阳性到转阴,看来满七天还是一道槛,还是得过。

终于出现第一支转阴的抗原测试

估计明天我和老婆都会转阴了,宝宝虽然没有给她测,但她早已恢复那个生龙活虎的状态。就目前情况来看,儿童对病毒的反应相对还是小的。

至此,这一波新冠病毒奥密克戎变种的感染,在我家算是要走入尾声了。北京这一波疫情高峰真的是来得又急又快,只是没想到我们家真的这么快就全被感染上了。不过好的一面是,因为自然感染而获得的免疫力,可以保护我们几个月内免受疫情之苦了。某种程度上,也是「早感染,早解脱」吧。

接下来,还准备再复盘一下这次感染前的各种准备工作,因为几个关键时点没有耽误,避免了各种麻烦。

且待我随后更新。

更新@20221216:第九天,周五(12-16)。如预期的那样,下午做抗原测试,我和老婆顺利转阴性了。