阅读视图

发现新文章,点击刷新页面。
🔲 ☆

倒带,关于虚幻勇士的记忆

发现 Code Lyoko 相关异常信号,正在进行检测与确认……

是否进行记忆扇区重建? [y/N]

正在准备虚拟化环境…… 加载完成。

启动同步……


回放

2010 年,彼时高中成绩还算稳定的缘故,我获得机会,拥有了人生中第一台属于自己的电脑。那是一台戴尔的迷你上网本,配置很低,CPU 是英特尔的凌动处理器。以今天的眼光来判断,此选择真是失败,同样的预算当时完全可以得到一台配置更高的。只是那时我对硬件一窍不通,完全是凭借「品牌+便携」两个关键词做下的选择。

虽然是一台笔记本电脑,一台比常规笔电更加便携的上网本,但彼时寄宿制高中生活的我,有且只有在节假日和寒暑假时段才能触摸到放在家中的这台电子设备。而这也让我对这台电脑的使用,变得与初中走读时期偷偷去网吧玩游戏的感受完全不同。虽然也偶尔会玩各种游戏,但更多的时间是用来给我的 MP3 播放器下载拷贝歌曲以及下文讲到的字幕组工作。

寄宿高中禁止携带电脑,在那个网络资费还是高昂的时期,即使默许携带(以便于联系家长)的手机拥有访问网络的能力,30M 每月的数据流量对于我来说还是连一首歌曲也不敢下载。流量更多地被用于文字类的聊天、内容搜索浏览以及「文字偷菜」等游戏上。这时候,更小巧的 MP3/4 播放器就成了同学们的掌中宝物。MP3 除了能听单词助记忆外,还能听有声小说和音乐,待机时间也长。听音乐便成了我高中生活的一个重要组成部分,同时也极大地影响我往后的生活。

那会儿,我的 MP3 里面有相当一部分音乐是一些动画片的 OP/ED 之类的歌曲,除了包括知名的《数码宝贝》的 Butter Fly、Break up!、Brave Heart 等,《中华小当家》、《名侦探柯南》的众多 OP/ED(其中也有我的本命 band GARNET CROW 的 tie 曲)外,还有非常喜爱的《我为歌狂》的我的舞台和有梦好甜蜜,《四驱兄弟》、《光能使者》的国语版 OP 等国语曲目。在这些之外,有一首特别的英文曲目,它的名字是「A World Without Danger」。

是的,它便是《虚幻勇士》的英文版 OP 原曲。我使用手中的电脑,借助搜索引擎从百度 mp3 等平台听到了不少以上提及动画片的歌曲,《虚幻勇士》就是其中一个。除了找到了这首英文 OP 外,我当时还从土豆网上看到了这部动画片未曾在大陆播出的第三、四季,同时了解并加入了 Code Lyoko China 论坛社区。只是那时候并不知道 CLC 彼时已经是一个濒临解散的社区,这也为我后续涉足字幕组埋下了伏笔。

靠着土豆网上由 CLC 制作组自发译制的《虚幻勇士》第三、四季的视频,我几乎补完了这部动画片的后续剧情。

土豆网 CLC 制作组播单快照
土豆网 CLC 制作组播单快照[1]

说「几乎」是因为当时并未通过 CLC 制作组播单看完全部剧集。根据我的记忆加上历史档案,其播单最终停在了第四季第 90 集,最后 5 集因片源问题未能完成译制,直至论坛关闭。不甘 CLC 衰落的坛友计划筹建新的社区基地,也就是后来的 CLCN。当时我正渴望补完最后几集,在 CLC 还在过渡到 CLCN 的阶段中,借着找到片源的契机,我跟着坛里的成员合作完成了第四季其中的第 93、94 集的译制。

那时 CLCN 制作组的名号还未被启用,译制作品还是以 CLC 名义发布的,而最后也只正式发布了第 93 集,第 94 集的「遗产」则是被后来的 CLCN 在其重制计划中吸收继承了。

封存于网盘里的 Code Lyoko 内容
封存于网盘里的 Code Lyoko 内容

在之前,我对字幕组的工作流是一无所知的。凭借着搜索引擎与一腔热血,我先后把 SRT/SSA、VobSub/VSFilter 以及 MeGUI 等工具学了一遍。还记得当时为了保持与 CLC 制作组相似的风格,要把英语音频抽出来切割后与法语视频在时间上对齐就花了不少时间。回头看那时候真是无知者无畏,拿着一台笔记本电脑搞字幕组的活,要知道那是一台不到 11 寸,板载低功耗低频的凌动处理器的上网本。最后开着它挂通宵机二压出成品的日子,让我至今难忘。

断档

除了「小刀砍大树」的方式进行字幕组工作外,那段时间我还因为发现 IFSCL 这个制作优良的同人 Flash 游戏,给其翻译了一版用户手册分享给坛友们,没记错的话那份文档大概是当时我在坛里的最终贡献。后来 CLCN 成立,我加入其中并活跃了一段时间,也参与了第五季真人版最早期的一些译制。在现实生活与兴趣变化的影响下,字幕组相关的工作于我并没有持续多久。在之后我把所学的技能用在给 GARNET CROW 的歌曲做字幕上,完成了其最终 Live 的字幕制作的同时,也给我短暂的字幕组经历画上了句号[2]

虽然当初学习的各种 MeGUI 压制参数等等已经完全忘记,一些多媒体知识仍然在我脑海中留下了痕迹,特效字幕的学习与制作也相当程度提升了我对技术乃至编程的热情。现今视频自媒体、AI 翻译与字幕各种先进技术和方案普及,多媒体已不再是普通人难以接触的领域知识。

字幕组的这段经历是深刻的,然而引发这一切的根源之于我却是陌生的。在很长时间里,我想不起我具体在什么时候看过这部动画片。某段时期在浏览网络上他人关于《虚幻勇士》印象的各样讨论,我甚至一度对自己在哪个就学时期看过这部动画片产生了怀疑。也许是现实渐长的迷惘和焦虑心情,对那段美好时光产生了挤压和覆盖。我热切希望寻找到关于这个断档时期的一些直接痕迹。

重建

年中,我在给 MusicBrainz 平台贡献 GARNET CROW 以及其他音乐人的音乐元数据时,意外地开启了一小段高频率使用搜索引擎和互联网档案Internet Archive 的时间。为了提供准确的音乐元数据信息,我除了在各音乐发行版权登记平台上蒐集标准数据字段外,还借由互联网档案工具查询一些已经难以正常访问的信息,比如不同音乐曲目之间的关联。在这个过程中,我发现了一些我此前未曾了解的有趣信息。比如其中一个是关于陈慧娴的《跳舞街》超多个不同演唱版本的信息[3],另一个则是关于 GARNET CROW 最早期地下专辑《first kaleidscope 〜君の家に着くまでずっと走ってゆく〜》在正式发行前的预发行版本的切实证据。

在完成了音乐元数据的搜寻工作后,我没有停下来。我想趁热打铁,继续去寻找我在什么时间看过《虚幻勇士》的线索。在此之前,我曾尝试利用搜索引擎几次检索关于《虚幻勇士》在大陆地区电视台上播出的信息。只是,一方面众所周知大陆中文互联网历史数据留存情况和可访问性并不乐观,另一方面便是被传播最多的《虚幻勇士》「盗版永封」事件,导致中文区很难找到相关有用的线索。这次我想借着音乐元数据蒐集工作的好运气,再次尝试一下。而这次的结果是——我那段断档的记忆,变得无比清晰。

我使用的线索是我唯一确信的一点:我在南方电视台上收看的《虚幻勇士》。我对此印象最深的就是台标是 TVS 标,至于是哪个频道我印象不深,网络上的评论一说是 TVS-6 一说是 TVS-5。通过南方电视台的维基页面得知其在 2014 年已被合并,官网已关闭,另外维基指出 TVS-6 在 2005~2006 年间台标出现过变更,从原来的 TVS-6 改成了 TVS-5,不变的是仍然为少儿频道,播出动画等内容。

通过关键字「虚幻勇士 国产」我找到了广电于 2007 年发布的对 2006 年度电视动画发行许可的通告原文[4][5],其中谈及《虚幻勇士》假冒国产动画的封禁:

由上海录像影视公司、上海文广新闻传媒集团、广东安利伟影视制作有限公司(现已更名为广东原色动力影视制作有限公司)联合制作,并已取得国产电视动画片发行许可证的动画片《虚幻勇士》(沪动审字〔2006〕第003号)是一部假冒的国产动画片;

通过 Wayback Machine 我发现南方电视台的官网有快照信息,并且在 2010 年之前的快照页面上可以浏览到快照当天的部分节目预告清单。我挑了几个关键年份快速浏览了每个首页快照的节目预告信息,发现首页快照上的节目预告是所有频道混排的,能提供的信息有限,我转而去浏览了 TVS-5 和 TVS-6 的频道页面快照。经过一番浏览我发现一个信息,在 2007 年 8 月份的一快照上显示 TVS-5 频道播出的仍然是科教节目,同年 10 月的快照才显示了少儿频道的节目清单。也就是说,事实上 TVS-6 到 TVS-5 的频道切换最少是在 2007 年 8 月至 10 月之间完成的,并非维基百科上所言的 2005~2006 年间。我结合广电的通告时间,重点关注了 TVS-6 频道的页面快照,并最终在其 2006 年 9 月 2 日的快照上找到了我想要的信息。

超级卡通影城播出《虚幻勇士》
超级卡通影城播出《虚幻勇士》[6]

找到这张图的结果并非写得这样容易。事实上我在第一遍翻查快照时,翻遍了 Wayback Machine 上 TVS-6 从 2003 年至 2008 年的全部数百个快照,也许是粗心还是其它因素,并没有发现上图。在第二遍翻查时,重点浏览 2006 至 2007 的快照,才找到了 2006 年 9 月 2 日这一天。而在之后的第三遍翻查时,我才意识到,整个 2006 年 9 月到 10 月,就刚刚好只有 9 月 2 日这一天有快照,并且上面刚好登记了「17:30 超级卡通影城栏目播出《虚幻勇士》第 3、4 集」的预告。换句话说,上图中的信息是「独此一份」,是目前网络上公开可查且唯一的关于当年南方少儿频道 TVS-6 曾播出过《虚幻勇士》的直接证据!音乐元数据搜寻工作的好运气没有消散。

由于快照唯一,我无法得知完整的播放档。但是《虚幻勇士》一二两季共 52 集,按照每天播出两集计算,一个 9 月份即可播完。按照 9 月 2 日播出第 3、4 集的事实,我推测 9 月 1 日播出了第 1、2 集。换句话说,《虚幻勇士》于 2006 年 9 月 1 日首播于南方电视台 TVS-6 频道。我便是在这一个月,收看到了它。夏末秋初,傍晚黄金档,相信符合不少人关于此的记忆。对于在 9 月 1 日首播的推测,我通过当年的一则关于禁播境外动画片的新闻予以佐证:

据《广电总局关于进一步规范电视动画片播出管理的通知》,自2006年9月1日起,全国各级电视台所有频道在每天17时—20时之间,均不得播出境外动画片和介绍境外动画片的资讯节目或展示境外动画片的栏目。

根据该则新闻[7],2006 年 9 月 1 日恰好是相关规定实施的第一天。《虚幻勇士》在次年被查出假冒国产,也曾被大多数看过的人误以为是国产动画片,有理由相信当年其被披上国产作品身份过审并播出。通过快照可以看到,当年与 9 月最近的两次存档(分别在 8 月以及 11 月)可以得知,禁播令未生效的 8 月 21 日,TVS-6 在黄金时段 17:30 播放的是《名侦探柯南》,黄金时段二 18:45 播出的是《网球王子》,晚间时段 20:00 播出的则是《虹猫蓝兔卡通天地》[8];而在禁播令已然生效的 11 月,黄金时段 17:30 已改播出由广东一家公司于 1999 年制作国产动画片《新少年黄飞鸿》(我对这部动画片的印象也非常深刻,尤其是其中一段「在塔中通过武术打败石头象棋」的故事),晚间时段 20:00 播出的则是《四驱兄弟》[9]。如此节目档期调整后便完全符合生效的境外动画片禁播令要求。至此在禁播规定生效之日改播「国产的作品」以顶替此前播出的相对知名的日本动画片绝不无道理。而在更早些的 7 月份,黄金时段 17:30 超级卡通影城播出的是《光能使者》。如此连串起来,这一系列熟悉的动画名字,实在让我不得不重新回忆起那段时光。

后话

我找回了属于我的那段关于《虚幻勇士》的真实记忆,但同时我也因此意识到了一些原本我大概率不会想到的,让我觉得些许无奈又有些惊讶的事情。一个是原来早在我刚步入中学的年代,进口动画片的相关限制就已然开始了,这是我这个当年还有幸接触到那些优秀作品的 90 后未曾想到过的。对国产动画的倾斜扶持开展得比我想象中的要更早,只是咱们期待的崛起到来了吗?我浅浅认为原神能算一个?可是它不是动画啊…… 而另一个,则是关于《虚幻勇士》的,我开始思考,《虚幻勇士》与像我一样的其他人们在南方少儿台相遇的故事,到底是一场多大概率的偶然而又必然的事件?《虚幻勇士》的「国产化」是一次对境外禁播令的必然预判,还是一次偶然的漏网之鱼?禁播令生效、调档期改播国产、挑中「国产」的《虚幻勇士》,这一连串事件少发生一个都不会有我这篇文章了。这就是蝴蝶效应吧?

2007 年 1 月底《虚幻勇士》的 VCD 被发行上市[10][11]

……

写于 2023-09-01,与《虚幻勇士》相遇的第 17 年之际。

完。


  1. https://web.archive.org/web/20100512092320/http://www.tudou.com/playlist/id/1455688 ↩︎

  2. https://www.bilibili.com/video/BV1is411Z7VL/ ↩︎

  3. https://t.me/s/chawyehsu/19 ↩︎

  4. https://bangumi.tv/blog/314291 ↩︎

  5. https://web.archive.org/web/20071014174009/http://www.sarft.gov.cn/articles/2007/04/05/20070910172345930217.html ↩︎

  6. https://web.archive.org/web/20060902154439/http://www.tvscn.com:80/tvs6/ ↩︎

  7. https://web.archive.org/web/20230514005302/https://news.sina.com.cn/c/2006-08-13/01269732023s.shtml ↩︎

  8. https://web.archive.org/web/20060821001300/http://www.tvscn.com/tvs6/ ↩︎

  9. https://web.archive.org/web/20061105012111/http://www.tvscn.com/tvs6/ ↩︎

  10. https://web.archive.org/web/20070314005906/http://www.gdqh.com.cn/ ↩︎

  11. https://archive.ph/ia5HP ↩︎

☑️ ☆

用 Rust 写的 Scoop 再实现

开门见山,先放上项目地址:https://github.com/chawyehsu/hok

前言

了解 Scoop 或者已经是其用户的朋友从标题已经知道本文主题,大概点了上面的链接跳走了。没点的只好留下来,听我先给不了解的人稍微介绍下 Scoop。Scoop 是一个在 Windows 下的工具,通过一套规则来描述应用软件[1],然后提供命令行的方式来让用户相对方便地安装和管理使用的软件。它最初的开发受到过 Homebrew 的启发,虽然随着发展二者已大相径庭, Scoop 仍然在其 README 中留着对 Homebrew 的 Credit[2]

一直以来 Scoop 都没有标称自己是一个包管理器[3],但是它的主要功能和主流包管理器的功能又是有几分相似,所以一些用户愿意称其为 Windows 下的包管理器。相应的,也有(比如偏好 MSYS2 的)用户批评过 Scoop 根本没有提供包管理器「标配」的软件构建环境及 build from source 的能力,到底只不过是一个「软件安装器」。我作为使用 Scoop 已经有 8、9 年,于 20152018 两年先后为其写过两篇「荐」的用户,以为 Scoop 的这种形式更多是 Windows 软件分发现状下的一个些许无奈的折中选择,只能说是有人喜有人愁。强如微软官方出品 Windows Package Manager —— Winget 也还是没有走出这个窠臼。AppX/MSIX 的打包分发方式不是所有应用开发者都接受并统一采用,曾几何时我从 UWP 上看到的一点点软件分发整合的希望也在其放宽 Win32 API 使用后慢慢消去(虽说就开发者角度来说这是好事)。所以 Scoop 在某些场景下仍有它的一席之地,放到末端用户就是各取所需。


这是什么

接下来谈论的是本文的主角 Hok。它是一个用 Rust 写的 Scoop 再实现,提供与 Scoop 类似的 CLI 接口,目标是实现 Scoop 已有的功能,如应用的检索、安装卸载、列表与状态、桶管理等等。实际上 Hok 只是一个 CLI 前端,其背后的 libscoop 才是这个再实现的核心。后文会再提到 libscoop。

Scoop 用户在饱受着 scoop search 极度缓慢的折磨[4],带防火墙 debuff 的用户更是如此。早期的 Scoop 还不支持远程搜索[5],那时候搜索速度其实是很可以的。为了解决搜索体验问题,社区里出现了各种各样的解决方案,比如 Go 实现的 scoop-search 是社区里很流行的一个[6],也有其它如 Python + SQLite 的实现,以及依托 Azure Search 实现的 ScoopSearch(后来成为了 Scoop 官网上提供的在线搜索[7])等等。

然而社区里这些方案,都不约而同地只专注于解决搜索问题,并没有在其它方面做更多的尝试。也许是搜索问题太过于「碍眼」,导致其它如 scoop listscoop statusscoop update 等命令的效率问题不入法眼。而 Hok 便是在解决了搜索问题的基础上,更进一步去尝试解决这些也让我难受的点,最终成为一个奔着完整实现而进行的项目。


开始尝试

假设你已经有在使用的 Scoop 环境,那么你可以使用一下命令来安装体验 Hok:

scoop bucket add dorado https://github.com/chawyehsu/dorado
scoop install dorado/hok

dorado 是我维护了许久的一个桶,里面有不少我在用的或者接收 Pull Request 进来的软件。 Hok 是 native 的,可以脱离 Scoop 运行,所以其实也可以从 GitHub Release 页面下载二进制文件直接使用。但是因为 Scoop 的一些功能在 Hok 上还未被实现,所以单独用 Hok 的话会缺失关键功能,建议还是附在 Scoop 上。

安装完成后,可以使用 hok help 先查看 Hok 的帮助信息,了解下 Hok 的命令行接口:

$ hok help
Hok is a CLI implementation of Scoop in Rust

Usage: hok.exe <COMMAND>

Commands:
  bucket     Manage manifest buckets
  cache      Package cache management
  cat        Inspect the manifest of a package
  cleanup    Cleanup apps by removing old versions
  config     Configuration management
  hold       Hold package(s) to disable changes
  home       Browse the homepage of a package
  info       Show package(s) basic information
  install    Install package(s)
  list       List installed package(s)
  search     Search available package(s)
  unhold     Unhold package(s) to enable changes
  uninstall  Uninstall package(s)
  update     Fetch and update subscribed buckets
  upgrade    Upgrade installed package(s)
  help       Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

Type 'hok help <command>' to get help for a specific command.

为了照顾一些个使用习惯,Hok 的命令行接口被设计得与 Scoop 的接口有一定的相似性,比如 hok buckethok homehok hold/unhold 等。但是由于 Hok 背后的 libscoop 在内部实现上与 Scoop 不尽相同(主要是多了一些我个人的思考及针对我个人使用习惯的调整),所以体现到 Hok 的命令行接口上也有了一些变化。接下来我会逐一对目前 Hok 提供的各个命令做具体的介绍。这部分也许该写成使用文档放到项目里,但目前就先放在这吧。


hok bucket

桶管理命令。这个子命令与 Scoop 的 scoop bucket 子命令几乎一致,唯一的一个不同是 Scoop 使用 scoop bucket known 来列出内置的(官方)桶[8],而 Hok 使用 hok bucket list -k|--known 来做同样的事情。

$ hok bucket --help
Manage manifest buckets

Usage: hok.exe bucket [COMMAND]

Commands:
  add     Add a bucket
  list    List buckets
  remove  Remove bucket(s)
  help    Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

hok cache

下载缓存管理,对应 scoop cache。Scoop 使用 scoop cache [show] 列出下载缓存列表, Hok 使用 hok cache list [query],其中 query 可以作为过滤条件,只列出包含 query 的缓存。

Scoop 使用 scoop cache rm <app|*> 来删除缓存,类似的 Hok 使用 hok cache remove <query> 来删除缓存,其中 query 同样支持通配符 * 删除全部缓存。

$ hok cache --help
Package cache management

Usage: hok.exe cache [COMMAND]

Commands:
  list    List download caches
  remove  Remove download caches
  help    Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

hok cat

全文输出包的 manifest 详情。hok catscoop cat 的用法完全一致,但是 hok cat 多了对同名包的选择功能,如果你本地的不同桶之间存在同名的包的话,scoop cat <app>会自动选择第一个找到的包,而 hok cat <app> 则会列出所有同名包,让你自己选择。

$ hok cat --help
❯ hok cat
Inspect the manifest of a package

Usage: hok.exe cat <package>

Arguments:
  <package>  Name of the package to be inspected

Options:
  -h, --help  Print help

$ hok cat git
Found multiple packages named 'git':

  0. dorado/git (https://gitforwindows.org)
  1. main/git (https://gitforwindows.org)

Please select one, enter the number to continue: 0

同名包的选择功能在 hok home 等其它命令中也同样存在。

hok cleanup

清理命令,对应 scoop cleanup。Hok 暂未实现 cleanup 功能,所以在这里它只是个 placeholder。

$ hok cleanup --help
Cleanup apps by removing old versions

Usage: hok.exe cleanup [OPTIONS] [app]...

Arguments:
  [app]...  Given named app(s) to be cleaned up

Options:
  -k, --cache  Remove download cache simultaneously
  -h, --help   Print help

hok config

配置管理命令。Scoop 使用 scoop config 展示配置,Hok 使用 hok config list 以 JSON 格式展示。Scoop 使用 scoop config <key> <value> 设置配置,Hok 使用 hok config set <key> <value> 来设置配置,Scoop 允许给任意 key 设置值,而 Hok 会检查 key 是否合法。Scoop 使用 scoop config rm <key> 删除配置,Hok 使用 hok config unset <key> 来删除配置。

$ hok config --help
Configuration management

Usage: hok.exe config [COMMAND]

Commands:
  edit   Edit the config file [default editor: notepad]
  list   List all settings in key-value
  set    Add a new setting to the config file
  unset  Remove a setting from config file
  help   Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

Hok 支持使用 hok config edit 命令调用外部编辑器来编辑配置文件。Hok 会使用环境变量 EDITOR 的值作为调用的编辑器,比如设置了 EDITOR=nanonano 就会被用作打开配置的编辑器。如果没有 EDITOR 环境变量,Hok 会使用 notepad 来打开配置文件。

直接调用 nano 编辑配置文件
直接调用 nano 编辑配置文件

Hok 完全继承并兼容 Scoop 的配置文件,虽然 Hok 不会去使用其中如 aria2 等的配置项,但是为了兼容性 Hok 支持解析和编辑这些配置。Hok 甚至已经率先支持 portable config file[9]

hok hold/unhold

包锁定/解锁命令,对应 scoop hold/unhold。Hok 的 holdunhold 命令均与 Scoop 对应命令的用法一致。

$ hok hold --help
Hold package(s) to disable changes

Usage: hok.exe hold <package>...

Arguments:
  <package>...  The package(s) to be held

Options:
  -h, --help  Print help

$ hok unhold --help
Unhold package(s) to enable changes

Usage: hok.exe unhold <package>...

Arguments:
  <package>...  The package(s) to be unheld

Options:
  -h, --help  Print help

hok home

打开包主页的命令。Hok 的 home 命令与 Scoop 对应命令的用法一致,但是 hok home 多了对同名包的选择功能,具体说明见上文 hok cat

$ hok home --help
Browse the homepage of a package

Usage: hok.exe home <package>

Arguments:
  <package>  The package name

Options:
  -h, --help  Print help

$ hok home pixitracker
Found multiple packages named 'pixitracker':

  0. dorado/pixitracker (https://www.warmplace.ru/soft/pixitracker/)
  1. extras/pixitracker (https://warmplace.ru/soft/pixitracker/)

Please select one, enter the number to continue: 1

hok info

包信息命令,对应 scoop info。Hok 的 info 命令与 Scoop 对应命令有所不同, scoop info <app> 只会精确匹配包名,而 hok info <query> 中的 query 是一个正则表达式入参,当输入 hok info git 时会列出所有包名中包含 git 的包的信息。

$ hok info --help
Show package(s) basic information

Usage: hok.exe info <query>

Arguments:
  <query>  The query string (regex supported)

Options:
  -h, --help  Print help

hok install

包安装命令。在对包的安装、更新、卸载操作上,Hok 有着一套相对于 Scoop 改动比较大的设计,这也是 Hok 及其背后的 libscoop 之于 Scoop 区别最大的部分。依托于这部分设计改动, Hok 得以实现对同名包的选择与替换、锁定包强制更新等功能。

$ hok install --help
Install package(s)

Usage: hok.exe install [OPTIONS] <package>...

Arguments:
  <package>...  The package(s) to install

Options:
  -d, --download-only   Download package(s) without performing installation
  -f, --ignore-failure  Ignore failures to ensure a complete transaction
  -o, --offline         Leverage cache and suppress network access
  -y, --assume-yes      Assume yes to all prompts and run non-interactively
  -D, --ignore-cache    Ignore cache and force download
  -I, --independent     Do not install dependencies (may break packages)
  -R, --no-replace      Do not replace package(s)
  -S, --escape-hold     Escape hold to allow changes on held package(s)
  -U, --no-upgrade      Do not upgrade package(s)
      --no-hash-check   Skip package integrity check
  -h, --help            Print help

但是截至目前 libscoop 在这部分功能的实现上还不完整,所以 Hok 的 install 命令也是不完整的,一些参数的功能也还未实现。具体实现到什么程度,可以自行体验或者查看源码和 CHANGELOG。hok install <package> 中的 package 同样支持 Scoop 那样的桶前缀指定,比如 dorado/git

$ hok install git -DS
Resolving packages...
Found multiple candidates for package 'git':

  0: dorado/git
  1: main/git

Please select one, enter the number to continue: 1
Calculating download size...
The following packages will be REPLACED:
  doradomain/git

Total download size: 55 MB

Do you want to continue? [y/N]: n
Not implemented yet.

hok list

已安装包的列表命令。Hok 的 list 命令与 Scoop 对应命令的基础用法一致,同时提供复杂的筛选功能。hok list [query] 中的 query 是一个正则表达式入参,支持以正则表达式的方式对已安装包的列表进行筛选。同时 query 还支持桶前缀指定。结合正则和桶前缀,可以实现诸如 hok list extras/hok list "dorado/^[c|g]"hok list main/git$ 这样的筛选。Hok 还支持使用 hok list --held 查看被锁定的包。

$ hok list --help
List installed package(s)

Usage: hok.exe list [OPTIONS] [query]...

Arguments:
  [query]...  The query string (regex supported by default)

Options:
  -e, --explicit    Turn regex off and use explicit matching
  -u, --upgradable  List upgradable package(s)
  -H, --held        List held package(s)
  -h, --help        Print help

Hok 将原本属于 scoop status 的查看可更新包的功能移到了 hok list 中,使用 hok list --upgradable 可以查看可更新包的列表。

$ hok list dorado/^g --upgradable
git/dorado 2.41.0.windows.1 -> 2.41.0.windows.3 [held]
gnupg-np/dorado 2.4.2 -> 2.4.3

hok search

包搜索命令。搜索功能可以说是整个 Hok 项目的核心,也是因为 Scoop 的搜索效率问题,才有了 libscoop 和 Hok。Hok 的 search 命令与 Scoop 对应命令的不同点在于, scoop search 会远程搜索那些没有挂载到本地的官方桶,hok search 只会搜索本地桶。另外,scoop search 强制对包名、包描述以及 shim 均进行匹配,而 hok search 默认只对包名进行匹配,提供 --with-description--with-binary 选项来开关对 shim 和包描述的匹配。这些调整为的都是最大化搜索效率。

$ hok search --help
Search available package(s)

Usage: hok.exe search [OPTIONS] <query>...

Arguments:
  <query>...  The query string (regex supported by default)

Options:
  -e, --explicit          Turn regex off and use explicit matching
  -B, --with-binary       Search through package binaries as well
  -D, --with-description  Search through package descriptions as well
  -h, --help              Print help (see more with '--help')
Benchmark of search
Benchmark of search

hok list 一样,hok search <query> 中的 query 同样是一个正则表达式入参,支持正则搜索,可以使用 --explicit 选项来关闭正则,转为使用精确匹配。同样的,这里的 query 也支持桶前缀指定,也是一个变长入参,可以同时指定多个查询。

$ hok search minecraft extras/^clash ^git$
clash-verge/extras 1.3.5
clash.mini/extras 0.2.2
git/dorado 2.41.0.windows.3 [installed: 2.41.0.windows.1]
git/main 2.41.0.3
minecraft/games nightly

hok uninstall

包卸载命令。上文讲到,与 Scoop 相比,Hok 对包的安装、更新、卸载操作有较大改动。 hok uninstall 执行时默认会检查待卸载包的依赖关系,如果有其他包依赖待卸载包,则会终止卸载操作,避免破坏依赖。这应该是正常策略,只是 Scoop 好像没有考虑到这点。通过使用 --no-dependent-check 可以关闭这个依赖检查,强制卸载待卸载包,这可能会导致其他包无法正常运行。

$ hok uninstall --help
Uninstall package(s)

Usage: hok.exe uninstall [OPTIONS] <package>...

Arguments:
  <package>...  The package(s) to uninstall

Options:
  -c, --cascade             Remove unneeded dependencies as well
  -p, --purge               Purge package(s) persistent data as well
  -y, --assume-yes          Assume yes to all prompts and run non-interactively
      --no-dependent-check  Disable dependent check (may break other packages)
  -S, --escape-hold         Escape hold to allow to uninstall held package(s)
  -h, --help                Print help

默认情况下,被锁定的包无法被卸载,使用 --escape-hold 可以绕过这个限制,强制卸载被锁定的包。此外,hok uninstall 支持使用 --cascade 选择开启「级联卸载」,这会在卸载包时同时检查其依赖,如果依赖包不再被其他已安装包依赖,则会一并卸载。 --purge 选项与 scoop uninstall --purge 一致,用于卸载包时一并清理包的持久化数据。

$ hok uninstall swift --cascade
Resolving packages...
The following packages will be REMOVED:
  dorado/swift-5.8.1  main/dark-3.11.2

Do you want to continue? [y/N]: n

hok install 一样,hok uninstall 的主体功能尚未完整实现,请留意项目 CHANGELOG。

hok update

桶更新命令。Hok 的这个命令只保留了 scoop update 里更新所有订阅到本地的桶的功能。

$ hok update --help
Fetch and update subscribed buckets

Usage: hok.exe update

Options:
  -h, --help  Print help

hok upgrade

包更新命令。与 Scoop 的 scoop update 更新包相对应的功能,在 Hok 中被移到了 hok upgrade 这里。hok upgrade 类似于 scoop update *,会更新所有已安装包,除了被锁定的包。被锁定的包可以通过 --escape-hold 选项来强制更新。使用带参的 hok upgrade [package] 可更新指定的包。

$ hok upgrade --help
Upgrade installed package(s)

Usage: hok.exe upgrade [OPTIONS] [package]

Arguments:
  [package]  The package(s) to be upgraded (default: all except held)

Options:
  -f, --ignore-failure  Ignore failures to ensure a complete transaction
  -o, --offline         Leverage cache and suppress network access
  -y, --assume-yes      Assume yes to all prompts and run non-interactively
  -S, --escape-hold     Escape hold to allow to upgrade held package(s)
      --no-hash-check   Skip package integrity check
  -h, --help            Print help

无论是 hok upgrade 还是 hok install 默认状态下都会结合本地下载缓存的情况预先获取并计算需要下载的文件大小,而通过 --offline 选项可以关闭网络访问,强制只使用本地的下载缓存来安装或更新。但这取决于本地缓存的有效性,如若无效,安装或更新操作会失败。

$ hok upgrade git --escape-hold
Resolving packages...
Calculating download size...
The following packages will be UPGRADED:
  dorado/git-2.41.0.windows.3

Nothing to download, all cached.

Do you want to continue? [y/N]: n

以上就是 Hok 目前阶段提供的所有命令的介绍。通过这些介绍,应该可以大致了解到 Hok 的开发思路。因为还在绝赞进行中,所以命令的功能还不完整,有些甚至还未实现,只是预留了个坑在那里。所以完全有可能会变化,还是那句请留意项目 CHANGELOG 以了解最新进展。


为什么做

关于这个,在文章开头部分其实已经有所提及。一开始完全是因为 scoop search 的搜索效率问题,继而想去解决更多我个人使用 Scoop 时遇到的痛点。Hok 这个项目其实是「老坑新开」的,有心的可以去仓库翻 git log 了解一下,早在两年前我就已经下锄头挖坑了,只是中途断了一段时间,最近才又开始填坑。个中原因不便细说,反正是按自己需求来的个人项目,见步行步。

为什么不直接贡献 Scoop

实话说,我作为 Scoop 的 maintainer team 成员之一,不去贡献 Scoop 而是自己写一个新的东西,这好像是有点说不过去。但是 Scoop 作为一个近 10 年的项目,拥有我觉得还挺庞大的用户量,我是不太能按个人想法去改动一些东西的,会很容易影响到其他用户。而且不是说一个 maintainer 就能确定发展方向,有积累的项目就会有惯性,想要改动一些东西也不是那么容易的。按自己的需求来做个新的相对容易推动些,另外这也算是个试验田,也许能在后续给 Scoop 带来一些反向作用力,进而反哺回去。

为什么是 Rust

这似乎是个逃不开的话题,尤其是在好像「Rewrite Everything in Rust」被调侃成为一个梗之后。既然选择了 Rust 写 Hok,是要回答一下。理由其实很简单,我单纯想学 Rust,所以就用 Rust 来开坑了。这几年是切身感受到了 ripgrepbathyperfine 以及 starship 等项目给我带来的愉悦,也许这些项目背后的 Rust 语言不过是一个次要因素。这里并不是如那般狂热的 RIIR 信徒[10],因为不是用 Rust 写一遍就能解决所有问题,任何语言,背后关键的还是人和思想。Rust 的学习曲线也确实挺如网络上传说的那般陡峭,对于我这种仍未学会 C++ 的人来说更甚,真的是有「从入门到入门,到再三入门」的感受。而且学了没地方用,非常容易忘,我好像又忘了 Pin/Unpin 和一些其它的东西了。虽说如此,那个连续数年被评为最想学语言的 Rust 还是值得我去探索一下,学 Rust 后反过来再尝试读一些 C/C++ 的代码,至少我觉得会有一些帮助。

Hok 完全可以用其它语言来写。Scoop 是用 PowerShell 编写的,理论上用 PowerShell 背后的 .NET/C# 来写会更方便和直接一些,甚至可以无缝过渡。PowerShell 直到 v7 才支持ForEach-Object -Parallel[11],Scoop 目前还得支持 v5 的 Windows PowerShell,所以继续用 PowerShell 改善 Scoop 的性能问题是有点技术包袱的。然后 Scoop 最近的一些优化改动,多少其实都在渐渐引入一些 .NET/C# 的接口,并非纯纯 PowerShell 实现。


libscoop 的 roadmap

Hok 项目的核心是其中的 libscoop 库,之所以抽出 libscoop 这层抽象,当然是为了后续 hok-gui 甚至 hok-tui 的可能,不过这都是待定的事情,也不一定做(得出来)。目前短中期的路线图主要是完成 (un)install/upgrade 等核心命令的实现。这里面我认为的一大难点是如何处理那些带着一长串 PowerShell 脚本的包,这些脚本基本都是用来做一些复杂的安装卸载工作,而且这些脚本的上下文多少都是依赖于 Scoop 本身的。Scoop 允许利用钩子脚本做一些额外的工作,却完全将其内部所有细节暴露了出来,导致不少 manifest 有点滥用 Scoop 内部功能的情况。在 Rust 侧除了考虑是直接 Command call 还是实现 native hosting 来执行这些脚本外,还得考虑如何提供这些执行上下文。另外 shimming 如何处理以什么形式分发也是个问题。

结语

Hok 毕竟是一个实验性质的个人项目,但我想把它分享出来,收获一些正向反馈也好负向反馈也罢,至少有些作用力。埋头搞事只有输入没有输出的状态挺让人难受的,是需要些正反馈。

上一次写博客还是世界巨变的几年前,博客至少还在线哈哈。这是我这些年以来第三次写关于 Scoop 的内容,按这个越写越长的趋势,不知道还会不会有第四次呢。

如果你对 Hok 这个项目感兴趣,或者有什么想法,欢迎借由各种途径留言。

回见。


  1. https://github.com/ScoopInstaller/Scoop/wiki/App-Manifests ↩︎

  2. https://github.com/ScoopInstaller/Scoop#inspiration ↩︎

  3. A command-line installer for Windows. ↩︎

  4. https://github.com/ScoopInstaller/Scoop/issues/4239 ↩︎

  5. https://github.com/ScoopInstaller/Scoop/commit/bea31895 ↩︎

  6. https://github.com/shilangyu/scoop-search ↩︎

  7. https://github.com/ScoopInstaller/scoopinstaller.github.io-indexer ↩︎

  8. https://github.com/ScoopInstaller/Scoop/blob/master/buckets.json ↩︎

  9. https://github.com/ScoopInstaller/Scoop/pull/5369 ↩︎

  10. https://github.com/ansuz/RIIR/issues/ ↩︎

  11. https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/ ↩︎

☑️ ☆

结合响应式图片实现更好的图片懒加载方案

作为在网页性能调优方面常被使用的技巧之一,懒加载或者说延迟加载是在谈及「前端性能优化」话题时不得不说的一项技术。

延迟加载是一种在加载页面时,延迟加载非关键资源的方法, 而这些非关键资源则在需要时才进行加载。—— Google Deveplopers

其实说到懒加载,这项技术已经不局限于单一的图片懒加载。除了图片外,懒加载也早就应用到了视频、音频等其它媒体资源的优化上,同时随着组件化思维的不断深化,本着懒加载的核心观点 —— 用户暂时用不到的资源又能延迟去加载的,就大可做成懒加载,WebComponent 也已经纳入到懒加载优化当中,现代前端各种构建工具、类库,都有做相关的优化,进行组件资源的按需加载。本文主要把焦点聚集到“图片”的懒加载处理上,做一番探讨。


原理

图片懒加载的原理其实非常简单:使用手段让 <img> 元素默认只载入非常小的图片内容,再利用 JavaScript 检查元素是否在视口中。 如果元素在视口中,则往其 src(有时是srcset)属性中填充真正所需图像内容的地址,加载真正的图片,实现延迟加载。

最早的也是最为有名与流行的实现方式看起来大致如下:

<img src="blank.gif" data-src="normal.jpg" alt="IMG" />

或者使用 base64 内联:

<img src="data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs=" data-src="normal.jpg" />

更懒的方式甚至会像下面这样省掉占位用的小图,当然这种方式是不被推崇的,留空的 src 属性会带来多余的、有害的网络请求[1]。你可以完全不写 src 属性,这样虽然不符合规范,但是也能工作,但不要留空 src[2]

<img src="" data-src="normal.jpg" alt="IMG" />

简单直接是这种方式能成为主流的原因。一张宽高仅有 1px 的透明不可见的 blank.gif,作为默认载入的占位图最合适不过,只有非常小的体积,网页初始化后迅速载入,而真正所需图像的地址被放到了约定的 data-src 属性里。当 JavaScript 代码检测到(通过页面载入/ 滚动)图片进入视口时,便将 data-src 中的值赋给 src 属性,替换掉 blank.gif,触发原始所需图片的加载。但这种简单有力的方式,有些弊端。

问题

首先,其中一个非常直观可见的问题是「布局抖动」。在图片懒加载时,由于默认载入的 blank.gif 图片几乎没有大小,真正的图片还没有经过浏览器载入,浏览器就无法确定需要给原始图片预留多大的位置。当真正的图片加载完成后,网页就会出现肉眼可见的布局抖动问题。虽然该问题实际对内容本身没有影响,但影响的是用户体验。

布局抖动(图源:Davide Calignano)
布局抖动(图源:Davide Calignano

解决办法是给图片元素设置已知的宽高(元素属性或者 CSS 样式都行),这样浏览器就可以根据宽高预留位置。

<img src="blank.gif" data-src="normal.jpg" style="width:800px;height:600px;" />

当然固定宽高大小对响应式布局来说不友好,于是就出现了更好的「长宽比盒子」技巧,根据图片宽高计算出图片的长宽比,利用长宽比与 Padding 边距设定占位元素。

<div class="aspect-ratio-box">
  <img src="blank.gif" data-src="normal.jpg" />
</div>
.aspect-ratio-box {
  position: relative;
  /* 根据宽高比计算设置 box 的 padding-bottom */
  padding-bottom: 62.5%;
}

.aspect-ratio-box img {
  position: absolute;
  height: 100%;
  width: 100%;
}

利用长宽比盒子,就能在响应式布局页面中,较好地处理图片懒加载布局抖动的问题。其实更多的长宽比盒子实际用例是用在响应式 video 元素上,关于长宽比盒子技术,可以进一步阅读 CSS-TRICKS 的文章 —— Aspect Ratio Boxes。布局抖动解决后样子如下:

占位防抖动(图源:Davide Calignano)
占位防抖动(图源:Davide Calignano

第二个问题是,这个图片懒加载的最原始实现,没有考虑到响应式图片Responsive Images)技术的到来。

<img srcset="small.jpg 100w, middle.jpg 200w, large.jpg 300w" data-src="normal.jpg" />

不过好在如今的各种 LazyLoad 类库,都已经针对这个问题做了优化,对响应式图片做了兼容。只需要将原来单一图片的 data-src 换成多张图的 data-srcset 即可。

<img src="blank.gif" data-srcset="small.jpg 100w, middle.jpg 200w, large.jpg 300w" />

data-srcset 列出可供懒加载使用的响应式图片,类库就会自动根据终端判断加载哪一张。

第三个问题是一个比较严重的问题,问题的根源在于懒加载中 src 属性的 blank.gif 这张占位图本身。为了压缩体积,降低初始载入时间,选用了一张非常小的图。默认载入的这张图虽然在用户浏览站点自身网页时,没什么区别,因为有懒加载脚本加持。但对于站外来说,这张小图带来的影响却是致命的,因为站外访问内容时,没有图片懒加载。

这就产生了严重的弊端,blank.gif 懒加载的方式,对站外 SEO、社会化分享以及 RSS 等稍后阅读工具非常不利。除了站点自身,几乎所有站外的工具服务,都不会刻意在引用你的内容时,帮你处理懒加载。于是,Google 爬虫爬取你的网页内容时,只会爬到带有 blank.gif 的“空白” <img> 标签,Google 帮你缓存的网页快照,都会是“缺图”的;同时,通过社会化分享功能将内容分享到如 Twitter、Facebook 等站外时,你的内容也会是“无图”的;更惨的是,通过 RSS、Pocket 等稍后阅读工具订阅了你站点内容的读者,他们在阅读工具里无法看到你文章中所有懒加载的图片,阅读工具里有的,只是空空的 blank.gif。

RSS 阅读器无法读取懒加载的原图
RSS 阅读器无法读取懒加载的原图

于是,问题来了之后就触发了又一次的迭代。尝试修正如下:

<img src="small.jpg" data-src="normal.jpg" />

最直接的更改,选取一张由原图经过压缩后的 small.jpg 作为懒加载占位图,也就是我们常说的 thumbnail。比如原图的分辨率是 2000x1000,体积是 2MB,经过压缩后的小图是 200x100,体积是 20KB。这样,初始加载这张缩略图仍然会比加载原图快速,同时站外 SEO、RSS 阅读器等也能读取到缩略图勉强解决看不到图的问题。这里我们暂且不谈用压缩的小图替换 blank.gif 时带来的额外工作量问题 —— 需要对每一张原图生成缩略图。该方案仍然不是一个完美的方案。


改进

先抛出一个自我打击:如果一直从“先人”创造的最早的图片懒加载方法入手,打死我也不会想到下面这个改进的方案。这里我先直接亮出改进方案的实例:

<div class="aspect-ratio-box" style="padding-bottom:56.25%;">
  <img
    src="original.jpg"
    srcset="thumbnail.jpg"
    data-srcset="small.jpg 100w, middle.jpg 200w, large.jpg 300w"
  />
</div>

这个改进的图片懒加载方案有包括但不限于以下一些特性:

  • 支持响应式图片(Responsive Images)、支持 webp 格式
  • 对响应式布局友好、支持移动终端屏幕旋转时进行图片大小重绘
  • 使用了 srcset 的特性,在主流的现代浏览器上有完整的支持,同时覆盖率高[3]
    • 在无法支持 srcset 或者懒加载类库不能生效的旧浏览器上可完美回退(Fallback)
  • 对站外 SEO、社会化分享、RSS 稍后阅读等工具服务友好
  • 占位用的缩略图可配置性极强,支持多种 placeholder 展示形式

以下来说说这个改进方案的魔法之处。还记得最早的图片懒加载方法吗?没错,就是为了避免初始加载原图,刻意src 属性的图替换成了空占位图/缩略小图,把原图放到约定的 data-src 属性的旧方法:

<img src="blank.gif" data-src="normal.jpg" />

既然直接在 src 属性上动刀会产生那么多问题,那么有没有什么办法能在不改动 src 属性的基础上,通过其它办法避免浏览器初始加载 src 属性中的原图,实现懒加载呢?有!下面说一下改进方案的魔术原理。

  1. 首先,带有 .aspect-ratio-box 类选择器的外层 <div> 标签,是用来保证懒加载图片在未载入原图时的占位大小的。这个其实是前文说的「长宽比盒子」技巧,解决布局抖动问题,这里没什么特别点。

  2. 改进方案中 <img> 标签中的 src 属性携带的仍然是原始大小的图片 original.jpg,确保了站外 SEO、社会化分享、RSS 等不会读不到原图。src 中就是未改动的原图,该读取原图的还是原图。

  3. 改进方案中 <img> 标签,利用 srcset 属性存放了一张缩略图 thumbnail.jpg。正是这张缩略图,有着与 blank.gif 异曲同工的效果 —— 能够阻止 <img> 初始化时 src 原图被加载。这便是改进方案的关键点

  4. 最后也是不可或缺的一步,为保证懒加载能正常完成整个逻辑,同时保证对响应式图片的支持,改进方案中 <img> 标签将原本应该在 srcset 中的响应式图片列表,存放在了约定的 data-srcset 中。当图片进入视口时,懒加载类库就会用 data-srcset 中的响应式图片地址列表,替换掉实际在 srcset 中的缩略图。最后浏览器再根据终端计算判断,选择加载 src 属性与 srcset 属性中的图片。

srcset 兼容性(2019 年 7 月)
srcset 兼容性(2019 年 7 月)

正是通过这么一连串与早期方案截然不同的流程,完美地避开了动刀 src 属性产生各种问题的同时,保证了懒加载功能的正常进行。这一切,全得益于 srcset 这个神奇的 HTML5 属性,以及其与 src 属性以及浏览器三者之间的完好协作。

后记

这么一个突破固有思维的改进方案,当然不是我一下拍脑子能想得出来的,毕竟我还是太菜了,有些东西得继续学习。能了解到这个技巧,全赖「业务是驱动技术发展的主要力量」—— 自从博客更换了系统后,饱受原始图片懒加载方式带来的,布局抖动与 RSS 阅读器不友好的困扰。一直在寻找更好的方案处理博客文章图片的懒加载,直到最近才从谷歌中搜索到 Ivo Petkov 写的懒加载类库 —— responsively-lazy,并进一步阅读了其相关文章,于是才了解到这么个创新想法。

在目前能找得到的绝大多数 LazyLoad JS 类库中,基本上都是改 src 属性的方案,也就存在改 src 产生的问题。Ivo Petkov 的方案真让我耳目一新,只可惜他写的 responsively-lazy 类库已经很久没有维护了,甚至还有使用老式的 getBoundingClientRect() 办法检测元素的出现,而不是像 lozad 那样使用精简有力的 IntersectionObserver API。但这并不妨碍新方案本身,创新想法上的发光点。

如果你还在犹豫是否使用响应式图片、图片懒加载的话,读到这里,就不要犹豫了。快试试吧,还能同时用上呢。

参考

其它前文未曾列出过的参考文章:

  • Lazy load responsive images - Ivo Petkov[4]
  • 图片懒加载从简单到复杂 - OnionTalk[5]
  • Sizing Fluid Image Containers with a Little CSS Padding Hack - Andy Shora[6]

  1. https://csspod.com/frontend-performance-best-practices/#src ↩︎

  2. https://www.quora.com/Is-it-OK-to-omit-the-src-attribute-from-an-IMG-tag-in-HTML ↩︎

  3. https://caniuse.com/#feat=srcset ↩︎

  4. https://ivopetkov.com/b/lazy-load-responsive-images/ ↩︎

  5. https://hateonion.me/posts/19jan30/ ↩︎

  6. https://www.andyshora.com/css-image-container-padding-hack.html ↩︎

☑️ ☆

35 年后,竹内玛莉亚的 Plastic Love 有了官方 MV

UPDATE Mar/2021:得知完整版 MV 已经流出,在文章内更新了完整版 MV,补充了 MV 主演、导演等 meta 信息,对文稿做了些许排版调整,修复了一些小错误。


今天我们来谈谈音乐吧,这是我很喜欢的一个话题。聊聊音乐趣事,当然可能会扯到些扩散话题。

旧事物总有一天会重新闯入你的生活,即使那不是你的过去

2019 年 5 月 16 日,日本华纳音乐Warner Music Japan在流媒体网站 YouTube 上传了竹内玛莉亚竹内まりや的一首大热单曲《プラスティックPlasticラブLove》的一支先行版Short ver. MV[1]。这首在 2018 年引起病毒式传播的歌曲,在发布的 35 年后,“意外地”拥有了它的官方 MV。

▲ Plastic Love Official Music Video

2020 年 11 月,这个让不少乐迷们苦等了一年多的完整版 MV,终于随着竹内玛莉亚出道 41 年以来首次发售的影像作品《souvenir the movie 〜MARIYA TAKEUCHI Theater Live〜》一同“上画”。MV 由林響太朗执导,上杉柊平仁村紗和分饰男女主演,作成于 2019 年。


如果你还未曾对这首极具时代色彩的日本 City Pop 歌曲有所了解的话,别担心,点击播放这首歌曲,来与我一边感受日本八十年代特有的气息,一边继续慢慢阅读下文。

1984 年,结婚两年后的竹内玛莉亚以专辑《Variety》复出,正式完全转型为创作歌手。对于这位当时还是 29 岁的音乐人而言,这张专辑的推出成为了她的一个重要转折点 ——《Variety》是竹内玛莉亚的第一张登顶日本公信榜 Oricon 榜的专辑[2]

而 Plastic Love,便是这张专辑中的其中一首,也是后来竹内玛莉亚在全球范围内最为知名的一首歌曲。次年的 3 月 25 日,Extended Club Mix 版本的 Plastic Love 作为一支单曲发行,一度冲上 Oricon 榜第 86 位。

▲ 《Plastic Love -Extended Club Mix-》
▲ 《Plastic Love -Extended Club Mix-》

竹内玛莉亚的许多歌曲都曾被翻唱过,比如陈慧娴的《岁月流声》便是翻唱自她的《Natalie》,草蜢的《原谅我是我》翻唱自《シングル・アゲイン》。当然这首 Plastic Love 也不例外,梅艳芳就为此翻唱过两个版本 —— 国语版的《找爱的人》以及粤语版的《寻爱》。由此可窥见此曲的魅力[3]

不过,真正将 Plastic Love 这首歌曲重新带到当下人们的视线中,并引爆传播炸弹的,是来自 YouTube 上关于这首歌曲的奇妙事件……

这就是互联网的迷幻之处,我真的不知道为什么突然就……

2017 年 7 月 5 日,YouTube 上一个名为 Plastic Lover 的不知名帐号,平常地上传了一个名为「Mariya Takeuchi 竹内 まりや Plastic Love」的视频,其中的音频是 Plastic Love 歌曲的 7 分钟饭制加长版本,而提供的画面是一张静止的照片。只是,这张照片并不是所想的 Plastic Love 单曲的封面,而是来自于竹内玛莉亚另一张单曲《Sweetest Music / Morning Glory》的封面。

▲ Mariya Takeuchi 竹内 まりや Plastic Love
▲ Mariya Takeuchi 竹内 まりや Plastic Love

到此,奇妙的故事才刚刚开始。

一个无人关注、平庸如常的普通帐号,上传了一个有好看封面的音乐分享视频。这本该是一件普通地不能再普通的事情。但是这一份普通,却似乎是被当时的 YouTube 给看上了。在视频被上传之后,YouTube 的推荐算法开始将这个视频“有意无意地”推送到了一部分用户的「接下来播放」列表中,以试探这些用户是否对此感兴趣。

而事实是,确实有一批用户认真的看完了这个视频,同时将 Plastic Love 加入到了他们的音乐播放列表中。这些用户的反应让 YouTube 推荐算法做出了更进一步的动作 —— 向更多用户推送这个视频。最终的结果便是,截至 2019 年 5 月,这个由爱好者上传的音乐视频累计获得了 2500+ 万次播放,并让 Plastic Love 这首歌成为了 2018 年 YouTube 上最流行的歌曲之一。这首三十多年前的老歌,重新进入了广大互联网居民的讨论圈中。同时带来的,还有相当一部分人在尝试寻找为什么 YouTube 的推荐算法会有这么一个“癖好”的完美解答,以及一个对 J-Pop 音乐子类 City Pop 的挖坟复古热潮。

▲ YouTube 的算法怎么了 / 图:STEVEM
▲ YouTube 的算法怎么了 / 图:STEVEM[4]

故事还没结束。

前面说到,Plastic Lover 上传的饭制视频中,使用的不是原 Plastic Love 单曲的封面,而是《Sweetest Music / Morning Glory》单曲封面的截图。也许就是这么一个在当时上传者有意无意做出的变化,让观众觉得这首歌变得更加迷幻。照片中三十多年前竹内玛莉亚那份独特的韵味,似乎与 Plastic Love 异常地相配(想像在当时只有第 86 位的 Plastic Love 如果用的是 Sweetest Music 的这张封面,我想一定会更好吧)。越来越多的爱好者基于这个封面创作出了许多有意思的作品,并在 DeviantArt、Tumblr 等平台上传播了起来。

▲ Know You Memes 上的各种同人作品
Know You Memes 上的各种同人作品

越来越多的相关视频持续被算法推送至更多未曾了解过日本 City Pop 的用户,越来越多的二次作品诞生以及蔓延开来。 Plastic Love 的模因meme[5]产生了,并且一发不可收拾。关于 Plastic Love 与竹内玛莉亚的搜索热度持续上升。

▲ Plastic Love 的 Google 搜索指数
▲ Plastic Love 的 Google 搜索指数

可是就在 2018 年的 12 月 20 日,当时就已经突破 2400 万次播放量的「Mariya Takeuchi 竹内 まりや Plastic Love」视频,被 YouTube 以侵权为理由删除了。发起侵权处理请求的,不是竹内玛莉亚及其唱片公司,却是一位名为 Alan Levenson 的人。其理由是,他拥有视频中那张照片的版权。

于是,YouTube 上这一份被热捧了 7×2400 多万分钟的塑料爱情,就这样与竹内玛莉亚那一个迷人的微笑,一同消逝在了 2018 年的圣诞节前夕。

▲ 通过时光机回看当时下架的样子
▲ 通过时光机回看当时下架的样子

很快,整个互联网记住了 Alan Levenson 这个名字,并且开始不高兴了。人们开始在推特等社交平台上诅咒 Alan Levenson,查到了 Alan 的邮箱地址并给他发送恶语谩骂邮件,指责他以 Plastic Love 的名气逐利云云。

后来,Alan 联系上了几位当时给 Plastic Love 做出过热门科普视频的 YouTuber,道出了关于竹内玛莉亚那张微笑照片背后的往事……

这张既没有出现在《Variety》专辑中,也没有出现在 Plastic Love 单曲中的照片,是 Alan 于 1980 年在洛杉矶,为当时竹内玛莉亚准备发布的《Miss M》专辑拍摄的素材。但是后来这张照片并没有被 RCA(竹内玛莉亚当时的唱片公司)选为专辑封面,RCA 只是将 Alan 拍摄的其他照片随机地分散在了《Miss M》专辑的 B 面中[6]

▲ 《Miss M》专辑 B 面
▲ 《Miss M》专辑 B 面

三十多年后,Alan 通过 YouTube 上 Plastic Love 的病毒性传播才得知了自己当时拍摄的照片出现在了另一支单曲的封面中。他为自己的作品被上千万的观众所喜爱而感到惊讶的同时,对 RCA 当时不采用自己的创意作为《Miss M》专辑的封面而感到愤慨。

同时 Alan 认为,华纳音乐(竹内玛莉亚如今的唱片公司)利用 YouTube 上 Plastic Love 突然火爆的事件,来宣传抬高竹内玛莉亚出道 40 周年纪念专辑的商业行为,没有给他合理的回馈。在他实在无法联系上当时上传「Mariya Takeuchi 竹内 まりや Plastic Love」视频的作者 Plastic Lover 商讨相关事情的情况下,只好动用了侵权删除的办法。

视频下架,推荐减少,热度逐渐消退,似乎大家都冷静了许多。网络还是继续地运作着,人们的生活也依旧进行着,时间也持续地在向未来延伸。

故事到结尾了,但是我们还是相信未来的。

4 个月后的 2019 年 4 月份,Plastic Lover 现身了,联系上了包括 Alan 在内的几位事件参与者。在他们的交谈与努力下,被下架的视频在 2019 年 5 月 14 日,又回到了 YouTube 的推荐流中,人们又能打开观察竹内玛莉亚的微笑了。除了视频封面以及视频描述里增加了关于照片版权的信息外,其他的一切都还是原来的样子,音频、播放量、评论。

而再往后两天的 5 月 16 日,便是文章开头提到的日本华纳音乐为 Plastic Love 这首三十多年的老歌,发布了先行版官方 MV 的事件。当然了,商业公司的这种行为必然不会是纯粹地“意外”与“怀旧”了。不过呢,能够让这些旧时被埋没的美好事物,再次展现给当代的人们以欣赏与回味,不也是挺好的事情嘛。昭和末平成初的事物,到了令和也是要炒炒真香冷饭。

▲ 感谢你拯救你爱的 Plastic Love / 图: @SteveMcCarthyII
▲ 感谢你拯救你爱的 Plastic Love / 图: @SteveMcCarthyII

连 Plastic Love 这首歌曲都能在 35 年后获得官方 MV,那么相信不管花多少时间,你都可以完成你的目标的!—— @Lumena_tan

这份满是既视感的遇见,其实早就在某处埋下了种子

关于 Plastic Love 在 YouTube 上的故事讲完了,但其实,与 Plastic Love 相关的音乐故事我还想说些什么。以下都是我的个人认识与见解,君如有不苟同之处不妨当个乐子看吧。

其实, Plastic Love 在 YouTube 上突然的火爆,原因并不全是因为所谓的 YouTube 推荐算法突然的“嗜好”。以 Plastic Love 为主的一大批上世纪 80 年代的日本 City Pop 歌曲再度受到当代部分人的喜爱追捧,跟近些年来热度不低的蒸汽波 Vaporwave 及其子类的亚文化有着千丝万缕的关系。只是 YouTube 上的这次事件,让这一趟数十年轮回的复古狂欢,来得更猛烈持久了些。

▲ TARA - Plastic Love (TARA Bootleg) / 2016 / Future Funk

蒸汽波从 2010 年初出现,至今发展不过 10 年,但已经发展出不少的分支子类。其中比较有名和相对流行的,就是 Future Funk。这个子类的作品的采样更多地取材于上世纪 80、90 年代的日本 Funk 音乐、City Pop 都市流行乐以及部分欧美同期的歌曲,同时引入了更多的 Disco/House 音乐的元素。这些与原始 Vaporwave 的不同点让这类作品变得更抓耳和更容易接受。通过“future funk plastic love”作为关键词去搜索引擎里搜索的话,你会发现不少采样自 Plastic Love 的 Future Funk 作品,有些在很早就出来了。

既要怀旧,又要现代。单纯听老歌,不一定能听得进去。而只取抓耳的部分,再加入舞曲节奏搅拌一下,更符合现代年轻人。—— 知乎@金时代

但其实,一旦突破了这个自我限制去听原曲的话,你会发现一片新的天地。不过我感觉,跟我同辈的人,不管听蒸汽波也好,听 City Pop 也罢,应该都会有 VICE 的一篇文章里说的一个情况:我们这一代并没有过在那个时代的生活经历,但是为什么听这些歌时会有一种莫名的怀旧感?以及会感觉到或向往自己在那个时代生活的样子[7]

我想以我对以上疑问的鄙见来结束这篇文章。作为千禧一代的我们,其实从小就受到过 City Pop 以及其所在年代的其它文化的影响。小时候跟着父母听的港乐,张国荣、梅艳芳,不少歌曲都有着与东瀛那个年代相似的感觉。以及小时候接触的还是那个年代画风的动画、游戏等,都给那时年少的我们带来了许多美好的记忆。

进入社会后,却才发现自己的各种不是。纵使物质上逐渐满足,却无法再找回那时一样的快乐。只能在工作下班后,拖着疲惫的躯体通勤奔波。带上耳机,用塑料爱情所制造出来的空洞塑料情感,去弥补精神上的孤独与不安[4:1]


  1. 竹内まりや「Plastic Love」Short ver. ↩︎

  2. Mariya Takeuchi’s “Plastic Love” gets music video after 35 years ↩︎

  3. https://music.163.com/#/artist/desc?id=17916 ↩︎

  4. What is Plastic Love中文字幕版↩︎ ↩︎

  5. https://knowyourmeme.com/memes/plastic-love ↩︎

  6. What Happened to Plastic Love? - Tales From the Internet ↩︎

  7. 为什么我们又听起了 City-Pop? ↩︎

☑️ ☆

利用 CSS 媒体查询让网页配色跟随 macOS 深色模式

苹果公司的操作系统 macOS 从 10.14 Mojave 版本开始,为用户提供了深色模式的可选外观。用户可以在系统中的通用设置里选择启用深色模式,整个系统的界面会全局变为暗色调。对于夜间使用场景而言,深色模式的界面可能会显得更加友好,也更能让用户集中注意力。

Office 365 Dark Mode (Twitter @derek_snook)
Office 365 Dark Mode (Twitter @derek_snook)

利用苹果公司提供的接口,各类原生桌面应用程序都开始陆续支持深色模式,可根据 macOS 用户的系统设置进行换肤,比如 Google Chrome、Microsoft Office 等。

但对于 Web 应用而言,似乎还没有什么讨论。好消息是 CSS 的媒体查询(media queries)新增加了一个叫做 prefers-color-scheme 的媒体特征,开发者可以通过该设置特征,让网站的配色随着 macOS 系统的界面外观色调改变而改变。

/* 常规浅色模式下的网页背景颜色及文本颜色 */
body {
  background: #fff;
  color: #222;
}

/* 深色模式下的网页背景颜色及文本颜色 */
@media (prefers-color-scheme: dark) {
  body {
    background-color: #222;
    color: #ddd;
  }
}

prefers-color-scheme 支持三个值,分别是 no-preferencelight、以及 dark,对应是“无指定”、“浅色主题”以及“深色主题”。详情可以查看 MDN 说明。

这个还在 CSS 草案阶段的媒体特征[1],显然尚未被主流浏览器大规模支持,不过已经开始受到部分浏览器支持了。可以从 MDN 或者 Can I Use 上看到,Firefox 67 以及 Safari 12.1 开始支持该媒体特征。

 兼容性
prefers-color-scheme 兼容性

如果你是 macOS 用户,又正巧使用的是支持该特征的浏览器的话,可以通过切换系统的外观色调,查看到我的博客配色跟随系统色调的变化。

配色跟随系统色调切换而变化
配色跟随系统色调切换而变化

除了 Firefox 浏览器之外,也可以用 macOS 系统的 Safari 查看到效果。

浅色
浅色
深色
深色

图中的文章见《总结下博客最近的调整》。不过其实 prefers-color-scheme 只是帮助做到随系统自动变化而已,网站的深浅配色系统本身还是要开发者预先设计好。


  1. https://drafts.csswg.org/mediaqueries-5/#descdef-media-prefers-color-scheme ↩︎

🔲 ☆

总结下博客最近的调整

Old Days

我建博客始于 2013 年,时间也不长。那会儿也不过是一个从 WordPress 加免费空间入坑的新手,免费空间关了就买了个域名和虚拟空间继续折腾。啊对,也改成了 Typecho 一段时间,仿过几个主题。之后便是在流行之下,一个 commit 换成了静态博客 Hexo。于是开始在这个“自留地/实验室”里摆弄各种新玩意,做做小试验。没写过几篇文章,却也一直延续至今。

Changes

A. 核心系统

将使用了近 4 年的 Hexo 换下是博客最近最大的改变,换上的是基于 Vue、Webpack 等当前主流技术的 Saber 静态博客系统。

以 React、Vue、Webpack 等当代主流前端技术为基础的静态网站生成器系统持续出现并开始崭露头角,Gatsby、Nuxt、VuePress[1],势必会抢占 Jekyll、Hexo 等以字符串模版为主的“更加静态[2]”的旧式静态博客系统,我相信这也是这个社群中的趋势。

在最初规划迭代的时候,预期是更换至 Gatsby 这个基于 React 技术栈的系统,其中的原因是受到 Daniel Eden(知名 CSS 动画框架 animate.css[3] 的作者)的博客改版影响。他在稍早的一段时间将他的博客 —— daneden.me 从 Jekyll 换成了 Gatsby。我的博客受其影响很大,即使到目前为止,在我博客中你仍然能够找到一些来源于他的博客的设计元素。最明显的是在文章图文排版上的借鉴,在大屏幕下,你可以在如《推特背后的 Notch 之道》等文章中看到左右溢出的插图。这个我非常喜欢的排版设计,便源于:「Design Elitism」,我博客的整个排版系统很大程度上受他影响,只是彼此经过多次迭代,已不太能找出相似点了。

Gatsby
Gatsby

没有选择 Gatsby 是因为在我对 React 生态的还不了解,头疼一连串硬啃 React、GraphQL 等技术的时候,VuePress 出世了,我还是更倾向于相对比较熟悉的 Vue。

VuePress
VuePress

然而,在我尝试 VuePress 后,其更加面向于项目文档的设计,让我感觉从 Hexo 迁移显得力不从心。对比 Gatsby 这或许是因为还是刚起步阶段,生态还不完善吧,截至目前其博客方面的支持还在陆续开发中[4]

于是我便在等待/寻找一款能让我更加平滑地进行迁移的系统。然后 Peco 出现了,并在后来被现在的 Saber 所替代。我不想在此大谈如何迁移至 Saber 的,真要这样或许会另起一篇文章写这个。只想说,非常感谢 EGOIST 的开源工作,让大家能够用上前沿的技术。

B. 主题外观

得益于 Saber 的系统设计,将我的原有 Hexo 自用主题迁移至新系统并没有感觉到费力。迁移后整体上我还是使用此前的主题,只是在原有的基础上完成了一些更加细致的迭代,使其更符合我的现存观感。除了调整了列表的布局变得紧凑些、完善响应式文字排版设计外,最大的一点是从以前一直使用的 CSS 预处理器 Stylus 切换成了 SASS,并用上了原版 Bulma 框架。在生态上,果然还是 SASS 更胜一筹。

Bulma.io
Bulma.io

期间学会了几个以前不了解、不常用的 CSS 属性,并应用到了主题中。

  • text-align: justify; —— 文字两端对齐,在单栏布局中排版差异尤为明显[5]
  • font-display: swap; —— 修改 Web 字体加载显示逻辑,可避免字体下载过程中闪白[6]

不过整个主题目前还是有缺陷,只能后续随着时间推移再慢慢优化。

C. 部署架构

在我刚开始使用 Hexo 或者说刚入坑静态博客系统的时候,我就已经在使用持续集成工具来帮助我进行构建和部署工作,一直在使用 Travis CI 的社区版。静态博客系统通过使用持续集成做自动构建部署,真的能省下不少重复劳动。

旧部署架构
旧部署架构

旧架构如此的原因是以前部署到 GitHub Pages 上觉得速度不行,同时又不支持自定义域名使用 HTTPS,我也有一台闲置的香港 VPS,于是就通过 Webhook 触发 VPS 同步 GitHub Pages 的内容,然后在 VPS 上使用 Nginx 提供服务,这样能解决前述的两个问题。后来因为域名的 SSL 证书过期(那时还没用 Let's Encrypt)和 VPS 不稳定的原因,就加了层 CloudFlare。然后就没管了,一直这样。

新部署架构
新部署架构

调整后实际上就是将提供服务的后端从 VPS 迁移到了 Netlify。其一是图方便,Netlify 自动申请 Let's Encrypt 不用自己麻烦在 VPS 上设置,其二是 Netlify 自带 CDN,速度还不错,最后是因为我需要调整整个博客各页面的固定链接,同时希望旧有的链接能重定向到新的固定链接上,保留可用性。而刚好 Netlify 原生支持重定向服务 —— Netlify Redirect,这样就不用因为 CloudFlare 免费版只有 3 个 Page Rules 而显得拘谨。

构建文件依然推送到 GitHub Pages 分支上后再同步到 Netlify 的原因是,我希望保留能够在 GitHub 仓库中查看构建后的文件的功能,构建后直接推送到 Netlify 上我就看不到构建文件和历史变更了。

Wappalyzer 检查
Wappalyzer 检查

故意加了个假的 Hexo Generator 的 Meta 标签,所以被检测出用 Hexo(大雾)。关于这个扩展程序,可以看我之前写的文章《我都在用些什么 Chrome 扩展程序》里有介绍。

D. 其它变化

整个核心架构变化,于是现在托管仓库的项目架构也有所调整,改成了 Monorepo 并用 Lerna 进行管理[7]

修改了内容授权协议,具体可见 About 页面。因为细想了一下,真有人取走内容的话大概也不会在意你的协议,于是干脆放飞自我。

RSS Feed 调整,增加 JSON Feed 的支持,路径 /feed/index.json,同时原有的 Atom Feed 的路径会从 /blog/atom.xml 调整为 /feed/atom.xml,原有路径会重定向至新路径。

完整的迁移记录可见仓库 Commit Log


  1. https://www.staticgen.com/ ↩︎

  2. https://vuepress.vuejs.org/zh/guide/#hexo ↩︎

  3. https://daneden.github.io/animate.css/ ↩︎

  4. https://github.com/vuejs/vuepress/issues/36 ↩︎

  5. https://developer.mozilla.org/zh-CN/docs/Web/CSS/text-align#Justify ↩︎

  6. https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face/font-display ↩︎

  7. https://github.com/chawyehsu/chawyehsu.com/tree/592c99120e8452a816d51fbec6fb7eabf3f15448 ↩︎

☑️ ☆

彻底搞懂 Windows 控制台的设置

Windows Console Host(即 conhost.exe,下称“ConHost”[1])中的设置可能有点难以理解,主要是因为在过去几十年中这个设置系统不断发展。根据 ConHost 如何被调用,这些设置项会存储在不同的位置。

控制台设置
控制台设置

设置加载的层级

决定一个控制台设置的加载与存储是基于以下层级进行的:

  1. 写死在 conhostv2.dll 里面的设置
  2. 用户定义的控制台默认设置,存储在注册表 HKCU\Console
  3. 每个控制台应用程序[2]单独的设置,存储在注册表 HKCU\Console\<sub-key> 中,其中 sub-key 使用以下两种值中的一种:
    • 控制台应用程序的文件路径(其中的 \ 会替换成 _
    • 控制台应用程序的标题
  4. Windows 快捷方式(.lnk)中的设置
注册表中的控制台设置键值
注册表中的控制台设置键值

当一个控制台应用程序被启动后,ConHost 会依据加载情况决定使用哪些设置,同时会按照前述的层级先后对一些进行覆盖。每一个设置项将取其最后加载的值,也就是说在第 4 级(Windows 快捷方式)中的值会覆盖掉第 2 级(用户定义的默认设置)中的值。

这样一个层级设计解释了为什么在每个控制台实例窗口的标题菜单中,都会有一个“默认值” 选项以及一个“属性”选项。

控制台窗口标题菜单
控制台窗口标题菜单

修改“默认值”时,改动会存储到注册表 HKCU\Console 中,写入用户定义默认设置(即前述层级中的第 2 级)。

修改“属性”时,改动会存储到注册表中的控制台应用程序单独设置或者 Windows 快捷方式中:

  • 如果这个控制台应用程序是被直接(比如是从 Win+R,Windows 运行对话中)启动的,则改动会存储到前述的控制台应用程序单独存储位置(层级中的第 3 级)中。
  • 如果这个控制台应用程序是通过 Windows 快捷方式被启动的,则改动会直接存储到这个快捷方式 .lnk 文件中(层级中的第 4 级)。你可以右键这个控制台应用程序的快捷方式,选择“属性”查看其设置。
快捷方式中的设置
快捷方式中的设置

当一个控制台应用程序被启动后,ConHost 会根据前述的层级,从第 1 级写死的默认设置开始覆盖设置,最后确定使用哪些设置。这意味着在 Windows 快捷方式中的设置会覆盖掉注册表中的控制台应用程序单独设置以及默认设置。

值得注意的是在注册表中的设置是“稀疏”的,意味着如果某个设置项为空,则不会修改正在使用的值。这允许用户在所有控制台应用程序之间共享部分设置项的同时指定其它一些特定设置项。

而快捷方式文件则会将每个设置项都存储其中,不管是否有默认设置。这些设置会以不透明的数据块存储在快捷方式中。

下面是 Windows 控制台的设置列表,包含了简短的描述以介绍其作用。

设置项名字 类型 描述
FontSize Coordinate (REG_DWORD) 字体像素大小
FontFamily REG_DWORD GDI 字体族
ScreenBufferSize Coordinate (REG_DWORD) 屏幕缓冲区大小,宽x高个字符
CursorSize REG_DWORD 光标大小
WindowSize Coordinate (REG_DWORD) 窗口大小,宽x高个字符
WindowPosition Coordinate (REG_DWORD) 窗口位置,宽x高个像素(如果没有设置则进行自动定位)
WindowAlpha REG_DWORD 窗口透明度(取值范围:0x4D-0xFF)
ScreenColors REG_DWORD 前景色与背景色
PopupColors REG_DWORD 显示弹窗(CMD.exe 按 F2)时的前景色与背景色
QuickEdit REG_DWORD 快速编辑模式是否开启
FaceName REG_SZ 字体名字 (默认使用 __DefaultTTFont__,根据你的代码页 CodePage 选择最合适的字体)
FontWeight REG_DWORD GDI 字重
InsertMode REG_DWORD 插入模式是否开启
HistoryBufferSize REG_DWORD 命令记录缓冲区大小
NumberOfHistoryBuffers REG_DWORD 命令记录缓冲区数量
HistoryNoDup REG_DWORD 是否丢弃旧的副本
ColorTable%% REG_DWORD 16 色的调色盘中每个颜色的 RGB 值
ExtendedEditKey REG_DWORD 是否启用扩展的文本选择键
WordDelimiters REG_SZ 分词符列表(例:`' .-/=
TrimLeadingZeros REG_DWORD 选取复制文字时是否删除首部零宽字符(使用 00000001 表示 1
EnableColorSelection REG_DWORD 选择时是否同时复制颜色
ScrollScale REG_DWORD 使用滚轮滚动时一次滚动多少行
CodePage REG_DWORD 代码页 CodePage
ForceV2 REG_DWORD 是否使用新版控制台
LineSelection* REG_DWORD 是否启用对选定内容自动换行
FilterOnPaste* REG_DWORD 是否在粘贴时筛选剪贴板内容(如:将弯引号替换为直引号)
LineWrap REG_DWORD 是否在调整窗口大小时对输出的文本换行
CtrlKeyShortcutsDisabled REG_DWORD 是否启用 Ctrl 键快捷方式
AllowAltF4Close REG_DWORD 是否禁用 Alt-F4 热键
VirtualTerminalLevel REG_DWORD 控制台 VT 支持级别

*仅在新版控制台中有效

已知问题

与大多数复杂的事物一样,有一些问题需要注意:

系统更新会导致设置被重置

每当你升级到新版本的 Windows 时,系统级的快捷方式以及“「开始」菜单”中的设置会被重置为默认值。这意味着如果你升级了系统,你自定义的字体、颜色等设置将会全部重置为 Windows 的默认值。

后记

我一直在使用 concfg 作为我管理我的 Windows 控制台设置的工具,近期成为了该项目的协作者进行项目维护,便开始稍微深入地了解 Windows 控制台相关知识。本文是微软官方 Windows Console & WSL 团队的一篇博文的译文,原文见 Understanding Windows Console Host Settings,有些许删改。


  1. 在 Wikipedia 上也称 Win32 控制台 ↩︎

  2. 注意“控制台”与“控制台应用程序”的区别,前者指 ConHost 宿主程序,后者是运行在 ConHost 下的应用,如 cmd.exe/powershell.exe ↩︎

🔲 ☆

我都在用些什么 Chrome 扩展程序

想不到在 Microsoft Edge 正式发布后的第三年,微软官方宣布了 Edge 将放弃自家的内核引擎,转而去拥抱在当前浏览器生态中占据统治地位的 Google Chromium。继 Opera 之后,“Chromium 家族”又将迎来新的成员。这无疑是一个重磅消息,对于用户而言,对于微软自己而言,带来的影响都是巨大的。

内核统一后,可以预见的是,前端开发者们花在浏览器兼容上的时间应该会再减少。同时微软在宣布这个消息时,也确认了 Edge 将能无缝支持 Chrome 的全部扩展,这对于开发者和用户而言肯定是有好处的。要知道,Chrome 好用的一大原因是拥有各种各样数不清的扩展程序,丰富的扩展资源能给用户带来许多方便的增强功能。

说到 Chrome 的扩展,也是本文的主题。在笔者的日常生活中,偶尔会看到关于 Chrome 扩展相关的讨论,有时候会被问及用了什么扩展程序。其实也是,Chrome 商店上琳琅满目的主题扩展,一下子肯定不知道哪个好用,哪个适合自己,唯有自己尝试过后才清楚。

看了一下,距离上一篇博文也蛮久了。而恰好有这么个话题,于是就拿出自己这几年使用 Chrome 以来积累到的一些扩展程序和信息,做这么一个盘点,也算是更新一篇文章。其实扩展的使用跟个人平时日常生活的使用习惯是有很大关联的,喜欢浏览些什么网站、使用什么服务、以及从事什么工作等等。有些还比较涉及隐私,但既然开了这么个坑,就填掉吧。如果能让读者发现有眼前一亮的扩展且愿意去使用,也挺欣慰的,嘿嘿。那么下面就开始盘点吧。


AcFun HTML5 Player

AcFun HTML5 Player
AcFun HTML5 Player

Adobe 官方宣布 2020 年停止更新 Flash,Flash 时代的终结终于定上了日程。即使没有官宣,从那些日子使用《妈妈再也不用担心我的 MacBook 发热了计划》养成了“刁钻习惯”,在浏览视频类网站的时候,能用 HTML5 的话,我都会尽量使用。不过,很庆幸 Adobe 能做出这个大好的决策。有些东西,到了被淘汰的时候,也就那样了。就如,哪天 A 站原生支持了 HTML5 播放器,这个扩展的寿命也许就……

Checker Plus for Gmail™

Checker Plus for Gmail™
Checker Plus for Gmail™

无需打开 Gmail 或 Inbox,即可收到桌面邮件通知,方便地查看、收听或删除邮件,并且支持多账户。用过这个之后,你就不会再想起 Google 自家提供的很久没有更新的 Google Mail Checker 扩展了。伟大的邮箱,伟大的软件,伟大的公司,敌不过更伟大的墙。如今还在坚持用 Gmail 的同学,一定不是真爱就是历史数据迁移太麻烦!迫于 Google 全家桶的问题,我还是保持着 Gmail 的轻微使用。更多的,还是走 Outlook 了……

Cowlevel Steam 增强小能手

Cowlevel Steam 增强小能手
Cowlevel Steam 增强小能手

研发辛苦了,对奶牛关的与steam的结缔有很大的帮助qwq。—— bulong dou

奶牛关在 Steam 上的增强扩展。在浏览 Steam 商店页面等的时候,可以查看到来自奶牛关玩家的综合评分与游戏相关问答讨论、相关文章、精选评测等内容。当然,如果你并不知道奶牛关是什么的话,可以查看一下《关于我们 - 奶牛关》,一句话描述就是“游戏狂热者的分享问答社区”。一个类似知乎但只专注游戏的,更垂直的社区。社区里面有不少硬核玩家、游戏从业者,欢迎来找我玩耍:h404bi - 个人主页 - 奶牛关

Enhanced Steam

Enhanced Steam
Enhanced Steam

第二款跟 Steam 相关的扩展。Chrome 与 Steam 重叠用户的话,这款扩展基本上算是 “装机必装”的了。这款免费的扩展,为 Steam 网站做了非常多的增强,添加了很多功能,比起前面的奶牛关增强小助手,就是大巫见小巫了。

  • 突出显示你已拥有的游戏
  • 突出显示你已加入愿望单的游戏
  • 根据你已拥有的游戏,计算捆绑包的价格折扣
  • 显示你在 Steam 上总共花了多少钱
  • 在游戏商店页面上突出显示你拥有的对应游戏的 DLC
  • 显示不同国家商店的价格差异

上面是扩展商店页介绍的主要功能。其它大大小小的功能点,如显示 SteamGifts 等网站链接,商店跨区警告,商店页面用 HTML5 播放视频等等,就不一一列举了。一旦习惯了这个扩展的话,没有扩展支持的情况下打开 Steam 商店页面,就会觉得少了很多东西。有 Enhanced Steam 的 Steam 商店页面,才是真正的页面。

Feedly Notifier

Feedly Notifier
Feedly Notifier

RSS 已死,Web2.0 已是过去式

即使有大批用户表示不舍,Google 还是在 2013 年彻底关闭了 Google Reader。我虽然没认真用过 Google Reader,但是对于同样离不开关闭命运的“鲜果阅读器”,我却有过一段稍长的使用经历。那种感觉确实挺难受的。就像 Flash 那样,有些东西终究会随着无情的时间慢慢消逝,只是 RSS 没有 Flash 那么让人不爱罢了。字节跳动带着它的头条系产品崛起成为了新独角兽,足以证明,大数据与算法、个性化推荐比起难用的 RSS 还是更“懂用户”,更适合绝大多数人。但就是在有数不清的各种 APP 肆意撕裂、抢占你的个人时间,到处充斥着信息焦虑的今天,仍然会有那么一小撮人,选择使用 RSS 来管控自己的信息源,只因为它能让这些人在信息爆炸的环境下,仍能专注与高效地从中汲取自己想要的信息。这就是我保有对 RSS 的使用的原因,只是这个载体是 Feedly 而已。Feedly Notifier 作为 Feedly 在 Chrome 上的一个辅助扩展程序,已经够用了。

时至今日,关于 RSS 的话题其实还是会时有出现,就像一颗石子扔入水中,泛起一阵涟漪。这里我非常推荐读者能去阅读 Platy Hsu 写的两篇关于 RSS 的文章:《论 RSS 的「复兴」》与《RSS 服务对比评测》。特别是前一篇,很有深度。

Free Download Manager

Free Download Manager
Free Download Manager

IDM(全称“Internet Download Manager”)确实更胜一筹吧。但胜在 FDM 是免费软件。其实很忏愧在日常生活中自己实在做不到完全去盗版化,使用 IDM 大概也有两三年时间,羞愧之心还是要有。在版权意识越来越被重视的时代,如果有满足需求的可替代产品,能去盗版化的话,就尽量去盗版化了。

而且,FDM 支持 WIndows 与 macOS 双平台,这也是另一个优点。由于需要监听浏览器的下载事件,所以要安装这个扩展程序,跟 IDM 一样。

Full Page Screen Capture

Full Page Screen Capture
Full Page Screen Capture

用过好几个全网页截图工具,还是觉得这个来的顺手。不过这个只支持一键截全网页,没有截局部的功能。截局部的话,有太多替代软件了,Windows 自带的 Snipping Tool、 QQ 的截图等等。Full Page Screen Capture 是开源的,源码托管在 GitHub 上。

Holmes

Holmes
Holmes

觉得 Holmes 大概是从前文说到这里,第一款相对来说很实用但是却又比较不出名的扩展。这个小而美的扩展程序,只提供了一个非常提升效率的功能:在地址栏快速搜索书签。只需要在地址栏输入一个星号(*),然后按下 Tab 即可进入 Holmes 搜索书签模式,利用模糊搜索功能可以从整个 Chrome Bookmark 中快速找出你想要的书签并按下回车打开。美中不足的地方是不支持对中文搜索,众所周知的中文分词问题,外国人开发的扩展在所难免。

HTTPS Everywhere

HTTPS Everywhere
HTTPS Everywhere

从 Chrome 之前的给使用 HTTPS 的网站加上绿色安全小绿锁,到现在把使用 HTTPS 的网站当作正常网站,并把使用 HTTP 的网站标为不安全网站可以看出,Google 正在不遗余力地推进 HTTPS 的普及使用。作为一名“激进的用户”,自然而然地安装上了 HTTPS Everywhere,能 HTTPS 的全都给我 HTTPS!当然,在“HTTPS 不发达的国内”,强制 HTTPS 总会时不时遇到各种毛病,如某段时期微博登录页的无限重定向 HTTP 云云。

Imagus

Imagus
Imagus

这大概是 Chrome 上最好用的辅助看图扩展程序了。只需要将鼠标悬停在缩略图上,就能放大显示缩略图背后的原始图片。拥有对接近 300 个网站的筛选规则支持,而且即使像本人博客这样没有预设规则的站点,常见的缩略图形式也是能识别到的。装上这个扩展后,渐渐就会越来越少地右键审查元素翻代码找原始图片了。

JavaScript and CSS Code Beautifier

JavaScript and CSS Code Beautifier
JavaScript and CSS Code Beautifier

在 Chrome 上直接访问混淆压缩的 JS、CSS 文件时,能对代码进行格式化并且高亮。能更好地查看代码逻辑,在理解网站前端逻辑、样式设计时比较有用。特别有利于扒皮党(雾)。

JSON Formatter

JSON Formatter
JSON Formatter

Makes JSON easy to read. Open source.

打开 JSON API 或者 JSON 文件时可以更方便阅读,支持格式化切换、折叠、链接跳转。

minerBlock

minerBlock
minerBlock

加密货币近些年来真的是火热得不行,特别是去年比特币一路高歌猛进的时候。在网站上挂 JS 利用访问用户的计算机资源进行挖矿,究其本身其实是比较难评判的。如果是站长自己的行为,并且显著位置告知了访问用户的话,这个看不同人的看法。但如果是特意埋藏得很深,或是被“挂马”了,用户不知情的情况下这么做,确实难以让人接受。这个扩展也就是防这一类的情况吧,防不胜防最为致命。另外该扩展本身是开源的,大概也是免除监守自盗的情况。

Minimal New Tab Clock

Minimal New Tab Clock
Minimal New Tab Clock

十位 Chrome 用户中有八位用 Infinity 新标签,一位用 Chrome 自带新标签,剩下一位用 Minimal New Tab Clock —— 胡说八道

不得不承认,Infinity 新标签确实是很多很多很多人在用、推荐吧。可是我这人,偏偏选上了极简风。于是就一直在用着 Minimal New Tab Clock,再搭配用了很久很久的一款纯白主题,弄得整个 Chrome 都死白死白的,毫无色彩美感可言。倒是有不少人见过我这个死白的 Chrome 截屏问我用的是什么新标签,这里再介绍一遍:「Minimal New Tab Clock」。只有一个功能,在新标签显示当前时间。只能换背景色,不能换图片背景,没有云同步,除了显示时间啥都没有。

OctoLinker

OctoLinker
OctoLinker

一款 GitHub 增强扩展,可以提高在 GitHub 上浏览查阅代码的效率。功能就是能为指定语言的模块加载语句(比如 includerequireimport)加入跳转链接,点击链接可以跳转到引用的文件、依赖文件的仓库或者外部网站。

Octotree

Octotree
Octotree

这个扩展我想只要是常访问 GitHub 的都会有使用的,因为它实在是太能提升效率了。将仓库以目录树的形式展示出来,比起 GitHub 原本的形式,在目录之间切换浏览真的来得方便快捷多很多。不过与上面的 OctoLinker 一起使用的话,有个不小的问题: OctoLinker 不会对从 Octotree 的目录树中点击打开的文件进行识别,不会为模块加载语句添加跳转链接。

Proxy SwitchyOmega

Proxy SwitchyOmega
Proxy SwitchyOmega

这个基本上人手一份的知名扩展,就不多做说明了吧。

Save to Pocket

Save to Pocket
Save to Pocket

将来不及阅读或者暂时不想阅读的网页内容,一键保存到 Pocket 上云同步,然后可以在其它不同的设备上继续阅读。不过因为感觉访问不太稳定的样子,平时使用比较少。

Steam Database

Steam Database
Steam Database

这是我安装使用的跟 Steam 有关的第三个也是最后一个扩展。主要是在 Steam 页面上增加了一些跟 SteamDB.info 网站有关的扩展功能。可以快速查看游戏对应的 SubID、历史价格变动、游戏最近更新时间等等,还在 Steam 的库存页增加了快速出售的按钮。都是一些比较实用的扩展功能,让你更方便更自信地剁手。

Stylus

Stylus
Stylus

此前一直用着 Stylish,后面爆出该扩展偷偷窃取上传用户的浏览历史,而且被 Chrome 下架。虽然感觉自己不少信息被卖过了,但是对于这种偷偷摸摸的不干净行为还是反感的。于是就转战 Stylus 了,跟前者使用上也没什么大区别。其实我只安装了一个自定义样式「GitHub Mod」,将 GitHub 的样式拍扁变成扁平化设计,并且修改字体为 Open Sans。这是我唯一安装的一个样式,但是因为严重依赖这个样式,所以样式管理扩展还是得安装一个使用。扁平化后确实很好看,看前面 Octotree 的实际截图就知道了,私家珍藏强烈推荐。

Tampermonkey

Tampermonkey
Tampermonkey

「油猴」扩展本身就不多介绍了,知名扩展。说说我安装在用几个脚本吧。

  • 视频站启用html5播放器:为国内大部分视频站点添加 HTML5 播放器支持,比如优酷土豆、网易系列、新浪系列、以及各个直播站点;
  • 百度网盘直接下载助手:有时候下载不大的文件不想打开百度网盘客户端,但是最近貌似不太有用了,还是得乖乖用客户端。
  • 解除B站区域限制:之前切过去港澳台地区看国家队《DARLING in the FRANKXX》时用的,之后感觉对我没什么用了。平时很少追番,国家队大好开头最后只剩下 XX:me 的两张 CD[1] 还能让我常常听一听。

Text Mode

Text Mode
Text Mode

无图模式!而且是真的无图,启用扩展后,会直接将网页中的图片加载直接 Block 掉,不是图片加载了才用色块填充。这样就有个使用场景,如果应急情况笔记本电脑连上了手机的热点,这样打开网页时就能省下很多流量,虽然现在手机卡无限流量也不太昂贵了。另外一个使用场景就是阅读专注,把无关图片屏蔽掉了,剩下文字让阅读更专注。不过偶尔会觉得在这个使用场景下有点鸡肋,一个是图片位置填充的都是灰色色块,有时眼睛会被色块占据,觉得疲劳。另一个是做不到像 Safari 阅读器视图那样,保留正文的图片。有这方便更深的需求的话,据说国产扩展「简悦」会是一个不错的选择,有机会找个时间我也试试看。

uBlock Origin

uBlock Origin
uBlock Origin

我以前也是 AdBlock/AdBlock Plus 的用户,后来切换成了 uBlock Origin。切换的原因并不只是 uBlock Origin 比起其它广告过滤扩展在性能上面有优势[2],而且其实我也没实际去检验过这个性能比较。主要的另一个原因是 uBlock Origin 自己在介绍上说的:

uBlock Origin 不是一个广告过滤工具,屏蔽广告的功能是通过支持 Adblock Plus 过滤规则语法实现的。uBlock Origin 的主要目的是帮助用户抵御侵犯隐私的行为,uBlock Origin 安装后会默认开启 EasyPrivacy 等一系列可以屏蔽跟踪、分析等行为的过滤规则。

除了 uBlock Origin 为我默认开启的一系列规则列表外,我只多增加了一个自定义规则, CJX 的「去自我推广列表规则」:CJX's Annoyance List

v2ex plus

v2ex plus
v2ex plus

V 站还是一个很不错的地方的,日常逛逛摸摸鱼。发现好几个朋友同事都有浏览 V2EX…… v2ex plus 确实是一款很好用的 V2EX 扩展,对话详情、插入表情图片等都是很好的功能。

Vue.js devtools

Vue.js devtools
Vue.js devtools

Vue.js 开发调试神器,就这样。React 暂时没啃下,还得靠 Vue 活着。不比较,都重要。

Wappalyzer

Wappalyzer
Wappalyzer

这是我安装的这么多个扩展程序中,使用率比较高一个。Wappalyzer 是一款非常实用的网站技术分析扩展,通过它可以识别一个网站是以什么架构的,所用到的前后端技术栈等信息。比如 B 站主站全站用上了 Vue、webpack,网易云音乐用了 Nginx、Node.js 等等。虽然有时候不太准确,但大体上还是能快速得知到一些信息的。Wappalyzer 的原理是维护一套规则,里面有各种技术的特征信息,然后根据网站是否有对应特征进行判断。

比如我的博客是用 Hexo 架设的,特点就是在页面源代码里有一串表示是 Hexo 的特征代码<meta name="generator" content="Hexo 3.8.0">,Wappalyzer 就根据这个判断出来我的博客用了 Hexo。

其实 Wappalyzer 原本一直不支持判断 Hexo,于是我找了个时间先在 Wappalyzer 的仓库提交了Hexo 的特征规则[3],然后在 Hexo 的仓库提交了 meta 特征注入功能[4],并最终合并进了主分支随着 Hexo 3.8.0 版本发布而生效。在生效之后,随着被判断的站点的增加,现在已经可以在 Wappalyzer 上看到都有哪些知名的站点使用 Hexo 架构的了:

https://www.wappalyzer.com/technologies/hexo

这其实跟隐私保护有点对立了。所以如果你也是用 Hexo,却不想被判断出来,则可以通过 Hexo 的 after generator 钩子在页面生成时将特征(不只是 meta 一个特征)去掉,这样就不会被判断到了。

划词翻译

划词翻译
划词翻译

后悔大学时期没把英语往深里去学,只得半桶水。现在接触越多,才会发现语言愈加重要,亏我还是外语大学毕业的。「划词翻译」是我使用时间比较久的一款扩展。到如今 Chrome 与 Firefox 双修的我,还是对在 Firefox 上没有一款能与划词翻译媲美的扩展而感到难受。

哔哩哔哩助手:bilibili.com 综合辅助扩展

哔哩哔哩助手:bilibili.com 综合辅助扩展
哔哩哔哩助手:bilibili.com 综合辅助扩展

B 站增强扩展,有这款就够了。好用!啾咕咕www 牛掰。AB 站双修,缺 B 乐还在就好。

眼不见心不烦(新浪微博)

眼不见心不烦(新浪微博)
眼不见心不烦(新浪微博)

用了很久的一款扩展了。看了下虽然扩展有近一年没有更新过了,但是已有的功能还是都能用。屏蔽掉一些不想看到的信息、模块,偶尔打开微博看看关注的人发的内容还是挺愉快的。

此前听一同事说了一个关于微博的有意思的点,说到微博是唯一一个不太被其他应用、平台屏蔽分享的产品。像今日头条与腾讯微信互掐、网易部分产品禁止腾讯 QQ、腾讯屏蔽淘宝天猫等等,都是怕自家产品被往外导流量,却很少见微博被拒绝,被屏蔽。我想了下也确实好像是这样,不少平台应用都允许发布微博信息,比如关注微博什么的。

微博已经是一个成熟型的平台,纵使有感觉到周边的人对比以前都不太使用微博,它也是一款经历了十年风雨的、稳定的产品吧。一些人还是会偶尔上去逛逛的。

结语

以上就是本人在这些年使用 Chrome 积攒下来的一些主要的扩展程序。其实目前我的浏览器里还有安装一些其他的扩展程序,但大多数都是处于停用的状态,也就是保留着但基本上不再去使用了,可能偶尔打开用一下的样子。而以上盘点的扩展,都是在用而且比较常用的。阅读到这里的你,不知道有没有发现感兴趣或是合适的扩展呢。不管怎样,每一款优秀扩展的诞生,都是为了能让用户更好地使用浏览器,更好地从互联网上汲取信息,更好地生活和工作。愿你有个更好的使用体验,感谢阅读。


  1. https://music.163.com/#/artist/album?id=13222556 ↩︎

  2. https://github.com/fang5566/uBlock/blob/master/README.md ↩︎

  3. https://github.com/AliasIO/Wappalyzer/pull/1970 ↩︎

  4. https://github.com/hexojs/hexo/pull/3129 ↩︎

☑️ ☆

Microsoft Office 2016 自定义安装

Microsoft Office
Microsoft Office

作为宇宙第一 IDE Visual Studio 的兄弟,宇宙第一办公套件 Office 在 Windows 系统下更加常见。新安装的系统,即使刚开始不愿安装,等到要查看编辑 docx pptx 文档时,还是会乖乖就擒。只是没想到,Office 2016 这个 2.41GB 的安装镜像,居然是一个 Click-to-Run。

FILE cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso
SHA1 277926A41B472EE38CA0B36ED8F2696356DCC98F
SIZE 2.41GB

点一下,就全自动帮你把 Office 全家桶完整安装上了,不需要你做任何的下一步设置,也不给你做任何的安装设置。

对于日常只使用 Word、Excel、Powerpoint,最多再加一个 Outlook 的人来讲,全家桶的 Access、Onedrive for Business、Publisher、Skype 等必然是多余的,装上了基本不会用到。如果你想干掉这些没用处的部分应用,又或者像我一样,此前已经知道过 Click-to-Run 的厉害,但新装系统后手抖直接点下了镜像的 setup.exe 的话,那就来与我一起“卸了又装”。

卸载已安装的 Office

Office 官方文档库里,选择第 2 种方法:

Option 2 - Completely uninstall Office 2016 with the easy fix tool

下载 easy fix tool: o15-ctrremove.diagcab,双击执行一路到底后重启计算机。

重新自定义安装 Office

第一步: 解压安装镜像。因为待会要替换文件,直接挂载 iso 的话无法进行替换。

安装镜像解压后
安装镜像解压后

第二步: 下载 Office 2016 Deployment Tool。执行后会解压出两个文件,一个是 configuration.xml,另一个是 setup.exe。将两个文件覆盖到刚刚解压的镜像文件夹内(也可以改名备份原来的 setup.exe)。

第三步: 修改 Deployment Tool 配置。编辑 configuration.xml 文件,设定安装版本,更新频道,排除不想安装的应用。以下是我的配置文件,安装 64 位专业中文版(对应 cn_office_professional_plus),仅保留了 Word、 Excel、Powerpoint 以及 Outlook,其它全部排除。如果想把 Outlook 也排除的话,可以在此配置基础上再加上 <ExcludeApp ID="Outlook" /> 即可。具体配置说明可以看配置文件里面的注释。

第四步: 载入配置文件进行自定义安装。在镜像解压目录下,按住 Shift + 鼠标右键,在当前目录打开命令行。键入 ./setup.exe /configure configuration.xml 并执行。

UAC 弹窗确认后开始自动安装。不过这次可以很明显的看到不再是全家桶都给你安装上了。

结尾小 Tips

  1. Outlook 添加两步验证的帐号时,要使用 App Password 而不是帐号主密码。
  2. Outlook 默认下很奇怪的是,启动后你点最小化,它实际上并不会最小化到托盘,在任务栏上还是会有 Outlook 的图标。而如果你选择点关闭,则整个 Outlook 都会关掉。通常比较多的可能是误点关了 Outlook,而退出后的 Outlook 是不接收邮件的。这时可以使用一个小插件实现 Outlook 点关闭时最小化到托盘,解决这个问题。

完整的 gist 归档:gist.github.com/chawyehsu/62f65347d5784b37c8535aa371c59720

☑️ ☆

推特背后的 Notch 之道

译者序

自 Notch 出售了 Minecraft,出售了 Mojang 公司后,他在 Minecraft 方面的消息也随着 Minecraft 逐年下降的热度而减少。因此也有人跟我说,微软收购 Minecraft 的那一刻是 Minecraft 的巅峰,Notch 退出得很及时。卖掉 Minecraft 之后的 Notch 经历了怎样的一段过渡期;为何在《Minecraft: The Story of Mojang》纪录片[1]中还是在 Minecon 与粉丝见面时给人的感觉都是平易近人的他,在推特上却常常出言惊人;Notch 是否还有在做些什么游戏;以及他平时有喜欢玩什么游戏。也许你也会与我一样有一些这样的疑惑。

本文是人物访谈《The Tao of Notch - Beyond Twitter》的译文版本,原文作者 Brad Glasgow,于 2016 年 8 月 4 日发布在 The Escapist 网站上。[2]本人对此进行了翻译,断断续续耗时近 5 个月,文中涉及大量需要翻查各类资料后才能理解的游戏相关或非游戏相关的内容,比如詹代法则、游戏门事件与女权主义、瑞典文化、楚门的世界、以及各种美国俚语、游戏梗等等。译者翻译能力有限,如果你在阅读期间遇到难以理解的部分,可以参考英语原文进行对照阅读。同时如果你有更好的理解与翻译或者有纠错,非常欢迎(在 GitHub 仓库中)向本译文提交你的意见,感谢。鉴于翻译随时可能有改动,为保持内容一致性,本文未经本人允许不得转载。

全文总计 35000+ 字符,15000+ 汉字,图片 20+ 张。建议阅读时间至少 30 分钟。

正文

公众最近已较少听到著名游戏 Minecraft 的创造者“马库斯·佩尔松”相关的消息。在出售了 Mojang 与购买 7000 万美元贝弗利山庄巨型豪宅之后,他曾接受过一些采访,但自那以后他一直都很沉默…… 除了在推特上。

推特上的马库斯·佩尔松一直是多个论战的中心,不仅引起过一大批与他意见不一的人的愤怒,也造成过在游戏媒体中出现过多篇因为他的观点而抨击他的社论。每当他在推特上发表一个观点,一个新的社论似乎就诞生了。这些愤怒被整整齐齐地装进了网络文化大战的弹药当中。

但在所有的这些社论之中,任何的澄清,甚至一次与马库斯·佩尔松本人对话的尝试,你都很少能看到。而这就是为什么我清楚我得去采访他。如果说每次当他发布一个 140 字的重磅炸弹,一页又一页的网页就会产生的话,我想有个机会能与在这些争议推文背后那位真实的马库斯·佩尔松,来一次谈话,只为了解其中的背景。

说服他接受我的采访并不容易。马库斯·佩尔松的观点引起过大量的社论,他对记者如人所料地持着谨慎与怀疑的态度。然而,在我们开始交谈后,我发现他很友善、坦率,甚至有些潇洒。他会很认真地听,很爽快地笑。我们在 Skype 上聊了将近 90 分钟,在结束时,我感觉这不像是在采访一位自以为是的亿万富翁,而更像是一场极客之间有趣迷人的谈话。

这次采访使我想起了良好谈话的价值,这是广泛使用的社交媒体永远无法复制的。


The Escapist 游戏媒体(下称媒体):你想念 Minecraft 吗?

马库斯·佩尔松(下称佩尔松): 完全没有。在我出售公司前的一段时间,我就已经停止了在 Minecraft 上的工作,到我决定出售公司大概有半年了吧,所以当时看起来我不像是在工作的样子。我觉得我已经把火炬传给了延斯·伯根斯坦(Jens Bergensten)[3]。当我要卖掉公司的时候,我担心着我要如何进入我下一阶段的生活之类的事情。但在签完字之后,我就立即感觉到了解脱。我从来没打算过成为一名企业家,我只是想写代码,不想建立一个企业。不过我对此并没有感到不满。只在极少的时候,我会打开游戏看看,“哇哦,这些是我们创造的?”(笑)

Notch(左)与 Jeb_(右)
Notch(左)与 Jeb_(右)

媒体:所以你还有玩吗?

佩尔松: 很少很少。每隔一段时间当它从某个游戏列表中蹦出来时我会点开它,只是看看它现在变成啥样了。

媒体:自出售公司后,你已经坦言过关于突然富裕的经历。十年前你可能是中产阶级,而现在你是出名的有钱人了。

佩尔松: 在我父母离婚后,剩下一位当护士的单亲妈妈与她的两个孩子。那会儿有几个月,我记得至少一个月,她不能确定我们能否在整个月内都买得起食物。后面她让我知道了这事,但在这之前她会把事藏着并装作喜欢煮那糟糕的芬兰食物。“啊我们太穷了”,这不是说说而已,是已经成了一个家庭问题。

媒体:你在推特上说过感到孤独,你说很难搞清楚谁是你的朋友谁又只是想打你的钱主意的人。你说过你如何如何喜欢拉斯维加斯,因为你知道在那里的每个人都盯着你的钱。

佩尔松: 这好像是一年前的事了?

媒体:是的。

佩尔松: 在那之后我基本上已经完全摆脱了那个状态了。我清楚,我真的是一个性格内向的人。我感觉我以前就有过这个问题,这一直也是我一生的问题。所以我不一定需要有很多的朋友。而当你卖掉了你的公司,得到了很多钱,其实没有比继续学习、结识朋友以及探索真实世界更有趣的事了,只是这真的是一个很巨大的变化。我放弃了全部的东西,成了一个古怪的瑞典人,于是很容易变得不再想社交。

媒体:这似乎给你塑造了一个网络形象,人们认为你是一个孤独沮丧、无所事事的有钱人。

佩尔松: 是吧,我就是那样,那是我的文化观念。

媒体:这是你的真实写照?

佩尔松: 我的意思是,我花了很多时间去独处,我感觉那样我才过得最高效与快乐,这不该当作我很孤独。比如我单独编了几个月的程,当然我会打算出去走走看看朋友。我会花一些时间进行学习与编程,比如玩玩 WebGL,然后用大概一个月的时间去参加很多社交活动,比如聚会,来回做这些事。我喜欢聚会聚餐。我正在尝试做一件不可能的事:学习如何欣赏红酒。我喜欢红酒,但我总是记不住它们,比如那些老法国城堡酒庄的名字。

拉菲·罗斯柴尔德酒庄
拉菲·罗斯柴尔德酒庄

媒体:那现在你能说出便宜的红酒与昂贵的红酒之间的区别吗?

佩尔松: 我会假装知道!如果你在做事时充满自信那你就可以做任何事,这是让你像是知道自己在做什么的方法。只要你愿意,你就能像已经做过一百次那样将冰块放入你的咖啡里。我不知道有多少人喝红酒时只是做个样子,亦或者他们真的可以欣赏出那些细微的差别。

媒体:嗯,我最近阅读时看到说专家们不知道白酒其实是用红色食物色素染色做成的。(注:Snpoes[4] 证实了那是假的。)

佩尔松: (笑)。我往往会去拆解与过度分析许多事情。但我会试着不去做太深的拆解,我感觉经历得差不多了,那可能就差不多了。我正在开始去尝试黑麦威士忌,因为我从未有喜欢过一种威士忌。我会说出各种各样的话,比如“啊这回味有点涩”或什么的,不过我不确认我是因为我享受它而说出来的,还是实际上感受到而说出来的。

媒体:我们谈谈瑞典吧。在颂扬炫耀财富的贝弗利山庄中生活必然会有点不和谐,在瑞典可是非常注重谦虚的。

佩尔松: 是的,也就是詹代法则[5]。我觉得詹代法则已经变得更完善了,我们非常自豪在瑞典能有这样一个东西,所以我们谈论它谈得挺多的。它绝对是社会的一部分。如果有一位厨师来我(瑞典)的公寓里为我做饭,对我而言真的很奇怪。我不会想这样做的。但在贝弗利山庄如果你没有厨师,那么从另一个角度来看就显得奇怪。这就像那些关于我进行编程和进行社交的评论。

Markus Persson
Markus Persson

当我在瑞典时,我只想搞我的编程。当我在编程时,我不想让任何人来这里做饭,因为我需要、喜欢我的编码空间。当我在美国进行着旅游签证时,我不会做任何工作上的事情。因为我必须去真正地进行度假,参加社交活动,这样对我才有好处。显然(贝弗利山庄)那所房子只是具备某种不寻常的纪念意义的房子。人们去往洛杉矶,为的是想遇见其他人,其他因相同目的前往洛杉矶的人。这有点像是探索者与想遇见探索者的人的汇聚点。

在洛杉矶做事也相对容易些。在瑞典,大多数人在整个星期内都进行朝九晚五的正常工作,然后在周末才可能做其它事情。所以在瑞典如果你有社交的心思的话,这会让你很懊恼的,因为每天真的没什么事情做。但是在洛杉矶,像我认识的在音乐界的人,他们的时间基本上是相反的,他们在周末会很忙。

媒体:你觉得你在瑞典的时候和在贝弗利山庄的时候有不同吗?在瑞典时会寻常些?

佩尔松: 是的,早期确实这样。那个时候可能正是我在推特上抱怨变化太龃龉的时候。知道了自己的归宿,知道了谁与你站同一边,这些都很不寻常。那会儿大概是我刚刚开始过渡期吧。现在我感觉在两个地方都挺正常的,这就像我的不同方面。我很幸运,在我生活的大部分时间里,我已经有了内向阶段和外向阶段的一个循环。经过一些调整之后,现在也就那样了。

媒体:作为一个美国人,我看到詹代法则里说“不要以为你很特别。”会觉得很奇怪,因为每个美国人都会觉得我们很特别。你来美国之后,也会有这种感觉吗?

佩尔松: 有一点。但詹代法则这话绝对是有道理的。我就是这样的人,在清洁工人正在过来时,我会预先做些清理;在厨师过来时,如果我知道我很高几率会在最后一刻决定要与某个人吃饭,那么我会预先提醒他们,这样最后我外出吃饭了也不至于让他们失望。但是这并不是因为我觉得不适应之类的,而是瑞典传统中有趣的部分。算是一种有趣的小文化吧。

媒体:你觉得你推特上的争论是文化差异的结果吗?

佩尔松: (引起)推特上大多数争论的原因在于我真的搞不懂人们是否想过他们正在干些什么。我觉得大多数人其实都想达到相同的目标,只是有些人选择了一些显然不是很有效的方式。你想试着在推特上(与他人)进行微妙的对话几乎是不可能的。所以我便想着开始有意识地变得直言不讳。我看过一部名为《This Is Phil Fish[6]》的纪录片,它真的帮助我内化接受了我的自我与公众眼中的我之间的区别。我意识到这一点之后,便不再打算开任何公司、售卖任何游戏——我意思是我可能在未来的某个时候在卖游戏,但这不再会是我的主要驱动力。我想通了,我真的不在乎别人怎么看我。不管网上的人怎么说,我知道我自己是谁,我的朋友知道我是什么样的人。所以我才将推特作为一个强大的临时演讲台。

FEZ: Phil Fish 的成名作
FEZ: Phil Fish 的成名作

媒体:现在的你已经相当富裕了,在卖掉 Minecraft 之后,你有感觉到一定的自由了吗?我就不能在推特上畅所欲言,因为我会担心出版社怎么想,但似乎你拥有这些他人没有的自由。

佩尔松: 某种程度上吧。更多的是有时候我会跟一些私下找我的人交流,比如一些职业人士,他们会说“谢谢你能把这些讲出来,但我们不能(公开)支持你”。也有少部分私下联系我的人会说“嘿,虽然我还是你的朋友,但是你看起来像个白痴”。不过私下联系我的人中绝大多数都是认同我的。所以我才觉得,这也许不是我的责任,而是一个机会,去表明实际上是有可能在推特上发表意见而不用作出牺牲的。

媒体:但有些人觉得你就有这个责任,他们批判你在推特上反应过度。说某个只有几百粉丝的人推上说了你一句混蛋,你给那个人回了句婊子(cunt)……

佩尔松: 要说一下,我之前并不知道这个词原来这么刺耳!我经常在 Twitch 上看的一位澳洲朋友就经常说 cunt 这个词。感觉像是一个 cunt 抵过了八个 fuck 什么的。我会更少地用这个词吧,但是我依然坚持我说过的话。

媒体:这是你在美国能说的最糟糕的一个词了。

佩尔松: 文字本身并不是魔咒,因为沟通是围绕着你知道或相信你的听众会以相应的意思倾听你而进行的。如果你说出“cunt”这个词时已经知道这个词很无礼,那么当你说出口时你的意思就是为了冒犯他人。这就是文字给你的反馈循环,而且会愈发极化。我不常在推特上骂人。我不避讳骂人,至少我以前在现实生活中就做过挺多的,不过最好还是少点使用。“cunt”这个词确实是太强烈了。不管怎样,反应是过度了……

媒体:你在推特上拥有 380 多万粉丝,这个数字有带给你一种别人没有的责任感吗?

佩尔松: 并没有。对此我的回答是不要去得罪比你来头大的人。这是让我保持中立的方法策略之一——这里不仅指我。我感觉像“啊,你不能向我发起你的粉丝攻势,我只有 200 个粉丝,而你有 700 万”这样的指责,已经成了过去几年来的一种趋势。所以这是一个只能单向进行的对话么?其实如果只是给我一个私信,我会尽量不跟他们较劲,除非是我真的很生气亦或是被嘲讽了。但如果是公开地说我事并且已经将事情传开了,那毫无疑问我会同样公开地去回应。我感觉有时候他们是故意诱导我的,然后他们就可以抱怨我如何把我的粉丝攻势压到他们身上。

媒体:我们聊聊你推特上一些具体的争论吧。我想从“直男癌(mansplaining)”争论开始。你说这是一个带性别歧视的词。我相信有两大篇(社论)文章是因为这事而写的。

佩尔松: (笑)

媒体:你认同直男癌这一回事吗?你是否认同男性会过分解释事情或利用太多权威去解释事情?

佩尔松: 是的,而且我肯定见过这类事。我的观点是鱼与熊掌不可兼得。我们必须互相平等,要把每个人都视为个体对待。你不能随便就以“男性在谋杀案中的代表性过高”来认为每一个男性都是凶手。我们说的是谋杀(murder)而不是男性谋杀(man-killing)。自以为是(condescending)已经是一个很好的词,然后你又搞一个直男癌出来,本质上就是性别歧视。不过对于男性来说,这个性别歧视似乎没什么大不了,难道是因为我们掌握着权力等东西?

媒体:你还提过“ovary-acting”这个词。(译注:词发音通 over-acting,即反应过度,ovary 意子宫;该词特指女性反应过度。)

佩尔松: 那个应该是其他人提的,我提过的是“cunt-fusing”。(译注:词发音通 confusing,即混淆,cunt 意婊;该词特指女性混淆事情,与直男癌有类似效果。)

媒体:噢?是吗?

佩尔松: 是的,那时我还不知道 cunt 这个词这么糟糕,这个双关语不太好。ovary-explaining 会是更好的词,我当时应该用这个的。(译注:词发音通 over-explaining,即过分解释,ovary 意子宫;该词比起 cunt-fusing 更加能与 mansplaining 有类似的声形意效果。)

媒体:Destructoid[7] 网站还因为这个写了一篇只能说是有抹黑之意的文章吧,宣称你“受到了女性的压迫”。

佩尔松: 我并没有觉得受到了女性的压迫。

媒体:(Destructoid)他们有尝试过联系你吗?

佩尔松: 没有任何人联系过我。这是一个有争议的问题,我大概也没必要跟他们对话,不过我记得的确是没有任何人联系过我。还有一点就是,我真的不太想那些想采访我的人联系我。

媒体:那你有读过那篇文章吗?

佩尔松: 我读了开头的部分,后面的简单扫了一遍。我通常不会看关于我的文章,即使是说好的方面的,因为看这些会让我不停地自我怀疑。我觉得在阅读时得克制住自己,这样才能看出他们在用什么奇怪的角度来评论,然后我才能予以回应。在某种意义上这样也算是一种自我释怀吧。我明白发生了这种事情实际上并没有什么改变。

媒体:没有改变是指什么方面?

佩尔松: 我实际的日常生活。我依旧可以和我的朋友玩玩棋类游戏,可以不去上网就只玩棋类游戏。在这些事发生之前,我会想“上帝保佑,希望不要出现诋毁之事”什么的。而在发生后,我觉得“哦,还好吧”。而且在推特上关注我的大多数人似乎是站我这边的。

媒体:我们谈谈关于审查的争论吧。你谈过关于自我审查的事。在 Reddit 上你参与过关于有玩家希望任天堂将林克设定改为女性的讨论。那些要求林克设定为女性的玩家是何以(自我)审查的?

《塞尔达传说》主角林克
《塞尔达传说》主角林克

佩尔松: 你的用词表达是正确的。你刚刚说“要求”设定为女性,这也是对他们为自己的艺术表现作出牺牲的要求。(这事)教知人们社会上正在发生的问题,我觉得这是非常好的。即使他们(游戏角色)不是真实的,但如果你认真了,那就很重要。很久以前我就没再用“他(he)”来指代一个未知人物,我会说“他们(they)”。这对我来说很有意义,因为我清楚他们想要那样做(要求林克为女性)的原因。然而对于我而言,《塞尔达传说》并不是一个关于性别的游戏,所以翻转性别对我一个玩家来说真的没什么意义。我明白他们为什么想要这么个象征形象,但是要求别人代表你这样做就显得有些奇怪。我觉得将塞尔达和林克的身份对调会更加有意思,有一个女主角和一个被困在魔王加农的城堡里的男性角色之类的。身份的翻转使得在游戏里会有一些新的事物发生,这会变得非常有趣。

媒体:所以总的来说如果玩家要求更多女主角,你觉得这是没问题的吧?

佩尔松: 嗯,如果是关于这事的良好谈话或者是一些公论都是挺好的。只是问题在于这整个讨论就像被感染了一样,像《守望先锋》猎空的那事[8],其实原来的帖子并不像是要求些什么,并没有要求进行调整,只是说那个姿势对于猎空这个俏皮女生角色太过性感显得有些奇怪,开发商认同了这个不适而已。可是有玩家不想开发商调整猎空性感的姿势,然后舆论就爆炸了。实际上原帖说的并没有那么糟糕,只是被(怨气)感染了,导致很难有任何良好的交谈。他们把猎空的姿势换成了一个真正的 pin-up 姿势,我觉得这做的非常正确。他们传递了一个明确的信息:不是想让猎空显得性感,而是想更符合她的活泼感。他们赞同了原来的姿势显得标准与一般,并把它改成了一个调皮的 pin-up 姿势。他们做出了一个完美的解决方案,令人印象深刻。

《守望先锋》猎空的新姿势对比 pin-up 女郎
《守望先锋》猎空的新姿势对比 pin-up 女郎

媒体:你在推特上谈过多元交织女权主义(intersectional feminism)[9]。你说那是一个“偏见的体系”,可以说一下原因吗?

佩尔松: 有些人因为他们的身体特征而比其他人有更多的特权,继而认为每个拥有这些特征的人都比那些没有这些特征的人更具特权性的话,这样的观点就是最直接的偏见。并不是每个白人男性都会比黑人女性能赚更多的钱,虽然作为一个群体平均下来的话确实这样。但这样很容易脱离概念以及忽视社会趋势,变成真正的“直男癌”。我认同直男癌是有出现的,但你却因为我有观点想要说,就利用直男癌这个说事堵住我的嘴,即使我没有摆架子。然后你又提出这么一套为一些大相径庭的东西而建立的体系,这会很容易错用来攻击个体,而非群体。

媒体:多元交织女权主义者阿妮塔·萨琪西恩(Anita Sarkeesian)在你家参加一个派对时拍了一张照片,你因此受到了一些批判,一些人说你“不要屈服于女权主义!”。你有看过她的《游戏情节与女性(Tropes vs. Women in Video Games)[10]》系列视频吗?

《游戏情节与女性(Tropes vs. Women in Video Games)》
《游戏情节与女性(Tropes vs. Women in Video Games)》

佩尔松: 我看了某一集的一部分。对我而言,我对游戏与媒体产生的文化影响并不感兴趣,我更喜欢(研究游戏)物理。我知道这是一场很不错的讨论,正如我说过的,这也是在谈论这类事情时我不用“他”来指代一个未知的人物的原因。我自己看了某一集的部分。这是一个很好的话题,但真的与我不大相干。我并没有直接邀请她(参加派对),是我的一个朋友带她来的。我跟她见了个面并交流了大概 30 秒,她很客气,我也很客气。我们从未谈过我们有着不同的政治观点的事实(可能吧,因为我没看过她的视频)。对我来说就像是与普通人见面一样。你也不会跟你的父母讨论政治问题是吧,人归人,她人很好。人们喜欢说“喂,她没有被邀请,她是偷偷进来的!”。想一下,有哪个朋友的朋友真的收过邀请呢。

媒体:我们谈谈社会正义战士吧。(译注:SJW,全称 Social Justice Warrior[11],亦即键盘侠)

佩尔松: (笑)

媒体:不好意思,我不是想在这里找你麻烦的!

佩尔松: 没事,还好啦。

媒体:一部分人觉得“键盘侠”这个词只是特指某一个人。他们认为键盘侠是一个贬义词,他们只不过是一些想伸张社会正义的好人。你觉得你是一个键盘侠吗?

Youtube 视频:What is SJW? SJW meaning and definition explained
Youtube 视频:What is SJW? SJW meaning and definition explained

佩尔松: 是的。当然我觉得这话有点稻草人谬误[12]。比起说某个个体是或不是键盘侠,我觉得它更像是一场更广泛的运动。每个人都可以转变成键盘侠,可能取决于一天中的时间、你的心情、跟你闲逛的是谁,或者是讨论的是什么话题。对我而言,我会用键盘侠这个词,因为它可以惹怒别人,它更多代表的是那些人的烦躁与愤怒。就像建立这种文化本身一样,我们得担心我们所说的任何东西都可能得罪别人,有时候会担心到一个非常荒谬的程度。我在 Reddit 上看过说键盘侠会宁愿把楼梯给去掉也不愿意在旁边加装一个舷梯,因为他们觉得在楼梯旁边加装舷梯会显得很唐突。记得我在推特上发过这个,我觉得这样不太实际吧。我认同每个人都应该被平等对待,至少有相同的机会。如果你最终成了一个混蛋,那你就该被对待混蛋一样对待。每个人都应该有一样的机会,我们应该尝试去包容,但也不能只是一昧地去迎合大众。我们不能在彼此意见不一致的情况下进行事实交谈。也是因为这个越发苛刻的环境,导致有一帮喜剧演员不喜欢到大学校园中开演。所以说我真的不太喜欢这种像自我审查般的文化运动。

媒体:有很多人在推特上公开抨击你,他们很令人讨厌。

佩尔松: 是诶。

媒体:这些人,就是我们正在说的,典型的键盘侠吗?

佩尔松: 不不,这完全是随机的。我认为原因在于“社会正义战士 vs. 游戏门提倡者”变成了一个非常势均力敌的问题。如果你有看过 CGP Grey 的《This Video Will Make You Angry[13]》视频的话,就明白这一观点的对抗深挖下去其实就是源于一个观点和立场罢。键盘侠与游戏门之间发生了太多事情,所以搞得每一个单独的问题都会很奇怪地以某种方式与其联系上。有时候我会以一种开玩笑的口吻发一个推文表达我喜欢某种类型的音乐,比如说挪威并不存在真正的音乐形式或者爵士并不是真正的音乐形式云云,然后就会影响了一些人过来抨击你。很多情况下这只是开玩笑,虽然有时不是。我倾向于认为人是本善的,而且我清楚,在我还年轻和无名时我就一直是这样,只是想表达一下意思。这就像枕头大战一样,并不是因为你真的想要去伤害别人,更多的只是想去玩吧。

Youtube 视频:This Video Will Make You Angry
Youtube 视频:This Video Will Make You Angry

媒体:推特上的一些人指出你有跨性别恐惧症(transphobic)[14],我必须承认我并不清楚他们是如何得出这个结论的。

佩尔松: 哈哈,这只是一个容易给人贴标签的词吧,我觉得他们并不是真的这么认为。

媒体:我看了你的推特和采访,并不清楚这个断言是哪来的,但就像我说的,它就是摆在那儿。如果你去搜索的话,会看到有人说你是垃圾、反跨性别者。

佩尔松: (笑)我不知道那是怎么出现的。可能是因为我在某件事的某个点上拒绝了做出选择,又或者是因为我对此做出了什么反应,于是就被扣上帽子了,不清楚。我真的不在乎人们怎么做,我没有跨性别恐惧症。我只是希望人们能够去表达自己,同时不必在乎别人怎么做。我不是鼓励人去改变自己的性别,如果有人说要去变性,那么祝安好!如果你对此有话想说,我洗耳恭听。至于其它,我不在乎。

媒体:如果一个男人转性成了女人,那个人现在是女人吗?你会用什么代词称呼?

佩尔松: 看他们想被怎么称呼。我觉得很荒谬的是,你的身体属性必须要限制你如何表达自己,尤其是在网络上。我的意思是从生物学角度来看人是以特定方式出生的,我们不应该忽略现实存在的事实。但性别标签更多的是表意说法,尤其是在网络上。所以即使某个人并没有转性,但是希望被称呼他或者她,又何妨呢?为什么会有人在乎这个?我才不在乎你有一个蓝色的头像呢。(译注:蓝色的头像指网站默认的男性头像)

媒体:好吧,我们继续谈下游戏新闻业的话题。你明确表明过无论如何你绝对不会是游戏新闻业的粉丝。你称 Kotaku[15] 是“键盘侠的传声筒,试图死守道德虚伪与权力炫耀的沉船”。

佩尔松: (笑)

媒体:电子游戏新闻有什么问题吗?你不喜欢它的什么?

佩尔松: 我喜欢,也会去读。但它只是一种流行文化,并不是新闻业。然而他们总喜欢说“对,但我是一名记者!”,好像他们在生活中有一些明显的特权一样。但这不是新闻业,他们并不是记者。他们会说“可是我们不应该去谴责一个没有女性林克角色的游戏吗?”,对此我只能说“不”,因为这明显与新闻业核心基本原则相悖。如果你认为你自己是一名新闻记者,就应该尽可能做到客观,将其视为主要特征之一。但玩家并不喜欢阅读那些冰冷的、事实性的游戏新闻报道,所以就使得这更像是……怎么说呢,所有这些报道都成了主观的文章或社论。他们自称为新闻记者,却在讨论虚拟现实里的乳摇如何奇怪,讨论如何浪费 20 分钟重新载入游戏,又或者讨论他们小时候的奇闻轶事,以及讨论枪支利弊。我是瑞典人我不喜欢枪支,但在一个关于虚拟现实的视频里谈论枪支的利弊,并不是我想看到的。

媒体:你刚刚谈到了新闻业的一般性与客观性。但也有一些记者和游戏记者说客观是不可能的,最好是坦言偏见。对此你有何想法?

佩尔松: 我感觉对于娱乐而言一定会有客观的余地的。一定有客观的余地,只是那些游戏记者不愿意去尝试客观。读懂那些与你意见一致的人也好,看清那些与你意见不一致的人也罢,阅读(本身)是挺有趣的。要是声称客观性是不可能的话,那科学性呢?我们——我这辈子没搞过科学,不能说“我们”(笑)——科学家们就摆脱了整个观念尝试去使得所有事情变得可度量。当然,搞硬科学比起像心理学这些更模糊的学科要更容易些,但对没错,人会抱有偏见这个还是得承认的。不过我们不应该仅仅接受这个事实,而应该尝试去编制一些工具来克服偏见。否则就会变成像《This Video Will Make You Angry》视频里说的那样,为了大声表达观点却在相互大嚷大叫。

Gamergate
Gamergate

媒体:你提过游戏门[16]的事,对此你是有何看法的?

佩尔松: 这事发生后,我不敢相信,觉得为所有涉事的人感到羞愧。(这其中)很多人做了很多错事,但我觉得还没夸张到造成这狗屎局面的程度。关于 IGF 的评委存有偏见等的谈论,就像是一场很久没有出现过的小型竞赛。那些参评的人本身就来自社群,他们有他们自己的个人喜好这是必然的。这甚至一点都不用意外。这就好比奥斯卡,如果说某人拍了一部关于一匹马的电影,当之无愧地获得了奥斯卡奖。你可以看得出可能是因为属于他的时刻到了,(获奖)并不仅仅是因为其最佳的实际表现,在幕后可能发生了什么事情。我未实际看过《荒野猎人》不太清楚,不过你可以看得出那是属于它的时刻。这并不是宣称它是有史以来最好的电影,只是因为要庆祝它。所以我想表达的是,没错,因为你喜欢你的朋友,所以你可能会偏袒他们。你偏袒他们,是因为你真的清楚他们创作所付出的努力,尤其是其中那些相当细微的事情。

媒体:一些游戏新闻记者已经在推特上公开抨击你了,比如 Rock Paper Shotgun[17] 的人说你是“混蛋”。

佩尔松: (笑)他们说的没错!

媒体:现在他们对你的态度与三年前有不同吗?

佩尔松: 额…… 是吧?只是我觉得三年后今天的环境也已经改变了。

媒体:怎么改变?

佩尔松: 我觉得在那时他们实际上赚到了钱。如今所有游戏门相关的东西你都得去站边这事变得越发重要了,否则其他人就会问你“你支持哪一方?!”。只有很少人能够避而不谈,在这方面 The Escapist 做得很不错。你必须得站边,自然也就同时选择了你在“游戏新闻业”——这里有个很大的双引号,中的其他朋友。因为你就是在这样的文化中成长的,这是你的文化。而不是些什么邪恶的阴谋。

媒体:所以你认为游戏新闻业在这场文化大战中已经占有一席之地了吗?

佩尔松: 不,并不是全部吧。像 Rock Paper Shotgun 我以前挺喜欢的,现在……呃。还有 Polygon,感觉是不是他们已经不喜欢游戏了?

媒体:我见你说过一下那个关于 Polygon 游玩 DOOM 的视频的事[18]

DOOM
DOOM

佩尔松: (笑)事实上,对于那个视频他们不是用“不好意思我今天不太高兴,好吧这太搞笑了”之类的解释拥抱玩家,却用“不,我们只是写游戏文章的人,不是游戏专家!”这么个荒诞的借口。我想说,体育评论员是不一定是世界上最好的运动员,但是如果你是评论足球的,你就得知道怎么踢足球。如果你是评测游戏的,当然你就得懂怎么玩游戏。

媒体:你已经说过很多次在业内有许多人不能公开地支持你,只在私下对你表示支持。其原因在何?

佩尔松: 因为他们不想卷入其中,不想惹来关注。也许是他们觉得我所做的对他们来说不太重要,他们不想他们的声誉被玷污,不愿意 VICE 上有写抹黑他们的文章。而我也清楚为什么会出现这些抹黑诋毁的文章,原因是他们(媒体)想确保(公开支持)这种行为会收到惩罚。然而幸运的是,我并不在乎。

媒体:这就是我们刚刚谈过的自由吧。

佩尔松: 我也认识到事实上这只是我的事情。我不是企业家,我只想待在家里了解(游戏)物理如何工作。

媒体:这些人没有走上台支持你,你有觉得难过吗?

佩尔松: 不,并没有。其原因我完全能理解,这也没什么。人们只是在网络上有政治观点而已,又不是真的快要饿死的情况。

媒体:推特上的论战有令你在人际关系方面失去过什么吗?

玩过以撒或者节奏地牢的玩家都熟悉的 D 胖
玩过以撒或者节奏地牢的玩家都熟悉的 D 胖

佩尔松: 我感觉有一部分人挺荒诞的,他们声称支持我但其实并不是,然后却反过来想我去支持他们。之前唯一一次我跟其他人说过这事是跟 Danny Baranowsky[19],他为《节奏地牢(Crypt of the Necrodancer)[20]》创作了非常棒的游戏音乐。我很喜欢他,虽然他并不认同我。我们在今年三藩市的 GDC[21] 上碰了面,他对我说了声“嘿,恭喜啊!”的话,因为我拿了个奖,是大使奖还是什么来着——啊我应该记住我拿了什么奖的(笑)(注:其实是先驱奖)。他知道我们在不同事情上有不同的观点,但不管怎么说,他还是祝贺了我。我知道他不认同我,但很高兴他祝贺我了,我尊重他。

媒体:你在游戏行业的人脉呢?他们通常是怎样的么?对于你在推特上的论战他们能应付得来吗?

佩尔松: 也许吧。

媒体:他们中有人给你发过私信告诉你可能有些东西你不该说吗?

佩尔松: 早些时候在我谈论一些事时有人联系我,最近没那么多了。我忘了那时我说了什么,他们联系了我跟我说“不,这个问题事实上比你想象的要严重的”,因为他们一直在接近那些人。感谢他们告诉我吧,虚心学习。我遇上太多屁事了,人们给我发威胁邮件什么的。这些似乎在女性那边更加糟糕。

媒体:关于推特的论战就谈到这吧。在出售 Minecraft 之后,你在告别信中说“如果我偶然间再做了一些看起来有吸引力的东西,我会马上放弃它”。现在的你还是这样想的吗?

佩尔松: 现在不一定了。我是害怕再对一款游戏担负起责任,因为一旦这样你会被诱使一直做下去,粉丝们的即时反馈是有点令人上瘾的,你会不想让粉丝们失望。现在想起来还挺有意思的。这也难免让我觉得我好像无意地陷进了一段感情中,如果让所有人失望了,压力会很大。

媒体:你说过这也是你出售 Minecraft 的原因之一。是粉丝们的意见与要求给你带来了负担?

佩尔松: 不,根本不是这样的,我还是会想做出我能做的最好的游戏,亨利·福特不是说过一句话嘛,“每当我问顾客需要什么的时候,他们总是会说需要跑得更快的马”[22]

媒体:嗯嗯。(注:看来历史上一直误认为是福特说过这句话。)

佩尔松: 我感觉这情况对很多游戏开发者来说还挺常见的,不过不是以这么一个束缚的方式出现。没错你得去倾听玩家说他们想要什么,但是你才是做游戏的人。你了解游戏,可能玩过很多游戏,知道怎么去创新,更加清楚怎么发展它。所以不是说玩家要求游戏怎么怎么样,而是更多的是一份责任,去提炼出玩家真正想要什么,或者是他们对哪部分存有疑惑。我是想做出我能做的最好的游戏的,因为乐趣就在于做出一款伟大的游戏呀。

媒体:我看过在推特上有个人跟你有一个对话,说你是第一个发布 Alpha 版游戏的人,掀起了一股趋势:人们开始发布一些未完成的、充满 BUG 的烂游戏。那个人说你对此有责任。Minecraft 似乎是第一个如此成功的游戏,你觉得你有责任吗?

佩尔松: 不,我这么做是因为看到《表层指挥(Cortex Command)[23]》是这么做的,并且他们也是从其他地方学来的。我思考过为什么会有那么多独立游戏开发者破产倒闭。我开始也想过我将会怎么做,该如何做游戏,因为我从来没拿过一款(未完成的)游戏实际去收费。我希望能出售的是一个成品,能以之为荣。而在我见识到《表层指挥》如何获得社区的参与支持之后,我就想如果我早一点开始收费也许能成吧。事实证明这是可行的。如果我没有早点开始收费,我觉得我会完成不了 Minecraft。现在开发者们能有这么一条出路,我觉得是很好的。如果有吸引人的地方,人们还是会买单的,尽管有过一些失败的例子。我所知道最好的例子就是 FTL 了,《超越光速(Faster Than Light)[24]》。

2001 年开始开发,2012 年才登陆 STEAM 的《表层指挥》
2001 年开始开发,2012 年才登陆 STEAM 的《表层指挥》

媒体:我见你说过这个游戏很多次了。

佩尔松: 它是一款相当可爱的小棋盘游戏……

媒体:这游戏伤我太深了!

佩尔松: 哈哈,在 Twitch 上你会看到有人在玩无暂停的困难模式。这游戏的氛围和音乐做得真的是淋漓尽致,对发行商来说这些是很难(做到)的。

媒体:FTL 里面所有的飞船你都解锁了吗?

好评如潮的类 Rogue 式太空飞船模拟游戏 FTL
好评如潮的类 Rogue 式太空飞船模拟游戏 FTL

佩尔松: 没呢。最早我是在 PC 上玩的,之后是用 iPad 玩的,感觉更赞。后来由于我的 iPad 丢了就换了一台 iPad,大概解锁了 4 个飞船吧。最近我没怎么玩了,现在买了新的 iPad 又得重新来过。

媒体:好吧。接下来问一个最重要的问题:你目前正在做什么吗?

佩尔松: 我正在做一些东西,但这个会尽量不让任何人知道。

媒体:是新游戏?

佩尔松: 哈哈,做游戏是我觉得最有趣的事了。玩家抱怨我用 Java 写的 Minecraft,这个新东西是用 JavaScript 写的,我在努力。(笑)

媒体:这一定很有趣。

佩尔松: 是一个关于要找到最长可能路径的荒谬性的东西。很有趣!

媒体:前面我们谈到过关于你在出售公司之后对于后续生活的理解。这个你已经想透了吗?还是说正在这个过程中?

佩尔松: 还没,不过我觉得我已经习惯了不用再去想通这事了。当你可以做任何你想做的事情时,你已经失去了一部分东西。人们往往享受扮演惯常的角色,因为已经习惯了知道自己该做什么。不过只要你愿意接受的话就挺好的,这只是 1% 的人会埋怨的事情。但你必须运用不同的技能来驱动你自己,这样你才不会一个星期穿着内衣坐着只是在打代码,令一切变得糟糕。你不能依靠闹钟响来驱使你早上去上班,需要去学习各种新的技能。去习惯不用知道自己要做什么。

媒体:许多人好像非常关心你正在做什么事,是否还有生活目标。福布斯杂志有一篇文章说你“已经到头了”,认为你没有目标,没有项目。你觉得你需要定一个目标或项目吗?还是说你接受了这番话?

1998 上映的《楚门的世界》,金·凯瑞主演
1998 上映的《楚门的世界》,金·凯瑞主演

佩尔松: 我感觉这有点像《楚门的世界[25]》里面的结尾,当楚门最后穿过拍摄场地时,所有的事情变得完全不一样了。我是虚无主义者,并不认为这一切都是真实的。我觉得“真实”是一个捏造出来的词,因为它只是意味着我们有一个主观现实,我们是这个主观现实的组成部分。显然,所有事物都是这样的。但这并不意味着我们比其它任何数学概率显得要真实。我不认为任何事情的发生都是有目的性的。大概还可以说我是无神论者吧?我在尝试坚持“尽可能创造出更好的故事”的生活模式,因为当我离开人世后,剩下的只会是那些发生过的为人所知的事情。所以如果我有试图去创造一个有趣的故事的话,那我认为我已经尽力了。我不觉得有什么是我要做的。当没有了日常生活的框架去认知你该做什么的时候,你很容易会变成去放纵看完《绝命毒师》,而不是去做一些能创造更好故事的事情。所以,我是不是已经到头了我并不清楚。但我已经成功放弃了一家公司和它的员工,因为我意识到我从来就没有真正想过得到那些。只是因为 Minecraft 变得庞大了,我才必须去做这些事。至于编程?我一直都有在做。

媒体:好吧,接下来我们进入限时抢答环节吧!

佩尔松: 喔不。

媒体:你有吃过鲱鱼罐头吗?

佩尔松: 在我还是小孩的时候吃过,鲱鱼罐头本应是挺恶心的,我不记得那时我是真讨厌它还是假装讨厌它了。在我们出售公司之后,雅各布(Jakob Porser[26])还想让我再吃一次。我的反应是觉得他很无聊,因为我已经基本上什么东西都吃了。

媒体:挪威有多糟糕吗?

佩尔松: (笑)前些年是我们分离成两个国家的 100 周年纪念,文档里说我们进行了一百年的暂时分离,之后会重新谈判。其实并没有人关心这个,那时人们只是觉得“无所谓啊,你的国家是你的国家,为什么还要提这事呢”。我在想“他们有很多石油啊”。其实我真的挺喜欢挪威的。

媒体:这真是一场伟大的对抗。

佩尔松: 我认为这跟詹代法则有点联系。其实不管是瑞典人抱怨挪威还是反过来挪威人抱怨瑞典都无可厚非。但如果有人去说挪威的话我会觉得不高兴。

媒体:一个富有的人会知道贫穷是什么样的。如今当看着物品的价格时你还会带着贫穷的心态吗?仍会觉得“什么那份牛排要 200 美金!”?

佩尔松: 会的会的。这不是因为我觉得我买不起,而是感觉像是被骗了。如果真的有一位非常优秀的推销员向我推销牛排的话,我可能会尝尝:“好啊,来跟我说说这牛排到底有多好”。如果不是美味势不可挡的话我想我不会再去吃了。我比想象中要更关注商品的实际价格。我会将“我知道一条面包的价格吗?”作为现实检验的方法之一,结果就是我会跟踪一些价格动向。

媒体:你会烹饪吗?

佩尔松: 不会。主要是我觉得烹饪很无聊,做饭比吃饭要花更多时间。对于烹饪我没有任何真正的想象。就类似于室内装饰,你问我“你想要什么样的椅子呢?”,我会说“不知道呀,不知道呀,有什么样的椅子吗?”。烹饪就跟这个一样,你问我“你在做什么食物吗?”,我会说“我不知道呀。”,然后做了一个很不错的卡布纳拉意面。

去过 IKEA 应该都吃过里面餐厅的肉丸吧
去过 IKEA 应该都吃过里面餐厅的肉丸吧

媒体:那瑞典肉丸呢?

佩尔松: 我可以买冷冻的,然后把它们放进锅里煮到不再冷。很美味!

媒体:你喜欢电子音乐,这是众所周知的。你有不喜欢的音乐流派吗?有哪些音乐是你不能忍受的?

佩尔松: 唔……

媒体:乡村音乐?

佩尔松: 这可能是离我最遥远的音乐之一了,还有我开过玩笑的爵士。不过我并没觉得这些流派有任何问题,只是我从来就没有对它们大加赞赏。如果我喝醉了我可能会欣赏任何类型的音乐,酒精最大的一个作用是能让音乐变得美妙。记得我在克里夫兰的一家酒吧里和一群拉着小提琴、吹着口琴等搞演唱会的人在一起庆祝圣帕特里克节,喝得酩酊大醉的人们中夹着奇妙的音乐,很棒的氛围。

媒体:你接触过许多大明星,其中有让你特别追崇的吗?

佩尔松: 最强烈的大概是约翰·卡马克[27]了。

媒体:那可真是极客啊!

佩尔松: (笑)小时候我有几年梦想在做 DOOM 引擎(好长的一个梦!)。不过不是梦想发明了它,而只是想去理解它并把它重建出来。这件事成为了我的依托。在只查看文件格式没有看源代码的情况下,我想我已经从头写过两次这个引擎了。遇到约翰确实很是深刻。

媒体:是时候找下你麻烦啦。PC 和主机你更喜欢哪个?

佩尔松: 我会选择 PC。我觉得如果你有几个好基友、几份爆米花和啤酒的话,那么你可能会选择主机。记得我曾喝醉了在(主机上)玩《基友大合体(Mount Your Friends)[28]》,非常有意思,但这在 PC 上则很难操作。对于我来说,我会更喜欢呆在房间里,坐在一台电脑前面,对着我的耳麦说话。

媒体:你有玩过多人游戏吗?比如《火箭联盟(Rocket League)》?

佩尔松: 我试玩过《火箭联盟》……

媒体:现在所有人都去玩《守望先锋》了。

佩尔松: 是的,我之前还玩《军团要塞 2》,现在在玩“军团要塞 3”了(注:佩尔松以此称《守望先锋》)。

媒体:你在《军团要塞 2》里用什么兵种?

佩尔松: 主要用的是士兵(火箭兵)。Valve 为我的所有角色做了一个立方体像硬纸板箱子一样的自定义帽子(头套)。所以其他玩家能认出我。我还获得了 2~3 个口袋间谍和口袋医生(饰品),有点感觉我跟其他玩家玩的不是同一款游戏。我太相信人了,不会做检查间谍(Spy check)。我喜欢发射火箭,擅长发射火箭来背刺别人。

阀门为 Notch 特制的《军团要塞 2》 Top Notch 头套
阀门为 Notch 特制的《军团要塞 2》 Top Notch 头套

媒体:你会玩火箭跳吗?

佩尔松: 哈哈,肯定呀。这也是为什么我会喜欢《守望先锋》里面法拉的设计,因为她跟火箭兵相似,像是一个飞行着的高贵的骚扰者。在游戏中我会试图保持高度优势,这很有趣。但是她的大招是定在地上发射非常不准的火箭。我觉得如果她的大招能多一点移动性的话会更加有趣。像我会建议大招是一个地面猛击,从越高的地方冲下来,落地时的攻击力和击退就越高。相当于用高度换取了击退与攻击力,然后(后摇)卡在地面一会。做成像是——“现在,我要下来了”,然后使用大招,或者是在更高的地方使用——“我要把他们都撞倒!”。这样比定在地上射击,会更加符合这个角色吧。

媒体:有哪个你最喜欢的游戏是现在正在玩的?

佩尔松: 我已经有点厌倦《守望先锋》了,目前在重玩《GTA V》。他们做了个迷幻仙人掌的彩蛋,吃下后会变成大脚怪。在 Reddit 上还有玩家在讨论关于千年山秘密的事,试图去揭秘这些阴谋论。(知道这些后)我感觉“卧槽,这游戏藏得很深呐”。

媒体:你对车感兴趣吗?

佩尔松: 我以为在我有钱之后我会买一辆豪车,于是在一年半前我去考了驾照。然而在我拿到驾照后,我只开了大概最多八个小时。我认识到其实我不怎么喜欢开车。

媒体:于是你可以在《GTA V》里面开车。

佩尔松: 是的,在《GTA V》里没有限制只能右转弯,你不必忍受交通堵塞。而在斯德哥尔摩,所有街道都是单向的。在《GTA V》里你可以在马路中央的分隔线起动,这很荒谬但也很有趣。

媒体:在《GTA V》里你有帮会吗?以及有玩过抢劫模式吗?

佩尔松: 没有。我第一次玩《GTA V》时还没有抢劫模式,我们只有一个很小的帮会,里面大部分是 Mojang 的成员。后面玩抢劫模式两三次后发现要更多的队友,然后每一次玩的时候匹配到的人好像都是 Polygon 的员工(译注:嘲讽匹配到的都是不会玩的)。

媒体:你觉得虚拟现实是未来趋势还是昙花一现?

佩尔松: 必然是未来的趋势。我在生活中初次使用时(就觉得它)已经足够实际应用了。

于 2014 年被 Facebook 以 20亿美元收购的 Oculus
于 2014 年被 Facebook 以 20亿美元收购的 Oculus

媒体:HTC Vive 和 Oculus,所有这类设备你都用过吗?

佩尔松: 我之前用的是 Oculus Rift DK2。我知道他们说打算给众筹者们送出正式版的产品,但如果他们不这么做,我也不会介意的(笑)。因为 Facebook (收购的事)真特么吓到我了,以及我也不想虚拟现实被……

媒体:用来挖掘你的数据?

佩尔松: 是的,我不想它监控我的电脑并把信息发给 Facebook,这个我想想都害怕。而 HTC 做事对比之就好得多。Vive 是有点重,带在头上挺沉的,但它有几乎和头显一样大的控制器。玩家拿着控制器就会感觉很直观,不会觉得只是有多个显示面。非常棒。

媒体:你有想过做 VR 的开发吗?

佩尔松: 有的,我之前在第一版的 Oculus 上用 Unity 做过一些实验,了解为什么玩家会产生作呕等等的问题。之后我打算等它更好的版本出来,从 DK1 到 DK2 的进步很惊人。后来我想过去继续这个项目,但我却转去玩 WebVR 了,这东西虽然有点天马行空,但胜在能用,它的 API 非常简单。

媒体:你的 PC 呢?是你自己组装的吗?

佩尔松: 没,大概 10~15 年前我就没那么做了。以前我很热衷于这个,每隔几年出来的 CPU 等产品我都会很清楚。直到后来我发现比起硬件我对软件的兴趣更高。现在我不再了解我的 PC 里具体有什么了,因为我有朋友会推荐这么一套 PC 架构,并且做一些个性化来适应你的需求。我会跟他说“整得很高大上我才能向人们装逼啊”云云,不过他基本上会认为你只是在为了烧钱而烧钱,并且会帮你进行缩减。于是我有了一台很棒的个人电脑,让我挺高兴的。

媒体:你是某些物品的收藏家吗?

佩尔松: 不算吧。我确实有存一些旧 PC 游戏的盒子,因为挺有意思的,但不会说我是收藏家。我不会去拍很多的照片,不会多愁善感,我更愿意活在当下。我从来不会去看(旧)照片,不过我会去看别人拍的一些食物照片,会觉得(食物)更加美味。

媒体:真的吗?

佩尔松: 是的,就像有个很好的侍酒师在给你描述酒,向你宣传,给你建立了预期一样,你会觉得酒更好喝。

媒体:你有养宠物吗?

佩尔松: 没有。我对猫和狗过敏,而且养宠物你得多到处走动。

媒体:还有哪些我没有提到的你想说的吗?任何想让全世界知道的事?

佩尔松: 我觉得我真没到能这种影响(全世界的)程度吧。人们能更加明白名人其实也是人这一点就好。他们(名人)并不是表面那样的,只是选择了想怎么展现。我认为跟一位你对他有成见的人、亦或是跟一个人的表象人格进行互动交流,是完全没问题的,而不是为了一些虚假的事物去攻击别人。比如说我有跨性别恐惧症,拜托,我从来没说过跟那相关的话好吧。你这是试图在网上发表什么声明罢。虽然我觉得这并不会有什么改变,但人们能够学会这些就好。

媒体:好的。感谢您抽出时间接受采访,愿您愉快!

佩尔松: 非常谢谢你!非常有趣,真的。

全文完


  1. Minecraft: The Story of Mojang 纪录片(B站 中文) ↩︎

  2. The Tao of Notch - Beyond Twitter ↩︎

  3. Jens Bergensten - Minecraft Wiki ↩︎

  4. Snopes.com,国外最早的在线事实查核网站,因验证和揭露美国流行文化都市传说而出名 ↩︎

  5. 詹代法则(Jante Law)为什么会成为斯堪的纳维亚国家(丹麦,瑞典,挪威等)的主流价值观? ↩︎

  6. 《This Is Phil Fish》纪录片(Youtube 英语) ↩︎

  7. Destructoid: 美国一家游戏博客媒体(Wikipedia 英语) ↩︎

  8. 猎空的"背影“胜利姿势将被替换(NGA 论坛翻译) ↩︎

  9. 什么是多元交织女性主义(USATODAY 英语) ↩︎

  10. 【JoinFeminism字幕组】游戏情节与女性:落难甜心(上篇) 【双语字幕】(B站) ↩︎

  11. 社会正义战士(维基百科 中文) ↩︎

  12. 稻草人谬误:那些没能说出口的话,该怎样理解? ↩︎

  13. 【中字】这个视频会让你生气This Video Will Make You Angry@阿尔法小分队(A站) ↩︎

  14. 跨性别恐惧症(维基百科 中文) ↩︎

  15. Kotaku: 美国一家游戏博客媒体(维基百科 中文) ↩︎

  16. 国内有 Gamergate 事件的消息吗?(知乎) ↩︎

  17. Rock Paper Shotgun: 美国一家电脑游戏新闻网站(维基百科 中文) ↩︎

  18. Polygon 不懂得如何玩 DOOM 的原视频(Youtube 英语) ↩︎

  19. Danny Baranowsky 创作的游戏音乐(网易云音乐) ↩︎

  20. 《节奏地牢(Crypt of the Necrodancer)》STEAM 商店页 ↩︎

  21. 游戏开发者大会(Game Developers Conference)(Wikipedia 英语) ↩︎

  22. 关于亨利·福特是否说过这句话国外一直有讨论(Quora 英语) ↩︎

  23. 《表层指挥(Cortex Command)》STEAM 商店页 ↩︎

  24. 《超越光速(Faster Than Light)》STEAM 商店页 ↩︎

  25. 楚门的世界 The Truman Show (1998)(豆瓣) ↩︎

  26. Jakob Porsér - Minecraft Wiki ↩︎

  27. 第一人称射击游戏教父,首款3D游戏的开发者,传奇程序员——约翰·卡马克 ↩︎

  28. 《基友大合体(Mount Your Friends)》STEAM 商店页 ↩︎

☑️ ☆

2016。2017,

新的一年,还是捡捡(又?)荒废了近一年小站吧。改改主题,写写回顾,看看过去一年自己都经历了些什么。

1月:实习结束。也是无法想象能作为半个月 Python 新鸟入职,然后接坑微信开发。。。跟着 JS-SDK 走了一遍,入门了 Flask。因为想花点时间搞搞毕设,提前离了职。

2月:问答系统,自然语言处理方向的毕设课题,完全下不了手,还是先过年吧。港澳通行证 get。

3月:恶补毕设课题知识。

4月:完成了毕设程序[1],用了实习学到的 Flask,现学现用 scikit-learn、Word2Vec、LTP。整个系统最初设计是我负责问题分类,队友负责问题解答,但最终还是没有和队友的程序组合到一起。没有被选上答辩(队友上了 lol)。

桂林西站
桂林西站

5月:毕业游,桂林。找工找房。

6月:Offer 到手,一毕业就“转行”。Hong Kong 游一日(天气不好,鲜虾云吞真大粒)。离校。眼科中心验光,发现大学搞了四年电脑近视没变化。

7月:转正。观《大鱼海棠》。《Pokermon GO》“昙花一现”。

8月:才确定新窝的网络,发现有公网 IP,不过没什么卵用,压根儿没上行。

9月:入手第一台相机 EOS M3。微单,还不是索尼大法?。

10月:去了趟漫展,见识到拉拉人的可怕(梦回十月三.jpg)。

11月:又拔了智齿,至此 4 个仅剩 1 个了。花时间做好了想整理想了一年的歌单[2]

12月:观《你的名字》。STEAM 圣诞特惠居然没剁手(才怪,剁在升等级了,果然上班后咸鱼了)。

毕业年确实有太多的改变,2016 我的年度文字应该当属字吧。


  1. Wende ↩︎

  2. Monty Hancock's Emotional ↩︎

☑️ ☆

.im 域名续费一记

去年十月,也不知道是哪根经出错了,剁了个 .im 域名。在域名怪兽买入的,当时 checkout 时才知道仅支持 CC 及 CC through Paypal 付款。

学生狗没有 CC,域名很想买,又要省钱。于是就用了很多人都想到或用过的 VCC。那时错过了财付通的运通卡,了解了各种 VCC 后就选了全球付。扣了不少转换费手续费后买下了域名。

然后今年续费的麻烦事来了,爽后擦屁股。

八月份就开始想着怎么续费。因为全球付不实名账户最低充值 100 元,我没实名。于是为了尽量一次用完充入的钱,我就想着能不能一次续几年。然后发 ticket 询问被告知只能续一年。而且续费间隔被限制在到期前六个月。

到期续费提醒
到期续费提醒

我不是很清楚域名注册的相关规定,但是据我所知某些后缀的域名是可以一次购买或续费好几年,又或者通过多次续费(没有续费间隔限制)延长时间的。.me 好像就是吧,之前了解到有人多次续费弄了好几年,好像有优惠什么的。

各大域名商 .im 价格
各大域名商 .im 价格

既然不行那就看看其它注册商。.im 最便宜无疑是域名怪兽家(9 刀),不然我也不会在那买。name.com 家的话是 13 刀,好像可以 Paypal 确认支付,其实还可以接收。但发现在它家 .im 不能开隐私保护,这在域名怪兽那可是免费的(对,就是免费的,文末再介绍一下),于是就犹豫了。至于其它注册商全然没看,太贵无视(普遍 20 刀)。

回到域名怪兽家,既然不能续多年,那问问还有没有其他支付手段吧,尽量避免用全球付。跟客服来来回回十几封邮件,最终被告知除了网站标出的方式,最多只能用银行转帐(bank transfer)方式付款,还要等数天确认。期间还被建议先往 Paypal 里充值再下单,天知道在天朝不能充值 PP。(无奈脸

我想想这比全球付还麻烦,就硬着头皮往全球付打了钱,然后续了费。发现全球付收费规则改了,算算也没多扣多少,不过钱放里面总觉得哪天悄悄给你扣钱,找机会赶紧用掉。

然后就没有然后了。

说到域名,不知道从何时开始,各种后缀的域名如雨后春笋般涌出,什么 .website .xxx .xyz .xxoo 这个好像没有,眼花缭乱。大公司有钱任性,购买各种后缀的域名来保护产品没得说。但有时候觉得个人注册这些五花八门后缀的域名,真的是交学费吧。什么 .photography 的,真拿来做站也没什么人愿意好好地往浏览器里键入域名吧,而且又容易打错。其实也就图个个性,自己想注册的域名要有 .com 后缀,谁还愿意折腾其它后缀呢?

最后再说说域名怪兽,就是 Domainmonster.com 了,英国服务商(所以 .im 才会那么便宜吧...)。在这家能注册的后缀非常多,有多少我就不数了。而且提供多种 Domain Services,其中最值的是免费的隐私保护,无论是新老域名。

付款方式前面已说,目前仅支持 CC 及 CC through Paypal 付款,所以没 CC 会比较麻烦。跟客服通邮件时已经建议其考虑下支持支付宝,至于后面到底如何,不报任何希望哈哈。

☑️ ☆

Newbie Mac Bootstrap

入坑 Mac OS X,写点 note (nonsense) 以备玩坏系统重装时翻查。

Command Line Tools for Xcode

OS X 系统不像 Ubuntu 等发行版,系统默认是不包含编译工具链的(因为不是每位用户都需要吧,人性化?)。所以在使用时如果执行到含有诸如 gcc、make 等命令时,就会出现以下情况:

提示需要命令行工具
提示需要命令行工具

这时就需要安装苹果提供的命令行工具包(Command Line Tools,下称 CLT)了。安装 CLT 有几种方法:

1. 通过 Xcode 安装

for Xcode 嘛,当然能通过 Xcode 安装了,只不过没有安装 Xcode 亦可使用。所以如果你有安装 Xcode 的话,直接通过 Xcode 安装就好了。(我自己并没有安装 Xcode,因为暂无打算学习 Mac 相关的开发,所以私以为没必要耗费几个 G 的硬盘空间塞下 Xcode 吧, MacBook 的硬盘寸寸金啊。。。)。

2. 通过终端安装

$ xcode-select install

或者输入 gcc 触发前文所提到的情况(见前文图)亦可。

3. 通过离线安装包安装

如果用前面的方法安装不成功的话,可到 Apple 下载中心获取离线安装包进行安装。(认准苹果官网)

https://developer.apple.com/downloads (需要使用 AppleID 登录)

安装 CLT 后就可以使用工具链编译安装软件了,这是 Bootstrap A New Mac 的第一步。

Where is the package manager of OS X?

用 Mac 之前我还真没想过 OS X 有没有包管理工具。初次用了一会儿后,总觉得好像少了些什么,又说不出来。后在 Win 机上 Xshell 管理 VPS 时,才猛然想起:OS X 下用什么管理软件包?!Where is the package manager of OS X? 检索后才知道 OS X 不止默认不带 toolchains,还没有 package manager。带着使用 Linux 发行版心态的我不免有点失望。

Homebrew

官方没有社区有。强大的 Mac 社区造就了各种易用的工具。软件包管理工具就各式各样。其中最出名的两个是 MacportHomebrew。二者有着截然不同的理念,并且越来越多用户选择了 Homebrew。下面进行 Bootstrap A New Mac 的第二步。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

OS X 自带 ruby,难怪 ruby 社区一股 Macbook 风气。

然后就可以像用 apt-get install/update 那样 brew install/update 了,更多用法参见 Doc

Homebrew-Cask

介绍了 Homebrew 就不得不说 Homebrew-Cask 了。Homebrew 掌管了各种 CLI 软件包的管理,App Store 提供各种 GUI 应用,这 Cask 又是什么?Cask 其实是 Homebrew 的一个扩展,能让 brew 支持安装和管理 GUI 应用。能在 App Store 获取到的应用当然最好在上面下载安装了,但有些应用程序是没有上架 App Store 的(比如 IntelliJ IDEA),得去程序的官网各种点击下载安装。于是不甘这样的 Mac 社区 Geek 们搞了个 Homebrew-Cask,然后就能打开终端一句指令愉快地安装 GUI 应用了,比如:brew cask install intellij-idea-ce。Cask 已经被集成在了 Homebrew 中,直接如下使用即可:

$ brew cask install atom
☑️ ☆

用 Scoop 改善 Windows Powershell

关于 Scoop 的新文章

一本道

软件包管理工具想必大家已经很清楚并且使用过。Debian/ Ubuntu 的 apt-get, Arch Linux 的 Pacman,就连本身并无自带包管理工具的 Mac 都有了 Macports 和极其好用的 Homebrew。至于 Windows 下, Geek 们也生产出各式各样的工具以贴合他们的 *nix 使用习惯。其中软件包管理工具中比较出名的就是 chocolatey 了。

然而本文并不细谈 chocolatey,而谈的是一个叫做 Scoop 工具。官网上的描述是“A command-line installer for Windows”,其实说白了,就是和 chocolatey 同属一种东西,也就是 Windows 下的软件包管理工具,但其并没有 chocolatey 出名与强大。

那我为什么要用 Scoop 而不是 chocolatey?一正是 chocolatey 够强大,但其实我一开始并没打算折腾 Powershell,因为已经在用 Git Bash / MSYS2,所以我无需使用太过庞大的工具;二是 scoop 有吸引我的地方,它能把 Powershell 弄得看起来像 Linux shell 的样子,这也是为什么我要折腾 PS 的促因。

看 Scoop 主页的 Demo 视频,你会发现视频里的 PS 用起来很简约,而又是更方便了,不仅能安装运行各种 GNU 工具(curlvim 等),而且 $PS1 看起来像是 Linux 下的终端,还能显示 git 仓库的分支信息,简直 Geek 范十足。虽说已有 MSYS2 这种更集成的 *nix 环境,但既然看到了 Scoop 又挺不错的于是就折腾下呗。毕竟是 Windows 内置的嘛,还能 Win + R powershell 快速打开,有时候打下指令(ipconfignslookup 什么的)还是会用到的呢。

配置 Scoop 后的样子
配置 Scoop 后的样子

正题

  1. 确保你已安装 Powershell 3(其实 Windows7+ 应该都已经集成了),然后 WIn + R 输入 powershell 打开 PS,一句命令安装 scoop:

    iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
  2. 安装完成后输入 scoop help,如果报错则需要允许 PS 提供脚本执行权限,执行:

    set-executionpolicy unrestricted -s cu
  3. 然后就可以像 apt-get 那样 install/uninstall 软件包了:

    scoop install pkgname

    用 scoop 安装软件包时不会弹出 UAC 要求提权,因为软件包是安装在当前用户的 appdata 下的,并通过 shims path 管理调用执行文件,而不是将每个执行文件的路径都加到 path 中。

  4. 开始美化控制台显示样式(★)首先 scoop install concfg 安装 concfg,然后导入 Solarized 主题concfg import solarized small(concfg 支持多种主题,详见 concfg/presets),期间会提示你替换了哪些控制台(其实也就 CMDPS)的样式。然后 scoop install pshazz 安装 pshazz,当安装完后马上就能看到 shell prompt 发生变化了,而且 cd 到一个 git 仓库还能看到分支信息,还支持 git auto-completion 呢。

  5. 然后还可以安装使用 touchcurlvim 等更多的 GNU 命令行工具。 scoop 官方的 Packages 是 bucket,如果里面没有你想安装的工具你还可以自定义 bucket创建一个 package

  6. 最后还能用 scoop 进行开发语言环境的多版本控制呢,比如 scoop install python27 python 同时安装 Py2.7 和 Py3,然后 scoop reset python27 选择 Py2.7,scoop reset python 则设置为 Py3。

至于更详尽的使用方法请 scoop help 或访问 Scoop Wiki 咯。

总结:所以说这种人就只能为他们的这种“如此难以伺候”而不断地折腾自己的电脑,折腾自己。这就是所谓“生命不息,折腾不止”吧哈哈哈。。。卒

☑️ ☆

Hello World

欢迎回到地球。

每次在硬盘找旧文件时,总会经意或不经意地点进放有旧博客备份的目录。然后心里想什么时候再处理下这些博文数据呢?等到终于解压博客档案,导入 SQL 后,发现也没什么值得转换的。既然都打开了,还是截些图纪念一下吧。以后应该就不会再打开了,当然数据还会留档。

Old blog
Old blog

自建博客以来见过不少次 Hello World 了,说不定现在的这里又会是未来哪个时候嘴里说的“黑历史”呢,哈哈!...

❌