解决git push时出现的https错误

(本文收录于[go4pro.org])

这两天更新了一点我的“任氏有无轩“站点,结果发现无论是使用命令行的git还是SourceTree,都无法push到远程repo,出现错误如下:

Ashampoo_Snap_2014.07.26_09h38m21s_001_

在网上查了一下,基本上都指向Windows搜索一个DLL——本例中是libcurl.dll——的路径优先问题。

按照MSDN官方的说法是:PATH变量中设置的路径是要到很后面才会被搜索到的。于是我在Windows命令行中开始搜索所有的libcurl.dll文件,发现归于Windows系统目录下的有三处:

Ashampoo_Snap_2014.07.26_09h43m27s_002_

经过试错法,确定在我的Windows 8.1 64位版中,最后一个libcurl.dll需要被替换(注:需要admin权限才可以替换系统文件)。支持https的libcurl.dll的大小应该是360448字节。

然后再次git push,无论是在命令行还是SourceTree中都可以了。

PHP开发者经常会犯的另外7个错误

本文原始链接:7 More Mistakes Commonly Made by PHP Developers。作者:Bruno Skvorc

Thanks for Sitepoint.com authorization for translation and publication in my blog.

本文翻译力求忠实原始文档。

==========译文开始分割线==============

在6月的时候,TopTal(自由编程人员市场)发表了一篇文章,题为《PHP程序员最常犯的10个错误》。那个列表当然不是穷尽的,但确实写得不错,并指出了一些非常有趣的、值得每个人关注的陷阱——即便如我个人都不会将这些错误认为是很常见的。

我希望你对这篇文章加以通读——其中有一些确实很有价值的、你需要知道的信息,特别是前八个要点。几天前,Anna Filina扩展了这个列表,并加入了七个新的项目。尽管这些地方不那么特定也不那么常见,她的观点还是有分量的,需要在开发时加以考虑。

PHP开发者经常会犯的另外7个错误

TopPal中某位仁兄请我看看他们的列表,还有没有补充,社交网络上的一些粉丝也表示有兴趣看到这个列表继续。所以,我愿意借此机会在这个列表中加入我自己的一些事项。这些都是我不断需要去警示我的团队或者粉丝们的。

  1. 使用mysql扩展

这个消息其实很旧了,但是尚未注意这个事实的开发者数量还是大到令人担忧。如果用到SQL数据库,特别是MySQL,有太多的开发者还是倾向于使用mysql扩展。这个扩展已经官方认定过时。它不安全,不可靠,不支持SSL,不支持MySQL中的一些现代特性。它也会产生过时提醒,出现在你的应用的最顶部——但不会中断应用。滑稽的是,这意味着我们可以简单地Google这个关键词,就能找到大量这样还是用着这一不安全设置的站点。因为这个,这些应用所面对的伤害是令人震惊的。

避免使用mysql,我们可以选择:MySQLi或者PDO。例如,使用MySQLi简单到几乎只要在API调用后加一个“i”即可:

$c = mysql_connect("host", "user", "pass");
mysql_select_db("database");
$result = mysql_query("SELECT * FROM posts LIMIT 1");
$row = mysql_fetch_assoc($result);

对比:

$mysqli = new mysqli("host", "user", "pass", "database");
$result = $mysqli->query("SELECT * FROM posts LIMIT 1");
$row = $result->fetch_assoc();

使得我们的设置变得更安全,所要做的就是这些。

不过你应该选择PDO。详见第2点。

  1. 不使用PDO

不要误会,mysqli确实(确实确实)比古老的mysql扩展超出了好几代。它更新及时,安全,可靠,快速。但是,它只是用于mysql。使用PDO可以让你使用一些美妙而实用的面向对象语法,也能让你做好准备使用另外的SQL数据库(如PostgreSQL,MS SQL以及其它)。另外,PDO可以让你使用命名参数。这一特性非常有用,只要充分利用它带来的好处,就很少有人能想象不这么做。最后,还有这点:你可以直接将获取的数据注入到一个新对象中,对于大项目而言,这能节省时间,而且是令人愉悦的。

  1. 不重写URL

这是一个常常被忽略却也容易修正的问题。诸如myapp.com/index.php?p=34&g=24这样的URL如今简直就是不能被接受的。由于几乎不可能写出一个好的URL重写规则来涵盖每个服务器和框架,几乎每个框架都有一个指南,告诉我们如何设置干净的URL(Laravel, Phalcon, Symfony, Zend)。如何哪个框架不这么做,那么它就不值得我们使用——这些框架显然不关注现代化的实践。

  1. 抑制错误提示

我在以前的一篇文章中写过这个问题,但还是有必要再说一说。任何时候你发现自己使用@运算符,请再考虑考虑,尝试从另一个角度更认真地处理这个问题。用我的话来说,在一个应用的功能中包含20行引用的cURL代码也比单单一行前方一个@来的好。

我个人的经验告诉我,我在原来的帖子中建议的方法是一个好方法:打开所有的提示并转化其为致命错误。要确保在错误日志中没有任何记录,因为确实没有要记录的东西要比用@遮在眼前,装作看不见有错误发生要好。

最近我们发现了一些Heroku add-ons可以用来开发生产环境下的PHP应用,其中一个Papertrail很棒。这个add-on让你将应用所有的错误推送到后台,从而可以轻松的加以搜索、分组并在日后加以清除。所以,即使真的有错误发生,让它们被记录下来,然后通过修订代码来消除错误。这比抑制它们,愚弄你的用户来的好。

  1. 条件判断中的赋值

即使再有经验的程序员有时也会手指一滑,写下if ($condition = 'value') {而不是if ($condition == 'value') {。我们的手会打滑,键盘可能没有记录按键,我们从代码的另一部分——那一部分确实进行的是赋值操作——拷贝了代码。这些都有可能,而我们只有在运行应用时才发现问题。

要完全避免这个问题,有几个方法:

  • 使用一个好的IDE。任何好IDE(比如PhpStorm)会在检测到这一问题时警告说”条件判断中进行了赋值“。
  • 使用“Yoda Conditions”。在众多流行项目,甚至大型框架中,都会看到这个应用。通过交换比较双方(if ('value' = $condition) {),即使比较弱的IDE也能注意到这个问题。有人认为Yoda语法很讨厌而且毫无意义,其信条是绝不使用(“更小心地编码,蠢货!”)。单就个人而言,如果能帮到你的话,我是建议使用的。如果我们都是优秀人物,那么WordPress和Zend Framework就不会存在了。
  • 牢牢记住,每次写的时候都要检查一次。所要的知识练习,但即使对于最好的开发人员而言,这也可能发生。所以前两点会有用。
  1. 太透明了

我这么说可能会有反对意见,不过我还是要说。除非你对框架的开发者有100%的信心,或者也不运行高利润、高流量的商务关键应用,你应该总是努力隐藏你的后台——不要告诉大家你的应用基于什么框架。这实际上能对防止攻击起到作用——如果发现了该框架的一个安全漏洞的话。例如:

If you use Symfony2 translator and have a route with a {_locale} parameter upgrade NOW !http://t.co/jihXHB8MzT

— Jérémy DERUSSÉ (@jderusse) July 15, 2014

在该Tweet中,有关代码注入的一个严重问题已经变成了广为人知的知识。如果你正在上班,可以立即升级而不用担心开发问题或者让团队停止,那很好。但是对大部分使用Symfony的人和公司而言,情况不是如此。即便Symfony可以通过Composer升级(如Ryan在评论中提到的那样),在大的多层环境的团队中,通常这要花一些时间来获得批准。所有使用这一翻译机制的站点,并且也声明了是Symfony的用户的站点,就会面临该缺陷,直到被修正。

上面提到的使用Symfony,只是一个例子。多年来,类似的情形发生在无数其它的软件中。我还在使用ZF框架开发商业应用那会,也发生过这样的情况,并因此受到了攻击。WordPress也有其安全性漏洞,而我们也知道世上有多少站点是由它来运行的。会发生这些事情。有时,开源和透明不是最好的方法来处理那些承担公司主要收入来源的应用。

  1. 没有移除开发配置

最后,我要提一提移除开发配置。最近(声明,我再次提到Symfony纯粹是巧合),Cnet遭受了一次攻击,原因就是没有移除它们的开发配置。

Uhmmm no: http://t.co/rAQis1ycWq #security #symfony

— Marco Pivetta (@Ocramius) July 15, 2014

Cnet是全球最大的技术新闻站点之一,它基于Symfony。你可能知道,Symfony有两个应用入口:app.php和app_dev.php。你的浏览器访问其中之一,进入的是生产环境,如果访问带有_dev后缀的那个,显然你会进入开发环境,从而有除错器、敏感数据以及诸如此类。这样是好是坏可是很多讨论的话题(再次感谢Ryan指出了这点)。但无可否认的是,它让一些比较笨拙的开发者面临着Cnet面临的同样的错误。另外,通过app_dev访问的任何其它URL也会导向其它的app_dev相关的URL。换句话说,不仅是首页在开发环境下运行,而是整个站点——放在Cnet的案例中,这可是大量的访问。

如果你跟踪了Twitter上的讨论,情形很快就糟糕到令人尴尬——而更可悲的是,只要几秒钟的工作就可以避免:

  • 开发者应该在生产用服务器中删除app_dev.php
  • 开发者应该将可以访问app_dev.php的IP放入白名单,这也是缺省配置——除非你故意放松了这些限制

任何一个方法都可以完全避免所有的问题。记住,在发布到生产环境时,要确保你的开发配置要么完全不可访问,要么只有在白名单中的IP可以访问。

结论

(本文收录于[go4pro.org]

一本需要严肃对待的喜剧

《布达佩斯大饭店》是一本需要严肃对待的喜剧。豆瓣上对此的解读有很多,比如对M. Gustav的解构以及他与茨威格的关联,对《苹果的男孩》的解读,有对“永远回不来的昨日世界”的感慨,有对“怎样才是一个真正的绅士”的判定。

08年的时候我看《巨人传》,写了一篇书评:《一本需要严肃对待的闲书——评<巨人传>》。我觉得,《布达佩斯大饭店》也是这么一本需要严肃对待的喜剧。

p2184056554 (1)

Continue reading

Dart 1.5.3的一些变化

Ashampoo_Snap_2014.07.15_22h13m10s_003_

Dart是一个发展非常快速的语言。如今最新的版本是1.5.3。自从今年1月份我写了两篇关于Dart的文章()以来,Dart语言本身,尤其是我用到的Polymer部分,有了很大的变化。

为了准备8月9日(暂定)于苏州举行的,由G4P.ccGDG Suzhou联合举办的活动,我对之前编写的Dart小程序进行了调试。本文就在这次调试中发现的变化进行一些总结。

Continue reading

冬天的故事

一开始看到《冬天的故事》这个名字的时候,还以为是莎翁的著作改编(维基链接:http://zh.wikipedia.org/wiki/%E5%86%AC%E5%A4%A9%E7%9A%84%E6%95%85%E4%BA%8B)。但是看完之后发现不是,而是改编自小说家马克·哈普林同名畅销小说。

豆瓣对该片评价不高,只有区区5.4分,按照一般判断,基本属于烂片。但是在我看来,这是一本被低估的片子。

从爱情的角度去探讨这本片子,是一个错误的角度。大家可以吐槽对爱情的描写过于单薄,但是20世纪初——乃至更早时期的爱情——就是这个样子。如果我们吐槽这里的爱情,就也要吐槽《悲惨世界》中珂赛特和马吕斯的一见钟情。

50cdecb66d72632d26ac05ae28a0c3af

片子讨论的是人生存最基本的问题:我在这个世界上到底要做什么?

为了更好地展现这一主题,我们必须要有坏人,于是我们看到了拉塞尔·克劳和威尔·史密斯所代表的恶势力。他们的目的就是阻止正方对人类的救赎。正方的代表是带有使命的、落入人间的天使。

天使的使命只有一个,完成使命后就会回到上天交差,其具象的表示就是变成天上的一颗星星。

正是有了这样的设置,我们对其中出现的种种奇幻和超现实现象就不要太过惊奇和意外了。

这是一个有着深厚宗教救赎背景的故事。当然,这样的故事完全可以在10年甚至更短的跨度内完成,而编剧特意将其延展到100年,无非是为了加强一种沧桑感和永恒感。时间跨度也不能再长了,否则Peter就不能再与小Willa见面。

个人认为,如果这个故事的时间跨度不是设置在191X年到201X年,而是整体提前100年,从181X开始到191X结束,会弥补其过于超现实而带来的不真实感。

有人评论说这本片子很黑暗。但其实根本不是如此。没有中世纪的仪式,有的只是中世纪的传说和童话。

再回到要回答的问题:我在这个世界上到底要做什么?这是一个直指人心的拷问。影片通过一个具体的表征:使命以及世俗(所谓麻瓜)定义为“奇迹”的东西来试图解答这点。

Beverly的使命是让Peter永生(或者说在完成其使命前不会死并保持年轻),Peter的使命是拯救Abby。这些都是需要一个奇迹来完成的事情。而他们都做到了。使命是有因果关系的。如果Beverly没有完成使命,那么Peter也完不成使命,那么Abby就会死去。这种使命的承继正是使命高尚、伟大的根本原因所在。前仆后继,死而后已。

Abby和小Willa见到Peter都要他抱,都问他Am I light or heavy?而Peter的回答也是Light as a feather. 100年的时间间隔又算得了什么呢?同样的不期而遇,同样的倾盖如故,同样的厚重的使命感,这才是影片要表述的核心。

人生短暂,白驹过隙。正如我两年前写的《大鼻子情圣》的评论中说到的:

抓住19世纪观众和评论家的心的,而且继续抓住了我们的心的,是故事讲述到的爱情、激情、英雄主义和道德荣誉感感人至深。

What captured the hearts of nineteenth-century readers and spectators, and continues to capture ours now, is the depth of the story’s love, passion, heroism, and moral honor.

那么在其中加入“使命感”又有何妨呢?

乐高,黑得漂亮

昨天和老彼得看了乐高2014年的作品《乐高大电影》(The Lego Movies)。

p2185400387

我就不谈情节、效果、配乐之类的东西了。

就一点,我要说,“乐高,黑得漂亮!”

Ashampoo_Snap_2014.06.02_09h17m50s_002_

一台声控的电脑,对“解除屏障”这么标准的指令无法理解,直到某人用非常不标准的口音说出“借 出 苹 张”的时候,电脑才完成了操作。

这才是高级黑啊!

是的,因为真正的生活是在远方