用AHK脚本实现滴答清单每天任务自动推迟

技术路线:使用AHK脚本,通过图片搜索功能实现,使用了AHK的函数。

你是不是也有这么个习惯?不停地把新任务加到 todo list 中,只来得及完成紧急的,重要的任务,凡是不能半小时完成的,就越推越久直到清单变得特别长,长到甚至不想去看一眼。

我也经常这样。有不少同学问过我,为什么看起来我这么激情洋溢、乐观向上。因为我在朋友圈和博客里只展示激情洋溢、乐观向上的一面。推迟任务是常有的事,因为时间或者精力不够。任务推迟很久的,我就取消掉!说明即使我不完成天下也不会大乱。一般地,文章我不当时看,而是加到列表里。列里很长,闲了的时候就找出一篇来看。偶尔有还没来得及看的文章已经失去了链接、作者(被迫?)主动删除的,那就算了,也不特别地惋惜。每天,如果计划清单太长,看起来不可能完成那么多,我就删除最古老的那些,把计划看的文章移到爱好阅读或专业阅读列表里。诸如此类,眼不见心不烦。

每天,我还都会做一个操作——在“滴答清单”PC版里,昨天未完成的任务,已经被系统标注为过期的,我手动把它们标注为计划今天完成。这个动作已经持续了不止一年,这两天终于觉得DRY原则应该贯彻一下。AHK的语法忘得光光,边查边写,花1.5小时写了脚本,第二天又花半小时优化了一下代码,完成以后共72行。

过程如下。

1. 计划

干活之前,我先坐下来列个计划。

技术路线确定 用AHK的图片搜索功能。以前我用过这个技术,还写过一小段函数(有时好使,有时不)。滴答清单,操作时按的几个按钮,用AHK带的工具WindowSpy.ahk探测以后,都没有找到窗口句柄。没有稳定的句柄类,我了解的技术方案就只剩了图片搜索。这会导致限制屏幕的分辨率。不过,脚本只在我的机器上跑,基本不切换分辨率。对分辨率的限制可以忍受。

计划的功能,就是我平时的操作过程——由按列表排序改为按日期排序,然后点击 推迟,最后再改回按列表排序。操作涉及的按钮如下图所示。

列计划时预计得干一两个小时。如果实施中时间超过太多,那就得分割成几天完成了。

实际写代码计时,花了1.5小时,包括挣扎过想用函数,但是语法不熟悉而失败所花费的时间。

2. 运行的预置条件,检查 或 假设

程序/算法的特征之一是 可重现性。之所以有些程序不符合重现,十有八九是因为外部环境不同。所以,程序在运行之前,要保证环境(以及输入)是相同的。

我把AHK脚本中对预置条件的检查放在了初始化部分。

包括 分辨率,滴答清单进程的窗口激活/放在最上层、窗口最大化,在滴答清单中跳转到今日任务。

分辨率,粗糙地判断分辨率符合2560*1440,否则退出脚本。如果想增加通用性,并不需要修改这里,但是对每种分辨率都要单独截出所有按钮图标的图片。对分辨率的限制是由AHK搜索图片的机制决定的。

激活窗口并最大化,是为后面的鼠标操作创造条件。更严格地做法,应该在此之前禁用鼠标和键盘,避免用户误操作。由于我是唯一用户,主动运行而不是由时钟等外界因素触发,所以我可以做到不操作,不干扰脚本运行。更通用的做法,还可以包括把滴答清单的进程所对应的路径写成变量;更通用,还可以通过配置文件或GUI配置界面由用户修改。

在滴答清单中跳转到今日任务的方法,是发送快捷键。这不是滴答清单的默认配置,而是我的机器设置的。这里,假设AHK脚本运行在我的机器上。

以上,要么检测环境,要么粗暴地假设。粗暴的假设最省时间,检测、容错、适应各种环境越多越细致,工作量越大。所有这些检测都不是核心代码,而是核心代码工作的必要条件。有时,核心代码工作很好,有时,莫名其妙就崩了。并非核心代码有异,而是环境不同,或者如葛老师常说的,能运行的时候,还没出错,那不是技术,只是运气。工程和产品,运行别人的手里,不像原型只工作在受控的实验室环境下,需要巨大的工作量消耗在更多的非核心代码上。

往往,需要很多无聊换得些微快意,真是无耐。

3. 关键技术 语法

AHK的语法不熟悉,有点像我的母语basic,又不完全像。基本上每条语句都要查语法手册,包括内置函数调用、字符串、变量赋值这些基本操作,真是举步维艰。

用完就忘。

更糟糕地是,在网上查到的语法,即使是相当大的网站,仍然可能是错的。我猜测可能由于AHK的大小版本更迭,作者们对语法保持兼容性也不太执着吧。用bing搜索到的,比如(https://wyagd001.github.io/v2/docs/Functions.htm) 这种内容和目录看起来非常权威的,也是错的,或者与我的AHK版本不兼容。

更更糟糕的是,写代码语法出错时,AHK的编译器或解释器并不报错。它猜测我的意思就跑下去了,我也无从知道它到底怎么想的。反正结果出来了,不是我想要的。

最权威的,目前最好使的语法手册,是AHK自带的help文件名为AutoHotkey.chm。所以,如果你也写AHK脚本,别去搜索手册了,用本地的。有时候解决方案需要搜索网上的,也别全信,复制过来十有八九不能跑,版本不同,而且不告诉你。

更更更糟糕的是,我在这1.5小时代码中,一直想用函数。由于搜索图片若干次,操作类似,所以我想把这几步操作封装成函数。但是!不好使。我要调用,没有调用;我要定义,跑到了函数里面;没有报错,还是其他更明显的语法报错中给出一些AHK解释器执行的代码,我才知道它的理解和我的意图相差甚远。回忆起来,隐约有印象,每次我想用函数都不顺畅。极其偶尔成功过,我也并不知道为什么就成功了。

回顾本节标题,语法居然能成为关键技术,真是程序员之耻。

4. 关键技术 找图片

涉及到几张图片,我分别先用微信alt+a快捷键截图,保存成png无损图片,在AHK脚本中定义如下。

图片看起来如下。

之所以需要把变量提取出来,是因为类似 clock 这样的图标需要使用不止一次。根据DRY原则,根据经验,如果不抽象,那么在后续的修改中可能经常会需要修改不同的几个地方,稍一疏忽就漏掉一处——接着就是无穷无尽的不知道哪里出来的毛病。想起YP同学问过我,如果换成我,如果解决她遇到的问题。我当时说:由于咱俩的工作习惯不同,所以你遇到的问题,我不会遇到的。就像地上有个坑,你问我怎么跳出来。我不会跳进去的,离老远就看到,早早绕开。

搜索图片,在AHK中用法大致如下。

使用内置函数 ImageSearch,注意第一个逗号这种稀奇(我见识少)的语法。第1个参数X和第2个参数Y,用于输出,获取找到的图片的横纵坐标;X1,Y1,X2,Y2这4个参数是搜索的范围;最后一个参数%icon%中的百分号是必须的,一言难尽(我理解不深),是要搜索的图片,比如list.png。

但是!不好使呢。我在这句后面调用鼠标点击,鼠标不动。

此时,应该贯彻原则,不在项目代码中做技术原型实验。但是我自恃用过,觉得不会错,就在项目代码中做了实验。折腾了一圈,打印不出来图片的横纵坐标,空的;手动传参调用鼠标移动,好使。诸如此类。我终于想起来,在 ImageSearch 之后加了一条,

判断 ImageSearch 是否执行出错——包括有没有找到。没有,没找到图片。然而,我亲眼看到了图片在GUI界面上,又反复检查了截的图片文件 list.png。

查手册,AHK帮助说,用PrtSc截屏,粘贴到画笔中。

我突然想起来,这事儿,以前也发生过啊,不止一次。想起来当年关同学说:没有QQ,我怎么截屏啊。还得是基本操作。微信在截屏的过程中,压缩了吧,而AHK非常可能逐个像素判断的。也正因为这个,所以图片搜索依赖分辨率。如果支持多分辨率,就需要每个分辨率都截图(也包括滴答清单的不同皮肤,包括夜晚和白天不同),根据读到分辨率选择匹配的搜索图片。无他,遍历是最有效的方法。要么,就像我这次写的代码,粗暴地只针对我机器的分辨率。

5. 关键技术 函数

完成以上工作以后的代码相当丑陋,搜索6次按钮图标,每个点击一下,每段的代码看起来都是下面这样的。

因为我不会写函数,只能先这样对付着,6段非常相似的代码。能跑了。

第二天,我不甘心,又去搜索AHK的函数到底怎么写。搜索到的结果都表明,我写的对。但是运行起来的结果并不对。同时,我也不知道以前对的时候为什么就对了。错的时候倒是似乎好一点,虽然不知道为什么,反正大多数时候结果都是错的。

苍天不负苦心人,终于找到原因。从此以后不会再错了,也不会再对得不明不白了。

AHK 2.X版本手册中在程序员自定义函数中提到

https://www.autohotkey.com/docs/v2/Functions.htm,

“When a function is defined, its parameters are listed in parentheses next to its name (there must be no spaces between its name and the open-parenthesis)”

函数的名字 和 容纳函数参数列表的括号对儿 之间,不能有空格。

得这样写 foo(a,b)

不能写成 foo (a,b)

上述两写法的差别就只在 foo 的后面有没有空格。没有空格的才能正确运行。我不由得感叹:这什么烂语法,太不符合常规了。

蓦然一惊,这个,我是不是知道过,又忘了啊。

把6大段改成6次对同一函数的调用。

代码的逻辑清晰多了。运行前,
第1步.假设已按列表排序,所以点击列表图标;
第2步.改为按时间排序;
//以上是设置操作的环境
//以下是操作
第3步. AHK脚本点击延迟图标,滴答清单弹出对话框,
AHK脚本点击对话框中的延迟按钮;
//以上是操作

//以下是恢复操作的环境为原始状态
第4步.按列表排序

//以上是恢复操作的环境为原始状态

每两次鼠标点击之间 sleep 1秒钟,为了滴答清单有充分时间响应,并且我也能看到并享受自动操作的快乐。因为每两次操作都要sleep,所以这段代码也放到了ImageSearch_and_MouseClick函数之中。

6. 附录 代码

6.1 文件列表

ahk postpone.ahk

by_date.png

by_list.png

clock.png

list.png

postpone.png

postpone_button.png

6.2 代码

;;——————

; icons

list=list.png

clock=clock.png

by_date=by_date.png

by_list=by_list.png

postpone=postpone.png

postpone_button=postpone_button.png

; init————-

;; resolustion assumed

X1:=0

Y1:=0

X2:=2560

Y2:=1440

if (! (A_ScreenWidth == X2) || (ScreenHeight == Y2))

{

msgbox ,,, 需要显示分辨率为 2560*1440 才能正常工作。

exit

}

;; active window

Run, C:\Program Files (x86)\滴答清单\TickTick.exe

;; maximize window

Sleep 500

WinActivate, ahk_class HwndWrapper[TickTick.exe;;52329611-5419-4919-bf17-3295f24271e2]

WinMaximize , A

;; goto today————-

SendInput ^h

sleep 500

;— action seq—————

;;– in menu, find icon of list

;; *假设* default 排序图标是 list AKA “sorted by list”

ImageSearch_and_MouseClick(list)

;; sort “by date”

ImageSearch_and_MouseClick(by_date)

;; click “postpone”

if (ImageSearch_and_MouseClick(postpone) != 0)

{

ImageSearch_and_MouseClick(clock)

ImageSearch_and_MouseClick(by_list) ; 如果没有需要postpone的工作,此处恢复为 by_list

Exit

}

;; click “postpone_button”

ImageSearch_and_MouseClick(postpone_button)

;;– in menu, find icon of clock AKA “sorted by date”

ImageSearch_and_MouseClick(clock)

;; sort “by_list”

ImageSearch_and_MouseClick(by_list)

Exit

ImageSearch_and_MouseClick(icon){ ; https://www.autohotkey.com/docs/v2/Functions.htm, “When a function is defined, its parameters are listed in parentheses next to its name (there must be no spaces between its name and the open-parenthesis)”

X1:=0

Y1:=0

X2:=2560

Y2:=1440

ImageSearch, X, Y, X1, Y1, X2, Y2, %icon%

if( ErrorLevel!=0 ) {

msgbox ,,, %icon% not found

return 555

}

MouseClick,% left, X+10, Y+10

Sleep 1000

return 0

}

手推 太阳静止轨道的半径

前两天,和科幻作者和编辑亿万星辰大哥聊天的时候,聊到太阳风、CME、磁场偏转带电粒子、电磁屏蔽,海阔天空的。

这时他问了我一个非常具体的问题,地球的静止轨道是多少多少千米,太阳的静止轨道半径是多少?他说,在太阳的静止轨道上部署多颗卫星,就可以全天候监控太阳活动,也可能可以预警太阳剧烈活动大小年之类的。

太阳的静止轨道半径?我说,我得想一想……得算。

1.搜索不到,定义,手动推算

你也可能想到问AI。可得了吧,它的回答可能还不如我现编一个靠谱。

搜索引擎,让不少人错觉自己坐拥人类全部知识库。并不总行。一方面,并非所有的问题都能够用搜索引擎找到。比如你的左手至肘有多沉,你的大好头颅有多重,这个问题google并不知道答案。你有可能搜索到测量的途径,也许会指向196X年版的《十万个为什么》物理那册。但是具体操作还得你亲手实施。太阳的静止轨道半径,这种问题,有可能在某个天文数据完整的网站或者APP上有,但是我不知道具体的网址。

不能用搜索引擎的另一方面,你得知道这个概念的术语/名词是什么。有没有那种经历?年轻的时候觉得自己可牛了,发明了特别伟大的思想。没多久发现别人在几百年前就发明过了,你不知道的原因,就是课本里没写这个细节,或者你不知道人家的术语那么叫。

太阳的静止轨道半径,这东西真叫这个名字吗?我到现在也不知道。我所知道的是,
“太阳同步轨道”跟望文生义的含义不同。太阳同步轨道,所围绕的是地球,不是太阳。它叫这个名字,有另外的原因。

参见 https://zhuanlan.zhihu.com/p/631731847

所以,继续讨论之前,我们定义一下概念。

定义 付-杨-太阳静止轨道,在本文中简称为 太阳静止轨道,指人工或自然的天体a围绕太阳旋转所形成的轨道。该天体a具有这样的特性,在任意时刻,从它a到太阳的质心的连线与太阳表面的交点保持不变;也即,站在太阳表面,在任意时刻所看到的该天体a在天球中的位置不变。

站在太阳上,看到这个天体是不动的,静止的。因此,我们把这个天体的轨道称为太阳静止轨道。类似于在地球上看到的卫星是不动的,我们把这个卫星的轨道称为地球静止轨道。

正如下图中这个上帝之手里的橙色星球,无论如何旋转,从星球表面看筷子的顶端都是静止的。

亿万大哥要的是这个轨道的半径。这个值虽然(我)搜索不到,不过可以手动推算出个大概,精度不高,足以唬人。这是科幻和科普作者的基本功,难以保证所有需要的数据手头都有,必要的时候得能手推。

以下,就是手推、修正、交叉检验、再推论的过程。

2. 以“静止”作为条件,轨道角速度与太阳自转相同

从太阳静止轨道的定义可以推得它有什么特性呢?

太阳的旋转不像上图中由上帝之手控制,能各种方向乱转,而是(幸运地)只能自转。如果太阳有赤道,那么太阳的赤道在天球中保持相对稳定,会维持在赤道的平面中。在这个基础上,我们可以得出推论出,特性(1)太阳静止轨道与赤道面重合。具体推论过程,略。太阳静止轨道平面即不会与太阳的赤道平面形式平角(像南北回归线那样),也不会与太阳的赤道平面平行(像纬线那样)。

并且,特性(2)天体a在太阳静止轨道上绕太阳公转的周期,与太阳的自转周期相同。

这样,我们能得出结论,特性(3)太阳静止轨道的角速度与太阳自转的角速度相同。

由于天体a稳定在轨道上,没有动力主动变轨,与太阳系内其他行星的状态类似。特性(4)天体a的线速度应该与第二宇宙速度(天体在太阳系内作为行星,既不坠向太阳,也不会脱离太阳系)差不多。此时我犯了一个错误,后文会修正。

整理一下上述思路,根据特性(3)我们可以得到太阳静止轨道的角速度,根据特性(4)我们可以得到太阳静止轨道的线速度。

有个方程可以约束 线速度、角速度、半径 之间的关系。 即

v = r * w

其中 v是线速度,w(读作 omiga)是角速度,r是半径。

要求半径,所以 r = v/w.

搜索第二宇宙速度,得到 11.2km/s. 初中还是高中物理书里也有,容易验证。

搜索太阳自转角速度,得到可以追溯到伽利略,用自转解释太阳黑子的规则运动,那么可以根据太阳黑子的运动测量太阳自转。还有更多细节,太阳赤道和太阳两极的自转速度不同。我们取赤道附近,27天/圈。类似结果很多,仅举一例。

在excel中,我们用下述公式把 27天/圈 转换为 弧度/秒。

其中27天/圈,每天24小时,每小时3600秒,每圈2PI弧度。取倒数由周期得到角速度的频率。得2.69341E-06 rad/s.

把线速度11.2km/代入v,把角速度4,158,298.49 rad/s代入w,由公式r = v/w求得半径r为4,158,298.49km。

这数据对不对?交叉检验一下。同样的方法,换个参数,可以用于求地球同步轨道半径,这个数值可以搜索到。

求一下。用第一宇宙速度作为线速度,自转每圈24小时作为角速度(对应的周期),得到108,632.80km。

搜索一下,得到42,164km。类似结果很多,仅举一例。

求得108,632.80km,搜索到42,164km,差得有点远啊,2倍还多。

考虑了一下,差错的原因在于,静止轨道上的天体并非在地球表面,而第一宇宙速度、第二宇宙速度都假定在地面上。

所以,公式是对的,但是线速度不对。线速度应该是多少呢?

3. 由万有引力提供向心力

在静止轨道上,天体之所以没有遵循牛顿第一定律而扬长而去,是因为由万有引力提供了向心力。

万有引力与向心力刚好相等。我们能查到向心力的公式,也能查到万有引力公式。向心力公式,由圆周的位移公式两次求导得到向心加速度a,接下来用牛顿第二定律建立f和a之关的关系。我没推,在网上搜索的,看着差不多像,就用了。

列出来看看,都有哪些变量参与运算了。

向心力 f = m w v

万有引力 F = G m M /r^2

上述公式中,m表示天体a,M表示太阳;

w是天体a的角速度,v是天体a的线速度;

G是万有引力常数,r是太阳静止轨道的半径。

万有引力常数G可以查到,

太阳质量M可以查到。

线速度v和角速度w间还有上一节列出的 v = r * w 这样的关系,这样能得到向心力公式的另外两种形式 f=mw^2r;f=mv^2/r.在下面的推导中,我们用了f=mv^2/r这种形式,因为要求线速度。

万有引力F提供向心力f,所以令f = F.

得到 v = (GMw)^(1/3)

其中 万有引力常数G,太阳质量M可以搜索,角速度w刚才查过了。在Excel里算一下,得到25,333,521.75km。

这个结果对不对呢,我们又可以用地球静止轨道做交叉检验。地球的质量也可以搜索到。求得地球静止轨道为42,240.70km,与此前搜索到的42,164km相近。看来差不多。

中间还有个插曲。我以为差不多了的时候,发给亿万大哥。他问我,线速度的单位是千米还是米啊,另外这太阳静止轨道的半径真大啊。我先是非常肯定,然后陷入了自我怀疑,最后发现果然错了。量纲,是个多么重要的因素啊。

4. 结论,交叉检验,以及再推论

(1)结论

结论以及推算过程如下图所示。

先求线速度

然后求轨道半径

把数学/物理公式转换到Excel的公式不复杂,在本文中就不列出了。

(2)交叉检验

在上图中可以看到,使用地球静止轨道检验公式和参数和量纲是否正确。如果所求得的地球静止轨道与搜索到的相差较大(并且搜索的结果多且一致),那么公式或公式的参数有问题。如果所求得的地球静止轨道与搜索到的相同,那也不说明什么,并不能因此判定我就对了。这是证伪的意义所在。

(3)再推论

所以,再向外推一些结论,如果万一有与已知事实明显不符,或者令我惊讶,那么,可能推错了,还可能是个有趣科幻构思的出发点。

求得太阳静止轨道半径0.169AU(AU天文距离,地日之间的跨度)。

与水星轨道相比呢?

搜索到水量轨道半径

轨道长半径(a)= 0.387 AU,偏心率不太大,差不多是正圆。

参见

有哪位大哥知道八大行星椭圆轨道的参数吗? – 代代的回答 – 知乎

https://www.zhihu.com/question/587073670/answer/2917657810

太阳静止轨道半径0.169AU,在水星轨道半径0.387AU。太阳静止轨道在水星轨道半径差不多一半的地方,具体点是43.7%的位置。距离太阳相当近啊,高热、太阳风等的影响很大。卫星应该是什么样的呢,会有哪些技术,背阴面和向阳面温差有多大?这样的环境下,能不能载人,能不能常驻,会有什么故事呢?

会不会进入太阳表面了呢?与太阳半径相比。太阳半径,查一下,是695,500km, 0.00464913AU.

太阳静止轨道半径约为太阳半径的 0.169/0.00464913倍=36.35倍。看起来离太阳表面还远。

日珥能不能触及……呢?

 

浮光掠影——看世界科幻大会 2023 成都(3)

3. 科幻迷

世界科幻大会在开始前到结束后,直到现在仍然有很多争论。不仅这一件事情,案例文化大多数争论可能最后都容易简单粗暴地归结为“这到底是谁的XX”。就世界科幻大会而言,那就是,这到底是谁的盛会。

有人会说,这是中国的骄傲,万邦来朝。让外国人都见识一下中国的想像力,让他们都读中国故事,学习一下中国科幻。有人说,印度,印度也有科幻吗?韩国也有科幻,也太把自己当回事了吧,只谈自己的那点事,跟我们很像嘛,他们的问题我们早就遇到过了啊?

有人会说,这是四川省或者成都市或者郫都区的贡献。科幻大会现场的食物食供应怎么能只有肯德基、麦当劳、赛百味呢?听说,本来是有当地(四川省或者成都市或者郫都区,请饶恕我菜,不能区分)的特色食物,我记得不是豆瓣酱,而是某个辛辣或麻辣的食品,也许是涮串。听说的,这位愤愤不平地说,竟然就此失去了一次宣传本地特色食品的机会。也有人说,地方宣传不会有什么用的,当时他正对着我说的。我反对说,有效果,我以前连郫都的郫都不认识,不会念,特意查了字典。上次荥经我也查了字典。我只认识柳条沟、二道白河一类简单的汉字,上课提问学生的时候,不认识的字我就直接认怂。即便如此,还是有时自以为认识,读错了,被全班同学纠正。

有人会说,这是科幻作家(和科幻画家)的大会。十有八九不是。作家们的大会,是以作家们的交流为主,大家都讲,纷纷扰扰地吵,那才是作家的大会。我以前所见的,无论会上还是会下,大家都非常随便地就把别人的作品要过来看。也经常有作者把整本书都彼此发来发去。大家互相吹捧,也互相痛骂,也经常把痛骂很没*疯*度地再痛骂回去。这次会上,可能因为和大家混得还不熟,我没敢向任何人要他们的作品,担心他们以版本为由不屑地让心情去。我确实经常这样拒绝我的同事同学的要求——因为他们大抵只是表达一下吹捧的态度,并不真的想读,也不会有时间读的,毕竟我写的也不咋地。

说到这里,想起另一个问题。听到了一个普遍的报怨,“他们只知道三体,甚至连刘慈欣的名字都不知道,甚至没有读过大刘别的作品,就敢说自己是科幻迷。”我周围的同事同学,一般也就是这个水平。这是正常的。如果你见到个同事,他/她居然能列举另外三五位国内外都算上的科幻作家,如果还能说出几篇作品的名字或者故事大纲或者设定,那简直就是惊喜。

科幻是小众文化,是亚文化。这才是常态。就像冰桶让渐冻症这个名字被很多人知道,星星的孩子让很多人听说了自闭症,几部电影电视剧让大家自以为就精通抑郁症同性恋黑客程序员一样。大多是跟风,对这个事实有点心理准备,有利于大家的心理健康。

大家在群里抱怨“只听说三体的名字就妄称科幻迷”的时候,我曾经打趣问过,“说起来,白马到底是不是马呢?”三体迷是不是科幻迷,仅听说三体的可以可以自称三体迷。同情小动物的,可不可以……

这也是大会带给我的震撼之一。科幻迷真多啊,或者说,密度真高啊。平时真是难得一见。平时,同事同学一般问我,“你认识刘慈欣吗?”我说,“不仅如此,他还认识我。”以及其他值得吹嘘的内容。更早的时候,同事同学一般连刘慈欣的名字都不知道,那时大刘先生还没有写出三体,所以三体他们也没听说过;我就是最著名的,毕竟他们也不知道别人。现在情况变了,他们除了问我认识大刘先生与否,再就是问我,你啥时候写个三体。这问题我熟悉,领导同事以前常问我,你啥时候整个大项目。现在不问了,不是我整出来了,而是他们绝望了。所以,同事同学大体如此,这是常态。他们不精通科幻,所以我才可以吹,他们也不知道我有多菜,所以净瞎抱些没边没尚的希望,我也随口一答,说什么都行,反正问的时候他们经常喝得差不多了。

在大会上就不一样了,科幻迷真的多,随随便便就能遇到一位,而且专业。

刚到宾馆大厅,遇到了一位。他说:我知道你,你在2011年(他说的是个准确的年份,但是我没记住,为了故事流畅,估且这样编造)东北师范大学的科幻协会成立10周年上做过讲座。我说,对啊对啊。讲座确实有,哪一年,居然还是几周年,我完全没有印象了。我事后跟作家齐然老师说,这位真的是专业的,他居然知道我,连我这样非著名的他都能知道,而且能随口说出来。这位如此专业的,后来我才知道名字是河流。到雨果奖颁奖的时候,在大屏幕上出现的时候,虽然我脸盲,期刊的名字《零重力报》提醒我,就是他啊。

半夜烤串的时候,谢云宁老师喊我喝酒,跟我回顾了一大通我写过的东西。在那之前,我支楞着耳朵听他讲了不少人的不少作品,哪篇什么设定,故事走向,人物。没想到,连我的他也读过,并且记着,还有他认为哪里亮点。我后来跟二猫妈说,我肯定写不出他们那么好的作品。跟搞科研一样,人家记着谁什么时间在哪个路线上做出了什么贡献,有什么缺陷可以再发展。一共多少线线索多少种可能。那么多篇啊,他们简直全都读过,而且还在读。这得多大的热情,多少时间投入,多强的记忆和专业。一瞬间我想起当年看一众小白听大刘先生指点江山臧否人物,然后小白也指点江山臧否人物。都很牛啊。

上了摆渡大巴,到科幻馆前,半小时至四十分钟,我听科幻作家们天南海北地聊。绝大多数是我连听也没听过的,人物,作品,设定,故事。偶尔有听说过的。一次听我后排两位聊,他们提到,要是能写考古的科幻,那一定挺有意思。当时车马上要到站了,科幻馆的入口安检遥遥在望,此时发言不会被追问,可以少露怯。我说,考古科幻已经有了啊(多么常用的发言,大刘先生也说过)。我说了两篇,一篇是迟卉的,题目我忘了,文明的建筑遮天蔽日地向上发展,考古就从上面一层层走下去。我一瞬间想起很多,太平洋上的垃圾面积有多大,小七的V……还是跳过不说,时间不够;另一篇是《星》,阿瑟·克拉克的作品,我简单说了情节——写一个飞船去考古,从随船牧师的角度写的,他感慨为什么上帝要用超新星毁灭如此优秀的一个文明,只为了照亮伯利恒的天空。我话音刚落,走廊另一侧座位传来一个声音,伯利恒的星。我抬头一看,是说书人。

这感觉太好了,伯牙子期就是这感觉吧,你提个头,对方就知道,甚至比你知道得还要精细深刻。这种感觉在科幻大会上比比皆是,经常让我畏缩。要知道,平时跟同事同学我非常能吹,反正他们也不知道。在这里,我才是无知的那个。然而,这无知真令人享受。

所以,从这个角度看,会议的属性里,中国、四川、成都、郫都都并非重要的因素,科幻迷的大会,才是重要的吧。

科幻迷可真多啊。

第一天尚可,我听到了两三个沙龙。我眼花缭乱,苦于没有会议的日程表,不知道还有哪些好玩的沙龙会错过。吃饭的时候,遇到了一位不认识的老师,跟他聊起了这个困难。他说,有科幻迷整理了个非官方的日程表,说,就在有个群里,是群公告。他把我拉到一个500人的大群里,里面全是科幻迷。我震惊地看到,群友们说,他们正在赶来的路上,有的才出发,有的在机场,有的在火车站,有的说地铁通不到附近,有的正打车。有的说,明天到,有的说,后天到,有的说,某某天到已经请完假了。

群公告里没有日程。这位老师又给我发了个链接,说还在更新中。这位老师,后来我知道是零始真,他和前文提到的河流一起领了雨果奖。这个链接里是个特别长特别全的列表。时间、沙龙的名字、哪家组织的、有哪位作家参加、在哪个房间。

虽然有心理准备,我还是很震惊,这日程比科幻世界的编辑老师发给我的,多了太多了。想起我看过齐然老师的日程,还有七月提到的他的沙龙有被否的,我没有任何一个沙龙需要出席。这时才想到,我是混进来的,可能科幻世界搞错了,去年一年我并无一篇作品发表。之后几天,我一直战战兢兢,怕科幻世界突然醒过味来。就这么混过了整个大会,哈。

我问零始真老师,怎么我的日程和这份完整的差距这么大呢。他说,这里的沙龙有些不是科幻世界举办的,你是科幻世界邀请的,所以那些沙龙没在你的列表上吧。我又震惊,这大会不是科幻世界办的吗?!请尽情笑话我吧,其实我连谁邀请了我,也后来分析推断才搞清楚的。只要有人喊我来,别的我都没怎么关注。

我问科幻世界的编辑老师,其他的沙龙,没列在我的日程表里的,我可以参加吗?我这时才明白为什么之前在网上看到,有科幻迷提到买哪种票,又哪个沙龙哪个颁奖有没有抽到签。我根本没有想过这些,如果没资格去看,此时再想黄瓜菜已凉久矣。编辑老师说,随意参拜。噢野!

并不是随意参加的。可以随意去,然后人太多了。从第二天还是第三天开始,我再也没有进入过任何一个沙龙。最初是太阳厅,屋子太大,音响混淆严重根本听不清。我想,那就下一个特别感兴趣的。在下一个沙龙门口,志愿者对我说,里面满了。我说,我站着。他说,后面也没有站着的地方了。我步子大步幅快,此刻已经越过他离三五米远了。挤进去,硬听了一次。再下一个沙龙,可能我这样的听众他们见得多了,在门口拉了一道红色的带子。这带子有个名目,术语我忘了。高度一米左右,轻松就能跨过去,然后我顾虑到东北人在外的名声,望洋兴叹退却了。

这是我尝试的最后一个沙龙。我发了朋友圈,抢不上槽的。我本来纠结的是,这么多我想看的,有的时间相互冲突怎么办。我想多了,后面的大波科幻迷杀来了,一个沙龙也听不了啦。也许努努力可以有立锥之地,但是我想到科幻迷比我要难,比我要迷,还是别抢占资源了,做个人吧。

不仅沙龙的日程我不知道,后来又听说了一些我不知道的。原来凡是受邀嘉宾,都可以去什么什么地方,有个列表,去那些地方都是免费的。别的我都不记得了,只记得大熊猫,还有外地的考古遗迹之类的。我不会去的,我要听沙龙……不抢占资源了。我要抓紧机会向作家们学习,听沙龙,别的错过都容易补也不遗憾,只有这个机会难得。把这么多牛人请来让我有机会遇到,这太难了。

吃饭的时候遇到七月,他说,他一会儿要去什么地方,问我去不去。他说的是望丛祠,我当时不知道,没听清。我说,我要去听某沙龙。我下一句想说的是,我要听作家讲,要学习。我在幻想里对自己脑袋击了一掌,猪头。什么作家,七月不就是作家嘛。听什么沙龙,跟着走不就可以啦,近距离!于是我跟着七月等人 city walk,徒步三四个小时,感觉甚好。有个地方七月对着雕塑说,噢,我有一篇写过这个,写错了。原来写错了也不影响作品精彩,学到了。

我后来才知道的还有。吃饭的时候听到有个三体雕塑特别好,看到朋友圈还是群里有人发的。哈工大犁洲说,我去了,特别好,有照片给你看啊。我说,别,我要亲眼去看。你看,吃饭,才是会议的真正信息集散地,沙龙和颁奖会过于正式了,信息不会这么有价值的,信息密度也不会这么高,交互也不会如此迅捷。

那是最后一天,差一点就错过了。这是整个科幻大会最伟大的作品。我在雕塑群前坐了一两个小时,看人来人往。

在漫长的时间里,有的朋友后来和你渐行渐远,有了不同的经历;有的人后来不再写科幻,不再喜欢科幻,不再关心科幻;甚至有的作品后来也会淹没在尘埃里再没有人看到——但是科幻还在。也许有一天所有的科幻都成为了现实,无论高科技还是乌托邦,无论废土还是美丽新世界,但是人们对未来和远方的向往还在。那些石柱上的文字,就仍然持续向人们传达着曾经有过的伟大力量。

有人说,石柱上有错别字,和原著不同。我当时没有看,只顾着绕柱踽踽而行。后来也没有照片去找,也许有吧,如果一直不改,而是在旁边的信息牌上标注一下,那才带劲。

很多人都不知道这个地方,我在朋友圈里喊,如果你还在成都,离开之前一定要去一趟。我附了地图,如果绕湖到达。我去的时候问了好几个志愿者和保安,都语焉不详,还有的为我指了反方向。有一次被指错的时候,旁边有位通过的老师说,不对,应该这么这么走。他说他刚好要去,我跟着他就行。走了一会儿,他看到我的牌子,说,是你啊,我是萧星寒。我从来没和萧老师见过,亏他古道热肠,不然我不知道绕到什么时候。萧老师先我返回,他有要主持的沙龙,所以我返回的时候比来时困难得多。我估算距离差不多,没有原路返回,继续向前,准备绕湖一周。结果在看到会场就在眼前的地方,屡次被隔离带和保安拦住。我一次次猜测四川方言说的到底是什么,听从指挥按他们说的路线绕,告诉我能过的地方走到近前人家告诉我不能。回去又告诉我肯定就是那里。我又累又渴,终于在有一位说“原路返回”的时候没有忍住。我心想,你知道个屁啊,你知道我从哪里绕过来的,知道我走了多远就原路返回。我喊:我最后一次从你们说的地方走,如果那里——我指他们说的地方——过不去,我就回这里跳过去。你们准备追我吧。他们确实激发了我的本能反应,我在喊的时候发现,我正在评估他们几位的战斗力和奔跑的能力,扔掉哪些衣物,在哪里跃过栅栏,控制攻击到何种程度,要不要持械。

有个写着员工通道 的地方,并不是员工通道。不服从不听话,大胆走向去就对了。那里是可以通过,虽然写着除员工以外都不行。如果追究起来,可能就是一句轻飘的“印错了,对给你带来的麻烦深表歉意”。算了,我就是这样长大的。

后来听说了大会中的几次冲突。还有科幻迷提到的所购票与得到的服务不符,花了钱买线上直播却发现直播是免费的。也有没冲突的,例如大会最初,雨果奖奖杯被拒绝进入园区,因为它是尖的长的物体,后来不知道怎么解决了。肯定解决了,因为我们都看到了颁奖时有奖杯,应该不是在园区内铸造的。我听说这些的时候想起了自己在准备一跃而入时的冲动,觉得自己还是太年轻,少历练。

前辈老师告诉我,其他保安们也很不容易,也别让他们为难。很多年前我想过这个问题,我之所以和保安斤斤计较的原因,是我从来没有把自己当成比他们高的人,我认为自己是他们中的一员。我们是同一个群体的两个人,我没能接受他背叛自己的阶级成为别的什么。

群体,这个由大家虚构出来的术语,包含了非常丰富的含义。三体迷是不是科幻迷。中国、四川、郫都,是不是世界科幻的一部分。一部分,这几个字到底什么意思。

群体是割裂的,或者说是由一个个的个体组成的。有的科幻迷说,进来一大堆小孩子,他们看颁奖的时候都睡着了,不如把名额让出来给哪个科幻迷。另有的科幻迷说,没有小孩子哪里有科幻的未来,为什么小学生就不能来,不能因为这次科幻大会成为科幻迷,成为未来的大刘先生。有的科幻迷说,我指的是带着最高权限牌子(上面用数字标明有资格去哪个厅)的小孩,他还一个劲的从后面踢我的椅子。我想说,你怎么知道这位小朋友不刚好是发表了特别伟大作品的某位作家呢,你怎么知道他不是现场指挥呢。我去工厂的时候看到安全帽不同的颜色,师傅介绍说不同的颜色有不同的身份。他特意告诉我,这个颜色表明是领导,你千万别戴,因为如果一旦有事故,大家都会等你指挥。言下之意,你这个笨蛋啥也不懂会害死大家也害死自己的。谁能这么胆大而无情地把自己的孩子带个指挥的标志呢,那一定真的就是应该有高权限的人。虽然“仅供员工”的字可能印错了,指挥这种事是不会错的。汉王掠印,韩信不就只能听众吗。理当如此。至于踢椅子这种事,你瞎编的或者我记错的可能性更大。如果你意识到这是现场指挥,他踢你椅子,肯定是你有问题啊。而且,他居然没有坐到台上,这种与民同乐的风度难道不应该赞扬吗。退一万步,即使你瞎猜的都对了,一位指挥之一居然需要拿出自己的牌子才能把至友亲朋送进来,而并非一句话就解决了,这说明现场的保安能做到制度严谨、执行森严。

这位科幻迷和那位小朋友都不知道我的看法,因为我一般潜水不吱声。如果他们知道,可能会质问我,你什么立场,坐在哪个屁股上说话。我是学理工科的,所受的训练要求我 真假排在第一位,是非(善恶)要排在其次。至于我属于哪个团体,里外之类的,并不是学科训练的一部分,甚至要求在以上两点讨论时刻意避免立场。

其实我没有立场,立场对我太不重要了,简直不值得一提。我相当长时间不知道谁邀请了我(我当然知道是哪位编辑老师联系我,但是发出邀请的显然不是她本人,虽然增加了她非常多的工作负担),我相当长时间不知道谁是科幻大会的组织方,主办承办都是谁。这里有哪些利益纠结,甚至阿西莫夫是不是经常骚扰女性,我都不知道,毕竟读小说的时候我不怎么看作者履历,吃鸡蛋的时候也没深究这是哪只鸡的心血。我可以装模作样按电影里演的,双手合十,各路神仙,感谢你们赐予我食物。

说起所属团体,我是东北师范大学科幻协会的会员。当时我已经工作了不少年,在校园里正遇到各社团招新。那位招新的同学告诉我,工作了也可以加入;交了会费以后,就是永久的会员,没有期限。我交了会费,具体数额不记得了,10元,20元,或者30元。但是交了会费,永久会员,这事我不会记错,因为此后这些年我一直在提醒自己——我是东北师大科幻协会的会员呢。

会后,在河流老师的朋友圈里我看到他说,吉林省自2004年开始没有科幻协会。当然这也包括我加入的东北师大科幻协会,那么,是没了。河流老师想强调的重点是,吉林大学正在筹建科幻协会。我被震撼的是,最迟至2004年,我交过钱入过会的那个协会没了,它甚至没有通知我一声。我以为自己身在其中的团体,我以为交了钱可以永久置身于其中的团体,这个团体没了。团体从来没有背叛我,它只是没了。

幸好,科幻迷这个身份不必旁人认证,不必非得加入团体,没有资格审查,不受地域国别和观点的限制。我无知,只知道那么几篇,可能还有很多人看我不顺,但是我就是可以厚着脸皮说——我是科幻迷。

(此系列结束)

 

修跳跳灯

跳跳灯就是皮克斯动画片的片头,生命力充沛跳来跳去的那盏台灯。看过不少动画片,也看到过很多次这个家伙跳来蹦去,但是没有和现实世界结合起来。直到典少尉告诉我,“我跟你说老杨,这个东西可真是太好了。”

如下图所示,白色的就是了。

买了一个,果然好。调整位置和角度都灵活,且能稳定保持。特别是看着它就想起来生命活力,想起动画片里的温馨故事,心情大好。后来又买,一共有三个了。

时光飞逝,老的跳跳灯开始出毛病了。连接弹簧的两端,是螺丝的末端。可能出于成本考虑,螺丝的末端套了一段塑料管,弹簧就挂在这塑料件的上面。五六年过去了,塑料氧化,逐渐断裂了。这几根弹簧非常重要,对保持跳跳灯姿态既灵活又稳定不可或缺。

如下图左边所示,黑色塑料连接弹簧的位置,那个凹槽是最先断裂的部分,后来有的纵向裂开了。如何断裂不一而足,共同的特点是不能承受弹簧的拉力了。

我就换成了上图中右侧的白色塑料件。这个白管是粗的圆珠笔芯,内径刚刚好比螺丝细一点,可以用螺丝攻出螺纹来,稳定。上面的凹槽是我用刀削的,为了稳定挂住弹簧。

白色塑料件和黑色塑料件的里面是同一根螺杆,从左至右贯穿过台灯支撑杆。

又五六年过去了,黑色塑料件有四五个逐渐断裂,同样粗细的白色圆珠笔芯却找不到了。我只好切了手头上最粗的圆珠笔芯。如下图所示。

从弹簧向外的一段,用来挂弹簧。这段圆珠笔芯的缺点是,1.滑,弹簧在梁上面会滑动;2.挠度不够,弹簧滑到偏向外侧的时候,梁弯曲变形,末端没有阻挡,弹簧有时会脱落;3.这个物性称为什么?如果在上面切出凹槽,弹簧的强度下降严重,挂上弹簧以后会从凹槽处断裂。

坚持了一段时间,就用下图的方法。两边夹个铁夹子。暂时对付,然而相当不优雅。

考虑了几种方法。

在两端缠上橡皮筋,靠摩擦力较大保持住。塑料杆太细,不容易缠。

粘补黑色塑料件。最近学到的方法,还没有实践。用强力胶如502,掺进泡沫塑料或者棉纤维或者碱或者塑料碎末,凝固以后据说强度甚佳。塑形的方法可以用模具,模具用橡皮泥、陶泥,或者淀粉和水。如果精度要求高的话工艺相当麻烦;如何保证内径稳定且符合要求,我没有想到办法,把螺丝杆放在里面成型么,还能拆出来么;外表面怎么办,用砂纸?

Zhumao说:用筷子削一个呀。我猜强度不行,特别是两端要有凹槽,容纳弹簧,避免脱落。

后来想到,换个螺丝杆吧。换长一点的,把弹簧挂在金属螺丝杆上,两端用螺母阻拦。这个办法好。

去装修店,走了三五家,遍历了附近每一家。没有螺丝。

去锁店,想也许有吧。关门。

Zhumao和xl同学分别找了一下,从面板上拆之类的,螺母数量不够,各种缺点都不尽人意。

按zhumao启发,量了长度和粗细。淘宝。

直径3毫米多,后来证明3毫米有点细,不过没负面影响,可用。长度比原来的多加1厘米,左右各0.5厘米,用来拧螺丝。

下图,新螺丝和旧螺丝对比一下,有蝴蝶螺母的是新螺丝。这时才注意到,三盏台灯里最老的一盏的螺杆居然长度不同。也就是前几天,我才注意到,它的弹簧长度也不同,分成两种规格。后来的新台灯的弹簧长度就都是一样的。

效果非常好。

螺母有点松,不过如果不主动去拧应该不至少掉下来。如果以后发现有不听话的,用胶水粘一样,或者在螺母和螺杆之间夹一层薄纸什么的也差不多。还可以在螺杆的外面套一层圆珠笔芯,减少螺杆和台灯支撑杆上的孔洞的间隙,不过考虑圆珠笔芯更光滑对稳定性可能只有坏处没有好处,算了。

还有备用的螺丝,再有氧化断裂的,随时可以换。

这就修好了,继续保持活力,继续跳。

浮光掠影——看世界科幻大会 2023 成都(2)

2. 科普,科幻感,周边

在大会前和大会后,都有人问到同一个问题,“你参加科幻大会,在单位/公司请假容易吗,有没有遇到障碍?”向我提问的,有老学生在群里问,也有高校科幻的朋友在网上研讨的时候问。现实世界中,听到作者们互相提问不止一次。毕竟有些作者的笔名和本名不同,并且单位领导、上级同事、老师同学、老婆孩子可能都不知道他写作科幻,所以参加大会要编个理由。是不是像地下工作者?

我写作科幻是实名的。我的职业是高校教师,作为科技工作者,向公众做科普宣传是职责之一。不同于有些人误解的,教师就是(暗示 仅、只)应该教好学生,教育部不是这么说的。高校教师的责任包括 科研、教学、社会服务,总共三项,不是一项。如果没有科研经验,无论成功的和失败的,不适宜作为高校教师,更适合作为高中、初中、小学教师,传授传统和相当确定性的知识。高校的课程内容需要包括教师对前沿的理解和科研经验,无论正确错误、成功失败,都比没有理解和经验要好。高校教学过程不仅包括传授,对探索和探讨的比例、对错误的容忍度比基础教育要高很多。第三项,社会服务包括横向课题为企业服务,也包括技术培训和咨询。也包括,科学普及宣传。科幻,是科普中非常重要的部分。参加科幻大会,向来自五湖四海各行各业的牛作家们学习请教,交流信息和痛苦,正是科幻大会的动机,也是我参加的动机和职业责任。职业中包括自己喜欢的事,挺幸运的。

科普,我一直在尝试。虽然没有能力写好硬科幻,然而心向往之。当年笔会时,大刘先生和我是唯二认为 科幻指导不了科学、并且科学的想像力比科幻高多了 的人,被戏称为硬科幻原教旨主义者。我还坚定地认为,科幻承担着科学普及的责任。这个看法大家读到的科学的春天之后的主流观点有所不同,科幻有责任科普,并不意味着科幻只能科普。我喜欢吃肉,但是我不反对别人吃蔬菜,也不反对别人吃素,更不会说吃这么多蔬菜不恶心吗,也不会对这一口没吃肉的同学作负面评价。

科普很好,硬科幻很棒,即使软科幻也普及了科学而并非巫术和原始宗教的背景。科幻的周边也很有意思。美国的60年代黄金时代所孕育的科学家和工程师,还有技术人员,有几个当年是看懂了科学原理才喜欢科学的呢。我们喜欢好吃的,最初的动力难道是因为营养吗。

我没有奢望在科幻的大会上看到科普,虽然实际上比预期的还要隆重很多。

我参加过劳动部组织的装机器比赛,到达北京以后,距离比赛时间还远,就把大家手机都收走了。我参加过一次国际的化学大会,换会场的时候长春市主干路暂时封闭请来自各国的科学家们从容穿过。但是都没有此次科幻大会震撼。

一下飞机,就看到很多巨大的牌子,有在路灯柱子上的,有在地面一人高半人高的,各种各样,可谓张灯结彩。有志愿者接机陪伴引导,沿途又遇到很多志愿者站岗,有专门的大巴等候着,大巴前是熬了很久的编辑们。合影,聊两句,上车。一路上很多路灯柱子上挂着黄、紫、蓝作为主色的世界科幻大会标识。这个东西学名叫什么什么,一拉宝,条幅,还是旗帜?宾馆门前也有一人高半人高的标识,大厅里有一柜子两柜子的纪念品。

会议期间,坐上通勤大巴半个多小时四十分钟左右到达终点。到达终点前就能看到科幻馆主建筑,科幻感十足。整个建筑都是银色的,没有一条长直平的立面,全是曲线,弯转迂回,流线生辉。在评论中我见到了各种比喻,只记住了像外星飞船,其余的都忘记了,印象里大家都觉得像自己没见过的伟大的奇迹。后来发的纪念品里有一个徽章,就是科幻馆造型,金属的,沉甸甸的,质感厚重,我非常喜欢。

下车旁边就是入口,有安检。在以后的几天里通过大家聊天发现,安检的规则一直在调整。调整的规则不是函数单调的,也不是震荡的,没有发现规律。有时候安检人工凝视我们的胸卡,上面写着嘉宾证和姓名。姓名,有的通知必须与身份证一致,有的使用了笔名,有的笔名是英文被拒绝了。我们都采集了照片,有严格的要求,多少像素乘多少像素,眼镜不得有反光,脸不能太大不能太小,要占特定比例。我当时感慨科幻圈的信息素养真高啊,后来知道对付随便上传一个也行,知道的时候我对自己认真花时间做照片惋惜了一秒钟,由于为不值得的事情惋惜,我又惋惜了半秒,由于为不值的事情惋惜导致了惋惜,我又惋惜了1/4秒……不用怀疑,函数是收敛的,所以后来惋惜停止了。有的时候,要求把脸对着摄像头,要人脸识别,就比我们先前上传的照片比对。手拿着嘉宾证,扫描,脖子举着脸,扫描。忘了嘉宾证的绳子还拴着脖子,来回调整,有一瞬间突然就想到了林冲和武松。奇怪,和他们有什么共同点?

出入这些次以后,我总结的规律是,每次都看嘉宾证,每次都有扫描金属的设备在身上虚拍,以及“转过去”或者“请转身”。其余的规律不是很强。有时候要求身份证,有时候不要求。有时候要求扫脸,有时候不要求。有时候翻包,有时候不。有时候不允许带水,考虑到有些工作人员在里面工作就是一整天超过10个小时,午饭也没有,相当考验人的意志和肉体呢。后来又听说可以带水,玻璃瓶不行。大家都很费解,但是也就从了。唯我不屈不挠地思考,有天吃饭时突然悟了,一拍大腿啊一声,给周围的作家们讲原理——玻璃瓶可以打碎了作为凶器啊!他们都夸我,你可真有想像力。不不,我谦虚地说,和制定规则的人相比,我差得远呢。

建筑给我带来的强烈科幻感冲突,在入品处降低了一些。外国人也从同一个入口进,也许他们会觉得科幻一些,如果他们见识少的话。我猜他们听不出来“转过去”或者“请转身”的区别。不过我错了,不少老外的中文相当好,听说都不错,令我震惊。应该能分清有没有“请”吧。

入口并不是真正的入口,场地远比我想像得要大。从入口开始向外2.5公里左右都是交通管制区,人烟稀少,非常安全。我只见到了大巴和警车,见到了志愿者在垃圾筒上吃饭,见到行色匆匆的工作人员。

我也有幸成为管制区中的风景之一。当时正跟亿万大哥往会场里走,感慨这路还挺长,科幻风格强烈,连垃圾筒、变电站的涂装都是星辰大海。走了一半,他的同事心丁女士(可能是“年轻人网友!”的命名者)把电话打给了我们。所有人的嘉宾证都在亿万大哥的身上,得返到入口,跟入口2.5公里的真正入口,在管制区的边界,把嘉宾证送回去。之所以嘉宾证都在一个人身上,是因为原计划大家一起进入。之所以大家没有一起进入,是因为有人没带身份证。是的,在这个真正入口,规则是不同的,要求身份证和嘉宾证同时并且匹配。还没等取到身份证,他们又发现,自己的嘉宾证已经进入管制区了。所以,我们又赶回去。路上有科幻色彩浓郁的公交站,没有公交车;有科幻色彩浓郁的大厦,大厦下面没有人类;有我和亿万大哥来回奔波,没有观众。空旷死寂,在地球上的闹市区里我感觉到了宇宙深空。

在科幻馆里,一进门是个那~么~大~的机器狗。四足踏麦克纳姆轮,装甲细节丰富。外面全白,汉白玉雕塑感。后来有人告诉我,你不知道啊,那个表面是用来投影的,每天什么时间来着?我说,我不道啊,会议日程上没有啊。我懂了,要去发现,主动发现。我后来看到了投影,银灰、黄蓝,诸多涂装在巨大的音乐轰呜里变换,非常壮观。

光线是从周围的柱子里投出来的,那些柱子上的射灯投影仪,我本以为是摄像头。周围还有些弧面的斜坡,我的第一反应就是这太适合滑板、小轮车冲上去了,如果没有这些载具,徒步冲上去一定也不错。我不敢,因为我以为射灯是摄像头。后来终于看到一个小孩冲上去了,咚咚咚跑,我心里为他加油。我因为一个保安大声喊那孩子才转头看到的,谢谢这位保安大哥。后来那个斜坡的下面站了一排志愿者,一直驻立着。我想他们也想冲上斜坡吧。

那个巨大的机器狗是有名字的,它就是流浪地球里那只。电影里那里非常小,半米左右,方方正正的,在船上不敢下水,被教训“你是一只军犬啊,笨笨。”然后扑通一声,不知道是推下去的,还是跳下去的。但是我没能把这么巨大,直抵三层天花板的家伙和电影里的形像结合起来。所以科幻世界的编辑老师约我在大厅见面,我说“大厅的哪里,那么大”,她说“笨笨,就在笨笨的下面”,我问“什么是笨笨?”啊,就是它啊。

笨笨的周围也充满了科幻色彩。每个屋子,无论用于沙龙的小房间,还是大报告厅,它们的名字就都够科幻。名字叫 地球、天王星、海王星、土星、木星,还有雨果。如果有室内导航的话,那么科技感会更足一些,不然就仅仅科幻了。我在室内移动的过程中,每换一次房间,都必须依靠问志愿者三到五次,我的定向能力不足以依靠地上的标志寻迹。

电梯里是紫蓝的灯,还有无穷反射的镜子。大厅旁边的走廊里也是深蓝浅紫。确实挺科幻的,跟科幻电影里演的一样,虽然人们不会喜欢在其中生活和工作的。人们也不会喜欢在末世废土里工作生活,幸好这次的科幻感没有采用这个系列。

笨笨所在的大厅有两层楼高,旁边墙上有个两层楼高的雨果奖奖杯的造型,为避免有人不认识(比如我),下面用英文写着 雨果奖 几个大字母,大家纷纷上前合影。我也想合影来着,还设想,要不要错位拍摄好像自己拿了雨果奖一样。

笨笨的周围还有个地方,似乎牌子上写着名字叫做 网红打卡地 之类的。看起来是在虚空里有影像悬浮着,有大熊猫,还有女主持人在动作,有没有声音忘了。我不太了解设置这个装置的原因,印象里牌子上还写着高科技之类的。但是,技术人员或者爱好科技的人,从科普的角度上看,一定不会震惊这科技如此之高,而是会第一时间想,这怎么做出来的。显然,是视觉暂停,有一堆LED在快速转动,在特定相位显示预定的内容。接着会想起来在优酷和B站有制作教程,然后就没有悬念了。如果有创新点或者技术难点的话,可能图像或视频可以定制,或者挥鞭转速更快一些。

不少人拍照,不会拍到好效果的。因为LED转动采样叠加相机采样,留下的照片会是相当残缺不全的。除非有较长时间曝光,并且三角架稳定,但是这对多数拍照者来说过于复杂。

后来因为沙龙排不上队抢不上槽,我又要找河流提到的搬书的地方,迷了路,围到了藏在墙里的科幻周边摊位,很多摊位。我看到了键盘移山轴,跟电影里的一样。非常想要一个,但是很贵。在科幻之夜有个抽奖,听说是移山轴以后我激动得哇哇大叫,抽中我多好啊,万一呢。听说抽中的是个老外,我痛恨得哇哇叫。他知道什么是移山轴,他知道这意味着什么,他不如把移山轴卖给我。但是如果我买得贵了,我不甘心,如果买得便宜了,老外会觉得中国人欺负他占他便宜。我纠结啊。后来安慰自己,用起来一定不太舒服,键盘必须得是生产工具呢,哇哇。

我在周边摊上还看到了自然选择号太空船和无畏级战舰。巨大!细节丰富!会动会闪。我没有那么大的屋里摆它们,但是仅仅靠近看看,看一个小男孩装作若无其事毫不激动得走开,我就已经很满足了。

还有卖什么茶的,所说也是高科技。

还有模拟纳米装配,玩家戴手套伸进装置,探头从镜头看,把一些小零件(怀疑有磁性,如果没有,应该加上)装配成指定结构。这是模仿纳米装配中粗手指粘满黄甘油装配袖珍手表的齿轮,重点突出,形象生动。

还有一个说是展示了反物质,一个箱子四面开口,一个球悬浮在空中,旁边的显示展上曲线闪动。我伸走一推,球叭一声掉了。工作人员双手把它摆正,试了几次,松手,球悬浮住了。我抻头看,箱子里六七个线圈。这是磁悬浮吧,为什么说是反物质呢,还解说科学证明了什么什么。这明明是磁悬浮啊。

反物质与纳米装配的区别在于,玩家明确地知道纳米装配是模拟,是假的,而反物质告诉你这是真的,然而并不是真的。视觉暂留装置与反物质相似,它给了观者一个印象,想强调这是真的,是高科技。并不是,那只是具有科技感未来感的演示,展示的是“感”。

移山轴是假的,自然选择号是假的,无畏级战舰是假的。我们都知道这一点,制作者也明显这一点,所以没有人感觉到受骗。我们所要的不过是情感强化、情感认同,以及宣泄。如果你指着反物质说这就是科学,指着视觉暂留说这就是先进,指着场馆外面的管制区说,这就是未来,那是什么感觉?

我们当然知道光剑是假的。所以500人大群里有人发光剑照片,当我说“管制刀具怎么进去的”,就会有人说“那不过是发光的管子”。我说“那是光剑是光剑”,大家可能也只是在屏幕后面笑笑,笑我能逗,或者笑我不会逗,但是不是笑我无知。如果我严肃地论证那真的是光剑,有人把塑料拆出来给我看,我再找他家长呢。

光剑是假的,笨笨是假的,购物机器人是真的。第一天参加完沙龙,我意识到返回宾馆吃饭来不及。往返的每个单程需要半小时以上,车隔我不确定,也许十分钟,再加上等开饭的时间和吃饭的时间,要么弃了沙龙,要么误了回来以后的(似乎是)银河奖颁奖观礼。所以我决定不回去,但是必须得吃点什么,室内热,为了应对室外穿得不少,出汗;血糖急剧下降,我可能会像个不会从万能口袋里掏出食物的原始人一样晕倒在未来。

不知道有多少参会人员,有两部购物机器人。我知道这个数量时非常震惊,心想,你们真优雅啊。后来才知道,还有麦当劳、肯德基、赛百味。可惜当时我还不知道,虽然知道也没用,因为再后来我又知道排队的人非常多。原来,你们也和我一样庸俗得需要吃喝。

我找到购物机器人,选了含糖量最高的,是饮料。扫码付款,感谢科技,感谢在如此科幻的地方有如此落地的科技。机器人工作了半天,饮料还没出来。一位志愿者注意到我的窘境,告诉我,“等一下。”我问,“从哪里出来?”志愿者一指,我确认了一下,“这里?”当我的手指轻轻落在那个小门上,我发誓是轻轻的,不会按死一只苍蝇那么小的力气。当我的手指轻触,机器人屏幕上显示,机械故障。志愿者说,“会给你退钱的。”

我当时非常没有修养地在心里辱骂了机器人的祖先,我要的不是退钱,是你好使,是给我糖分。过了一会儿,真的退钱了。我举着手机望着这满目高科技的天堂,欲哭无泪,我饿。

幸运的是,机器人有两台,另一台工作正常,虽然没有高糖饮料,也许因为不健康,但是它有薯片。我抓着这救命的稻草,每五片薯片,喝一口水。我走来走去,因为一共没几个的座位早已座无虚席。能被流浪汉忍受的地方,比如笨笨旁边的射灯下面的空槽里也坐了人。我走来走去,每五片薯片,喝一口水。我听到似乎有人在抱怨刚刚卖给我薯片的机器,不知道它是不是也坏了。至少我有薯片了,我咽下一口,笨笨在上。每五片薯片,喝一口水。

另一次在日本作家的沙龙里,有同声传译。戴在单耳上,有翻译人员同步翻译。这几位翻译真是相当专业,在作家回答读者问的时候,没有底稿依据,仍然流畅迅速。一位家长问她的孩子,”你知道同声传译么”。孩子说,”知道,流浪地球里有”。

忍住不扭头去看那个孩子稚气的脸,我不希望我们相互同情。他还不知道以后会看到真实的世界是残酷的,跟电影里一样残酷,但是与电影里残酷得又略有不同。不知道他是否清楚,这时的同声传译靠的是人类,与流浪地球里是不同的。这个世界构造出五彩斑斓科幻感十足的场景,越做越大,越做越逼真,然而背后有几千几万志愿者扮成人列计算机。你,就是计算机里的部件,看不到全局。你能看到的,是一尘不染的大街,是银色的五彩的闪亮的城市,是未来感,是科技感,是无限美丽的希望。

 

浮光掠影——看世界科幻大会 2023 成都(1)

0. 引子

2023秋,有幸参加了世界科幻大会,看到听到感受到异彩纷呈或者纷繁芜杂的事件和景像。如果不趁着热乎赶紧记下来,可能很快就忘光了,只剩下了斑驳的印象。

我所见的,都相当不深入,肤浅地掠过,或者从远方观望,所以称为浮光掠影才算合适——景色斑斓,但是我的所见寥寥。在会议期间,我一直跟着齐然老师,他和编辑聚,我就蹭饭蹭听讲座。齐然老师常向我推荐作品,或者讨论某位作品某篇大作,我刚开始赧然,后来索性厚了脸皮,直截了当地说,“不仅这一篇,你所说的绝大多数作家和作品,我都没读过。”20多年前参加科幻笔会的时候,就是这样的,别人提到博尔赫斯,还有谁来着,作品参考了一堆连名字都没听说过的著作和流派,我当时都是第一次听说。当时我一副“你说的是啥玩意”的表情,对方可能也是“这家伙是什么玩意”的心理。当年我们互相都没有细问对方,所以只是猜测,不得而知。齐然老师很淡然,我不知道的他也不惊讶嘲笑,就给我讲一遍,我收获很多,包括内心的平静。

因为所知太少,所见太窄,所想太浅,所以,我的记录连一家之言都算不上,就是浮光掠影吧。精彩的巨大空间从我身边飞掠而过,我瞥到一瞬,给你讲一下我心跳的感觉,就那一瞬。

1. 见网友

这次见到了神往已久的不少大家,有的得以近观,有的远远瞭望到大屏幕上的影子了。他们平时都是网上和纸上的名字,他们出现在我的视野中的主要是所构造的世界和作品里的角色,这次见到的是他们本人。

又见到了海哥。

海哥是吉林艺术学院的老师,画家,获银河奖美术方面的奖项若干次,少年版有时一整年还是将近一整年的封面都是他画的。吉林艺术学院的老师和学生曾经在中国好声音这个电视节目中惊艳出场过,从而使全国人民得以知晓这所学校的名字。在我看来,这是东北工业曾经高度发达所残留的遗迹尚未完全冷却的余温,是辉煌工业的一部分。海哥的杰作也在其中。

出发前很久,海哥就联系我,买没买机票呢,买哪天的,回程呢……等等。后来海哥看我实在糊涂得紧,就全都包办替代了。一路上,我跟着海哥混,没有跟丢,后来得以平安归来。在飞机上无聊,我又掏出笔记本和笔,开始画画。这是我很久以来的习惯,喜欢画,觉得有趣,不然困倦。我突然哈哈大笑,说我想起了临行前和二猫妈说的,这次画画与往次不同,因为有位画家坐我旁边。我说,你不许笑话我啊。我一共画了两幅,海哥一一指点。

他说:你喜欢画就好,这不是职业,是爱好,所以可以一直画。所欠缺的,就是技巧。

翻译过来,差不多就是 人菜瘾大。甚善。

又见到了亿万星辰大哥。

第一天会议,我正在沙龙现场沉迷着。那场是骑桶人主持的。他说,之前也没有告诉他他就是主持人,只是说好了有个沙龙。来了以后现场的保安(估计我记错了,不是这个词?)问谁是主持人,对了一下单子:好,就是你。你现在要讲什么什么开场白之类的。他问,我这么快的语速,在场的外国朋友,对不起啊,不知道为什么没有安排上同声传译,你们听起来是不是有困难啊。我禁不住哈哈大笑,因为我作为一个中国人听那么快的语速都颇感困难,我笑他相当有自觉。笑得声音太大了,大家都回头看我。靠边坐的老外哥们说,没问题。后来有听众提问,问,桶叔。我刚开始一楞,桶叔,桶叔是谁。随即想到,就是骑桶人,他已经是桶叔了。提问的听众不知道是否了解,骑桶人的桶就是马桶的桶,意思就是骑在马桶上的人。应该不知道吧,提问得语气那么正经。

我正沙龙里沉迷着,并且拍照和实时转播给后方的朋友,其中就风大先生。风大先生告诉了亿万星辰大哥。消息估计有几个往返,亿万大哥和我分别说,想不到你也在啊,太好了。他说,中午去吃饭,一定要去,不能推辞。怎么会推辞!

中午去吃饭,有个群,叫做“年轻人见网友!”,我扫了几眼群友们,嗯,大多认识,20年前大家正是20多岁的年轻人。当时,还没有特别的感觉。几经辗转,要从会场出来,看标识,迷路,再看标识,走到路口,嗯,这里不是出口,出口在——那边——走到马路上,封城一样,2公里范围内没有车辆,人烟稀少。离开封控区,得以打车前往。

在物理世界见到网友,感觉格外不同。

说书人!我们的书什么时候能出呢?他说,明年,明年就能出了。

凌晨!凌晨老师,我一直仰慕您,但是在各个群里都由于您设置了权限加不上好友,能加个微信吗?凌晨老师说,你写的是不是某某作品。不,不是。我心想,您没听说过我,没读过我写的,太正常了;并且,我无知得很,您说的作品我也不知道是什么,惭愧得很。

七月!他总是抿着嘴很腼腆地浅笑,酒窝很深,眼睛很亮,20多年没有什么变化。这几天另外还有一次机会喝酒,去敬酒。我说,七月老师。他说,滚。我说,小七,他什么也没说,举起了一杯。他说本来有几个沙龙,后来有他的几个都没有批。我说,没批是因为你啊?你都说过些什么?他说,不是因为他。我说,反正你的几个都没批,你就想吧。他给我介绍作家,那位是苏老师,获得过少年凡尔纳,在哪哪是技术大牛。我说,少年凡尔纳,就是你没得着的那个吗?七月老师少年天才,高中就投了他的佳作,但是发表的时候他已经考上了大学,痛失少年凡尔纳。可惜也可乐。看,相熟要趁早,敬酒趁年轻,索签名得趁大部队还没有一拥而上。

罗隆翔!他看着我的眼神特别深沉,杨贵福,二十多年啦。我担心他会哭出来。我想说,我知道你有不少优秀作品,我也还在写啊。

最特别的是迟卉。

在群里有她,但是直到菜过五味,我也没有见到她来。后来亿万大哥开始挨个介绍大家,担心时间太久,大家互相忘了吧。介绍了牙晓,蹭蹭,都是太空疯人院论坛里的老人儿。为了什么后来大家都不见了呢,是各为理想渐行渐远吗。后来知道了一个重要的原因,网友中一位半抱怨半开玩笑,于我如晴天惊雷。我视为平常从未多想,然而却是原因。因为我永不再使用QQ,那是从2005年开始吧,从此和大家失去了联系。我知道封号的感觉,就是整个世界离你而去。介绍了拉拉,或者是他的双胞胎兄弟碎石?大家也问,你是哪一个啊,是不是太忙派了另一个来。他说,是啊是啊,我就是另一个,我的哥哥(还是弟弟)经常提起你们。介绍了凌晨老师,大家颇有点 凌晨老师还用你介绍嘛 的不屑。

后来介绍到了一位女士,亿万大哥说,这是迟卉。我没忍住 啊! 了一声。是你啊,必须得握握手。我啊了好几声,感慨而没有具体的言语。我没认出来迟卉,虽然这几年在网上也见过她的照片。然而我完全没有想到那就是她,刚刚见面大家互相笑笑对望一下,我误以为她是另一位作家顾老师呢。

二十多年前的老朋友,突然见面,刺激太大了。想过去,想未来,想到很多人,一幕幕都叠在一起洇浸在一起拆揭不开。这种感觉在突然看到本以为没来的迟卉就坐在我旁边的时候集中爆发,我差点一下子就哭了出来。只好不停地说 啊啊,假装成一个成熟的成年人在感慨人生。

介绍到我了,他们叫“贵妃姐姐,好久不见”。我说,好久不见。谁问的来着,你居然允许他们这么叫。我说,不然呢?毕竟,这都已经是二十多年前就已经发生过了的事情啊。

大河在窗外滚滚而过,白浪带我们回忆听江浦和康定城。唧唧复喳喳,一别经年,又怎么能是一个中午这么短的时间就能叙罢。要去看另外的沙龙,大家纷纷打车。等车的时候,我对亿万大哥说,有两位好朋友,你见过的,他和他都在疫情期间去世了。他啊了一声,又确认了一遍。我简单回顾了情况,我们就望着天。一位译者女士,她说,这太压抑了,我有个好东西给你们看,打开长条纸盒子。我一看,说,这是不是那个什么骨,那个什么,就是它吗?她说,是啊,就是接骨木,我在英国什么什么地方特意买的。有谁问了以后,小心翼翼地拿过去,举起来喊,变成猪!她说,你拿的不对,因为谁谁是反面角色,所以他一直都是倒着拿的。年轻人,善意收到了。

后来还见到了很多大家。有第一次见的朋克风格马老师,加拿大的孔老师,又见到晴姨和任青老师,他们热情地为我引见其他大家牛人,忠厚长者。

等电梯的时候见到了夏笳老师,立习习老师。都表达了景仰。

科幻之夜见到了姚老师,冲上去打了个招呼,没敢再多打扰。

见到了刘维佳。特意跑去他的沙龙,从后面慢慢挪到前排。结束的时候,我上前说,我是杨贵福啊!他说,果然啊,看着像,你QQ也不用了,加个微信。

远远地看到了刘慈欣,他在大屏幕上,看不清楚真人,超出我的视力能力了。靠前也超出我的能力了,传说被层层保护起来,拿书去签名的作家被保安把书扔了出来,凑前去打招呼的作者被保安把人推了出来。传说。我想写邮件发消息,怀疑会淹没在无数喧嚣里。无论是淹没了还是过滤到垃圾箱里了,都会有损我曾经认识大刘先生(他也认识我)的自豪,再动辄拿出来吹牛就底气不足了。

坐车的时候见到了程婧波老师。在科幻之夜,见到了大角。我没有看到大角,齐然老师告诉我,你快看。消息还没过脑袋,我就冲过去打招呼。仍然是初遇偶像时的感觉,当时我内心颤抖着给他复述过他的小说里的情景,主角面对蛟把剑扛在肩上立住,那是步兵削向马腿的姿态,要么削断马腿,要么被踏成肉泥。而我,这么喜欢那个勇敢主角的胆小鬼,三分钟一过,无所措手足。合了影,回来后巴巴拿出来给二猫妈看,照片上我瑟缩着,大角还真是给我这样的压迫感。跟程婧波老师一样,你们板着面孔,我连签名都不敢提出啊。

待续

4行代码播放当前目录下的所有mp3-乱序,技术路线摸索的过程

0. 为什么写这一篇

上一篇 一行代码播放当前目录下的所有mp3 https://zhuanlan.zhihu.com/p/666243724 有个缺陷,mp3未排序。播放如果总是同一次序,那么听到的就总是那么几首曲子,后面200多首没机会听到,让我想起当年背单词多少次止于abandon。

不可忍,所以实现了一个乱序播放的版本。

读我博客或者技术讨论的时候,有的同学提到过,你能做出来是因为你已经了解那些知识,而且记住了。不总是这样,我经常想不起来具体的技术细节,需要搜索。这篇以乱序播放为例,回顾我实现的过程——在知识点记不清的时候。

以下是实现的过程,总计半小时左右。

1. bat 批处理

上一篇是用bat实现的,核心技术包括 遍历目录、调用ffmpeg、播放完每首歌曲后退出到bat再进入循环。批处理是windows原生的,如果不需要引入任何运行环境,那最好不过。所以这一次也想继续用bat。

我需要哪些技术呢?生成随机数,指定随机数范围,建立数组,遍历数组。也许需要平行数组,一个用来存随机数,一个用来存文件名。

都依稀记得,然而印象不清晰,不足以不搜索就写代码。以下依次搜索如何实现。

(1)随机数

乱序,或者随机播放,核心因素是随机。我需要生成随机数,不必太真实,所以伪随机如何才能更真,就超出了考虑范围。

我不知道如何生成随机数。

搜索bing,国际版,关键词 bat, random。关键词指定得如果不是编差太多,一般不会超过第一页。这次幸运,没有超过第5个的,一般都在第3条以内。

看第一条

https://www.delftstack.com/howto/batch/batch-random-number-generator/

里面有这样一段代码。

就是它了,测试一下,很对。

(2)需要指定随机数的生成范围,从第1首到最后一首。

Bing搜索关键词, bat random range。

第1篇,似乎被墙,出现有点慢。

https://ss64.com/nt/syntax-random.html

或者

https://ss64.com/nt/syntax-random.html#:~:text=Two%20commonly%20given%20ways%20to%20generate%20a%20random,_rand%3D%20%28%25RANDOM%25%2A%20500%20%2F32768%29%2B1%20Echo%20Random%20number%20%25_rand%25

看这里。

差不多,测试一下。用Total Commander | ctrl-f | mp3 搜索,看计数263首。需要随机数落在[1,263]这个区间范围内。

差不多。

(3)数组

搜索。

咋只有赋值没有声明呢?看到下面这里,所有的记忆突然复苏了。

Bat是用字符拼出来的数组,实现起来非常丑陋。

放弃bat这条思路。同学们经常觉得别人实现多么顺利,以为自己很菜。并不是,如果你看到菜成像我这样的,把菜的过程都揭示出来 ,就会明白你并不孤独,可能比我还要厉害或者幸运一些呢。人人惨淡,只是在朋友圈里晒得是最高兴的部分就是了。

2. bash

换用bash吧。我机器里刚好已经装了git,附赠了bash。

我刚好学过一点bash,用过一点。虽然忘得快干净了,但是具体细节可以搜索。需要哪些技术呢?

跟bat的一样,并且我确实做了计划。搜索和实验的过程记录在计划的大纲下面。

(1)随机数

搜索 bash random

找到 https://linuxconfig.org/generating-random-numbers-in-bash-with-examples

测试 echo $RANDOM

(2)随机数范围

我在日志中记录了 搜索,参考的链接,实验,如下。

(3)改变路线,洗牌

在看下面这篇时,我突然想到,可以不必随机数。

即这一篇,刚刚搜索到的第1条。

https://www.baeldung.com/linux/bash-draw-random-ints

这篇对随机还给出了其他方案,例如 shuf,可以乱序集合中的元素。

那么我这样不就很好?

ls | shuf

每次执行输出的文件名次序不同。

3. 改变路线,洗牌

可以不需要随机数——乱序遍历。相当于用 foreach 语法而不用 for i=0 这样的循环。

步骤如下:

列出当前目录下所有文件;

洗牌得到文本;

执行文本。

因为不熟悉这些技术,忘得几乎一干二净,所以以上步骤也就是要搜索的知识。

(1)列出当前目录下所有文件,乱序输出文件名。

列目录,这个我会,ls。参数我忘了,那就啥也不给。

看下面这两张截图,指令完全相同“ls | shuf”,输出的开始部分非常不同。乱序效果符合期待(存在可能,每次执行的随机序列都是相同的,如果出现这种情况,到时候再说。);文件格式也符合ffplay的要求,没有后缀、日期时间之类的。

(2)执行文本

我们所希望的并不是输出文本,而是执行它们。

怎么执行一段文本?忘了。忘了不要紧,搜索。

测试,好使。

(3)拼接文本

根据上篇文章已知,我需要这样的效果

ffplay 歌曲的文件名.mp3 -autoexit

要求有参数。

在整行中,两边是固定内容,中间夹着一段变量。

那么需要字符串拼接。

要么是“+”号,要么是空格。

我先测试了“+”,失败了。我没有气馁,因为原计划的列表尚未穷举。又测试了空格,好使。我也并不非常高兴,反正就是这么几个方案,挨个测下去总有一个会行。如果都不行,才需要停下来再想想。

: eval ‘ffplay’ ‘歌曲的文件名.mp3’ ‘-autoexit’

(4)四行代码

又搜索了一下bash里的循环怎么写,有了以下代码。

for i in `ls | shuf`

do

eval ‘ffplay’ $i ‘-autoexit’

done

命名为 play.sh,运行。

可用,每次运行都随机。就像久未谋面的老友,猛一见到,恍如隔世。

这个方案的现存缺陷是 每次播放新的一首歌曲,ffplay就会跳出来成为顶层窗口,需要手动切一下到后面。上篇提到,可以用 -nodisp 参数避免打开GUI窗口,但是这样我就失去了用q切到下一首歌的渠道。没找到办法,忍吧。

4行代码写了半小时,绝大部分时间都是在搜索、实验。这些弯路对于当前项目而言可以不是必须​的,但是对于整个职业生涯甚至对整个人生而言,那既是以后可用的经验,是对探索技术方案的训练和演习​,同时也是​沿途美丽的风景。

 

一行代码播放当前目录下的所有mp3

所谓彩云易散,无论什么好东西,如果不在自己的手里,就随时可能失去。

原本好好的,突然就不能用了,这样的例子很多。Google reader 当年用得好好的,Google说不再做了。Gmail用得好好的,突然逐渐断断续续不能访问了。Keep练得百八十遍觉得很好的课程,需要会员才能练了。

这几天遇到的是听歌时,网易云音乐听到喜欢的曲子,某一天突然就不能听了。这首不能听是由于版权方要求,还有些是不知道谁要求的,本来能听的突然就要求买会员才能行。惊喜地在网易云音乐找到了这首的视频,官方的,下载,导出为mp3。尝试上传到网易云音乐,它说,它把可能有版权限制的音乐替我筛选去除了。吓得我一哆嗦,赶紧看看自己是不是衣装革履谨言慎行人模狗样。它、它、它怎么能访问我的手机SD卡呢。我要求上传,要求上传时,你当然可以并且那时才能访问我的SD卡。为了筛选,那不是我的要求,你怎么能访问我的SD卡呢,我授权了?试了一下播放,还可以,没有好心替我删除掉。

所以,音乐必须放在本地,播放器也必须可靠,不然会被供应商卡脖子。再这么发展下去,我是不是得自己手挫个C语言编译器才行。然而,这个编译器的源代码,用哪个可靠的编译器才能转换成可执行程序呢。这么说,我还得手搓一个汇编器,手搓一个……用十六进制写个编译器,操作系统可靠吗?还得手搓一个操作系统,手搓一个CPU,亲手手搓电烙铁,以及焊锡。

任务艰巨,来日方长,且顾眼前。并且,开头跑题已经够远的了。

把一堆mp3文件放在同一个目录下。

用ffmpeg。在这里下载 https://ffmpeg.org/download.html,以下红框中的应该都行,我不记得当初自己下载的是哪一个了,每次装机这都是早期必装软件之一。

使用其中的ffplay。在文件资源管理器(猜测 我的电脑 也行)中打开mp3所在的文件夹,然后在文件资源管理器的地址栏,即下图中红框位置,输入 cmd,回车,弹出命令行窗口,当前目录刚好就是文件资源管理器的当前文件夹。

在命令行窗口中输入下述命令。

for %i in (*.mp3) do ffplay “%i” -autoexit

这行代码会遍历当前目录中的所有mp3文件,逐一用ffplay播放。其中的%i表示正在遍历 的变量。-autoexit参数用于要求ffplay播放完当前mp3后退出,以便下一个ffplay进程开始播放下一首mp3。

播放时效果如下图。

左侧是弹出的窗口,ffplay正在播放mp3,开始显示频谱。
按q退出当前音乐,并开始下一首。
按w由频谱切换成波形。

右侧是命令行窗口。在命令行窗口中按 ctrl-C,停止所有mp3播放并退出。

这行代码也可以写个批处理 bat 文件,每次放歌的时候运行这个批处理。代码需要稍微修改,如下。

for %%i in (*.mp3) do ffplay “%%i” -autoexit

缺点包括以下几点。

(1) mp3未排序,可忍。

(2) 左侧窗口总显示在当前虚拟桌面上。不希望它打扰我,但是没有找到方法使它隐藏或者显示在不是我正工作的虚拟桌面上。

优点是 mp3 在本地,不担心云山雾绕或者乱云飞渡,播放器令人放心。

最大的优点是,通过捅咕这些练习了批处理和ffplay的命令行。

 

用数字电路作为基础理解计算机组成原理或系统结构中的硬件实现LRU算法

本文使用 Excel,Digital(lushprojects仿真器 可选),graphviz(可选),用数字电路课作为基础知识解释LRU算法的硬件实现。可以视为数字电路的一个综合实验。

几何原本和SICP教导我们,所有的定理都应该仅由公理直接或间接地逻辑推导而出,不应该在推导的过程中依靠没有证明过的观点。在工程和教学中,出于速度或成本的要求,或者单纯不够严谨,经常不能满足这一要求。虽然产品或同学们也都表示了满意,经常有不够完美的遗憾。

例如,计算机组成原理或系统结构中的Cache替换算法之一LRU,即 最近最少使用Least Recently Used。这个算法不仅有软件实现,也有硬件实现。讨论硬件实现在教学上有其利益,有利于学生理解 软件和硬件都可以实现算法,以及实现简单算法(猜测是乔姆斯基3型文法,使用时序逻辑电路)不一定要使用图灵机等价(例如C语言)的计算能力。但是,查了下教材,要么认为你已经会了,不必讨论,要么语焉不详,甚至不给参考文献。

在学习中,有的同学会担心,用文字和图示从内存访问领域知识解释、硬件、算法(经常被视为软件)是否一致呢。

1. Cache替换算法中的LRU,书上怎么说的

我只在李学干老师那里看到了解释,他在PPT里是如下面的截图中这样说的。

这个解释很清楚,所以后面可以用作依据计算 多少个内存块需要多少个哪种器件。不过这里的触发器(或者“对触发器”)是什么,与同学们见过的数字电路课上的长得略有差异。没有使用 状态方程、状态转换图、状态转换表,所以需要在当前领域(替换)中用文字解释。有的同学可能会误以为这是凭空建立的概念。并不是空中楼阁,这是严密地建立在我们已建立的知识体系之上的。只是为了生动,学习不那么痛苦,所以才有基于领域知识(替换)的讲解。

2. 如果以数字电路为基础,逻辑电路图应该怎么画

用数字电路的方法表达,逻辑电路图如下。

这个仿真的逻辑电路图是可以亲手操作的,在这里 https://tinyurl.com/2r32l3qw

通过按下左侧的某个开关,例如“访问A”,再抬起“访问A”,表示访问内存中的A块。如果按以下次序执行

关闭访问A
断开访问A
关闭访问B
断开访问B
关闭访问C
断开访问C

即以ABC的次序访问内存,右侧的A_LRU点亮,表示A是最近最少访问的块。

在上图中,用到的部件为3个JK触发器,时钟,电源,3个开关,3个与门。JK触发器也可以改用RS触发器,因为RS不会同时为1,所以RS触发器与JK触发器功能相同。

特别说明:从本文此处向下的电路与上面的电路连接略有不同,所以方程和状态转换表不同,但是功能相同。

3. 状态转换方程

接下来我走了点弯路,手推了状态转换方程。结果是对的,不过,可以借助工具,不必非得手推。

手推的过程如下。求功能,其中的一步即由逻辑电路图求状态转换方程,与数字电路课里学的一样,
(1)根据触发器 列出 特征方程,
(2)根据线路连接列出 驱动方程,
(3)把驱动方程代入特征方程,得到状态方程和输出方程。

右边删除那一块,也是对的,只是一会儿求状态转换表用Excel,不需要这一步。

4.状态转换表

由状态方程求状态转换表,我用了Excel。

Excel文件的一部分如下图所示。

共65行,除表头以外还有64行。这64行来自3个输入Ai,Bi,Ci和3个状态变量Q1,Q2,Q3,这6个量的穷举,2^6=64。

(1)穷举64行输入变量和状态变量的方法之一如下。

右侧权重最低的比特,每2行 上半部分是0,下半部分是1;
右数第2行, 每4行 上半部分是0,下半部分是1;

右数第2行, 每8行 上半部分是0,下半部分是1……

可以根据如上图的公式复制,也可以按这个规律复制粘贴,如下图所示。为方便观察,下图中的0涂成粉底色,1涂成绿底色。

(2)次态Q1*,Q2*, Q3*和输出Ao,Bo,Co

Q1*,根据手推的状态转换方程,如下图所示。

以第3行为例,

Q1* 的公式为 =OR(A3,AND(NOT(B3),D3))*1

Q2* 的公式为 =OR(A3,AND(NOT(C3),E3))*1

Q3* 的公式为 =OR(B3,AND(NOT(C3),F3))*1

公式中“*1”的目的是为了观察方便,显示为1或0,而不显示为 True 或 False。

输出,由次态求得,所以手推方程时最后一步没有必要。

以第3行为例,

Ao为 =AND(NOT(G3),NOT(H3))*1

Bo 为 =AND(G3,NOT(I3))*1

Co 为 =AND(H3,I3)*1

这样,就得到了12列*64行的状态转换表。

(3)自动生成电路图

把上述状态转换表导入到 digital (在https://github.com/hneemann/Digital/下载),可以自动生成电路图。步骤如下。

第一步 把EXCEL文件的 输入、现状 和 次态、输出 之间加一个空列;

现态命名为 Z_2^n, Z_1^n, Z_0^n, 次态命名为 Z_2^{n+1}, Z_1^{n+1}, Z_0^{n+1}。调整列的次序为 输入、现态、空列、次态、输出。

第二步 把上述EXCEL导出成CSV。

第三步 在Digital中,分析 | 综合,得到表,然后 文件 | 打开 | 类型选“逗号分开的值”,得到状态转换方程和输出方程,得到状态转换表。

第四步 创建|基于JK触发器的电路。也可以选择基于其他器件。

如下图所示,为基于JK触发器创建的电路,正在仿真运行,当前A是最近最少访问的块。

这个看起来更复杂的电路,与此前展示的电路,是等价的。这由状态转换表相同来保证。基于同样的原理,LRU算法的硬件实现 与 LRU算法是等价的。

5. 捷径,不必手推方程的方法

上文中提到,我走了一点弯路,不必手推方程。

不必手推方程的过程如下。

在 Digital 中,如果不使用异步RS触发器(例如用JK触发器)作为器件,手动画出电路。如下图,请注意从每个触发器的Q引出的三角标志,称为 隧道,以及它的名字。

在菜单中选择 分析|分析,即可得到方程和状态转换表。

附带说一句,上述电路图可以仿真运行。

穷举状态转换表,可以用以证明 上述电路能完成 LRU 算法的功能,因为状态转换表(以及输出),刻画了在所有 某个现态之下(在这里是历史上以何种次序访问过A,B,C哪些块)施加某个信号(在这里是访问A,B,C中的某个块),因此得到新的状态以及输出哪个块是最近最少访问的。

举个例子。在下图中,红框的部分 表明 在某些现态(历史有某些次序的按键)之下,访问了C块,则B块成为最近最少访问的块。

至此,基于数字电路的基础,我们解释了这个电路为什么可以实现LRU运算的功能——状态转换表(以及输出)所刻画的函数与LRU算法是一致的。

下图是使用RS触发器的版本,不能分析,可以仿真。

6. 状态转换图

我原本的目的,还包括用状态转换图表明3个触发器和3个与门的电路与LRU算法一致,这样观察可能更直观一些。

得到状态转换表和方程以后,我才发现 Digital并不支持生成状态转换图。我原以为它能,它能画状态转换图,但是需要用手拖动部件,画状态节点和状态迁移连线。可以估算出,3个触发器,共8个状态,每个状态向外迁移,有3个自变量作为消息,8个可能的消息,并有3个输出。工作量不小。

我搜索了一下画状态转换图的工具,看到了熟悉的 graphviz,自动布局的绘图工具,可以用源代码作为输入。

我做了两个版本。

其一,去除约束项。我们知道,A,B,C三个变量同一时刻只有1个可以是1,因为不允许同时访问内存的不同区域。并且,观察仿真器或状态转换表可知,访问某个块之后,例如访问A以后,A会由1再变为0,次态保持不变与现态相同。输出不全为0,我们暂不关心这种情况。

根据目标文件中的典型一行,

001->000[label=”001/100″];

我调整Excel列的次序为 现态、次态、输入、输出。

把Excel文件导出,删除列间的空格。每一行类似下面这样。

001000001100

再使用Emacs的宏,插入箭头、方括号等字符,得到 每一行类似下面这样。

001->000[label=”001/100″];

完整代码如下。

命令行

c:\tools\graphviz\bin\dot tran.dot -Tpng -otran.png

得到png图片。

如下图所示,是访问序列为A,B,C的实例之一,输出为A是最近最少访问的块。

另一个版本的状态转换图,方法完全相同。所不同者,我用了全部64行可能。看起来如下图所示,已经失去了帮助直观理解硬件与LRU算法等价的价值,适合炫技和作为熟悉工具的练习。

7. 总结

借助工具,我们可以直观展示和观察 通过数字电路这样的基础知识 理解 计算机组成原理或系统结构中的硬件实现LRU 算法,减少学生对领域知识、硬件、算法间是否同构的担心。

 

用傅里叶级数大轮套小轮画任意函数曲线(2)

3. 画函数曲线,效果

在这一部分中,我们将做出结果如下面的效果图所示。使用的工具是 geogebra。可能需要Excel,并非必需。

用傅里叶级数5级“拟合”类似三角波的函数图形。这个函数是随便选的,在后文中能看到,改变成其他函数图形很容易就能能画出来。

在效果图中,紫色的是待“拟合”的函数,上面的深紫色点代表傅里叶级数之和在函数上的位置。傅里叶5个级数的圆,分别用 红、橙、黄、绿、蓝 表示,圆周上的点与当前级别的圆同一颜色。

5个圆间具有如下关系。

第1个圆上的点是第2个圆的圆心,
第2个圆上的点是第3个圆的圆心,
第3个圆上的点是第4个圆的圆心,
第4个圆上的点是第5个圆的圆心。

连接蓝点和紫点的水平虚线,其目的是为了能更方便观察大轮套小轮的结果与待拟合函数一致。

严格的说,紫色图形并非待“拟合”的函数,而是拟合的结果。待拟合的函数如下图所示。能够看出下图中的波形与紫色波形之间相似。

3.1 变量

共有3种变量。

第一种变量是 t,即 omiga t 中的 t,自变量,角度。定义如下。

设置为 slide,显示在屏幕上,自动播放。

第二种变量是 d1~d5,分别对应红圆到蓝圆的5个半径。

第三种变量是 theta1~theta5,分别分对红圆到蓝圆的5个初始相位。

在Excel中根据待求数的波形,得到d1~d5和theta1~theta5,如下。

把d1~d5和theta1~theta5的值从Excel抄到 geogebra。

以上,共11个变量,我放在了 Layer 0。

3.2 圆周和圆周上的点

第1个级别的圆周c1和圆周上的点a1分别定义如下,放在了 Layer 1中。

其中圆周c1的圆心为原点(0,0),是固定值;半径为第1级数的系数d1,在变量中定义了。

圆周上的点a1,其横坐标为在 半径d1 乘以 cos( 自变量t + 初始相位角theta1)。纵坐标原理类似。

除第1级数以外,其余的4个级数有相似的规律。以级数3为例,我把圆周和圆周上的点放在了 Layer 3中。

其中c3是圆周,(1)以前一级数的圆周上的点a2作为圆心,(2)半径为本级数的系数d3。除第1级数以外,其余的4个级数的共同规律是 圆周的圆心都是前一级数圆周上的点,半径为当前级数的系数d_k。

这里a4是第3级数圆周上的点,其横坐标为 在前一级数圆周上点a2的横坐标的基础上偏移 半径d3 乘以 cos( 自变量t + 初始相位角theta3)。除第1级数以外,其余的4个级数的共同规律是 横坐标都在前一级数的圆周上的点a_(k-1) 的基础上偏移,偏移量为 cos( 自变量t + 当前级数初始相位角theta_(k-1))。纵坐标有类似规律。

在下图的示例中,黄色3代表当前级数,红色2代表前一级数。

这样,就得到了以下元素,如下图所示。

5个圆的半径

5个圆的圆心

5个圆上的点

这是整个项目的核心部分。

3.3 作为背景对比的函数图像

声明如下函数。

每个级数都有 d_k*sin(x+theta_k)组成,这5个级数累加之和为f(x).

设置为紫色,得到了下图,与此前的5个圆叠印在屏幕上。

函数上的点,按下图定义。

其中的t即此前声明的变量t。

设置为紫色,如下图所示,红色箭头所指 紫色曲线上的点。

水平线,按下图定义。

设置线型为虚线,减小粗细,如下图红色箭头所指处。

水平虚线指示函数上的点的纵坐标。

3.4 大轮套小轮-函数曲线横向展开,对比

这一小节只包含解读,不是步骤之一。

水平虚线的纵坐标,与5个圆中第5级数圆周上的点的纵坐标,与函数上的紫色点的纵坐标,三者在动图中始终保持一致。如下图中的4个子图分别所展示的,函数曲线上的紫色点纵坐标始终与第5个圆周上的蓝色点始终保持相同。

 

因此左侧大轮套小轮的5个圆 与 右侧函数曲线的横向展开 是一致的。

4. 极坐标形式-原位轨迹跟踪

在变量t的settings中,设置增量和重复的方式,这样较易观察到现象。

按t的播放按钮。

得到下图,第5级数所刻画出的极坐标形式点的轨迹。这条轨迹沿x轴展开,对应紫色的函数曲线。如果我们站在原点(0,0)位置向外看,这颗在 均轮-本轮 上的蓝色星球,它所运行的轨迹时快时慢。

我们大胆地修改d1为更小的值,例如d1=2.053836824,可以得到下图。

两个红色箭头所指的地方,站在原点(0,0)看来,星球在自东向西(在北半球向南天看,即顺时钟)运行时,突然回头改为自西向东(逆时钟),过了一段时间,又恢复为自东向西(顺时钟)。可能,古人就会震惊这颗星球轨迹奇异,显然不是运行在球形天穹上,把它命名为荧惑吧。在右上角附近,还能看到这颗星球会停下来几天,是在等候什么大事发生?

5换个函数

我们很容易就能换个函数图像来画,例如下面的波形。

用Excel求得傅里叶系数如下。

把上述系数赋值到geogebra……

这个操作过于繁琐,我们想个快捷的办法。

复制上图,然后 选择性粘贴。先按 数值 粘贴,再 转置。得到箭头所指的区域。

复制箭头所指的区域,贴到记事本中,简单编辑,加等号得到下图。

再从记事本中复制,备用。

在Geogebra 中增加控件 按钮。

把caption改为“换函数”。

这个按钮的Settings | Scripting | On Click,把刚才从记事本中复制到的文字粘贴在这里。

关闭Settings,点击换函数,函数曲线以及系数更换完毕。下图中,左边是 geogebra中的效果,右边是Excel中原函数的曲线,差不多吧。

再换一个。

重复上述步骤,得到下图。

再换一个函数。

得到下图。