浮光掠影——看世界科幻大会 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中原函数的曲线,差不多吧。

再换一个。

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

再换一个函数。

得到下图。

 

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

在网上看到过图片系列,名字叫做 不需要文字的数学证明,或者叫做 怪不得我数学没学好 一类的。用静止图片或者动图展示数学原理。例如 用三角形边长构成正方形,灌上水,用水的体积用面积相等验证勾股定理;圆旋转,把圆周上的点沿横坐标延开演示正弦曲线的。印象挺深的一个动图,是用大圆上套小圆,三个圆吧,展示方波的傅里叶分解。感觉非常炫酷,值得照着做一个。

仿制的方法和过程如下,用 geogebra实现。个别细节需要Excel,并非必须也可以用其他工具代替。

最终效果大致如下面的效果图所示。

图中,要傅里叶分解画出的曲线是浅灰色的细线,大致呈现方波的形状。有3个圆,不同的半径(以及初始相位)“拟合”出方波。这三个圆从大到小,分别为 红色、绿色、蓝色。第一个即红色圆上的一点,作为第二个即绿色圆的圆心;第二个即绿色圆上的一点,作为第三个即蓝色圆的圆心。当红、绿、蓝三个圆按各自不同的固定周期旋转时,运动叠加的结果在横坐标上展开,刚好符合方波的函数图像。

这个 geogebra 项目完成后能够画出的任意函数图形,不止限于方波。

1. 需要的技术及原型

考虑效果图所呈现的元素,以及各元素间的关联,可以得出需要哪些geogebra中的技术。

最核心的效果,是一个绿圆上,以另一个红圆作为圆心。或者更完整的表述,应该是 一个绿圆上的点,以另一个红圆上的点作为圆心。这样,就能逐级完成傅里叶级数的累加。

我们从简单的开始,不需要 geogebra 基本也容易理解。如果某个技术不熟悉,也容易单独做个 geogebra 小项目测试一下。

1.1 第一个圆,指定圆心和半径

第一个圆分成两部分,一是 圆周,二是 圆周上的点。

圆周 的定义如下。

我们把圆心设置在原点 (0,0)位置,半径为r1。这样,就自动得到了变量r1,如下。我们随便设置半径r1的值,以后会经常调整它的值。

圆周上的点 定义如下。

横坐标为半径r1乘以角度alpha1的余弦值,

纵坐标为半径r1乘以角度alpha1的正弦值。

这正符合余弦和正弦在单位圆中的定义。

我们在圆周上的点的定义中使用了刚才定义的变量 半径r1,并且自动得到了另一个变量 角度 alpha1。角度的值在以后也会经常调整。

以上,由圆周和圆周上的点,我们得到了第一个圆。如下图所示。

1.2 行星轨道

通过下图中红箭头所指的单选按钮,把 r1 和 alpha1 的 滑动条slide 显示在屏幕上。在setting中可以指定slide的范围。

拖动 alpha1 或 r1,可以得到半径不同的圆,以及 不同角度的a1。如下图所示。

如果把原点视为太阳,c1是行星的轨道,a1是轨道上的行星。这个比喻有利于观看动图的人更易于理解我们的意图。

1.3 第二个圆

第二个圆也由两部分需要讨论,一是圆周,二是圆周上的点,如下图所示。

从上图可以看出,第一个圆的圆心有固定坐标(0,0),而第二个圆的圆心不是固定的。第二个圆的圆心是第一个圆圆周上的点a1,这个点a1受r1和theta1两个变量的影响。在最终的成品中,我们会注意到,不同的级别有不同的半径,并且演示傅里叶级数的过程中,角度是一直在变动的。

第二个圆的圆周,圆心是a1,半径是变量r2。

第二个圆的圆周的上的点,如下。

横坐标为 圆心a1的横坐标x(a1) 加上 半径r2 乘以 alpha2的余弦。同理,得到纵坐标。

1.4 卫星轨道

在以后的完整项目中,调整两个圆的半径,对应了傅里叶变换不同级数的系数Cn.在这里,可以手动调节r1和r2两个滑动条,查看c1和c2。下面的三张图,展示了不同半径对比,红圆的半径是r1,绿圆的半径是r2。

固定两个圆的半径,改变 alph1和alpha2的值,看动态效果,第二个圆的圆周上的点a2,像月亮/卫星围绕地球/行星a1旋转,a1绕太阳即原点旋转。

1.5 轨迹

点击alpha1和alpha2右侧的 播放 按钮;

在a2的settings里面选择 show trace。

可以画出a2(以极坐标形式)划出的轨迹。

这个轨迹,模仿了托勒密的本轮-均轮系统,想像一下你站在原点,观测到的紫色线条就是某颗轨道令人困惑的行星在夜空里划下的轨迹。

1.6 函数曲线

在用傅里叶级数大轮套小轮画任意函数图像的过程中,我们在背景叠印一张函数图像作为参照,看起来更直观一些。

假设 alpha1 与 alpha2 有函数关系,例如
alpha2=alpha1*2。

叠印的函数,即大轮套小轮傅里叶级数在横坐标上的展开,如下。

任意时刻a2点在函数图像上的位置B,如下。

与a2纵坐标相同,画一条水平直线。在settings中设置为虚线,细一些。这条直线连接了卫星a2和在函数上的点B。

以上三项,函数图像、函数图像上的点、alph2与alpha1的函数关系 设置完毕以后,图像如下。

点击alpha1的播放按钮,观察以上图像的动作,可以注意到,(1)a2与B总在同一纵坐标,(2)B始终在紫色的函数曲线上。

2. 求两个参数 半径dk 和 初始相位差thetak

利用上一节中技术原型中涉及到的 geogebra 方法 画任意函数曲线的大轮套小轮傅里叶展开,我们还需要傅里叶级数的正弦形式。

根据 https://zhuanlan.zhihu.com/p/654224439https://zhuanlan.zhihu.com/p/655415316

可以用Excel求得任意周期函数分解为傅里叶级数的 ak 和 bk.

又根据《信号与系统——使用MATLAB分析与实现》https://book.douban.com/subject/35627101/,有以下公式。

根据以上公式,可以由 ak 和 bk 求得 dk 和 θk。

其中dk为不同级数对应的圆的半径,θk为不同级数的初始相位角。

傅里叶级数表述为下述 正弦形式。

在Excel中,我们由上文中求得的 an 和 bn 求得 dk 和 θk。

在要拟合函数确定的前提下,傅里叶系数a1,a2……a5和b1,b2……b5已经求得。并且在Excel中傅里叶系数会随要拟合函数的变化而随时变化。

以d2为例,应用dk的公式,由b2和a2求得d2,得到下图。

以theta2为例,应用theta k公式,由b2和a2求得theta2。

这样,对于如下函数

可以得到d1~d5和theta1~theta5。

把d1~d5和theta1~theta5代入到上述傅里叶级数的正弦形式中,在Excel中就能得到下图中的右图。下图中的左图,是用an和bn即正弦和余弦均有的形式得到的,作为对比参考,它们完全相同。

(待续)

3. 画函数曲线

3.1 目标曲线

3.2 大轮套小轮-函数曲线横向展开

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

 

把照片加工成指定的宽高比例

1.要求和必要性

填表。填写有些表格是为了参加喜欢的会议,填写有些表格是被迫的,为了求生。有时还要填写各种汇总表格,这是希望我们站在更上位的角度上观察自己吧。

填表的时候,有时要提供照片。有时照片还要求指定的尺寸(包括文件大小,以字节为单位;也包括外观或打印的大小,以像素或厘米计算;有时包括DPI,每英寸的点数,清晰度)这些都容易用各种处理图片的工具加工,全自动的,指定参数就行。

以下面这张照片为例,摄于长春 世界雕塑公园入口。

偶尔照片要求宽高的比例,这说明接收照片的人是真的认真考虑问题了。因为如果不指定宽高比例,你提供的照片显示出来可能会横纵比例失真。像下面这样。

或者像下面这样。

对这一点我非常惊讶,在学校的毕业生照片收集系统里,在商场里面和外立面上播放的大屏幕上,经常有那人的横纵比例一看就不对。把16:9和4:3混淆的,更有甚者把新近的超宽的宽银幕播放在窄屏幕的。完全不顾及“锁定纵横比”这样的复选框,也不顾及观者的感受。我在练习画画的时候,对如何保证纵横比例一致相当苦恼,现在也没有找到好的办法,除了用铅笔测量长度。我希望更加精确,而不可得,难以理解别人是如何忍受这种程度失真的。

又或者,接收照片的人保证了比例,但是由于你提供的照片比例与系统打算用的不一致,所以就随便剪裁下来一块——而照片上哪里是重点,需要人类的参与才能体现意图。

下面这张

和下面这张

两张比例差不多,都是从原图上剪切下来一块,但是强调的重点,暂时还是由人类指定吧。

综上,要求为
(1)宽高比,有时2:3,有时4:5,有时3:4,等等;
(2)剪切的位置需要人工指定。

2. 工具

用 irfan view 容易处理。irfan view还可以用来看漫画,挺方便的。在这里 https://www.irfanview.com/ 下载。

3. 步骤

操作步骤如下。

(1)开始操作

Edit | Create custom slection…

(2)指定比例,可以指定宽和高的像素


通过Custom ration可以自定义比例,宽高之比可以用小数0.8或者分数4/5表示。上图中我选择了4:5表示宽高之比为4:5。

右侧的像素为按“Save and draw on image”后出现的提示框的默认大小。

提示框可以通过 鼠标右键移动位置,这样操作像素大小不变。

或者ctrl拖拽边缘,像素大小变化,纵横比例不变。

下图,我用鼠标右键操作提示框,移动了它的位置,没有改变它的大小。

(3)切去不要的部分

Edit|Crop selection(Cut out)

结果如下图所示,黑色背景是图片以外,是不存在的区域。

(4)保存

此时可以根据系统对图片字节尺寸的要求选择压缩比。

在文件资源管理器中看保存出的图片属性,宽高的像素以及比例符合期待。

 

锻炼十年(6)器械

这是2018年开始写的一个系列,当时命名为《锻炼十年》,从2008年每天俯卧撑开始计算。如今又5年过去了,有些新的体会增补进来。为保持名称一致,仍称为 锻炼十年。

之前写过了伤痛,这一篇讨论 器械。

当年在健身群还是同学们的群里聊起锻炼,或者打卡。有同学提到,老师你还有动感单车,我们在宿舍什么都没有。虽然我成天锻炼打卡,但是我的锻炼中绝大多数都是自重训练,不需要任何器械。

骑车需要有车,如果不是固定的自行车,还需要车道和气候条件。跑步需要跑道,游泳需要泳池,各种球类需要场地。对抗性的运动都还需要一个因素,足够年轻。如果需要这些条件才能训练,我早就放弃了。

所以,虽然我下面要写这么多器械,然而它们并不都是必要的。前十年除了自重,几乎都没有用到别的装备,后五年也仍然以自重作为最主要的训练。瑜伽垫、哑铃、引体向上架,是常用设备,其余的使用不频繁。

(1)自重训练

自重训练,只需要体重。当然,运动专家们指出过自重训练的缺点,自重不易调节,对力量专业训练或者发展不利。可以用引体向上作为示例,很多人一个也拉不起来,因为没有成就感,训练不易坚持。不过,如果不太追求效果,像我,那么就无所谓,仅利用体重的自重训练就足够好。

不妨把如何使用自己的体重,从各种角度锻炼不同肌肉,把这些当成一道思考题。查查资料,学习理论,没事琢磨,乐在其中。

学习解剖学,了解动作对应的肌肉和骨骼。比如 https://book.douban.com/subject/26863470/

有些基本原则,可以帮助在自重训练这样受限条件下,训练更多的肌肉,达到更好的效果。比如 制造不对称(单侧),不稳定(弹性支撑),难度变化(高度、负重、弹力带),动态(爆发)。参见 https://book.douban.com/subject/26739524/

自重训练要小心别受伤。自重训练看起来简单,因为我们会误认为大家都能轻松抬起自己的身体。但是自重训练的很多动作是特意设计出来难为我们的,是专门把大重量加在小块肌肉上,或者以别扭的姿势限制某些肌肉发力,从而使目标肌肉得到更多机会更大负重的训练。不仅需要力量,数量也会带来质变。能做一两个,和连续12个,做上几组,是有非常大区别的。在最初做腹肌训练时,尽管当时能够连续100个仰卧起坐,但是练腹肌的那些刁钻动作,我仍然疼到每做一个就破口大骂教练。因为这些动作并不像表面上看起来那么容易,如果不小心谨慎,保持只在头脑清楚的情况下训练,受伤也是分分钟的事。拉伤肌肉,摔伤或者碰伤,在我身上都发生过,往往因为托大,或者练的时候头脑不清楚。

自重训练可以辅以哑铃或弹力带加负重,但是应保持小心,不要冒进。动作能轻松完成前,不轻易加负重;加负重以后,并非只进不退,偶尔降级有利于心态,也有利于体会动作。

即使不需要除体重以外的任何器械,仅徒手,甚至去除有难度的动作,每天专门锻炼的时间,如果强度大,也很难超过半小时。集中训练上肢推、上肢拉、下肢、核心,肌肉都很难承受半小时以上“足够”强度的训练。不然恢复时间长,容易达到一周以上,会影响下一周的训练。另外,即使肌肉可以承受,每天超过半小时,工作、学习、家庭被挤占的严重程度可能也难以承受。每天例行锻炼如果强度达到剧烈,那么也就能坚持十几分钟。想想一千米达标跑,即使肌肉能够承受,心肺的压力也相当大。过重的负担对意志有太高的要求,加上进步来得没有想像中快,痛苦一段时间以后就会放弃了。

为降低放弃的风险,宁可减少训练量。只要不受伤,动作不标准也没有多大问题,慢慢会进步的。教练要求不要这样,不要那样,要做到什么,又要做到,那都是完美状态,这种状态可能在你练这个动作三年以后才能达到。没有足够力量的时候,就是做不到的。这不以人的意志为转移,与你的意志品质(挺住!),道德修养(腿不要懒!)都没有任何关系,单纯就是因为太难。如果你感觉疲劳或者困难到不想练了,那就是曲线过于陡峭。广播体操那种强度对很多四十以上的人群而言,也相当不易。只要能让你坚持下去的强度,眼下每天只练半分钟也无妨,强过明天就放弃。

除了参考示例的那些有名字的动作以外,考虑在何种情况下能够达到类似的发力条件。我第一次感觉到大腿后侧肌肉发力,与所有看到的示例都不同。当时坐在椅子上,向前伸腿,微屈,搭在地面上。用力向下向后拉,这样感觉到了大腿后侧发力。以后就容易在各种姿态下找到类似感觉了。

根据解剖学,可以躺在床上锻炼 腹肌、后背、大腿后侧。发力到发抖以前,虽然姿态没有变化,但是肌肉也可以相当紧张。用桌子可以练腕力和腹肌,静态保持造成的压力就相当大。类似的,用墙锻炼推的动作,地板锻炼大腿外张、内收,站立时锻炼小腿,开会时坐椅子上发力把自己微微抬起来,向上推门框辅以随动作被动下蹲可以锻炼肩的中束和前束。

在生活中,有些动作力量并不大,但是可以徒手体会发力的感觉。画画时体会大关节和大肌肉更稳定,推拉重物时体会下肢发力,刻木头时体会控制和杠杆。隔一段时间由负重转为徒手,降级练习,也同样有利于感觉发力的肌肉和体会姿态控制。

我所练的动作,一些来自 keep,动作、节奏、组间休息都照着练,并且用以作为记录。

另外还有些动作,以及解读是根据一些书学到的。这是我建的豆列 https://www.douban.com/doulist/41556500/ ,我的理论主要是从这里学到的。

(2)瑜珈垫

瑜伽垫是必须的,因为不少动作需要膝或肘支撑。站立的动作如果有瑜伽垫,也可以不穿鞋。俯卧撑徒手不用架子的时候,有瑜伽垫的话也能避免手掌和地面硬碰硬压得实成平整疼痛。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f6d5f5c3932ced531cfe9aeb2ffa6af.jpg

如果短时间出差,没有瑜伽垫,也没有椅垫或厚毛巾拆下来代替,就只能练些别的动作了。

我用过三五个瑜伽垫,有的总被踩蹬,后来表皮就脱落了,只能扔掉。有的薄,缓冲保护作用就较小。有的厚,软和,然而向两边或向中用力的时候会拉伸或收缩。特别是空气干燥寒冷的时候,瑜伽垫在地板上的摩擦力会变得小很多,打滑。男士购买瑜伽垫需要考虑身高,有些瑜伽垫太短,没法手脚一起放在上面,也窄,不能做宽距俯卧撑。我经常把两个瑜伽垫叠起来用,希望能降低万一有噪音对楼下的影响,踩着脚感也不错。长期使用厚的瑜伽垫,换成仅穿鞋站地板上的时候,发现单腿平衡容易了很多,例如单腿硬拉。

每次训练瑜伽垫上几乎都很多汗水。有一段时间我在练keep的时候常拍照瑜伽垫上汗水形成的人印儿,作为锻炼的图片上传。瑜伽垫上经常滴汗,可能材质的原因清洗效果也很一般,还是有痕迹。可能还是由于材质的原因,细菌和真菌难以滋生吧,擦干以后不捂着能透气,倒是一直也没有气味。

还有仅分别支撑一个膝盖这么大范围,比巴掌大不了多少的(橡胶?)垫。膝支撑的动作,例如膝支撑健腹轮,用着比瑜伽垫要方便。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\260de63535bf6d2b4ec422f079d2b97.jpg

(3)哑铃

哑铃并不需要太重。一方面上肢训练中需要负重较高的动作,可以用体重代替;另一方面,需要哑铃的很多动作,要练的肌肉弱到没有能力拉起太重,并且那些肌肉往往需要小重量多次数。此外,我也没有练大肌肉这样的雄心壮志。

我的哑铃中最重的,6.5kg*2。是当年在柳园BBS买的,应该是我经历的最早网购吧。卖家是向龙,我去拿哑铃,他看是我死活不收钱,我死活要给。记得后来以30元还是20元成交。接近二十年以后,邦哥带我去迪卡侬现场买哑铃练肩,我非常惊讶,原来哑铃这么贵,当年向龙所收的数额只是象征性的。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f30908666f9fff9a0da717ea1432cdc.jpg

6.5kg*2哑铃里面是沙子,所以看起来非常大。每次有人要试的时候,我都要特别叮嘱,非常轻,千万小心别闪到。就像初中时化学老师在让我拿起水银瓶子的时候反复叮嘱,非常沉,非常非常沉。这对哑铃设计的是可以更换里面的内容物,而且现在也没有填满。但是我从来也没能旋开过,而且起初十几年我举不起来,各种姿势都非常困难,几乎没有练。七年前才开始频繁使用。等到我终于觉得这俩哑铃不是特别重的时候,更重的哑铃对我已经不太迫切了。

迪卡侬的哑铃是3kg*2的,邦哥带我去现场买的那对。他告诉我,哑铃别网购,死沉所以运费贵。而且,你需要现场试一下找找感觉。我当时想要练肩,邦哥说你侧平举不太费劲,也别勉强,能做几个就行了。我当时雄心勃勃地注意到他后面的话,他说,以后厉害了可以再换新的。6年过去了,没有换新哑铃的必要,虽然侧平举很轻松了,俯身侧平举也终于不艰难了。

3kg*2就只是练肩而已,练其他的动作要么太轻,要么太重。练肩每周只有一天而已。我懒,并且有其他训练和事务。即使不懒,练肩也只能每周两到三次而已,天天练的话肌肉恢复也成问题。大多数器械的命运也就是这样,没法做到利用率非常高,除非有好几个人一起用。所以,如果器械让你感觉总是落灰,不要内疚,就是这样的,只能这样。

还有1kg*2哑铃。有两套,最初是二猫妈和二猫的,我现在常常用来练俯卧天使(上举Y字-侧平举T字-向下伸展A字)。我的巅峰能做20个引体向上,现在做15个尚有余力。但是我在俯卧天使时使用1kg*2哑铃已经达到极限,3组*12个就满身汗。几年前,俯卧天使徒手做,或者徒手的TW伸展、徒手的YW伸展,都异常困难,做几个就满头满脸汗。肩胛(或肩袖?)附近的肌肉太弱了,并没有进化出承受大重量的能力来,小重量多次数练到能在引体向上拉动作时等长固定住肩胛就足够强大了,那个时候不能指望它们主动收缩把体重拉起来。

出差没哑铃的时候,我用过行李箱,书包,矿泉水桶或者水瓶。也用过水桶、油桶。粗细适合抓握角度也适合的不容易找到,不过强于没有。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\e345aaf1f77d139fe5eec9e0fdc45cb.jpg

(4)弹力带

我有一大堆弹力带。这东西不占地方,不沉,出差也容易带着。据说还有诸多好处,比如不会受到哑铃惯性的困扰;可以始终与动作发力的方向相反,越是动作末端负重越大,而不像哑铃会由于关节旋转导致阻力变小甚至消失,或者阻力的分解与肌肉的方向夹角有变化。

我的弹力带有2类。一种是扁平的,橡胶材质。粉红的,是二猫以前练舞蹈时用过的,最轻。被我扯断过一根,后来又照样买过。面拉,Y字伸展,我在这种强度的强力带上停滞了不止一年。现在也经常回到这种阻力下或者徒手再试,感觉肌肉发力,以及不同负荷下的动作变型和发力差异。蓝色的,是迪卡侬的,扯断过一根,现在的这根是两根打结连结的。橡胶很涩,随便打结以后非常稳定,没有脱开的迹象。黑色的,最重。在最初狂妄的时候我用了一段时间,后来知道动作大多是变型的,没有练到目标肌肉,被更大的肌肉(因此也需要更强度的阻力才对)代偿了;姿态扭曲,还容易受伤。黑色的,拉断过一次。这种弹力带也能和哑铃在一起练,手臂屈或下肢站起时同时对抗二者的合力。已经有几年没有这样做过了。

另一种弹力带是截面圆形,外有保护的编织物,两个末端反折成环,可以连接快挂,用来通过(那东西叫什么来着,像个又粗又厚的海绵圆环)阻力装置钩住房门和门框上方,钩住门把手,或者挂住握柄。橙色20LB最练,现在最常用,练面拉和Y字伸展。黑色的,双折,有时候用于硬拉或俯身(有时坐地上)划船的阻力。

与弹力带类似的,我还有个拉力器,中间金属弹簧连接,两边有方形握环。是大学毕业的时候同学给我留下的宝物,他们希望我能不用背阔肌而仅靠肩胛T字伸展平拉开4根还是5根全部弹簧。兄弟们,至今未能做到,估计以后也够呛。

(5)单杠

室外能找到的单杠越来越少了,原来的一些也拔掉了,换成老年人锻炼的器械。最像单杠的,高度到我的胯骨,用来压腿的?可以杠下屈体,就这样向上拉。整个大学校园,也只能找到两三处。经常一头儿比另一头高,两肩受力不均。通常较细,握着手疼。

家里的单杠,一种是两端有硅胶,通过旋转变长挤压在门框上。握住时要注意用力的方向,别把单杠旋松了。所以我大多数时候只能正握,不能反握,反握会放松单杠。换脸的朝向,空间有限,最高点可能撞到门上方的墙上。

伤门框,我家的门框外的墙已经裂纹了。而且危险,看过在从杠上掉下来摔脑袋的视频以后,二猫妈严令我只能练脚朝下的动作,不得L支撑之类的,更不得把脚抬到头顶什么腿绕身体旋转,否则就把单杠拆了。不敢爆发性拉起,怕掉下来。好在这样的需求也不多,肩胛难以承受。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\80fbfd0e5d593563993fe44b6813d99.jpg

另一种是固定在墙上的,用膨胀螺栓。看起来结实很多,爆发性拉起时也能听到金属的声音,不过似乎并非脱落的征兆。也要小心。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\253b12845ee2f1f48e1a9722ec7e8c8.jpg

我只有这两种单杠。能起到类似作用的设备,还有一根1.5米左右的横杆,通过8号线铁丝临时挂住,可以做脚在地上的仰卧划船。因为杆会转,我的手握力远远不够,所以选择阴阳握,一只手正握,一只手反握,做一半数量再换过来。练完以后从8号线上摘下来。即使团身压上全部重量,人也没有多沉,8号线甚至没有变型的迹象。

还见过室内的内杠,有底座支在地上的,是个架子。架子稍微小一点就挤得慌。即使小架子家里也没有那么大地方,置办不了。

我握力不够,或者手嫩,通常都戴手套练。杠子会因此粗一些,没觉得握住费劲。带胶点的劳动手套最好。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\cfc0f5702dafb7397032fda70e8dc40.jpg

(6)动感单车 和 跳绳

原来双手能计心率,不知道准不准,显示在面板上。面板上还显示速度什么的。没多久面板进了汗水坏了。花钱买了个面板,不匹配。

索性把面板拆了,心率用心率带,速度用室外骑车的计速器。心率带用腕表样的装置查看,后来氧化变性,手表带和心率带的带子都断了。不便宜,没有再购置,改用手环计心率,知道不如心率带准确,而且需要扎紧一点。改为主要以心率作为度量指标以后,连计速器也不用了,速度、负荷,都不重要了。保持目标心率,按预期持续时间,一定满身透汗前胸尽湿。

脚蹬上原带还有个装置,避免脚从蹬子上脱落,还能在提脚的时候也把力传导过去。这个物件有个名目,有专用术语,室外骑车有人因为没及时挣脱而摔伤。我不习惯用,拆了扔了。

骑的时候有时在面前支起个显示器。看电视不行,有些没意思,有些没字幕听不懂。看火车头拍摄的风光片,好像自己就是火车的动力,非常带感。几分钟的骑行计划不值得这样折腾,如果骑半小时,还是很有意思的。

每周骑不上一次,时间不允许,体力也经常不允许。所以,对落灰和闲置不要有负罪感,这是正常的,几乎人人如此。只要练了,就是收获,至于没练,不要心疼和内疚,这种心态不利于继续。我能做到的就是不在上面挂衣服,因为要练的时候摘衣服的这半分钟会阻止我继续。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f69a6c50c5140f089f2fd94f8cf51bc.jpg

跳绳也练心肺,不过只能在室外,需要下楼。我喜欢登三轮跳法,二猫说中考不算成绩,必须得双脚蹦。刚开始我就能跳到及格,后来也还是这样。二猫最初只能跳几个,后来及格容易,优秀难以达到。后来参加了培训班,几次以后就每次都能超过优秀了。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\b69f1ce69169278e9a1f2b5e77a6d29.jpg

(7)俯卧撑架

我有一对S型的,下沉时能更深一些。据说也能避免伤到手腕,因为发力的角度与手掌支撑的俯卧撑不太一样,手腕更直一些,有架子时拇指和手掌间的夹角受力。我的体会是练多了都疼,各有各的疼。

需要小心一点,别在撑起来的时候歪了摔倒。我没摔过,但是一直小心着。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\dee34653ac239e8aced602b2df9966c.jpg

(8)空杆

空杆对我最主要的用途是 深蹲时上举,差不多就为这一个动作。我臂长,肩的柔韧性差,需要1.5米左右长的直杆,短了的话手扣不住。这么长的杆不太容易买到,拖布等常用器械一般没有这么长。最好的是邦哥推荐的白蜡杆,1.8米,可兼练大枪拦拿扎。也用PVC管,更容易找到。软,掰起来阻力不够,不过对手腕更友好一些。

好的杆子都不在身边,手头上有个临时用的。3块钱买的,缠上碎布免得硌手。练身体横向扭转的时候这杆受剪切力轻微地咔了一声,估计有暗伤,可能哪天就断了。果然锯开的木杆不行,需要天然长成的。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\42bedae6784ed76b887a6e6cc405011.jpg

(9)健腹轮

练腹肌的。目前只能膝上支撑,脚支撑漫漫无期。

(10)算筹

练的时候集中注意力在动作上,加上每天每周练的内容差不多,如果没有计数工具,经常忘了练了几组,有没有达到目标。用疲劳程度什么的帮助判断第几组,根本没有用处。

我用方便筷子截断作为算筹,练一组摆一根。再无忘数的担心。

也用keep,找个目标肌肉差不多的动作,不分左右(不然选起来太麻烦),用来计数或者计时。

(11)篮球,网球,硬质网球,狼牙棒 等

篮球,原本是二猫上小学时要求买的,两个。现在我练平板撑或侧平板的时候用来作为下肢或上肢不平衡的支撑。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\421a796d6724d4fb45846215c74ad5c.jpg

狼牙棒,用来滚后背按压。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\67051f6a287a8703ff006cd14e98f14.jpg

网球和硬质网球,用来疼的时候按压。

还有个keep的蓝色小球,也是用来按压的。这些用的机会不多,需要的时候很有效。还有像夹子一样按脖子的。其余的电动敲击工具,都过于柔和,平时用不上,疼的时候没用。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\955987f67fa0cfefdc12ef8b8db48c3.jpg

(12)附,更正上一篇

我上篇提到 饭后老打嗝 举铁。他指出,那不是举铁。我还弄不清楚其中这些区别,对我仍然过于精微,录原文如下,算作对以前错误的更正。

> 饭后老打嗝 健身群:
> 不过我要稍微更正下,我的锻炼方式不是举铁,是在某个动作下能调节负重的训练,且以复合动作(多关节协调)为主
>
> 杨贵福:
>
>
> 杨贵福:
> 这种,我以为就是举铁呐
>
> 饭后老打嗝 健身群:
> 哈哈,举铁在我这是用哑铃或者杠铃的单关节健美训练
>
> 杨贵福:
> 还是举铁的,我都叫举铁
>
> 在下一篇器械里面,我更正一下
>
> 饭后老打嗝 健身群:
> 我也经常自重练习,比如联动全身的手臂外旋外展,短跑训练里腿部的原地提拉下压,这个有空就做,不用担心训练量
>
> 饭后老打嗝 健身群:
> 负重的刺激力量增长,不负重的调节体态、熟悉动作模式,都挺重要
>
> 杨贵福:
> 我现在能体会到不负重的情况下熟悉动作模式了,挺有用的。以前以为没啥用,以为是偷懒呢。

 

按页分割pdf文件为多个

本文介绍把单个pdf文件按页分割为若干个的方法

按页分割以后的每个pdf文件含有1页内容。选择这些pdf中的部分,按 多个pdf文件拼接或合并为单一文件 https://zhuanlan.zhihu.com/p/655675268 的方法,就可以实现从某个pdf文件中选择任意页面重新组合为新的pdf。

方法1 ImageMagick

ImageMagick https://imagemagick.org/ 有个工具convert,适合做各种格式转换,也可以用于切割PDF文件。

用法示例如下,命令行:

c:\tools\ImageMagick\convert -density 300 input.pdf[1] x-%0d.pdf

c:\tools\ImageMagick\convert -density 300 input.pdf[1-3] x-%0d.pdf

c:\tools\ImageMagick\convert -density 300 input.pdf[0] x-%0d.jpg

其中

(1)c:\tools\ImageMagick\convert 是可执行程序及所在路径;

(2)-density 300 是分辨率,单位DPI 像素每英寸;

(3)input.pdf 是待分割的输入文件;

(4)input.pdf 后面的[1]或[1-3] 方括号中是提取的页码或页码范围,从0开始计数;

(5)x-%0d.jpg 是输出的一系列文件的命名规则,x- 1位数字 .jpg。

下述指令

c:\tools\ImageMagick\convert -density 300 input.pdf[1-3] x-%0d.pdf

会提取 input.pdf 的第1、2、3页,生成如下新文件。

x-1.pdf
x-2.pdf
x-3.pdf

方法2 GhostScript

另一个方法速度更快,生成文件更小,文字可选。使用工具是 GhostScript,简称gs,在https://www.ghostscript.com/ 下载。

用法示例如下,命令行:

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -sDEVICE=pdfwrite -dSAFER -o output.%00d.pdf input.pdf

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output%00d.pdf -dFirstPage=1 -dLastPage=3 -sDEVICE=pdfwrite input.pdf

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output%00d.pdf -sPageList=1,2,4-7 -sDEVICE=pdfwrite input.pdf

其中

(1)命令 "C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" 是在我机器上可执行程序的路径和文件名;

(2)输出格式等 -sDEVICE=pdfwrite -dSAFER 和 -dNOPAUSE -dQUIET -dBATCH 等,原样照抄,我们不讨论这些细节;

(3)输出文件 -o output.%00d.pdf 或 -sOutputFile=output%00d.pdf输出文件的一系列文件命名规律,这里是 output. 至多2位数字.pdf;

(4)提取页面范围 -dFirstPage=1 -dLastPage=3 或 -sPageList=1,2,4-7,分别指定起始页第1页(从第1页开始计数)、最后一页(第3页),或者 1,2,4-7 表示 第1页、第2页、第4页~第7页;

(5)输入文件 input.pdf。

附,合并多个PDF文件的方法在这里 https://zhuanlan.zhihu.com/p/655675268

 

多个pdf文件拼接或合并为单一文件

多个pdf文件拼接或合并为单一文件,偶尔会有这样的需求。

有时候是收到一大堆pdf,要打印。一个个打开,再一个个打印,需要坐那儿半天看着和操作,不够优雅。有时候是有一大堆pdf,要结集再发送给别人。

方法1 ImageMagick

ImageMagick https://imagemagick.org/ 有个工具convert,适合做各种格式转换,也可以用于拼接PDF文件。

用法如下,命令行:

c:\tools\ImageMagick\convert.exe -density 300 1.pdf 2.pdf 3.pdf 4.pdf output.pdf

其中

(1)c:\tools\ImageMagick\convert.exe 是在我机器上的路径和可执行程序;

(2)-density 300 是打印的分辨率,每英寸300像素;

(3)1.pdf 2.pdf 3.pdf 4.pdf 是输入的待合并的多个 pdf 文件;

(4)output.pdf,最后一个参数,是输出的单一文件,合并的结果。

这个方法的缺点不少。速度慢,需要几分钟。生成的文件大,比待合并的多个文件尺寸之和大不少,几倍几十倍都有可能。 即使输入文件中的文字可以选择,输出的文件中的文字也不能选择,像纯图片生成的。这也是尺寸变大和速度慢的原因吧。

这一方法的更多细节可以看这里 https://blog.csdn.net/u013919171/article/details/113520520

方法2 GhostScript

另一个方法速度更快,生成文件更小,文字可选。使用工具是 GhostScript,简称gs,在https://www.ghostscript.com/ 下载。

用法如下,命令行:

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=output.pdf 1.pdf 2.pdf 3.pdf 4.pdf

其中

(1)"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" 在我机器上的路径和可执行程序;

(2)-dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite 原样照抄,我没有细看;

(3)-sOutputFile=output.pdf 是输出的单一文件,合并的结果;

(4)后面的所有参数1.pdf 2.pdf 3.pdf 4.pdf是输入的待合并的多个 pdf 文件。

更多细节参见这里

https://superuser.com/questions/54041/how-to-merge-pdfs-using-imagemagick-resolution-problem

补充

如果要打印的是多个word,又或者这些word需要A3纸,而我没有这么大的纸。在这种情况下,我把这些word分别打印到pdf文件。此时不需要缩放,只需要注意不超出边界。打印得到的多个pdf文件拼接/合并为一个pdf文件,打印这个单一pdf文件到打印机时缩放到A4纸。