分类 赛博艺术 下的文章

在故纸堆中偶然寻得了早年未竟的实验计划,代号 Story,惊觉其已然属于 Sympoesie 的精神。当时此计划已有一个 demo 公开,以 Django Web APP 的形式部署在 Red Hat 公司的 OpenShift 平台上。然而,自 2015 年以来,本站赛博架构几经变易,OpenShift 的云端服务也多次升级,当时的部署究竟没有保留下来。如今我虽仍存有当时的代码,却也难以在当前的环境下重现了。但想法很重要,故在此记录一下原理,以备日后有空重建。

得益于 Django 的工程模式,实现原理并不复杂。在数据 (model) 方面,如果以 Fragment 为基本单位,将其视为数据库中的一条记录,那么同时也应在记录中保存其上一条 Fragment 的 ID,以此形成连贯性。由此,创作者将有三种方式贡献其 Fragment:

  1. 创建一个全新的故事,即不存在上一条 Fragment 的 Fragment。1
  2. 在当前的故事末尾继续编写下一条 Fragment。
  3. 指定从某一条 Fragment 开始,重新编写其后的故事。既存的 Fragment 并不会被覆盖,而是作为另一种可能的故事线继续存在,同样接受续写的提交。

于是,一个故事连同其所有的可能性,将形成一个多叉的大型树状结构。2

难点其实在于数据的展示 (view)。按顺序将 Fragment 逐一展示并提供分支导航固然是不够的,必须有一套特殊的推荐算法来评估故事树中特定故事线的价值,选择最合适的 Fragment 及其所在的故事线优先展示给读者。同时也要便于读者在不同的可能性之间跳转。由于算法能力的缺失,我当时仅实现了三种推荐方式:最新作品百条、最热作品百条(以点赞数计)以及最具潜力作品(最新作品中点赞达到一定数量的)。虽然简陋,姑且能用。

可以看出,这个 demo 的功能是基本完整的。造成此计划不了了之的重要原因之一,正如许多其他的项目,无非是没人来 syn-。可见 Sympoesie 本身是一个具有极高门槛的活动,人类历史上任何一次实现都可称之为奇迹。


  1. 原则上这是可能的,但当时为求逻辑简便,实际上预先设定了唯一的一条全新 Fragment,因此只存在唯一的一个故事树。
  2. 当然,这种结构也存在着缺点。例如无法事后单独修改位于中部的某一 Fragment,因其可能会影响此后的其他分支。固然可以将之后的分支故事树另行复制,或者将每个记录的追溯做成双向的,但如此一来复杂度就上升太多,既不美观又不便利,总之我是不情愿的。

人总是有着各自的精神寄托。根据情况的不同,其表现形式也不相同。有人求神拜佛,有人祈祷忏悔,也有人更愿意用漂流瓶来倾诉。网上或许已经有一些树洞、神龛、留言板,但总是令人陷入这样的矛盾:一方面我们希望只有在保护隐私的前提下吐露真情,另一方面我们又不希望自己的愿望消失在虚空中无法产生一点影响。因此,这个文化中立的精神的房间,就是对这种困难的回应,即一种私人祈祷有效性的象征。

请点击访问:精神的房间

在这个房间里可以看到一长串字符,它代表了我们世界当前的状态。完全有理由(至少是象征地)认为它能够不重复不遗漏地与我们有限宇宙中对人类有意义的一切可能性一一对应。它并非随机生成,而是通过一定方式计算出的唯一确定结果。此处的象征性在于,每当人们用自己的意识去影响世界,世界就因此变化,而下一次的影响必然是以前一次之结果为基础的。每个人的意识共同构成了我们所处的世界。这个精神的房间表现的就是这样一种文化中立的信念模型,因此可以被尽可能多的人使用。

根据其原理,我们的服务器完全不必也不会保存任何祈祷的内容。任何人发送的任何数据仅用于生成下一个状态码,这串字符显然是完全抽象的,因此无需担心隐私问题。

关键算法:

$hash = hash("sha512", $hash + $_POST["msg"]);

  • Version 20211030. 增加了扬声器和会议角色等相关警示。
  • Version 20210914. 按所内现有设备情况编写。可根据实践效果接受反馈并修订。

0. 技术目标

线下活动为主,利用腾讯会议开放线上观看,但线上参与者不需要深度交流。

1. 前期准备

  • 在腾讯会议上预定好会议,确定会议号。
  • 两台笔记本电脑。一台(甲)供讲座人使用,另一台(乙)作为线上音视频主控。保证二者均有足够的 USB Type-A 接口可用。以及二者各自的电源线,鼠标等。
  • 接线板。可能由场地提供。
  • 音频设备,至少包括:麦克风本体(大)、电源/数据线(两头分别为 USB Type-A 和 USB Type-C)、天线(USB Type-A)。
  • 视频设备,至少包括:摄像头、三脚架、电源/数据线(一头为方形,另一头为 USB Type-A)。必要时也包括遥控器及其电池。

2. 安装硬件

2.1. 笔记本电脑

  1. 将电脑甲置于台上,连接电源以及场内投影。
  2. 将电脑乙置于台下,位置以同时能较好摄像为宜。使用接线板连接电源。

2.2. 视频设备

  1. 在乙处放置三脚架。

    1. 松开各脚上的卡扣,调整整体高度,确保三脚高度一致后,将卡扣重新卡紧,勿遗漏。
    2. 上部各旋钮的基本工作原理是:旋紧后对应关节便难以转动。除非需要调整角度,一般请保持旋紧。经常需要转动的关节可使旋钮保持半紧的状态,以可以活动但不至于松动为宜。
    3. 特别指出,圆柱形手柄是一个可保持半紧的旋钮,请勿遗漏。
  2. 在三脚架上安装摄像头。

    1. 将摄像头底部孔与三脚架上部螺栓对齐,转动螺栓正下方旋钮,使二者固定到一起。
    2. 在确保三脚架各关节以及与摄像头结合部稳固之前请勿松手。
  3. 将视频设备电源/数据线的 USB Type-A 头连接电脑乙,方形头连接摄像头背后“USB2.0”标志处。

2.3. 音频设备

  1. 将麦克风本体(大)置于甲处。其电源/数据线的 USB Type-A 头连接电脑甲,其 USB Type-C 头连接麦克风本体(大)。
  2. 将天线(USB Type-A)连接至电脑乙。

3. 软件设置

  1. 电脑甲上打开腾讯会议,进入指定会议室。打开屏幕共享,一般共享全桌面即可。为避免干扰,切勿将电脑甲设置为主持人或联席主持人。此电脑保持静音。
  2. 电脑乙上也打开腾讯会议并进入指定会议室。保证电脑乙角色为主持人。设置全员静音以及入场默认静音。
  3. 在电脑乙会议界面下方控制区域中选择正确的视频和音频设备。通常名为“USB [...]”。需要特别注意,此麦克风设备也具备扬声器,在本案例中,为避免干扰现场,切勿将腾讯会议或电脑系统扬声器设置为此设备。
  4. 正式开始讲座前,排除电脑甲屏幕上腾讯会议悬浮组件的干扰。可测试乙电脑视频和音频,但不宜过久,应尽快恢复至关闭,直到开始时再打开。
  5. 讲座开始时可开启录制。

4. 讲座中途

  1. 注意观察视频信号,根据需要及时调整摄像头角度。
  2. 注意线上聊天窗口内的反馈。

5. 讲座结束

解除各设备的连接。务必确保物归原处,不要错放。

没错,这并不是严格意义上的新作。但《故园》的确适合做成视觉小说!

视觉小说或者更复杂的文字游戏其实是我一直想尝试的体裁,无奈它必然是一个大工程。然而我突然想起已经有一个现成的篇幅较长的作品,不如转制试试看。果然,使用 Ren'Py 和容易找来的素材就轻松地做出了一个朴素的成品。稍作打磨,目前版本号 0.2,暂时锁定在测试版的名义。未来如果没有自制图画和音乐的能力恐怕很难再精进了。(文本其实也有特化的空间,暂时也先这样吧。)

可供下载体验 (Win/Linux/macOS):

https://eleutheria.lanzoui.com/b01cl0s7a
密码:1kf4

kowen.png

更新日志

  • 20210803 v0.3 优化图像风格。
  • 20210729 v0.2 测试版首发。

只是想做一个看起来很忧郁的小物件,就像《深圳I/O》一样忧郁,于是拓展到了电子工程师的领域(不是)。年前下单买了各种部件,年后才收到,一看发货地,“深圳”。并不是特别艰深的东西,所以本文不会给出全部代码细节,只求读者心领神会。

工程目标很简单,只要联网显示一些不特定的文字即可,所以一共只买了三样东西:ESP8266 + SSD1306 + DHT11。单纯为了额外的趣味性加了个 DHT11 来获取温度和湿度。

我实在不喜欢写 C 或 C艹,也不想学新的,所以往 ESP8266 (NodeMCU) 里面刷了 MicroPython 固件。实际使用 MicroPython 的时候发现还是和正常 Python3 不一样,需要小心功能阉割,尤其是一些库。

ESP8266 支持 WiFi 连接,可以在代码里写好,配置自动联网。但我不想把网络配置写死,所以用了 WiFiManager 来管理网络。如果当前无可用网络配置,它会自动开启热点,在 192.168.4.1 提供一个网页管理界面,我们可以增加新的网络配置。一旦连上网络,新增的配置会写入 flash 永久保存,今后无需手动操作即可连接。当然这个程序现在似乎没人维护了,有个 bug 需要特别注意一下。

至于 SSD1306,我最喜欢这种可爱的小小屏幕了,尤其喜欢把 128*64 的空间利用到极致,我要用最小的 8*8 点阵字体填满它!找这种字体费了些工夫,好在上古时代确实是有人用过的。但是 MicroPython 对 OLED 屏幕的驱动支持还是很弱,ESP8266 的空间和性能也不允许直接使用完整的中文字体。16*16 大小且限制在 GB2312 字符集的点阵字库网上似乎容易找到,但是我还要日文、扩展拉丁字母,不然根本配不上我!所以我最后选择了让云端性能更强的服务器 Python3 + CGI 一下,远程处理文字显示数据。只须提交文字,然后用 Pillow 模块生成图片返回 .pbm 文件即可。这种文件格式非常有趣,前两行是格式说明,可以用两次 .readline() 丢掉,之后 .read() 一次读完即可,后面的二进制数据直接就是逐行记录的点阵!转换成 bytearray 后直接又是 FrameBuffer 的数据格式,实在太便利了!(囧)当然由于 OLED 的本质,还需反色一下才能正确显示,这个也简单,逐字节 ^= 0b11111111 就可以了。

最后决定具体要显示什么。用了免费的新闻 API,和其他一些奇怪的东西,这里就不赘述了。

那么,最后效果是怎样的呢?请看下图:

ssd1306.jpg

真的忧郁。