儿童从零学编程,及2款APP & Scratch

有人说,未来的世界每个人都要会编程,就像每个现代人都会写字说话一样。也有人说,大众是愚昧的,会编程的人群不可能有很大比例。我也不知道未来什么样,但是我知道另外两件事情。一是,程序设计的逻辑与日常和工作中的推理没有区别,遵循和表达流程,在程序设计和现实世界中也是一样的。会编程序的人,更容易相信逻辑,而不是单纯的愿望。二是,曾经,人们认为普罗大众都能说会写--估且不论说写的水平如何--是不可能的。中国扫除文盲也并没有多久,只是大家沉浸在现代化里面一二十年就忘记了原本的样子。多数人不识字因而不能读写家信,集市有专门的人才负责这项工作,这也不过是一百年前的事。如果你认为一百年很久远,那么,我的小学语文老师就讲过,为自己的姨辈扫盲,在锅台、墙壁、门窗上都贴上字,什么东西上就贴什么字,她因此得了标兵。这应该是发生在建国以后的事情。如今,几乎没有人不识字,尽管传闻汉语有多么难学。

刘慈欣先生说,未来的时候,不是挠手机就能活下来的时代。邓小平同志说,计算机要从娃娃抓起。我觉得都挺有道理。

0. 我的入门

我学习编程入门是在高中的时候,1992年左右,使用的机是苹果II、长城6502,单色显示器,一个或两个软驱,高密的是好的,一般是低密的。

教材是 苹果-Ⅱ BASIC程序设计 / 张世英编,北京 : 北京师范大学出版社, 1985,500多页的小册子。

当时最喜欢的有两项。一个是玩现成的游戏,插进软件,似乎要怎么怎么运行,然后有一堆绿色的方块在屏幕上扭来动去,有时嘟一声。同学中的前辈告诉我,那是两个武士在持剑格斗。我完全看不出来,而且确实比魂斗罗之类的效果要差很多。另一个更喜欢一些,就是把书上的BASIC代码录入进去,然后修改,画出不同的图形,计算不同的结果。因为能看到更多可控的因素,所以编程比看不懂的游戏更有意思吧。

1. 失败的尝试

二猫同学在大约五六岁的时候,我尝试了两次教她编程,不怎么成功。

第一次的教材是《与孩子一起学编程》,作者[美] 桑德Warren Sande / Carter Sande,人民邮电出版社, 2010-11。

从第一章或第三章开始。最初的实验是编个程序,能算出 1+2 这样。为避免你误会我的意思,以为是自动生成考卷之类的,具体地说,代码就是 print 1+2这么一行。如果想算 3+5,那就手动再改一下代码。

对于二猫来讲,体验是神奇的。因为除了她,居然还有这么个东西也能算加法,而且计算结果和她的一样。所以,她一直希望,"再算一个几加几"。

然后我尝试教她循环,这就是失败的开始。在循环中,需要要循环变量,需要有对求和连加的抽象表达。我忘记了,连 print 这样一个单词她以前都没有见过。这些全都是新的信息,风暴一样灌进来。她甚至还没有学过连加和乘法。

后来我们说,今天就到这里吧。印象里,她没有特别强烈地要求继续,相信已经有些挫败感了。虽然说,挫败感是只有一定程度投入才能产生的反应,但是我不敢继续尝试了。

另一次编程学习的尝试,是在 ipad mini 里装了个 logo。logo又称海龟做图,基于极坐标或平面直角坐标系,移动海龟光标,指挥它画图。我用 logo 给二猫画了个直线,画了个三角形,画了个多边形,逼近了圈,她试了试改其中的几行,觉得不错,挺神奇。正准备用极坐标画个万花规图形,发现二猫开始礼貌地表达兴趣。

万花规作图,需要极坐标方程,需要一堆代码。更重要的,二猫告诉我,其实从画三角形开始,一圈是360度,每个角应该多少度,甚至走多少步在平面直角坐标系上的含义,这些都是全新的知识。直角坐标系的概念,直到最近2017年初她读可怕的数学系列,才学到了,自觉用在了 scratch 中,极坐标可能仍然没有概念呢。

后来二猫几次主动提出希望再玩 python,我没有想好怎么教学,还是没带她玩。

如果没有学过加减法,如果没有学过角度,那么 python 和 logo 就没法开始。那么,是不是没有这些基础,就任何程序也不能编呢?到底具备什么样的基础才能开始学习编程和逻辑。

约十年前,李记者、典同学、我曾经讨论过很多轮,需要具备什么样基础或者特性的人,才能成长为优秀的程序员。其中,我提到过一个游戏《不可思议的机器》,设计路线让小老鼠躲开猫的追击。有针、弹簧垫、气球这样的道具,它们在一定程序仿真的物理引擎上交互。由玩家触发开始以后,道具一顿乱跳,最后猫失败老鼠跑掉。这个游戏有编程的基本思想,计划、条件、隐含的循环。但是,这个游戏并不需要任何数学基础。所以,不需要数学基础的编程,应该是可能的。

《不可思议的机器》并不适合儿童编程教学。一方面是因为难度偏好,另一方面离程序设计最终功利的目的太过遥远,从游戏里不太容易直接看出与编程思想的对应,我担心这样的技能向真实编程移植可能相当困难。

2. 点灯机器人 (Lightbot Hour'14, Lightbot Hour)

最初我在网上某篇文章里看到 lightbot 介绍,讨论的就是儿童编程。这篇文章一时没有找到,类似于[http://www.chuapp.com/2015/11/25/217238.html]。

lightbot看名字的暗示,程序员应该1小时左右通关吧。实际上,我的体会,比那还要难一些。

我和二猫是在 ipad mini 上玩的这个游戏,刚刚注意到,还有 flash 版本可以在PC机上玩,在 bing 上搜索 点灯机器人,有不少。

玩家为一个机器人制定行动计划,操作它在方块场地行走,目的是把所有的灯都点亮。我玩的两个版本都是8+6+6关。

lightbot

2.1 其中第一部分8关,只使用基本操作,包括 左转、右转、前进、跳、点灯/灭灯。其中点灯和灭灯是同一个动作,如果把灯的状态由灭/亮改为亮/灭。这符合演绎思想的基本路线,由几个基本元素,经过几个基本规则的组合,构造出更复杂的行动--行动的结果,正是意图的目标。这是分解,考察如何把意图分解为若干步骤。python 和 logo 的问题在于,涉及过多的基础知识,因此入门所需要的元素也就很多。lightbot限制动作只有上述5个,是这个游戏定义的,所以不需要基础知识。从现实来的隐喻--机器人会走、会点灯,单纯所以容易掌握。就转向而言,只提供左转、右转,限制了机器人转向的可能只有2种,而不会是360种,所以不需要使用 转向(左|右) 这样带参函数或动宾 (动补?) 的复杂结构,可以枚举为 左转、右转。

在这一部分中,玩家能够掌握 1.顺序执行的概念,2.在每个步骤中可以选用若干语句 (向前、左转、右转、跳、点灯/灭灯) ,3.这些语句只有在特定的上下文中才具有意义,比如在不是台阶的地方不能跳,台阶处不能向前,灯是开关量。

这些都是某些人在学习程序设计中遇到的障碍,并不是像某些一学就会的程序员认为的那样是显而易见的。由原本生活所带来的各种刻板印象支配我们对新学习的知识的猜测路线,信息和手册往往又并不充分,所以猜错几次非常正常。由于程序设计与现实的差异,不容商议地必须完全正确,不少人错到不知道如何继续,挫败感很强。所以,设计 少量元素+简单规则,推演出更丰富的结果,很适合用于了解熟悉构造性的思路。而且,又刚好不是像某些人认为的平面几何那么难 (初中却学得不错?),所以更佳。虽然我猜,lightbot 就等价于弱的平面几何,在抽象代数的意义上上。这是良药何需苦口的典型范例。

2.2 第二部分6关,需要使用子程序 (或称过程?)。逼近或诱导玩家使用子程序的原因是,原来的主程序中,能够放置行动卡片的槽位有限。如果用"笨"办法,那么步骤数量多于槽位,游戏不能成功。比如向前走4步点4盏灯,按基本操作,就是 走1步、点灯、走1步、点灯、走1步、点灯、走1步、点灯,需要8个槽位;按子程序的办法,可以是 主程序中为 P1、P1、P1、P1,4个槽位,P1中是走1步、点灯,2个槽位。游戏在这一关里设定为,主程序只有4个槽位,按基本操作的8个步骤就过不了关。

在第二部分的开头,有图示和文字指导,表示P1可以像基本操作一样作为卡片放在主程序中,并把P1展开表示是步骤的一部分。

在 lightbot 中,P1子程序入口和出口都不带参数。我认为这是对一般编程的合理简化,利于掌握。

2.3 第三部分6关,涉及递归,P1可以调用P1。在 lightbot,很令我意外的,没有循环,只能使用递归完成迭代。典同学会说,这才是合理的思维方式吧。同样由于槽位的限制,如果不使用递归,就不可能完成任务,所以诱导玩家掌握递归思想。

没有递归跳出条件,当所有灯都点亮以后,游戏就通过此关。由于不需要递归的跳出条件,也就没有变量和循环变量存在的必要。

游戏通关以后可以申请电子证书,看起来花样繁复,很值得一显摆的样子。可以指定把你的名字印在上面,不过似乎不支持汉字。

3. Robot School

单位党支部组织生活,会后的路上同事们和蹭车的我学术交流。朱老师告诉我还有个游戏也很好,Robot School,也是在 ipad mini 上玩的。

乐高风格,科幻风格的流程图 (或文字) 展示代码。机器人在玩家的计划下,穿过场地去找电池充电的故事。场景三维的,有透视效果,转起来的时候我有点晕,但是没吐。一共9页,共45关,我玩了大半宿,可能4个小时左右,挺有意思的。

school_flow

游戏有这么几个特色,因此适合初学者上手学习编程。

3.1 受机器人能量 (步数)限制,类似于 lightbot 的槽位,逼迫或诱导你不得不选择新学的手段完成任务。

在软件工程科目中,同学们通常都会有疑问,我用更基本的方法明明能做的题目,为什么非得逼我用你的某种方法。教师强迫使用,会让同学们形成对威权的服从和避免思考带来的伤害,也不会信服新方法就多么好,尤其在问题规模并不大的时候。所以,适合的限制,使得使用旧方法一定不成,就不是人为的,而是来自自然力的限制,让人舒服多了。

游戏里通常有这样的设计,比如《帝国时代》的任务里,明明你的那个兵种这么这么就能赢,但是他刚好那天把刀放在了家里,只能徒手格斗。这种限制,如果你能接受作为游戏一部分,而不是故意难为你,那么还是挺有意思的。如果你不按受,那么感觉就类似于足球场上22个人抢那么唯一的一个球,多发几个不就行了嘛。

school_code_view
3.2 循序渐近地引入知识。Robot School 比 lightbot 的关数更多,涉及的技术手段也更丰富。在这种情况下,逐步而不是一次性引入所有操作,就非常必要。

基本动作涉及:行走 (距离),转弯 (方向),开门,开盒子。这些动作帮助掌握顺序执行和多种语句 (服从目的或遵循上下文环境)的选择。

逻辑控制包括:循环 (次数),在循环中行走、转弯、开门,多重循环 (在循环中循环)。在循环中插入动作,不像 lightbot 中那样槽位明显,而是可以扩张的隐含的语句块。

循环的引入也是个特色,通过 碰撞检测道具 (每步检测),机器人捡起那个道具以后,肩膀后面会多个像火箭炮一样的装备。到最后可以装上3门之多,各有用途。每步检测,表达的是循环,检测磁撞,相当于 if,连接在一起就是 while (cond) { do something; }. 这让学习者对于 while...do 中到底发生了什么,有了可视的认识,更容易想像。

大炮筒一样的道具,除了碰撞检测,还有颜色检测。最初只是根据颜色作判断 (引入判断分支,然后引入判断嵌套),后来颜色可以临时存储在变量中,等到以后再提取出来使用。

大炮筒道具,还有障碍距离检测,检测的结果也可以存入变量中。这样,又引入了多个变量以及变量命名的必要性 (不涉及变量命名的易读易记 convention,仅用于区别三两个变量)。

进一步,变量需要做简单的算术运算 ( des1 -3 这样的),从而引入了表达式,然后把表达式置入检测条件。

最后阶段,引入了一个障碍物,可以搬起来、带着移动、放下。这个障碍物的引用,看起来是前面所有知道的综合应用。在多个障碍物的关卡中,受能量的限制,玩家需要把 (1) 多次搬移砖块, (2) 用相同而有略有差异的语句表达, (3) 然后放入循环中,把差异作为循环中的变量。这要求在流程中发现模式,并用抽象 (abstract/common) 的方式表达出来。

school_code_view_large
最后一关,看起来阴森恐怖,是个迷宫。迷宫并不会变,但是能量不足以供你根据迷宫的样子写出计划,所以,需要写出能走出迷宫的算法。二猫说,这个我从一本书上看到过,如果走不出去了,就沿着一侧的墙走。我听说这叫做走迷宫左手或右手法则,用 Robot School 流程图的面板写出来不短,所以完成以后颇有成就感。

4. Scratch (不是移动端APP)

以上这些游戏,二猫有的在我帮助三两次后完成,有的还在进行中,兴致盎然。Scratch现在自学加我的帮助,玩得也很高兴,并且是这里面最喜欢的。

有不止一位同事朋友向我推荐过Scratch,大名鼎鼎。最初我自己尝试的时候体验并不好,因为网速。后来下载了PC版本,用起来倒是流畅了,如果不分享作品到官方站点,可以容忍。提醒你时不时更新一下。我曾经遇到过一个非常费解的变量和循环的问题,感觉应该可以那么用,虽然教程和手册都没有提到。请教了三两位同事朋友,等答复期间发现,是我的 Scratch PC版版本低,升级了以后毛病全无。

有些同事朋友的孩子直接使用了英文版,或者英语才是他们的母语,教程和工具都用英文,更方便一些。就二猫而言,做了几个实验以后,仍然更喜欢中文版,虽然她也认同中文版的翻译错误,比如 "mouse down" 翻译为鼠标下移,而其含义是鼠标左键单击。

二猫第一次接触Scratch时小学一二年级,做的是小猫跳舞。没有看教程或视频,带着她做了一遍,过程中讲解需要的几个部件,然后她自己修改和重做。作品是一个角色换几个动作 (循环10次) ,换动作的时候放一小段声音,看起来像跳舞的样子。二猫认为角色动作生硬,更像是体操,但是觉得挺好玩。

最近让她读了一本中文教材,然后她自己照做和修改了一些实验。教材是 Scratch儿童编程乐园,凌秋虹 编著,江苏科学技术出版社。连同网上还有些中文的手册和教程,我自己都没有读过,没法推荐。英文的,据说 youtube 上视频教很多,官方站点上也有,但是,都是看不到的。英文手册可能也不错,不过,如果你是程序员打算教孩子的话,我猜不用太看。容易学会,困难的是教会孩子。

二猫看了教材以后,自己选择了实验的路线。我认为设计合理,略难,但是可以承受,没有干预。每个实验她要求我帮助一至两次,然后自己就能完成。

(1) 小猫和小猴踢球,重复几次,每次说一句话 (文字+气泡) ,最后一下球踢飞了。我刚开始看踢来踢去,心想,这什么破玩意,也礼貌地表示挺好。最后球踢飞那下,我哈哈大笑。不错。

不得不说,经常有些实验设计得都太无聊,指向性太明确,大大地降低了学习者的兴趣。有点起承转合,明显感觉好多了。

ball

(2) 打地鼠。场景上挖几个洞,地鼠一会儿出来一会消失。你操作一个大红槌子,砸,砸到就加分,还"吱"一声。

mouse

这个实验作为第2个,对于二猫来讲,我觉得有些难。实验操作并不像有些人想的,照抄一遍就一定能成功。整个实验如果有20个元素参与,加上这些元素间的顺序和关系,一处错误,程序就跑不起来。找起bug来,对能力的要求远不是抄实验能解决的,而是必须理解实验中的每个步骤应有什么效果。对照教材仔细核对这种事,是不行的。

不过,这个实验的难度仍在可承受范围内。我简单提示两次,二猫迅速找到bug,解决了。实验完成后,她要求玩一会儿。这是合理的诉求,我经常做完程序玩上几遍,再玩上几遍。既找bug,也满足成就感。好像实体的玩具,做好以后,一定要多把玩几次,才过了瘾,虽说做的过程比玩要有意思得多。

(3) F1赛车,车自动向前走,键盘控制方向,躲避障碍物。有了打地鼠作为基础,这个实验照书独立完成,毫无难度,不需要我。

f1
(4) 飞机躲陨石,声音控制,声音大就向上,声音小就向下。二猫解读代码 (而不是根据实验效果) 指出,因为有"-3",所以如果没有声音,飞机也会往下掉。

声音控制很难,二猫又把代码改为用键盘控制,还发现了书中代码的冗余部分,删除了。

plane
(5) 画笔,如图所示,二猫的程序,二猫用程序画的。

painter
(6) 迷宫,正在做,玩家操作角色走迷宫,共10关。二猫设计了10个按钮,不用的时候隐藏起来,我启发后准备修订为用变量,表示第几关、过关颜色、死亡颜色、场景,每过一关,表示第几关那个变量+1。

maze
Scratch除了两个机器人APP以外的特色以外,可以支持功能更强更复杂的定制脚本 (比如10关迷宫) ,也可以完成非常简单而有趣游戏 (小猫跳舞)。所以适合零基础入门并可以学习到相当难度。

Scratch使用角色 (及角色的动作、背景) 表征变量的状态,支持循环 (和条件侦测) 、判断、变量、链表、表达式等。二猫问我,"能用Scratch做个Scratch么?"我猜能,是通用图灵机吧。

5. 其他

小车循迹、走迷宫比赛、机器人灭火 (蜡烛)等也有不少,我接触不多,只听说过有 飞思卡尔、CoSpace、乐高、Scratch、FIRST、FRC。还看到过小学门口有玩魔方的"星门"。

6. 基础理论

cat
春节期间,应二猫要求,给她讲过二进制入门。就是那个著名的游戏和变形,15
个姓氏写在4个卡片上,卡片的权重分别是8、4、2、1。玩家说出姓氏在哪几个
卡片中出现,但不说具体姓氏是什么,game master累加卡片权重可得数字1~15,
查表就知道是哪个姓氏。

下图是我给二猫讲的图示。

name1

name2

下图是二猫自己发挥的新创游戏。

cube

这也许应该算是数学吧,跟上述编程的逻辑和推演,还有很远的距离。

下图是洋葱表皮细胞,钢笔水染色,放大500倍 (带USB的显微镜) ,可以看到细
胞核。与题目无关,就是好玩,供你参考。

onion
————————————————————

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

纸上得来终觉浅,构建之法东北师大站2016秋季学期

2016年,构建之法教材在东北师大使用了两次。上学期是软件项目管理,下学期是软件工程。引用郑同学的话,这两门课占用了我几乎"全部"业余时间,可见的数据是我读书和看电影的数量都锐减1/4,还挤压了项目和工作时间。

最主要的原因是基础太差。不是学生的基础太差,而是教师,就是我,基础太差。进步缓慢而艰难,耗时巨费,我不禁感慨,真理之刃难以逾越。但是不进步,耗时就更多。

邹欣老师提到过,有些教师工作很多年都没有什么进步,一直就靠吃年轻时学的那点老本过活。后半句似乎不是他说的,而是我脑补的。我一直以为他说的是"别的教师",我也可以跟他站在一起鄙视一下。后来我认识到,我站在他的对面,站在这些教师之中。

关于教学,以及其中的工程思想,我本学期与邹欣老师交锋凡约五战,皆败北。每战都让我认识到自己知识结构的缺欠,认识到自己有多差劲,因此有多么大的空间可以进步。我原以为,四十多岁不会再有什么进步了,是个成熟或腐烂的工程师。每战被斩杀那一刻,都有一种感觉,"原本是这样"。很是意外。

李笑来老师在宣称全栈工程师可以速成以前,著有《把时间当作朋友》,那是一本相当不错的书。他提到,当一个人学习了新的知识,他就重生,成为一个新的人。重生,是一个痛苦的过程,因为要挑战既有的方法,那些舒服而证实有效的路线。据说还会更改大脑中神经的结构。

构建之法东北师大站2016秋季学期,于我而言,正是重生。

感谢教诲,邹欣老师。

1. 不择类而教

教师可以为自己教学失败 (或者挫折)找到各种借口。有的,还是非常正确的,至少从统计上。ACM比赛听到过很牛的教练说,"优秀的学生不是教师培训出来的,而是来的时候就很优秀,教师只要不把好学生毁了就行。"构建之法教学群里的也有不少教师提到,我们的学生是三本的,我们的学生还不如三本的呢,我们这届格外差格外奇怪,格外有特殊的理由……各种理由,不一而足。总之,"非战之罪也"。这些抱怨学生的教师,也包括我。

我说过,有一些学生,应该放弃,这样能把更多精力集中在优秀的学生身上。我认同过,那些没有足够努力的学生,他们首先放弃了自己;把他们视同成年人,应该尊重他们放弃自己的意愿。

跟孙师妹聊天的时候,她曾经说过,应该关注一下某几位同学,他们有努力做项目的意愿。我当时说,我没有看到他们的意愿。几轮讨论以后,我问孙师妹,"你说所有的人都适合科研么?"她说,"当然不,有一些人是做不了科研的。"我得意地笑,"那么你为什么认为所有的人都能做项目呢。"

得意,就是我想到这些好词,噎你一楞时的感受。但是这些小聪明有什么意义呢,能促使学生进步,还是鼓励学生努力,或者能提高努力人数的百分比。只不过,帮助我暂时逃避这些问题罢了。这些小聪明,就像小流氓以武力压制,让你暂时不敢发声而已。

古人谈到师生关系的时候,提到过,学生择善而从,家长择教而教自己的子女,但是,没有提到过教师可以择类而教。

选择,是一种评判,是对既有结果的认可或者否定。不过对于学生而言,否定既有结果,是没有意义的,甚至是一种伤害。

关于评判,《构建之法》中提到,对事 (不是对人)的评价,有三个层次。第一层是就事论事的,谈事件的后果和你的感受。比如,"你这篇文章写得够烂啊,读起来真是不知所云"。第二层是动机和习惯,"你文章怎么又写得这么烂,你有意恶心我吧"。第三层是本质和固有属性,"你们东北人写文章是不是都这么烂"。当达到第三层的时候,已经没有必要再讨论,因为我再怎么努力,也不能脱去东北人这层皮了。

我们这些教师,做的正是这样的事。因为学生很烂,所以没有教好,好吧,我们没有了任何责任。那些优秀的学生呢,我们口口声声说跟我们也没啥关系,可以为什么喜滋滋坐在那里接受感谢呢?

作为教师,我们是否为学生修正学习路线,使得学习的初期阶段更加平缓一些。是否针对学生当前的基础,就他们可能达到的程度做了预估,并设计成长路线和成就系统。设身处地,你是不是有足够坚定的意志品质能够坚持下来,如果能,你采用了什么方法缓解痛苦。

有个心理学实验是这样说的。一群孩子 (不是通常行文中的大学生那么大的"孩子",原意指三五岁那样吧) ,实验人员发给他们一块糖,并且承诺,"如果你现在不吃,过一会儿会再给你另一块。"如果你读过关于这个实验的报道,已经知道结局了,那些能够忍住不吃糖的孩子,后来成就更大一些。

还有一个细节,我们时常忘掉。那些忍住不吃糖的孩子,不是长了不同的大脑,或者有更优秀的血统--而是,他们想了各种办法抵制诱惑。有的孩子,把糖放下去玩些别的。有的孩子,开始幻想两块糖的幸福。有拿着糖大哭,就是不吃,还有闻糖的气味的。

不是意志品质,无关道德,只是更有办法。我们为什么常常把明明是方法论的问题非要归结到价值观或者品质。这难道不是我们作为师者的无能么。如果不是本质因素,那么教师有责任设计路线,帮助学生的成长。

这也是我为什么厌恶某些励志 (?) 文章和传记津津乐道各个思聪成才的路线,八卦将门虎子的成长。因为那对于我们这些人没有任何价值,我们已经身为工农的后代,除非死了再来一次,都没有机会借鉴。这是对本质属性的否定。

这也是很多同学放弃努力的原因。同学们通常并没有深刻地达到对社会的绝望,而是对自己努力的结果的失望。有报道提到上述心理学实验还有另一部分。实验人员对孩子们承诺,"会有另一块糖。"A组同学如约得到了糖,B组同学每次都得到"抱歉,糖发完了。"如是者三,B组同学再也不相信实验人员,直接把糖吃了。不少同学所受的,正是这种习得性无助的训练。

习得性无助的结果,如果作为教师得出这样的结论就完事儿,那么,还只是借口而已。你,能为这些同学做些什么。

有的教师可能会说,那么多同学都这样,我能怎么办呐。若干年前,我对李记者说的话,可供你借鉴,"如果你看到一两个年轻人不顺眼,那么可能他们确实有毛病,如果你看整整一代人都有毛病,那么你就是老了。"如果个别同学有问题,你还可以作为理由,如果大家都这样,这就是你的岗位存在的原因了。

没有方法的"爱"和其他情绪,比如焦虑,比如抱怨,都是耍流氓。工程技术上,如果没有一条可行的路线,就不要再扯什么了,都是扯淡。

设计一条学习曲线,更加平缓,更加为这一届学生定制的。

--你也不知道应该怎么做?

去学习。去看优秀教师是怎么做的。去向前辈学习。

--你已经学了?

证据呢?你学习了多久,看了几本教育理论或实践的书,写了多少笔记,实践效果……不好是么,那么记录呢,反思呢,为什么不适合?是不是你的学生刚好特别奇特,与全世界全国别的地方的学生刚好都不一样。

--累?

你怎么不辞职呢。

以上这些问题,不是问你的,是问我自己的。下学期,我准备先考试了解情况,预估学生的代码能力和学习意愿的程度;如果基础差别较大,分类选择不同的项目。下学期,更注重成就系统,更注重减缓学习曲线的坡度。

2. 学生参与

长久以来,我讲课的时候就是满堂灌,学生累了的时候,我就讲段子,尽可能跟课程有关。20年前,我曾经非常自豪的是,能够一个长复句里面好几个子句,逻辑关系清晰,措辞准确。这样的句子,讲完以后甚至得到过学生的掌声。不过后来,我开始有意大量使用短句,删减子句间的连词,重复某些句子和词、有意制造错误作为笑料。

因为学生是来学习的,不是来看相声贯口的。教师表达得多么熟练和精彩,也只是手段,不是目的。凡不利于学生掌握的,都不是好的教学方法。

我一直使用的满堂灌方法是件累人的事,无论对学生还是对教师。我回顾过自己讲 C++构造STL时的录屏,确认自己作为学生跟不上自己的讲课速度。

在本轮课程中,按邹欣老师建议,我有意注重了学生参与,效果出乎我意料的好。特别希望习惯满堂灌的理工科教师参考。

首先,我们必须先讨论的是,理工科教师通常认为学生是无知的,所以才满堂灌。事实上,在我的大学和研究生阶段,见过教师课堂提问的非常少,算下来可能不到20次,其中还有不少纯粹是教师提问-学生回答-教师评判 (批判?),学生没有多少参与感。理工科教师对于教育学和教育技术中提到的各种有爱的理论,没有什么兴趣,甚至普遍地对教育方向的教师也没有什么正面的兴趣。

但是! 至少理工科教师都能接受的是,你写一黑板一黑板,学生不掌握,教学也不能算是完成了。什么,你说大纲要求?我初中的时候就跟同学们一起问过英语老师,是大纲学习,还是我们学习。所以,如果学生最终没有掌握,什么也是白扯。而如果不提问,学生不参与,教师根本无从知道学生是否掌握了。作业的反馈来得太慢,一次课90分钟,点评作业是半周或一周之后的事了。学生可能都忘记当初为什么那么答了。

那么,理工科教师的问题还在,学生啥也不懂,能参与啥。

在本轮教学中,我们尝试了 学生参与评分,评论其他同学的工作,评论其他小组的工作。学生可能仍不能充分熟练地运用方法,但是对于运用方法的结果、运用方法是否正确,是可以评判的。这种评判本身,也能帮助学生提高对方法的认识,包括方法中的步骤、指标、意图。

令我惊 (第一次见,是挺吃惊的) 喜的是,学生评分的综合结果,与教师 (假设就是正确的)的认识高度一致。这说明学生对于好坏的认识掌握得相当好。有些评分在群体中有相当程度的分裂,我在事后回顾中也给出了解释,因为被评的作品没有非常完美的,在各指标分布中刚好都很"偏科"。在未给定各指标权重的情况下,即使专家也会表现出偏好和犹豫,学生们的表现并没有更差。

此外,为提高教学效果和评分结果的确定性 (我猜测学生的评分如果与大家接受,会较有成就感),把总分拆分成若干指标,甚至给出指标的赋值条件,效果更佳。这可以给出文字的spec,口头引导的效果也不错--我不得不感叹学生们对语言中的暗示普遍地比我掌握得要好得多。在各种评审中,你们不也时常给定分项指标,然后要求专家顺从我们的意愿么?倒是鲜见专家说,指标体系和赋值权重本身就有问题。这样的专家偶尔也有,后来你们就不找他了。

学生们对评分表现出了高度的热情--也包括负面的情绪,当被同学评价的时候。但是负面的热烈情绪也是怀绪,表明并促进了学生对课程的参与。事后表明,这些负责情绪一点儿也没有像他们当初宣称的那样伤害他们幼小的心灵和同学关系。

对评分的高度热情表明,做主人就是好。《国际歌》唱得好,"我们要做天下的主人",嗯。

本轮授课,没有出现学生参与 (评分) 大幅偏离教师预期的情况。即使有这样的情况,也应该从正面价值上来看待。如果没有这样的反馈,那么教师就无法知道学生掌握的偏差,所以矛盾早暴露是件好事,有利于了解教学状况。

唔……学生参与,有过一次偏差,不大。在课上讨论黄色领跑衫到底奖励给哪些同学和哪些团队。有同学提议,还剩6件,每个组一件;还有同学提议,剪碎,分数高的分得大块。前者是平均主义,后者比我年轻时还要激进。我行使教师权利,同学们投票表决时强行去除这两个选项。为什么我可以行使教师权利,面对这么民主和有权利意识的一代年轻人?非常简单,我说,"因为领跑衫是我的。"

学生参与的一个重要因素,需要教师注意的是: 学生参与这一行为本身,不应被评价。

无论学生不喜欢参与,还是学生参与时的评分没有按教师的路子来,甚至学生对教师引导参与的否定和评价,都不应该被评价。学生为什么不喜欢被提问,为什么不喜欢参与,最直接的原因是评价。教师或者负面评价 (这是通常的合理的选择,因为"学生啥也不会"或者"学生来的时候啥也不懂"),或者幼稚地正面评价("我爱你们","同学们的回答都行好,但是……"),或者言不由衷冷漠对待 (以前的见面问侯话"你吃啦",和英语的"how are you",回答会被忽视的那种) ,都能被学生明确感受到,并作为不想再参与的原因。

学生们连评价别的团队的产品都没有兴趣,不想去看那些作品都是什么,做成什么样,遇到过什么困难,如何克服,也不想表达他们对这些产品的评价。因为学生们明白这是教师在诱导,然后会评价他们的评价,而教师的评价,总是负面的,或者往正面引导。

不要评价学生的评价,这不会让他们的评价更好,只会连评价也得不到。

所以,目前我尝试的学生参与是,学生在规则之下,评价而不被评价。在学生评价他人中,教师了解教学效果,也促进学生掌握知识和技能,了解好和坏。

3. Spec

Spec 是工程技术中常用的术语,译作 规范,或者 规格说明书。用户的需求或者意图,领导的行政意图或者任务目标,教师的教学目标,当表述为 spec的时候,只要执行者的产出完全与 spec 相符合,那么最终的执行效果如何,与执行者无关。由spec的制定者保证,只要符合spec,就应该符合目标。

Spec 是许多条目 (也包括条目间的关系),是可量化考核对比的。

在学期初的时候,邹老师指出,我的作业要求不够具体。我当时很不服气,想的是,难度这些这些还有这些,不应该是显然的么,如果学生连这个都做不对,连这个都不知道什么是对什么是错,那还怎么学啊 (还有,以前咋学的啊)。

邹老师大半夜跟我微信,他耐心讲解,我垂死挣扎。最终我意识到,我是错的。

在教学以前,尤其是没有示范和模板的情况下,教师不应该假设学生是积极主动的,不应该假设学生已经具有较高的工程素养 (但是应该假设他们将可能具有较高的工程素养),不应该假设学生能在教学以前就知道什么是对的什么是错的,好像教学只是为了让学生了解到如何走向对的。不是这样,学生最初连什么是对,什么是错,什么是好的,应该以何种方式呈现,这些都不必知道。

邹老师对于spec的要求,第一个让我想起的是一个反面的例子,阿里的月饼事件。在这一讨论起来朋友能够绝交的事件中,我的立场是,劳动者被辞退应该给予补偿。对于"价值观"应该多大程度上约束员工的行为,并在经济利益和雇佣关系上起作用,我非常怀疑。如何做人,如何才能不吃亏,不是在雇佣关系中应该讨论的。不教而诛,这是较轻的评价。

如果我是企业的主人,那么我有决策权,如果我被教育价值观,那么我就不要以主人要求我。一方面要求我把大学宿舍当成自己的家,一方面教育家里就应该如何如何干净,那就是把我的宿舍当成你的家。一方面告诉我是企业的主人,一方面解雇我,那只能理解为"主人"二字只具有比喻义,而比喻到底啥意思,那是仁者见仁的。我不能忘记与说书人先生、李记者、典同学在小饭店里就"主人"二字的争论,我是认真的。

我如此苛求集体对于个体的spec承诺,但是当轮到我的头上的时候,当轮到我来制订spec的时候,我几乎要搬出"美"和"艺术"这样的字眼来为自己辩白了。真是无耻。

真是无耻。邹老师指导我时,我马上就要为自己没有写出好的spec给学生的时候,突然想起了这个案例。我这样评价自己,真是无耻。一贯要求别人的标准,到了自己头上,就双重标准了。

有了spec,学生就不会是无所适从的状态,而是可以利用现有知识和训练检验自己所做的答案到底有多么地对,而不是无助地等着来自教师的否定。有了spec,学生最初就有一个前进的方向,那样就行。有了spec,学生就知道如何分配时间和力量,了解哪些是教师在教学中希望学生更重视的部分。

后来,宝玉同学展示了美国教学中作业的spec范例。邹老师就那个例子指出,spec降低了对学生非专业训练以外的要求。我觉得,没有spec并不能提高学生的工程和学科素养。事实上,工程和学科都要求学生在未来工作在spec之下,阅读和遵循spec是素养的重要组成部分。并且,spec恰恰一定程度上体现了教师的素养 (之差,就我而言)。

有的教师可能会提出,某种能力或者什么是不可能 (或者不容易)度量的,只能教师主观感受,而不能写成spec。那么,你愿不愿意明确写出来,"这一部分由教师主观判定",或者,凡是不写spec的部分,就默认"这一部分由教师主观判定"?反正我不敢。以前我的作业要求,大抵是给出应该如何,那样就能满分,但是更差一点,我就完全不能接受。这种二值化的评价体系伤害了不少学生,老师差劲,现在才明白这些,非常抱歉。

《度量》一书作者提到,凡是不能描述的 (指给出模式,有哪些参数) ,都不能度量。凡不可说的,都不是科学,更不是技术或者工程。科学、技术和工程,显然有不可捉摸的"美"存在,但是并非你我能够接触到这么高深的程度。这让我想起刚会写 hello world,就指责微软编译器垃圾。

《中国软件工程学科教程》一书指出,估算和度量是工程师的基本素养。

可度量、量化,是我们希望学生能具备的素养,轮到自己头上,却经常懒惰。

说起价值观和对学生初始状态的假设,我想起一个案例。在某个群里,有人提到某些人素质低下,在麦当劳点餐居然也不排队。这位叙述者还提到,因为服务员一直拒绝这位不排队的顾客,所以好几位应该排在他后面的人已经点餐完毕,也就是说,不排队比排队更慢。我特意拐到后面这段关于利弊的分析,是因为这是种个常见的错误讨论模式,本来想讨论的是价值观 (善恶) ,却转到了利益上,再继续的话,就该说到因果报应了。利益选择错误是愚蠢,与善恶无关。

群里不少同学开始指责这位顾客,我有个不同的看法。那位不排队的顾客,可能根本不知道排队这回事,在他所在的文化里,可能从来没见过排队,或者排队从来没有得到正当利益。有同学补充关于上公交车的情况。在资源极度贫乏的情况下,争抢和丛林法则才是常态。

如果他不知道排队这回事,那么道德谴责就毫无意义。不知道而不排队,不是不道德,而是不知道你们的道德是这样的。你不知道,甚至入乡也不想随的俗,不也很多么。这时候我们就希望移风易俗。

很多学生初来时,跟这位不知道排队的顾客一样。他只是不知道,不知道的人是无辜的。

借宝玉同学提供的这份spec,邹老师也让我认识到,一直以来,我所进行的几乎是单纯的"选拔",而不是"教育"。谁给了我资格去评判,而不是培育。想想被我残害过的那些同学,真是惭愧得抬不起头。

在工作中也是一样。当领导者拿起价值观的武器,而不是方法论,那就是他在宣告管理无能,员工开始无所适从,开始揣摩上意,一部分人开始举起道德大棒,开始朝向过份的标准努力,成为于事无益的仅道德上的楷模。

我是不是道理讲得很明白?在邹老师第一次指出我部署的作业没有好的spec以后,又指出了两次。道理明白是一回事,执行的时候就是另一回事了。非常简单,在后面那两次,我忘了这个道理。这就是下一个标题。

4. 纸上得来终觉浅

小学四年级,我转学到东风小学。语文进度刚好落了几课,新学校在学《瀑布》。老师上课点到我朗读,然后想起,你还没学过呢。我说,没事,字都认识。

我自小胆大,胆大到大合唱老师单独要求我声音小点。所以,我毫无畏惧地开始朗读,声音宏亮。你可以想像老师赞许地点头,她可以当着我的面告诉过我爸,"先试读几天,不行的话不要"。接着,我读到"千丈青山衬着一道白银",全班哄堂大笑,笑声之大,我想继续大胆读都不可能。大家笑我读错了,把"衬"读成了"衫"。而且声音宏亮。因为这两个字长得很像,而且总是成对出现,我把它俩记混了。

这样马虎丢三落四的错误,跟胆大一样,一直从小伴随着我。我妈一度认为我以后完了,好在后来表明,凡经过专业训练的部分,这样的毛病就不常犯。

在本轮上课的时候,邹欣老师非常奇怪,我怎么会把评价体系(分数)的计算方法搞错了,而且不止一处,不止一次。质疑可能归结为,1.这怎么会错呢,2.知道了怎么还错,3.怎么还会再错。

如果归结为不认真,就是品行或者态度了。我为什么要对自己投入这么多时间的课程持不认真的态度呢。只是水平使然。

一方面,我读过了评价体系的部分,读过了就只是读过了,没能深想。这里有比忽略评价体系更严重的错误,我从来没有意识到对工程师的评价是工程 (和工程管理)的不可或缺的部分。这一轮课上下来才逐渐意识到。另一方面,我从来没有关注过这类计算。从工作到现在,我没有看懂过自己的工资条--并非够花,而是无论我关注与否,都不影响工资的多少,甚至工资条也不会给我努力的方向,评职称倒是明确给出了努力的方向,也没见我有多么重视。所以长期以来没有实践过计算能力。我一直以来,认定斤斤计较投入和利益是道德错误的,但是完全忘记了我既不应该以自己的道德要求别人,也不应该忽视利益引导作为工具的重要性。

好在,《构建之法》可以不止读完就拉倒,幸而有教学团队和邹欣老师指导,能及时指出我那么简单的错误--居然没有读懂。这时,我就想起"衫着一道白银"的往事。

纸上得来终觉浅,对于我这样的庸人,如果不亲自实践,如果不通过实践和专家指出错误,读书也就是读书,看了一些字词而已。为什么在观点幼稚甚至错误的时候也要坚持写博客,因为读了的书,实践过的生活,都要以"立说"的方式检讨,才更放心。所以,对于我们观点的评价,无论正面还是负面,都正是进步的机会。

另一个需要实践的案例,是在本轮课程中的评判作业工作。每周的作业,我需要评3个小时左右,量大的时候达到6个小时。准备下一次课程一般需要6个小时。上学期也统计过,每篇博客快速读完加评论需要10分钟左右。这些数据不是臆测的,而是实测出来的。它指导我能预估还有大约多少时间能够判完作业,从而安排工作时间。

有的老师和同学可能马上就想到某个方面可以提速。提速作为一个总体的态度,作为领导提出尚可,作为执行者,如果只是态度,除了徒增焦虑以外,毫无价值。

什么样的方法会有效,哪个部分可以缩减时间而质量的变化可以承受。不亲身实践,就只是想当然耳。我们经常见到同学们表态、表决心、检讨,我们知道这些都没有用。如果没有具体和解决手段,下次也就还是这样。

知乎上有位大侠指出,考试时你容易马虎错的地方,就是那个地方具有容易马虎的特性。如果你仅仅痛哭流涕,下次也仍然容易马虎,这是那个地方的特性,不是你的特性。那位大侠指出,你应该想点办法,避免这个特性起作用。我猜痛哭流涕有利于每次你多注意一下,验算通常也会有相同的作用。

到底哪个地方可以省时间,另一位知乎上的大侠 (轮子哥?)指出,应该先做profile,然后找到对性能影响最大的部分 (先WBS分解流程) ,找解决手段,找工具,提高那部分的效率。

我总结了核算作业成绩时容易出错的几处,改EXCEL、改公式、改我的操作流程,并用每次 (以及下一学期)的作业评判时间和出错情况检验。

类似 工作分解结构(Work Breakdown Structure),profile (跑代码,测比如每个函数的次数、时间)这样的工程方法,不仅在工程本身中有用,在工程管理中也一样有用。在我们日常生活和工作中也可以用。有同学可能已经支起眼睛准备质疑,那还叫生活么。凡是你打算提高效率的,凡是你打算享受提高效率而不仅享受过程本身的,都可以采用这种方法。

这些方法对工作有效的原因,是因为这些方法都尝试度量。

5. 延误作业和点评

本学期,以及上学期,我上课的一个重要问题,是出差导致判作业延误。学生于没有得到点评,既不利于及时修正作业中的错误,也不利于学生及时认识到老师来真的,从而调整时间认真对待。

出差很难避免,即使没有其他的工作,大学教师本身承担科研工作,学术会议也需要出差参加。我的具体问题是,并非出差疲劳,而是我的视力不足以看清笔记本,前倾到能看清的程度,工作不了几分钟腰突可能就要犯了。在单位和所有我长期工作的地方,都使用了显示器架,显示器比键盘更靠近我。这是领导对我的关爱,也是我身残志坚的表现,嗯。可是出差时就不具备这个条件了。

目前打算出差时用 pad 看,用纸记录成绩。还没有实施,不知道效果。本学期打算过采用这套路线利用碎片时间判作业,后来也没有做,因为没有机器的时候,不是在开会就是在走路,不然就是校车里。人生艰难。

还不知道怎么解决。不过与邹欣老师在群里建立的氛围不同,我不认为罗列困难是错误的,这是走向解决的第一步。即使解决不了,也不会有负面效果。

6. 价值观

价值观,是我们会这样做,我们希望这样做。你不这样做,也并不会受到惩罚。不妨,理解为"文化"。

6.1 一切都需要公开;公开讨论,公开否定

同学们一直以来生活在一个和谐到不宜公开指出别人错误的文化氛围中,他们普遍认为别人指出他们的错误是冒犯性的。他们更习惯于"有问题私聊",如果公开讨论就是挑衅。在我的同事中,这种文化也普遍存在,他们对于我和我的学生互相激烈指责,然后欢乐地继续工作非常不解。

有些人遵循中国的宗法制封闭的一面,援引了"隐私"这样的概念,在公开领域中隔离出"不可讨论"的暧昧文化。但是在教学中,公开的那一部分中,不应该有隐私。

整个学期,我反复重申这一价值观: 一切都需要公开。拒绝项目版本控制私人拥有同时把我列为成员,拒绝只是私下回复我指出的问题,希望教师和专家指导在博客正文修正而不是单纯回复。我反复重申,所有的专家评论都有资格,并且是善意的,没有人闲得没事花时间来冒犯你。

我充分暴露问题,把在教学中遇到的问题在群里向各位专家请教,也是遵循这一原则: 公开讨论,公开否定。

群里有教师提到过不少次学生的负面情绪,比如各种抗拒,各种不服,在本学期初期同学们指责我作业多的时候,也有教师担心过,尤其是当同学们在论坛上公开抱怨的时候。

其实没事。我并不是说作业多不是问题,我是说同学们对作业多所表现出的抗拒情况不是问题。隐藏从来不是问题的解决手段,暴露也不会使问题更糟。憎恨,是一种强烈的感情,就像强烈的爱一样。激发出学生对于)课程的感情,无论是正面还是负面的,都比冷漠、"随便"、"咋地都行"要强。鲁迅先生讲过铁皮屋子的故事,某个人大声叫喊然后被杀,被杀本身是件激烈的事情,于解除死气沉沉也是有好处的。

更重要的是,同学们在抗拒的同时,无论多么激烈,都还在努力工作。我非常热情地支持了他们把抱怨写成文字,公之于众。这对于他们也是认识事实和自己的情绪的一步,还能提高逻辑和表达。

公开讨论,也包括我们自己。

6.2 关于正义 I

有一位同学,我在回答他的问题时,问他,"你相信正义吗?"后来,他问我,"这就是你说的正义吗?"我说,"是的,这在我所说的正义范围内。"

当我回顾这段对话时,你应该知道我指的是你。

此刻,我想再说一次。越远离当时的情形,越脱离事情本身,我们越能确认自己的本心。是的,那是符合正义的。

我所确保的,是所有施加在学生身上的行为,尤其是负面的,来自规则,只假我之手,而不来自我本人。至于规则有多么正确,那不是我常常有能力关心的。

我只讲授公开的教材和专家认可的知识,而避免我的偏好。我拒绝回答同学们关于前途和发展路线的问题,因为我并不确知该当如何。那是你们的人生,我担负不起。即使我确认就是那样,我也不会说,因为我可能是错的。知识况且如此,更何况道德。我能尽力而为的,是加害不来自于我。
596120876573022962
6.3 关于正义 II

下面说的完全是另一件事,只是放在这里备忘。如果你不懂,说明与你无关 :)

我们知道什么是善的,同时,我们也作恶。如果按严格的标准,我们每个人都可以进地狱不得超生,或者在下N多个轮回里被无数动物嚼很多口。我们只是就那样做了。但是要宣称这就是善的,那真的是太难了。

————————————————————

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

由 excel 转换为 markdown,及收获

1. 问题

构建之法(现代软件工程)东北师大站[http://www.cnblogs.com/younggift/]的每周学生作业成绩,执行教学团队[https://home.cnblogs.com/u/xinz]要求,发布在 cnblogs 上。作业中包括每位同学在作业单项中取得的分数、累加、按比例分配、线性映射等数据,本学期约17次作业成绩或排序统计,产生约70个表格。成绩公布后学生申诉教师修改成绩时,这些表格需要重新计算,再次发布。每次作业申诉数量大约5次左右。
nenuEmacs是我平时的主要工作环境,所以优选熟悉的工具。上学期第一次成绩发布使用了 org-mode 中的表格,发布为html源代码,粘贴到 cnblogs上。成绩累加、变更后的重新计算非常麻烦,org-mode主要是大纲写作工具,不是电子表格。使用的感觉类似于在word的表格中计算。

Excel适合记录、计算、数据变更后再计算,cnblogs使用纯文本、html 或markdown格式。其中 markdown 格式语法简洁,支持大纲式写作和表格,所以适合成绩发布和变更后再次发布。因此,上学期除最初一两次,以及本学期大部分作业成绩发布,先在excel下记录和计算,然后转换为 markdown 格式。

本文回顾我使用的三种方法,由 excel 文件转为 markdown,及收获。

2. 方案1,FFL 的 exceltk.exe

推荐使用此方案。在本学期大多发布中,我都使用了这一工具。没有使用的几次是在等待升级,采用了临时方案。

exceltk 最初是小牛同学拷给我的,说这个非常方便。后来 FLL 老师做过升级,其中对公式的支持、支持移动设备上查看cnblogs上的表头不变形、小数点保留位数这几次升级都很有帮助。

FFL 老师对 exceltk.exe 的介绍在
[http://www.cnblogs.com/math/p/exceltk.html]。

源码:https://github.com/fanfeilong/exceltk
下载:http://files.cnblogs.com/files/math/exceltk0.0.9.7

我的使用方法类似

exceltk.exe -t md -p 2 -xls 构建之法作业成绩debug.xls

把excel中的每个 sheet 导出成 markdown,小数点保留两位精度。

3. 方案2,sed

exceltk有一段时间不支持 excel 公式计算结果,我换用了临时方案,等待exceltk升级后切换回来。

3.1 为什么需要公式

我的excel中使用了 vlookup, match 等函数,以方便学生申诉以后的成绩变更。

比如个人作业单项变更,需要因此变更的字段有 个人作业总和、个人作业映射到占本周总成绩20%、本周成绩总和、数周累积、数周累积排序、数周累积去除负分同学排序、数周累积映射到[50,100];再如团队成绩单项变更,需要因此变更的字段有 该团队总分、该团队总分映射到本周总成绩的30%、该团队所有成员的团队成绩、该团队所有成员的本周总成绩、该团队所有成员的数周累积以及排序和映射到[50,100]。诸如此类。由每周作业的单项数目不同,所以公式不宜用固定列的序号,比如"=SUM(B4:L4)",而采用了vlookup & match 函数对字段寻址。

vlookup & match 函数类似这样:

=VLOOKUP(F4,小组!$A:$W,MATCH("合计",小组!$1:$1,0)+1,FALSE)

含义是

(1) F4单元格所在列是"所属小组",每行一人,随行变化。此例中的值为
"=VLOOKUP(A4,组员归属!A:B,2,FALSE)",求值结果 "飞天小女警"。

(2) 取"飞天小女警"的"合计。"取 名为"小组"的工作表 中,表头 (第一行)写
作"合计"的那列的数据,要求 A列的值为 F4的那行,即"飞天小女警"。

(3) 总结,姓名 -> 组员归属 -> 小组成绩.

这样,当小组成绩变更以后,该团队所有成员的小组成绩、本周总成绩、数据累积等都会自动变化。我只要修改变更的单项,然后再把excel导出成 markdown发布就行了。不使用公式,每次变更需要顺序修改、复制粘贴若干次,时间长工作量大,每个单项都要消耗30分钟左右,还担心出错。使用公式后成绩变更一次几分钟。
vlookup

3.2 excel -> csv -> markdown

sed 是 perl 的灵感来源之一,另一个是 awk。它们专门辅助 shell 脚本,awk做计算,sed做文本替换。

我用的临时方案脚本,在这里[https://coding.net/u/younggift/p/xls2md/]。

3.2.1 excel -> csv, vba

我把 excel 导出为 csv 格式,这样完成了公式的计算,也成为了文本格式,sed才能处理。

使用了 stackoverflow 上的 vbs 脚本,稍作修改,按数据表名导出。

----脚本开始

if WScript.Arguments.Count < 2 Then
 WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> "
 Wscript.Quit
 End If

csv_format = 6

Set objFSO = CreateObject("Scripting.FileSystemObject")

src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
 dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))

rem msgbox(dest_file)

Dim oExcel
Set oExcel = CreateObject("Excel.Application")

Dim oBook
 Set oBook = oExcel.Workbooks.Open(src_file)

oBook.Worksheets(1).ActivateoBook.SaveAs dest_file+"\个人", csv_format

oBook.Worksheets(2).ActivateoBook.SaveAs dest_file+"\结对", csv_format

oBook.Worksheets(3).ActivateoBook.SaveAs dest_file+"\小组", csv_format

oBook.Worksheets(5).ActivateoBook.SaveAs dest_file+"\本周", csv_format

oBook.Worksheets(8).ActivateoBook.SaveAs dest_file+"\数周排序-去除负分", csv_format

oBook.Worksheets(9).ActivateoBook.SaveAs dest_file+"\数周累积负分", csv_format

oBook.Close False
oExcel.Quit

----脚本结束

调用的时候,在bat中,如下。

----bat片段开始
 chcp 936

set filename=构建之法作业成绩beta-review.xls
 xls2csv.vbs %filename% .
 ----bat片段结束

3.2.2 cvs -> mark down, sed

根据不同数据表的格式不同,我写了不同的 sed 脚本。"应该"把某些 sed 脚本抽象合并到同一个文件中,不过考虑到复用次数不多、可预见的复用增长不大、以及懒,所以就复制粘贴,然后分别修改了。

所以 shell 脚本看起来这样,里面的 c1_head 与 c1, c2_head 与 c2 长得很像,抽象优化强迫症患者可能感觉不好。

----shell脚本片段开始
sed -f c1_head.sed 本周.csv | sed -f c2_head.sed > 本周.md
sed -f c1.sed 数周排序-去除负分.csv | sed -f c2.sed > 数周排序-去除负分.md
----shell脚本片段开始

每行分成两个sed执行,用管道连接,重定向到指定名称的md即markdown文件中。分成两个sed执行是必要的,因为 sed 不支持对刚刚粘贴来的行通过引用行号编辑。或者是因为我没有做出足够好的正则表达式 (@典同学,@marverick@柳园bbs) ,考虑sed/正则表达式的处理能力,此处应该不涉及类似括号匹配的上下文无关文法。

3.3 sed解读

3.3.1 测试用例

(1) cvs的前几行

列之间用","分隔。在我的临时sed脚本中,没有处理转义","的情况,解决的方案是在xls中避免使用半角逗号。

,20160901,20160908,20160922,20160929,20161013,20161020,20161027,20161103,20161110,累积,映射至[100,60],映射至[100,50]
 ,,,pre-α,α-1,α-2,α-review,β-1,β-2,β-review,,,
 [黄兴](http://www.cnblogs.com/huangxman),72.00 ,80.00 ,68.60 ,5.15 ,41.06 ,63.93 ,60.60 ,69.60 ,78.03 ,538.97 ,100.00 ,100.00
 [李俞寰](http://www.cnblogs.com/li-yuhuan/),85.00 ,86.00 ,69.53 ,35.75 ,44.35 ,64.53 ,41.20 ,31.20 ,78.63 ,536.19 ,99.79 ,99.73
 [张金生](https://www.cnblogs.com/jx8zjs/),93.00 ,94.00 ,72.47 ,-1.00 ,66.06 ,-1.53 ,39.60 ,63.88 ,88.41 ,514.89 ,98.14 ,97.67
 [程媛媛](https://www.cnblogs.com/yuanyuancheng/),61.00 ,76.00 ,-7.60 ,13.27 ,41.23 ,94.67 ,69.40 ,75.20 ,86.51 ,509.68 ,97.73 ,97.17

(2) markdown的前几行

形如"|:--|"的文字,用于分隔出表头。

||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
 |[黄兴](http://www.cnblogs.com/huangxman)|72.00 |80.00 |68.60 |5.15 |41.06 |63.93 |60.60 |69.60 |78.03 |538.97 |100.00 |100.00 |
 |[李俞寰](http://www.cnblogs.com/li-yuhuan/)|85.00 |86.00 |69.53 |35.75 |44.35 |64.53 |41.20 |31.20 |78.63 |536.19 |99.79 |99.73 |
 |[张金生](https://www.cnblogs.com/jx8zjs/)|93.00 |94.00 |72.47 |-1.00 |66.06 |-1.53 |39.60 |63.88 |88.41 |514.89 |98.14 |97.67 |
 |[程媛媛](https://www.cnblogs.com/yuanyuancheng/)|61.00 |76.00 |-7.60 |13.27 |41.23 |94.67 |69.40 |75.20 |86.51 |509.68 |97.73 |97.17 |
 |[张政](https://www.cnblogs.com/regretless/)|90.00 |98.00 |71.27 |5.07 |65.48 |-2.73 |20.00 |68.38 |92.91 |508.38 |97.63 |97.04 |

3.3.2 把 , 转成 |

# , => |
 s/,/|/g;
 s/^/|/g;
 s/$/|/g;

(1) s是substitute.

(2) s / 原来的文字 / 替换成的文字 / 全局

(3) ^表示行首,$表示行尾。

总的效果是,把所有逗号换成竖线,行首行尾各加一条竖线。

3.3.3 表头 |:--|

数据流是这样的 (cvs) -> c1_head -> c2_head -> (md),其中括号里的是产物,没括号的是加工。

在 c1_head.sed 中:
 # table head, copy & paste
 1h
 1G
在 c2_head.sed 中:
 2s/[^|]//g
 2s/|/|:--/g
 2s/|:--$/|/g

(1) 1h 复制第1行,1G粘贴在当前位置。得到

||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|
 ||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|

(2) c2_head.sed中几行的作用,是对只转换第2行,不是对全局影响。

(3) 2s/[^|]//g,除了竖线以外,去除所有字符。

||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|
 ||||||||||||||

(4) 2s/|/|:--/g,把第2行的所有竖线,转换为 |:--

||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--

(5) 2s/|:--$/|/g,把第2行行尾前的 :-- 转换为 竖线。

||20160901|20160908|20160922|20160929|20161013|20161020|20161027|20161103|20161110|累积|映射至[100,60]|映射至[100,50]|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|

之所以采用复制粘贴-替换的方法,是因为sed不会计数。

%e5%8d%95%e8%a1%8c%e8%a1%a8%e5%a4%b4

3.3.4 空行 ||||||||||||||

原始 cvs 形如:

---cvs片段开始
 姓名,继续迭代,PSP,进度条,代码堆积图,博客字数堆积图,beta发布评论,加分事项,加分分值,合计,占比20%
 满分分值,,5,5,5,5,5,,,25,20.00

[程媛媛](https://www.cnblogs.com/yuanyuancheng/),,5,5,5,5,5,,,25,20.00
 [杜桥](http://www.cnblogs.com/duq11/),,5,5,5,5,5,,,25,20.00
 ---cvs片段结束

期待修改为形如下面的样子。"||||||||||||||"一行,用于建立空行,目的是造成两行表头的效果。

||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
 |满分分值|25.00 |20.00 |10|20||35.00 |30.00 |5*N|30.00 |||100.00 |
 ||||||||||||||
 |[程媛媛](https://www.cnblogs.com/yuanyuancheng/)|25.00 |20.00 |0|0|飞天小女警|37.00 |31.71 |5.80 |34.80 |||86.51 |
 |[杜桥](http://www.cnblogs.com/duq11/)|25.00 |20.00 |0|0|奋斗吧兄弟|32.00 |27.43 |5.00 |30.00 |||77.43 |
 |[杜月](http://www.cnblogs.com/qianhuihui/)|24.00 |19.20 |0|0|金州勇士|48.00 |41.14 |5.12 |30.72 |||91.06 |
 |[宫成荣](http://www.cnblogs.com/gongcr/)|25.00 |20.00 |0|0|新蜂|19.00 |16.29 |6.00 |36.00 |||72.29 |

在 c1_head.sed 中:

# table head, copy & paste
1h
 1G
# blank line, copy & paste
3G

在 c2_head.sed 中:

4d
 5s/[^|]//g

(1) 在 c1_head中 复制第1行,另粘贴到第3行一份。此时文本文件仍维持原有
的行号,新粘贴的文字不能使用行号引用,因此不能进一步编辑。

||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
 |满分分值|25.00 |20.00 |10|20||35.00 |30.00 |5*N|30.00 |||100.00 |
 ||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|

[程媛媛](https://www.cnblogs.com/yuanyuancheng/),,5,5,5,5,5,,,25,20.00
 [杜桥](http://www.cnblogs.com/duq11/),,5,5,5,5,5,,,25,20.00

(2) c2_head.sed中的4d,删除第4行空白行 (在c1_head中的第3行) 。

||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
 |满分分值|25.00 |20.00 |10|20||35.00 |30.00 |5*N|30.00 |||100.00 |
 ||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|
 [程媛媛](https://www.cnblogs.com/yuanyuancheng/),,5,5,5,5,5,,,25,20.00
 [杜桥](http://www.cnblogs.com/duq11/),,5,5,5,5,5,,,25,20.00

(3) 5s/[^|]//g,把原第5行 (删除第4行后显示为第4行,仍计数第5行)改为 ||||||||||||||

||个人作业|占比20%|结对|占比20%|所属小组|小组成绩|占比30%|贡献系数(4人分配4*20)|占比30%|特别加分事由|特别加分数值|本周得分|
 |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
 |满分分值|25.00 |20.00 |10|20||35.00 |30.00 |5*N|30.00 |||100.00 |
 ||||||||||||||
 |[程媛媛](https://www.cnblogs.com/yuanyuancheng/)|25.00 |20.00 |0|0|飞天小女警|37.00 |31.71 |5.80 |34.80 |||86.51 |
 |[杜桥](http://www.cnblogs.com/duq11/)|25.00 |20.00 |0|0|奋斗吧兄弟|32.00 |27.43 |5.00 |30.00 |||77.43 |
 |[杜月](http://www.cnblogs.com/qianhuihui/)|24.00 |19.20 |0|0|金州勇士|48.00 |41.14 |5.12 |30.72 |||91.06 |
 |[宫成荣](http://www.cnblogs.com/gongcr/)|25.00 |20.00 |0|0|新蜂|19.00 |16.29 |6.00 |36.00 |||72.29 |

2%e8%a1%8c%e8%a1%a8%e5%a4%b4 track_ciac

4. 方案3,emacs elisp

Emacs是我平时使用的工具,所以本学期最初的转换,当需要公式,因此由 cvs转成 markdow 还没有被 ffl 支持时,自然地想到用 elisp 作为临时方案。

elisp是上下文无关文法 (或者更强?)的语言,因此可以计数,得以避免使用复制粘贴-修改这样的手段生成表头行。col-count用于存储列的数量。

(defun cvs2md-table ()
   "replace cvs format to markdown talbe."
  (interactive)
  ; , -> |
  (goto-char (point-min)) 
  (replace-string "," "|")
  (goto-char (point-min))
  (replace-regexp "^" "|")
  (goto-char (point-min))
  (replace-regexp "$" "|")
  ; table head
  (setq col-count 0)
  (goto-char (point-min))
  (setq col-count (count-matches "|" (line-beginning-position) (line-end-position)))
   (goto-line 2)
  (setq head-count 0)
  (while (< head-count col-count)
     (insert "|:--")
    (setq head-count (1+ head-count))
    )
  (insert "|")
  (open-line 1)
  ; delete "||" in the last line
  (goto-char (point-max))
  (beginning-of-line)
  (kill-line)
  )

5. 收获

一个技术方案是否能被别人采用,因此具有更帮助更多的人而不仅是自己,取决于多个方面。比如,emacs这类相对小众之下开发的代码,sed这种需要运行环境和只能命令行操作的脚本,对于很多人不算友好。ffl的工具可以复制粘贴,也支持命令行,基于.net运行环境在当今不再是个问题,友好得多。

语言的能力越强,越接近于图灵机,实现通用功能,比如计数、插入某个特定数量的字符,就越容易。所以在DSL中要小心配置文件容易迅速成长为上下文无关文法,然后图灵等价,成为新的语言,专用特性的优势就消失了。能力弱一些的语言,也不见得不能实现,比如把插入特定数量的字符等价为 (事实上这才是原始的需求)复制粘贴再修改某一行。还是要确定自己的问题到底是什么,计算模型和数学模型的选择,然后才是代码。

要清楚--尽可能第一时间发现--语言或工具的限制,比如sed不为刚插入和文本编排行号,因此不能基于行编辑。

track

------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

唐诗宋词与我

题图临摹果壳日历2017年1月1日。

唐诗宋词以后,当数元曲,而不是"我"。题目所以在唐诗宋词后面继之以我,是因为元曲里,除了课本上背过的那些,我就只知道郭靖背着黄蓉的那段情话并兴亡之论。课本上的那几篇,又都油腔滑调的,颇不符合我当时的小资情怀。对了,还有前几年编程序吵架的间隙,关同学为我们科普过一段汤显祖,兼论越 (粤?)剧。就是那位一个人相当于一支军队的关同学,主业是程序员,她的故事参见[https://zhuanlan.zhihu.com/p/19966058]。

1. 第一首唐诗

小时候有一段住在我姥家,大约一年时间吧。我姨家的弟弟有次去玩儿,他没有托管在我姥家,而是去幼儿园。大人们问在幼儿园学什么,然后让他背一段唐诗。他立定站稳,声音洪亮,背了一首《望庐山瀑布》。

我现在还能记住当时他带给我的沉重打击。他比我小三四岁吧,就能背唐诗了。而我,应该还啥也不会背,或者也许能背"更上一层楼",楼字的发音还是大舌头的。那个时候还不知道,又过大约两年之后,我才开始能写字,我爸启蒙的,是"岳飞"二字,繁体,然后才是我本人的名字。

日照香炉生紫烟,一道瀑布挂前川。

我完全听不懂,仅仅声音里的气势就把我震慑住了。

我接触的第一首唐诗,由一个比我小三四岁的小孩背出来的。那个时候,我还不能表达"我也要背",会被大人批评"别人想干啥你也想干啥",且原文是东北方言,比这阴损得多。

2. 我也能写

终于上了小学,顺理成章地就可以"也背"了,不用额外恳求。每个人都拥有这样的权利,背诗。所以说,教育平等非常好。

小学一年级班主任杨老师讲到《咏鹅》的时候,就是那首"鹅,鹅,鹅",感叹着说,"你看人家骆宾王,才七岁就能写诗",然后殷切地望着我们。其实我已经忘记这首诗的作者是谁了,刚刚还搜了一下,到底是骆宾王还是王洛宾。但是我现在还记得的是,老师话音刚落,我就举手。

老师: 咋的?

杨贵福: 老师我也能写。

老师: 真的啊,那你写一个。

杨贵福立定站稳,声音洪亮,写道: "江上往来人,但爱鲈鱼美。君看一叶舟,出没风波里。"

老师说: 你这不是写,是背。不错,我还以为你们都不会背诗呢,还有哪位小朋友会背……

众: 我,我,我。

这首诗其实我背得艰难,尤其第三句,忘记很多次。"这一句不押韵,背起来确实难",我的诗歌启蒙老师是我哥,他非常理解地说,"你多背几遍吧。"

3. 我真的能写

转眼就是小学二三年级了,认字不多的我读了能接触到的全部书。全部书的范围,应该是三四本民间故事,人参娃娃啦,人参姑娘啦,人参老大爷啦,诸如此类。一个令我感动至深的故事,是老把头 (抓人参的人)孙某某从山东远道而来,在路上跟一个人参精变成的青年结拜,后来跟人参精走散,满山寻找。最后他弹尽粮绝,饿得不行,在古河之中抓到三只 la3 gu,因为只有精细蛋白质补充而脂肪和糖类不足,饿死在河边,死后也成了精。死前他写了一首诗:

家住山东我姓孙,飘洋过海来挖参。半路丢了亲兄弟,沿着古河往上寻。三天吃了个 la3 la3 gu,找不到兄弟不甘心。

看了这个故事不久,有天我妈下班非常晚,我放学回家没找到饭吃,炉子也落了(阴燃的煤烧尽,需要用柴火重新生火,而柴火是宝贵资源;生炉子还需要特殊技能,当时还没有解锁),冻得够呛。后来知道那天我妈他们加班,可能是绑钢筋或者搭架子,或者自愿义务献工两小时,做什么不重要。

饿死前,我也赋诗一首,如下。

家住通化我姓杨,回到家中不见娘。找啊找啊没找到,炉子落了屁股凉。这事儿不怨赵工长,只是妈妈工作忙。

第一首诗。留在这里,姑且作为纪念,一个小资青年的童年。最后两句,其实我没有那么高的觉悟。那么写,一个是当时我看到的都是这么高的格调,另一个是,除了"不怨",我又有什么别的办法。我妈说,"你以为钱是大风刮来的啊,那是我和你爸汗珠子掉地上摔八瓣挣来的。"

不少同学的父母从事的不是体力劳动,虽然你觉得非常辛苦--到了一定年龄,就都学会了承认父母是天下最辛苦的人--但是体力劳动还是非常不同的。真正做过一段时间,你就会明白,为什么有的体力工人会酗酒,因为肌肉太疼。

我对父母的理解,只是口头的表达而已。到了初中,我迅速成长为一个小资少年,写了好几厚本诗。每页一首,字非常大,内容全是(不是大多)悲秋伤春,虽然整个初中也就三个春天三个秋天,还有感叹我班教室门口那棵大杨树要死了没人管。诗写在我妈从工地要回来的建筑施工的记录单背面。正面是我的大作,背面是铅字印刷,我们都力透纸背。记录单里偶尔有人手写的东西,鬼画符一样,看不出来是什么。封皮是洋灰袋纸那一类装订,当然上面并无水泥。我会用线装订书籍和修书,就是那时候练下来的功力,每本都像电视里线装的《九阴真经》一样。上面用钢笔描出来的毛笔字,"何以语出惊风雨,诗成泣鬼神"。

初中班主任黄老师有一次看到我写的诗,评论说,"你这随感写得不错啊。"

什么,随感?我全部的生活和感悟,只是诗歌里我觉得最不起眼的随感吗?难道不应该是诗言志,立意甚高,笔法娴熟。我很失望,对老师很失望。

当是时也,正是198X年代末。我想,如果以后有英国作家为我写自传,可能会这样回顾那一打击: 他年少时自许颇有诗才,甚至曾经尝试写出一些长短不齐并且押韵的文字。没有发现有文学家或者诗人对他作品的评论,可以找到的唯一资料是他自己引用教语文课的黄老师在他初二时给予的中肯甚至带有鼓励性质的虚假正面评论"不错",这一评论的肯定部分极可能建立在他当时身为中二学生的这一身份之上。他对于"不错"二字并无觉悟,反而对语文老师把他的作品归结为"随感"耿耿于怀,事实上对于一个中二少年来说,如果他除了随感之类的无病呻吟,生活竟然就没有别的,当然不可能成长为一个诗人。

block

4. 补课

初二初三,看到同学读 李璟李煜词,她还看 李清照选集 (书也许不是这个名字,李清照是没错)。书非常薄,几十页,因为他们的作品也就那么多,书皮印成线装书的样子,当然是假的,远不如我的手工。当时对借书的全部认识,就是毛主席抢了肖三的书,一把夺过,以表达对书的热爱,然后在上面写满批注,再还回去,甚至就此匿下。好在我没有那么做,而是礼貌地借,虽然并不认识人家。

不过,你能想借我的书看 (虽然现在我既不乐意,也不会借),是对我的品味的直接褒奖。大学毕业以后,躺在床上读宋词赏析词典,被严同学借走。我对他的品味就此评价高出许多,虽然依然认为他在生物本专业和逻辑上甚是不严谨。栾同学则大段背诵原文,他背的不是短小而押韵的诗歌,而是余华的小说,还有电影《秋日传奇》的情节,事无巨细,连标点符号我看都不会错。大哥那个时候则基本不读书,后来我在他办公室里看到半柜子哈耶克汪丁丁,很是感叹了一番。他热情地推荐给我看汪丁丁,我翻翻评论道,"写得什么破玩意,话都说不明白。"他推荐我看哈耶克,说,这个真不一样。我很勉强地借走了《科学的反革命》,心想,等我看完回来批你一头狗屎。也是一本小册子,百十来页的样子,我去北京机场接Lars他们一行十多个人的时候随身带着,躺在靠椅上想催眠,结果就翻了大半本。唯心主义给我的第一次沉重打击,太有道理了。

能够在非常薄的篇幅内包含巨量内容,只有诗歌、哲学,还有数学。流落荒岛的必备读物,及《野外生存》一本。

说回初二三的那两本宋词,人家早我多少年就读过了,而我才巴巴地借来看。然后全抄下来,好在并不长。所以你看,有正确地爱好多么重要。

高中,在满是灰尘的图书室靠着窗户,看《全唐诗》。一段段写得无聊,觉得要么我水平低,要么古人写得烂,但是也不敢说。直到最近在douban看到有人发出同样的抱怨,知音啊。哪能每首写得都那么好,李白的烂诗多了去了,翻来覆去就是酒好喝啊喝好酒,我愿意天天喝啊天天喝。原文忘记了,大意如此。我都怀疑那是不是后人瞎编的。也是铅字印刷,力透纸背,两面都力透纸背,所以读起来挺费劲的,不过这成功地阻止了我继续怀疑。

5. 还是学理工吧

大学一年级,我们有征文。对,物理系也有征文,征文学类作品,不是公式推演。我应征的作品之一是在黑板上推敲出来的一段,你可以想像旁边就是勒让德公式,还新鲜热辣。

如果有一天,我不再能翱翔,你是否还会赞美我的翅膀。

P同学为代表的一干人等当面问我,当我面不是当评委面,是不是抄的,怎么记得在哪里见过。我答,林黛玉也觉得他见过贾宝玉,写得好,你读起来感觉就是这样。不是抄的,是我从高中就开始写的。

大学几年级忘记了,有选修课。绝大多数课都是必选的,并且我们必须亲自选。大家跑到机房,围成一圈的机器,只有数字的小键盘,按纸上的课表把自己必须也只能那么选的课录进去。只有个别课可选,我选了《唐宋诗词》。

老师是个高大而柔软的胖子,脸上略有胡茬。我一度担心他的胡茬会导致漏气,并没有。

他上课的时候非常有魅力,后来我发现,尤其是女同学们更觉如此。师范大学本来女生就多,喜欢唐宋诗词的男生更是稀少。你是否能体会到他讲到精彩处,全班的"啊~~哦,这样喔"这样的感觉。其实诗歌里是不太用感叹词的,除了李白,他一下子就用了好几个,"噫吁兮"。

老师上课的时候还会把古诗唱出来,他唱的是《将近酒》。比后来网上传的那段差得很多,甚至我都能听出来跟跑调似的。不过他说,这不是唱,而是吟,并且声称古人就是这样吟诗的。我想提问,一方面据说古诗的格律暗合音律,所以应该是有谱子的,每次都类似的旋律,而不应该像我一样每次另谱一曲,他给我的感觉也是随便瞎吟的,并无定规。另外,我对将近酒中醉的程度与他的理解不同,我觉得那应该是喝得正high,可以打架可以交友可以吹牛的程度,他吟的状态似乎快要说不出话要睡着的感觉。写到这里,刚刚又想起来,他还吟了"但愿人长久",与王菲版差整整一个梅艳芳外加半拉屠洪刚。

还有个重大问题,他怎么知道古人就是那么吟的。我非常想讨教,但是课后老师被全班女生包围着问,我想并没有性别平等的提问时间,就赶去编程序了。

匆匆,是离别的生椒。

考试的时候,我非常认真地答了,题目也还简单,不必复习。但是!居然没有我的成绩。我费劲找到老师,要知道那时候既没有手机也没有微信。老师说,没有你的卷子啊,没有办法。好吧,只好认了,怎么会没有呢,我挠着头走掉,像是一个吃掉卷子的坏学生。直到我自己做了教师很多年以后,我才意识到,这是教学事故啊,你怎么能把个一心向学热爱诗歌的少年的卷子整没了,还很有理的样子。

他还在课上教我们,"腹有诗书气自华",看着女同学们这样说。我当时还心有戚戚焉地附和,恩,男生也可以腹有诗书。

老师之不靠谱和敷衍,让我最后终于绝了写诗的念头。引用小于同学的话,看你们都在那里,我肯定不能加入啊。不屑与你为伍的感觉。所以,我坚定了信念,从此走上一条成为理工学生的道路。

ice_road

6. 补记

放弃诗歌很久,初中的本子再也不动,生了霉斑。宋词词典被压在UML用户手册下面,连积灰的机会也没有。有天有人提到《唐诗三百首》第一篇是什么,他说错了,我脱口而出,不是“孤鸿海上来,池潢不敢顾。侧见双翠鸟,巢在三珠树”么。然后我悲哀地发现,后面四句,我想不起来了。

有一天,我写了一段八句律,发在朋友圈,还配照片什么。关同学在下面回,老师,好工整啊。如果有人夸你写得有感觉有才华有情怀,就跟某些人夸女生有气质差不多,意思是实在难看,而又希望评论保持礼貌。而关同学说"工整",说明她也有此道中人,真的明白,相当于评论你唱歌"不跑调",而不是"好听""用灵魂在歌唱"。我突然意识到,不仅仅是我,还有人也在骨子里潜藏着诗的种子。只是,我们竟日在键盘上敲下来的都是用分号结束的句子。

看人家喝酒的时候,徒夫Y老师回顾了几段他为了逼迫儿子而作的诗,每首都是观景,然后立马可取,墨迹未干。多为格律,其中竟然还有六言。我说,六言,你一定写过词吧。他说,我背过平水韵。我喝可乐敬酒时说,如果徒夫Y老师只是学问好,那么我就会觉得他是一位好学者,不过他同时可能是个乏味的人。但是他居然还能做诗,居然还能在喝酒的时候读给我们,那非常之不一样。

我看到《构建之法--现代软件工程》的作者邹欣老师出现在一张照片里,板着脸抿着嘴,挽起袖子,大马金刀地坐在中央,专注地看着眼前的书或者纸张,态度就像review代码。那张照片是人文学者杨早老师的读书会。

我看到导师在抱怨的时候在朋友圈里发了两首诗,文彩熠然。我击手机称颂,原来老师还有这个本事,平时都看不出来,以为他顶多会拉二胡呢,还没有亲见。

我看到你们隐藏在骨子里的诗的灵魂。请不要让它湮没,不要放弃,偶尔让它出来透口气。世事尘嚣,唯超然可以安静。

我们不请你喝酒道别离,而是还在追随。老师加油。有两三员大将横刀立马,当可以定中原。
view_small
------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

全国教师管理信息系统填报 照片处理,使用 imagemagick

1. 通知正文截选

各位老师大家好!根据教育部要求,我校全国教师管理信息系统填报工作以及开展,请大家登陆http://bwyxjs.emis.edu.cn:8082/selfservice/index。 相关要求,首次填报将于12月10日完成。时间紧,任务重,希望大家支持和谅解,按时完成任务。

2. 照片要求

26mm*32mm, >=150dpi, <60k, jpg

%e8%a6%81%e6%b1%82

3. 操作流程

如果看不懂下述操作流程,把下面的内容发给您的学生,请他帮助。如果他说“不会”,请他提高信息化素养,或者使用PS。

3.1 下载 imagemagick

[http://www.imagemagick.org/script/binary-releases.php]

[https://www.imagemagick.org/download/binaries/ImageMagick-7.0.3-8-Q16-x64-dll.exe]

3.2 剪切

准备原始照片。

使用windows画图工具(win+r, mspaint)把原始照片切成 宽:高 为 26:32,另存为 crop.png

3.3 转换

使用imagemagick转换照片为指定规格。

(1) 进入命令行

Win+r, cmd

(2) 进入照片所在目录

f:;cd \20161201

(3)转换

convert -density 150 -units pixelsperinch -resize 154x189 -quality 100% crop.png output1.jpg

4.4 结束

output1.jpg就是符合 全国教师管理信息系统 要求的照片。

4. 解释

如果看不懂上述操作流程,把上面的内容发给您的学生,请他帮助。如果他说“不会”,请他提高信息化素养,或者使用PS。

如果看不懂上述操作流程,本节也不会看懂的。

original

剪切这一步很难自动处理,需要能AI找到人脸。

crop

output

4.1 size

厘米->像素 换算

宽度 =26/25.4*150
高度 =150/25.4*32
precise_image_width_in_mm=$( echo \
"$image_width_px / $resolution * 25.4" \
| bc ‐l )

[http://stackoverflow.com/questions/11773688/how-to-change-the-print-size-of-an-image-in-mm-on-command-line]

4.2 dpi

-density 150 -units

4.3 quality

如果文件尺寸过大,可以再压缩。

4.4 unit

可以转换为以公制厘米为单位。此步骤可选,并非必须。

convert output1.jpg -units pixelspercentimeter output2.jpg

4.5 identify

检验转换结果。此步骤可选,并非必须。

4.5.1 英制

F:\20161201>identify -verbose out

put.jpg | head

Image: output.jpg

  Format: JPEG (Joint Photographic Experts Group JFIF format)

  Class: DirectClass

  Geometry: 154x189+0+0

  Resolution: 150x150

  Print size: 1.02667x1.26

  Units: PixelsPerInch

  Type: TrueColor

  Endianess: Undefined

  Colorspace: RGB

4.5.2 公制

F:\20161201>identify -verbose output2.jpg | head

Image: output2.jpg

  Format: JPEG (Joint Photographic Experts Group JFIF format)

  Class: DirectClass

  Geometry: 154x189+0+0

  Resolution: 59x59

  Print size: 2.61017x3.20339

  Units: PixelsPerCentimeter

  Type: TrueColor

  Endianess: Undefined

  Colorspace: RGB

4.5.3 mspaint检验

mspaint

4.5.4 资源管理器检验

150dpi下,宽度154像素,合26毫米;高度189像素,合32毫米。

explorer

5. 后记

据说照片是可选的,不是必填项 😀

PDB老师说acdsee就行。

LXL老师说Photoshop可以。

李记者说用 gimp可以。

------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

仅仅是声音

1. 录放机

我唱歌跑调挺厉害的,厉害到什么程度呢,如果你认识我更早一些,就会见识到我是个作曲家,为每首重新谱曲,并且每次都不一样。

乐感这么差,跟我的成长环境多少有些关系。我小时候家里能发声固定频率的东西,除了后来被我上弦拧坏了的座钟,还有个半导体收音机,一直装在皮套子里,一直到不用的时候还是全新的。那个收音机成天讲的都是时事政治,因此我一直到小学四五年级,还认为"南斯拉夫"是一种风镜,棕色的皮子里嵌着两片镜片。因为每次我玩那个风镜的时候,收音机就讲"南斯拉夫",这个故事告诉我们巴甫洛夫说的是真的。事实上,直到现在,当我听到南斯拉夫这个词的时候,母语的第一反应仍然是风镜,然后需要翻译成汉语。

当然,成长环境恶劣不是我音盲的全部原因,同样的生活环境,我哥从小乐感极佳,听每周一歌基本一次就可以自己唱了--可能词记不全,但是调子不会错,跟我刚好相反。我还见识过我妈拿着简谱视谱即唱,《欢迎颂》,我问怎么做到的,她说,"就照着唱呗。"我也就照着唱了一下,他们说"别吵吵"。当然,他们这么强大,可能正是导致我自暴自弃的原因吧。

后来半导体收音机终于换成了录放机,能当收音机,还能当录音机用。一个大家伙,半米多长,30厘米高,20厘米厚。买录放机的一个原因,是我在我爸的同事T叔家里,用他家的录音机录了一整个下午同一个故事,哪本笑话集里的《吝啬鬼》,就是向邻居借锤子邻居竟然不借,大骂邻居吝啬,只好把自己的锤子拿出来用那个故事。我父母觉得我这样太不懂事了,打扰别人,就买了一台。买的时候非常慎重的左挑右选,请了朋友帮参谋,参谋以后还请客喝酒感谢。席间一位叔叔看我和我哥兴高采烈地一直玩录放机,哈哈大笑说,"这是大狗打回来食儿,小狗吃呐。"我偷偷问我妈,他怎么骂人呢。我妈说,那是土话,不是骂人的。我当时的年龄,大概就是还听不懂这种玩笑的心智那么大。

据研究,音盲与不能听出弦外之音高度相关。我觉得好像对,因为跟你们对话的时候,我经常偷摸做句子成份分析,只是因为经常做很熟练,所以你们多数时候觉察不出来。好在我不孤独,孙HT同学和邦哥也都有类似问题,他们从小学开始,就也对问题本身的目的而不是解法困惑。我们共同的问题是,老师的这个问法可能有一百种意思,应该在试卷上写哪种意思对应的答案。

这台录放机一直陪伴我上大学离开家。我哥在我大一的时候给我买了一个巨酷巨先进的随身听--跟你父母给你们买PAD的原因一样,为了帮我学习英语。在第一学期就丢了,放在教室的桌膛里,不见了。我才明白,原来大学的文化与我所想的并非完全一致。哥说再给我买一个,我没脸要了。这样,直到大四倒数第二次,我的英语四级才过。当然,录音机丢了也不是原因,因为直到通过的那次考试,听力部分我都是根本不听直接答的。盲听答题的习惯一直持续到出国外语培训,牛老师教育我关于外国人可能会因为我不能日常会话而小看全体中国人,我才奋发图强开始学习。这是另一个故事了,以前也讲过,这次不再细说。

家里的那台录放机带给我最大的影响,是我用它放过无数遍高仓健的《追捕》的录音剪辑。录音剪辑是那个时代特有的艺术体裁,全称是电影录音剪辑,把电影录音在广播电台放,里面还有绘声绘色的解说。"通化人民广播电台,330米909千赫,本台现在开始播音。"唉呀,太有感觉了。

我们录了不少优秀的电影录音剪辑,尤其是《追捕》,听的次数之多,我能大段大段地背诵台词,那些人物在我的头脑中早就形成了亲切的形象,杜丘什么样,真由美什么样,她的马什么样,她爸爸的飞机什么样。朝昌议员,唐塔,长冈了介,还有那个横路敬二。有个初中代数老师讽刺一个同学,"你怎么跟横路敬二似的"。大家面面相觑,都不知道她什么意思,我知道,但是不能说,憋着不敢乐。低沉的咆哮从松林里隐隐传出,真由美大叫"啊~~",史村警长大叫"小姐快跑!"。音乐声起,是紧急的鼓点,或者提琴快弓。杜丘的声音切入,吐字清晰,沉稳有力,"熊。"

杜丘沉毅果决,在我的心里,一定不会长得像郭富成,林志颖那样。但是我一直没有见到过他的形象--你可能也注意到,上面这些人名的写法可能也是错的,因为我一直靠听,没有读过--直到有一年央视春晚,那个时候叫做春节联欢会,现场放了一段录像配音。我当时正吃多了瓜子花生,脂肪摄入过高吐完躲坑上难受呢,没戴眼镜,隐约看到了心目中的英雄杜丘的样子,居然是那么长一张马脸。我难过得转过头去。但是杜丘冬人应该是什么样子呢,长得像施瓦辛格或者史泰龙么,或者像周润发刘德华?

后来我又看了几次《追捕》的视频,看了《远山的呼唤》,看了《幸福的黄手帕》。看了《千里走单骑》。我想,杜丘也许就是高仓健的样子。也许,他的样子并不重要,我是因为声音而认识了他,关键不是他的样子,而是,我希望自己是他的样子。   hand

2. 磁带

尽管有录放机,后来我对声音的敏感仍然一直很差。比如玩成语接龙,如果不允许音同字不同,就是必须是那个读,字面意义的,那么我能以相当碾压的姿态进行游戏。如果允许音同字不同,仅读音对就行,我瞬间就被碾压了。那些成语字词,在我心里从来不是声音,而是样子和意义。我是用五笔那样的路线听文字的形状,而不是它们的声音。我还记得1996年Z老师告诉我接一位联想公司的 Hong Shanhe,电话联系。我问,哪个"Hong"。如果仅语音联系,是不必知道哪个"Hong"的,当时我并不明白,觉得如果不能写下来的都不能沟通。

录放机对我的音乐启蒙是二人传,《回杯记》《马前泼水》《包公陪情》。其实家里有两盘流行歌曲磁盘,程琳的《小螺号》和唱《小小的我》那个苏红,但是基本没有印象了,而几盘二人传,有一阵经常在我脑海里翻来覆去地唱,尽管后来证实都是跑调的。还有《刘玲醉酒》,"大烧锅喝干了三百六,小烧锅喝干了六百三。往南喝到东南海,往西喝到老寿山 (老四川),往南喝到云南地,往北喝到塞外边。东西南北全喝遍,它未曾把我醉半边。这酒家你好大胆,信口雌黄吐狂言。今天我,上楼去把酒缸酒篓全喝干……"

初中跟同学LJL借过一盘吉他曲,回家一边写作业一边听。我妈说,"你那能写好作业么,净费电。"磁带听了一次就还了,我不记得翻录了没有,总之没有再听。那些吉他曲很好听,是只弹不唱的那种,我先前以为吉他全都是留长发穿喇叭裤的小流氓才弹的呢,而且必须会"撕吼"才行。好吧,我有这个误解的时候是1988年至1991年间,那时候只有"撕吼"这种行为,还没有这个词。

高中?高中没有音乐课。有过一次庆祝毛主席诞辰或逝世多少周年的文艺汇演,我们班JM同学带领几位女生在红星剧场参加汇报演出来着,她们都小脸红扑扑的,唱"太阳最红,毛主席最亲"和"呀拉索"。

到处找不到《明天会更好》或者《让世界充满爱》再不就是《黄河大合唱》,同学演出想唱要学,我们去通化电视台或者广播电台求人家给我们翻录。不记得怎么混进去的了,人家不给录,说不是版权什么的,而是你们的磁带会弄脏我的机器。后来我们几个死皮赖脸地求,录了。

大学学校保卫处旁边有几个铁棚子,里面有卖磁带的。都是听歌的磁带,英语的磁盘在图书馆。我在图书馆录过几盘 Step by Step,那是巨难入门的听力,特意制造了噪音提高难度,听了几次就放在一边直到毕业似乎卖掉了。或者卖掉的是同学的磁带,我的早丢了也说不定。听歌是件奢侈的事,得花钱。尤其打口带,明明有缺欠还卖得挺贵,我想都不敢想。事实上,也听不出来有什么好。我连物理系要求全体消除舞盲的时候,也分不清三步和四步的点儿,每次问同学,这是几步,然后数一二三开始。

工作以后也用过磁带,备份 Sun 服务器的数据。样子跟录音机磁带差不多,贵多了。

磁带存储了各种声音,各种声道,各种乐器的旋律和节奏。还有很多人的回忆。

how_many_roads

3. 音箱

毕业以后在单位用单位的音箱,最好的是木质的千里马或者类似的名字。把音量放大最大的时候,整个屋子都震动,但是不失真。

比这样的音箱更牛的是大学时物理系的,黑色的,一抱粗,似乎是哪届师兄做了留下来的。功放很多年都是电子管的,开着盒子用,可能是放过热,亮闪闪的。每次舞会的时候都有师兄叮嘱,功放功率不能开到太大,别把音箱烧了。

毕业以后我自己用的音箱,第一个是学弟waxia送给我的,无源的,听了很久。在家看电影的时候就用,声音不太大,也不是非常清晰,不过比机器风扇的声音还是大很多的。要知道,更早的时候,我用pc的纸盒喇叭看过VCD。

兔子同学送过我一对有源的音箱,被老猫心情不好的时候扒拉到地上,摔得声音破碎,继续对付着用了很久。后来很多年,有人告诉我有专门卖那种胶带的,可以补上,不过那个时候我已经换了新的音箱。

BY同学送我一对巨大的音箱,现在正用。用了多半年,因为桌子面积小,一直都是一前一后对着我。搬家以后我回去单独去拿音箱和计算机,正好屋子空出来有地方,把音箱一左一右排开放了一会音乐。我当时就震惊了,原来真的是立体声的啊,声音从显示器后面传出来。我抬起显示器的机械臂,下面空无一物,音乐从虚无中汩汩流出。

还有过一个单耳的蓝牙耳机,原来不以为然,觉得就是那么回事。结果有一天刷牙的时候发现,它居然能在有噪音的时候自动放大音量,顿时觉得高大上的很,非常喜欢每天带着听一听。因为如此密集地带去,某天丢了再也没有找到。

想起来蓝牙耳机非常贵的时候,牛老师说,有个蓝牙耳机他不用了,要送给我。我说,不要,没啥用,我的手机不能连接蓝牙。后来师姐说,那玩意老贵了,为了这个耳机,你再买个手机都值啊。恩,建议很好,就是晚了点,总不能跑回去再要。

新的住址过于繁华,非常吵。买了一副主动去噪音的耳机,原来是打算清净一下好能干活。后来发现,还有别的用途。在班车上,在火车上,尤其在家里夜深人静的时候,打开主动降噪,听程壁的歌《给猫夏的你》,听夜の良曲《落叶》。就像端起一杯咖啡,就像电影里燃起一枝烟,瞬间就离开喧嚣,与这个世界隔离。

音箱和耳机,从声音的维度上让你与这个世界隔绝,进入到另一个空间。好的音箱和好的耳机的坏处是,当你见过那么好的世界,就再难忍受更差的效果。

cat_foot

4. 好声音

《中国好声音》除了今年的,此前的我听了每一首。我会选择这一期结束之后的某一天,在网站上一气看完。一方面我能忍受并非实时地参与,另一方面我不想被那么多广告耽误时间。有一次是在真的电视上看的,广告之长确实让我很惊讶,也坚定了我不看电视的决心。

后来我们听说,好声音里很多歌手并非所宣称的那样单纯的是美甲店老板或者商铺的伙计,他们不少人受到过非常专业的音乐训练,卖化肥也可能只是临时的营生,就跟我尽管也卖过对联送过福字 (计划过卖瓜子和冰棍) ,不过我的主要职业是高校教师。徐海星给大家留下了深刻的印象,就是那个像阿拉蕾一样的女孩,闪着大眼睛,穿着娃娃服还是学生服站在舞台上。她提到她的爸爸去世了,应该在看着她的演出。从那以后,有不少观众指出,他们不想知道歌手的家世和家事,不想知道歌手的音乐背景,怎么经过了专业的和艰难的训练,甚至不再想听歌手们在谈感想时咬着迈克大喊,"我想唱歌",对着他们的父母。

但是我仍然愿意相信,他们的吼叫里有真实的成份。罗素说,柏拉图笔下的斯巴达有大量虚构的成份,与真实的斯巴达非常不同,但是虚构的斯巴达对于人类历史的影响,比真实的斯巴达可能更大。

我们是来听歌手的声音的,而不是看演员的演技。所以,我们也可以忽略掉所有与声音无关的一切,闭上眼睛,从始至终。不要表演,这可以不是我们对歌手的要求,而是对我们自己的要求。你--能不能,不用声音以外的因素去评判,能不能,不受其他因素的影响而感受。

windows

我愿意相信他们"想唱歌",只是,他们的愿望可能并不那么单纯。比如,他希望唱歌的同时,能有很多人来听,他希望追影灯和聚光灯都集中在他的身上,他希望他的父母也能支持他,他的成就也能支持他的父母对他的支持。他希望用各种手段向你证明,他们"想唱歌"的愿望有多么迫切。

不过,人们不仅希望忽略/去掉这些,而且也希望对这些手段做出惩罚,尤其是我们还不能判别真伪的时候。那么,你打算对那些真的愿望给予奖励么,这是否有违仅只声音本身的原则?

我记得梁博。那个严肃脸的少年,他一直在唱同一种类型的歌。有人告诉我,一个乐评人贬损了所有的歌手,除了他。因为他的嗓子会在这种演唱风格中受到损耗,直到最后不能演唱,但是,也只有这种损耗的唱法才能表达那种情感。

权振东,柔弱的男生形象,站在擂台上面对佳宁组合两个人,其中的男士一本正经的样子,像音乐教师,女士则一看风格凌厉。他们合唱《冬天来了》,组合先唱,这时我想,太好听了啊,这么完美和学院派,柔弱的男生肯定输了。当权振东开始唱的时候,我一拍大腿。原来,柔软可以是一种力量,从锋利的刀剑里慢慢地渗透出来。我想起民歌和美声合唱的时候,无论民歌多么高亢,都不能完全遮住美声的柔。

权振东是梁博的老师,他们的学校离我的住处只有不到5分钟的路程,每天我上班都会路过。我也想过,梁博和权振东就在这里啊,但是我一点也不想走进去遇到他们。我希望他们就一直是音乐里传达出的那个样子,不想跟他们喝酒,不想成为朋友。也不想走上去对他说,"我支持你"。如果能有所帮助,当然很好,如果能只是远远欣赏,也很好。单只口头的支持淡而无味。

snow

我听不懂四位导师所说的那些"好听",也不懂"灵魂歌者"是什么样子的,也不懂"走心"和"用心",甚至不懂"当下"二字的含义。对于那些音乐术语,我是真的不懂,知识结构欠缺。而另一些,使用他们的人自己可能也不明白。

我只是喜欢张磊的声音,喜欢姚贝娜的大气。我不懂很多,我听着阚立文唱《那些年》,完全没有想起歌曲来自我看过的电影《那些年我们一起追的女孩》,这不影响我号啕大哭。我听了很多遍,并且知道阚立文不会成为冠军,甚至不会进入再下一轮比赛。我听修儿唱《张三的歌》,哈哈大笑,说,这个好玩。我不知道,后面导师们解释的那些雷鬼啊什么的风格。我并没有想过那是歌手的原创,抑或者是师有所承,派系渊源流长。

我只是听他们唱歌而已。就像魏雪漫谈到,为什么她的年龄大这么多,她作为成熟的歌手为什么参加比赛。她说,她想做很多事情,她想结婚生孩子,但是那些不是一个人能够完成的,唱歌是一个人就可以做的,所以她来了。就像刘双双唱完《致青春》,她深情地吻上她抱着的吉他。

就像张惠妹笨嘴拙舌地只会说"鸡皮疙瘩",但是当她顺着歌手的旋律歌唱延伸的时候,那是天籁降临。长期训练的专业素养和天赋集于一身,这些共同地形成了这个人。

有的歌手,在听过很多遍以后,听者会剔除当时的感动,变得挑剔起来。我会觉得马吟吟的《海上花》还是有点沙哑了,尤其每次听的沙哑都相同。我会觉得张婧懿的《斑马》有点上不来气,程壁的呼吸声也让我气短。有不少人在声音之余觉得,盲人女歌手张玉霞长得不好看。他们可能把贝多芬盲女的故事代入到这里了,由于不能看到自己的脸,其实盲人很难把握自己的表情,我见过最好的就是没有淡然没有表情。

尽管并不完美,但是他们仍然是"想唱歌"的歌手。我想,你应该想到,吴莫愁的音乐大篷车根本不会是她所想像的或者笑哈哈的说起的那样。剥落的油漆,尘土扬天,人的气味,油腻的衣服。这才应该是全部,还有猥琐的观众和低俗调子。你不应该去想像,音乐大篷车唱的是校园民谣。

但是她"想唱歌",我们忽略掉其他的一切,或者不去细想,只是体会坚强和热爱。还有在恶劣环境下成长起来的努力和天赋。

我猜测那个一直戴着帽子的大男生,一激动就蹲在地上,并非完全真实。就像后来有个小伙子一直很帅地笑着,一直执意把耳机套在脖子上,作为装饰。他们,所以上面这些歌手共同的是,想更多一些机会唱歌,如果我们姑且抛开唱歌之后的目的。

我们不能接受那些假的,而愿意全部的热情都是真实的,并不是因为我们有多么讨厌撒谎的人,而是因为,我们希望那些屏幕上唱歌的人,就是我们自己。我们希望更加纯粹的情感,我们希望他们能够替我们做到。所以白领骨干精英们当年喜欢张靓颖,年轻小女孩们喜欢李宇春。所以,有人喜欢莫西子诗,他唱道,"要死就一定要死在你手里"。

那么,为什么要由别人来替我们完成呢?我们此刻就应该去做我们最想做的事情,或者去做你最希望得到结果的事,就像明天就会死去,就像下一秒就会死去,并且此刻的选择令你在死前没有遗憾。

电影里说,对于年轻人,可能费点时间不算什么,但是对于有些人,"每一次呼吸的时间都是宝贵的"。

歌手们说,他们为唱歌而生。为之而生的意思,就是可以为之而死,因为时间就是生命本身.我们能付出的最大的代价,不是别的,正是生命,也就是时间。此时此刻,我们选择做的,应该就是我们真正地愿意为之而死的事。
jingyue
------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

远隔天涯

我跟大家开的一个玩笑,经常在每当大家指出我如何如何就活不长久的时候说出来,"我以后是咱们里活得最久的一个,然后挨个给你们写传记,编派你们。哪个子孙要是说我瞎写,我就指着他说,那时候你出生了么,你知道个啥。"

但是有时候我也怀疑,我能不能活过你们所有的人。或者,在你们全都离开以后,剩下的时间够不够我写完。

所以,趁我们还都活着的时候回忆一下。

我所有的同学里,已知去世的,一共5个人了。每一个当我们回忆起来的时候,都一阵唏嘘。除了在大学就去世的那位,其余的都是在喝酒前或喝酒中听说的。每一次我都想说,让我们这杯敬给某某,他不能跟我们一起喝了也。我不敢说,怕你们大家一起哭出来,或者我一个人哭出来,那岂不是更糟糕。我知道,你们也是这么想的。

即使我们都生活在这同一个世界,大都也远隔天涯。远到,另一座城市,铁路或航线的另一端。因为求生,即使上了车就可以端起书隔开喧嚣,其实那也很久。从离开家到站台,从另一个站台到你的居处,分别需要1个小时以上。比如从沈阳或哈尔滨到长春,不是1个小时,而是3个小时以上。再加上请假和各种任务的拖延,加上往返劳顿以后的休整,就想,也许以后吧。我已经很久没能把当天的任务完成,然后非常放心地看碟、打游戏、喝杯咖啡。咖啡大多数时候是兴奋而不是享受。我也已经很久没有探望任何一个同学了。
trees

shadow_tree
我和我爱人去探望过一位师兄,最近又联系上了,发现虽然换了若干手机,他的名字在我现在的手机里还是写好的词组。我去看他的那个年代既没有手机也很少有电话,所以我也没有预约,就突然出现。他刚好安排了家教,把我们安排在他家那么大的房子里以后就跑了。过了一会儿,他爱人也要去家教了,我们才意识到自己唐突,也跑了。跑得仓皇,把一本机械工业出版社的关于需求或者测试的小薄册子丢在了他家。后来他问起过,我说就放在你那儿吧。已经15年以上。

这位师兄是我景仰的想成为的那种人。

他当年高考失利,似乎被他爸揍了 (?)我见过他的父亲,完全不像会打人的样子。被揍以后他就跑啦,从内蒙古随便搭了一辆火车,朝着远在天涯不知道什么地方。我不记得他说的是过了多久,也不知道当年那段路程需要跑几天,他吃的什么。总之,下了火车以后,他就到了北京。

他讲的时候,我的脑海里就浮现出浅丘戈壁,风吹草扬。少年就这样离开家乡,下车的时候看到满眼绿车皮长长的列车,一排又一排。

我问过,那后来呢。他说,后来就回家了,再挨揍。我不记得是当年,又或者是下一年,他就考到了东北师大。

他下一年,我也来了。迎新晚会是在新共教,那次演出是我从未见过的,大学生活的开始,原来可以这样。这位师兄和后来我的大哥合唱一首《青春》。一个人蹲在地上,举着话筒,另一个人坐椅子上抱着吉他。我当时惊叹,这就是友谊啊。GXX唱《舍不得你的人是我》 (感谢郭勇纠正) ,他后来的媳妇在一群白衣少女中为他伴舞,这里面不知道哪个女生跑进圈里为他献花。我一拍大腿,这就是爱情啊。JYX和PY唱《糊涂的爱》,后来他们就恋爱了。主持人介绍JH老师,最高一级的同学 (几乎全是男生)一齐起哄,因为前几天她还是师姐。后来我最初执教的时候,也刚刚不是师兄,现在师弟兼学生们还偶尔回忆起来。
java
后来,和这位师兄,我们还一起参加过教师技能大赛。他是霹雳舞的天才,整个人看起来就是那个样子。前几天一位同学来访,我们回忆起当年共同认识的一些人。她说,她记得93年有个男生,是什么什么样子。我立即脱口而出,那是谁谁啊,他跳霹雳舞蹈特别好,他是不是整个人看起来就像是踩在弹簧上。在那次教师技能大赛上,有才艺表演,他就跳霹雳舞,把我们从电影里看的各种动作全来了一遍。从来没有想过,这样的动作真人也是可以做出来的。他就像体操运动员一样,充满力量地跳来蹦去。嗯,原来小流氓们的舞蹈也可以在大学校园里跳啊,如果我会打口哨一定要来一声响的。

后来我们喝酒的时候,师兄说,他上场以前特别紧张,走来走去都不对劲,就觉得要出事。后来,女主持人走过来告诉他,"同学,你拉链开了。"然后他做了一个拉裤子拉链的动作。他就不紧张了,上场非常带劲,完全成功。我和大哥听完以后哈哈笑。笑完我就问 (很多年,我一直是这种理解水平,你习惯就知道了),"她说你拉链开了,你怎么就知道是裤子?"师兄说,"我浑身上下就这一个地方有拉链啊。"

这位跳霹雳舞的大侠,帮着同学出主意怎么对师妹表白,如今佳偶的孩子已经十多岁了。这位跳霹雳舞的大侠,在我另一次去看他的时候对我说,你当年青睐过的女生啊,现在已经是个非常普通的女人罢啦。这位从内蒙敢跑到北京的少年,居然住着大房子,跟老婆两个人出去家教,我那个时候实在很难接受。

我非常想问,你的梦想呢。而且这句话你可以想像语气。我们那个时候,从来没有师兄学长这样的尊称,都是三个字直称其名,我现在仍然觉得只称后两个多么暧昧。

我没有问,我觉得没有了梦想,或者换了梦想的人,不希望被问。更何况你远远看着,希望成为的那个人,你不希望他给你讲一大屁股做人的道理。如果那样,我就只想说滚,大家连怀念就都没有,有什么好。

有些师兄师姐和同学后来的样子,在另一个故事里有提到,这里略过。

但是!

他从来没有丢弃他的梦想,还是那样的少年。或者说,在做着本职的同时,他的身上也仍然满是那个唱着民谣疯狂地跳着舞蹈的少年的影子。

这次联系上是从大哥那要来这位师兄的微信。加上以后照例一顿扯屁。近照给我看看,还剩多少头发之类的。他发给我一张光膀子上篮的照片。在他的朋友圈里,我看到他炫两把吉他,光洁如新,弦声若空。

我突然想起大哥提起这位师兄前几年抱怨沈阳不让骑摩托了。我当时说,不骑不骑呗,那么危险。大哥说,你懂啥啊,又说,不骑不就白买了吗。我说,一个摩托能有多少钱。大哥说,八万。我说,八万能买一辆很不错的车啊。大哥说,那也不是摩托。

这两年他跟大哥电话的时候,提到要做万有引力常数测量装备。我说,电话给我,我来我来。我说,"那叫卡文迪许扭称",然后一顿否定。可是,他敢于和愿意做这个我记得需要一座山来帮助测量的装置,而不是问"师大附中最近有什么题啊""你打字速度有多快啊",这本身就多么令人向往。

这样疯狂的同学,居然还活着,还是按他原来的样子活着,活得还不错。前几年还能揍学生。这多么令我欣喜。他在照片里满脑袋黑的白的头发扬起来,对我竖起中指,咧着嘴笑得像个傻瓜。我很高兴。
green_leave
这位同学远在沈阳,和我3个小时的车程。大哥大婚的时候他来了,因为晕车,大哥陪他从车站走到学校,我似乎出差去了。我去过沈阳见他两次,很多年没再去。没有像当年那样电话也不打信也不写,突然就跑到学校办公室敲门。其实即使在同一个城市,在同一个校园,也是这样。

建一同学和我在同一城市,铁子老弟和我在同一校园,都已久未谋面。他们都在忙着各自的事情,我在忙着理各种乱七八糟的线头。如果不是有共同的事业,人生很难在错开以后再有什么交集,除了喝酒买醉的时候。

更不用说,我那些已经离开的同学。想再相聚一叙一饮,唯有百年。恼了散了不得相聚,还可以偶尔微信电话,那些人和相信他们的那些人,没有"哪天再聚",而是永不能相见了。

不过我也想,如果不得相见,近在一城,或者远在天涯,或者是生死相隔。有什么分别?

有的。

那就是,如果你还活着,像我的这位师兄一样活着原来的样子,在世俗之中又能安身立命。你既能跟世人胡吹海塞,也能偶尔让我看到你弹吉他的样子,看到你终于架起HAM天线的时候,看到你忙完世事终于坐着火车路过西伯利亚的白桦林。

看到你看着我的文字哈哈大笑或者热泪盈框。

又,我发现个秘密。如果用五笔打字,打出文字颠倒来,是一种疲劳程度,如果打出音同字不同的错误来,就是累得必须休息了。
keyboard
----

下面是与正文毫无关系的 emacs lisp,用于把 excel的cvs转成 markdonw 格式的 talbe。因为有更好的替代品,我不会再维护,扔在硬盘里就找不到了,估且存在此处,不另文发布。

(defun cvs2md-table ()
"replace cvs format to markdown talbe."
(interactive)
; , -> |
(goto-char (point-min))
(replace-string "," "|")
(goto-char (point-min))
(replace-regexp "^" "|")
(goto-char (point-min))
(replace-regexp "$" "|")
; table head
(setq col-count 0)
(goto-char (point-min))
(setq col-count (count-matches "|" (line-beginning-position) (line-end-position)))
(goto-line 2)
(setq head-count 0)
(while (< head-count col-count)
(insert "|:--")
(setq head-count (1+ head-count))
)
(insert "|")
(open-line 1)
; delete "||" in the last line
(goto-char (point-max))
(beginning-of-line)
(kill-line)
)

------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

猜测在学习新工具中的作用,一个实例

1.

当年我参加李YL老师组织的Linux内核源码讨论班,大家坐教室里,人手一本厚厚的《Linux内核源代码情景分析》。多厚呢,上下册,单册800页左右。我们都把书摊在桌面上,举起来太累了,听轮值的某个人讲,说我看到哪哪儿了,这一段的意思是啥啥,这段代码引用了某个数据结构,在哪哪页呢,那个人讲,我们就哗哗翻书。

用翻书的办法讨论,因为那是2002年前后,教室里没有计算机,没有笔记本,没有投影仪,也没有平板。

轮到我讲了。我讲了两页,然后提到某某处我猜是怎么怎么回事,假设如此,那么我们继续往下看,某某段的说法就容易解释。在我结束的时候,康凯同学点评,他说: 杨老师你不能这么整啊,咋能"假设"呢,你应该找*到底*是什么回事。我问,在哪找,咱们没机器代码查起来慢啊。他说:在书上找啊。

我拒绝了他的读书方法建议,答复如下。我本科是学电子的,是物理系出身,我所受到的教育就是,先假设,然后用实验事实证实或推翻假设,从我假设以后书上后面的那些段落,都是用来证实或推翻我的假设的依据。

2.

这让我想起书上讲的妈妈给孩子讲睡前故事。妈妈每当讲到关键时刻,就对孩子说,你猜后面会发生什么呢。然后孩子就自发地产生了编故事的能力。书上是这么讲的,我妈没给我讲过睡前故事,所以我也不知道是不是真的。不过,听说过一千零一夜故事,我担心那孩子被悬念勾着更睡不着了吧。

当听到真正的故事时,还会和自己头脑中的对比,"这不合理,杜丘怎么就会忘了装子弹","这个设定太取巧了,谁能想到杀人犯还有个双胞胎"。

我们在听故事的时候,对情节和人物确实是有预设 (猜测) 的。知识不仅来自书本 (!),而且来自猜测。然后我们需要根据猜测设计实验,检验我们的猜测正确与否。如果猜测对了,我们就快捷地得到了新的知识,虽然书上可能没写--书上并未写全你要用到的所有的知识,所以也不要预期可以依照书本生活和工作。

猜测-设计实验验证-使用知识,这是成熟的工程师区别于初学者的一个重要标志,因为工程的一部分正是实验科学。我很多年以后才知道,从培根的实证主义到波普尔的证伪主义,到罗素的对一致性的追求,设计实验的朴素观点背后还有哲学理论的支撑。

不知道这么年过去了,康凯同学对当年的讨论作何感想。他们毕业的时候聚餐叫我去喝酒,刚好没有成行,所以没有来得及问他那时的看法。不过计算机系的同学可能因为缺乏充分的实验,所以一直以来给我这样的印象,重课本而轻实验设计。谷同学和孙同学曾经非常惊讶地对我说:鞠同学怎么可以这么做呢,她根本不知道书上确切地是怎么写的 (当然也不知道知识是不是就是那样) ,就说,那咱们试试吧;一试,行,就说咱们就这么整吧。我当时的评论,这正是鞠同学厉害的地方。

猜测是建模/谓词判断/命题,设计实验是根据逻辑推论--如果猜测正确,那么这样设定实验,结果该当如此,如果结果不如此,那么猜测是错误的。这样,猜测-设计实验验证,以后我们就得到了新的模型/定理,作为工具可以应用于符合条件的场合,用于预测结果,用于改变环境。

老师有的时候提到"学活了"或者"学死了",区别大体指的就应该是这个吧。

3. 一个实例,用rrdtool提取cacti数据

以下的故事,用以展示猜测在整个学习使用新工具流程中的位置。

3.1. 要显示流量,读cacti,是图片,不能 XML parse

需求是这样,要在程序中显示校园网各汇聚层交换机的流量 (上行和下行)。你可以想像客户站在大屏幕前,指着天气图说,你看就是这条线上的数据,要显示在这里这里和这里。

%e5%a4%a9%e6%b0%94%e5%9b%be2

天气图是cacti展示出来的,cacti是网络流量监控的图形化工具,配置以后通过cacti已经可以查看各汇取层交换机的流量数据了,点击线路,就可以看到。

%e6%b5%81%e9%87%8f%e5%9b%be

凡能看到的,就能抽取。所以主力研发郑同学就说,那我先研究一下 java httpclient 吧。我否定了这个计划。我否定的并非使用 httpclient,而是投入时间去尝试学习研究,而是先假设这一部分不会有问题。httpclient是著名的apache的项目,而且濮同学早就用过,所以是确定地技术路线,没有风险。反倒是另一件事情有高风险,并非"凡能看到的,就能抽取"。httpclient能模仿浏览器的各种行为 (js解释呢?),但是 xml parser 部分 图片是不可以"抽取"成文字的。只要没有变成文字,那么就不能放心,客户可能打算换字体字型字号呢。万一天气图里的数据是图片,httpclient这条技术路线整体需要放弃。

天气图里的数据是图片。

而且从图片的 caption 和 URL 里得不到文字。

故事的第一幕就此结束。英雄遇到灾难,离开故乡,开始历险。

3.2 cacti数据可以用rrdtool读取,UNIX时间戳,zhumao同学说

我和向龙同学分别对着自己的显示器,显示器后面很多公里线路以后是郑同学,我们都愁眉苦脸。zhumao同学催,啥时候能去吃午饭呐。我敲键盘,"要完了啊。"

zhumao同学远程说,cacti的数据都在数据库里,可以抽出来。

峰回路转,午饭可以下咽了。

下午,我和向龙同学研究从哪个"数据库"里抽数据。向龙介绍cacti的数据库配置的是mysql,然后我俩把mysql数据库翻个遍,各个表,各个字段。从尺寸上看就不会容纳那么多日志。

但是zhumao同学技术上很可靠,应该不是虚言。所以我们判定,"数据库"一词不是指关系型数据库,而是泛指能存信息的容器。

zhumao同学远程说,抽取的工具是rrdtool。过了一会又说,时间节点用的是UNXI的1970年时间戳。

希望重新燃起,我看到大半夜的微信上向龙同学和郑同学进行各种尝试。

3.3 猜不到数据在哪里

我以为故事快结束了,但是向龙同学和郑同学说,"猜不到数据在哪里"。

"不是说用rrdtool么,zhumao用过啊。"

"zhumao只是说可以用rrdtool,他并没有声称自己用过。"

郑同学已经把rrdtool的语法研究得八九不离十了,就是抽出来的数据和天气图上显示的对不上号。

故事一般都是这个路线,一到关键时刻--钥匙就丢了,计算机刚好没电,掌握密码的人被打死了,主角的最主要助手突然叛变,"其实我是卧底"。为什么到关键时刻才会这样,之前一点也不。因为关键时刻是这么定义的,出现了困难的时候,如果不能克服,那就是完蛋。而在实验和工程中,每一个困难如果不能克服或者绕过去,那么就会完蛋,所以有N多关键时刻。比看警匪片和侦探故事还刺激。

4. graph properties 可以查看源代码 rrdtool graph

向龙同学提供我授权登录cacti (天气图及设置) 和 ssh到rrdtool工具所在操作系统,更关键地,他随时提供给我现场的部署、状态,比如天气图上的线路和rrdtool数据库的对应关系,他和郑同学尝试过的指令和结果。

长弓已经架好,重装步兵阵列在前,巨龙就在前方洞穴之中,只差最后一击。当然,这一击以后发现还要再出击N次也是常有的事,不过如果这次失手了,那就是最后一击,然后我们全军覆没。

4.1. 猜测及实验验证

zoom_graph
向龙给我展示的是这张图。整张chart以及图例和注释全都是一整张图片,PNG格式。我确认了我看到的和战友们所看到的相同。天气图是一张图片,我在郑同学这样声称以后也确认过一次。

猜测: 这张图是此刻实时生成的,是从"数据库"里读出来的,不是原来在磁盘中的。

否定: 向龙指出,zhumao在磁盘确实找到过这张图片。 (赞叹zhumao的反向工程能力)

再猜测: 磁盘里的这张图片也应该是生成的,用rrdtool工具从"数据库"里读出来,然后生成的。

猜测的依据: rrdtool 是 round robin database,文本或压缩文本的存储效率要比图片高很多。理智的设计不会存储图片。

鼠标在图示右上角的小扳手上悬停,显示tips为 properties,左键单击,是这个界面。

graph
长得真是如我期待,上面是代码,下面是代码生成的图。

那段代码是:

----代码开始----
/usr/bin/rrdtool graph - \
--imgformat=PNG \
--start='1474880074' \
--end='1474880360' \
--title='H3C12508 - Traffic - Ten-GigabitEthe' \
--rigid \
--base='1000' \
--height='120' \
--width='500' \
--alt-autoscale-max \
--lower-limit='0' \
COMMENT:"From 2016/09/26 16\:54\:34 To 2016/09/26 16\:59\:20\c" \
COMMENT:"  \n" \
--vertical-label='bits per second' \
--slope-mode \
--font TITLE:10: \
--font AXIS:7: \
--font LEGEND:8: \
--font UNIT:7: \
DEF:a='/var/www/html/cacti/rra/h3c12508_traffic_in_190.rrd':'traffic_in':AVERAGE \
DEF:b='/var/www/html/cacti/rra/h3c12508_traffic_in_190.rrd':'traffic_out':AVERAGE \
CDEF:cdefa='a,8,*' \
CDEF:cdefe='b,8,*' \
AREA:cdefa#00CF00FF:'Inbound'  \
GPRINT:cdefa:LAST:' Current\:%8.2lf%s'  \
GPRINT:cdefa:AVERAGE:'Average\:%8.2lf%s'  \
GPRINT:cdefa:MAX:'Maximum\:%8.2lf%s\n'  \
LINE1:cdefe#002A97FF:'Outbound'  \
GPRINT:cdefe:LAST:'Current\:%8.2lf%s'  \
GPRINT:cdefe:AVERAGE:'Average\:%8.2lf%s'  \
GPRINT:cdefe:MAX:'Maximum\:%8.2lf%s'
----代码结束----

"/usr/bin/rrdtool",这是一段命令行。

ssh到服务器,向龙告诉我去哪里可以找到 rrdtool 和 数据库文件。我跑了一遍上述代码,输出一个png文件到文件系统中,正是我想期待的。

故事发展到这里,我们知道,"/usr/bin/rrdtool graph"及正确的参数可以从数据库中抽取数据。只是抽取得到的形式还不尽人意,我们想要文本,得到的是图片。

就此验证zhumao的猜测都是正确的。

事实上,在另一条分支上,向龙和郑同学走得更远。他们已经得到了纯文本的结果,用的指令是"rrdtool fetch",只是抽得的结果还没有与天气图对应上。"rrdtool graph"直接证实了zhumao的猜测是正确的,抽取数据可行。

4.2 手册

运维和编程的著名格言: RTFM -- Read The Fxxking Manual.

我找到官方站点,[https://oss.oetiker.ch/rrdtool/doc/index.en.html],去读手册。此前郑同学也已经独立到过这里。

然后我根据 rrdtool graph 手册解释了刚刚那段代码里的这一小段

CDEF:cdefa='a,8,*

其含义中的重点是: 乘以8. 因为数据库里以字节为单位的,输出的图形是比特为单位的。

我执行了下面这段
----代码开始----
$ rrdtool fetch h3c12508_traffic_in_190.rrd \
> --start='1474880074' \
> --end='1474880360' \
> AVERAGE
traffic_in         traffic_out

1474880100: 1.9393791780e+08 4.9525977422e+08
1474880400: 1.9499877230e+08 4.8637343825e+08
----代码结束----

然后手动 (用 windows calc)计算

traffic_in :
1.9393791780e+08 * 8/1000000000 = 1.5515033424
1.9499877230e+08 * 8/1000000000 = 1.5599901784
平均值为 (1.5515033424+1.5599901784)/2 = 1.5557467604
作为对比,图示中的数据 Inbound 为 1.56G.

traffic_out :
4.9525977422e+08*8/1000000000 = 3.96207819376
4.8637343825e+08*8/1000000000 = 3.890987506
平均值为(3.96207819376+3.890987506)/2 = 3.92653284988
作为对比,图示中的数据 Outbound 为 3.93G.

抽取出的数据与图示吻合了。

4.3 放大图示,对比数据,向龙同学说

我展示方法,向龙同学说,我乘以8了啊。我问你从哪边往哪边乘的。他说,因为不确定到底如何,做了不少猜测,从两边分别都乘过。这是本故事的另一个寓意了,猜测的时候如果知道那样一定正确,尽可能减少其他可能,就更好。不就此展开。

事实上,这个实验的最后一击并不那么简单。向龙同学提供了对比数据的spec说明: 放大图示到某个具体的分钟,抽取的数据与这个具体的分钟的数据对比,避免在时间段内平均等造成的误差 (和复杂性)。同时,向龙同学提供了放大图示的手段,郑同学此前不知道放大的方法,我没有想到选取具体的时间节点。

4.4 时间转换,双向;新的关键环节:时区

有的同学可能已经注意到我上面引用的代码中的时间是UNIX时间戳,这是zhumao提示的。具体使用的时候,我的时间戳来自两个来源,(1) 从 rrdtool graph 的代码中抄,(2) 利用在线工具 [http://www.epochconverter.com/] 双向转换。

epoch

我这样找到在线工具的, bing: unix time stamp convert,然后右上角"Switch to Bing in English"。第一页前几个就很好使。

(3)命令行工具,Linux内置

----代码开始----
$ date --date='2016-09-26 17:02 CST' +%s
1474880520

$ date --date @1474880520
Mon Sep 26 17:02:00 CST 2016
----代码结束----

(4) 等实验完成了我才注意到,rrdtool fetch 接受一般的时间格式,还有倒退几分钟这样的功能。可以不用UNIX时间戳的。

在转换时间格式时我注意到有时区,所以为了避免可能的问题,确认了一下操作系统本地时区是东八区,北京时间。

----代码开始----
$ date -R
Mon, 26 Sep 2016 17:36:37
+0800

$ date +%z
+0800
$ date +%Z
CST
----代码结束----

5. 加强、改进,玩

大局已定,我们对手册里的其他工具做了些尝试。与其说是加强和改进实验结果,不如说像猫抓到老鼠以后行为,"总算抓到了,快让我玩会。"我在程序跑对了以后,也总喜欢再多跑两次,好像生怕它会跑出不同的结果,或者多享受几次正确地运行。

5.1 用命令行过滤数据

为了后续开发方便,我用命令行去除了数据中无用的部分。

----代码开始----
$ rrdtool fetch h3c12508_traffic_in_190.rrd -s -5min AVERAGE | tail -2 | head -1
1474879500: 1.9791172526e+08 5.0410319243e+08
----代码结束----

其中的 -s -5min 指数据截取的开始时间为从此刻回退5分钟,结束时间为此刻。

5.2. 查手册,得到解释及更丰富的语法

还有导出为xml格式

----代码开始----
$ rrdtool xport \
> --start='1474595681' \
> --end='1474595683' \
> DEF:a=h3c12508_traffic_in_190.rrd:traffic_in:AVERAGE \
> CDEF:cdefa='a,8,*' \
> XPORT:cdefa:"IN"
<?xml version="1.0" encoding="ISO-8859-1"?>

<xport>
<meta>
<start>1474596000</start>
<step>1800</step>
<end>1474596000</end>
<rows>1</rows>
<columns>1</columns>
<legend>
<entry>IN</entry>
</legend>
</meta>
<data>
<row><t>1474596000</t><v>9.0713941203e+08</v></row>
</data>
</xport>
----代码结束----

导出为json格式

----代码开始----
$ rrdtool xport \
> --start='1474595681' \
> --end='1474595683' \
> --json \
> DEF:a=h3c12508_traffic_in_190.rrd:traffic_in:AVERAGE \
> CDEF:cdefa='a,8,*' \
> XPORT:cdefa:"IN"
{ about: 'RRDtool xport JSON output',
meta: {
start: 1474596000,
step: 1800,
end: 1474596000,
legend: [
'IN'
]
},
data: [
[ 9.0713941203e+08  ]
]
}
----代码结束----

5.3. 后备方法 rrdcgi, librrd, rrddump

我们还知道些后备的方法,在当前项目中不会用到。

估计可以用于http输出的rrdcgi, 估计可以与其他语言 (C?)联合开发用的librrd,估计可以把数据库倒出来的工具rrddump。

6. 总结

猜测在学习新工具中的作用如此重要,以至于如果你没有猜测的话,就不要按下回车。哪怕你有很多种猜测也好,只要列出一张表来,一个个试过去,留下看起来最正确的那个。但是如果你没有猜测,就失去了主动性,而是被动地观察实验现象,却对支配实验现象背后的物理图景毫无察觉。

据说,李靖与李世民讨论兵法,他说: 千章万句,不出乎"致人而不致于人"而已。
hole
------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/] 悄然支持http2,再次感谢高博先生

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]

读书的层次

309347656264971844我读书少,不敢妄谈读书,更不敢讨论层次。只不过还是因为读书少这个原因,想不出来别的文字,题目才取此下策。我只想讲几个故事。

1.

因为家里没有几本书,我小学三四年级的时候开始经常去市图书馆。图书馆的大部分不对少年儿童开放,只有两处除外。一处是少儿外借,以童话和科普为主,没有习题集,另一种只能在阅览室里看,花花绿绿的少儿杂志。我当时对少儿杂志颇为不屑,觉得怎么那么幼稚呢,都是大人模仿孩子说话,内容明显骗人,感觉作者以为你很弱智的样子。所以我大多数时候只读外借的那些,觉得自己很与众不同的样子。想借大人的书,不让。

这正是当今不少成年读书人的写照。就是那种感觉,我很孤独,我的观点如此帅呆,我如此卓而不群,与传说中的萨特叔本华尼采有得一拼,只是现在还没有成名罢了,你们这群盲人。也不是一样一样的,相去不远也。

现在的你当然一眼就看出来我当年的幼稚了,三四年级的孩子中的一个孩子,不过如此。

很多时候,孤独仅仅因为视野狭窄,没有找到同路人,没有看到引路人。我至今经常为想到某个观点沾沾自喜,后来发现早有人提出,而且深刻得多,完备得多。说来还是见识少。如果多些这样的打击,孤独感顿消,在古今了不起的思想中,你我的看法连渺然众矣的资格怕都没有。某些人的"祖上早已有之"也在此列,包括莱布尼兹的二进制即我周易之阴阳,包括康德的道德不就是己所不欲勿施于人么,那都是你的肤浅理解。肤浅二字,正是字面含义,不是替你自谦。
268083529194917900
2.

前一段王宝强新闻,有人提到在《唐人街探案》中早有伏笔。我怎么也想不起来,几经启发还是毫无印象。后来到douban上找剧照,才一拍脑袋,啊对对对。有些电影电视情节,看了就忘,甚至连"不好"二字的评价都没有印象。当年李记者、小刘同学大力推荐 The Big Bang Theory,我看了半集实在难以继续。后来跟Johan Lilius 教授提起这剧集,他说,不错。我说,是么,如果你推荐的话倒是值得再试一次啊。他笑着补充,看的时候记着把脑子关掉一会儿。我试了,果然灵验。如果你只保持那么几分钟的记忆 (金鱼七分钟记忆是扯淡,你喂过就知道,它们见到人影挥手就会有巴浦洛夫条件反射,决不是七分钟前训练出来的),只关注隐约的印象,不要太过于深究细节和合理性,bang,整个世界都好了,很幽默。

我用同样的方法看《破产姐妹》也很好。当年流行过的《学习的革命》《给加西亚的信》《少年派的奇幻飘流》如果我能持这样的态度,估计读起来也会顺畅很多。

但是并非所有的作品都适合这种骑马观花一样的心态,那些需要拿来真正干活儿的知识,松懈不得。可惜有些人读什么都是"在这个夏天,我度过了人生中难忘的一段,读到了如此感人的作品",除了感觉,别无其他留下。当然,还有,可以吹嘘,比如我读过《飘》《乱世佳人》《呼啸山庄》《简爱》《傲慢与偏见》《瓦尔登湖》。然后呢,这些作品的细节你还记得哪些,这些作品改变了你的什么品质和观点,能背诵一段出来也陶冶一下我的情操么?注: 我举例这些女性喜欢枚举的作品决不是男权思想,而是因为男性通常连这些都不读,甚至连篇名都不知道。

3.

当年本科一年级,大家在宿舍吹牛,不记得怎么就说到了希特勒。我就说,希特勒他不是德国人,他出生在奥地利,就像拿破仑出生在科西嘉岛,那时候科西嘉属于意大利。有人使用了群嘲技能,我被各种嘲笑。

第二天,我去图书馆借来《第三帝国的兴亡》,指着其中的某行给那位最坚定不相信我的同学看。他先是奇怪我为什么举本书给他看,然后是大度地说,"哎呀,你还这么当真啊",中间唯独没有原来如此的表情。

不少人读书是这位同学的态度,忘了就忘了,能怎么样呢。另有不少人读书 (或者读摘要)是我当时的态度,你看这个你又不知道吧。

忘了就忘了的态度,我在科幻作者中见到不止一例。参加科幻的笔会,我带着对那些作品景仰的心去的,每遇到一位作者就巴巴地说,"我读过你的某某篇,那一段太感人啦,那个人物我太喜欢啦"。好几位作者对我说,"我不记得了啊,因为我写过好几个版本,发表的时候都不知道是哪个版本了。"我信以为真,直到遇到潘海天先生。我非常心潮澎湃地对他回忆了他写的斩蛟一段场景,他很淡淡地说,"大家都是作者,你不用这样。"然后奇怪的说,"这段发表的时候删了,你在哪看到的?"我在清韵论坛上看到的。他是我见到的科幻作者中第一位记得自己写过什么的,刘慈欣先生也记得自己写过些什么。

有些作者没有忘记自己写了什么,甚至比读者记得的更多。我拜见《构建之法》作者邹欣先生,说了我在教学和工程中的一些困惑。其中有几个问题解答时他提到,就在书里的某某处作过讨论,有一处甚至引用了一下原文。面对这样的作者/读书人,我不敢奢谈我读过。因为当时还有我以前的一位学生在场,我回顾了一个故事的细节,用来说明软件工程中的沟通困难。我讲完以后,邹欣老师补充说,这个故事出自 Malcolm Gladwell。我特别担心他接着说,你哪里哪里还讲错了。你精确地记着,才能说读过了。

当年我跟 Lars 教授讨论 Applying UML and Patterns 的教学体会,他委婉地指出,如果你仔细读的话,就会注意到领域模型和分析模型不是一回事。语气坚定到我不敢辩驳,只能感谢指点,我回去再仔细看看核对一下。相信他当时就是我面对某些同学瞎说教材骗人时的感觉--你真的读过书么?站在他对面的我的感觉要好得多,谢谢赐教,令我知道自己的无知,才能进步。
824061398513530290
作为人群的分界线,除了忘了就忘了的态度,另一类是你看这个你又不知道吧,就是当初显摆知道希特勒的我的那种。摆出一大堆 (自以为) 你不知道的细节,以显示众人皆醉我独醒。比如,吾生也有涯而知也无涯 的后面还有半句,国民党在抗战正面战场中的作用被抹杀了,阿拉伯在中世纪非常发达--然后得出结论咱们都被课本害了。只有你被课本害了,不包括我。我清楚记得,你显摆的这些在课本里本来就有,吾生也有涯那段,在课本的脚注里提到了出处,还提到了后半句;抗战正面战场,我们的课本里有血战台儿庄,还配了某位将军的肖像插图,蔡廷锴和蒋光鼐的名字,在历史课本的八一宣言那节附近,不知道你学的什么课本;阿拉伯在中世纪对西方文化的保留,在奥斯曼土耳其一章里有。

另一种知识,汉字中笔画最多的是 齉,读作 nang,四声,36画,你知道么?我特别希望你回我一句,有用么。

4.

我有一次请教 Johan Lilius 教授一个性能相关的设计框架问题,该问题困惑了我不止一年。他一共回答了两点。第一点,他问我,你的显示器刷新频率是多少?我说,60Hz吧,怎么了。他说,你的程序为什么要比显示器刷新更快呢。我一拍大腿,对啊。他回答的第二点,说,"你等会"然后就开始翻笔记本电脑,过了一会给我一篇论文,说你看看就明白了。我一看,80年代的,再看内容,解决了我的困难/告诉我不必再沿此路继续。

我指着那篇文章说,老师啊,这太让人生绝望了。我想了这么多年解决不了,而1987年 (或者1986)年人家都写成论文了。他说,博士学习是这样的,你要阅读大量的文献,要了解别人做了哪些工作。我的导师牛老师和马老师也这么教导过我,只是我没有这么实践而已。

自觉站在一群俗人中间,以为自己不同于俗人,但是也只读着俗人的书,做着俗人的事,却寄希望于有超出朋侪的观点。这多么不现实。有些女性每天读着《小时代》以及诸如此类的情感糖块,幻想自己是世界的中心宇宙的未来,只等霸道总裁发现自己的美丽;有些男性读着周易、佛学、基督,长篇大论指出世界该当如何发展,如果中国/亚洲/世界按他那么整指定就好了。反正又不付出什么代价,大不了到头来一句,"啊呀我记错了"或者"肯定是你理解执行还有问题"。

如果说见识少的结果只是孤独,孤芳自赏就是另一个层次了。

5.

当年我有个学生是基督徒,她跟同学们谈起一些事迹和理论,我提醒 你某个地方可能记错了啊,补充某处如何如何。她说,老师你又不信,为什么会知道这些呢。

我当时有开玩笑的意思,"就是等着遇到像你这样信的人,然后指出你说错了啊。"

我现在有时会沉默,觉得你高兴就好。有时,我会站出来说,你别瞎扯了,你说的那些我们也知道,但还是得出了不同的结论。当我出声的时候,我想到的是邹欣、刘慈欣、潘海天、Johan Lilius、Lars 这些人。我向他们学习,像他们帮助我那样,也告诉你,1.并非所有的人都和你周围的人一样,你只是见得少;2.你可能和你周围的人并没有什么差别,得看得更仔细一些;3.你真的确信并敢于声称你读过某本书么?

仰之弥高。

有时,吾生也有涯很令人绝望,到死也读不完也读不到那种程度,活着还有什么意思;有时,想想这样也很好,还有那么多书没有读那么多道理没有懂那么多细致的义理没有参透,怎么舍得去死。
550145133099239756
------------------------------------------------------------

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/] 悄然换成了https,再次感谢高博先生

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]