编写属于自己的Haskell

原文地址(source):http://dev.stephendiehl.com/fun/

在2014年,我写了一篇短教程,是关于用Haskell开发一种可以编译成LLVM的、小型命令式语言。我对于教程貌似取得的效果感到非常开心,从那么多人那里得到的热烈反响让我深受鼓励。

我在2015年能够写什么样的最有影响力的主题,对此做了深入思考;决定在今年继续努力,完成另一个基于项目的《根据首要原则开发一种简单的函数式编程原则》。

这是一个不平凡的主题,不幸的是,它没有得到太多重视,开发这种现代函数式语言的知识,没有在很多程序员中得到扩散。可获得的资源常常在讨论高深的理论,而完全掩盖了工程细节(engineering details)。我想写一个基于项目的、涵盖工程细节的教程,在最后给读者留下一个功能齐全的玩具语言,它可以扩展到其它项目。

我们将开发一种名叫“Fun”的小型函数式语言,这是局部的Haskell 2010玩具语言;支持:分析器、类型引用、数据类型、模式匹配、脱糖(desugaring)、typeclass【注1】、高阶类型(higher-kinded type)、monadic IO【注2】、任意阶多态性、record、Core language、STG中间语言、惰性求值、解释器、内置代码生成器、运行时和optimization passes。

相对于我的大部分作品,本教程是预先编辑的、粗糙删减的版本,我一直在完善。编译器本身截止2014年12月份也是完整的,但是每一章(共28章)都是逐月完成的,这样我就能根据读者和测试人员的反馈逐步完善文字。关于运行时和代码生成的后面几个章节多少有些复杂、篇幅较长。

(译者注:下面是教程,有兴趣的可以学习~)

我为什么弃用Mac OS X?

原文地址(source):http://wozniak.ca/why-i-quit-os-x

我使用OS X做个人工作的主要操作系统将近有10年了,然后我在2014年底选择放弃。我认为这是我去年做的最好的技术上的决定。

我在2005年开始使用OS X,那时候10.4(Tiger)发布了。我当时丢弃了Linux,因为我需要打印东西,而Linux在这方面做得太糟糕;OS X却不错。我用OS X效果较高,没有严重的抱怨。当10.6(SnowLeopard)发布的时候,我非常满意。

这种不喜欢的痛苦开始在10.7(Lion)出现。类似iOS的GUI、和Launchpad之类的“特性”没有引起我的共鸣。随着事情的发展,我越来越讨厌这个环境。

当我升级到10.10(Yosemite)时,我的Macbook Pro感觉不再像一台个人电脑了。为了保持环境的舒适和熟悉,每次升级我都在和最新的花哨功能作斗争。为了保持神志清楚,我花了大量时间研究系统偏好设置,以搞清楚我不得不关掉什么。

除此之外,我发现我还停用了OS X预装的大量主要app:Mail、Safari、iTunes和Apple创新App/iLife。基本上,我运行必要的3款app:Firefox、MailMate和iTerm2.我的大部分工作都是在终端完成的。在这一点上,操作系统文化更多是分享,而非个人效率。

总之,我是反对这种环境的。它是平缓的过渡,但是OS X从一个把事情做完的有用的工具集,变成了一个让人讨厌的生态系统,我不再想成为其中一员。

尽管如此,比缺乏个人情感更让人厌恶的是完全缺乏的透明度和总体的软件质量下降,这是我观察到的。

和以前的系统升级相比,我基本上得不到有用的信息。像“bug fixes”或“security...

对隐私有害的环境变量

原文地址(source):http://movingfast.io/articles/environment-variables-considered-harmful/

为了轻松访问运行在生产环境里的代码,存储你的密钥是一项有挑战的任务。对于这些密钥,我意思是,例如用于访问第三方API的keys、用于加密/签名cookie的keys、哈希用户密码等等。如果你的生产密钥落入了坏人之手,将产生可怕的影响。你想牢牢地控制访问密钥的方式和时间。

我们很可能对怎样不去存储密钥持相同意见,那就是:在你的代码,或与你代码相同的源代码库里。通常,有太多人或第三方服务可以(潜在地)访问你的代码库,他们不需要(也不应该)知道你的生产环境密钥。

关于如何架构现代web应用程序的一个优秀文档是The Twelve Factor App。它列举了每个web开发人员应该了解的12项原则(他们称之为要素)。“Config”一章提到了:“在环境里存储config”。虽然我同意操作系统环境是总体配置的好场所,但是,我还是不能推荐它用于保存隐私。

当你在环境里存储密钥时,你仍然有可能偶然地暴露它们——这恰恰是我们想避免的。

让我们仔细看一下环境和环境变量。这是任何操作系统都有的一个特性,你可以用来托管web应用,包括Linux、Mac OS和Windows。环境变量已经被用于系统配置了,被设计成从父进程向其子进程传递配置。一个子进程默认继承了来自于其父进程的、所有环境变量(被叫做环境)的拷贝。

根据环境的这些属性,问题就在于它在什么时候存储密钥:

  1. 环境可以被进程隐式地访问。难以追踪访问,其内容是怎样暴露的。抓取整个环境并打印出来(有利于调试)、或作为错误报告的一部分来发送是比较容易的。

  2. ...