Python“黑魔法”之 Generator Coroutines

zh

写在前面

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

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

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

READ MORE

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

zh

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

引子

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

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

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

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

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

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

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

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

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

那么,有更好的方法?

当然有。

READ MORE

除夕杂感

zh

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

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

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

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

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

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

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

接着,她又拉我一起来。

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

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

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

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

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

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

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

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

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

READ MORE

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

zh

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

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

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

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

READ MORE

Python“黑魔法”之 Meta Classes

zh

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

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

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

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

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

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

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

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

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

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

READ MORE

诗集

zh
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...
READ MORE

生活,需要被“发现”

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

家书·十八岁成人礼

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

炫技?还是需求?

zh
mybirth:SmF2WUPMfr94DAegyQWigg==:CZfw/tPUMb3Zvs8yw4kDgA==:bOz8dn3cW8a6QKFjXu1R5M86SscKW+HdcemTzB84/POLBc4MaVI8E83Xn8PqG0oxhQVRY9gjomFmO81fc2jaxD03DZdbL9NkHnUbFINTp4v3D4p+pRrXUGfQ+3/a3NcGvUbZcT81FlQURHoQpL7NxV99Bs3zJJsAqThsnnZEa9RS4YA5lBO9Cql5kglsQ5MUpgv3uvSAjp2vqDlac+E5LOgmJTwks9nwQg6B3DHNbXT1FFnTs3iN4hjHOKP5rlLQ4cXCoY+2pEjeWR0O/64YwWAsJcGqZCCeG7s4Qfwz8nE4cuJVo/abws5OwVQFKqhOa3Sp0a1VyCNyi00abFITpYOO2BpieyiCey1iGw6TJ2pyKDm4/+vxHoM+ryMePbxf6v7vCbChgkGePawDperaJ5WIaQZeMWfl5AWgsh6oXbq55x/+UeclCZimhvA5lRJpD/UUgvQ1bPpqqaws+oBNdQ==
**THIS CONTENT IS ENCRYPTED**
 
DECRYPTING...
READ MORE

【译】响应式图片的现状

zh

原文链接:戳这里

Web 是一种可视化的媒体。绚丽的视觉效果,很大程度上离不开图片文件所作出的贡献。虽然(Whilst)其中的许多效果都可以用 CSS 和 内联 SVG 来实现,互联网上的许多站点仍需要图片文件。

从去年的统计来看,每个站点中,图片平均占了一半的页面体积,并且随着时间的推移,图片体积有持续增加的趋势;就 2014 年而言,图片的大小便增长了 **21%**。

与此同时,互联网终端的种类、数量也在增长。从 72 ppi(市场份额正在下降)到 600 ppi,不同设备的分辨率(resolution)有着天壤之别。

创建能在任何设备中都有着高质量的图片,其实再容易不过了——用 1000 ppi 的质量保存图片,然后就可以不用再理他了(译者注:原文是 call it a day)。生成的图片,即使是在分辨率最高的设备上查看也是十分清晰的(crisp)。但是,在图片质量提升的同时,图片文件的大小也会相应地增加。要知道,页面加载时间可是影响用户体验的首要因素——因此,保证站点能够及时地呈现在用户面前是我们义不容辞(incrumbent)的责任。高质量的图片,即使是在宽带环境下加载也要耗费几十秒,更不用说(let alone)是移动端的设备了——简直就是无法使用。

响应式图片的目的,不是要为设备提供尽可能高质量的图片(这一点,我们很容易做到),而是要为设备提供它所能支持的最高质量的图片,仅此而已(nothing more)。

从这篇指南中,你将了解到响应式图片的工作原理(what works),响应式图片仍然存在的问题和陷阱(pitfall),以及如何将响应式图片运用到网站中。

READ MORE