Featured

为自己,为别人,准备一条路

本文会不定期更新,以反映当前推荐。最近更新:2020 年 3 月 7 日

我很想给这篇文章起一个更符合它本意的标题,却因为担心被过滤而放弃。写这篇文章的时候,也在绞尽脑汁绕开各种形形色色的不可说的词汇——这个列表现在是越来越长了。这种荒诞一个月来每个人都感同身受。任何一篇看上去有意思的文章,都要抓紧时间看,因为下次点开的时候很可能只能看见一个红底感叹号。

无庸讳言,这次国难的严重后果与信息的封锁不无关系。我们见证了传统媒体在这次事件中的集体失声——老实说,这并不令人奇怪,由于种种原因,他们本来就在缓慢走向死亡。自媒体业已成为大众获取最新信息的首要通道——而我们却见证了新的中国速度:文章被撤的速度。我想,这或许应该成为一个无关政见的共识:保证每一个真实的声音都可以被听到,对于避免这样的灾难至关重要。

互联网刚流行的时候,人们说:在网上没有人知道你是一条狗。现在我们可以说:你永远不知道那头看你的文章不爽要拿掉的是不是一条狗。如今形势有如「南蛮入侵」,反贼要挨一刀,忠臣也要挨一刀,会不会掉血,全凭运气。无论是否拥护建制,都应该承认,为了自己,也为了所有人,我们需要一条通畅交换信息的道路。

然而,尽管「南蛮入侵」已经无法让任何人视而不见,我见到的绝大多数人却仍然只依靠两微一条获取信息。甚至于极其重要的信息,如警讯或者呼救,也都以两微截图的方式进行流传。在中国,移动互联网极其彻底地改变了所有人的信息获取方式。而以两微一条为代表的中心化互联网服务,正是信息封锁的重灾区。讽刺的是,正是在这样的平台上,以截图形式流传的信息反而成为了谣言的温床。

很多人又一次喊出「逃离 XX」的口号,而私以为大部分人并不能做到。社交网络服务天然具有集聚性,我们总是使用我们的朋友所使用的服务。切换到新的平台不仅需要克服自身的懒惰,还需要说服自己的朋友,这太难了。

然而,我们总还是可以做点什么。从今天开始,为自己准备一些 Plan B,让自己再次被迫噤声的时候可以发出自己的声音,让敲钟人敲响的钟声可以被更多人听到,这些并不那么困难。虽然还是需要少许时间来注册一些服务——自由永远是有代价的。

谨在此呼吁每一个为今天的局面感到愤怒的人花一点时间做做下面的事情。当自己辛辛苦苦写了几小时的文章被删掉的时候,当自己看到很好的文章却转眼消失的时候,当自己遍寻真相而不得的时候,花一点时间去行动。每个人都这样做的话,情况就会不一样。

不必一次做到最好,挑选每一项中自己自己最容易做到的立刻去做,并不花费多少时间。世界就是在一点一分的努力中变好的。

  • 一、保证自己有至少一个科学上网的梯子,这是下面几乎所有措施的前提

  • 二、保证有至少一个备用联系方式,以防自己被删号后联系不到朋友:
    Facebook、Twitter、Whatsapp、Telegram、Signal、Keybase、IRC 甚至电子邮件都可以
    电子邮件推荐使用大陆以外的服务商。有精力的话可以熟悉一下 PGP 或者 S/MIME 邮件加密。
    就人气来说前三个用的人更多一些,但大公司并不那么值得信任。
    如果注重安全和保密,推荐 Signal 和 Keybase,尤其推荐后者。
    Telegram 的功能较多,用户群体现在也不少,安全性凑合,是个比较中庸的选择。

  • 三、保证有至少一个备用的公开信息发布渠道
    独立博客、Matters、GitHub、Facebook、Twitter 都可以

    • 我把独立博客1放在首位,因为自己控制一切才能保证不会被删除。这里我所说的独立,是指自己拥有域名,拥有完全的掌握权。为此可以选择自建服务器,也可以使用 GitHub 搭建博客。无论使用 WordPress 还是 GitHub,相应教程网上都有很多
      如果觉得独立博客搭起来太麻烦,也可以使用博客托管商,但不要使用任何大陆博客托管商——覆巢之下安有完卵
      境外著名博客托管商基本都墙掉了,所以也不大推荐。目前 wordpress.com 的 IP 疑似已经解封但何时再次封禁尚不确定。
      同样,不要使用任何国内域名注册商的域名注册服务
      服务器在境外的小型博客托管商如 Bitcron 等因为流量较小大概一段时间内不会被墙,也可以考虑
    • GitHub 被墙的可能性暂时是比较小的,不架网站而只使用普通的 md 页面展示甚至于用 issue、gist 来发布信息也是不少人的选择
    • 其它三个选择现在都已经被墙,国内的朋友比较难读到。其中 Matters 拥有号称永不删除的特性,如果对「文章永不磨灭」有强迫症的话可以考虑
  • 四、保留至少一个备用信息接受渠道
    熟练使用 Google 搜索信息
    使用一个 RSS 阅读器订阅自己喜欢的博客
    虽然传统严肃媒体正在死亡,但还是应该选择几个自己信得过的传统媒体,记住他们的名字和网站。或者使用新闻聚合服务进行订阅
    维护自己的境外社交网络帐号以应不时之需

如果读者不仅有对抗 censorship 的需求,还有匿名的需求(谁也不想去讲「不能!不明白!」是吧),那么在发布和传播这些有匿名需求的信息时还需要注意以下事项

  • 不要使用任何实名制服务
    包括所有大陆互联网服务
  • 隔离常用帐号和备用帐号,使人不能发现关联
  • 学习和使用加密技术

这篇文章旨在呼吁大家立刻从可以做到的事情开始行动,故不作深入讨论。对于互联网时代的个人安全防护,将另文详细讨论。

系列文章

为自己,为别人,准备一条路
预防封号:备用联系方式的选择
告别删文:在哪里写博客?


  1. 为避免与通常说的独立博客的定义相混淆,我在后续文章中将此概念名之为自主博客 
Featured

欢迎访问我的新博客

本站还在持续施工中。本文也会不断更新。

原来的博客虽然是四站同步,现在要么网站倒了了,要么墙了,要么没人看了,要么难以访问。开新博客的计划也在越来越没人写博客的大背景下一拖再拖,而到如今。

然而有几件事促使我终结拖延,重新开站。一是 atreides 所说的「不写空疏的东西,但有所可言时便写出来。信息污染的一个原因就是愚蠢的人说太多,睿智的人说太少。」确实,在这个互联网正在日渐死亡的年代(我知道一定有人对此感到奇怪,我自己关于此的文章尚未写成。有兴趣的读者可阅读霍炬的大作 互联网完蛋了,已经),仍然信奉开放自由互联网的人,倘连这点麻烦也不愿意去做的话,互联网只会凉得更快。从某种角度说,这是我们对互联网社区尽的一点微小的义务。

博士毕业于九十年代的导师那天又一次劝我们建个人网站:‘If you don’t have a website, you don’t exist!’ 在这个互联网正在崩坏的年代,这句话听起来太有「古道」了。虽则在欧美学术界这个信奉「古道」的圈子,这句话还是相当有效的。

另外也要感谢加鱼俨思在架博客这件事上对我的督促。没有她们,我一定会拖更久。

原有的几个博客的博文中尚有些价值的基本已经迁到本站,没迁的也就不迁了。原有博客也就不再更新。虽则在中国特色国情下,同步一些东西到微信公众号大概还是不免的。原来博文所描述的一些内容有许多已经时过境迁,不再有用,但原文也就不删了。

这里就不附原来博客站的链接了。墙正在日益加高,重现当年「但凡链接到某墙外网站的网页一律墙」的措施也并非不可能。我还想这个小站多活两天。当然,这不会是我重启博客写作之后的唯一一个站点。和我熟的人,在看到我的马甲站时,自然会知道那是我。出于同样的理由,本站也不直接链接到墙外网站,包括朋友们的博客。敬请朋友谅解。有些不方便说的话,还是去马甲站上看好了。

我在一篇新博文中谈到了「自主博客」的概念,我很高兴这个小站是一个自主博客,也推荐所有愿意写点东西的人去开一个自主博客。

欢迎使用 RSS 订阅本站。本站的除全部博文外,各个分类也都提供订阅。在任意文章列表页面的网址后加 feed/ 即可获得订阅地址。

我习惯不断修订文章以维持信息最新,同时保持原文地址不变。而不是有新东西的时候重新发一篇博文。我承诺会尽力维护这个站点保证每个永久链接都长期有效,可以放心用超链接进行引用。

另一个我的坏毛病是,我喜欢在整理发表旧笔记的时候把日期倒填为笔记记录的时候,而不是发上博客的时间。这是一种对于时间记录的强迫症。

可惜的是,对于上述各种更新,使用 RSS 都是不能接受到文章更新的。现在暂未开放邮件订阅的注册。如果读者有需求的话,或许改日会开放。

passkey 指北

什么是 passkey

Passkey 的官方中文翻译是「通行密钥」,这实在不是个好的翻译。本来推广 passkey 的几大公司起这个名字,是和 password 相对应,password 是「用于通行的口令」,那么 passkey 就是「用于通行的钥匙」,简单好记。但 password 的中文已经约定俗成翻译为「密码」,「密钥」又另有所指,不得不起了这么一个蹩脚的翻译。四字短语永远会在广泛使用后有一个两字的缩写,不知道假以时日,会不会有人用「通钥」来简称 passkey。不过以今日中文网站对 passkey 的冷漠,这一天即使有大概也很遥远。

言归正传。天下人苦密码久矣。这些年有些时兴的 passkey 是又一波试图「消灭」密码的浪潮。

所有人都痛恨用户名-密码验证:总是记不住用户名、密码,试错几次锁帐户……每个月总有几次这样的时候让人想摔电脑。如果还有双因素认证,输完密码还要再输个验证码,人就更暴躁了。什么时候才能让这种证明「我是我」的过程不那么痛苦。

前些年国内网站在逐渐使用短信验证码来替换密码登录,可短信这个东西,仅作为一个验证手段都嫌不安全,作为唯一的登录凭据使用,简直是把脑袋挂在手机上。它成为中国主流的验证方式也是「自有实名制国情在此」。相对而言,公钥私钥验证,在密码学上早已成熟,在实际应用中久经考验,几十年来都被人认为是取代密码的最佳方案之一。在 SSH、PGP、PIV 卡等应用上,公钥认证已经广泛使用很多年。但是在网站登录上,由于易用性的原因,尽管已经有很多免密码登录的业界标准,却一直没有推广开来。

2022 年,Microsoft Google Apple 三大操作系统提供商,以及 Chrome Firefox 浏览器终于开始一致行动,推广免密码登录。虽然本质上是新瓶装旧酒,底层方案仍然是久已有之的东西,但一个好名字显然有助于推广,这个新名字就是 passkey。这之后,支持 passkey 登录的网站慢慢多起来。

Passkey 的目标不仅是取代密码,还要取代传统的两步验证(2FA)。对于两步验证,或者多因素验证来说,登入帐户需要两个凭证,一件是「用户知道的」,比如说密码,一件是「用户持有的」,比如说硬件密钥或者手机。如果有人偷了用户持有的东西,但是不知道密码,自然无法访问。如果有人偷窥到了密码,或者恶意软件记录了密码,只要没有把第二凭证拿到手,还是无法登入。Passkey 既然要取代两步验证,安全性自不能降低,还是要证明用户已经出示了两种凭证。

打个比方来说明一下什么是 passkey :一个网站或者其它需要验证身份的服务(relying party)(RP)要求用户出示某种凭证来证明身份:

军营前方,一骑快马奔来,军营守卫大喊「来者何人!」。如果用密码的话,来使在马上大喊「天王盖地虎!」守卫回去一看,好像确系皇帝所约定的暗语,于是放行。没想到使者见将军之后一剑刺死将军,大笑三声:「你们天天都是同一个口令,早就被我们密探听得一清二楚!」

如果使用 passkey 的话,只见来使从背后抱出一个沉重的密码箱,左拧右拧,露出一半虎符,将军让守卫传上来,和自己的那半虎符一对,严丝合缝,「果然是真使者!」

虎符只是个比方,实际使用的是更为安全的公钥私钥认证。在前述比喻中,实际发生的是:用户使用 PIN 或者指纹、面容解锁 passkey 设备(也就是上面比喻中的密码箱)之后,passkey 设备使用密码学上的公钥认证向 RP 发出证明:「兹证明,某用户在我这台设备上使用 PIN 解锁成功(既然您对我这款设备熟,您应该知道我只有在用户物理上持有我这台设备的时候才会发出证明,那个啥,第二因素认证就一并免了吧?)」。于是 RP 一方「收到,放行!」

如果要买个特制密码箱(passkey 设备)才能使用 passkey 的话,就不会有几个人用它了。老套的 OTP 验证之所以这两年来获得普及,就是因为在手机上装个 authenticator app 很方便,不需要 U 盾或者动态口令牌之类的专用设备。这次 passkey 的卷土重来,正是三大操作系统提供商陆续在操作系统层面加入了对 passkey 的支持:passkey 不再需要是某个专用设备,而可以是我们已经在使用的手机或电脑。既然手机电脑本来就需要 PIN 或者指纹解锁,又基本不离身,为什么不用作 passkey 呢?这次三家的联合推广使 passkey 成功破圈,以至于在绝大部分第一次听说 passkey 的人眼中,passkey 就是 iPhone 或者 Android 手机上的一个新功能。而那些专门的硬件设备如 Yubikey,在网站上愤愤不平地说:我们十几年前就可以当 passkey 用了!

相对于传统的用户名密码登录,passkey 无论是安全性和便捷性都要好很多。从安全性上来说,网站被拖库不会影响到用户的帐户,因为攻击者没有用户的私钥,即使获得网站数据库也无法假冒用户登入。从便捷性上来说,用户不需要记忆每个网站的密码,只需要记忆解锁 passkey 的密码,记忆负担大大减轻。十分建议本文读者尝试一下 passkey 登录:用过就回不去啦!

passkey 设备

粗糙地说,你可以把 passkey 设备看作前面比喻中的密码箱,而 passkey 就是密码箱里的虎符。(虽然 passkey 标准说,如果这个虎符没有放在密码箱里,而是随便什么人都能掏得到,它就不可以叫 passkey)由前所述,passkey 设备既可以是手机、电脑,也可以是一个单独的硬件密钥如 Yubikey。前者无疑比后者更便捷,因为手机每天都带在身边,但后者在抵抗网络攻击的安全性上更胜一筹。

Passkey 设备的安全性全系于它如何保护用户登录网站的私钥。如果 passkey 设备感染恶意软件,内部存储的私钥有可能会泄露。专门的外置硬件密钥一般无法被恶意软件感染,安全性更高。

不过,即使是手机、电脑,安全性也没有那么差。一般来说,现代操作系统会使用硬件安全模块来加密用户的私钥。这样的话,至少在用户设备关机之后,只要攻击者没有同时偷到解锁用的 PIN,不能解锁设备,私钥就是安全的。也就是说,一般情况下,已经关机的手机即使丢了也不需要担心。这方面 Windows Android iOS MacOS 没有太大的区别。实际中更可能遇到的风险是,设备在开机状态下感染恶意软件,比如说在访问恶意网站时受到感染。通常来说,恶意软件需要破坏操作系统的完整性才能隐藏输入 PIN 或指纹的弹窗,这种攻击比较困难,但并非没有可能。好在,网络攻击也遵守经济原则。这种「能偷到所有人电脑上所有 passkey」的漏洞的价值极高,攻击者一定会在漏洞被修复之前争分夺秒地攻击高价值目标。只要及时接受操作系统的安全更新,风险是可控的,普通用户不必过于担心。如果安全风险很高的话,三大操作系统厂商不会愿意联手推动系统内置 passkey 普及。

仅说理论上的风险的话,root 过的设备的风险远大于没有 root 过的设备,Windows Android 因为用户广泛,每年被利用的漏洞也多于 MacOS。而外置硬件密钥则还没有软件上被攻破的记录,只有侧信道攻击。这样说来,十分重视「绝对安全」的人,还是应该选择外置硬件密钥。不过,安全性也和线下的风险相关。手机一丢,立刻就会发现,而硬件密钥丢了,却未必见得会马上发现。

passkey 认证各方

其实,如果要把手机电脑当作 passkey 设备用的话,并不是只有操作系统提供的 passkey 功能可选。许多密码管理器也加入了对 passkey 的支持。如果我们说,passkey 的核心是这个「让用户输入密码或者按指纹之后就用私钥完成认证」的东西,它其实是个在 passkey 设备上运行的软件,在标准中称作 authenticator。如前所述,用户希望登入的网站或者 app 那一边,则叫作 relying party。

Passkey vs 密码管理器

如果不谈外置硬件密钥的话,完全基于软件的 passkey 和传统密码管理器相似度很高,所以传统密码管理软件也在纷纷加入 passkey 功能。假设某帐户同时提供密码和 passkey 登入选项,面对攻击时,用密码管理软件所管理的密码,会比 passkey 更安全吗?下面分情况讨论不同的威胁:

  • 如果网站数据库泄露,所谓的被「拖库」。原则上来说,存储在此网站的所有数据都不算安全,我们只关心我们的其它帐户是否有危险。如果使用密码管理器为每个网站设置单独的强密码,一样可以保证其它帐户的安全。Passkey 的更长的密钥长度在实际中不会有什么区别。可以认为两者在面对这类威胁时同等安全的。一定细究的话,passkey 有更好的防呆设计。如果用户在使用密码管理器时故意为不同网站设置同样的密码,密码管理器拦不住用户这么做。而 passkey 则完全不存在这个问题。
  • 如果用户选择将密码库和 passkey 同步到云端,当云端服务被攻破,且加密密钥泄露,无论哪个方案都会导致所有网站帐户陷入危险。攻击者可以很容易地枚举所有帐户并一个个登入。
  • 钓鱼网站。当攻击者仅仅在用户计算机以外设立了一个钓鱼网站,密码管理软件和 passkey 的 authenticator 都会校验 RP 一方的域名是否是正确的域名,都可以靠 HTTPS 防范中间人攻击。但如果用户的机器已经感染恶意软件,浏览器已经被篡改的话,两者都无能为力。
  • 如果讨论计算机已经被恶意软件感染的情况,事情就比较微妙了。相当一部分传统计算机安全专家认为一旦计算机已经感染恶意软件,一切全完。这种「全或无」的想法在实际中未免有些绝对。
    • 对于传统密码管理软件来说,对于运行于本地计算机的恶意软件的防范比较有限。但许多密码管理器都做了不同程度的防护:浏览器插件配对需要用户确认以免恶意软件冒名顶替,使用模拟键盘自动输入密码时乱序输入来防范 key logger,复制密码到剪贴板之后会定时清空剪贴板,解锁密码库时需要操作系统层面的 FaceID 或者 Windows Hello 授权,凡此等等。具体的实现每家密码管理器各不相同,需要仔细选择。
    • Passkey 相对来说,攻击面要小一些,passkey 根本不可能通过键盘输入,也就无需防范 key logger 和监听剪贴板的恶意程序。但仍然有一些攻击点:如果恶意软件冒充浏览器向 passkey authenticator 发出请求的话,它并不认证浏览器的合法性,而是依赖用户在输入 PIN 或者使用 FaceID 的时候察觉是否有不对劲。所以,即使伪装浏览器,恶意软件还需要有能力绕过操作系统的 PIN 或 FaceID 弹窗才能在用户不知不觉的情况下瞒天过海登入帐户,如前所述,这个难度并不低。有的用户不仔细看系统弹窗的显示内容,稀里糊涂就扫脸通过,那就很麻烦。
  • 设备被盗被抢。两者的情况大差不差。Passkey 是强制每次使用都需要解锁,如果使用 PIN 来保护 passkey 的话,在公共场合使用的时候容易被人偷拍到 PIN。而如果用 FaceID 或指纹的话,在被暴力胁迫时会直接解锁设备。而密码管理器也好不到哪里去,虽然提供了一些设置的灵活性,但如果设置每次输密码都要校验 FaceID 的话,就和 passkey 一样;如果一次解锁一直可用的话,如果设备在开机状态下被抢,直接就是裸奔。哪种更好,就要看你是认为自己的设备容易被附近的人在你不在的时候偷偷干点什么,还是更容易被人盯上之后蓄意抢走,还是……

总的来说,passkey 更标准化一些(虽然有很多非标实现),理论上来说更防呆。而密码管理器的可选设置选项更多,适合根据自己的 threat model 来定制。最坏情况下,在十分漠视安全的用户手中,密码管理器肯定更不安全。在最审慎的使用情况下,passkey 的安全性要略好一些,比如说完全免疫剪贴板监视程序。

而如果选择使用外置硬件密钥作为 passkey 设备,会比操作系统或密码管理软件提供的 passkey 功能更安全一些,相应地在便捷性上会有一些取舍。

passkey 类型

在目前的 passkey 推广过程中,即使是几家主要的厂商也常常对于他们是如何部署 passkey 验证语焉不详。如果对于安全有强迫症一样的追求的话,搞清楚「这家用的 passkey 到底有多安全」不是个容易的活。

反之,如果你只想要一个「比密码更安全的,用起来省心的登录方法」,大可以跳过此节,直接开始使用 passkey。

discoverable credential 和 non-discoverable credential

其实 passkey 只是 FIDO2 WebAuthn 换了个好听的新名字。对于 FIDO2 WebAuthn 来说,有两种凭证:discoverable credential 和 non-discoverable credential。以前叫作 resident key 和 non-resident key。现在说的 passkey,严格来说,应该只是 discoverable credential。不过也有一些网站比如说 Google 在管 non-discoverable credential 叫作 passkey。

就实际使用体验来说,discoverable credential 理论上连输入用户名都可以免掉。因为用户名、网站域名连同私钥一起存储在 passkey 当中。而 non-discoverable credential 则需要输入用户名之后再进行认证,passkey 设备本身并不存储该网站的登入用私钥。

简略而说,两者的工作模式是这样的:

  • 对于 discoverable credential,用户在网站选择使用 passkey 登入之后,网站会向 passkey 设备发出请求,设备检查自己是否存有该网站的登录凭证,如果有的话,就调取内部存储的私钥进行签名认证,没有就拒绝认证。如果有多个用户名的话,浏览器会提示用户选择其中一个用于登录。
  • 对于 non-discoverable credential,认证过程很像 FIDO U2F(虽然 U2F 通常用于 2FA 而非 passkey)。用户需要先输入用户名,网站调取记录,找到一段数据,将这个数据包发给 passkey 设备来进行下一步。这个数据(key handle)是和前述 discoverable credential 认证过程中的最大的不同点。它不仅仅包含网站的域名等信息,还包含用户私钥信息!不过它被 passkey 设备的公钥加密,只有 passkey 设备的私钥才能解密,所以网站无法读取或篡改其中的内容(这里说的 passkey 设备的私钥是它的 master 私钥,每个 passkey 设备上的每个 authenticator 只有一个,而非每个网站有不同的私钥)。这个数据解开之后,passkey 设备使用其中的数据重建「该网站认证专用」私钥,再以该私钥签名认证。如果仅仅用作第二因素认证的话,整个过程并不强制要求用户验证 PIN 。但如果是用作免密码登录的 passkey,用户必须要先输入 PIN 或者指纹解锁 passkey 设备,之后 authenticator 才会执行认证。

由上可见,discoverable credential 需要占用 passkey 设备的存储空间,而 non-discoverable credential 不需要。对于手机这样的设备来说,存储密钥所占的空间可以忽略不计,而对于 Yubikey 之类的外置硬件密钥来说,存储空间有限。5.7 版固件之前的 Yubikey 只支持存储 25 组 discoverable credentials,到底把这宝贵的 25 个槽用在哪些网站上就得琢磨一下了。

这两种认证方式的另一个区别是,最坏情况下,当 passkey 设备丢失,且 PIN 泄露,也就是说攻击者可以完全控制 passkey 设备时,攻击者可以直接枚举 passkey 设备中存储的所有 discoverable credential,然后逐一登录用户的每一个帐户。相反,攻击者完全无法获知这个 passkey 设备到底在哪些网站上注册了 non-discoverable credential,更不知道用户名,想控制用户的网络帐户还需要再花一番功夫。也就是说,在最坏情况下,用户有更多的时间去做亡羊补牢的工作。

遗憾的是,对于绝大多数网站来说,用户并没有选择到底是使用 discoverable credential 还是 non-discoverable credential 的自由,只能使用网站所提供的选项。

设备绑定的 passkey 和可以跨设备同步的 passkey

对于 passkey 认证来说,最核心的是用户的私钥。不同的私钥存储方式安全性不同。

最安全的私钥存储方式是:私钥在 passkey 设备上创建并只能在 passkey 设备上使用,永远不能离开 passkey 设备。这样做的缺点很明显:如果设备丢失的话,这个 passkey 就没了,需要使用其它方式登录后再创建一个 passkey。如果买了新手机,想在新手机中设置 passkey 的话,每个网站都要重新来一遍。

因此 FIDO2 标准并不禁止 passkey 设备将私钥传到云端。目前苹果设备上创建的 passkey 都会上传到 iCloud Keychain,而 Android 设备的 passkey 默认都会上传到 Google Password Manager。这样做的优点是用户买了新手机之后不需要重新设置,所有网站的登录凭证都自动下载下来立刻可用。但风险也因此增加:任何一个设备被攻击得手,所有存储于 iCloud Keychain 中的 passkey 都会泄露。整体的安全性等同于任何同步了私钥的 passkey 设备中安全性最低的那一个。比如说,如果手机端每次使用 passkey 都需要 FaceID 但 Mac 上只有开机的时候才需要验指纹,使用 passkey 的时候不需要的话,那么这个网站帐户的安全性就等同于它在 Mac 上登录时的安全性——也就是说任何人在 Mac 开机的时候偷走你的 Mac 就可以登入你的帐户 例子 。对于最重要的帐户,也许不要传到云端为妙。

目前 Apple 和 Google 默认都使用云端同步。而微软一方较为谨慎,Windows Hello 创建的 passkey 默认只存储在本地。

至少在目前,iCloud Keychain 无法在 Android 设备上使用。这带来了一点小麻烦:如果想在 iPhone 和 Android 上都使用 passkey 登录同一个网站,需要在两台手机上分别创建 passkey。一个办法是使用第三方密码管理器来同步 passkey,比如说 1Password,LastPass 和 Bitwarden,它们都同时支持 iOS 和 Android。但这些密码管理器并非操作系统组件,更容易被恶意软件攻击。

与此相对,外置硬件密钥提供了另一种思路:虽然密钥本身不同步到云端,但可以把硬件密钥插到不同设备上使用。使用 Yubikey 这样的硬件密钥,只需要在登入的时候把 Yubikey 插到(或者贴上)正在用的手机就可以了。因而,它既提供了最强的安全性,同时也提供了操作系统 passkey 所欠缺的一点跨平台同步的便捷性。

混乱的命名:passkey 和 security key

严格来说,只有 FIDO2 中的 discoverable credential (DC)才能称为 passkey。然而实际上,包括 Google 在内的网站依然将 non-discoverable credential (NDC)称为 passkey。所以遇到 passkey 一词时,唯一能确定的是,它是一种基于 FIDO2 WebAuthn 的免密码登录方式,可能是 DC 也可能是 NDC。

Security key,严格来说,指的是外接硬件密钥,它们可能支持 FIDO2,可能支持 U2F,也可能只支持老旧的 PIV 标准。这里的混乱要更大一些:在 Google 等许多网站中,security key 被特指为「使用 FIDO U2F 方式提供 2FA 认证的硬件密钥」。如果这个密钥可以被用作免密码登录,就会被改称为 passkey。也就是说,在这些网站上所称的 security key 是实际的 security key 的一个真子集,且和作为 passkey 使用的 security key 在使用场合上完全无重叠(虽然物理上可能是同一个设备)。比如说在 Google 帐户中,同一把 Yubikey,可以同时被登记为一把用于二次验证用的 security key 和一把用于免密码登录的 passkey。

另外一个定义上的混乱是,passkey 到底指的是存有 passkey 的设备(比如说手机、Yubikey)还是里面所存储的私钥?在实际中,passkey 常常模糊地指代两者。既可以看到「将手机用作 passkey」这种描述,也会看到「创建 passkey」这种描述。如果按前者,手机是 passkey,如果按后一种,手机里存储的私钥才是 passkey。准确地说,手机是 passkey 设备,里面存储的私钥是 passkey,而管理认证过程并存储 passkey 的软件,如前所述,是 authenticator。但在不致引起误解的前提下,将 passkey 设备和 authenticator 称作 passkey 似乎也没什么关系。

实际 在大部分网站中
手机、电脑里存储的 passkey 是 passkey 被称为 passkey
硬件密钥作为 2FA 凭证使用时 是 security key 被称为 security key
硬件密钥作为 passkey 设备使用时 既是 passkey 设备,也是 security key 被称为 passkey
设备中存储的 NDC 凭证 不是 passkey 可能被称为 passkey
任何使用 DC 免密码认证的设备 是 passkey 被称为 passkey

对于普通用户来说,没有必要搞清楚这些名词的区分。不过对于一些较真且在安全性上不愿意妥协的用户来说,本来这些网站在描述 passkey 时就常常语焉不详,这些名称上的混乱进一步增加了搞清楚问题的难度。

passkey 使用

本节可能会随各网站对 passkey 的支持情况而更新。最近一次更新于 2024 年 10 月。

可以用作 passkey 的设备

Windows

Windows 10 和 Windows 11 现在把 passkey 功能内置到了 Windows Hello 里,操作系统可以创建和管理 passkey。解锁 passkey 时可以使用 Windows Hello 所支持的任何 Windows 登录凭证,如 PIN,指纹等。

当在 Windows 设备上需要绑定 Yubikey 等外置硬件密钥时,需要注意弹出的提示到底是 Windows Hello 还是 Yubikey。通常 Windows Hello 会先弹出来,点击取消之后才会询问是否要绑定 Yubikey。使用外置硬件密钥来登入帐户倒没什么坑,不会有 Windows Hello 跳出来干扰。

iOS 设备

iOS 也已经支持 passkey 的创建和管理,系统创建的 passkey 会同步到 iCloud Keychain 中。在支持 passkey 登录的网站创建 passkey 之后,所有 iPhone iPad Mac 都可以用同一把 passkey 登录。支持使用 PIN,FaceID 或 TouchID 解锁 passkey。

iOS 设备的 Safari 似乎不能为外置硬件密钥创建 passkey,但使用外置硬件密钥登入帐户的体验是很丝滑的,无论是用 NFC 还是 USB 接口。偶尔在系统更新之后会有一些问题,比如说 iOS 18.1 就有许多人反映 NFC passkey 不好用。

Android 设备

Android 同样已经支持创建和管理 passkey。系统创建的 passkey 会同步到 Google Password Manager 中。不过 Google Password Manager 曾经有许多十分糟糕的安全设计,在密码管理器当中只能算三流产品,不知道以前的老问题现在是否都已经修正。

同样,Android 系统也支持使用外置硬件密钥。

Yubikey 等外置硬件密钥

任何支持 FIDO2 的硬件密钥都可以用作 passkey。不过,它们只能存储有限个 discoverable credentials。

固件版本 5.7 之前的 Yubikey 支持 25 个 passkey,5.7 及之后的版本支持 100 个 passkey。目前的冠军是 token 2 的 PIN+ Release2 系列,支持存储 300 个 passkey。最新的 Google Titan Security Key 支持 250 个 passkey 但并未提供删除替换旧 passkey 的功能,所以不一定好用。当然,这里说的 passkey 都是 discoverable credential。对于 non-discoverable credential,如前所述,则没有数目上的限制。

支持 passkey 登录的网站

passkey.directory 可能是目前最全面的 passkey 支持网站列表,对于一些网站还有当前支持的情况说明。

下面汇总一些常见网站设置和使用 passkey 的体验,会比 passkey.directory 写的详细一些。

Microsoft

在操作系统御三家中,Microsoft 对免用户名密码登录的支持最早,也最全面。不过很长时间里一直在测试,时灵时不灵。目前来看已经比较完善可用,对于各种 passkey 设备都有所支持。微软只支持 discoverable credential 登录。即使在当年 Yubikey 只能作为 2FA security key 使用的时候,也会创建一个 discoverable credential。如果当年已经将 YUbikey 作为 2FA 凭证登记,之后会自动升级成 passkey。

如果要使用 passkey 登录,登入时不可填写用户名,而需要点击下方的 Sign-in Option 按钮,再选择「Face, fingerprint, PIN or security key」。

综上,微软对 passkey 的支持最为规范全面,几乎没有什么坑。总结:只支持 discoverable credential,不需要输入用户名,支持所有类型 passkey,支持所有浏览器。

微软旗下的不少网站,如 GitHub 等,对 passkey 的支持和微软自家网站相当。

Google

Google 对 2FA security key 的支持很早,但 passkey 功能上线之后有相当长的时间里这个功能极度混乱。目前 Google 的实现也是比较奇怪的。

如果使用操作系统内置 passkey 功能创建 passkey 的话,Google 应该创建的是 discoverable credential。而如果使用 Yuibkey 作为 passkey 设备的话,大部分情况下会创建 non-discoverable credential,虽然也有人说他们创建了 discoverable credential 但我从未成功过。什么时候是 discoverable credential 什么时候是 non discoverable credential 有些难以捉摸。Google 应该是为数不多的可以使用 non-discoverable credential 进行免密码登录的网站。遗憾的是这并不是 Google 文档中明文提供的选项,所以这种行为并不稳定,实际登记 passkey 的时候到底发生什么就 YMMV 了。

在登录 Google 帐户时,免用户名登录的选项比较隐蔽。如果浏览器支持 passkey,当光标停在用户名输入框的时候,会有一个小下拉菜单「Use a passkey」。不然的话,在输入用户名之后还有一次选择 passkey 登录的机会。如果用的是 non-discoverable credential,只能在输入用户名之后才可以用 passkey 登录。

Google 也是主流服务里少见的允许用户将一把硬件密钥同时登记为 2FA security key 和 passkey 的网站,当然这样也没什么用。目前来看,似乎只有在很久以前就在 Google 帐户中登记的 2FA security key 可以和 passkey 共存。如果用最新的硬件和最新的浏览器,一把硬件密钥只能在 2FA security key 和 passkey 中二选一。

在今天,如果想把 Yubikey 仅用于 2FA security key 的话,办法是先禁用 Yubikey 的 FIDO2 功能,再作为 security key 登记(否则会被登记为 passkey)。

一些小提示:

  • 如果帐户中既有 2FA security key 又有 passkey 的话,有些环节的交互逻辑会有些令人迷惑:比如说,在已经登入帐户的情况下,如果要访问一些敏感信息,仍然需要再次验证密码或 passkey,此时 2FA security key 不可以用于验证身份,必须使用密码或 passkey。如果用的 key 仅注册为 2FA security key 的话,用户可能会对验证失败的结果有些迷惑。

  • 在 Google 网页上创建 passkey 时,如果使用 create a passkey 选项,则只能使用操作系统内置 passkey 功能。如果需要注册外置硬件密钥,需要使用 Use another device 选项。

总结:支持免用户名登录,对外置硬件密钥支持有些奇怪,支持所有类型 passkey,支持所有浏览器。

Apple

Apple 对 passkey 的支持是御三家里最迟缓的。很长时间里,苹果即使对于 2FA 也是坚持使用自家平台的验证码推送。对于 passkey 来说,苹果同样选择尽可能把用户困在自己的生态环境里。

目前,没有任何办法为 Apple ID 手工创建 passkey。使用 iOS 17 以上的设备登录 Apple ID 时,会自动为用户创建 passkey,这个 passkey 在设置中不可见,无法删除。

在使用浏览器登入 Apple ID 时,在输入用户名之后有一个使用 passkey 登入的选项,然后可以使用 iPhone 扫码登入。这似乎是使用 passkey 登入苹果帐户的唯一途径。目前不支持 Firefox。

苹果支持使用 Yubikey 作为 2FA security key 但不支持将 Yubikey 用作 passkey。更讨厌的是,目前用 Yubikey 做 2FA 也很令人痛苦:许多旧设备和 Windows 客户端、Android 客户端会被踢下来无法登录。目前在非苹果平台上的客户端,只有 iCloud for Windows 已经明确支持 security key,其它的支持状态仍然不明,许多人反映,一旦启用 security key,Apple Music 无法在非苹果平台登录。往好里说,苹果至少做对了一点:如果你希望用 security key 来加强安全性,那么所有更不安全的登录方式都必须被禁用。但苹果迟缓的的软件开发进度使得 security key 目前体验不佳。

总结:没有免用户名登录,只能使用苹果设备,无法绑定第三方 passkey,不支持 Firefox。即使是 security key 的支持也有很多限制。

GitHub

作为微软旗下网站,对 passkey 的支持是一流的。如果之前已经把 Yubike 登记为 2FA security key 的话,在创建 passkey 时会提供「升级」为 passkey 的选项。在 Firefox 上,这个升级过程有一定概率出错,如果出错的话需要删除重加一下。和 Google 不同,同一把硬件密钥在帐户里只会显示为一把,要么是 2FA security key,要么是 passkey。

和其它微软服务一样,如果使用 passkey 登录的话,不要填写用户名,直接点下方的「Sign in with a passkey」。

总结:只支持 discoverable credential,不需要输入用户名,支持所有类型 passkey,支持所有浏览器。

Amazon

Amazon 对 passkey 的支持吧,说是不支持,它倒也支持。但这个支持实在是实现的脑洞清奇。

首先,amazon 对 passkey 的理解就很成问题。它的帮助文档里认为 passkey 「仅仅」是可以在云端漫游的 passkey ,所以你只需要一个 Apple 的,一个 Google 的,不需要更多了。视 Microsoft 和 Yubikey 为无物。虽然实际上也完全可以用 Windows Hello 和 Yubikey 绑定 passkey 。

其次,amazon 无法使用 passkey 绕过 2FA。passkey 只能省去输密码的麻烦,形同一个密码管理器(参见上文,可能它的技术团队真的觉得 passkey 和你把 amazon 密码存在 iCloud Keychain 里没什么区别)。如果你的 amazon 帐户开启了 2FA,那么你每次登入 amazon 需要解锁 passkey 之后再输入 2FA 验证码。这纯属脱了裤子放屁。2FA TOTP 验证码唯一的作用就是证明用户持有一个可以生成验证码的设备。如果按 amazon 的理解,passkey 就存在手机上,TOTP 也是手机上的 app, 多这一道手续不会增加任何安全性。

最后,amazon 创建的是 discoverable credential,但它依然要求输入用户名登录,无法实现免用户名登录。

综上,在 amazon 上使用 passkey 的唯一用途大概是「不输密码,避免被键盘监听软件偷密码」吧。

Adobe

Adobe 对 passkey 的支持也是比较奇特的。像 Google 一样,它在登录的时候在输用户名的地方有一个下拉框可以选择 passkey,此时只能使用 DC 登入,而输入用户名之后,还有一个使用 NDC passkey 登入的按钮。不过我只成功地创建 NDC passkey,不知道它到底支持不支持创建 DC passkey。

和 Amazon 一样,用 passkey 登入 Adobe 时不能跳过两步验证,登入过程十分麻烦。

最后,它甚至不提供为 passkey 重命名的功能!如果 passkey 丢失之后想删除的话,大概只能把所有 passkey 都一股脑删掉了帐。

总的来说,这个支持确实很差,和 Amazon 一样,唯一的用途就是「不输密码」。

NVidia

NVidia 对 passkey 的支持很早,但支持很奇特。登录的时候必须选择“Login with Secure Device”,之后可以用 passkey 免用户名登录,却仍然需要输入 2FA TOTP 验证码。

总结:使用 discoverable credential 支持免用户名登录,但仍然需要 TOTP 验证码。

Passkey 支持十分糟糕的网站

有一些网站,说是支持 passkey 吧,确实是支持的,但有些致命的问题。

  • CVS: CVS 的网站做的奇差无比。它只能登记一把 passkey 且不提供删除 passkey 的选项!你最好指望你的 passkey 永远不会丢……

Apr 10 2022 digest

为什么停更

说来好笑,这个博客之所以停更,原因很简单。首先是我拖延症,那篇 中文互联网上严肃讨论的消失:不同用户眼中的过去与未来 其实只是一篇「上」,还有一篇「下」,一直没开工写。原定「上」主要是关于21世纪头10年在大学里的人,「下」是21世纪第二个十年进大学的人,然而我拖延症严重,一直没有完成。

与此同时,还攒了一堆其它的笔记没发。等到我终于无法接受我自己的懒惰,准备跳过那永远没有完成的「下」的时候,很不幸地发现,用来同步 GitHub 上的 markdown repository 和WordPress 的插件在 WordPress 大版本升级之后坏了!这就更给了我拖延的借口。

直到前两天才打起精神,认真 debug 了一下那个插件,修好了它。不过修好之后我才意识到,好像我原来是有转到 org2blog 的打算来着,恐怕这修完了也用不了几次。

更新:它又坏了,而我又懒得研究 org2blog 。于是又停更了好久。

更新:我又修好它了!是时候把积的一些东西发出来了!2024 年 9 月 10 日。

杂七杂八

CloudFlare tunnel 真好用!

Cloudflare workers 真香!

预告或者说立 flag

有几个系列的笔记可能会整理整理丢上来。

一个系列是关于 Yubikey 与 GPG 的使用。
一个系列是关于电子邮件的方方面面:加密邮件、域名邮箱、自建邮件服务器,等等。已经发了一篇加密邮件的。
一个系列是 Home Assistant。

整理好之后,仍然会倒填一个当初记笔记的时间作为博文的发表时间。

近期更新博文

整理了两篇去年写的。

美剧基地观后感

关于 ProtonMail 及其它加密邮件服务的看法

使用 SyncPlay 和异地朋友一起看电影 有一个小改动,补充了现在官方提供 Watch Party 功能的网站。

其它更新博文

以下博文是在博客停更之前就悄摸摸搬运的旧博客或者草稿箱里的文章。都是几年前写的,大部分没有什么特殊的趣味。

浅谈便携多功能工具选购——瑞士军刀与莱泽曼钳的对比

Zotero 英文界面下中文字体异常的原因和解决办法

漫谈那些年用过的词典软件

我为什么还需要相机——写在买了 GX85 之后

美剧基地观后感

本文讨论的是 Apple TV+ 播出的美剧「基地」。

我并不反对电影制作的时候考虑政治正确。像迪斯尼那几部失败的作品,失败的原因更多的是想兼顾的东西太多,一群人的不同意图拼凑出来的作品自然很难是好作品。
以此而言,本剧中虽然很多隐喻仍有生硬植入感,比如说 Gael 的长篇身世背景设定并没有使这个人物变得丰满,而只使人感到何不食肉糜——想来创作者既不认识几个数学家,也没真的在因宗教而拒斥科学的落后社区生活过。而对 Salvor 的设定,更贴近美剧中常见的脸谱型人物,就显得驾轻就熟,女性黑人又怎么样呢?
上面的评论不像好话,但实话实说,在一众强调政治正确的影视中,此剧已经算最不坏的,远好于迪斯尼旗下近些年一些恶评如潮的电影如「黑豹」之流。

阿西莫夫的原作虽然被期待多年,但稍想一想就知道,影视改编是一个烫手山芋。像指环王一样直接忠实于原著进行影视化是几乎完全行不通的。基地毕竟不是银英。
在原作的框架下进行天马行空的再创作是一件好事。而本剧大部分出彩的地方,尤其是试图捆绑政治正确的改编中所有的出彩点,都是脱离原著进行的再创作。

本片的再创作基本上将基地这系列硬科幻变成了软科幻。挂着一个基地的名号,内里已经换了个干净。如上述,这并不是一件坏事。基地本就不能原样搬上荧屏。对于这些再创作,我抱以宽容的态度。不如将其看作一系列或古或新的寓言好了。因而对于片中种种不科学的地方,大可一笑而过。
克隆三帝共治这个设想颇有趣。虽然我不喜欢木星上行这部电影,但其中的青春永续与时间交易却是为数不多的亮点。三帝衣着和举止对罗马帝国的想象式模仿恐怕并不只是美国人的新罗马情结,这里有许多隐喻可以挖,只是看多了美国太空歌剧的观众恐怕已经有点疲劳,懒得挖下去了。

所以说到最后,这是不是一部好的科幻电视剧呢?或许我的标准有些苛刻。一部并没有提供新的东西的作品无法激起我的赞赏。它将基地原作的设定只留下一些概念,而近乎完全放弃了这些概念推动情节的作用,塞入一些庸俗的美剧套路,同时也放入一些政治正确的改造,埋放的隐喻大多不新鲜,但也有几点小的创新令人觉得还可以追下去。但我不得不说,本剧的艺术设计真的很棒!建筑和音乐都很出彩,渲染出一种史诗感——虽然本片的内容恐怕架不住制作者想表达的这种史诗感。

对 ProtonMail 及其它加密邮件服务的看法

这段时间在考察几个比较有名的加密邮件服务商,本文系把自己的笔记简单扩充而成。分成两部分,第一部分以 ProtonMail 为例讨论了目前加密邮件服务的问题。第二部分简单对比了一下几家著名的加密邮件服务商。

以 ProtonMail 为例讨论加密邮件服务

引言

很多注重隐私的人正在逃离 Gmail 这样的大公司服务而转向更重视隐私的加密邮件服务商。然而,固然这些服务商在降低加密技术的使用门槛上做了很大努力,也的确使得它们的服务相对于传统邮件加密工具显得更加平易近人,但使用者如果盲目信任它们而以为使用它们就完全安全,因而疏于防范,很可能会使自己陷入真正的危险中。尤其是对于某些不希望公权力侵犯自己的通讯隐私的人来说,这种虚幻的安全感可能更加危险。

端到端加密不是银弹

恰当地实践端到端加密总比喊口号更重要。而这不能只靠服务商来完成,也需要用户的参与。

Trust on First Use (TOFU) 是端到端加密的一个重要问题。对于任何端到端加密来说,第一步交换密钥是最为脆弱的时间,需要慎重验证密钥究竟是对方的真实密钥还是攻击者的假冒密钥,否则之后的所有安全就无从谈起。对于大多数人来说,无法在频繁更换密钥的同时每次都认真校验对方身份,对于他们来说,长期使用的密钥会更加安全。
我们姑且假设 ProtonMail 用户彼此通信时它的服务端软件足够可靠,和站外用户互通 PGP 加密邮件时,是否要信任对方的公钥,就完全仰赖用户自己的小心谨慎。
进一步说,即使是两个 ProtonMail 用户之间的通讯,也同样面临 TOFU 问题的变种:如何知道对应的邮箱地址是对方的真实邮箱地址而不是钓鱼邮件地址?整个邮件通讯的安全也就完全系于「获得这个邮件地址」的那一瞬——如果是从某人的个人网页上获得,则整个通讯的安全性就不会高于那个网站的安全性(当然,可能那个网站本来就是假的);如果是在其它聊天工具中获得邮件地址,那么任何有能力控制该聊天软件的人都可以变造假的邮件地址。
相比之下,使用传统 PGP/GPG 邮件加密的用户大多对于 TOFU 的风险有所了解,彼此的互信也完全不依赖于邮件服务商的软件安全性。只是用户友好度远不及 ProtonMail。

ProtonMail 用户的私钥保存在他们的服务器上。对于安全极端在意的用户很可能并不放心。虽然 ProtonMail 用户的私钥使用用户的密码进行加密,理论上只能被用户解开。但是在私钥泄露的情况下,比如说 ProtonMail 迫于法院命令交出私钥后,离线暴力破解的难度取决于密码的长度和复杂度。因此 ProtonMail 的密码必须设置得足够长。

安全不是一个人的事

ProtonMail 仅在通讯双方都使用 ProtonMail 或 PGP 时可以提供理想的加密保护。

用于收信时,外站发信方如果不使用 PGP 加密,邮件内容将对诸多相关方(比如发信人的邮件服务商)可见。此时 ProtonMail 与任何普通邮件服务商无异,除了它对于权力方的数据披露请求会抵抗得久一点之外——然而发信人的邮箱依然会被权力方检查,这种抵抗很可能是毫无意义的。用于发信时,外站收信方如果不使用 PGP 加密的话,就只能使用 ProtonMail 的网页加密服务,在 ProtonMail 的网页中输入密码来提取邮件。对于大多数人来说这很麻烦不说,还需要使用 back channel 传送解密密码,这也不一定是可靠的。

如果说 TOFU 问题对于大多数人来说还不算个问题,因为大多数人并不担心公权力会盯上自己(虽然我并不同意这一点,mass surveillance 本身就是对公民权利的侵害),而更关心 Google 会不会用自己的邮件对自己进行用户画像。那么「邮件往来的另一复本并未被保护」使得后一种目标也难以实现。

可惜的是,自己使用 ProtonMail 很容易,说服朋友一起使用 ProtonMail 或 PGP 很难。拿 ProtonMail 做主邮箱的话,其实大部分邮件仍然是得不到保护的。

不谨慎使用 ProtonMail 可能遇到的风险

ProtonMail 可能向执法者交出哪些信息?如果收到瑞士法院的搜查令,ProtonMail 可以向法院交出如下信息:

  • 用户的登录 IP。
  • 用户与哪些邮件地址有邮件往来,及往来邮件标题。
  • 密码保护的用户私钥。如果用户密码可以被破解,则可以据此解密用户的全部邮件。

不谨慎使用 ProtonMail 可能遭到的攻击举例

  • 和自己通讯的人的地址是假的,攻击者在中间代理收发。
  • 没有隐藏自己的 IP,或者在有很多个人信息的地方发布自己的邮箱,导致肉身被有关方面定位。
  • 使用 ProtonMail 来接受材料,但发送材料的人未使用 ProtonMail。发送材料的人被定位并受到人身威胁交出通讯往来。
  • 使用 ProtonMail 给其它邮箱发信,将加密密码与加密邮件发到同一邮箱中。对于可以获得对方邮箱数据的有关方来说,这种加密形同虚设。
  • 行为触犯所在国法律及瑞士法律,密码设置过短,在 ProtonMail 配合法院交出数据后,密码被破解。
    这类例子还可以举出几十种。

如果极端看重邮件安全、匿名和完全的隐私保护,应该注意以下几方面

  • 注意验证通讯方的公钥和身份
  • 设置足够长的密码
  • 要求通讯对方也使用 ProtonMail 或 PGP 对邮件加密
  • 注意验证 ProtonMail 的邮件地址真的属于目标联系人,否则无法避免中间人攻击
  • 注意使用 Tor 隐藏自己的 IP
  • 注意不要在发布邮箱地址的信道(无论是个人网站还是即时聊天工具)中泄露过多个人信息

ProtonMail 的隐私保护实现所带来的使用不便

ProtonMail 与传统邮件客户端的互操作性很差,必须使用 ProtonMail Bridge 来连接第三方邮件客户端。而传统 PGP 或 S/MIME 加密都有广泛的客户端支持。

因为 ProtonMail 的服务器无法看到邮件内容,这带来两点不便:
ProtonMail 的服务端不支持邮件全文搜索。目前它的邮件搜索是通过在用户端进行索引而实现的。也就是说临时使用他人电脑时,无法在短时间内获得全文搜索。
加密必然意味着服务器端无法过滤加密垃圾邮件。虽然目前发送加密垃圾邮件的人不多,这还没有成为一个现实问题。

同样,从 ProtonMail 发出的加密邮件也无法被目标邮件服务器的反垃圾引擎检查。为了避免自身被列入垃圾邮件黑名单,ProtonMail 对于发信有苛刻的标准,每日发送邮件有限额,帐号注册也有很大限制。

从很多年前开始,从外网发到中国境内的加密邮件就有很大的概率掉信。这不是 ProtonMail 的问题,而是任何加密邮件的问题:只要收信人的邮件服务器在中国大陆,就难以通邮。这也是我建议所有朋友至少持有一个服务器在大陆以外地区的邮箱的原因之一。

所以使用 ProtonMail 没有意义吗?

不,虽然我上面列举了很多 ProtonMail 的缺点,我绝不认为使用 ProtonMail 毫无意义。相反,我推荐朋友们使用 ProtonMail 这样的加密邮件服务。

当我们选择加密邮件服务的时候,我们常常以为它可以同时提供安全、隐私保护、匿名等所有需求。本文意在破除这种幻想。但很多时候,只要在某一点上比已有的主流服务强,就值得我们考虑使用。我们也并非所有时候都需要绝对的隐私和匿名,而会为了沟通的便利而牺牲一些隐私和匿名。比如说,严格来说,越经常被使用的联系方式,越不可能做到完全的匿名。而用于期刊投稿、找工作之类的邮箱,更是与我们的线下身份完全绑定。

在合理使用的情况下,加密邮件服务至少可以让各种想看到我们邮件内容的人挠头,无论他们是广告系统、小至公司大至政府机关的各类监视系统还是一些有偷窥欲的人。达到这个目的并不难。
真正困难的是彻底匿名的需求,加密并不必然带来匿名。虽然大部分人都想要一定的匿名性,但考虑到实现它的巨大代价,大部分人最终会放弃彻底的匿名。

总结

综上,对于没有经验的小白来说,ProtonMail 固然带来了更佳的安全性,但小白也往往因此忽略了其它安全措施,像许多 Telegram 的使用者一样,因这种虚幻的安全感而降低了防御心,反而对自身带来更大的危险。
而对于有经验,懂技术的人来说,ProtonMail 并不是必须的。Tor+Gmail+GPG 就可以提供足够的安全性——甚至更安全。

它最有用的场合是:对于不愿意配置 PGP 加密的通讯双方,在使用可靠的方式认证彼此的身份后,双方约定都使用 ProtonMail 通讯。然而在这种情况下,它并不比 Keybase、Signal 之类的端对端即时通讯更方便。本来 Email 的一大优点是互通性,不像即时聊天工具,必须要求通讯对方也一起注册。但 ProtonMail 在与非 ProtonMail 用户通信时,配置端到端加密的门槛仍然不低,它的易用性与互通性仍然不可兼得。注册一个 ProtonMail 并不比注册 Signal 更方便,所以很多人干脆选择 Signal 之类的聊天软件。

特别危险的一点是,若作为个人主力邮箱,兼用于注册各种网站,ProtonMail 将完全无法实现「匿名性」。除非在各种网站上完全不暴露 IP 地址等个人信息(然而,这非常难),否则权力方很容易通过合并诸多网站上的信息获知此邮箱地址主人的肉身信息。届时,权力方只需要强迫与此邮箱地址通信的其它邮箱服务商交出邮件数据,邮件往来就无所遁形。这里的权力方不仅仅是公权力,也包括手握大量网站数据的互联网巨头。

综上,ProtonMail 基本上只适合个人通信,最好和其它 ProtonMail 用户通信使用。也可以用于有经验的 PGP 用户和加密邮件新手之间的加密通讯。
本文的大部分观点也适用于 Tutanota 等其它端到端加密邮件服务商。

加密邮件服务商概述与比较

综述

以下所有服务商对私钥的管理都是一样的,都是选择将私钥存在服务器,使用用户密码进行加密。也就是说仍然是 Web 优先,牺牲一点安全性。

如果对此很在意,想自行保管私钥,这些服务商都不能用,而只能用前文提到的,使用 PGP 之类的协议进行邮件加密。这些工具一般被认为用户友好性欠佳。如果想实现和 ProtonMail 一样的 Web 界面操作,可以使用 Mailvelope 这样的浏览器插件。如果这样做的话,就不得不使用 Gmail 的之类的大邮件服务商,插件的支持才会比较好。
PGP+Mailvelope+Gmail 这一方案的优点是密钥更加安全,缺点一个是少了同服务商网络内的默认加密,一个是收到的外站未加密邮件不会被加密存储。

前面已经讨论过,由于收发邮件的另一方使用加密邮件的极少,无论使用加密邮件的目的是为了保护自身隐私,对抗 mass surveillance,还是单纯讨厌互联网巨头,我们都很难靠自己一个人的努力来使自己更安全。在多大程度上倚重加密邮件,是否努力向周围朋友宣传使用加密技术的意义,是非常个人的选择。

虽然一般来说,加密邮件服务商都努力实现端到端加密,这样即使被执法人员要求交出数据,用户的损失也有限,但由前面所讨论的,我们仍然不希望这种情况发生。所以服务商所在的国家也是一个重要的因素。一般来说,最不可信任的是某些法律上公民隐私保护很差的国家,然后是著名的五眼联盟,这些国家的邮件服务商面临的法律风险和监视风险比较大。目前欧盟国家在隐私保护上的信誉要好一些。

很多人认为,开源的邮件服务商更值得信赖。

ProtonMail

上文已作详细讨论。服务器在瑞士,是对于隐私保护最好的国家之一,依法院命令交出用户数据的情况极少。
客户端代码开源。

Mailfence

比利时的一个邮件服务商,主要用户在欧洲。

代码暂不开源。可选 PGP 加密,而非强制。相对于 ProtonMail 功能要多一点,支持 POP3 IMAP,想来与普通 PGP 邮件在客户端的互操作性要好一些。

Tutanota

德国的一家加密邮件服务商。

客户端开源。使用 AES 和 RSA 加密,而非 PGP。这样它无法和其它 PGP 用户和 PGP 邮件服务商互通信,从而进一步限制了它的使用——基本上只有 Tutanota 用户之间的邮件可以有比较好的加密保护。完全不支持 IMAP。

mailbox.org

和 Mailfence 定位相近的一家邮件服务商,在德国。

可选 PGP。对于各种客户端支持良好。

中文互联网上严肃讨论的消失:不同用户眼中的过去与未来

一系列关于消逝的 BBS/论坛时代的问答。问答内容并非逐字引用,有加工、重构和虚构。感谢五位不愿意具名的朋友的贡献。

引言

这几年来,许多朋友都感到在中文互联网上,严肃讨论正变得越来越稀缺1。一方面,再难有过去的论坛/BBS 那样的有人气的可以进行长文严肃讨论的平台2;另一方面,在如今有人气的各种平台上,只输出立场不交流观点,不好好说话,一言不合就拉黑正在成为常态。对于这种现象,有许多人作过论述。然而,当我和朋友讨论起来的时候,发现对于这件事每个人都有着不同的看法,我并未见到任何一篇文章全面讨论了我朋友眼中的这些因素——我想,假若扩大范围的话,我们一定可以找出更多意想不到的看法。因而我放弃了写一篇系统性论述的打算,而决定将和这些朋友的讨论稍作加工直接放上来,希望读者能从中自行寻到有趣的材料。知乎「朱近野」的这篇有趣回答 中文互联网的产出在渐渐枯萎吗?——朱近野的回答 也启发了本文,所以本文使用问答对话体。

这篇访谈主要关注几个问题:

  1. 中文互联网上的严肃讨论是否濒于消失?大概这点我和大部分我的朋友观点相仿,在问答中就只重点讲不大同意这种看法的人的意见好了。
  2. 中文互联网上可以进行严肃讨论的社区为什么消失了?对于这点,不同朋友给出了非常不同的观察和理解。
  3. 现今的平台是否适合严肃讨论?为什么?
  4. 如果第 2 问中的原因无法得到解决的话,那么预期我们是不可能重建一个适合大众的严肃讨论社区的。然而,有没有办法在小圈子内重建一个严肃讨论的平台呢?

大概因为我自己更想看到问题的希望所在,所以在第 4 点上反复叨扰朋友问个不休。这篇问答似乎可以另起一个标题「严肃讨论社区为什么死?我们怎么重建它?」。起现在这个标题其实是有些大的,但我很想听到大家对于这个大标题的各种看法并补充到本文中,所以标题就不改了。

读者如果有什么想说的话,欢迎在评论中留言,去 GitHub 对 本文 发 Pull Request。如果您有意贡献您的观点,可以联系我。您可以选择自己写完整个问答,也可以约个时间我们聊一聊。我的邮箱是 xw 四十七 @indiana.edu (将数字替换为阿拉伯数字即可)。现在特别希望和没有经历过 BBS/论坛时期的朋友们聊一聊他们怎么看待严肃讨论的需求的。

您可以自由转载和引用,只要在转载引用时加入本文链接即可。本文会不定期更新和修订,如果您希望找到本文的历史版本,GitHub 上的 版本历史 可以帮到您。

访谈记录

朋友甲

关键词:举报

朋友甲谦谦君子,当年在论坛上口碑甚好,所有打过交道的网友都很尊重他。前些年遇到过网络暴力。因为和他在中文互联网的讨论气氛这个议题上有颇多共识,我们的讨论跳过了一些问题。


您曾经是一个重度 BBS 用户。现在对于 matters 这样的公共论坛则不以为然,觉得鱼龙混杂浪费时间。说到这点的话,我倒想起一篇十年前读到的关于网络社区文章,其结论大抵也还适用于 matters 这种公开网络社区。这篇文章说,一般来说一个有人气的网络社区一开始都是由一小群紧密联系的朋友们发动起来的,慢慢引起公众的注意力而有越来越多的人加入,后来者渐渐形成新的势力,原有创建者遂逐渐退出。随着原有核心的退出,讨论水化,最后解体。这大约可以解释您对于无准入门槛的讨论的不感兴趣。

不过,总还是有可能把当年的老朋友们叫过来讨论的吧? 那么是什么阻止了一个服务器在大陆之外的小众邀请制论坛重新把老朋友们集聚起来呢?

还是举报太厉害。现在即使知道对方是好人,也不敢深谈,万一哪天就被截图举报呢?
人文社科知识分子现在是不敢敞开说话了。

这个问题许多人的看法是:老一辈现在生活压力太大。年轻一辈已经没有使用论坛的习惯,您觉得对吗?

还是举报的影响大。年轻人再怎么习惯变了,毕竟人数很多,出一两个朋友还是不难的。

好吧,那不能搞成封闭论坛吗?虽然这样和互联网精神不符,但总可以保证安全吧?

有三个问题。第一个问题是,你朋友的朋友不一定是你的朋友。所以一圈圈邀请出去就可能出现奇怪的人。另一个问题是,现在的举报经常不是举报某个人,而是举报整个社区甚至通讯工具,说这个社区或者软件的使用者统统是反动分子。比如说鹅组事件中某人干的事情。由于这两点,封闭也不能保证安全。此外,还有第三个问题,要是举报给有司也就罢了,现在常常是举报给大 V,大 V 再发动一群人进行网络暴力。所以也就没有清楚的举报边界,什么都可能被举报并被打击。

我想,可以设想这样一种应对方法:1,开源的软件,分布式网站;2,每个群组施以较严格的限制,比如说必须少于 15 人,必须两两互相认识;3,如果 15 个人不够用,有新人要加的话,通过开新群组来解决,每个人可以同时处于不同群组中,可以将信息从一个群组转发到另一个群组,但是客户端可以自动将重复的消息进行去重。

这个应对可以解决一些你说的问题: 1,举报软件的话没意思,因为有的群组是正常群组(其实 Telegram 现在恐怕在某些人眼里已经是反动透顶了吧,所以也不一定真能解决);2,举报群组的话,他只能举报自己所在的群组;3,但是由于群组之间可以转发信息,信息仍然是可流通的。

不过搞成这么麻烦的话,怕是没多少人愿意用了。只能算是一种墨子与公输般的演练罢了。

是的。而且现在严查整个平台/软件的事就已经有了。所以还是博客好。认真写点东西,一次写清楚,其实比群聊更适合讨论严肃问题。

哎,如你所说,人文社科讨论现在是很难了。不过除去人文社科,总还有音乐、理工、小说、电影这些讨论圈子啊。

那些就安全了吗?就说讨论音乐吧,谁能保证哪天不讨论到某个香港音乐人的歌?谁能保证不被举报?
现在也就技术社区还能活着了。

是的,技术社区现在还是比较活跃的。我私以为程序员圈子还能存在社区,说不厚道一点,主要取决于两个因素:1,谁不爽了都可以很快搭一个;2,程序开发这块技术日新月异,不学习就要掉队。所以任何还想不掉队的人都需要利用最新的信息传播技术。

朋友乙

关键词:微信群,圈子稳定化,无意识选择

朋友乙在论坛上以潜水为主,但认识了许多重要的朋友。


您怎么看「为什么中文互联网可以进行严肃交流的论坛消亡了」这个问题呢?

我觉得一个很表面的现象就是论坛老人转到群里去了。早年是转 QQ 群,现在是微信群。

是的,我觉得导致这种转化的一个原因是一种封闭化,小圈子化的趋势,不想和新人纠缠。(参见我和朋友甲问答一开始所提到的核心成员退隐问题)某 BBS 后来大部分活跃成员大部分时间都在非公开版面活动了。但是选择微信群或者 QQ 群,只是因为懒吧?明摆着它们对于长篇讨论都非常不合适。

哎,微信群是挺不方便的。可能是靠论坛交友的人都老了,新人渐渐地不会用论坛交友了。就像我们这代人也不给杂志读者信箱写信交友了。

小朋友不喜欢用论坛是可以理解的。不过老人为什么转移到微信 QQ 上,怕是不能用每代人的习惯不同来解释了吧?

我觉得不是习惯不同,就是圈子稳定下来了。不再有那么强烈的要去论坛上寻觅新朋友的需求了。

需求是一回事,但我觉得微信群发长篇文字,分享资料什么的确实不方便呀。大家为什么愿意容忍这种不便呢?

对的,确实是不方便。
不过我想也未必是真的主观在「忍」,而只是一种无意识的选择。

我大概明白你所说的无意识选择的意思。大部分人的生活就是由一个个无意识的习惯构成的,刷朋友圈,刷微博,刷知乎,刷 BBS,都是这样。手里闲着没事就刷一刷。

是的。如果人生每一分钟做什么都要花脑子去想,那多累啊!

所以其实事情的开端可能很简单。先是加了微信群,然后因为每天都有刷微信的习惯,看见了消息就会去回一句。这时候还是两个都上。然后出于各种偶然原因,BBS 就上得少了。
像是我吧,自从某 BBS 某次升级导致 SSH 上站必须要设置一个选项,我就不上站了。我猜想很多人都和我一样,也许哪天忙起来了好久没开有 term 的电脑,也许换新电脑忘了装 term。不知道什么时候起,反正上站也没什么帖子可以看,就不上了。

是的,开始是版面缺失人气,接着有微信群之后上站不再是必须活动,最后各人出于各自的原因一个个就不上站了。
你还没有提到一个重要因素:人都是从众的。尤其是无意识行为,很容易被大众带着走。
就说微信群取代版聊吧,如果一个话题就是在微信群上起头的,那么不会有人再去版面发贴来讨论这个问题。

在版面发贴说一个「已经被微信群讨论过的话题」的话,好像是在明言有一个公众不能加入的小圈子。

是的。

在微信群取代论坛的这个过程中,我觉得访问便利性是一个很重要的因素。微信是假设人永远在线的,而且你永远需要看手机、看微信。虽然聊天本身并不是生活的必须品,但是看微信这个行为,对于大多数人来说已经被固化为生活的必需。而在已经有一个东西作为备份的情况下,上站就不是一件必要的事情。何况大部分 BBS、论坛对手机的支持并不好。想上站看个东西,还得打开电脑。

没错。像当初使用拨号上网的时候,上站很麻烦很不稳定,大家还是千方百计地去上,无论是学生还是已经有工作的人。可见麻烦也不是决定性因素。那时候就只能在 BBS 上找到聊得来的人。
而微信群备份了一个版面的活跃网友之后,有什么话想说,想让某些人听到,BBS 已经不再是唯一的途径。这时候,访问上的一丢丢麻烦,就会随着时间,一点点地减少愿意上站的人数。

但是,对于分享资料,沉淀过往讨论的精华之类的事情,微信群确实很不方便啊。

没有人否认这点。只是,当一个群里的大部分人都不再上站之后,这件事就已经积重难返了。你不可能把文章发到一个没有人看的地方。
恐怕你这篇访谈,写成之后也是要在微信朋友圈和微信群上发链接吧?
至于说沉淀讨论精华,这是一个纯粹活雷锋的事情。在 BBS 用户比较多的时候,出雷锋的机率还比较大。人气下来之后,就没有人愿意整版,标记精华了。

总结一下,您的主要观点是,用户的迁移更多的是一种无意识的行为。这不是一件令人开心的事情,但事情就是这样发生了。也正因为大部分人的决定都是无意识的,大部分人只是别人用什么就跟着用什么,所以想复兴论坛就非常困难。

朋友丙

关键词:在学校的环境没有了;麻烦。

朋友丙在论坛上有过一群线上线下关系都非常好的朋友。


从你的角度看,您认为中文互联网社区为什么消亡了呢?

人人网如果没死的话还挺好的,算你说的社区吗?

人人网是社区,但日志评论显然对于长篇回复并不友好,所以并不是我想问的「可以进行严肃交流的论坛」。人人网上基于日志转发评论的交流大部分还是「点赞之交」,很难深入地讨论点什么。当然这个在微信朋友圈时代就更明显了。那么,您认为可以进行严肃讨论的社区为什么消失了呢?

流量,麻烦。

您真是言简意赅。只团结老朋友的小圈子社区不受第一个影响吧。您愿意说说什么叫「麻烦」吗?

老朋友离开校园之后,没办法固守封闭的校园论坛,而且上不去。不得不说,不做学生之后心态变化很大。

您提到了两个因素。第一个因素只能解释校园论坛的萧条。怕是您说的心态变化才是主要原因吧?大部分中国人并不像欧美人一样有大把的时间烧在业余兴趣上。尤其是有娃的人基本已经忙到没空考虑别的问题。

不是。有更多时间看电影之后,我只想看电影,不想写影评了。

因为懒得写了吗?

不是懒,是觉得有更多的电影需要看,不然影评没法写。此外,我还有一些别的兴趣,正在给自己写几本手册。

所以你的精神生活还是很丰富的,没有成为社畜,而是在走深入钻研的路线了?
但是我还有两个疑问没有得到解答。1,没有社交需求么?还是说有,但是觉得现有平台不能满足,就算了?如果现有平台不行的话,考虑过用别的方式维持社交么?

建平台讨论过,预计老朋友不会买账。在学校的时候,有 10% 兴趣重合的老朋友天天聚在一起,这种环境不存在了。

嗯,那么我把问题再细化一点吧。实际上这里有两种需求

  1. 老朋友的联系。大家其实并不在乎这些讨论是否可以让公众可以看到和参与。这样的话,邮件组可以很好地满足需求。并不需要折腾,我不太明白为什么老朋友会不买账。

  2. 基于同一个兴趣,和研究程度相当的人进行的深入讨论。这就需要是一个公开可搜索到的论坛,否则你无法加入别人的讨论,别人也不能发现你。当然,公开论坛搭起来就会麻烦一些。

我们先说第一个问题好了。考虑过建一个邮件组把您当年朋友聚起来吗?

绝对不可能,为什么要招人讨厌呢?

为什么这么说呢?

论坛可以选择不上,邮件不能不收啊。每天查工作邮件都烦死了。闲着没事去看,是享受;收到消息去看,是负担。

这其实是有解决办法的。设置一条邮件过滤规则,把邮件组的邮件都放到一个文件夹中。关掉那个文件夹的新邮件提醒,不显示在未读邮件列表里。这不就解决你说的问题了么?

让所有人都这么做一遍?我自己都懒得弄。

所以还是「麻烦」。

对。咱们在这里诠释「麻烦」呢。

好吧,第二个问题,对某个深入兴趣来说,您没有和人讨论交流的需求吗?

小众同好,国内本来就不多,还不如去国外论坛。

但总有一些小众爱好是只有中国人玩的。

唉,我完全没参与过这样的。

说到「麻烦」,举个不当的例子吧,我们前阵子组了个在线一起看电影的群。沟通协调,配置软件以同步播放进度什么的,按您的说法,也是「麻烦」呢。

个人体会,在国内,周围都是中国人,又拥挤,宁可少说几句话。
记得在美国短暂访问的时候,一个大气专业的朋友说要去沙龙上讲气候,当时我就想国内估计不会有这样的活动。

既然这个问答都是说汉语的人看,也许有人不明白什么是您说的沙龙,可以解释一下么?

这个不容易说清。是一种有组织的私人聚会。每次会有人讲个专题。我乍听起来是匪夷所思的,转念一想若是在美国待几年我说不定也去。

这种沙龙在什么条件下才会有,倒是一个有意思的问题。今天就先到这里。

朋友丁

主要观点:国家资本主义;即时回复工具的取代;一对一交流对论坛的取代

和朋友丁的这个对话还是很容易理解的,没有什么背景介绍需要补充。


我想采访一下当年的 BBS/论坛重度用户们,看看大家对于是什么因素阻止大家回到 BBS 或者新开论坛有什么看法。
您说,是什么在阻止大家重新开一个论坛把老朋友们都聚起来呢?

这个我还真不好说。感觉好多东西都在阻碍。

我个人感觉:1,很多讨论需要深化,更进一步的探索只能留给个人去做。比如我现在在读政治哲学的东西,这不是和以前小伙伴可以详细说的;2,大家都更忙了;3,太多言论禁区客观上也阻碍了它。

对于你的第三点,朋友甲和你观点相近,觉得举报太多。对于你的第一点,您也和朋友丙一样走向深入钻研的方向了。那么我们先谈这点吧,我可以把问朋友丙的问题重复一下:
1,在您新的探索路上,就没有社交需求么?还是说有,但是觉得现有平台不能满足,就算了?2,如果现有平台不行的话,考虑过用别的方式维持社交么?

论坛本身在我看来需要层级化推进。但目前没有论坛工具可以用。然后和专门人单独聊的话,大多数时候微信确实够用。

微信聊长篇是非常非常蹩脚的,不是吗?

可以语音啊。交流一些特定点和思路,然后工作继续自己做。

这并不是微信的特点嘛,没有微信的时候,我们也有电话、短信、寻呼机甚至信件。

对啊,视频和语音聊天。总之都有工具。所以以前有论坛的时候很多人上年纪也 BBS 玩得少。重要的工作可以附件传递。

好的,那让我们返回到第三点,举报和限制的影响。您所研究的政治哲学确实容易被举报。但是对于音乐电影之类的东西,为什么现在也不能有人办起来论坛呢?

电影和音乐口味更加分化。而且有豆瓣和网易云音乐等。

所以你的意思是,豆瓣和网易云音乐已经满足了大部分人的大部分需求,专门为了自己的这个爱好去折腾小众论坛的动力不足?

对。大部分人只要基础的。
哪怕是小众,也很多都是听和看,而不会专门去写什么。举个例子,其实现在还听碎瓜摇滚的人挺多的,更不要说爵士电音什么的。但是你开个摇滚论坛或者邮件组,是用来干什么的呢?
音乐和电影都更多是资源加对该资源的点评就好了。这显然不是小众论坛可以支持且存活的。并不会有太多听碎瓜的小朋友一起长篇讨论碎瓜。且人们对资源发言的表达欲很大程度上被弹幕和即时评论分流了。不太会说我在 A 处欣赏资源,再跑去 B 处专门写。

我想,弹幕、短评和长篇讨论向来就是两种需求,对吧?小众论坛的成本不高,为什么不几个人自己搞起来呢?

成本很高的。有监管,个人不能建论坛。大量翻墙上论坛也会有被抓风险。

这个还真不一定需要翻墙。建在境外的服务器并不一定被墙啊。比如说本文所在的博客就没有被墙不是?但是各地访问不流畅这个事没法,现在国际网就是越来越难上了。

是啊。

好的,访问困难这个问题就算讨论过了,确有一定的客观困难,也需要一点折腾。让我们再明确一下剩下的问题,多人讨论的需求不能满足怎么办。我在谈两种不同的需求

  1. 老朋友的联系。大家其实并不在乎这些讨论是否可以让公众可以看到和参与。这样的话,邮件组可以很好地满足需求。并不需要折腾。

  2. 基于同一个兴趣,和研究程度相当的人进行的深入讨论。这就需要是一个公开可搜索到的论坛,否则你无法加入别人的讨论,别人也不能发现你。当然,公开论坛搭起来就会麻烦一些。

我没有第一点需求,微信就够了。第二点的话,我一个猫群也可以聊中文和文化,基本日常小讨论够用了。而我真正严肃在做的东西,没人讨论。所以也是伪需求。我现在倾向于深度讨论是点对点的。尤其前沿或者基本没人做的东西。严肃创作,也更多是一个人的事。而且人文领域重要的是自己做成体系,要独自探索,不是在一个标准范式下讨论的技术论坛。

问题是,你怎么找到和你研究程度相当的人呢?靠熟人介绍么?这就是公开讨论区的意义所在啊!

看论文搜啊!从学科角度来说某个领域在做的就那么几个人啊。然后有价值的公号作为媒体发表就好了。

严肃研究也没那么频繁的讨论需求啊。

不需要频繁啊,一个月写篇文章丢到论坛上去也无妨嘛。

那这个有各个好的学术公号一直在做了。

学术公号的问题是,你很难去认真写个长篇回复。微信公号的评论区写长文并不方便。

要讨论直接发邮件给当事人啊。

好的,你重申了这种讨论更多是一对一的讨论,并不需要论坛。也就是说对于具体深入领域来说,你不认为有发现新朋友的需求。但这样的话,我还是会有一些疑问。比如说,你怎么发现学术公号?

因为可能我在我关心的领域有熟人圈。

所以你的回答是,做这种人文研究,不需要任何信息技术。在纸媒时代,靠熟人圈和期刊(学术公号也是一种变相的期刊,只是更加分散更不容易被发现),在互联网时代,你还是觉得有这些就够了。
这也是我在和朋友甲的讨论中说到的,为什么 IT 技术论坛永远存在的原因:因为这个领域日新月异。论文对于 IT 技术来说太慢太慢了。

对啊,因为我关心的领域好几十年没进展了。

看起来互联网社区的死活与否,对于你们没有影响。当然有的领域就不一样,以前有互联网社区,现在就退回到了熟人圈+期刊的倒霉境地。

我认为互联网社区主要功能是普及认知和推动公共生活的。然后技术论坛一直似乎都还有。所以我不知道你说的到底是什么社区萎缩到让人用不了了。

好吧,你说的互联网社区的主要功能为什么在中国不能存在我们都心知肚明。对于我说的倒了大霉的社区,让我举两个例子吧。

设若某种小众乐器的爱好者需要分享资料,讨论技术。你懂的,微信群用来干这事有多不合适。没有论坛的话,就倒退到熟人介绍+微信群+公号发布百度网盘资源。而如果运气不好没有熟人,可能永远也接不上组织。

说完反面例子,再举个正面例子。在家里玩模拟赛车是一个小众爱好,可能要配置环绕显示器、G 力座椅、直驱方向盘等等硬件。许多资深玩家都 DIY 过硬件。可以想见,新人入门需要看很多前辈积累的资料。好在现在还有 http://bbs.srfcworld.com/forum.php 这样的论坛存在。

你看,这种小众领域,论坛对于沉淀资料具有非常重要的作用。

啊,果然这是我完全不熟的领域。
那可以重新建论坛么?

这是个好问题,我没有答案。我是看到中文互联网社区衰败的现实,来问大家怎么看这一切发生的原因。

我看这个原因就是因为小众不赚钱,没大平台支持?
基本大家现在都是百度网盘存资料,公号或者微博定期更新,或者 lofter。

对,这其实效率蛮低的。我又想起一个例子,智能手机刷机的论坛早在刷机不再流行之前就已经黄得差不多了。

那是因为厂商打击。厂商不希望用户自由刷机。

也许有这个因素吧,这个例子不大好,干扰因素太多。

我觉得罪恶之源就是垄断和那啥。所以国家资本主义加全球新自由主义是万恶之源。所以我才觉得我们时代严肃的人文讨论必须追溯到政治哲学。

哈哈,这回到你的研究兴趣上了。不然你给个总结?

我觉得我的回答我个人可以总结为:1,国家资本主义下的垄断加啥啥;2,即时回复对大众表达欲的分流;3,个人社交饱和,和关心领域的缩减与深入带来点对点交流需求挤压公共交流。

朋友戊

关键词:人心不古;大毒草与商业利益

朋友戊的背景其实也没有什么需要介绍的,从对话中不难看出,他对于技术深有钻研且有不少同好。


我正在和一些当年的 BBS/论坛重度用户朋友聊「为什么中文互联网上可以进行严肃讨论的论坛消亡」这个问题。已经问过的朋友们给出了很多不同的原因。

对……这个问题大家都有自己的看法。

比如说有的朋友就认为是举报太多。

说到这个,最近有一个有趣的现象,中文世界的审查部门已经变得越来越内卷化。

是说队伍越来越大,这些人的效率也越来越低?所以各种莫名其妙的事情就越来越多?

这个行当看起来很快就会被 AI 替代吧,到时候就会更有趣……

像是现在就有谣言说,有平台在机器学习文章的传播规律。

是的,这就非常可恶。人有良知,这种默认就删的算法可是一点良知都没有。最可怕的是大家都因为懒就接受了算法的统治,这种事情发生过不止一次了。

的确是非常值得警惕的事情,可能会对社会有深远的影响。不过今天我们可能不能讨论太多,不然篇幅就太长了。

我有一个问题,就是是不是不光是中文,世界范围内严肃讨论是不是都越来越式微了?

是的,根据 Oxford Internet Institute 的研究,世界范围内论坛和博客都在流失用户。

反正诸如 Twitter 或者新浪微博这种限制字数的地方是不可能严肃讨论的……

回到问题上:言论审查应该是一方面的原因(西方也有言论审查),但是我觉得不是唯一的原因。

你看五六十年代言论全面审查的时候,也不乏有人好好说话。
现在的 Twitter 上面的反华势力,没人审查他们的政治观点,但是也都不好好说话。

这里的原因很多,比如说 SNS 中的 filter bubble,每个人只看和自己意见一样的人,促进党同伐异。然后手机的流行使得人们不愿意写长的东西。

对,在这种 filter bubble 里面呆久了, 人就容不得不同意见。讨论起来只看立场一样不一样,不管别的。

没有人写长文也是一个问题。

还有一个可能性是,之前发表言论基本上是知识分子的特权。互联网高度普及之后大众才能公开发表言论。然而大众言论的水平,可能自古以来一直是这样……
只是现在 SNS 发达了,你能看见了而已。以前这种东西想上报纸会被退稿……

不但能看见了,而且被污染了。有的人可能本来天天看正常东西他也挺正常的,现在天天看垃圾他也就垃圾了。

对。大部分人都这样。你看多了垃圾话,在全是垃圾话的地方,就只能说垃圾话。

所谓的内容推荐算法更是推波助澜。

设计内容推荐算法的人,根本不知道什么叫内容。这就叫 garbage in,garbage out。

哈哈哈,是这样的。
所以我们举出了三个因素:微博这种短内容平台的兴起,SNS 上的 filter bubble 和内容推荐算法对人观点的固化,越来越多低水平用户加入互联网上的讨论。种种原因使得讨论环境污染化,而人也被影响。

现在的某校学生里面,好好说话的人感觉比以前少。当然这可能是不好好说话的人嗓门大的原因。

这和我的听闻是一致的。而且就是其中比较有出息的,能认识到情况很坏的那些人,有时候都不免受影响。似乎要洗掉这种坏影响需要本人特别注意才行。

这些东西传染性很大。

毒性很大!

哪怕是九几级的校友,现在中毒的也不在少数。更别说我们这辈或者小朋友们了。

真正的大毒草是这种无色无形的!

大毒草跟商业利益已经高度一致了,这就很难办,世界各国都差不太多。(当然组织形式有所不同)

早死晚死,都是一个死……

不光是论坛。整个互联网的信息都在劣化。现在的搜索引擎都不能用。Google 现在倒退了,大家还唯 Google 马首是瞻,开倒车不以为耻。

没错,现在 Google 搜出点有用的长尾信息真是太难了。

感觉大家的有效信息获取方式已经回退到前互联网时代了。

就是我在前面和朋友丁说的,熟人+集中出版式信息发布渠道。

关键是这种获取方式连 2000 年都不如。这就很愁人。

真的,愁死人了。感觉我们这茬人一死,人类文明是不是就得进入大倒退时代?

咱们这茬人生前就能看到人类文明大倒退吧。知识得有人接受才谈得上传承。

那我问点具体的问题吧。你不再每天上 BBS/论坛的原因是什么呢?是某种偶然因素还是明确的某个事件?

非常明确。某校论坛的校方管理者尝试加强对该论坛的管控,全站哗然。我被恶心到了,以后就不上了。

校方对于校园论坛肯定有一定的管制要求。我理解的话,既然能活这么久,校方和站方都在维持一种微妙的平衡,何以这种平衡就打破了呢?

现在站方和校方管理者都不行了。之前维持一个自治的论坛算他们的政绩吧。现在上面也不需要这种政绩了?现在流行的是定于一尊。

我听说某校现在线上线下都有一些学生负责汇报思想动向什么的。有人蔑称他们为「特务」。

以前也有人愿意干,但是总的来说是被大家看不起的。现在的小孩,估计都持事不关己的观点。
当然持事不关己的观点,未必不是一件好事。这样「特务」的存在意义就被消解了……
反正现在审查的意义已经被消解得差不多了,所以负责思想动向的人加班加点干活也是徒劳无功。

这听起来相当的后现代啊。虽然置身其中的很多人自己的精神生活完全是前现代的。我有点可怜那些浪费自己生命的抓思想动向的人了。

对,哈哈哈哈哈。

好吧,那么您原来喜欢的校园论坛您是不愿意再上了,有没有考虑再建一个论坛呢?因为聚不起来人?

对,现在都已经微信群化了。

几个老朋友自娱自乐也不错?哪怕就十几个人呢?

十几个人的话,在哪儿都行。不一定需要一个论坛。

所以我归纳着,对于论坛来说,至少现在还有两种 niches。
一种就是一群两两互相认识的老朋友。这个呢,如果大家在国外或者还在学术圈的话,肯定都常用邮件,所以原则上邮件组是可以用的。
一种就是某些非常小众的爱好,会希望有一个公开的论坛,这样别的人在搜索的时候可以搜到,也就可以遇见几个新朋友。

对的。要是说小规模的邮件组,我是一直都有的。也有 Hangouts 讨论组,搜索东西比微信方便。技术方面的论坛,也还活着。

您这个回答和别人都不一样,也许和您的技术背景有关。也许严肃讨论和论坛之类的东西,就只能在技术社区继续存在了。

在技术社区一直存在。而且应该也不会消亡。


以下为脚注


  1. 在开始之前,或许应该说说我眼中的「网上严肃讨论」是什么。这里我不想长篇大论去设定一个苛刻的理想的讨论空间应该是什么样的标准,只说最简单的:在交流观点的时候认真表达贡献自己的观点或知识,对于别人的观点或知识予以认真回应。而一个可以进行严肃讨论的社区,应当提供这种严肃讨论的可能(显然,这势必要求可以用长文来回应),有人愿意做这样的平等讨论,交流的结果可以作为社区的积累。 
  2. 当然,并不是说论坛/BBS 就没有水。实际上大部分贴子都是水贴,只是说,最起码长文严肃讨论还是可能的,一个主题也可以在相当长时间内有相当的热度。 

那些年用过的照相设备

Last updated on Apr 30 2020

本文原来是购买 GX85 之后的 感想 的一部分。现单独拆成一篇并修订,以便每年不断更新我和照相这件事的故事。

「拍娃」和「谈恋爱」这两件事,过去是,现在是,大概将来仍然会是人们购买相机的重要动力——如果将来还有相机这种东西的话。那时还说得过去的中国城市家庭,几乎都会有一本影集。我家也不例外:父母的约会、我小时候的蠢样,都在其中。除去某些重大场合是借单位相机或者请照相馆拍的以外,那相册中的照片基本都是一部日本产的胶卷「傻瓜相机」拍出来的。父亲对于那部相机甚为宝惜,直到这台相机封存之日,仍然连纸盒包装在内的一切都崭崭新。现在看来,那种傻瓜相机,几乎没有任何可调节选项,曝光控制中唯一自动化的部分只有测光,只是靠大景深来实现随手可拍,当然是比不上现在的任何一种照相设备了。然而那时廉价的「傻瓜相机」承载了中国无数家庭的记忆。一卷 36 张的胶卷,在工资只有三百块的年代,也是很昂贵的耗材了。在使用那部傻瓜机的时候,父亲每次买胶卷都必买柯尼卡,按他的说法,虽然最贵,但是最好。当然这在摄影发烧友的眼中不算什么了,不过对于平素非常节俭的父亲来说,在那个物质还比较不充足的年代,是他为数不多的对于品质的追求。那台傻瓜相机因为是家里贵重的财产,默认我是不应该去碰它的。唯一一次因为好奇打开的结果,是使几乎一卷胶卷报废,其中包括父亲和单位朋友一次旅途的几乎所有照片。父亲为此很不开心,不知道该怎么和朋友们交待。

下图为那台相机所拍的郊游野餐

 傻瓜相机所摄郊游野餐

我父亲对摄影的兴趣从童年一直持续到他最后的日子。小时候玩暗室技术,后来则是 PS 高手。一向将老一辈人勤俭持家风格发扬到极致的他,在买数码相机这件事上,反而出乎意料地完全没有反对母亲的提议。于是,2002 年,我家并不算晚地踏入了数字影像时代。这部数码相机被我父亲用了十年之久,算是他对勤俭风格的坚持。它虽只是一部两百万像素的尼康低端消费级相机 E3100,画质比不上现今的主流手机,相对于前一部相机的进步无疑是巨大的。有了真正可以对焦和变焦的镜头,还有即时预览图像的液晶显示屏,而不再需要冲洗完成之后才能知道拍照是否成功,更不用说插上 64MB 的 CF 卡之后可以存储胶卷时代不敢梦想的 200 张照片。得益于小底易于实现微距,第一次体验微距拍摄的时候全家人无比惊奇于那纤毫毕现的细节。极轻极小,虽然没有调节选项,但全自动设置往往已经够用。家里人无论去哪里几乎总会带上这部相机。在那个经济迅速腾飞,家庭收入开始增长的年代,它记录了家里无数的第一次:第一次自费出门旅游、第一次坐飞机、第一次坐动车……

下图是这部相机所拍的三亚旅游照片

 尼康 E3100 所摄 三亚某地

不久,父亲又买了打印机和扫描仪。家里全部的老照片也被扫描进电脑。胶卷时代自此结束。那台父亲无比爱护的傻瓜相机留给我之后,我也没有用过一次。反正要拍照的时候,只要认真保证不会弄坏相机,总是可以把家里的数码相机借出来的。

下图是高中时运动会时用它拍的照片。正在跳高的是我的好朋友。

 尼康 E3100 所摄 高中朋友跳高

07 年去北京上学,从此一年到头没几天在家。我的第一部手机是摩托的 E2,带有一个与傻瓜相机原理约略相同的 130 万像素摄像头。超焦距成像,CCD 自动测光,电子快门,可调节的选项为零。进入相机程序也颇麻烦。不过那时我已经很感幸福,毕竟它的画质已经好于我家那个古老的胶卷傻瓜相机,兼有数码成像的方便。拥有父辈和我同样年龄时不敢想的设备,对于捕捉大学期间的各种新鲜事情来说,那是非常足够了。虽然没有任何选项,但摩托的直出调教非常讨喜,颜色饱满鲜艳,也不容易过曝。刚进大学什么都新鲜,无论是校园各处的风景,还是海报、课程表,一概都拍了下来。出去游玩的时候它的重要性更不必说。(我现在舍友的大头照,还是那年秋天野外观测时拍下来的。谁能想到这就是十年的友情呢?)

 Moto E2 所摄 讲堂海报

后来我最喜欢的手机三星 I780 的后置摄像头反而倒退一步,无论低光照场景还是颜色调教都比不上摩托罗拉,前置摄像头也只是聊胜于无。想十全十美是很难的。而那时摄像头最好的手机大概是诺基亚的 N97,外型够帅,镜头很大,滑盖露出摄像头,死党手里就有一个。然而即使 S60 系统并不会像早期 Android 一样卡顿,这个机器的快门延迟也达一秒以上。总体来说,虽然我 2011 年本科毕业时消费级卡片机的市场已经被手机打击得相当厉害,以那时手机蹩脚的拍照性能,那时候如果谁说手机拍照会满足绝大部分的拍摄需要,大概任何一个摸过中端相机的人都不会相信。

索性在这里把所有手机的故事都讲了吧。研一时的 HTC ChaCha 是第一台有自动对焦可以扫二维码的手机可惜没两天就丢了。之后的里程碑 2 又回到了熟悉的摩托罗拉,还是一样舒服的颜色曲线调教而摄像头更加强大,甚至还有实体两段快门按键。不过快门延迟的问题直到我后面的两部手机还是没有解决,Lumia 638/640 都是几百块的廉价机型不能要求太多。16 年换 iPhone SE 之后才终于体会到了手机摄像头技术进步的福利,即指即拍和很低的快门延迟虽然不能和微单、单反比,但大部分场合已经完全够用。苹果的直出调教是一向的优秀省心。

下面三张照片分别是 Moto ME722,Nokia Lumia 638,iPhone SE 拍摄的。可见最后一张相对于前两张画质的飞跃式进步。

 Moto ME722 所摄 五台山

 Lumia 638 所摄 德胜门箭楼

 iPhone SE 所摄 San Diego 街景

说回相机吧,那是我花了更多心血的地方。

2010 年,我还有一年毕业。我想记录下校园一整年的变化,留作永远的回忆。于是我战战兢兢地向父亲打报告要求买相机的经费。其实还出乎意料地顺利,只是父亲十分精准地预言了将来的发展「我怕你将来没多久就要换更好的相机」。但当时我对自己继承勤俭家风相当自信,而且不愿意继承那台已经用了近十年的尼康小 DC 凑合一下「以待将来一步到位」,打包票说做了十足的购机调查,至少能用个五年。在巨细靡遗的调查(甚至包括了对所有电池技术的详细调研)之后,我选择了一个看起来不算贵,对于摄影入门该有的功能似乎也有的机器:富士 S1770,大概一千二三百到手。不论那台机器的参数现在看起来如何的寒酸1,但摄影技术的大门终于向我打开了。

纵然这台机器有着无数的坑,好歹是自己选的,理论上有 PSAM 档(虽然由于光圈形同虚设,意思并不大),可以试验各种曝光参数,直方图预览也颇方便。从图书馆搬回来一摞一摞的摄影书来学习基本摄影概念,得到舍友的评价:「你适合搞科研」。打开新世界之后创作热情迅速迸发,公交车外移行闪烁的霓虹灯、多次闪光拍下上铺兄弟的四个身位、用那糟糕镜头做的虚化尝试……难以想象当时竟然试验了那么多有趣的东西。快门光圈景深焦距,各种曝光要素的基础知识就是从下决心买这台相机开始熟悉的。大四时华北、江南等各地出游和班级毕业旅行的记录都是用它拍下的。和某前任的大部分照片也是它拍下的。所以直到现在,我还能回忆起那台相机握在手里的手感,满满的都是回忆。

下面三张照片都是用它直出的。前两张展示了一下它仅有的优点:超长焦距。

 富士 S1770 所摄 月亮

 富士 S1770 所摄 殿顶

 富士 S1770 所摄 张家界

然而用得越久,S1770 性能上的局限越让我挠头。不用想星空夜景,也不用想抓拍。高感、快门、延迟上的痛点让出门旅行都不能拍个痛快。新手机里程碑 2 的出片效果之好让我更想摔相机。2014 年,终于抓住机会用一千五百块的价格拿下了松下 GF5,我的第一台真正意义上有丰富可调节参数的可换镜头相机2。现在看来,这个价格简直不可思议,也是当年市场形势使然。

新机拿到手里,大气不敢出地装上镜头,按下快门的那一瞬间,手上机械快门传来的震动就使人心潮涌动。快门震动感、旋转变焦环和对焦环时的手感,让人一下子就明白为什么那么多人迷恋胶卷时代单反相机的手感——那种把握住手中机械的掌控感,大约和开手动档汽车的乐趣是相通的。

作为穷人,没钱买镜头。彼时松下最便宜的 25 1.7 还没有上市,20 神饼虽然风靡一时二手也要至少一千两百块。看着各种镜头垂涎,甚至开始打起了转接手动头的主意。终于还是悬崖勒马没有走上这条烧器材的不归路。自带的 14-42 套头虽然光圈小画质一般,但是基本覆盖常用焦段,对焦迅速,有防抖,在各家的套装狗头中完全不落下风。

穷人烧不起器材,但还是可以进一步学习提高摄影技术。认真读完了《纽摄》3,进一步了解了用光和透视。时而用强光手电进行补光,买了三脚架来实验各种长曝光效果。

 松下 GF5 所摄 百望山下

那时候正值硕士毕业,第一轮申请悲剧掉了,毕业的压力和异国恋的压力都颇大,同实验室师兄弟在那段时间一起互相支持。相机记录下了在生物物理所的日子里师兄弟们的快乐时光。飞往美国的旅途,在 Bloomington 的最初印象,都靠它记录下来那些记忆。和某前任的最后几次见面,在国内和美国的几次出游,也带上了它。可惜的是和她分手之后心灰意懒,不想出门,这台相机只被我经常使用了两年时间就开始吃灰。一来出门很少,二来手机拍照足够便利,带上相机背大包在博物馆往往还需要存包。甚至在回国的时候也没有带上(根据以前的经验,带上也不会用的),和父亲最后的合影都是 iPhone 留下的。父亲故去之后,母亲来美国探望我的时候,本来想买个新相机,还是作罢,于是 18 年和母亲出游的照片也是它留下的。不过,因为它小巧方便,后来有了 GX85 之后,出游的时候还是经常带着它,两机各带一镜头,免去了换镜头的烦恼。

GX85 的购买动机在本文原来所属的那篇文章里交待了一下——我期待这是一个让我「重新发现生活的美好,重拾进取的热情」的契机。购入之后,也确实达到了预想的目的。初次带着它独自去 San Diego 散心,一扫失恋的阴霾,这次漫无目标不做打卡预期的旅行也似乎让我找到了最喜欢的旅行方式。另一次同样无组织无计划的旅行中,在马尔马拉海上目睹太阳在君士坦丁堡老城落下,成为永恒的记忆。2019 一年所拍下的照片超过之前数年之和。

GX85 的硬件相对于 GF5 无论是操控还是功能上都有所进步4。19 年用它折腾了不少有趣的延时摄影。因为有热靴,用闪光灯拍出各种有趣的照片也提上了日程。希望 2020 年能有闲暇和热情把许多计划完成。

外一篇——父亲的摄影故事

原本散见于本文的脚注,现集结在一起。或许会继续修订扩充。主要是对先父的追忆流水帐,读者未必会感兴趣。

我父亲对摄影的接触比我早多了。当我父亲还在中小学的时候,就和我大伯兄弟俩借出我爷爷奶奶单位里的 120 双反相机出来拍照——那种完全没有自动测光对焦的机械相机,想拍出能看的照片是非得明白照相机的工作原理不可的。拍出照片之后,还需自行去暗室显影定影冲洗照片。不过放大机和彩色照片还是过于高级的东西,一般的孩子无缘上手。

汤姆牌傻瓜相机的故事在本篇中已经讲过。我家的第一台数码相机,那台两千块的尼康小 DC 被父亲一直用到塑料老化,电池卡扣断裂,还用橡皮筋捆起来继续用。

大约我高中的时候,买第一台数码相机四五年之后,他又买了家里第一台 DV。那台 DV 还是使用磁带录像的,导出到电脑里时需要使用视频采集卡。他用那部 DV 剪辑了几段视频,花了不少心血。

当然磁带是太不方便了,在存储卡 DV 成为主流之后,又有了一部新的 DV。虽然像素不如尼康小 DC 高,但是毕竟没有损坏的零件,所以第一台数码相机就这样吃灰了。

在我买了第二台相机 GF5 之后不久,他终于下定决心淘汰掉那台尼康 DC。问了一下我的意见之后,买了尼康新出的小卡片。综合来看是比我的第一台相机强多了。

不久因为记录游泳的需求,又买了一台索尼的防水卡片机。因为机身实在是小巧轻量,前一台尼康即使有更好的画质也还是吃灰了。所以想想的话,我离家之后,他自己的生活还是有很多乐趣的,这让我回忆起来的时候很感欣慰。

不过因为他在手机上始终比较吝啬,一直没有享受过高画质手机摄影的便利。不过他走了之后,我在电脑里找到了许多手机自拍的鬼脸,也算是赶上了末班车。

PS 是另一个故事了,本就有绘画功底,透视用光构图都有相当基础,P 出的图片可以以假乱真。他很享受这其中创作的乐趣。改日会把他的作品发上来。


  1. 说起来呢,那台机器也真是够寒酸的。不然也不会到 2014 年的时候我迅速食言趁着双十一买了我的第二台相机。堪比手机的一秒多的快门延迟,只有两档的形同虚设的 ND 滤镜光圈,号称机身防抖但完全扛不住这机器长焦端 420mm 等效焦距,ISO400 就是可用极限,涂抹成油画一般的降噪风格,没有任何拨轮的操纵非常不方便。

    虽然前面吐槽那么惨,但是还是有优点的。宽大舒适的握把,富士的色彩调教,CCD 的全局电子快门,加上电池不过 440g 的重量,外加我的独脚架,携带起来比后来的微单还要轻巧。白饶的 EVF 虽然分辨率惨淡,在光线强烈时的确是不可或缺。 

  2. 这套机器相对于前一台的提升无疑是巨大的。有丰富完整的光圈快门设置,真正的机械快门和叶片光圈,再也没有对焦和快门延迟的烦恼,可以随时抓拍,高感相对于前一台机器的 CCD 来说大有进步。够用的不牺牲画质的全尺寸连拍,松下机器一贯强大的视频录像功能。虽然说 S1770 我只敢开 ISO200,GF5 保证画质一般也只开到 ISO400,但是 CCD 底在 ISO800 下是满屏雪花不能用,Live MOS 至少不求画质只求记录的话还可以在高感下试试。

    除去技术参数上的进步以外,触屏对焦、松下更好用的傻瓜模式一键出图也是操纵上的优点。 

  3. 关于纽摄:虽然这更多地是一本讲技术的书,相对于其它技术书籍,它提出的三原则虽有小学作文之嫌,但也让我开始审视每张照片的表现意图。

    对于拍照,或者摄影的观感也产生了变化。从「记录生活」,到「识别生活中的美,拍出好看到的照片」,到「创造条件表达自己」,真正意识到了,摄影是关于光与影的艺术。 

  4. 作为定位中端的机器,装备了单反上作为标配的一些操控设计:前后拨轮操作、电子取景器、热靴。同时功能上多出了机身五轴防抖、可翻转电容触屏、4K 视频录制能力、延时摄影定时器、WiFi 传图和手机遥控。可惜的是高感进步不多。 

Apr 22 2020 digest

一如既往,这个不定期 digest 主要包含在 RSS 中无法推送的博文更新,和不值当单独写一篇博文的零碎东西。

近来观察

美国平民有好多 N95!

自从美国改口支持大家戴口罩以来,本屯超市几乎立刻人手一个口罩。仔细一看,大部分美国人都戴着 N95。N95 现在在美国正常渠道根本买不到。如果不把人往坏处想的话,那就是他们平时家里拾掇院子除草吹叶、做木工活的时候用的吧?住在纽约市的朋友说,那里 N95 极其紧缺,但超市里美国人戴 N95 的比例仍然很高。

不过超市工作人员大部分没有防护,万恶的资本主义社会。

中外有别

据我观察,分享到微信朋友圈的博客链接,海外用户基本上是直接访问原网页。而国内用户是通过 weixin110.qq.com 转接过去的。如果微信决定封掉某个链接的话,国内的朋友就会点不开;如果没封,就会有一点延迟,然后跳转原网页。这个区分似乎是 IP 来区分的,不是按微信的注册地或者注册手机号来区分。

如果在朋友圈中发表包含领导人名讳的图片,该图片会立刻 OCR 后屏蔽掉,只有自己可见,朋友不可见。有趣的是,过两天之后,不知道是不是经过了人工审查,这张图片可能会被重新放出来——只是,这时候只有使用国外手机号注册的微信号可以查看,国内手机号注册的微信,无论当前在哪里,一律看不到。

网络不是法外之地

我鼓动大家多多考虑 plan B,免得文章被微信删了之后不爽的那篇文章 为自己,为别人,准备一条路 也顺手发在微信公众号上一份。在发出去一个多月后,微信以违反《网络安全法》为名删除了这篇文章。呐,这真是自我实现的预言啊。据说是被人工删除的,所以无法申诉。

可以和 微软笑话一则 对照。微软在一台已经安装了 Win10 的电脑上说「这台电脑无法运行 Win10」,微信删除了一篇内容是「少用微信公号,它会乱删你文章」的文章。一个审查员决定删掉一篇暗示「谁删本文谁就是狗」的文章。求仁得仁啊!

博文扩散渠道测试

这年头没什么人用 RSS,基本上不必指望有人订阅自己的博客。
博客方便写长一点的东西——直接在朋友圈发长文就不太方便。测试了一下,那篇关于 Trump 的梦大概我微信好友的 1/10 确实点开了。或可作为「朋友圈查看人数与点赞比」的一个数据点。毕竟微信从来不告诉你有多少人看了你朋友圈——除非你用的是微信公号。
总体来说,微信朋友圈转载自己博文的话,点开率看起来比豆瓣要高一点。毕竟豆瓣上大家的时间线里挤满了影评书评,除非好友都旨趣相设,点击率一般是不高的。
知乎上的回答如果要附自己博客的链接的话,愿意点进来看的人非常少,效率颇低。

搬运旧文

考据文一篇 爱因斯坦与《自然辩证法》

关于「自然辩证法」,读者可以搜索一篇有趣的小文「辩证法与放屁」,初中时只晓得《矛盾论》非要说正电荷负电荷是矛盾肯定是不对的我对此文万分佩服。

几篇生活、学习经验短文
锻炼后肌肉酸痛的原因与规避方法
UPS 电源选购
浅谈 Word 中的主题与样式

还有一篇中二时期的尴尬博文也被我从网易博客里刨了出来,那时候我高二。太尴尬了,你们不要点开看了
昆虫杂感

另有几篇旧助听器和旧手机的上手体验,是 08、09 年发的,看上去也非常有年代感了,供有考古癖的读者阅读

08 年的 助听器感受
09 年的 新手机 I780 使用感受I780 使用手记。那时候觉得 Windows Mobile 好得不行。
后来换 Android,给我留下的印象极其恶劣,见 11 年的 HTC ChaCha 入手感觉

是的,上述文章都写的不好。本不值得从旧博客里挖出来的。只是觉得大抵现代人不免总有些数码生活,回顾看看历史变迁或者会有些感触。因而辟了一个叫 Digital 的新类别,主要是些我自己的数字生活的点滴。

新增了一个类目叫 Amusement,存一些好笑或者好玩的东西。现在其中比较有趣的可能只有一篇
微软笑话一则

其它的旧文可能对读者就不大有趣,在此就不提了。

更新博文

告别删文:在哪里写博客?
Update on April 8th 2020: 增加了「广告收入」评价,补充了托管型 VPS

其它博文大多是小幅更新修订。

用 VIM 和 markdown 格式写学术论文

概要

相对于其它选择来说,markdown 格式方便人更专注于文章内容的写作。然而它用于写短文绰绰有余,论文排版则需要许多额外的功能。本文介绍了我使用 markdown 写论文的折腾过程,基本上扫清了论文写作中的常见需求:一键搜索并插入引用文献、文档内交叉引用、公式图表编号、LaTeX 输出与模板套用、Word 文档输出、一键后台编译多份文档、同义词查询、拼写语法检查等。

本文虽然主体已经完工,但可能不定期修改,以方便读者理解。如果觉得本文有用,欢迎收藏,并在写论文时回来看看有没有更新。

Update on Apr 29 2020: 增加了对 VIM 之外其它编辑器的一些推荐。

如有难以理解的部分,欢迎留言或者对此文件发 Pull Request。

下面是几个使用示例截屏:

一键搜索引用文献

一键搜索引用文献

拼写自动更正

拼写自动更正

同义词检索替换

同义词检索替换

编译预览结果

编译预览结果

引言

去年这个时候我颇花了一点时间打造了一套 VIM 上使用 markdown 写论文的系统。现在我准备投靠 Emacs 和 org-mode,这套系统以后怕是不会再用了。在这里记下来我的配置,或许对于一些人会有用——毕竟 VIM 用户还是比 Emacs 用户多多了。而且这些的许多配置使用其它文本编辑器的人也可以借用。

为什么使用 markdown 写论文?

使用 markdown 的优点
markdown 是一种只保存必要文档结构,不保存格式和样式信息的文档格式,我们可以用同样一份 md 文档很方便地生成不同格式的最终文档。它语法简明,易读易写,作为纯文本文件,方便使用 git 进行版本控制。相较之下,其它的几种流行格式各有各的缺点

  • HTML 虽然可以将样式定义都放在 CSS 里,但是 HTML 本身手写起来麻烦且不易读。
  • Microsoft Word 当然在会用的人手里非常强大,也能实现结构和样式的分离,不过难以用 git 来进行版本控制。纯文本文件爱好者会不大喜欢这种格式。另外许多院系大部分教授偏爱 LaTeX 生成的 PDF 而不喜欢 Word。
  • LaTeX 作为理科学术界论文写作的事实标准已经有几十年。主要缺点是配置麻烦,不稳定,没有实现彻底的文档结构与样式的分离。这套老旧的系统已经背上了太多历史包袱。层层叠叠的复杂依赖关系令人望而生畏,初学者容易陷入各种配置问题或者受到上游包更新所引入 bug 的影响而捣腾半天编译不出来。幸而这些年有了 Overleaf 这样的在线编辑和编译平台,大大减少了普通用户的折腾程度。从 LaTeX 系统的发展史来说,TeX 本身是一套强大的排版语言,写作时需要将文档内容和排版指令混在一起,这当然非常麻烦,所以现在没人直接用 TeX 写东西了。LaTeX 这套宏包的出现才使得 LaTeX 系统看上去像是在使用和 HTML 相仿的标记语言,便利用户将文档结构和样式信息做分析,然而这种尝试并不彻底。而且相对于 markdown 的简洁来说,文档中留有大量哆嗦的“标记”,影响原始文档的阅读体验。
markdown 写论文的缺点
由于 markdown 最早只被设计了非常轻量的功能,各种扩展功能如表格、交叉引用、数学公式支持等均告厥如。后者不同人开发了不同的 markdown 扩展语法用于扩展 markdown 的功能。然而这些扩展也带来一些新的问题

  • 首当其冲的就是,不同人做的扩展的语法并不兼容。在最基本的 markdown 语法之外的其它语法如巴别塔一样混乱。这些不同的 markdown 语法被称为不同的 flavor。CommonMark 是一个现在采用比较广的标准,但它只是对于不同 flavor 所取的最大公约数,其功能是相当有限的。使用 CommonMark 之外的语法,就要冒着文档在某些平台上无法编译或者正确显示的风险。对此,我决定选用 pandoc 所支持的语法。连 pandoc 也不支持的写法,就要冒不小的将来无法编译的风险了,需要将最终结果转存为别的格式以防万一。
  • 第二个问题是,如果在 markdown 上扩展过多的新语法,同时又坚持 markdown 的设计原则——一切标记尽可能地简短不影响阅读,那么就不得不去记忆眼花缭乱的各种特殊符号的含义。这时 LaTeX 的各种宏虽然写起来冗长,反而易于长期维护。

系统简介

我的这套系统以 pandoc 作为核心,扩充 vanilla markdown 所不支持的各种高级功能。同时使用一系列 VIM 插件来改善在 VIM 上写论文的体验。我所使用的 VIM 插件,在其它编辑器上也可以配置类似功能,参见“其它编辑器”一节的概述。

下面分为 markdown 扩展、VIM 写作环境和编译系统三部分来概括。

markdown 扩展

  • LaTeX 公式支持:pandoc 自带,需要安装 LaTeX
  • 表格支持:pandoc 自带
  • BibLaTeX 文献引用支持:pandoc-citeproc 插件(最新的 pandoc 已经自带)支持 markdown 插入引用。Zotero 管理文献,Zotero 的 Better BibTeX 插件用于连接 Zotero 和 VIM、pandoc 编译系统。
  • 标题、图表的编号和交叉引用:pandoc-crossref 插件

VIM 写作环境

编译系统

  • 使用 Makefile 管理文稿、图片与输出的最终 PDF 文件之间的更新关系。我使用 GNU make,因为微软的 nmake 功能实在有点少。
  • 为了在 VIM 后台编译文档,使用 VIM 插件 asyncrun.vim
  • 使用 Sumatra PDF 预览生成的 PDF,因为它轻量而且不会对 PDF 文件上锁,在 PDF 文件被更新之后可以实时更新预览

其它编辑器

本文使用 VIM 主要是因为习惯了 VIM 文本编辑的按键绑定。如果读者对于 VIM 并无偏好的话,也可以使用其它编辑器。自然,和 VIM 齐名的 Emacs 是可以配置出本文“VIM写作环境”一节所说的各种改进,不再详谈。当然,Atom 和 VSCode 也可以在配置插件之后做到类似的效果。对于懒得配置各种编辑器插件的人来说,我推荐 Zettlr,它直接解决了本文中涉及的许多问题,如 Zotero 支持、表格绘制、拼写语法检查等。不过读者大概已经发现了,本文推荐的所有东西都是开源软件。对于自己的论文这种重要的东西,使用开源软件更不容易在多年之后发现自己无法正确编译自己的论文。

功能配置

pandoc 安装与插件配置

pandoc 可以从官网直接下载安装。也可以使用系统的包管理器安装。Windows 用户也可以使用 scoop 这样的第三方包管理器。安装完成之后,为了调用方便起见,最好加到系统的 PATH 里。

pandoc-citeproc 在最新版的 pandoc 中已经自带,无需额外下载。pandoc 主体和 pandoc-citeproc 对于 markdown 语法的扩充详见官方帮助。对于论文写作来说,特别需要的几点扩充分别是:表格脚注数学公式引用文献格式。这些都可以手写,但是许多文本编辑器都可以配置一些快捷键,就不用记忆和手敲这些东西,便捷程度接近 Word。尤其是引用文献,手写起来非常麻烦。在下一节会详细介绍我的配置。

pandoc 本身没有包含交叉引用的功能。pandoc-crossref 这个 pandoc filter 可以实现这些功能。直接去它网页依说明下载安装即可。需要注意的是,如果下载已经编译好的版本,需要下载和自己的 pandoc 版本相对应的版本。有了这个插件就可以实现公式、图表、标题的交叉引用,还可以实现一个图表中插入多个子图。读者可自行参详其帮助。

如果需要使用 pandoc 生成 tex、PDF、Beamer 演示文稿,需要在系统中安装全套 LaTeX。我建议读者直接安装 TeXLive 发行版。不要安装2018版,2018版里有个 bug 需要升级一下或者手动修理。现在 2019 版还是比较稳定的。TeXLive 中带有很多 engine,我推荐使用 xelatex 作为 PDF 输出引擎,否则文档中有非拉丁字符的话容易出 bug。

具体的 pandoc 命令,可以参考下面章节中我的一键编译系统的 Makefile 中相应命令。

pandoc 编译生成 PDF 时可以套用各种 LaTeX 模板。我使用并修改了这位哥们的模板:phd_thesis_markdown

设置 Zotero 引用文献

Zotero 用于管理参考文献非常好用。使用别的文献管理软件的人,我就不知道怎么搞了。

Zotero 的 Better BibTeX 插件有很多非常有用的功能。在这些我们主要用到它的两个功能:

  • 生成一个实时更新的 BibTeX 文件,这样在 LaTeX 或者 markdown 文档中就可以方便地引用。没有这个插件的话,每当 Zotero 中新加一篇参考文献,就得手工编辑一下 bib 文件,这就很麻烦。
  • 在文本编辑器中一键呼出 Zotero 的检索条,输入搜索关键词之后直接插入 citation 到光标所在位置。

后者的效果已经在前文中展示过。

一键搜索引用文献

Better BibTex 的帮助中,对于如何在各种文本编辑器中设置一键搜索引用有详尽的说明,见此链接。对于 VIM 来说,将此帮助中的代码插入 vimrc 即可。特别需要指出的是,Windows 用户需要安装 curl 才能让那段代码正常工作。我觉得用 scoop 安装 curl 会比较省心。

配置VIM 写作环境

这里主要介绍几个 VIM 插件的用途和配置方法。

vim-pandoc

VIM 插件 vim-pandoc vim-pandoc-syntax 是一套比较好的支持 pandoc 扩展 markdown 语法的 VIM 插件。主要功能有:语法高亮、将公式上标下标直接以上下标字体显示在 VIM 中、一键编译(我自己是出于别的目的另配了编译系统)、目录、章节跳转、各种快捷键等。

如果没有安装 VIM python 支持的话,这两个插件只能使用一些基本功能。虽然说基本功能对于大多数用户也完全够用了。如果准备长期使用 pandoc 写作的话,建议安装 VIM 的 python 支持以使用这个插件的全部功能,增加工作效率。

VIM 的 python 支持安装起来非常麻烦。因为必须和编译 VIM 时所用的 python 版本完全一致。这就意味着往往需要在操作系统里已经装的 python 之外再安装一个低版本的 python。安装完之后再在 vimrc 里配置 pythonthreehomepythonthreedll 两个变量。详见本文末尾我的 vimrc。如果中文互联网上没有好的介绍 VIM python 支持的文章的话,或许哪天我另写一篇。

下图显示了使用此插件查看论文大纲的样子:

显示论文大纲

vim-table-mode

vim-table-mode 这个插件主要是为了解决在 markdown 中绘制表格特别麻烦的问题。Emacs 中有 table-mode 非常好用,所以有人写了一个 vim-table-mode。

使用起来非常简单,像 Emacs table-mode 一样,开启之后在一行开头输入 | 之后它就会自动排版和伸缩表格。这样的话,在 VIM 中画表格反而比在 Word 中还快。

thesaurus_query.vim

thesaurus_query.vim 是一个同义词查询插件。写英文论文的时候,同义词查询太重要了!有了这东西就再也不用搜索枯肠去想哪个词最贴切。有时候明明觉得有一个词适合用在此处,但是就是想不起来,翻汉英词典太慢,还经常查不着。这时候就可以直接先敲一个能想出来的小学英语级大俗词,然后检索一下同义词,从里面选一个即可。

效果如下图所示:

同义词检索替换

Goyo

goyo 是一个让写作时排除干扰的插件,开启之后写作界面就特别清爽。

拼写语法检查

拼写检查是 VIM 自带的功能。在 vim-pandoc 中也是默认对正文开启而对代码区块关闭的。如果需要手工开启的话,输入 :set spell 命令即可。写东西时可以用 Ctrl-x s (先按下 Ctrl-x,再按下 s)来对上一个标红的单词进行更正,效果如下图。

拼写自动更正

语法检查就要麻烦一些。我用的是 vim-grammarous 这个插件。它调用了 LanguageTool 来对文本进行语法检查。

LanguageTool 是许多开源 Office 类软件如 LibreOffice 中常用的语法检查器。使用 vim-grammarous 这个插件的话,不能使用 LanguageTool 的在线版,而需要安装它的开源本地版。安装 LanguageTool 需要先安装 Java 运行环境。

配置一键编译和预览

Makefile 系统

使用 markdown 或者 LaTeX 写文章的好处之一就是,如果文章中的图表因为种种原因需要更新(比如说补充数据),不需要大费周章一个个重新拖到文档里,直接重新编译一下就好。我甚至让我的程序直接输出图表到我的文章目录下,运行完程序图表就自动更新。同样,我们也可以在多份文档,比如说幻灯片、海报、报告、期刊文章中使用同一组图片,而不需要把它们到处复制来复制去。

在这种情况下,使用 Makefile 来管理各种更新依赖关系就特别方便。无论是文稿本身、文稿中的图片、还是某个模板文件被修改,都可以触发重新编译。

在我的 Makefile 当中,我主要做了几件事:

  • 定义了 bib 文件的路径、LaTeX模板、pandoc 编译选项等全局变量
  • 定义了 tex、PDF、docx 等输出 target
  • 文章、海报、幻灯片被统一管理起来

我的 Makefile 写的有些复杂,读者未必需要其中所有的功能。故而附在文章最末。

如果读者不会写 Makefile 的话,也可以不用 make,而直接使用 vim-pandoc 中提供的编译文档工具,或者手工编译。那样的话,编译命令未免有点长,还是写个脚本方便一点。

LaTeX 模板

因为我这次并没有向期刊投稿的需求,所以就套用了一个非常普通的模板 phd_thesis_markdown。读者可以研究修改模板文件。

一键编译和预览

为了能够在 VIM 后台一键编译,我使用了 asyncrun.vim 这个插件。配置一下,无论是运行 make 命令还是别的编译命令都很方便。读者可参考我的 vimrc。

预览 PDF 我用的是 Sumatra PDF,因为 Adobe PDF 会锁住 PDF 文件。用 Adobe PDF 打开的文件,其它程序无法修改,也就无法在预览的同时进行任何修改。Sumatra PDF 没有这个问题,PDF 文件被修改之后它会实时更新。效果如下图:

编译预览结果

当然,我弄这一套,是因为那时候还没有 Windows 下比较好的 VIM markdown 预览插件。现在的话,读者可以考虑 markdown-preview 之类的插件。曾经这个插件是不支持 Windows 的。当然,这个插件预览的是 HTML,和 PDF 显示效果会有一点差异。

附录

对于以下附录,如果需要代码高亮的话,可查看 GitHub 版本

我的 vimrc 中相关设置

下面是我的 vimrc。vimrc 文件中双引号 " 起头的是注释

" 设置中文折行显示和 gq J 时不加空格, 其中 M 在新版 VIM 中已经默认有了
set formatoptions+=mM

" 设置 VIM 的 python 支持以启用一些 VIM 插件的全部功能。读者应自行修改路径
" 事实证明 VIM 非常聪明,能认反斜杠。路径字符串不要加引号,加了会出错!
set pythonthreehome=C:\tree\HighSmall\Python36-32
set pythonthreedll=C:\tree\HighSmall\Python36-32\python36.dll


" Zotero Better BibTex 设置
function! ZoteroCite()
  " pick a format based on the filetype (customize at will)
  let format = &filetype =~ '.*tex' ? 'citep' : 'pandoc'
  let api_call = 'http://localhost:23119/better-bibtex/cayw?format='.format.'&brackets=1'
  let ref = system('curl -s '.shellescape(api_call))
  return ref
endfunction

noremap <leader>z "=ZoteroCite()<CR>p
inoremap <C-z> <C-r>=ZoteroCite()<CR>

” 插件设置
call plug#begin()
Plug 'vim-pandoc/vim-pandoc-syntax', { 'for': 'markdown' }
Plug 'vim-pandoc/vim-pandoc', { 'for': 'markdown' }
Plug 'dhruvasagar/vim-table-mode', { 'for': 'markdown' }
Plug 'ron89/thesaurus_query.vim'
Plug 'rhysd/vim-grammarous'
Plug 'junegunn/goyo.vim'
Plug 'skywind3000/asyncrun.vim'
” 下面两个曾经对于 Windows 用户没用,所以注释掉了。现在新版据说 Windows 可用
" Plug 'iamcco/mathjax-support-for-mkdp', { 'for': 'markdown' }
" Plug 'iamcco/markdown-preview.vim', { 'for': 'markdown' }
call plug#end()

" 设置按 \ s 键自动更新文档并编译
noremap <Leader>s :update<CR>
au filetype pandoc au BufWritePost *.md :mks! |:AsyncRun make

" 设置引用文献库的位置,请自行修改
au filetype pandoc
    \ let g:pandoc#biblio#bibs = ['C:\abc\efg\BetterBib.bib']

我的 Makefile

变量定义

通用变量定义部分我是写到一个单独的文件,再 include 进来的。读者不一定需要这种写法。此外,其中的各种路径请读者修改为实际路径。

Makefile 文件中 # 开头的一行是注释

# Here we set a variable to indicate we are using Windows
WINDOWS=1

# command to open pdf. If it is running, don't open again. Please change path
OPEN_PDF=powershell -c "if(-Not(Get-Process -Name SumatraPDF -ErrorAction SilentlyContinue)){ start C:\abc\def\SumatraPDF\SumatraPDF.exe $(DOCNAME).pdf}"

# command to open pdf in Linux. If it is running, don't open again.
# OPEN_PDF=if pgrep "pdf" >/dev/null; then pdfviewer $(DOCNAME).pdf&; fi

# location of bib file. Please change path
GLOBAL_BIBFILE=C:\abc\def\BetterBib.bib

# define python command and pandoc command, if they are not in path, specify them here
PY=python
PANDOC=pandoc
PANDOC_COMMON_OPT=-F pandoc-crossref --number-sections

# set bibtex option for pandoc
BIB_OPT=--bibliograph="$(GLOBAL_BIBFILE)"

# OS specific part

# for windows and nmake, use below
ifdef WINDOWS
# this is for non utf-8 terminal. Pandoc only work in utf-8
OS_OPTION=chcp.com 65001
# in case of MSYS make, del is not recognized
RM_CMD_HEAD=powershell -c "rm 
# define directory path
BASEDIR=.
RMTEX=powershell -c "rm tex2pdf* -r -fo"

else
# for *nix, use below
# no need to change code page
OS_OPTION=echo nothing
# since powershell need the double quote, have to add this too
# simple rm -f quote *.pdf cannot delete it
# add -f to omit error messages
RM_CMD_HEAD=bash -c "rm -f
BASEDIR=$(CURDIR)
RMTEX=rm -rf tex2pdf*
endif

# define image files path
IMAGEDIR=$(BASEDIR)/images

# define style files directory
# Pandoc can use both / and \ to find files, no need to change path separator
STYLEDIR=$(BASEDIR)/style
TEX_TEMPLATE=$(STYLEDIR)/template.tex
TEX_HEAD=$(STYLEDIR)/preamble.tex
HTML_TEMPLATE=$(STYLEDIR)/template.html
REF_STYLE=$(STYLEDIR)/ref_format.csl
BEAMER_HEAD=$(STYLEDIR)/preamble_beamer.tex

定义几个文档文件名(具体来说,可能会有海报、文章、报告等)

DOCNAME=paper_name
DOCNAME2=slides_name

文章 PDF 输出

这是一个示例。读者如果没有拆分多个 Makefile 的话,可以去掉 dependency 中的 make/target.mk

在这些指定了,如果 markdown 源文档、Makefile 本身、各种模板文件、图片附件目录产生改变的话,就重新编译文档。

$(DOCNAME).pdf: $(DOCNAME).md makefile make/target.mk \
       $(STYLEDIR) $(TEX_HEAD) $(TEX_TEMPLATE) $(REF_STYLE) \
       $(IMAGEDIR)
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME).md \
        -o $(DOCNAME).pdf \
        $(PANDOC_COMMON_OPT) \
        $(BIB_OPT) \
        -H "$(TEX_HEAD)" \
        --template="$(TEX_TEMPLATE)" \
        --csl="$(REF_STYLE)" \
        --pdf-engine=xelatex \
        --verbose

文章 tex 输出

这里我定义了两个 tex 输出,一个是完整版,可以用 latexmk 编译生成 PDF,一个是只包含文档主体,没有套用任何模板的 tex 文件,方便手工套用其它 LaTeX 模板。

$(DOCNAME).tex: $(DOCNAME).md makefile make/target.mk 
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME).md \
        -o $(DOCNAME).tex \
        $(PANDOC_COMMON_OPT) \
        --biblatex \
        --pdf-engine=xelatex \
        --verbose

$(DOCNAME)_full.tex: $(DOCNAME).md makefile make/target.mk \
    $(STYLEDIR) $(TEX_HEAD) $(TEX_TEMPLATE) $(REF_STYLE)
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME).md -s \
        -o $(DOCNAME)_full.tex \
        $(PANDOC_COMMON_OPT) \
        $(BIB_OPT) \
        -H "$(TEX_HEAD)" \
        --template="$(TEX_TEMPLATE)" \
        --csl="$(REF_STYLE)" \
        --pdf-engine=xelatex \
        --verbose

文章 docx 和 HTML 输出

这两个没什么说的。就是发给不喜欢 LaTeX PDF的人看文章用的。

$(DOCNAME).docx: $(DOCNAME).md makefile make/target.mk \
    $(IMAGEDIR)
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME).md \
        -o $(DOCNAME).docx \
        $(PANDOC_COMMON_OPT) \
        $(BIB_OPT) \
        --verbose

$(DOCNAME).html: $(DOCNAME).md 
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME).md -s \
        -o $(DOCNAME).html \
        $(PANDOC_COMMON_OPT) \
        $(BIB_OPT) \

Beamer 幻灯片输出

$(DOCNAME2).pdf: $(DOCNAME2).md makefile make/target.mk \
       $(STYLEDIR) $(REF_STYLE) \
       $(IMAGEDIR)
    $(OS_OPTION)
    $(PANDOC) $(DOCNAME2).md \
        -t beamer \
        -o $(DOCNAME2).pdf \
        $(PANDOC_COMMON_OPT) \
        $(BIB_OPT) \
        -H "$(BEAMER_HEAD)" \
        --csl="$(REF_STYLE)" \
        --pdf-engine=xelatex \
        --verbose

通用 target

这里设置了几个用于清理文件、编译全部文件之类的通用 PHONY 目标。其中 default 应该放在最前面,是执行 make 命令时希望默认执行的目标。因为我大部分时候并不需要编译 docx、html 之类的格式,默认目标我只设置了编译 PDF 并预览。

default: $(DOCNAME).pdf
    $(OPEN_PDF)

all: $(DOCNAME).pdf $(DOCNAME).tex $(DOCNAME)_full.tex \
    $(DOCNAME).docx $(DOCNAME).html

help:
    @echo "make" to compile pdf and view it
    @echo "make all" to compile pdf, html, docx and tex
    @echo "make $(DOCNAME).tex" to get parital tex to paste to overleaf
    @echo "make $(DOCNAME)_full.tex" to get complete tex file
    @echo "make $(DOCNAME).docx" to get docx
    @echo "make $(DOCNAME).html" to get html
    @echo "make clean" to remove all output documents
    @echo "make help" to display this help


cleantex:
    $(RMTEX)


clean: cleantex
    $(RM_CMD_HEAD) *.pdf"
    $(RM_CMD_HEAD) *.tex"
    $(RM_CMD_HEAD) *.docx"
    $(RM_CMD_HEAD) *.html"


.PHONY: default all clean help cleantex 

要不要买新 iPhone SE

问题分析

手持初代 iPhone SE,迄今已经快四年。它是过去几年中买的最值的电子产品之一。年年都传说苹果要发下一代 SE,传了四年,新 SE 终于发布。但是看着手里还没坏的旧手机,反而更加纠结了。

分析了一下这个问题,要不要换主要取决于两个问题:

  • 当前的手机及其配套工具链还能撑多久?
  • 新的手机或替代工具链什么时候能出来?

进一步回答这两个问题,需要列举一下当前手机可能的升级替代方案。然后可以细化可能的方案

  1. 将来换一个新手机
  2. 保留当前手机或者一个较便宜的手机随身,将其它需求分散在 iPad、PC 等其它设备上

我的需求

细化升级替代方案还需要考虑我对手机的需求。

目前我手机的主要用途有:

  • 打电话收短信
  • 微信、知乎之类的毒瘤 app。回国的话还需要淘宝、支付宝、京东
  • 外出时需要地图
  • 播客、音乐播放等
  • 日历、待办事项、邮件等经典 PIM 应用
  • 随手拍照存档、生活记录
  • 随手查询信息,包括但不限于:浏览网页、查找百科词典

显然上述使用是相当轻度的,手机并不居于我数字生活的中心位置。结合上述用途,我对手机的需求,依重要性排序如下:

  1. 为了制住毒瘤 app,稳定不折腾,也为了一些手头只兼容 iOS 的设备,我只买 iPhone
  2. 因为仅是轻度使用,价格越便宜越好
  3. 因为手机存储有大量敏感个人信息且一直联网,系统必须保持最新
  4. CPU 性能只需要能够流畅打开毒瘤 app 即可。实际上,只需要能快速打开微信。所以要求并不高
  5. 不打游戏不看视频,喜欢单手握持打字,屏幕越小越好
  6. 虽然我有相机,但是如果手机照相功能比较强大的话,还是很方便的。这并不是一个必需项
  7. 容量上,在不过分提高价格的前提下,越大越好,省得浪费时间删东西
  8. 有防水会比较方便。没有也可以接受

可选方案

由上,限定 iOS 的话,可选方案就只有 iPhone 和 iPad 的组合了。在当前,两代 SE 之外的 iPhone 价格太贵,违反需求2,从方案中排除。那么只有这四种可能方案:

  1. 买最新版 iPhone SE 128G
  2. 当前手机留用,将来买 iPad 补足需求
  3. 当前手机坚持到第三代 SE 上市
  4. 当前手机用到不能用,届时更换那时最便宜的 iPhone

这里隐含的一点假设是,上述四种方案哪一种在第三代 SE 上市后都会重新估量是否要换机。

那么,比较这几种方案,有两个很重要的因素:初代 iPhone SE 什么时候就不能用了?第三代 SE 什么时候会上市?

未来预测

当前手机的剩余使用时间

这个问题取决于几个因素:苹果对现在手中手机的支持时间;下一个不得不换机的重大需求节点或者技术节点

苹果对手机的支持

理论上手机当然可以在箱子里放无限久,但是苹果并不会给老设备提供最新的 iOS 系统。过时的 iOS 系统暴露于互联网上会有安全风险。对于看重安全性的用户来说,不能使用最新 iOS 系统的设备就不应该再作为主力设备使用了。

就过去来看,苹果一款手机上市之后,一般会在四年多的时间里一直可以使用最新 iOS 系统。四年多的支持力度相对于 Android 手机来说已经算非常长了。如果按这个预期来算,上代 SE 和 2015 年发布的 6s 属于同一代,从 6s 起算,已经超过了四年,随时有可能停止支持。

但从另一个角度说,苹果自从前两年被大家骂“一升级系统手机就变卡”、“新机一上市老机器就变卡”之后,为了挽回形象,这两年的新系统已经没有上述现象。iOS 11-13 越升级越流畅、手机剩余存储空间越多;老池老化降频也变成了一个可选选项。也不好说苹果会不会继续保持目前的良心:只要硬件还跑得起来,就提供最新系统。

对此我们可以参考前两代被停止支持的机器。根据网友汇总,使用 A7、A8 处理器的 5s 和 6 于 2019 年止步于 iOS 12,恐怕主要原因是它们只有 1G RAM。同样使用 A8 处理器的 iPad mini 4 却仍然可以收到 iPadOS 13。再上一代是使用 A6 处理器的 5 和 5c,止步于 iOS 10。它们被抛弃的主要原因是 A6 处理器还是一个32位处理器。

如果这样看的话,似乎 SE 所用的 A9 处理器和 2GB 内存并不构成升级新操作系统的障碍。如果苹果大发善心的话,也许还可以再战数年。但从苹果的利益来看,对老机器一直保持支持显然不利于新机器的销售,找个莫须有的理由不再支持 A9 处理器这代机器也不是没有可能。

好在 iOS 14 的开发者预览马上就要出来了。如果 iOS 14 依然支持老 SE,就多了那么一点理由去相信苹果不会无故放弃老设备。如果 iOS 14 就已经像许多传言所说那样抛弃了 SE,SE 作为主力机的生命周期就将停止于今年秋季。

同样,虽然 7、8 的用户肯定不用担心今年秋天就没有新 iOS 可用,但是观察一下 iOS 14 对于 6s 和 SE 的支持也可以帮助猜测苹果是否会在发布四年多后停止自己手机的支持。

下一个智能手机换机节点

像我这样的老 SE 钉子户总觉得这两年智能手机的发展殊无新意,所以没有换机的动力。而 2007-2015 年那几年,每一两年都有不得不换机的重大变革:电容触屏、3G、4G、GPS、不断提升并消灭掉消费级卡片机市场的手机摄像头、还有越来越吃性能的各种 app。这些变革大多是不得不跟进的。还有一些可跟可不跟的东西,如智能手表、无线耳机,也在催促人换机。

近几年来,智能手机的技术升级越来越落在我们这些实用主义者觉得无关紧要的地方:全面屏、三摄四摄五摄和快充。在乎这些的人,本来也不是新 SE 的受众。

对于手持旧 iPhone 的人,恐怕最重要的事情是:什么时候旧手机就会卡到不能用?我倾向于认为,日常高频应用受制于电池容量问题,不太可能继续无止境地索取 CPU 性能。初代 SE 仍然可以在相当长时间内维持得过去的使用体验。无非是新机2秒打开一个 app,旧 SE 需要4秒打开,并不会到不能忍受的程度。

在可见的未来,智能手机的新卖点有几个:5G、折叠屏和类似 Google Glasses 一样的新一代随身设备。

5G 在欧美普及还需要两年以上,在 5G 普及之后智能手机上 5G 的 killer app 才会逼得大家不得不换 5G 手机。现在来看,喜欢用手机看网络视频的人本来也不是 SE 这种小屏手机的目标用户,高清视频这条需求可以划掉。另一个可能的趋势是大量 app 和游戏改在云端渲染,减少本地的压力。这样的话似乎买高端手机的人亏得更厉害。最后一点是无处不在的 AR,目前还很难说它到底会有多大的应用前景。考虑到 WiFi 下的 AR 直到今天也没弄出什么杀手级应用,我对于 5G 时代能出现什么样的全民 AR 应用表示谨慎怀疑。综上,在 5G 这一点上,我认为老 SE 和新 SE 都还有至少两到三年的好日子。

折叠屏是另一个非常影响用户体验的新技术。考虑到 app 生态的话,估计大部分 app 会在摊开后使用 Pad 版界面,合上后适配手机版界面。那么传统直板手机倒不会说不能用,只是不够酷,用着不爽罢了。需要指出的是,折叠屏手机为了电池续航,目前仍然无法减少重量,折上之后是相当笨重的。

最后,如果 Google Glasses 什么的真的在 5G 时代流行起来了,我觉得现在所有手机都会成为过时的古董。不过由前所述,恐怕在三年之内也不太可能。

综上,从下一个“不得不换”的换机节点来考虑,无论新 SE 还是老 SE,在3年之内似乎都不用太着急。

下一代低价 iPhone 的推出时间

第一款低价 iPhone 是 iPhone 5c。然而卖得并不好。初代 SE 是第一代成功的低价 iPhone,主要收割了一批小屏爱好者。由于 5c 过去没两年,初代 SE 之后就年复一年地传二代 SE 的谣言。结果一等就是整整四年。

这有几个原因。首先是小屏手机的市场急剧边缘化。由于耗电 app 越来越多,手机不得不做得越来越大以增加电池容量;同时大部分用户用惯了大屏就不想用回小屏。仅仅因为想买一款小屏手机而想买新 SE 的用户还是太少,不足以让苹果单独推出一款手机。但更重要的是,苹果当初用 SE 收割了大批还在使用 4S 到 5S 不愿意换机的钉子户。而在初代 SE 推出之后的两年,新的 SE、6s 钉子户换机的动力却不高。新 SE 拖了四年才登场,一次收割从 iPhone 6 到 iPhone 8 的钉子户。虽然说新 SE 的升级并不明显,但是再不推出新 SE 的话,这些钉子户有相当大一部分可是要转投 Android 去了。

从苹果利益最大化来看,下次推出低价 iPhone 估计还是得等到能一波清掉一大堆钉子户的时候。如果智能手机技术继续停滞的话,我们至少需要等四年。即使是出现了新的杀手级应用,如前所论,也大概率是在该应用已经快普及的时候才会推出,怎么也是三年之后的事情了。

方案比较

由“换机节点”一文来看,在任何一种必须换机的理由下,iPad 都不会比手中目前的旧 SE 用得更久。仅在苹果停止 iOS 支持这种场景下 iPad 可以多撑一段时间。


假设场景1:苹果一直支持旧 SE 或用户不在乎安全性。3年之后 5G 逼人不得不换手机

  • 当前手机再撑3年,需要换一块电池,只需要45刀
  • 买新 SE 需要450刀,3年之后还是得换

在此种场景下,400刀差价提供了3年更加流畅的使用体验。


假设场景2:苹果支持旧 SE,但是 5G 并未催生杀手级应用

那么新 SE 就可以使用四年,且旧 SE 可能需要换第二次电池。350刀差价提供了4年更加流畅的使用体验。


假设场景3:苹果放弃支持旧 SE,且用户在乎系统安全性

如果苹果在1年之内明确放弃支持旧 SE,那么直接上船新 SE 即可。新 SE 可以使用两到四年(取决于下一波换机潮是否在3年后发生),怎么也比买 iPhone 11 系列划算。买 iPhone 12 系列同样对于轻度使用者是亏的——哪怕它支持 5G,指望 AMOLED 屏幕用8年也相当不现实。

如果苹果在2年后放弃支持旧 SE,刚好在新 SE 下市节点前后,这是最麻烦的。
无论是两年后买新 SE 还是直接买 5G iPhone,都比现在就入手新 SE 亏。买新 SE 的话,只剩一到两年就该考虑升级;买 5G iPhone 的话,年均使用成本太高。最佳策略就是现在立刻上船新 SE。

值得指出的是,由于新 SE 价格如此低廉,仅从经济帐上算,买一个 iPad 来逃避苹果的系统升级周期完全不比现在就买新 SE 更划算。但是,这样干(iPad 做主力机,旧手机只打电话)的话,你就多了一个平板可以用哇!觉得一定要买一个平板的人可以考虑这种方案。


综上,对于在意系统安全性的老 iPhone 钉子户,只要苹果确定在2年之内放弃支持旧 SE,现在立刻入手新 SE 就是最佳方案。即使考虑到苹果有发善心的可能,不确定是否会放弃支持,现在就入手新 SE 总不会是最坏的情况。

对于不在乎系统安全性的用户,是否要上船新 SE,取决于用户认为每年付100多刀买一个更流畅的手机是否划算。

就我自己来说,假设场景2和假设场景3是我认为最有可能发生的事情。总之,现在买新 SE 并不亏。几年一度的“苹果税”啊……

这里所说的“现在”不等于要立刻抢购,想观望一下 iOS 14 是否会支持旧手机的话完全可以观望一下。当然,现在买红色版新 SE,相当于为新冠疫情捐款送手机!这个机会是过了这村没这店了。虽然我也不知道这种“捐款”能不能抵个人所得税,我怀疑只能抵苹果公司自己的税。

梦中梦一则

今天早上做了一个梦中梦。梦见 Trump 总统躺在担架上,据说是死于新冠病毒。他脸色一如既往地红润,一头金毛还如平常一样地不羁,只是难得地闭上了他的嘴,显露出半是不屑半是安详的神色。遗体身着黑色西装,脚上却没有鞋子。我被人叫来把他抬走,却没有人给我口罩,我并不抱怨,内心感到非常平静。

一睁眼发现我在一张床上,宿舍区的美国大妞们完全没有保持 social distance 而在大喊大叫跑来跑去。一个两年没见的老朋友远远喊我赶紧下床出去吃饭,我在床上懒洋洋地应着:“刚刚我梦见特朗普死了!这么好的梦,谁愿意醒啊!”

似乎意识到特朗普之死不过是一个梦,这个梦也就不美,于是我真正地醒来,回到了自己的床上。