8
31
2014
21

又想起曾经的老师们

刚刚竟然梦到了高中英语老师,那个带领我们猜测试题的意图的脾气挺好的女老师。不过这里我要说的是另一位老师,一位脾气很坏的老师,一位造成我即使对很好相处的老师也感到害怕与不友好的老师,一位部分地导致我在很长的时期内与年长的人的交际障碍的老师。

她叫刘静,和中国广播电台经济之声一位主持人重名了。武汉市蔡甸区第三小学的一名教师。1997年至2000年是我所在班级的班主任,教「数学」(我不认可那时的教学方式和教学内容是数学;算术罢了)。当时她年龄大概30来岁。脾气很坏,教课无方。最常见的教学手段有二:一、拿教鞭跳起来敲讲台,敲得讲台上的粉笔头到处乱蹦,粉笔灰弄成雾霾;二、拿教鞭打手心来惩罚学生。当然那个时代,几乎所有老师都体罚学生,有些手段还更讨厌。只是体罚加上她在讲台上的「表演」,让我们在下面的学生都噤若寒蝉、惊恐不已。更重要的是,她的女儿也在这个班级,所以我们经常可以观看到一场场惊心动魄的家祖暴力。哦对了,我当初转到她这班里时没送礼,据说要不是成绩单上的数字比较大她还不会收。所以大家看,成绩好有时候并不是什么好事。

「上帝欲使其灭亡,必先使其疯狂。」不知道她现在灭亡了没有。但愿她没有继续毁人不倦。

刘静是我印象最深刻的一位老师。同时期还有一位叫张攀的男计算机老师给了留下了深刻的印象。我从那时就很喜欢计算机了,当然能力也在同学之上。但是这位张攀老师对我的提问不理不睬,因为他偏爱另一位成绩也很好的萌妹子。不仅如此,他似乎对我怀有敌意。每个孩子都会犯错。当时课上在关机的情况下练习使用鼠标,我觉得颇为无聊,把鼠标当成非电器左右推来推去地玩儿,结果招致他很严厉的一句话。具体是什么我已经忘记了。他平时脾气挺好的,经常和学生有说有笑的。那是唯一一次我见到他生气。

也就是从那时候起,我开始对各种老师敬畏有加,生怕不小心又招惹到某位疯狂或者敌意的大人。所以,尽管后来遇到过不少挺不错的老师,我也只能辜负他们的友善和帮助了。孩童时代教育中受到的伤害,和在爱情中所犯下的错误一样,要花费数十倍的时间才能慢慢弥补。

Category: 未分类 | Tags: 教育
8
29
2014
77

再三错过(及关于工作的各种吐槽)

刚刚看到一则消息,令我很不好受。又拍云,就是我这博客现在贴图和文件下载使用的那个 CDN,也是 CloudFlare 的中国版,依旧在招开发工程师。而两个月前,我在他们那里。他们告诉我当时他们只缺一个人。十数日之后,他们 HR 终于在数倍于承诺的时间之后告诉我,他们不缺人了

福无双至,祸不单行。这种令人很不好受的事情也并不是第一次发生了。大约两年前,我找朋友内推红帽(中国)的工作。结果被拒了,理由是,他们不缺人。大约两三个月之后,那位朋友又告诉我,他们又开始招人了。

更早一些,我毕业那年,搜狐来武汉了。我去面试,结果认为我能力不够。等我确定工作之后,他们却又有人在 Gtalk 上问我要不要去那里。

其实阿里巴巴那次也有类似的情形出现,虽然被拒的主要原因在于我严重休息不好、自由太少导致的状态欠佳。哦对了,没有预料到他们有人自己不懂 TCP 基础就问我网络相关问题也应该是原因之一。当时有人给我推荐工作的时候他们很缺人。但是因为我刚回到老家,很累,还没准备好应聘下一份工作,所以迟了几天。结果那时候他们就不怎么缺人了。

一直想不明白,为什么事情会一直是这个样子,总是错过想要的工作。也许自从走进武汉大学信息学部的那一刻就注定了如此命运吧。也许这种事情再三出现,是因为那次冲动的初恋告白。好像我总是第一次做不好呢。第一次初恋。第一次找工作,没有任何经验,根本不懂得表达自己。第一次选学校,由于信息严重不足导致选择了不适合的学校-专业组合。第一次正式学习编程语言,也是因为资源有限,学了 C++。第一次选择文本编辑器,还是由于信息不足,而选择了私有且不再支持 Linux 的 EditPad Pro。第一次选择命令行 shell,既没有选择大众的 bash,也没有选择功能强大的 zsh,却是挺随意地用上了(当时有不少问题的)fish。第一次自己买电脑,CPU 竟然不支持虚拟化。第一次租房,也是很令人不悦的方寸之地。

当然,人总是会从过去的不满和失意中吸取教训,在反复不断地练习之中臻于熟稔。可是,现在,在这里,这个社会似乎并不认同这一点。我应聘阿里巴巴的时候,他们几乎不问任何具体的技术问题,而是纠结于你之前的工作内容是什么、有没有管理服务器经验(我应聘的是运维开发)、做过的项目能多少并发(你倒是给我找来足够压垮我的项目的用户呀)。也问过我根本没有接触过的东西,比如如何管理上百万的服务器。这其实是很容易学习的事情。他们不承认人的学习能力,总希望别的公司给他们的员工培训,让他们的员工在别处赚取经验。当然,这样规避了风险,使得招进去的人的能力的标准差比较小。没办法,他们招人的人的能力不行(不懂 TCP 就别给我谈网络),所以只能招到能力不是很行的人(连重要的密码都敢往 GitHub 公开项目里扔)。(其实历史已经证明了招个王垠进去也不会出大事的说。)

曾经有人跟我说,我在群里帮忙解答问题的那些人,工资都是我的几倍。很无语。但是也没什么好说的。他们在专业技能上花的时间少,但是在交际、演讲方面花的精力多。招聘通常没办法直接测量应聘者的专业技能,于是只能通过一些表象来推测。就像让你只通过观看来比较两个物体的质量,你只能从体积、色泽、纹理等方面去揣测。然而,这其中没有一项有比较高的证明力度。经验在大多数情况下有效,仅此而已。

我还听我曾经的 boss 评价一个自称对多个方向均有兴趣的应聘者,认为一个人不可能对如此多的方向均有兴趣。言外之意是认为简历有吹嘘之嫌。可是我比那人的兴趣点还要丰富得多啊:Python、C、Linux 系统管理、网页开发、自动化运维、Lua、函数式编程,还有更远一些的,数学、物理、化学、天文、地理、语言学、经济、历史、生物、文学,这些也都是我所喜欢的。另一些人(很正确地)注意到,「喜欢」、「有兴趣」与「擅长」是两码事。于是,「喜欢XYZ」没用。你已经会了什么就继续干什么吧。和第一份工作的公司一样,开始决定结局

我注意到现在很多人喜欢「撞大运编程」。根本不理解程序在干什么。它不工作了,那么就这样试试,再那样试试。有错误消息?太晦涩难懂了,当作不存在好了。很好奇为什么我能很快看出问题来?答案很简单:因为我在尝试理解已有的信息表达了什么。在这里这个对象本应该有的方法却不存在。咦这个对象根本不是预期的对象。哦,这个对象是在初始化那里通过注入的方法弄进来的。咦你声明要注入的对象列表里怎么比初始化的参数列表少了这个出问题的对象?OK,问题解决。

这个事例也很好地说明了我为什么要用 Vim,我为什么不喜欢重复的代码,以及在必要的时候我为什么喜欢复制粘贴已有的相似代码片断而不是重新打一遍。使用 Vim 当然是因为搜索和复制以及对复制之后的代码的处理很方便。除了弱到爆的文件编辑功能(你一直在切换键鼠、一直在找需要的文件所在的那个标签、一直在输入已经输入过的单词和代码行,你没意识到么),另一个 IDE 令我吃惊的是,它们竟然鲜有支持多栏布局的!就是同时显示多个文件,通常是竖直并列,这样方便对照查看。不然用那么大的显示器多浪费啊。

我突然有点想什么时候给 CloudFlare 投简历了。虽然我从没有出过国。本来我想去又拍云就是受到了 CloudFlare 那博客的影响,而他们又一直在博客末尾说在招人。不管怎样,那会是一条非常不确定的旅程。我还没准备好。还是努力让生活慢慢变好吧。现在已经比之前好了很多了呢。虽然与我携手走过生命中剩下的旅程的那个人还没有出现,不过带我来到一个不适合我的环境、并一直阻碍着我追寻自己的人已经远去了。

又,我本来不习惯在这边写自己对非技术的想法的。但似乎只有写在这边才会有人看。那么妥协好了。坚持太累,放弃一些给自己放飞。


2014年9月5日更新:阿里巴巴又在招 Pythoner 了,而且这次是非常符合我目前技术方向的职位…………

Category: 未分类 | Tags:
8
5
2014
9

CoolShell 解密游戏解答

这里有人给出了自己的解法,但是我不喜,所以有了本文。注意,本文中的 shell 代码均为 zsh。如果你在用 Windows,那建议还是不要玩了,那个对付这种事情太难用了。

可惜知道这个题晚了两天,没能进前X名 :-(

0. Fuck your brain

机器上没有 brainfuck 编译器,于是 Google「brainfuck online」,得到这个。贴进去运行即可。

1. Multiply

一个值是 42。另一个要观察数列。直接把数列贴到数列百科全书即可。然后乘起来。

2. Keyboard

这个也很容易,不是把 Dvorak 键盘当成 Qwerty,那就是把 Qwerty 当成 Dvorak 了。对照着 Dvorak 的键位输入下边那串字符串,得到一 C 源码。编译、运行之即可。

3. QR Code

扫码,得到:

[abcdefghijklmnopqrstuvwxyz] <=> [pvwdgazxubqfsnrhocitlkeymj]

是个字符映射关系。Python 有现成的函数来处理这个。也是有正反两种可能,都试试就可以了。

>>> T = str.maketrans('pvwdgazxubqfsnrhocitlkeymj', 'abcdefghijklmnopqrstuvwxyz')
>>> s = 'Wxgcg txgcg ui p ixgff, txgcg ui p epm. I gyhgwt mrl lig txg ixgff wrsspnd tr irfkg txui hcrvfgs, nre, hfgpig tcm liunz txg crt13 ra "ixgff" t
r gntgc ngyt fgkgf.'
>>> s.translate(T)
'Where there is a shell, there is a way. I expect you use the shell command to solve this problem, now, please try using the rot13 of "shell" to enter next level.'

按照提示执行命令:

rot13 <<< shell

Arch 上,rot13 命令位于 bsd-games 包。或者在 Vim 里把光标移动到「shell」单词上按g?aw也能得到结果。

题目开始有趣起来了~

4. cat

这个题目更有趣了。源码里一堆乱七八糟的数据。先把它们弄到一个单独的 Vim 缓冲区,然后找到所有的五字符回文字符串:

%!grep -oP '(.)(.)(.)\2\1'

不是所有回文都被接受。仔细观察示例可以发现,中间一定是个小写字母,左边一定是一字母一数字。但是过滤后还是有太多结果。限制左边的字母为大写字母之后可以得结果。删掉不符合条件的,然后把中间的字符连起来即可。

v/\v^([A-Z][0-9]|[0-9][A-Z])\l/d

5. variables

初看,提示莫名其妙。后来注意到图片链接到了有意思的地方。访问得到另一个数字「32722」。显然是要用这个数字放在 URL 上继续访问了。直接拿 shell 访问:

$ n=1024
$ while true; do n=$(curl -sS http://fun.coolshell.cn/n/$n); echo $n; done

访问上百次之后出现一句话,给出了下一关的地址。

6. tree

这关要求从一棵二叉树的中序和后序遍历中还原其最深的路径。不知道怎么做,直接 Google「reconstruct a binary tree from in-order and post-order」,看来有不少人都在做类似的东西啊。我看的是 LeetCode 上的这篇文章。有代码,但我懒得写程序把树画出来或者是找最深的了。反正这树也不大,懂得了方法,直接在 dia 里手工构建出来了。当然,我只构建了最深的那部分。SVG 导出图片

然后就是拿密码解那个字符串了。要注意的是,不要自己去解 base64,不然 openssl 报错的……

7. N Queens

八皇后问题的变种。我直接使用了 Rosetta Code 上的代码。当然要小改一下,直接输出结果而不是打印出图案:

main = mapM_ print $ queens 9

然后找到符合那个 SHA1 值的解就可以了:

$ ./queens | tr -d ',[]' | while read code; do [[ $(sha1sum <<<zWp8LGn01wxJ7$code | awk '{print $1}') == e48d316ed573d3273931e19f9ac9f9e6039a4242 ]] && echo $code; done

8. Excel Column

26 进制转十进制:

>>> def debase26(x):
...   return sum(26 ** i * (ord(d) - ord('A') + 1) for i, d in enumerate(x[::-1]))
...
>>> debase26('COOLSHELL') // base26('SHELL')
85165

结果得到的页面说要转回 26 进制。好吧:(可惜没能在一行内搞定)

>>> def base64(x):
...   L = []
...   while True:
...     x, d = divmod(x, 26)
...     if d == 0: break
...     L.append(d)
...   return ''.join(chr(x + ord('A') - 1) for x in L[::-1])
...
>>> base64(85165)
'DUYO'

9. Fraternal Organisation

这个我没能解出来 QAQ 这两个图片看起来有些莫名其妙。我没注意到图片的名字和鼠标放上去的小提示。最后是看前边那个链接里的答案才知道原来还有个「猪圈密码」-_-|||

PS: 最近博客访问和评论速度都挺慢的,请见谅。

Category: Linux | Tags: linux python shell fun

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com