Ubuntu 重新映射键盘布局

键盘持续失灵,已经到了让我忍无可忍的地步了。

刚开始只是方向键失灵,好在可以用小键盘替代;后来右 Ctrl 和 Alt 也失灵了,好在可以用左边的替代;直到最近 Fn 键也失灵了,终于逼疯了我——因为这意味着 F1 ~ F12 都将不能使用。

我曾试图寻找方法将 CapsLock 键映射为 Fn 键映射,但失败了——Fn 键消息是由 BIOS 拦截的,无法被操作系统捕获。

但今天我找到了一个更好的替代方案:

  • 交换 Fn 和 Ctrl。这是唯一一种能让 Fn 键移位的方式,在所有的 BIOS 中都可以设置。
  • 将 CapsLock 映射为 Ctrl。反正 CapsLock 闲着也是闲着,不如用它代替坏了的键。

ubuntu 下需要执行:

setxkbmap -layout us -option ctrl:nocaps

参考: How do I turn Caps Lock into an extra Control key? - Ask Ubuntu


为什么我要翻墙

很多人不解为什么我要翻墙。他们认为,国家明令禁止的东西就不应该去做——而更何况,墙内的世界已经足够精彩,异世界的天空也不一定令人神往。

在中国大陆,能上网的人被分为两类:翻墙的 与 不翻墙的。这里说的“翻墙”不是“有能力翻墙”,而是“有意愿翻墙”。这两类人奇怪地构成了一个鄙视环。翻墙的 看不起 不翻墙的,认为后者甘于“虚假”的现状。其中不乏有狂热的传教者,不遗余力地宣传墙外的世界,并对不接受者嗤之以鼻;同时,不翻墙的 又鄙视 翻墙的,认为后者崇洋媚外,被国外反华势力蛊惑,以致对 翻墙 产生如信仰宗教般的虔诚。

对于不理解我的人,我表示理解。如果我也以你们的身份生活在你们的环境,墙内的世界的确很大、很精彩,的确足够了。再者,翻墙 很麻烦、很不稳定,牺牲流畅性与易用性去浏览一些无趣的内容,确实不值得。

但我想说的是:墙内的世界对于某些人而言,贫乏得可伶。

我喜欢编程。与写作不同的是,编程不仅要靠思考,更需要一些外部工具的辅助。思维是编程工作的灵魂,但思维仅仅提供了一个脉络,在思维的引领下,我需要组合使用各种工具来解决问题。工具的数量很多,细节很复杂,我不可能记住,也不应该都记住。因此,我需要搜索它们的使用说明。一个好的搜索引擎是编程时必备的利器,而我选择了 Google。不是因为我崇洋媚外,而是 它 的确 能高效地让我找到答案,解决我的问题。

我要翻墙,因为我想要的工具在墙内不存在。同时,有一些我想要的答案也在墙外(如 Wikipedia)或部分在墙外(如 引用了 Google CDN 的 StackOverflow)或时不时在墙外(如 Github)。当你的合理需求无法满足时,理智的人都会想方设法地去满足——这很自然,就像吃完了一片草地的羊群会自动迁徙至另一片草地一样。

是的,我翻墙,只是因为我有翻墙的需求。对于某些翻墙发烧友所推荐的某些“真相”,我不感兴趣。隐匿的东西之所以被隐匿,总有它的理由;而被揭露的东西之所以被揭露,也总有他们的目的。

百度作的恶,不能原谅。但抛开这一点,我并不排斥百度。百度不如 Google 科学,但它更适合中国。西方人更注重逻辑思维,同时他们也有更高的受教育程度,科学的 Google 是他们所需要的。而在中国,真正需要科学的只有很少一部分人,更多的人需要的只是科普,一个浅显的答案,只要结论正确,甚至不需要完全严密的推理,足够了。更何况,中国的网络是一个娱乐至上的环境,一个八卦的搜索引擎也许会比一个严谨刻板的搜索引擎更受国人青睐。

对于 GFW,即 墙 本身,我也不怨恨。起初接触到这样一个存在时,我很惊讶,感叹国家还有这样的一面。这个无形的庞然大物产生于旧世纪末,有其特定的时代背景,被人诟病的同时却也有着它的合理性。有人认为,思想自由是人权的一部分,GFW 的存在是反人类的。有段时间我信以为然,并传播这样的思想。但当我真实地接触到那些“被禁锢的人”时,我却犹豫了。前段时间的“诺贝尔哥”事件就是一个很好的样例。游荡在网络中的许多中国人是不理智的——尽管他们也受过教育,但接受的只是知识,而不是思维。他们甚至不知逻辑为何物。这些人看起来是无害的,可一旦他们接触到所谓的“真相”,或说是一些人想让我们接触到的“真相”时,感性会使他们意气用事,造成社会的不稳定。诚然,人权至上,但社会稳定更重要,人权在乱世只是一纸空话。历史的对错,国家自己知道。民众应该知道历史,但如果真相会对现实产生不可预测的坏影响,倒不如让它烂在土里。

我不嘲笑 不翻墙 的人,他们扮演着自己的角色,有着自己的需求与选择;我也会继续 翻墙,因为我有这样的需要。

驱使一切的,只是需求而已。


Python“黑魔法”之 Generator Coroutines

写在前面

学过 Python 的都知道,Python 里有一个很厉害的概念叫做 生成器(Generators)。一个生成器就像是一个微小的线程,可以随处暂停,也可以随时恢复执行,还可以和代码块外部进行数据交换。恰当使用生成器,可以极大地简化代码逻辑。

也许,你可以熟练地使用生成器完成一些看似不可能的任务,如“无穷斐波那契数列”,并引以为豪,认为所谓的生成器也不过如此——那我可要告诉你:这些都太小儿科了,下面我所要介绍的绝对会让你大开眼界。

生成器 可以实现 协程,你相信吗?

阅读更多

数学美 之 判断线段相交的最简方法

解析几何的巅峰 是 向量 那无关过程的狂妄与简洁 映射着大自然无与伦比的美

引子

如何判断两条直线是否相交?

这很容易。平面直线,无非就是两种关系:相交 或 平行。因此,只需判断它们是否平行即可。而直线平行,等价于它们的斜率相等,只需分别计算出它们的斜率,即可做出判断。

但倘若我把“直线”换成“线段”呢——如何判断两条线段是否相交?

这就有些难度了。和 直线 不同,线段 是有固定长度的,即使它们所属的两条直线相交,这两条线段也不一定相交。

也许你会说:分情况讨论不就行了嘛:

  • 先计算两条线段的斜率,判断是否平行。若平行,则一定不相交。
  • 若不平行,求出两条线段的直线方程,联立之,解出交点坐标。
  • 运用定比分点公式,判断交点是否在两条线段上。

的确,从理论上这是一个可行的办法,这也是人们手动计算时普遍采用的方法。

然而,这个方法并不怎么适用于计算机。原因如下:

  • 计算中出现了除法(斜率计算、定比分点),因此每次计算前都要判断除数是否为 0(或接近 0)。这很麻烦,严重干扰逻辑的表达。
  • 浮点精度丢失带来的误差。人类计算时可以采用分数,但计算机不行。计算机在储存浮点数时会有精度丢失的现象。一旦算法的计算量大起来,误差会被急剧放大,影响结果准确性。
  • 效率低下。浮点乘除会十分耗时,不适用于对实时性要求较高的生产环境(如 游戏)。

那么,有更好的方法?

当然有。

阅读更多

除夕杂感

直到下午四点,供桌才摆上。

冒着热气的鸡,整只;两尾鱼,张着嘴卧在盘中;一摞柑,愣是叠成了宝塔的形状;此外,还有一包包花花绿绿的零食。一米见方的桌子被塞得满满的,全是贡品。

母亲忙得团团转。本来是不想拜天公的,但转念一想,不是太好,便摆上了。阳光下,热气一直往上冒,往上冒,直到看不见的地方——那里,想必就住着那位神。

看来,这位神一定是个重要人物了——不然,母亲怎会遗忘了其他的几位,而只供奉他一个?

搬家之前,家里可还是住着许多神的:门口有一个,阳台上有一个,厨房有一个,抽屉下有一个,就连洗衣机上也有一个。听母亲说:每一家都有,每一位神,都在守卫着这个家。

神们也不是白干活,也是要吃饭的。不只是过年,每个月中总有那么几天,神们会一起来要吃的。每到这时,母亲便会忙活起来,为他们张罗吃的。好在他们并不挑剔——生的,熟的,速食的,神们都默默地收下了。当然,贡品在屋子里转了一圈,自然又都进到了我们的肚子里。

每换一个地方,母亲便上一炷香,虔诚地跪下来,轻轻地拜两拜,口中念念有词。

接着,她又拉我一起来。

我不懂,她便教我——想着自己想要的事就好了。

我学着样子跪下来,胡乱说了几句,装模作样地拜了两拜,余光却仍盯着那食物。

听母亲说,这是老家带来的习俗。对神的敬畏,在那个古老的地方,说着那古老语言的人们,已经沿袭了很久很久了。

人终是怕神的——以前是,现在也是;中国是,外国也是。神像一群喜欢偷窥的人,在这里,也在那里,在每个角落偷窥着你。你受欺负时,神会给你庇护;你做坏事时,神会予你惩罚。因此,怕神的人,多是善良的。

说是怕神,倒不如说是怕天,敬畏变幻莫测的未知。活物总是怀着对死亡的恐惧,人类也不例外。未知中蕴藏着杀机,使愚昧的人类感到不安,转而求助于那假象中的造物主,那超能力者,那个开着全局视角看戏的“人”,这便成了“神”。神为人类抵挡着未知,人类也因此安分守己,深怕触犯了神,再次被暴露于未知的荒野中。

然而,神正在离去,因为未知正在散去。

但藏在那未知背后的是什么,谁又知道呢?未知的背后仍是未知,现实可以是虚幻,真理也可以是谬误,时间洪流夹带着未知,使任何人都只能屏息,任何人,都不可以妄自尊大。

好在,还有神——尽管神正在离去。

但终究,怕神的人是善良的。


17 行代码实现的简易 Javascript 字符串模板

这是源于两年前,当我在做人生中第一个真正意义上的网站时遇到的一个问题。该网站采用前后端分离的方式,由后端的 REST 接口返回 JSON 数据,再由前端渲染到页面上。

同许多初学 Javascript 的菜鸟一样,起初,我也是采用拼接字符串的形式,将 JSON 数据嵌入 HTML 中。开始时代码量较少,暂时还可以接受。但当页面结构复杂起来后,其弱点开始变得无法忍受起来:

  • 书写不连贯。每写一个变量就要断一下,插入一个 +"。十分容易出错。
  • 无法重用。HTML 片段都是离散化的数据,难以对其中重复的部分进行提取。
  • 无法很好地利用 <template> 标签。这是 HTML5 中新增的一个标签,标准极力推荐将 HTML 模板放入 <template> 标签中,使代码更简洁。

为了解决这个问题,我暂时放下了手上的项目,花了半个小时实现一个极简易的字符串模板。

阅读更多

Python“黑魔法”之 Meta Classes

接触过 Django 的同学都应该十分熟悉它的 ORM 系统。对于 python 新手而言,这是一项几乎可以被称作“黑科技”的特性:只要你在 models.py 中随便定义一个 Model 的子类,Django 便可以:

  • 获取它的字段定义,并转换成表结构
  • 读取 Meta 内部类,并转化成相应的配置信息。对于特殊的 Model(如 abstractproxy),还要进行相应的转换
  • 为没有定义 objectsModel 加上一个默认的 Manager

开发之余,我也曾脑补过其背后的原理。曾经,我认为是这样的:

启动时,遍历models.py中的所有属性,找到Model的子类,并对其进行上述的修改。

当初,我还以为自己触碰到了真理,并曾将其应用到实际生产中——为 SAE 的 KVDB 写了一个类 ORM 系统。然而在实现的过程中,我明显感受到了这种方法的丑陋,而且性能并不出色(因为要遍历所有的定义模块)。

那么事实上,Django 是怎么实现的呢?

自古以来我们制造东西的方法都是“自上而下”的,是用切削、分割、组合的方法来制造。然而,生命是自下而上地,自发地建造起来的,这个过程极为低廉。 ——王晋康《水星播种》

这句话揭示了生命的神奇所在:真正的生命都是由基本物质自发构成的,而非造物主流水线式的加工

那么,如果 类 也有生命的话,对它自己的修饰就不应该由调用者来完成,而应该是自发的

幸而,python 提供了造物主的接口——这便是 Meta Classes,或者称为“元类”。

阅读更多

诗集

mybirth:fDCJhVUYITMJHBapLo7zoA==:Mko5rQBDxhI2bgV6hgSD6g==:TmJlVE67JWhZ0tLAe8Ki6TVgQayVN29bdBG40UKK1KM0Y+XmGcqWXF1C4sWHwhuLOaVI3t/X82OfIMLqNfYjt6sVMBUTXto1cZ746byHyon20EAFs5eiT/o+fViFldGSXJglzClbsEXGO925zxvcb1fCEWJpee19AY4+yagRgNAXD6QiTQHjMpIe1vOvB7kG+l0VWpr0OGDSTSM1qpagb3rk5H1W80XLOFGDw+9U1XQt9FC7omPgKHhC/titcwX58QtV8v0wjvQP8WnpRI4RA/8wA2gS3uAI5DlS96EOoPW12F3ugXrfQNHq+f4pKlI7Ua3/G5WXSuloyMUu6hw0X1kKBSGMChS+9oPUhX0fN8wTWefpFAjmyuDI+ROtKP14CtlelPACY2Wh738hKi2fN/mVKUocADIXIWrapG8cZF6+Uc7hlaTS/Ifn6RizCRyOoKw1ghlFuPVKSk8USLlx6cmm+40ZSvLuZWHJumUn9FKe0ea8FzsSecP9NOyvr99uUo7tqL/itZbvo7K9muF2/p8nhdUd4G+dHjeZTI4LNc/+1i55YxKYOCcc1FnIFNX7F/EymS5rZc3uZzHlPZ6D68Tq4KCwikdbl4uy+pa0npeXIYFYns4lvz5KbYlQx4eNZSTW1dk5obQ1nNso/mTdRDHMgWFu8mSst5/gGFc/Vn498jvjK+a7OP1qfL6Cl5SfQYJJGwop3obPXVhDeTTc+EamY5EoCn5CvzIHzFmKvqN8SVSxPrKJu3l/dkZAYSG/4NkxarN72G6eZhmscbKxz2keMW+jGzNfPekXPA7sgQgSN4pNazPvZzxkC0R66QgQ
**THIS CONTENT IS ENCRYPTED**
 
DECRYPTING...

生活,需要被“发现”

mybirth:cYwisGFQUQeP6hdUU4lavQ==:i3mQmQcAGpPn/S70OnaxqQ==:IK5DZURumHWw0ohcSq00W/J9jlklKIHdbfFs99j+8qGxfGnEZMq4a0Rzi7cd6PeEmPtRiDVFPpQi4IB02vMpvdUZyX3QyOEpfgXqNHNFRJ79Dr4kDovb9cbEE7AtWN/6lR4fefYTX6oYsAt8EAoMjSKKUocB0ZFDblaOtAAhx9oA22MGVvxRVhhP/JurZt5ay6+5Kf2vynn+/D8oX51ycKOxibZy43/dKp4VtDCnNEKI3Q96D9Mkf5eYoD5RX14duqCD6dRDqqT5eekoRv53328UQu46b8NOxtKOUeXlP7TnWMFMOR3JaGe+XhXprIDRCtfv+FgtfeB5g+wRfeon4f9sxAnVdgcufnRLvwpTA3I=
**THIS CONTENT IS ENCRYPTED**
 
DECRYPTING...
阅读更多

家书·十八岁成人礼

mybirth:GmPf1EaRtvKNzHyqygNhSw==:2wuKjpysQM/339L0W5/qPA==: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
**THIS CONTENT IS ENCRYPTED**
 
DECRYPTING...