Shellshock 再次震惊全球

我们都是人性这部巨大躯体之中的细胞

这两天,Linux 又爆出了一个非常严重的漏洞 —— Shellshock (CVE-2014-6271)。 之所以用“又”,是因为就在今年 4 月,Linux 才刚刚爆出了 openssl 的“心沥”漏洞 ( 关于 Heartbleed(心沥) 漏洞 ),想必大家还心有余悸。

这个漏洞是由 Linux 上广泛使用 Bash shell 引起的,因此称为“Shellshock”,不知道是不是可以译为“壳震”,也有中文报道翻译为“破壳”和“壳裂”。

Shell Shock 一词,还有一个意思是“战争后遗症”或“弹震症”。一般指那些参加过战争的士兵,在经历过战争的精神和身体的折磨回到和平之后,还会经常出现的紧张、恐惧、失眠、疼痛等症状,严重的甚至出现无法自控的情况。

漏洞原理

这个漏洞的原理依然很简单,一句话就可以说明:Bash 在处理环境变量的时候,对其中函数定义后的内容,会继续作为代码来执行。例如:

$ env var='() { ignore this;}; echo vulnerable' bash -c /bin/true  

这个漏洞看起来还是很低级,但是比起前面的“心沥” 来说,还是要好一些,造成“心沥”的,可谓是一个最最低级的代码错误(长度检查)。而这里,应该是逻辑上没有考虑严谨。

小心余震!

早先的关于这个漏洞的修复,并没有完全修复完整,又引入了另一个漏洞 (CVE-2014-7169), 被称为 “Aftershock” ,也就是“余震”。

Mac OS 未能幸免

OS X 使用的 shell 是bash的变种,也带有同样的漏洞。可以使用如下的代码来测试改漏洞是否已经修复:

$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'

如果shell输出了 vulnerable,那么,你的系统还是带有漏洞的。如果没有,也不要高兴太早,因为还有可能有“余震”。

关于余震漏洞的测试和漏洞修复参见 http://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-shellshock-the-remote-exploit-cve-2014-6271-an/146851#146851

Windows 逃过一劫

就想逃过上次 “心沥” 一样,Windows 又逃过了 “壳震”。Windows 做的更安全吗?不是,只不过 Windows 没有使用 linux 上被广泛使用的技术而已。如果你认为更多的不被广泛知道的漏洞会更安全,那这样说的话,Windows 更安全。

互联网还靠得住吗

今年接连爆出的超级严重的漏洞,让我们不禁感慨:互联网还靠得住吗?

我的态度是:互联网靠不住,但我却愿意依赖它。

作为一个程序员,我可以深刻体会到,软件开发不过就是这样一个过程:后来的程序员修复前面的程序员留下的漏洞,同时又造成新的漏洞,让再后来的程序员来修复,如此循环,无穷尽也。

程序员这么容易出问题,真是很差劲呀。没错,程序员是很容易出问题,但这却不应该责怪程序员。并非为程序员辩护,任何一个职业都是如此。程序员作为普通的人类,无法超越人类自身的局限,人类总是会犯错。而因为互联网的影响之大,程序员犯的一个小错可能带来非常严重的后果。这就像,驾驶员的错误会引起车祸,飞机机长的错误会让数百人丧命,而一个国家元首如果犯个错误,后果可能是数百万人的生命。

我们通过提高汽车性能和智能来减少和避免驾驶员的犯错;我们通过增加副机长、自动驾驶、地面控制等方式来减少机长的犯错;我们通过智囊、增加流程和议会等方式来减少一个国家元首的犯错。但是,在软件开发中,对于程序员的犯错,尤其是会产生严重影响的软件的程序员的犯错,我们做的还非常原始。

只有我们更多的关注互联网,更关注程序开发工作,让关键的程序有更多的人来审查和测试,才有可能降低出现错误的概率。但如同其他所有的行业一样,错误和事故却不可能完全杜绝。希望最近这些不断爆出的安全漏洞,能让我们更加严肃的看待软件开发。

参考资料

Git Flow 和那些 Git Workflows

好的工具,可以改变我们的思维方式

什么是 Git Flow

2010 年初,荷兰的程序员 Vincent Driessen 在他自己的博客 http://nvie.com/ 发表了一篇文章 《A successful Git branching model》 ,在开源世界引起了一阵不小的关于 Git 工作流程的讨论,这篇文章里提出的 Git Flow 也成为了很多软件开发的事实标准。

Git Flow 就是 Vincent Driessen 在使用 Git 的过程中总结出来的一套工作流程(一种 Git Workflow)。这套流程非常适合互联网项目开发,这个流程约定了一些 Git 使用方法,让开发者可以井井有条地组织 Git 的 commit 和 branch 等操作,方便地完成项目的开发、测试、发布等环节。

几年来,这个流程已经成为业界的事实标准,关于它的介绍到处可见,在此只对其中几个要点做摘要:

  • master 分支只做发布
  • 每一个特性开一个 feature 分支(或者叫做 topic 分支)
  • feature 分支来自 developer 分支,也将被合并到 developer 分支
  • release 分支来之 developer 分支,将被合并到 master 分支 (或合并回developer分支)
  • 修改线上bug时,从 master 分支开一个 hotfix 分支,将被合并回 master 分支

事实上,Git Flow 并不能算是个非常简单的工作流程,其每一步的操作,都需要若干个 Git 命令来完成。 作为一个自称 “tech enthusiast who breathes code and loves creating beautiful software” 的极客,Vincent Driessen 当然不能容忍这种机械且易错的流程,很自然地,他开发了一个 Git Flow 工具 gitflow

gitflow 提供一系列抽象层次更高的命令,来更快捷的完成 Git Flow , 例如:

  • git flow feature start [] // 开始一个特性的开发
  • git flow feature finish // 完成一个特性的开发
  • git flow release start // 开始一次 release
  • git flow release finish // 完成一次 release
  • git flow hotfix start // 开始一个线上bug修复
  • git flow hotfix finish // 完成一个线上bug修复

这些高层的命令调用了 git 的分支操作来实现其目的,让整个流程更加便捷,也减少了错误的产生。

有人说 Git Flow 的一个缺点就是需要用命令操作,多数图形界面还是要手工操作 git 命令。也许曾经是这样,但是大名鼎鼎的 Git 图形界面工具 SourceTree 早已经官方支持 Git Flow 了,这也可以证明 Git Flow 是一个已经被广大开发者所熟悉和接受的工作流。

说了半天,Git Flow 到底有什么好处,这个嘛,谁用谁知道。

其他的 Git Workflows

既然 Git Flow 只是一种 Git Workflow,这么说,还有其他的 Git Workflows 咯?

GitHub Flow

这个是 GitHub 自己使用的流程,也就是他们开发 github.com 使用的流程,而不是这些开源项目使用 GitHub 的流程,哈哈。
也许是他们认为 GitFlow 太复杂,更可能的是因为 GitHub 早于 Git Flow 诞生,所以 GitHub Flow 是一个非常简单的流程,大致的要点如下:

  • master 上任何一个 commit 都应该是可部署的
  • 要做改动,从 master 开一个新分支
  • 改动完成,开一个 pull request
  • 某个负责人确认了改动之后,就可以将其合并到 master 了
  • 合并到 master 之后,应该被立即部署

这个流程简单到吓人,GitHub 大概有 15 到 20 人在同一个项目(github.com)上使用这个流程,每天,他们可以完成数十次部署。

这个流程简单的让人流口水。然而,只有内功达到一定程度的高手,才能使用最简单的兵器御敌制胜。“飞花落叶皆可杀人”,可不是人人都能做到的,口水先咽到肚子里吧,盲目跟随,小心死得很难看呀.

Centralized Workflow

集中式工作流程 (https://www.atlassian.com/git/workflows#!workflow-centralized) 实际上,这就是 svn 使用的工作流程,大家在同一个集中管理的仓库上开发,各自在更新的时候负责解决冲突。是的,我们在 svn 时代一直使用这种工作流程,现在看来,是不是很难忍受了?

Feature Branch Workflow

https://www.atlassian.com/git/workflows#!workflow-feature-branch
这个工作流程已经很接近 GitFlow 了,或者说,它是个简化的 GitFlow,只是强调了 feature branch,没有 developer 和 release, hotfix 等分支概念,它和前面提到的 GitHub Flow 也很类似。

Forking Workflow

https://www.atlassian.com/git/workflows#!workflow-forking
这是一个基于多个代码仓库的工作流,每个开发者在自己的仓库上进行开发和提交,然后在不同仓库直接进行合并。在自己的仓库中,又可以按照独立的分支管理方式(工作流程)来进行开发,最后,向上游管理者发起 pull request 来进行合并。GitHub 上的大多数开源项目都用了这个工作流程。

更多 Git Workflows …

小结

为什么在 svn 时代,没有产生这么丰富的工作流程? svn 也有 branch 的概念,为什么大家没有像用 Git 这样来用 svn?

svn 里的分支,并不是 svn 本身的概念,而是用户使用svn时候的“约定”,也就是说,“分支”对于svn来说,就是一种工作流程,“分支”所在的抽象层次,相比 svn 提供的抽象层次,已经高出了一级。

对于一个工具来说,在用户熟练使用后,一般可以衍生出一些使用“文化”,也就是一些约定的”惯用法“或“工作流程”,然而这些“文化”一般只比工具提供的抽象层次高一个层次,也就是说,这些“文化”是可以通过工具提供的基础功能进行重复、组合等方式来实现的。

svn 里的“分支”,就是利用svn基本的目录功能来实现的,并不是 svn 直接提供的,因此,它是在比svn 抽象层次更高一级的层次上的。而本文提到的 git 的丰富的工作流程,多数是由“分支”这个概念衍生出来的,对于 svn 来说,这种工作流程已经是高于其两个抽象层次的逻辑,对于人类这种生物来说,可能确实比较困难。

而 git 中,有了 branch 等更多的基本概念,使用 git 完成各种工作流程,还是仅仅提高了一个抽象层次而已,对人类来说没有障碍,所以各种流程百家争鸣。git 不过是比 svn 提高了一个抽象层次,却给开发者带来了更广阔的天空。

乘法确实就是加法的叠加,但从这种运算中涌现出了新的力量,如果我们只把乘法看成是加法的重复,就永远不可能掌握这种力量,只满足于加法,就永远得不到 E=mc^2
— Kevin Kelly

参考资料

  1. http://nvie.com/posts/a-successful-git-branching-model/
  2. http://www.syntevo.com/smartgit/documentation/6/show?page=git-flow
  3. http://www.jiangyouxin.net/
  4. 基于git的源代码管理模型——git flow
  5. git flow的简单使用
  6. https://guides.github.com/introduction/flow/index.html
  7. http://scottchacon.com/2011/08/31/github-flow.html
  8. http://blog.endpoint.com/2014/05/git-workflows-that-work.html

美第奇效应 ( The Medici Effect )

The biggest risk is not taking one

最大的风险就是不去冒任何风险

亚速尔群岛是大西洋上的交通枢纽和补给站,每天,来自世界各地的船员们在这里停留。在岛上的咖啡馆里,你可以听到来自世界各地的声音,看到不同的人,各种不同的想法在这里交流、碰撞。Frans Johansson 的这本书,正是要提供一个创造思想枢纽的方法,让看似杂乱无章的创意工作有迹可循。

书名 The Medici Effect 中的 Medici 是一个14世纪末源于佛罗伦萨的银行业家族。到15世纪,Medici 成为欧洲最大的银行。长期以来,这个家族给予各个领域中富有创造力的人大力的资助,甚至推动了文艺复兴的蓬勃发展。作者借 Medici 之名,来表达创新源于跨界的思想,当我们能将不同的领域有机结合,立足于不同领域的交叉点上,创意和创造力便随之而来。

让我感兴趣的是,书中引用了 Richard Garfield 发明万智牌的事例。在设计出基本规则之后,每隔一段时间,Garfield 就把它拿出来玩一下,不断地对进行调整和改进。就这样,八年过去了。。。 直到有一天,在郊游时,Garfield 突然想到了一个点子:让每个玩家手中的牌可以不同。这开创了一个全新的游戏类型:集换式卡牌游戏,从而让万智牌风靡全球。作者认为,这个点子是传统卡牌和棒球卡、集邮等活动的结合,是两个不同领域交叉的结果,从而支撑其创新源于跨界的论点。

进一步,作者讲述了如何跨界,消除领域壁垒,制造不同领域的交叉和结合等等。

书中所述的方法论,都有其适用范围,盲目效仿,必走火入魔无疾而终。眼前,我们所看到的,各处多元扩展,人人都在讲“跨界”,仿佛机不可失。看书中每一个跨界成功的故事,无一不是对所跨之领域均有深刻理解(本书似乎没有重点强调这点),而那个触发跨界闪光点的创意,不过是水到渠成而已。在没有对任何领域有足够积累的情况下,便寻求“跨界”,用当前流行的话说,那就是——no zuo no die.

参考资料

  1. http://book.douban.com/subject/1808521/
  2. http://en.wikipedia.org/wiki/House_of_Medici
  3. http://baike.baidu.com/view/28737.htm?fr=aladdin
  4. http://baike.baidu.com/view/1694166.htm

不得不说的 Swift

/*
WWDC 已经过去一周了,本周的焦点已经是世界杯了。对于一个不是球迷的码农来说,WWDC显然是更值得关注的事情,那些说话带着全世界口音的苹果技术宅们,比起绿茵场上身穿各色球衣的肌肉男们,显然也更有魅力一些……
最近还是太忙了些,不然,我觉得,熬夜听WWDC的报告,肯定要比熬夜看球有意思,至少不会扰民。可惜时至今日,在指缝中挤出的时间里,才看了不到1/5的WWDC的内容,确实本非我所愿。
总在不停的忙碌着,不过是为了追逐这变化莫测的世界,到头来却因为忙东忙西而总是慢了几拍,错过了身边的美景,真是极大的讽刺。
*/

本届 WWDC 可以说是近几年来变化最大的一次,苹果在开发的各个方面都有了很大的创新和改进,苹果开发的生态环境又向前迈了一大步,这也充分展示了库克时代的特点。

Continue reading

Cocoa 潮人 Mattt Thompson

又到周末啦,心情轻松了好多,今天我们来看看牛人 Mattt Thopson

在 iOS 开发中,你很可能使用过一个叫做 AFNetworking 的网络库,Mattt 就是这个著名开源软件的作者。

Mattt 是一个多产的开源作者,除了 AFNetworking 之外,Mattt 还创作了 TTTAttributedLabel, FormatterKit, GroundControl, SkyLab 等许多非常好用的开源项目.

Mattt 的成就不仅于此,他还是著名技术博客 NSHipster 的作者。看这个名字就知道这是一个关于 Objective-C和 Cocoa 的技术博客。NS 是在 Mac OS 和 iOS 开发框架 Cocoa 中大量使用的前缀,这个前缀来源于乔布斯在 1985 年创建的 Next 公司。Next 公司制作的计算机操作系统叫做 NextStep, 该系统提供了 Objective-C 的编程接口,后来,Next 被 Apple 收购,乔布斯回到苹果,在 NextStep 的基础上研发出了 Mac 操作系统,Objective-C 成了 Mac 编程的官方语言,NS 前缀的命名方式也流传下来。Mattt 为其博客取名 NSHipster,Mac 和 iOS 开发者自然心领神会。

Continue reading

《超级合作者》

最近在读马丁•诺瓦克《超级合作者》一书。

这个书名,一看起来非常像是管理类或人际关系方面的书籍,而且是可以在地摊按斤购买的,满篇心灵鸡汤和励志小故事…… 好吧,我承认我也是此类书籍的受害者。

这本书却不是这样的。

作者马丁•诺瓦克是个年轻有为的数学生物学家,哈弗和牛津大学教授,被誉为“现代达尔文”,对进化论做出了卓越的贡献。

简单说,这本书从生物进化的角度解释了合作机制的诞生和存在原因,让我们对合作和背叛这样的策略有一个科学的认识。

我们总是对未知的东西充满好奇,科学家们为了探究事物本源一代接一代的努力着。我在想,当我们对事物完全看透的时候,是否也会像了解了魔术的原理之后一样,就感觉索然无味了?

几年前,一本叫做《失控》的书击碎了我对生命的神秘感,让我认识到自由意识不过是机械逻辑的宏观表现,人类和机器并没有本质区别。

《超级合作者》似乎又在揭露一个残酷的现实,我们所谓的道德行为和背叛行为,也不过仅仅是为了获取更多利益而采取的不同的策略。我们之所以合作,不是因为我们善良和高尚,只是因为合作可以让我们获得更多的利益。

幸运的是,目前人类社会的游戏机制,会使得合作者比背叛者有更高的概率获得更大收益,这得益于法制的进步和普适价值观的建立(背叛者面临法律的惩罚和愧疚的折磨,这使得背叛的预期收益降低,从而使得背叛不是一个好的选择)。然而,利益最大化,这一亘古不变的准则,还是深深植根于人类以及所有生物的基因之中,这是所有生物社会得以发展进步的根基。

关于 Heartbleed(心沥) 漏洞

image

什么是 Heartbleed

仅仅通过 Heartbleed 这个名字,我们就能感受到这个漏洞很严重,心脏出血啊!
看一下网上关于这个漏洞的报道:

心脏出血漏洞(Heartbleed Bug)是今年以来最严重的互联网安全漏洞,影响了全球近2/3的服务器,造成的数据泄露不计其数,我们身边的网络安全因此次漏洞出现“内伤”。 — Pingraphic

互联网史上最大的安全漏洞——Heartbleed(心脏流血)漏洞。– Business Insider

4月8日或许是让很多互联网企业运维人员忙得焦头烂额的一天。 — 网易科技

互联网当前最危险的漏洞 — 网易科技

如果类似事件的影响程度分为1-10级的话,这次事件的影响会达到11级。 –著名的安全专家 Bruce Schneier

还有网友们惊呼:

“互联网安全史上最致命一击“

“2014 年 4 月 8 日,这一天必将永载互联网史册”

“狼真的来了”

Continue reading

Gestalt Principles 格式塔原则

Gestalt 是一个源自德语的单词,在德语中的意思是“形式、形状”,在英语中引申为“统一的整体”,专业一点说叫做“完形”。

Gestalt Psychology,格式塔心理学,也叫做完形心理学,源于19世纪初心理学界关于认知的研究。格式塔心理学强调整体和完形,认为人类的意识首先感知到整体,其次或同时感知到组成整体的各个部分。与之对应的学派是构造主义心理学,认为复杂的知觉是简单知觉的组合。

如此纷繁复杂的大千世界,人类的大脑确可以轻而易举的的认知到各种千奇百怪的事物,这真是件非常奇妙的事情。然而人类的大脑是否能真正了解人类的大脑,却一直困扰着科学家和心理学家们,格式塔心里学在人类认知上给出了一些结论,总结为格式塔原则, Gestalt Principles 或者 Gestalt Laws, 也叫做 Principles of grouping 或 Gestalt laws of grouping,即 分组原则或格式塔分组定律。

Continue reading

Box2D 和 Chipmunk

Box2D

Box2D 是个非常流行的物理引擎,有大量的游戏使用 Box2D 完成,在 AppStore 上,Angry Birds 和 Tiny Wings 都使用了 Box2D 引擎。

2006 年,Erin Catto 在 GDC 上演示了 “Box2D Lite”. 2007年9.11,Box2D 在 Sourceforge 上发布开源版本,2010年, Box2D 迁移到 Google Code. 直到现在,还没有迁移到 github, 呵呵

关于愤怒的小鸟使用 Box2D 还有个小插曲:2011年的,GDC ,当时 Rovio 正如日中天,在他们的宣讲会的问答环节,一位听众站起来
问:“Angy Birds 用的是神马物理引擎?”
答:“Box2D”
问:”你们会考虑在游戏中给 Box2D 来个 credit 吗?”
答:”会的”
问:“谢谢!顺便说一下,我就是 Box2D 的作者 Erin Gatto”
答:“太好了!会后我们再详细聊一下”

这部分是来自 Erin 自己在论坛的转述,techcrunch 对这个事情也有报道:http://techcrunch.com/2011/02/28/creator-of-angry-birds-physics-engine-calls-out-rovio-for-not-giving-him-credit/. 这个事情在国内被用来批评和嘲讽 Rovio 的骄傲态度。但 Erin 在论坛明确表态 Rovio 非常友好,自己也很尊敬 Rovio. 并表示不会向 Rovio 索取费用. (技术宅的高风亮节啊)

Continue reading

DevArt——程序员的艺术

在网上逛的时候无意遇到了 https://devart.withgoogle.com/ 眼前一亮。

什么是 DevArt

DevArt is a new type of art. It is made with code, by developers that push the possibilities of creativity and technology. They use technology as the canvas and code as the raw materials to create innovative, engaging digital art installations.

这个应该是官方的定义吧,试翻一下:

DevArt 是一种新的艺术形式。是开发者利用编码和开发技术,拓展创意,制作出的一种创新的,引人入胜的数字艺术程序。

Google 在 https://devart.withgoogle.com 举办了一个 DevArt 的竞赛,为程序员和艺术家提供了一个展示平台,希望能推动 DevArt 的发展。 Google 将和巴比肯中心(Barbican Centre)在今年夏天举行题为:“数字革命” 的艺术展览,其中,DevArt 将是重要组成部分。

http://www.devart.com/ 是乌克兰的一家科技公司,主要产品是数据库相关的开发工具和解决方案。今天说的 DevArt 跟它没有关系,只是偶然重名了而已。

个人理解,DevArt 就是以展现艺术创意和表达为目的的软件程序。它不像传统的应用程序,其目的是为了满足应用的需求,DevArt 程序的主要目的是艺术表现。

DevArt 和传统的由艺术家设计,交由程序员实现的程序不同,DevArt 更强调程序和技术的作用,更注重由程序员用代码直接展示其艺术思想,展现技术本身的艺术性。

另一方面,DevArt 又不应该是“技艺”的展示,它不是《计算机程序设计艺术》里面指的那种艺术,不是程序设计的艺术性。编码在这里依然只是个手段,重点还是通过编码来表达一定的艺术思想,而不是编码本身的艺术化。

image

Web & Mobile, Design & Code

无觅相关文章插件,快速提升流量