diff --git a/content/posts/manage-photos-with-icloud-shared-library.md b/content/posts/manage-photos-with-icloud-shared-library.md new file mode 100644 index 0000000..bb03a2a --- /dev/null +++ b/content/posts/manage-photos-with-icloud-shared-library.md @@ -0,0 +1,86 @@ +--- +title: "以 iCloud 共享图库为基础,打造我的照片管理工作流" +date: 2022-11-23 +--- + +# 以 iCloud 共享图库为基础,打造我的照片管理工作流 + +这篇文章主要来聊聊 iOS 16.1 后我的照片管理工作流的一些变化,我觉得 iCloud 图库的易用性得到了空前的提升,因此特此来分享一下它解决我的哪些痛点,同时也为不少还在观望的同学扫除一下迷雾。 + +先说一下背景,我日常的主要拍照场景还是和女朋友一起出去游玩的时候用相机拍照。对于照片管理最大的需求就是易于导入 iCloud,且易于分享给对象。但不要小看这个简单的场景,在 iOS 16.1 之前的工作流还是有很多的妥协。 + +### 导入照片到苹果设备 + +众所周知,iOS / iPadOS 的设备都没有真正的跨 app 通用文件系统,因此很多人会先入为主地认为如果要导入照片到苹果设备的图库中,如果没有 mac 电脑操作起来会很困难。但其实不然。在 iOS 12 的版本之后苹果公司给照片 app 增加了「导入」的功能,这个功能可以让其直接读取外接设备,然后扫描其中的照片,等待用户的筛选和导入。 + +我使用的苹果设备主要是 iPad Pro 2018 ,因此很幸运地获得了一个极为先进的 type-C 接口,这给我的操作带来了不少地便利。由于相机主要是将照片存储在 SD 卡中,因此我们需要一个 SD 卡的读卡器。我日常使用的是绿联的 type-A 和 type-C 双接口的读卡器。假如你的 iPad 没有 type-C 接口,使用 lightening 转 USB 的转换器也是可以的。 + +![](https://image.wsine.top/73381f126a067d0f82dadf615f608c38.png) + +「导入」功能以设备为划分依据且提供了简单的按照片的日期分组排序的功能,而这恰巧也是我们出去游玩的时候分组的重要依据。「导入」提供了「导入全部」的功能,它会自动记住哪些照片之前已经被导入到照片 app 了,哪怕你又把那些照片删除了。 + +由于我使用的是富士相机,偶尔会有一些测试滤镜用的废片,因此我一般不用这个导入全部的功能。我会按日期手动选择那一天的照片,然后新建一个「相簿」,直接将选择的照片导入到新建的相簿。这样,从相机到 iCloud 图库到过程就完成了。 + +![](https://image.wsine.top/724e8eaa757738c68ab0a107ddd16603.png) + +### 完善照片的 Exif 信息 + +对于单张的照片管理,我们最关心的是照片的 Exif 信息,Exif 信息越是完整,我们搜索/筛选/分组照片就更是得心应手。对于相机拍摄的照片,一般情况下只有相机相关的信息,例如相机型号、镜头型号、光圈快门 ISO 这类信息。对于比较新的相机机型,也会有相对一定的时间信息,但由于更换电池等操作且没有联网同步时间的功能,实际记录下来的时间并不一定是准确的。 + +但是好在照片 app 都提供了批量更新的操作来修改照片的 Exif 信息。 + +![](https://image.wsine.top/36c302b30f07f0060cfeb6933f213e59.png) + +关于拍摄地点的更新,我一般采用一个「相簿」一个地点的方式来管理,这也很贴合日常的出门游玩拍照的场景。在照片 app 中,只需要在相簿中全部选择照片,选择三个点调出菜单,然后选择「调整地点」就可以搜索地点并批量更新到该相簿的所有照片中了,十分方便。 + +![](https://image.wsine.top/7d6453afd20cd943c78d5e1e4f623d60.png) + +而更新拍摄时间的话就稍微需要一丢丢的小技巧。我们知道相机记录的拍摄时间不一定是准确的,但是相机记录的照片之间的相对时间是准确的。那么该技巧就很显而易见了,只需要在到达游玩地点后习惯性地拍摄一张手机屏幕包含具体详细时间的照片即可。 + +![](https://image.wsine.top/f470c1c30b1dfacf2af6839e8465f827.png) + +当回到住所准备更新拍摄时间的时候,将该时间照片也收纳到该地点的相簿中,然后就可以调整拍摄时间为照片中的具体详细时间了。照片 app 中的调整逻辑为只显示第一张照片的时间,调整第一张照片的拍摄时间会相对地一起调整批量选择的照片的拍摄时间。这样操作后,所有的拍摄时间都变得准确无误了。 + +### 加入相簿到共享图库 + +在加入共享图库之前,首先需要创建一个共享图库。该选项在设置 app 的照片选项中,打开 iCloud 照片选项,然后就能发现下面出现了共享图库的选项了,由一个人创建然后通过 iMessage 邀请另一个人加入即可。一个人只能同时加入一个共享图库。 + +![](https://image.wsine.top/ec6bdc6101b73f1f54861e621dd06f0d.png) + +在前面的步骤中,照片们都已经整整齐齐地在不同的本地相簿中分类好了。在这一步中其实就很简单,全选相簿的照片然后选择「移动到共享图库」。这样子,只需要等在 WiFi 环境下设备自动同步照片到 iCloud 中就好了,然后在对象的手机中也能看到同一份照片。 + +![](https://image.wsine.top/6d024f4445a1de80870c090f5f5c6b60.png) + +但是使用「共享图库」相比之前使用「共享相簿」有什么优缺点呢? + +第一点我觉得最重要的就是「同一份照片」。之前使用共享相簿的时候,还需要多一步操作就是创建一个共享相簿并拷贝照片到共享相簿中然后再分享该相簿到对象的 iCloud 账号,光是听起来就是很冗余的操作。现在使用了共享图库,我可以一键移动,甚至在导入的时候就可以选择共享图库为导入的目的地。而共享相簿就可以回到了它原本设计的初衷,在三五好友一起约着出去玩的时候,创建一个共享相簿大家都把需要共享的照片上传到该相簿,大家各自挑选自己想要的拷贝到自己的 iCloud 图库中。 + +而由于使用共享图库实打实地消耗了 iCloud 的空间,苹果公司就没有理由压缩照片的画质了。这给后期修图提供了更丰富的空间,毕竟对着一张压缩的照片,无论是修图还是分享总是会觉得差了一点意思。而现在使用共享图库就没有这样的问题。 + +至于缺点我认为无法共享每个相簿的分类信息是我觉得不太满意的一点。在共享图库中,图库是共享的,但图库中的相簿分类不是,一个人明明已经都分类好了,在另一个人的设备中却还要在分类一遍,不太合理。幸好的是 Exif 信息是共享的,因此筛选照片二次创建相簿也不是那么困难。 + +### 不同出发点的修图逻辑 + +由于共享图库中的照片都是同一张照片,因此如果 A 对照片进行了修图,则 B 也可以共享得到修好的图片,且可以二次加工。在这之前只通过共享相簿的话是不可实现的。 + +在我和女朋友的修图角度来说,大家的侧重点非常不一样的。对于我来说,我更关注后期构图和调色,因此我会优先使用照片 app 中自带的功能进行简单的修图。对于照片的裁剪,照片 app 提供了常见的图片比例,可以很方便地套用,并同时调整照片的角度偏移。 + +![](https://image.wsine.top/2bbf39fd26dad48a90bfe67cf495a8d9.png) + +调色的话,照片 app 也有基础的功能,对于常见的曝光对比度等参数化的,可以直接在照片 app 中修改。更重要的是它还有一个 AI 加持的「自动」的参数选项,对于不太会调色但想让照片更加风格化的用户来说也是很棒的功能。 + +如果需要进一步修图,一般情况下我们需要使用更强大的 app。在之前使用共享相簿的时候,第三方 app 无法读取共享相簿中的照片,因此就无法修改了,这迫使我们得先下载一份到本地图库,修改好再替换,抑或是修图完再上传共享相簿,十分麻烦。 + +![](https://image.wsine.top/b00f1e45050915d1571c913dc58c4b91.png) + +使用共享图库后,所有的第三方 app 都能如常访问照片,只要授权了照片权限,就和访问本地图库一样。因此,在我的日常进阶修图,我可以打开「Pixelmator Photo」应用然后直接打开一张照片进行编辑,编辑完成后可以直接覆盖原来的图片,十分方便。一般情况下,我会用 Pixelmator Photo 来进行去除游客和调整色阶曲线之类的,这个应用能够用 AI 帮助你调整到一个较好的初始值,自己再进行微调,非常推荐~ + +![](https://image.wsine.top/9270a6da5c8f5ba3d96fb3f4491297ce.png) + +从我女朋友出发的修图逻辑和我基本上完全不一样的,就是美图秀秀你懂吧。日常的拍照会有很多怼脸照、全身照、半身照呀这种个人照或者合照,基本上我都没有「权利」去修(因为无论怎么努力都不好看=。=)。现在有了共享图库,我们都可以从这种小争吵中解放出来,各司其职,其乐融融。 + +最后,千辛万苦修图完毕,肯定是要和家人朋友分享分享的,和之前所说使用共享图库可以以完整的画质分享照片,而共享相簿的话获取到的照片画质是会压缩的。虽然分享到微信的时候会被压缩得很厉害,但是分享到其它在线社交平台就可以很明显地感受到差异。 + +### 总结 + +共享图库的便利性极大地改变了我之前的照片管理工作流,从上面的展示中可以看到共享图库带来的利远大于弊,因此,我还是十分推荐在用共享相簿的朋友们去尝试一下转移到共享图库的,希望上述的展示能给你扫除一下迷雾,以上。 diff --git a/content/posts/my-travel-experience-in-japan.md b/content/posts/my-travel-experience-in-japan.md new file mode 100644 index 0000000..bc8b0dd --- /dev/null +++ b/content/posts/my-travel-experience-in-japan.md @@ -0,0 +1,245 @@ +--- +title: "我的日本旅游经验分享" +date: 2022-12-30 +--- + +# 我的日本旅游经验分享 + +随着大环境的复苏,压抑了好久的躁动的心已经忍耐不住了。是的,我就是想出国旅游了...... + +本篇文章写于 2022 年 12 月的日本旅游后的经验总结分享,主要关于一些实际旅行体验中前期攻略没有覆盖到的点,希望能给后来的人提供更多的信息。 + +## 通用经验分享 + +### 办理签证 + +首先要想出国旅游,必先解决签证的问题。而旅行签证从便利角度主要可以分为四类:免签、落地签、异地签和本地签。 + +- 免签:这个非常好理解,只要持有中国护照,即可免办理签证入境特定的国家。 +- 落地签:根据两个国家签订的双边协议,允许双方公民在入境的时候再办理旅游地国家的签证。 +- 本地签:这里指的是大部分情况下的签证,需要提前办理,获得许可后再前往旅游地入境。 + +关于旅游地是否对中国公民提供免签和落地签的便利,可以在网上很容易就能搜索得到。 + +而旅行签证还有一项主要是给在境外留学和工作的人员提供的便利,使得当地的居民可以不用特意回到祖国居住地就能在当地办理旅游地的签证——这里用「异地签」来指代。以我的情况举例,VFS GLOBAL 是日本驻香港总領事馆的官方合作机构,允许中国国籍(持有中国护照)的香港居民(非香港永久居民)在香港办理日本签证,而不用专门先回一趟内地办理签证再出发日本旅游。这对于目前还没通关的情况下,显得更加的便利。 + +同样的,对于在欧美日新等地工作或留学的朋友们,可以自行了解一下是否有相关的机构提供同等的服务。世界这么大,好好去看看。 + +### 制定旅行计划 + +有了准许入境的签证,下一步就是需要制定一个适合自己的旅行计划了。 + +目前网络上不少的文章和视频在大力推荐使用 Notion、Google Map、Apple Map 等地图软件和笔记软件来制定旅行计划,最终的效果看起来很精美也很赏心悦目,但是实际操作起来我发现有以下的痛点: + +1. 信息比较散落,对手机小屏幕相对不够友好。 +2. Notion 中记录的景点,无法分辨它们在城市的哪个角落。 +3. 软件联动上需要花费更大的精力。 + +因此,我最终没有选择这些流行的软件做旅行计划,反而转向一个非常小众的服务「[穷游行程助手](https://plan.qyer.com/)」。 + +![](https://image.wsine.top/90c2309fb2bc546d01a655e59b49256b.png) + +「穷游行程助手」同时提供了 Web 和手机两个客户端,因此在 Web 端编辑和在手机端浏览都能获得舒服的体验。Web 端的操作逻辑很线性,能够在一个软件中完成整个旅游的宏观计划。 + +规划日期。首先穷游行程助手在最左侧提供了按日期作为分类的功能,十分契合我们做规划时的思维。同时,也可以将景点一键转移到另一天中,平衡一下使得每天的行程不至于太密集。 + +挑选景点。我个人不太喜欢看很多的旅游攻略,因为这样可能会被「剧透」从而失去遇见美好的机会,而穷游行程助手帮我规避了这个问题。我会在右侧「游玩」的选项卡中挑选合适的景点,查看「必去」「评分」「游玩时间」「简介」「门票价格」「开放时间」等信息,已然满足了筛选所需要的资料。只需要一键就能添加进当日的行程。 + +优化景点。另一个杀手功能是能够一键切换地图模式,直观地看到各个景点在城市中的分布。如果是太远的景点,可以酌情删掉。然后可以通过拖动景点的先后顺序,调整出一个线性的,通勤时间更短的方案,避免 S 型、Z 型等路线图。最后尽量让预估的当日行程时间保留在「适中」的程度。 + +整理完成后,手机端能够非常快捷地查看下一个游玩的景点以及它的关键信息。 + +![](https://image.wsine.top/7c3f8c1be0dbf808ec585f6546ec1aba.png) + +### 旅行记账 + +记账本来是一件困难的事情,因为要每天都重复没有终点,且记账后也没有一个具体的目标到底能得到什么,容易导致动力不足。但旅行记账是一个例外,因为旅行花费是一个专项支出,且一般大家都希望看到这次旅行的总开销,因此也就有了动力去做记账这一件事情。 + +对于出国旅行记账的软件来说,比较重要的功能有以下三点: + +1. 支持多币种记账 +2. 支持多人协同记账 +3. 支持他人代记账 + +我前前后后试用了几款,最终选择下来还是「[Spend Together](https://apps.apple.com/us/app/spend-together/id1446549608)」最趁手。 + +![](https://image.wsine.top/c472fbdf4885cc5ef4678f2fe97e9392.jpg) + +「Spend Together」的界面十分整洁干净,且无需注册账户即可通过链接邀请小伙伴加入账本,这一点就能打败很多的竞争对手。除了上述的三个必要的功能外,Spend Together 还可以自定义分类项目,自定义单笔消费的多人分别支出和债务。 + +若论不足,大概就是全功能需要内购解锁了。内购功能主要是两个以上的账本,自定义汇率,花费报表统计,很多优秀的旅行记账 app 都将这几个功能作为了付费功能。但良心的是,Spend Together 提供了 7 天的内购功能试用,你可以在前期使用免费功能正常记账,然后在旅行结束后开启试用查看不同的支出类别分布。 + +## 日本经验分享 + +### 上网卡 + +出去境外旅游,我们一定至少需要一张能顺畅高速上网的手机卡,这样才比较有安全感。在 2022 年的今天,连接互联网我们有了更多的选择。 + +购买旅游 SIM 卡。传统的方法当然是预先购买一张上网用的手机卡,淘宝或一些旅游网站上都会有销售,通过快递寄到你的手上。如果你实在是忘记了提前购买也不用担心,在境外的航班上一般也会售卖,你只需要拿起座位上的菜单浏览一下,觉得价格合适,就可以当场示意工作人员表达购买意愿。 + +![](https://image.wsine.top/dd756429dba68f413ee6b2177ee83b63.png) + +开通境外流量包。在运营商 app 甚至是支付宝里,我们可以选择购买境外流量包,然后当你的手机连上旅游地的基站的时候,该流量包套餐就会自动激活使用,全程无感。该方案的优点是不必更换一张手机卡,只需要要 app 上点击即可;而缺点是套餐相对来说没有性价比,有时甚至只提供 3G 网络要注意甄别。 + +![](https://image.wsine.top/27f54d46b8340dd98eec5aff28718e08.png) + +购买 eSIM 计划。不少的新手机支持了虚拟 SIM 卡功能,也就是我们这里说的 eSIM,它不是一张实体的 SIM 卡,而是一个二维码,通过邮件的方式发送到你手上,只需要到达目的地后通过手机设置菜单中扫描二维码添加 eSIM 计划即可。该方案能做到和实体上网卡相当的性价比,但省却了换卡这一步骤。我也确实在飞机上听到了有人忘记带卡针四处求借,而 eSIM 只需要在使用过后从系统设置中删除这一计划就行。 + +![](https://image.wsine.top/e92acc9188591c1a4425f00f2d59aed2.png) + +白嫖 SIM 卡。嗯,去日本旅游真的存在白嫖的可能。在各大机场中均有一个自动贩卖机,由「WAmazing」提供服务,只需要预先注册他们家的 app 即可现场凭二维码领取一张本地的实体 SIM 卡,内含 500M 流量可用 15 天。可以通过 app 单次购买流量包同时延长使用期限,缺点是流量包的性价比不高。 + +我们知道,哪怕在国内,不同的运营商在不同的地区实际的表现均不同。在我和同行的小伙伴中,实体 SIM 卡、eSIM、本地 SIM 卡均有人使用。本地 SIM 显示的是 +81 的手机号,旅游 SIM 卡和 eSIM 均不是。从实际体验来说,本地 SIM 卡 >> 旅游 SIM 卡 > eSIM 计划,后两者在关西地区上网时首次连接速度均较慢,而在关东地区则没有这个问题。当然这可能和背后套餐限速有关,但是这些上网卡基本不标注详细的技术信息。 + +因此,我的个人建议是务必花点时间领取一张免费的 WAmazing 手机卡,它能在关键时候提供高速的网络,否则在紧凑的旅游时间中忍受慢速的网络会令你感到很烦躁。 + +上述讲到的手机卡均为上网卡,对于能拨打本地电话的旅游套餐手机卡我真的没有找到。但我有一个小技巧,那就是请求酒店前台协助,可以用英文沟通。一般情况下,我们需要拨打电话的情况有两种:预定热门的餐厅和呼叫计程车。预定餐厅的时候,可以留下自己平时的手机号,备注用 LINE 联系(日本当地主流的即时通讯软件),不过自己需要先注册好 LINE 的账号。 + +### 交通卡 + +如果你是使用 iPhone 的用户,我十分推荐在 iPhone 自带的 Apple Wallet 中添加一张日本的交通卡。目前可以开通的交通卡有两种,Suica (俗称西瓜卡)和 PASMO,选择任意一种都行,因为日本已经做到了交通卡互联互通。 + +使用虚拟的交通卡比实体交通卡有很多更为便利的地方: + +- 无需押金。购买实体交通卡需要支付 500 日元的押金,而开通虚拟交通卡不用。但如果你非常想要一张可可爱爱的实体西瓜卡,你可以先购买一张实体的,然后转移到 Apple Wallet 中,这样押金会转换成余额进入虚拟卡中,而原本的实体卡就会成为一张废卡以供收藏啦。 +- 自助随处增值。实体交通卡需要找便利店或增值机才能完成增值,但虚拟交通卡只要有网就能增值。 +- 使用信用卡增值。实体交通卡一般需要现金增值,但虚拟交通卡可以在手机内使用信用卡扣费增值。在不确定现金是否充足的情况下,在这些不确定的小额消费下使用信用卡作后备就安心了许多。 +- 任意金额增值。在旅游的尾声,如果实体交通卡中留下较多的余额,我们一般会害怕浪费。但虚拟交通卡允许任意金额增值,因此比实体卡更为可控。 + +![](https://image.wsine.top/982d0c2d49041de39ece1db328246f73.png) + +但是,开通虚拟交通卡也需要一定的条件。总结起来有以下两点: + +- 需要修改系统地区到日本或者网络 ip 定位为日本。 +- 你需要一张能绑定 Apple Pay 的外币信用卡。 + +如果你无法直接在 Apple Wallet 中开通,这里也有一个曲线一点的方法。可以下载 Suica App,并根据[教程](https://www.uscreditcards101.com/use-iphone-as-suica/)在其中开通一张新卡,用信用卡增值,并添加到 Apple Wallet 中,也是可以的。 + +这里有一个小插曲,我有一位小伙伴使用境外 Visa 卡无法成功开通,相同的信息也能在[这里](https://www.beurlife.com/2019/02/get-topup-japan-suica-on-iphone.html)找到,具体原因暂不明确。 + +![](https://image.wsine.top/1f584e90b8ef207bc29ddfef792b74c4.png) + +最后提一下我对增值机的见闻。在绝大部分的地铁车站内,我们都能找到增值机给实体交通卡增值。它们会以「售票機」或「精算機」这样的字眼出现,两者均支持交通卡增值。但是,我游玩的整个旅程中遇到的这些增值机,均是像上图左侧的机器那样将实体卡片吞进去再操作的。而能够对非接触式 IC 卡增值的机器(如上图右侧),我一周内都没有遇到过一次。因此,如果你无法开通虚拟交通卡并使用信用卡增值,我的建议是不如使用实体交通卡。 + +### JR Pass + +日本当地有推出 Japan Railway Pass(简称 JR Pass)的一种套票,仅允许外国游客购买,可以在限定的日期内无限次乘坐 JR 公司旗下的大部分铁路、巴士和渡轮。如果要游玩多个城市的话,性价比是很高的。但是,这里的「大部分」对陌生的游客而言往往是最难记忆的点。 + +![](https://image.wsine.top/c2ddd319dad7387218f472bef59d1a36.png) + +虽然日本号称共有 216 家铁道公司,但其实可以简化成四种:JR 铁道、新干线、「希望(Nozomi)號」&「瑞穗(Mizuho)號」 和其它。 + +首先是 JR 铁道,它也运营着城内的地铁线路。新干线是日本中城际长距离通行的一种铁路方案,有点类似于我们的高铁。「希望(Nozomi)號」&「瑞穗(Mizuho)號」是新干线中两班比较特殊的车次。除了其中的「希望(Nozomi)號」&「瑞穗(Mizuho)號」,JR 铁道和新干线均包含在 JR Pass 的适用范围中,而剩下的铁路是不包含在 JR Pass 内的。 + +从我个人的经验来看,这两班特殊的车次更像是点到点之间的超高速列车,但是也有其它的车次运行相同的线路但停靠更多的站,需要多花点时间在通勤上而已,因此不必担心 JR Pass 不值得。 + +至于巴士和渡轮,我个人觉得不必过多考虑,因为大部分出行的场景都是靠铁道。如果你要去的景点一定需要巴士或渡轮,只需要仔细留意标识或询问一下是否可用 JR Pass 即可,如果不适用则正常购票即可。 + +着重提一下新干线购票。新干线的座位分为「指定席」和「自由席」,前者就像高铁,预先购票,提前锁定该班次的自己的座位;而后者就像地铁,即到即买,有座位就能上。很明显,「指定席」要更有安全感且不会打乱旅游的行程。但是,购票有两个途径,一个是线下的 JR 站内的自助售票机,另一个则是「SmartEx」新干线 app,可提前 2 天购票。 + +线下购买的话如果你住宿的酒店不在 JR 站附近,则需要提前规划记得顺路买票,否则特意绕路还挺麻烦的。通过 app 购票的话显然会更加便利。但这里就有一个小坑,由于 JR Pass 的适用范围也包括了新干线,如果想要通过「SmartEx」app 线上免费购票,然后乘坐当天再线下取票,则需要有效的 JR Pass 绑定到自己的账户中。绑定的步骤需要购买 JR Pass 的全部信息,如果你是像我一样通过旅游网站委托购买的,则无法拥有全部的信息,因此只能通过线下的 JR 站内的自助售票机用 JR Pass 免费购票了。 + +通过旅游网站委托购买 JR Pass,能获得较官方渠道更低的价格;而如果直接在 JR 车站内购买,则自己掌控购买 JR Pass 的全部信息。因此,在省钱和便利面前似乎有一个 trade off,这个就需要看各人的选择了。 + +### 周游卡 + +![](https://image.wsine.top/d21a0d4d2c4f387279ec801a717b7987.png) + +日本的部分城市还会售卖地方的套票,比较出名的就是「大阪周游卡」,而我还购买了「川越周游卡」和「东京地铁通票」。从我的个人角度来说,我觉得这些套票不是那么值得,下面会讲讲原因。 + +「大阪周游卡」提供 1 天中免费参观 40 处以上的观光景点 + 无限次本地地铁和巴士乘坐权益。然而我发现大部分景点都是近似免费的,比如大阪城公园只有中央城堡需要收费,而最美的景是从公园里从下面观赏城堡的整体;梅田展望中心只有最上面两层是收费的,市民也可免费乘坐超高的垂直电梯到高层纵观整个城市。 + +「川越周游卡」和「东京地铁通票」近似,套票的售价和实际通勤交通售价接近,同一片区中的景点都是通过步行的方式游览的,只有不同片区之间需要乘坐交通工具,因此实际上也没有节省很多的交通支出。 + +因此,我个人推荐是如果是一个怕麻烦的人购买通票能省心一些,但对于有经验的旅游爱好者完全可以不买。 + +### 铁道系统 + +接下来就该讲讲日本的铁道系统了,我感觉应该大部分的旅客都会在这个「可能是世界上最复杂的铁道系统」中栽过跟斗。而我也总结一下日本铁道系统中一些和我们的常识不同的模式,仅供参考。 + +![](https://image.wsine.top/0822df9e9750ff5a15852e506eca192f.png) + +模式 1:环状线并不只是环状运行 + +这里以最出名的「大阪环状线」作为例子。假设你从「大阪」这个站进入了「大阪环状线」的闸机口,映入你眼帘的首先是「内环」和「外环」这两个选择,你会开始迷惑,看地图明明只有一条环线呀。然而,外环指列车顺时针开,内环指列车逆时针开 ( ̄ェ ̄;) + +![](https://image.wsine.top/c67f9c3b15592a1edfb3974a4c059a5d.png) + +然后,进入你眼帘的是各个子方向的列车信息,而真正环状的列车反而最少,可我不是进入的是环线的闸机吗 w(゚Д゚)w 。下一班关西空港·和歌山我到底能不能上(⊙_☉) ?实际上,如果你是去天王寺站,其实完全是可以乘坐的,不必站在寒风中多等待 10 分钟等真正的环线。 + +可是如果你随意上车,很有可能你会在「西九条」站之后被载往了大阪环球影城的方向,一趟来回要浪费好多的时间,因为这些列车都共享很多的相同站点。 + +但在现实情况下,你很有可能已经没有时间去准确判断是否该上还是不该上了,因为下一班列车就要来了。我的个人经验是,听谷歌地图/换乘案内(本地人用的 app)的就好,但一定务必要记得经常刷新以获取实时信息。 + +![](https://image.wsine.top/5a510185e5e3f76b2fc44eeb8fa102fc.png) + +模式 2:同一条线路有快慢列车和分支子站 + +这里以「東武東上線」作为例子。该线路不同的列车因为停靠不同的站,因此会有不同快慢的列车。如果不是提前做好功课,你是不知道到底哪一班车会停靠你想要到达的目的站的。 + +而我的经验是,如果目的站比较远,先上车再说,在车上有大量时间慢慢找到这样的图,如果坐错了慢车,找个公共站下来原地换乘快车就好。如果目的站比较近,则乖乖查好合适的班次再上车。当然,你也可以常刷新手机听谷歌地图的。 + +还有一个很坑的事情是,当你在同一个车站往另一个车站坐车时,目的地会因为列车的不同而驶入不同的子车站。以上面的「川越」到「池袋」为例子,如果不仔细看列车,只观察了池袋方向,则有可能进入「池袋 Subway 站」而不是「池袋 JR 站」。一般情况下这没什么,但是如果你购买了「川越周游卡」,它只允许你从「池袋 JR 站」免费出站,从「池袋 Subway 站」出站则要补票。 + +模式 3:同一个车站中相反方向不互通以及不同的线路共享铁路轨道 + +相反方向不互通的例子有我躺坑的东京地铁银座线「浅草 - 涩谷」的「田原町」站。不互通的情况是指,当你想要前往涩谷从地铁出入口 1 进入地铁中,凭借直觉你会觉得从哪个出入口进出都行,然而实际上不可以。在「田原町」站中如果进错了出入口,则必须从闸机付费离开,然后在地面上从另一个出入口进入。 + +不同的线路共享铁路轨道,这个情况在日本的铁道中实在是太多了,多见于有重合线路的车站,比如在大阪的「难波」站就会遇到。当你站在一个地铁车站内,你还会看到类似上述的指示着下一班列车的线路方向的告示板。如果不仔细辨别,也会有上错列车的情况。 + +![](https://image.wsine.top/0efa5026cd93be937f0543f380d79f2c.png) + +模式 4:同一台列车不同车厢会分离 + +这里的例子是大阪的「阪和线」。假设你现在在「天王寺」站,排除上面的模式 3 的困难找到了阪和线且看准了「关西机场」方向,准备好好休息一下迎接这趟旅程尾声,就很有可能遇到问题。因为该方向的列车共有 8 节车厢,其中 1 - 4 号车厢开往「关西机场」方向,5 - 8 号车厢开往「和歌山」方向 (゜ー゜)。 + +是的,你没听错。在列车行驶到「日根野」车站的时候会停下来,然后 4 号车厢和 5 号车厢分离,1 - 4 号车厢继续往前开,5 - 8 号车厢留在原地。幸运的是,列车在行驶过程中会重复好几次广播播放这一则消息,但如果你不幸睡着了,那么你可以在评论区分享一下后面 5 - 8 号车厢的情况。 + +根据我的实测,你可以在 5 - 8 号车厢行走到 5 号车厢,然后等待下一个车站,快速下车然后再走到 4 号车厢上车。其中「日根野」车站是相对来说停留得最久的车站,也是你最后一次机会了。 + +### 日语学习 + +我觉得日本「可能是世界上对外国旅游者最友好的国家」,因为在日本随处都充斥着「中、日、韩、英」四国语言的文字。但如果你也喜爱日语,想和当地人简单交流两句,我也有点小经验可以分享。 + +如果是初学英文在日常使用,我们能发现很多高频使用的单词。同理和英文对照,日文也能背诵最少的单词,组合发挥最大的功用。而这个方法也是我从 Youtube 中学来的,但是在实际中确实很有用,因此也特别在这里分享一下。 + +[#01 超實用旅行日文【基礎篇】10 個萬用單字,就算聽不懂日文,也能令你通行全日本!BonJPchannel〖HKG〗](https://youtu.be/b-51mFO73DA) + +仅需背诵 10 个单词,基本就能做一些很简单的对话了。但由于视频是粤语,建议普通话的朋友们打开字幕观看。如果有精力的朋友,也可以扩展更多高频单词,继续套用这个方法。 + +另外,针对食物的发音,也建议专门背一背,因为对着琳琅满目的菜单,哪怕看着英文也看不懂。 + +### 好物分享 + +#### 多国方便式旅行插座 + +![](https://image.wsine.top/f9a10abe80512927efd43dc44d00e254.png) + +由于现在大家的设备都多元化了起来,相机/运动相机/电脑/手机/平板等,每天晚上都需要给这些设备充满电,而多口充电器就是必需品。但由于是出国旅行,有些时候旅游地的默认充电口不是和国内一样的两插,而是欧标/德标这样的插头,且电压和频率也不一致,这种情况下旅行插座就是必需品。日本的电压为 100V,频率为东部地区 50Hz,西部地区 60Hz。现代的旅行插座一般支持宽电压设计(比如这款支持 100V~250V)和自适应频率,能很好的满足旅行的需求。 + +我买的是 Momax 1-World 65W GaN 方便式旅行插座这一款,你也可以选购这一品类更合适自己的,但多国方便式旅行插座是我强烈推荐出国旅行的好物。假如你的电脑需要旅行工作满速充电,那它上面的万能口就是你的救星。假如你旅行想要在酒店电视上玩 Switch 游戏,根据我的实测它的 PD 充电口可以触发 Switch 的 TV 模式。 + +#### 眼镜防雾剂 + +![](https://image.wsine.top/2f2ef15a6c0a88af8bdac4fb2ca97809.png) + +如果你和我一样是冬天去日本旅行且是一个戴眼镜的人士,那么我强烈推荐你购买这款 「SOFT99 浓缩眼镜防雾剂(持久型)」,在日本线下的各大药妆店均有销售,实测非常有用。尽管日本政府仅要求公众在医院场所和会见老人等场景下佩戴口罩,但日本绝大部分民众依旧很自觉戴口罩,入乡随俗我们也应该戴上口罩。可是冬天口腔呼出的热气会很容易地在你的眼镜上起雾,使得无法看清道路,防雾剂能很好地解决这一问题。 + +### App 分享 + +这里我分享一下我准备的一些日本旅游用的 App,有一些不是特别实用,会再逐一说明。 + +![](https://image.wsine.top/af3c5e084a3b87154759ddfd63cb76cb.png) + +- 行程助手:上面制定旅行计划中分享过,用于快速查看行程,非常推荐。 +- Kana Origin:用于学习 50 音的 App,少数派上有推荐,确实挺好用,且 iPadOS 版本可以手写练习,效率加倍。 +- Translator!:一个用于双语转换的 App,中文语音输入,日文文字输出,可以快速交换两个语言,递给对方。我在上面的模式 2 的情形下和铁道工作人员使用过一次。 +- Google Translate:可以实时拍照翻译,用过几次,但翻译餐单实在是效果惨淡,不如我有限的日语。而其它情况,看英文足矣。 +- MOJi 会话:一系列各场景下的常用语速查,也可用于前期学习。我仅用在了学习,实际旅游没用上。 +- Spend Together:上面旅行记账中分享过,非常推荐。 +- JapanTransit:换乘案内,本地人也在用的搜索路线的 app,和 Google Map 推荐的路线有区别,但路线更多更优。可惜软件 UI 比较古早味,但功能是完备的,非常推荐。 +- Payke:快速扫描商品二维码看中文说明,我在 Muji 和 7-Eleven 中测试了非常好用,有需要的朋友可以下载。 +- WAmazing:上面上网卡中分享过,用于白嫖一张上网卡,个人推荐。 +- Elk:快速计算汇率兑换,有 Apple Watch 的版本,无论是手机 App 还是 Watch App 的 UX 都非常高效实用,非常推荐。 + +以上,就是我这次日本旅行全部的经验分享啦。如果你还有更多的经验,也欢迎一起分享在评论区。 diff --git a/content/posts/selfhost-overleaf-for-thesis.md b/content/posts/selfhost-overleaf-for-thesis.md new file mode 100644 index 0000000..cc87f5b --- /dev/null +++ b/content/posts/selfhost-overleaf-for-thesis.md @@ -0,0 +1,209 @@ +--- +title: "自建 Overleaf 作为毕业论文排版工具" +date: 2023-10-31 +--- + +# 自建 Overleaf 作为毕业论文排版工具 + +无论是本科、硕士、还是博士,论文撰写是每个学生在不同的学习阶段都会遇到的任务。目前主流的论文排版工具主要有两个阵营,Word 和 Latex,不同的工具都有其优缺点和适用范围。本篇文章记录我使用 Latex 撰写博士论文遇到的困难和解决方案,同时也会展开聊聊我为什么做出这样的选择,希望给还在观望 Latex 和使用 Latex 遇到困难的同学们一点启发。 + +## 为什么选择 Latex 作为毕业论文工具 + +在撰写毕业论文的时候,作者只有毕业生一个人,因此协同编辑文档的需求其实已经不复存在了。但是对于为什么仍然使用 Latex 作为排版工具,除了专业背景是最老生常谈的理由,还有两个重要的原因使我更坚定地选择 Latex 作为毕业论文的排版工具。 + +![](https://image.wsine.top/3adbb858de45ed02f42ad0afc3dcaad1.png) + +第一点是沉没成本。在很多理工科的领域,毕业论文约等于文献综述 + 一系列的现有论文已成为一个事实标准。因此,原有论文的排版工具是什么,就成为了你转用其他排版工具的负担,也就是这里说的沉没成本。对我而言,由于前期大量地和导师一起用 Latex 合写文章,基本上我也不得不继续使用 Latex。 + +第二点是格式统一。不同的论文由于投稿的会议和期刊不同,他们排版的图表和段落格式都不一样。但是对于一份合格的毕业论文来说,在一份论文里至少要做到内部格式一致才会被学校图书馆接收,学生才能顺利毕业。对于一个编译型的语言,能够做到一份源代码 + 库文件生成一致的程序输出。对于 Latex 这个编译型语言来说,就是一份论文源码 + 模版文件生成一份格式一致的 PDF 输出。因此,对我而言,使用 Latex 能减少大量的编辑成本。 + +## 在线 Latex 工具无法满足编辑需求 + +[Overleaf](https://www.overleaf.com) 已经成为了在线 Latex 编辑器的事实标准。它提供了大量的国内外出版商的模版供用户直接使用甚至一键投稿;它允许免费用户邀请其他人一起在线协同编辑同一份文档;它的编辑器提供了自动补全、格式化、实时编辑、实时预览等一系列方便的功能。 + +但是,由于编译这个步骤需要花费相对多的计算资源,因此对于免费版的 Overleaf 来说,它限制了单次编译的最长时间。尽管官方没有明确说明超时时间为多少,但从我的经验来看,大约编译一份 ACM 或 IEEE 的标准会议模板(约 12 页)就比较接近超时的上限了。 + +![](https://image.wsine.top/5222c16615c7db323c2acd3372f6bc93.png) + +对于我们想要编译的博士论文来说,其一般为几十页至上百页不等,远远超过 Overleaf 免费账户的限制。想要绕过这个限制,一般来说有如下几个方法: + +- 选择性地只编译部分章节 +- 花钱购买 Premium 版本 +- 使用本地的 Latex 工具 + +减少待编译的数量毫无疑问是一个直接了当的解决办法,但是一般来说,不断往下撰写论文的内容的时候也需要偶尔回顾性地看看上文自己是怎么表述的,而部分编译打破了这一回顾的需求;购买 Premium 花钱解决问题诚然是一个万能的钞能力,21 美刀一个月的[价格](https://www.overleaf.com/user/subscription/plans),是否值当就看个人的心理预期了;最后,如果选项二不满足于你,那么使用本地 Latex 工具编译就变成了唯一选项。本地的 Latex 工具在集成性上总是略微逊色于 Overleaf 开箱即用的环境,且我们已经对 Overleaf 的编辑器有着熟练的使用经验,那么是否可以复刻一个运行在本地的 Overleaf 编辑器来绕过编译时长的限制呢? + +## 自建 Overleaf 本地版本 + +好消息是,Overleaf 开源了自家的编辑器供用户私有部署,因此上述的问题似乎可以有效解决。但是这里还需要强调一点,开源代码和其官方部署版本不一定是一致的。在我们这个文章的术语里,Overleaf 团队仅开源了其编辑器的部分,其集成性环境 overleaf.com 版本并非是开源的。但是,overleaf.com 才是我们理想中 Latex 排版工具,因此本章节主要向大家介绍如何尽量复刻 overleaf.com 这个版本以满足我们理想的编辑体验。 + +### 安装 Docker 环境 + +Docker 是目前部署工作中最方便的工具之一。因此,我个人比较推荐使用 docker 做部署,且后面 Overleaf 提供的部署工具也是基于 docker 环境的。安装 docker 环境建议还是参考 docker 网站上官方的[安装方式](https://docs.docker.com/engine/install/),这里做一个简单的搬运。假设是在 Ubuntu 环境。 + +第一步需要添加 docker 的仓库到 apt 的列表中 + +```bash +# Add Docker's official GPG key:sudo apt-get update +sudo apt-get install ca-certificates curl gnupg +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg + +# Add the repository to Apt sources: +echo \ + "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update +``` + +第二步安装 docker 和 docker compose 最新版本到系统中,使用系统默认的包管理器方式安装能够很好地自动配置守护进程。 + +```bash +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + +第三步,使用非管理员权限用户直接与 docker 守护进程通信,每次使用 docker 命令的时候不必记得加上 `sudo` 关键字,在 docker 安装文档里其实也有[说明](https://docs.docker.com/engine/install/linux-postinstall/)。个人来说比较推荐配置这一步,因为大部分教程默认没有 sudo 提权命令,配置非管理员权限用户能更好地避开一下不必要的麻烦。 + +```bash +sudo groupadd docker +sudo usermod -aG docker $USER +``` + +然后,退出你的终端或 SSH 链接,再重新打开终端或重连 SSH。这一步是为了让上述的权限配置在新的会话中生效。 + +第四步,测试一下 docker 环境是否能免提权直接运行。注意,该步骤需要必要且顺畅的网络连接,如无法成功下载镜像,则需要先解决网络问题再行尝试。 + +```bash +docker run hello-world +``` + +### 部署 Overleaf 容器 + +Overleaf 的编辑器在 Github 开源,主体代码在[主仓库](https://github.com/overleaf/overleaf)中,但实际安装步骤非常冗长,Overleaf 官方还贴心地把脚本制作成一个[工具包](https://github.com/overleaf/toolkit/)给用户快捷安装。根据我的实际操作体验,我会展开讲讲其中比较关键的配置。 + +首先需要把工具包下载到本地环境中,这里需要 git 命令,可以通过系统包管理器以 git 为关键字安装。 + +```bash +git clone https://github.com/overleaf/toolkit.git ./overleaf-toolkit +``` + +切换目录到工具包中,然后初始化配置文件并查看,它会生成三份文件 `overleaf.rc`,`variables.env` 和 `version` . + +```bash +cd ./overleaf-toolkit +./bin/init +ls config +``` + +三份配置文件中比较重要的配置项如下: + +- `overleaf.rc` + + - SHARELATEX_PORT 默认为 80 端口,但这个一般会被系统各大应用抢占,如果和你的有冲突,建议修改为 1024~65535 之间的一个数值。 +- `variables.env` + + - SHARELATEX_APP_NAME 这个名字可以自定义,没什么特别的影响。 + - SHARELATEX_SITE_URL 这个会影响生成用户激活链接里的 URL 的域名地址,建议根据自己的实际情况修改。注意,该域名必须能够被有效解析到服务器,否则请填写 ip 地址作为替代。 + - SHARELATEX_NAV_TITLE 标签页里的标题,可以自定义。 + - SHARELATEX_HEADER_IMAGE_URL 为了和 overleaf.com 的区分,我把这个 URL 指向了我们学校的 logo + - SHARELATEX_LEFT_FOOTER 显示在注册界面的提示信息,由于没有实际的注册功能,因此需要显示一段文字说明管理员的联系方式,就是这个字段的配置内容。 +- `version` + + - 不需要更改。 + +然后就可以下载和启动容器了,toolkit 中提供了一键启动脚本。 + +```bash +./bin/up +``` + +该脚本可以将启动过程中的 log 输出到终端中方便诊断启动进程。一般情况下,网络条件良好的话是没有问题的。如果出现下载失败的情况,可以重新执行该命令。 + +待一切都正常运行起来后,可以按 `CTRL+C` 将进程停止。然后使用另一个脚本将 Overleaf 容器在后台运行。 + +```bash +./bin/start +``` + +### 创建 Overleaf 实例账号 + +由于是自建 Overleaf,该实例下的账号与 overleaf.com 里的账号不互通,需要创建该实例自己的账号。 + +假设上文中的环境变量 SHARELATEX_SITE_URL 和 SHARELATEX_PORT 分别为 overleaf.abbr.edu.cn 和 8001,那么使用浏览器打开 [http://overleaf.abbr.edu.cn/launchpad](http://overleaf.abbr.edu.cn:8001/launchpad) 即可注册本地账号。 + +值得注意的是,第一个在这个实例下注册的账号将会被设定为唯一的管理员账号(我没有找到哪里能够授予别的账号管理员权限的功能),因此请不要随便设置测试账号。 + +然后,使用浏览器打开 [http://overleaf.abbr.edu.cn/login](http://overleaf.abbr.edu.cn:8001/login) 登录刚才注册的账号便可如同 overleaf.com 一样使用这个熟悉的编辑器了。 + +![](https://image.wsine.top/65435d30bfeb04e63f3725c66278ff6b.png) + +如果打算分享该实例与小伙伴一起用的话,需要创建 Overleaf 普通用户账号。登录了管理员账号后,可以在右上角找到 Admin 相关的功能,创建账号的功能就在这里。 + +创建账号需要两步,输入一个邮箱地址,系统会生成一个激活链接,自己将该激活链接发给别人完成激活,便可登入到系统中了。 + +### 增强 Overleaf 实例编译环境 + +如果这时候你把很多期刊和会议的 Latex 模板扔到这个自建的 Overleaf 实例中编译,你会发现大部分情况下都是无法编译成功的。上面说到,overleaf.com 是一个开箱即用的集成化环境,而这个实例中仅包含编辑器部分和基本的 Latex 编译器。而两者之间的差别主要在于以下几个部分: + +- Latex 宏包 +- 系统字体 +- TikZ & Syntax highlighter 的依赖 +- TexLive 版本 + +手动把这几个部分的差别补足就是本文的重点。 + +Latex 宏包。Latex 对于学术排版比较好用的地方就是它对于学术内容的元素有着大量的宏包支持,比如伪代码等。宏包可以理解为 HTML/CSS 代码里的第三方库,只要调用相应的模板片段(接口)并填入自己的内容(参数),就能生成宏包原本定义好的漂亮的格式。 + +安装宏包并不困难,我们需要进入到 Overleaf 容器的内部,通过 TexLive 自带的包管理器 tlmgr 就能安装指定的宏包。但这里并不推荐单独安装缺少了宏包,因为 Latex 背后的宏包依赖层层嵌套且依赖关系不明确,最好的办法是用存储空间换省心,一次性把所有的宏包都安装了。 + +```bash +cd ./overleaf-toolkit +./bin/shell +tlmgr install scheme-full +``` + +Scheme-full 指代了 [CTAN](https://ctan.org/pkg/latex) 中所有的 Latex 宏包,大约需要至少 2G 的存储空间,整个下载过程非常的漫长,建议耐心等待。 + +系统字体。overleaf.com 中包含了[数百种字体](https://www.overleaf.com/learn/latex/Questions/Which_OTF_or_TTF_fonts_are_supported_via_fontspec%3F) 以供不同的模板无痛编译。但由于字体文件比较大且容易产生版权问题,因此需要我们自行安装。Overleaf 容器是以 Ubuntu 镜像为底层容器,因此字体的安装方法和 Ubuntu 一样,可以通过 Google 搜索很容易得到答案。 + +比如,我需要安装 Times New Roman 这个毕业论文格式中指定的字体,在 Windows 中自带但 Ubuntu 系统中没有。大部分常见的字体可以通过 Ubuntu 自带的 apt 包管理器安装,包的名称可以通过 Google 搜索获得。 + +```bash +cd ./overleaf-toolkit +./bin/shell +apt install ttf-mscorefonts-installer +``` + +对于少部分比较小众的字体,需要手动复制字体到 Overleaf 容器中,并刷新字体索引。 + +```bash +docker cp /path/to/your/font sharelatex:/usr/local/share/fonts/ +cd ./overleaf-toolkit +./bin/shell +fc-cache -f -v +``` + +TikZ & Syntax highlighter 的依赖。TikZ 是 Latex 中画图的工具包,也是 Latex 强大的代表功能。TikZ 实际使用中会因为缺少 SVG 支持遇到一些错误,需要 inkscape 系统依赖。而 Syntax highlighter 是代码片段中高亮功能所需要的依赖,需要安装 python3-pygments 包。 + +```bash +cd ./overleaf-toolkit +./bin/shell +apt install inkscape python3-pygments +``` + +(Optional) TexLive 版本。还有一些编译错误是由于 TexLive 版本过低导致的,toolkit 一般会在 TexLive 新版本释放后更新容器的最新版本。toolkit 中自带了升级脚本,可以一键命令升级。 + +```bash +cd ./overleaf-toolkit +./bin/upgrade +``` + +## 实际体验感受 + +我测试了自己发表的多份文章,在自建平台上都可以顺利编译生成 PDF。在约 100 页毕业论文的编译任务上,从无缓存开始的编译时间只需要不到 10s,当然这也取决于你的服务器的性能,但自己本机的性能总是能比 overleaf.com 平台上共享的性能高不少。 + +容器化的安装部署能够将 Latex 杂乱的环境依赖都封印起来,不用污染本地环境,以及与 Overleaf 一致的编辑体验,是这个方案的优势所在。 + +有兴趣的同学不妨一试。 diff --git a/content/posts/the-algorithm-of-twitter.md b/content/posts/the-algorithm-of-twitter.md new file mode 100644 index 0000000..181685b --- /dev/null +++ b/content/posts/the-algorithm-of-twitter.md @@ -0,0 +1,180 @@ +--- +title: "Twitter 的推荐算法" +date: 2023-08-31 +--- + +# Twitter 的推荐算法 + +在今年年初的早些时候马斯克收购 Twitter 时表示会对 Twitter 的推荐算法进行开源。在 2023 年三月份的最后一天,Twitter 的推荐算法代码如约而至地出现在了 GitHub 上。开源推荐算法对 Twitter 公司和用户来说,在一定角度上,是一件双赢的事情。 + +对于 Twitter 公司来说,其近些年来遇到了信任危机:用户不清楚不同推文的出现理由导致怀疑 Twitter 公司收黑钱做竞价排名的事情。开源 Twitter 推荐算法的官方理由,马老板也给出了自己的解释: + +![](https://image.wsine.top/a2ea7535debb84cb9fd4babec70cb6cc.png) + +一方面,现有的推荐「算法」太过错综复杂以至于 Twitter 内部都无法很好地搞懂,而开源能够让公众直视当下糟糕的「算法」起到监视的作用,从而推动 Twitter 公司的开发进一步快速迭代「算法」,尽管代码开源初期由于糟糕的「算法」会让 Twitter 陷入尴尬的境地;另一方面也是最重要的一点,Twitter 希望以此来解决上述提到的信任危机。 + +对于普通用户来说,了解 Twitter 的推荐算法一定程度上能够帮助自己的推文更好地被推荐到更多用户的时间线上,给自己增加更多的曝光流量。如果是一个推荐系统的开发者,还能从顶级公司的推荐系统中学习到有用的策略;科研工作者也能通过分析应用中使用的算法得出研究结论辅助改进算法 ^1。 + +本篇文章就是一起来探索一下推荐算法的重要性,什么是推荐算法,以及 Twitter 推荐算法的做法。 + +# 为什么开源推荐算法这么重要? + +![](https://image.wsine.top/0c192d37c681fc380bdcdf2885a533ae.png) + +哥伦比大学下的一个研究机构 Knight First Amendment Institute(下称,the Knight Institute)曾指出 ^2,社交媒体平台的推荐系统,特别是其内部的算法和策略,对人们的行为有着巨大影响,包括平台用户和内容创作者。反之,用户和创作者的行为也会反向影响平台,推动算法和策略的持续更新。许多社交媒体上的负面现象常被归咎于人们的行为或是相关算法,但实际上,这些现象是两者共同作用的结果。 + +The Knight Institute 也列举了两个常见于舆论的不良现象(从观察的角度 vs 从猜想的角度): + +- “Twitter 上的用户太消极了” vs “Twitter 的算法奖励消极的情绪” ^3^4 +- “Youtube 的算法推荐用户一些无意义的内容” vs “用户的行为训练了这样的推荐算法” ^5 + +这也很好地反映了我们在引言中所提到的、由于算法透明度不足引发问题。人们会对这种不透明的算法产生了许多疑虑。然而,对算法进行开源确实可以减少这部分的疑虑,因为信息传播的方式对于不少人来说其实是透明度的。 + +另一方面,现代网络的高速传播能力容易引发病毒式扩散,相信大家对此有深刻的体会,其中假新闻的传播尤为常见。 + +The Knight Institute 指出,网络的存在推动了病毒式的信息传播。这个观点其实很容易理解,因为在互联网网络的前提下,信息才能被更广泛传播。而在现代网络中,我们可以通过度量某个信息(例如,一个推文被转发了多少次)的传播能力,来了解其在网络中的影响力。然而,病毒式的信息传播有时会变得无法预测,并且其传播的内容常常占据了我们的大部分注意力。但是,一个所谓的「降权」操作,或者说是一种软屏蔽,可以有效地减缓这种病毒式的信息传播。 + +然而,降权这种操作通常在平台内部进行,用户通常无法确切知道自己是否被降权。当用户发现自己的推文无法获得广泛传播时,他们就会怀疑自己的推文是否被降权,这也就进一步佐证了推荐算法的不透明性可能引发用户的疑惑和揣测。所以,开源化推荐算法可以变相地解决某个企业的信任危机。 + +# 推荐算法 vs 推荐系统 + +## 推荐算法是什么? + +说到推荐算法,很多人对里面的两个词都很熟悉,但是放在一起又不能说出个细节来。这里我尝试举一个极简的例子来一起说明推荐算法要做的事情。 + +![](https://image.wsine.top/3094ad772d25ee4f600129c28ab66a90.png) + +上图中,① -- ⑤ 代表了某一个用户浏览记录中比较感兴趣的推文,❶ -- ❸ 分别为三条待推荐的推文,右边的表格记录了推文各自对应的标签(这里称为「特征」),标签下面的数字为该特征对应的权重。而接下来的任务是,根据用户可能的感兴趣程度排序 ❶❷❸ 这三条推文作为出现在用户时间线上的顺序。 + +这个任务看起来很简单吧,稍加思考就能知道最优的排序为 ❷❶❸ 。但是同时这个例子也给我们揭露了推荐算法的很多细节和本质任务: + +- 维护一份用户感兴趣的历史推文数据 +- 收集一套待推荐的推文 +- 根据用户的兴趣排序 + +这就是大部分推荐系统都要做的事情,里面可能有很多的真正的算法被应用了,尽管我们常说推荐算法这四个字。由此也可得知,为什么引言图中马斯克的「算法」二字很严谨地加了一对引号。如果真要算算法的话,可能是其中的基于相似度的排序算法。 + +## 推荐系统是什么? + +推荐系统可以被理解为一个加入了内容定制的“算法”,如果用生活场景类比一下的话,可以是一个了解你口味的高级专人服务员。 + +这样的服务员了解你的口味,他知道你以前点过什么菜,你对哪些菜评价比较高。当你去餐厅时,他会根据你的历史选择和偏好,为你推荐一些你可能喜欢的菜。这就像推荐系统的「协同过滤」部分,通过你的历史行为和其他类似你的人的行为,来推测你可能会喜欢什么。 + +同时,这个服务员也了解每道菜的具体成分和特点,比如哪些是辣的,哪些是素的,哪些含有某种你喜欢的食材。这就像推荐系统的「内容过滤」部分,根据产品的需求,制定合适的策略,从而过滤掉不符合你的兴趣的。 + +但是,如果这个服务员只按照你的历史喜好来推荐,你可能会觉得乏味。他还需要时不时地给你推荐一些新的,你从未尝试过的菜品。这就像推荐系统的「探索与利用」问题,既需要满足你的已知喜好(利用),也需要引导你发现新的喜好(探索)。 + +此外,这个服务员也需要考虑到当前的情况,比如如果今天天气很热,他可能会推荐一些清凉的菜品;如果你今天带了小孩,他可能会推荐一些适合孩子的菜。这就像推荐系统的「上下文感知」,它不仅需要考虑你的长期喜好,也需要考虑到当前的特定情境。 + +而最终整个“算法”的整体表现都会被归纳为一个推荐系统,至于其中各个部分是否存在以及什么样的策略被应用,会因各大推荐系统的实现而异。 + +# Twitter 的推荐系统是怎么做的 + +了解完基础的内容,下面就来看看 Twitter 大公司的推荐系统到底是怎么做的。 + +## Twitter 怎么界定用户感兴趣的范围 + +把每一个用户点击、阅读、评论的行为都记录下来是不现实的,因为这样会造成存储需求的持续膨胀。现在让我们来做一个简单的计算。假设一个点赞行为记录需要 512bit 的数据(这是一个非常保守的估计,实际的数据可能更大,还没算存储需求更大的评论行为),一个网站每天有 100 万的活跃用户,每个用户平均产生 100 个行为,那么每年就会产生 17TB 的数据,而且这还只是一个中等规模的网站的数据。 + +考虑到存储和处理大量用户行为数据的挑战,Twitter 选择了一种更为高效的方式来进行推荐,那就是基于模型的协同过滤。从[排序器](https://github.com/twitter/the-algorithm-ml/tree/main/projects/home/recap)的描述中可以得知,Twitter 统计用户一段时间内的各种交互行为和关系图谱作为特征,喂给一个深度神经网络(i.e., MaskNet)预测出用户对于一条推文的各种交互的概率,然后通过预设的权重计算出推文的排序值。那么,什么是特征呢?在机器学习中,特征是用来描述样本的某种属性的。例如,如果我们要预测一个房子的价格,那么房子的面积、位置、房间数量等明显和房价有强相关的属性会作为特征,甚至房子当地的气候环境、周边的历史事件等弱相关的属性也能作为特征。而机器学习能够自动从输入的表层特征中提取更深层次的隐藏特征并拟合到训练样本中。 + +接下来,我们来看看一个更具体的官方例子: + +``` +user_aggregate_v2.pair.recap.engagement.is_favorited.engagement_features.in_network.replies.count.50.days.count +``` + +这串超长的字符串指示了该特征统计的是在 50 天内用户收藏的推文中有回复的推文数。用例子来说的话,让我们假设有一个叫做 Alice 的 Twitter 用户。Alice 每天都浏览 Twitter 且经常收藏和回复推文。他在过去的 50 天内,收藏了 100 条推文,其中有 30 条推文是他回复过的。那么,这个特征的值就是 30。 + +这个特征会告诉了后续的算法在过去的 50 天内,对他喜欢的推文进行了多少次回复。这是一个反映用户兴趣和行为的重要信息,可以被用来预测 Alice 对于新的推文的兴趣。 + +在实际的应用中,Twitter 会使用数百甚至数千个这样的特征来描述和预测用户的行为。 + +在 Twitter 的例子中,他们使用了非常多的统计信息作为特征来刻画用户的行为。这些特征包括了用户的各种历史行为(例如点击、喜欢、回复等),以及用户的关系图谱(也就是用户和其他用户的关系)。这些特征被用来预测用户对于一条推文的交互概率,然后聚合从而决定推文的排序。 + +如果细看官方列出的整个[特征列表](https://github.com/twitter/the-algorithm-ml/blob/main/projects/home/recap/FEATURES.md)(至少有数百个特征),几乎所有可能和兴趣有关系的行为都被枚举了,上至你上一秒是否点击了转发按钮,下至你用什么设备发送推文,都在 Twitter 的考虑之中。 + +## Twitter 用什么标准圈定待推荐的推文 + +推特为用户生成的待排序候选推文主要来源于三个方面:Twitter 搜索系统中的索引([search-index](https://github.com/twitter/the-algorithm/blob/main/src/java/com/twitter/search/README.md)),用户与推文的知识图谱([user-tweet-entity-graph](https://github.com/twitter/the-algorithm/blob/main/src/scala/com/twitter/recos/user_tweet_entity_graph/README.md), UTEG),以及用户可能感兴趣的别的用户发的推文([follow-recommendation-service](https://github.com/twitter/the-algorithm/blob/main/follow-recommendations-service/README.md), FRS)。 + +首先是 Twitter 搜索系统的索引,这部分主要包含了 Twitter 上的热门搜索内容,也就是我们常说的「热搜」。热搜往往是大量用户关注或讨论的主题,所以它们具有很高的可见度和影响力。比如,当某个明星的新闻或某个社会事件在 Twitter 上被广泛讨论时,这些内容就可能出现在热搜中,并成为候选推文。据统计,大约有 50% 的推文来自于这个来源。 + +其次就是用户与推文的知识图谱,这是由 Twitter 开源的 [GraphJet](https://github.com/twitter/GraphJet) 框架生成的一种数据,它可以帮助 Twitter 理解用户与推文之间的关系。比如,如果你经常点赞、转发或评论某个话题或某个用户的推文,这些行为就会在知识图谱中形成相应的连接,GraphJet 就会基于这些连接为你推荐相关的内容。举个例子,如果你经常在 Twitter 上分享和评论科技相关的推文,那么 GraphJet 可能就会认为你对科技感兴趣,并在你的候选推文中加入更多科技相关的内容。 + +最后则是用户可能感兴趣的其他用户的推文,这部分推文来自于 Twitter 的关注推荐服务。这个服务会根据你的行为和偏好,推荐一些你可能感兴趣但尚未关注的用户的推文。比如,如果你经常关注和互动与旅行相关的推文,那么 Twitter 可能会推荐一些旅行博主的推文给你。 + +## Twitter 用什么指标和权重做推文排序 + +上面说到,Twitter 通过预测出用户对于一条推文的各种交互的概率,然后通过预设的权重计算出推文最终的排序值。潜台词就是说,用户愿意交互的推文都强相关于他们的兴趣范围。 + +从[排序器](https://github.com/twitter/the-algorithm-ml/tree/main/projects/home/recap)的页面中可以找到,截止到 2023 年 4 月 23 日,Twitter 考虑的交互行为有以下 10 种以及它们对应的权重: + +- 有多大概率用户会收藏该条推文;权重:0.5 +- 有多大概率用户会转发这条推文;权重:1.0 +- 有多大概率用户会回复这条推文;权重:13.5 +- 有多大概率用户会打开这条推文的作者的主页并点赞或回复其中一条推文;权重:12.0 +- 有多大概率用户会观看这条视频推文(如果是视频推文);权重:0.005 +- 有多大概率用户会回复这条推文且原推文主会回应用户的回复;权重:75.0 +- 有多大概率用户会查看这条推文的评论区并回复或点赞其中一条评论;权重:11.0 +- 有多大概率用户会查看这条推文的评论区并停留超过 2 分钟;权重:10.0 +- 有多大概率用户会不喜欢这条推文(比如点击 收起/屏蔽/静音 等按钮);权重:-74.0 +- 有多大概率用户会举报这条推文;权重:-369.0 + +可以看到,举报行为的权重远大于其它所有的行为(权重:-369.0),而观看视频这一行为几乎无足轻重于兴趣(权重:0.005)。其中两个对兴趣影响较大的行为是用户和推文作者的互相响应(权重:75.0)和用户对推文的一些负面行为(权重:-74.0)。 + +综合来看,要想推文出现在更多用户的时间线上,需要让推文更加吸引用户做出交互(收藏/转发/回复),积极响应其它用户的评论,以及避免被其它用户举报。但是权重可能会被调整,需要偶尔回来开源仓库中查看一下最新的策略。 + +## Twitter 对最终展示的内容增减了什么 + +![](https://image.wsine.top/33cb1f9cef22a1b4ab5e8e7ead3a58c7.png) + +总的来说,用户的时间线由三部分组成:根据用户兴趣排序的推文、广告,以及用户关注的人的推文。其中,已排序的推文还需要经过一个过滤的操作来满足平台的策略。接下来让我们每部分拆开来一点一点来聊一聊: + +Twitter 使用一个复杂的算法(称为 HEAVY RANKER)来产生排序好的用户可能感兴趣的推文,也就是我们上面部分聊到的排序的三个重要方面。然后,这些推文需要通过一个过滤器才能出现在用户的时间线上。 + +关于过滤器的 Rules and Policies,仓库中相关的[源码](https://github.com/twitter/the-algorithm/tree/main/visibilitylib)部分并没有相关的说明部分。但可以从图中得知,Twitter 考虑了用户的多样性和内容的多样性,以及公共安全。从源码的实现中也发现了 hard filtering 和 soft filtering 的字眼,对应于屏蔽和降权等操作。 + +广告和关注的人的推文这两个部分比较好理解,Twitter 依赖于广告产生收入,因此曝光度最高的时间线中出现广告是非常常见的现象。而关注的人发送的推文,默认用户一定对其十分感兴趣。 + +最后是 Mixing 的部分,值得注意的是,推特的广告不是在待排序推文中给你推荐的,而是系统直接混合进来的(可能跟你的兴趣没什么关系)。至于以何种比例和顺序做混合,仓库中有相关的开源代码但没有相关的明确说明,需要从[源码](https://github.com/twitter/the-algorithm/tree/main/home-mixer)中仔细推敲,感兴趣的读者可以自行探索。 + +# Twitter 推荐系统中的特殊部分 + +尽管上面分析的推荐算法是相对公平的,但也仅截止到推荐系统的 Heavy Ranker 的部分,一般情况下大公司们都会在后处理阶段(i.e., Heuristics & Filtering)夹带私货。开头说到代码开源初期由于糟糕的「算法」会让 Twitter 陷入尴尬的境地,也确实有很多有意思的发现被热心的网友们捕捉到了。 + +## 👀 Author Is Elon? + +![](https://image.wsine.top/f1e832db98e40fd63918fcc70cdda176.jpg) + +比如,有网友在代码里发现了一些特殊的片段,比如对于「特定人群」的推文标记。上述代码阐明了 Twitter 会基于作者的身份来对推文区分或标识,包括作者是否为民主党或共和党人士,以及高级用户。 + +当然最令人瞩目的还当属 `author_is_elon` 的一部分,因为在马斯克大刀阔斧对 Twitter 内部进行重组的时候他就曾要求工程师提高其推文的曝光度,于是在相当一段时间中,即便你此前从未关注埃隆·马斯克本人,他的推文也会像幽灵一般出现在更多用户的时间线中,以至于在那个时期有不少用户不胜其扰而选择将其屏蔽。 + +在上述代码被曝光没多久,Twitter 官方便迅速地将上述代码片段删除并强制重新推送覆盖了代码仓库的内容。然而,时至今日你依然能在 GitHub 上搜到其他人 Fork(相当于复制)后的原始版本,开源的好处在这种情况下对于 Twitter 来说反而是由「蜜糖」转变为「砒霜」,因为一旦代码开源了,那么只要有人留有备份就无法永远抹去痕迹。 + +可话又说回来,至于 Twitter 官方在内部是否依然保留这部分代码逻辑仍不得而知。 + +## 🔞 Trust and Safety Models + +Twitter 是一个言论相对自由的平台,除了一般的推文之外,还允许「其他声音」存在,但这并不意味着完全地放任自流,比如 Twitter 在推荐算法中专门搭设了一组名为「Trust and Safety」的模型来对这些弦外之音进行探测并处理。当中主要针对三部分内容:NSFW、Toxicity 以及 Abuse。 + +所谓的 NSFW 即是 Not Safe/Suitable For Work 的缩写,泛指不适宜在工作场合浏览的内容,而这在 Twitter 上主要特指成人内容,包括文字性话题、图像、视频等。 + +而 Toxicity 表示有害性的内容,如侮辱或某种类型的骚扰、某些与政治或种族相关的内容等,但这并不违反 Twitter 的服务条款; + +除此之外,Abuse——也就是滥用性内容——特指那些违反 Twitter 服务条款的行为,譬如仇恨言论、有针对性的骚扰和辱骂行为等。在 Twitter 所公开的源码中还包含了更为具体的行为标签,如有惩罚性行为的内容、自残行为相关的内容或是其他违规内容。 + +![](https://image.wsine.top/9612d299f87470ef07d382fe09e31602.png) + +Twitter 官方在源码仓库中有所说明,除了上述部分之外还有一些模型和规则,但出于对抗性的考量并未公开;但即便如此上述部分的代码也有不少阉割的地方,无法完全窥探 Twitter 在处理这些内容时的核心要义。 + +--- + +总的来说,Twitter 公司开源其推荐算法,对于用户和竞争对手来说都是好事。最后贴一个 Twitter 开源推荐算法仓库的地址:[https://github.com/twitter/the-algorithm](https://github.com/twitter/the-algorithm),大家可以各取所需。 + +- ^1: Twitter's Algorithm: Amplifying Anger, Animosity, and Affective Polarization [https://arxiv.org/abs/2305.16941](https://arxiv.org/abs/2305.16941) +- ^2: [https://knightcolumbia.org/content/understanding-social-media-recommendation-algorithms](https://knightcolumbia.org/content/understanding-social-media-recommendation-algorithms) +- ^3: [https://www.quora.com/Why-are-people-on-Twitter-so-toxic-negative-towards-each-other-especially-celebrities](https://www.quora.com/Why-are-people-on-Twitter-so-toxic-negative-towards-each-other-especially-celebrities) +- ^4: [https://www.reddit.com/r/DreamWasTaken2/comments/owh9ml/one_of_the_reasons_twitter_is_so_negative/](https://www.reddit.com/r/DreamWasTaken2/comments/owh9ml/one_of_the_reasons_twitter_is_so_negative/) +- ^5: [https://www.brookings.edu/research/echo-chambers-rabbit-holes-and-ideological-bias-how-youtube-recommends-content-to-real-users](https://www.brookings.edu/research/echo-chambers-rabbit-holes-and-ideological-bias-how-youtube-recommends-content-to-real-users) diff --git a/content/posts/travel-hk-feeling-different-culture.md b/content/posts/travel-hk-feeling-different-culture.md new file mode 100644 index 0000000..45aaf44 --- /dev/null +++ b/content/posts/travel-hk-feeling-different-culture.md @@ -0,0 +1,102 @@ +--- +title: "城市漫步指南:香港,感受不一样的文化" +date: 2023-01-09 +--- + +# 城市漫步指南:香港,感受不一样的文化 + +在香港生活也三年多了,这座城市给我带来了很多不一样的文化感受。通关在即,如果你希望来香港游玩感受一下这里不一样的文化,这里有一份漫步指南,和普通的旅游攻略可能不一样,希望能从居民的角度帮助你体会这座城市的魅力。 + +本篇文章分为白天漫步指南和晚上漫步指南两部分,香港给人的一个印象是街道有大量的霓虹灯,有一种灯红酒绿的感觉,这部分的体会会着重留到晚上漫步的部分,而白天,可以踏足一些比较有特色的地方来感受城市另一些方面的文化。 + +--- + +## 白天的漫步指南 + +### 天际 100 & M+ Museum + +如果你喜欢从全局的角度去感受一座城市,那么西九龙片区是一个非常值得推荐的地方。 + +![](https://image.wsine.top/ca98347281101f566d0109384d26fa34.png) + +每座大城市可能都有它自己的一座高塔来鸟瞰整座城市,在香港这便是「天际 100」。在天际 100 你可以从东南西北四个方位俯视整座城市的规划和发展,也可以坐下来和朋友在这 100 层楼高的高空中喝杯咖啡聊聊是非。对了,如果你喜欢给朋友们寄明信片,这里的明信片都很有特色可以慢慢挑选写下自己的祝语,然后投递到邮箱中。 + +![](https://image.wsine.top/5d7163ec391851dfa169b2b79a4876ba.png) + +西九龙公园常常举办很多有意思的户外演唱会,而每逢周末也有很多人来这里野餐享受闲暇的时光,外国友人在这个群体中占了不少的比例,你可以来这里散散步感受一下蓝天白云和生活的气息。 + +![](https://image.wsine.top/acc36fc1744d1c3b8efe5b5819c5a1b0.JPEG) + +在西九龙还有一座特别的艺术博物馆「M+ Museum」 ,是亚洲首间全球性当代视觉文化博物馆。既会收藏和展览一些世界艺术大师的作品,也会讲述香港的此地彼方,展现这个城市从战后至今所经历的各种转变。 + +![](https://image.wsine.top/30fda21ff061b886ba15ed47927bf98e.JPG) + +西九龙附近也有一些常规的大型商场「圆方」,最近也建成并开放了一座特色建筑「香港故宫文化博物馆」,有兴趣也可以步行到访。 + +### 黄大仙 & 彩虹 & 钻石山 + +如果你喜欢融入当地居民的生活,体会当地的历史政策带来的影响,那么黄大仙区则是一个不错的选择。 + +![](https://image.wsine.top/57b9cd5e8a554775193fd3543ff9a18e.jpg) + +黄大仙区最出名的莫过于「黃大仙祠」,人们来这里祈福,祈求工作和生活的顺心如意。造访黃大仙祠当然少不了求签问卜,感受一下这个充满仪式感的行为。祠外一条小路上还有反法轮功的宣传,不过随着这几年时间的流逝,这些特别的东西也埋入了历史。 + +![](https://image.wsine.top/b28e852e813874cf436d5409324d8add.png) + +在黃大仙祠的背后,你会发现一座奇怪的小山,那便是「狮子山」。在香港,人们很喜欢周末去郊外踏青,在这里俗称「行山」。每一座风景独特的山峰都是一个郊野公园,有政府铺设规划的行山径,难度也有等级划分。 在这座人口密集的城市中,还能保留数量可观的实在是难能可贵。狮子山的特别之处就在于靠近市区,地势不高因此难度较低,还能遇见野生的憨态可掬/凶神恶煞的猴子 ~ 只要不主动凶它们,它们也不会攻击游客啦。 + +![](https://image.wsine.top/840f612b500a74520d72c59623142734.JPG) + +往旁边走走,你会看到香港很有地标性的一种建筑「公屋」,有点像内地的公租房,建筑风格自成一派。据说申请公屋要好几年才能排得上。而看到公屋后,附近便是港铁一个非常有代表性的「彩虹地铁站」,因为不同的地铁站都用不同的颜色来代表该片区的一个形象,你也可以特别留意一下。而彩虹地铁站包容万象,是一个很特别的存在。 + +![](https://image.wsine.top/b411ed7d97d4f2d31775211a2a865662.png) + +最后,走到位于钻石山的「荷里活广场」可以看看这边亲民的商业店铺们,比如百脑汇、苏宁、屈臣氏、万宁这些当地特色的店铺。广场的中央偶尔会有一些年货节一样的小摊贩,售卖着一些中外的糕点。你也可以在这里找到自己喜欢的餐厅,本地特色敏华餐厅和各国的代表性连锁餐厅。 + +### 沙田 & 科学园 & 大尾督 + +在城市走走停停是一种选择,到郊区用代步工具也是体验居民生活的一种选择。如果你热爱骑行,可以来试试这条路线。 + +![](https://image.wsine.top/a455184c636f2210a0532453953190c5.png) + +从「大围」或「沙田」地铁站出来,会发现不少的自行车店铺出租越野自行车,也能在店铺附近发现不少指示牌指引着自行车径。沿途会看到不少的自然风光,如白石角的海滨长廊,作为新兴的居住区吸引着不少人在这附近购房;如香港科学园,作为高新技术产业的园区,也是很多年轻人梦想中的工作地点。 + +![](https://image.wsine.top/5596587d5a8ff896cf81b46ff54678d6.png) + +不管你在大围还是沙田出发,最终都会抵达大尾督这个终点,可以在这里归还自行车。还车后,可以在水上活动中心旁的码头租艇划艇仔,或在堤坝上放风筝。最后,也肯定少不了这条路线的关键美食,大尾督烧烤场,限时自助烧烤,用这里的话来说叫「放题」。 + +## 晚上的漫步指南 + +### 旺角 & 弥敦道 & 星光大道 + +![](https://image.wsine.top/003870571dff17e7e58f4fdeb9053564.jpg) + +香港的固有印象之一,街道上大量的霓虹灯,就会在「旺角」的晚上遇到。在这里,你也能找到几乎全港所有的香港小吃,以及众多的放题餐馆,可以大快朵颐。不要以为香港人不吃辣,我常常能听到本地口音下单中辣、大辣,让我这个点走辣(不要辣)的人声音分贝都下降一大截。 + +![](https://image.wsine.top/35ffd0d50511677dbde295284bfc67be.jpg) + +吃饱喝足后往大马路走走,会来到这座城市的中轴线「弥敦道」,也是港乐中一首传唱度非常高的同名歌曲。往尖沙咀的方向一直走,感受这座城市的车水马龙。你会遇到九龙公园,看似是一个平平无奇的街心花园,里面的湖泊竟然还栖息着火烈鸟。 + +![](https://image.wsine.top/4c13e6c64833b1cbdc20775d71973958.jpg) + +这条路的终点,是以前我们总能在 TVB 上看到听到的颁奖地点「星光大道」。在星光大道上有一块纪念牌匾依据年代及次镶嵌排列着杰出电影工作者的芳名与掌印。虽然晚上可能看不太清晰,但走走这条大道,也有一种久违的亲切感。 + +### 维多利亚港 & 天星小轮 & 中西区海滨长廊 + +星光大道边,便是「维多利亚港」。走累了坐下来休息一下,看看海,来个小甜点吧。停在「尖沙咀钟楼」附近的「富豪雪糕车」是个不错的选择,软滑香甜,价格亲民。 + +![](https://image.wsine.top/2e6992f7bee33bfc9899db3f6ceb6cce.jpg) + +若恰逢晚上八时,「幻彩颂香江」灯光秀便会上演。璀璨的灯光从对岸铜锣湾、中环的摩天楼上闪烁开来,而你的耳边却响起动人心弦的乐曲,与灯光的节奏完美契合。你面前的这湾海水分割着港岛与九龙,但香港的精神却并不会因此被分隔开。这是一场两岸共同完成的演出,精密的合作让人赞叹不已。 + +看完演出,你或许也好奇从海的对岸看这边是怎样的一种体验,那么,乘坐「天星小轮」去港岛吧!只需 3 元,你便可以吹着海风,拥有美妙平稳的航海体验。 + +![](https://image.wsine.top/f5dc66c3d2c08df3766fa0e9ec49267c.jpg) + +渡船的终点站是中环,若是你喜好热闹,那么走两步路便可到「兰桂坊」享受美酒派对。若是你更偏爱安静且有生活气息的地方,那么你可以直接沿着码头向前走,沿着「中西区海滨长廊」去偶遇椰子树、柴犬、街头艺术家,和练瑜伽的人们。「中山纪念公园」在这条长廊的中点处,这里和海对面的西九龙公园遥相呼应,走到这里可别忘了给对岸拍个照~ + +--- + +很高兴来到香港这里读书,让我的世界观广阔了不少。我知道因为之前的社会运动,这里的风评变差了许多。但是,这片土地上同样孕育着无数的热爱祖国的人民。疫情时代很快就过去了,这里借用一首歌曲《一水两方》表达我们内心的希冀。 + +一水将两方分隔 / 好好一个家但是谁又舍得自立 / 矛盾就地忘记吧 / 冰释永未晚大地回暖 / 候鸟总会归返 diff --git a/content/posts/use-typst-for-resume.md b/content/posts/use-typst-for-resume.md new file mode 100644 index 0000000..552047e --- /dev/null +++ b/content/posts/use-typst-for-resume.md @@ -0,0 +1,165 @@ +--- +title: "使用 Typst 制作简历" +date: 2023-12-13 +--- + +# 使用 Typst 制作简历 + +制作一份优秀的简历是每一个毕业生都需要经历的过程,而海投企业是目前比较实际的一个求职策略。但是,随着就业市场的竞争日益激烈,为不同的企业定制一份相性更高的简历变得尤为重要。然而,对于许多同学来说,维护多份不同的简历可能是一项比较困难的任务。 + +在本篇文章中,我们主要围绕制作简历这一具体需求,聊聊现有简历制作方案中的问题,并介绍一款全新的工具来帮助大家更轻松地制作一份专业的简历。 + +## 现有简历制作方案的不足 + +### Word 简历 + +Word 或许是大家脑海中第一反应的通用版本工具,网络上也有很多 Word 制作的简历模板,比如 Microsoft 365 本身自带的创意媒体网站也提供了大量的精美模板。虽然在易用性上 Word 基本做到了领先,但是 Word 文档的编辑和保管却是一言难尽。 + +![](https://image.wsine.top/a3df0d152899980ad049e4a81a1e1bb7.png) + +不透明属性。Word 基于 XML 的底层做布局并实时渲染于它的编辑器上,这样带来的一个好处是用户不必学习底层的布局语言,直接通过 GUI 编辑器的按钮下达指令去调整排版。但是同时也有由于这种不透明的编辑对底层布局的影响,常常让人们做修改的时候需要小心翼翼的,生怕错误改动一处地方后无法复原原来的格式。 + +![](https://image.wsine.top/14fbd3f1bac70fd7723355f0aaab6eb4.png) + +比如上图中的第一个段落,在底层的布局中是两个文本对象,如果不仔细观察,一并选择且更改了,将很难恢复到它原来的样式。 + +版本管理。Word 的版本管理相对来说并不友好,最被人们熟知的大概是「初稿.docx」到「终稿打死也不改 v3.docx」这一脍炙人口的案例。 + +![](https://image.wsine.top/5e086dabddbff71e831743bd3276e91d.png) + +但是在海投的过程中,我们往往需要根据特定的企业,定制一份专用的简历版本。比如上文的 Skills,会根据企业的用人需求,润色和强调不同的技能点。在 Word 中往往需要保存多个版本,且很难在不同版本之中复用原有的文字。 + +### Latex 简历 + +Latex 是理工科的同学较为熟知的一款排版工具,其基于纯文本 + 编译的工作方式也很好地克服了 Word 的不足。但是,Latex 背后的编译过程较为复杂,严重拖慢了纯文本部分的编辑,降低了整体的体验。 + +![](https://image.wsine.top/28e0fe86e055382412ec9b4cf742f362.png) + +较慢的编译速度。Latex 需要在每次保存的时候重新编译生成 PDF 才能看到更改的内容在产出文件中的变化。想要经常看看最新的排版效果的话,每次都需要等待上几秒,但正是这断层的几秒,会打断思维的连续,使得整体的编辑输出不连贯。 + +错综复杂的布局语法。Latex 还有一点广为诟病的是它的语法非常晦涩难懂,也导致了使用上需要大量的宏包来封装才能稍微降低语法的复杂性。 + +![](https://image.wsine.top/b2bf50776329e32a00e8c580e0f3ab22.png) + +上面的模板中使用了上图所示的布局语法,如果不翻阅大量的手册,实在是无法直观地理解每个字段想要表达的意思。 + +难以解读的 debug 信息。另一方面,在编译出错后,Latex 的错误信息总是让人摸不着头脑。Warning 信息充斥着大量的 Latex 模板,Raw logs 信息也难以阅读,更难以准确地定位错误的位置。 + +![](https://image.wsine.top/0f34c2eefd7395e7553fdb212f89e7df.png) + +在这种情况下,大家往往需要一系列的 Trial and error 来试图解决问题。而这个方法,却又被上面提到的较慢的编译速度所严重影响,编辑体验就会一落千丈。 + +### 在线简历制作系统 + +网络上有很多制作简历的在线系统,能让你输入自己的经历,然后选择模板,生成一份精美的简历。但是,由于简历本身的属性包含了大量的个人信息,而这些在线系统往往都是不是大型公司出品,因此隐私安全成了这一类方案的最大顾虑。 + +![](https://image.wsine.top/845ff105a74a9b42bb0ea9535bb29ded.png) + +## Typst 方案的优缺点 + +Typst 是一款专门为排版而生的新生代工具。它完全摒弃了现有系统的约束,着眼于现代化的功能与设计,成功地克服了传统方案上的一些不足之处。 + +跨平台的编译器。Typst 主要使用 Rust 开发,能够生成各大平台的可执行程序,然后被下载到本地离线使用,从而保证了隐私安全。 + +另一方面,Rust 以其优秀的内存管理和运行速度所闻名,得益于此,Typst 的编译速度非常快,同时也给它带来了第二个优点。 + +所见即所得的编辑体验。Typst 能够做到如同 Markdown 一样的所见即所得编辑体验,得益于此 Trial and error 的过程也会被大幅度得缩短,因此从编辑体验上来讲算是大幅度进步了。 + +![](https://image.wsine.top/cbeb7d18d3cfbd7fb632870cfc46fa6c.png) + +纯文本的文档。Typst 的排版也是基于纯文本编译生成 PDF 的方式工作的,就像是我们熟知的 Markdown 排版工具一样,用其特定的文本语法来约束排版方式,最终生成稳定的排版效果。 + +而纯文本的方式正好克服了上述 Word 的两大弊端,可以通过注释的方式临时地将一些内容隐藏掉从而生成一份简历版本,也可以通过 Git 工具对文本做差分和版本管理。 + +相对简洁的语法。由于 Typst 摒弃了现有 Tex 系统的排版规则,重新设计了一套全新的规则,使得它可以从一个新的起点来规避一些已知的排版难题,下图就是一个直观的对比两者的语法差异。但不可否认的是,新的语法也带来了新的学习成本。 + +[https://cdn.sspai.com/2023/11/17/0b0033dab9eb41a02cedc866f3fc79b5.png](https://cdn.sspai.com/2023/11/17/0b0033dab9eb41a02cedc866f3fc79b5.png) + +相对友好的错误提示。相比 Latex 让人比较困惑的错误提示,Typst 能够诊断出具体的错误位置,错误信息相比 Latex 的 raw logs 来说也更符合贴近真实的错误情况。Typst 有 Language Server 的支持,能够在实际编译前就诊断出潜在的错误。 + +[https://cdn.sspai.com/2023/11/17/3e1ca32b62b5738f558b6d337df13390.png](https://cdn.sspai.com/2023/11/17/3e1ca32b62b5738f558b6d337df13390.png) + +## Typst 的实际使用流程 + +### 配置 Typst 的编辑环境 + +Online editor. Typst 官方提供了一个在线编辑器 [typst.app](https://typst.app) 供用户免费使用,等同于 Latex 在线编辑器 overleaf.com 的存在。在线编辑器需要上传资源和下载文件来交互,对于想要备份简历的同学来说不是很方便,但开箱即用的特点对于小白用户来说特别友好。 + +All in vscode. 把全部的开发依赖都交给 vscode 来管理是目前的一种流行开发范式。在 vscode 中需要下载两个插件:`Typst LSP` 用来给 vscode 提供智能提示,同时它也包含了 typst 的编译器;`vscode-pdf` 用来在 vscode 中实时预览生成的简历 PDF 文件。 + +安装完成插件后,在 vscode 的设置里搜索 Typst Export PDF 可以调整为按需编译 (onSave) 或者实时编译 (onType)。 + +![](https://image.wsine.top/1a908457ca2a36681000435fc4a44e9c.png) + +Advances. 对于高级玩家来说,他们比较喜欢用自己顺手的编辑器。编辑器 + 编译器 + PDF 阅读器分离能够做到最大的自由度,且重用已有的软件。 + +Typst 编译器的安装可以通过各大包管理器安装。 + +- Prebuilt:[GitHub Releases](https://github.com/typst/typst/releases/) (需要自行添加 PATH 环境变量) +- macOS:`brew install typst` +- Windows: `winget install --id Typst.Typst` +- Linux:可以参考[这个页面](https://repology.org/project/typst/versions)上面的安装信息 + +PDF 阅读器要求能够根据文件的变化刷新 PDF 的显示,macOS 下自带的「预览 app」可以自动刷新,Windows 下可以下载一个 [Sumatra PDF](https://www.sumatrapdfreader.org/free-pdf-reader) 。Linux 下的桌面环境我比较少接触,需要大家自行探索。 + +一个简单的编译测试可以自己新建一份空白文档 `main.typ` 然后在里面填入任意内容,在终端使用 `typst watch main.typ` 即可监视文件变动生成 PDF,生成的文件 `main.pdf` 在同级目录下。 + +### 使用 Typst 模板 + +站在巨人的肩膀上总是最便捷的方法达到一定的高度,我们制作简历也可以基于网上开源的模板进行修改,从一个布局设计精美的模板开始填入自己的内容。 + +在 GitHub 上有两个 awesome 项目收纳了很多 typst 的模板。 + +- [https://github.com/qjcg/awesome-typst](https://github.com/qjcg/awesome-typst) +- [https://github.com/typst-cn/awesome-typst-cn](https://github.com/typst-cn/awesome-typst-cn) + +下面就以里面的一个 CV 模板为例子([https://github.com/bamboovir/typst-resume-template](https://github.com/bamboovir/typst-resume-template))说说里面的一些重要文件。 + +![](https://image.wsine.top/b65fc622315519d470bf6ec91fee493b.png) + +使用 Typst 的模板非常简单,它就像是 HTML & CSS 之间的关系一样,一般来说能获得两份文件,一份是模板格式文件(template.typ),另一份是模板主文件(resume.typ)。剩下的一般是模板依赖的资源,比如图标和图片之类的。 + +最直接的使用方法是从 GitHub 克隆下来整个仓库,通过 vscode 打开整个文件夹,然后就能看到整个模板的全貌了。相比于 Latex 的模板,Typst 不用再安装各种隐藏的宏包,相当于下载了一份 Python 开源代码但不用再安装各种依赖的第三方库就能直接运行了。 + +### 定制 Typst 模板 + +各种简历模板总是在满足原作者的需求上被开发出来的,但是他人的需求并不总是满足自己的需求,因此定制化就成了制作简历里不可缺失的一环。 + +由于 Typst 的诞生比较晚,Typst 的原生语法相对 Latex 来说非常简单,没有了历史的包袱,Typst 语法语义化程度非常高。比如,我想要修改上面的简历增加 Publication 这个内容,需要两个步骤,「模仿」和「创造」。 + +![](https://image.wsine.top/e7eb565ab69f744021f87ce4c1082952.png) + +模仿。第一步是参考模板原来的格式,类似于 Education 和 Skills 这些,划分出一块区域来存放 Publication 的信息。只需要模仿模板原来的语法就可以了。通过直觉分析 `block` 和 `pad` 两个函数都是控制边距的,而 `xxx_item` 是一个函数传入内容本身。所以很容易就能得出 `publication_item` 的函数。 + +```typescript +#let publication_item(publication) = { + set block(above: 0.7em, below: 0.7em) + set pad(top: 5pt) + + pad[ + #resume_statements[#publication] + ] +} +``` + +创造。第二步是根据自己的需求,选定一个格式,想办法把它创造出来。比如,我这里想要填写文章发表的内容,因此最好的格式应该符合 [1] 这种样式的列表形式。在创造的过程中,我们需要大量参考 Typst 语法的[参考文档](https://typst.app/docs/reference/)。但是不用担心,由于 Typst 的语义化程度非常高,很快就能摸索出来正确的写法。 + +```typescript +#enum(tight: false, numbering: "[1]")[ + *Koelemay, L.A.*, Gold, K.R. & Ziurys, L.M. Phosphorus-bearing molecules PO and PN at the edge of the Galaxy. Nature 623, 292–295 (2023). https://doi.org/10.1038/s41586-023-06616-1 +][ + Richman, E.B., *Ticea, N.*, Allen, W.E. et al. Neural landscape diffusion resolves conflicts between needs across time. Nature (2023). https://doi.org/10.1038/s41586-023-06715-z +] +``` + +可以看到,Typst 的语法非常简单,#enum 写一个列表,任意数量的 [] 表示列表元素,甚至能通过 "[1]" 的用户输入格式自动推导目标样式,同时也有类似于 markdown 的 ** 的简洁加粗语法。未来可期。 + +![](https://image.wsine.top/0a8c540e9470871744ea85b30cecfb9c.png) + +## Typst 的体验分享 + +总结一下,Typst 作为新生代排版工具,我认为未来必然会有一席之地。软件体积小巧,多平台支持,高效的编译速度,无须第三方包的设计,是它克服了同行前辈的不足后所闪光的优点。不足之处在于,Typst 的语法仍然需要一定的学习成本,或许未来会有更好的编辑器提供图形化的排版设定。 + +对于使用场景,我认为目前对于非出版类的写作和排版需求都可以胜任,甚至做得更好。比如,简历制作,开题报告,基金申请等。但是,对于需要出版的文章,比如学术文章,书籍等,我认为还需要经历时间的沉淀。根据我的观察,不少出版商(如计算机领域下的 IEEE 和 ACM)都还没有在他们的投稿指引网站上提供他们官方的 Typst 模板。相信未来官方支持后,网络上 Q&A 社区的问题和解决方案也会变得更丰富。 + +如果你厌倦了 Word 的低效版本管理或 Latex 那恼人的重复编译,不妨来试试这个能让你耳目一新的 Typst 吧。