一碗牛肉汤

夜有多深沉,就有多撩人。
食欲最凶猛,理想最害人。

夜里突然很兴奋,以为睡一觉就过去了,没想到竟然掏出电脑,总算是把上次的故事给写完了。


今天不过又是普通的一天,早上九点上班,晚上六点下班。换乘两趟地铁,出站已是晚上七点。经历了一天的工作和奔波,你已经身心俱疲。

当然,即使再乏味的生活中,偶尔也会有一点调味剂。

可能是工作时解决了一个难题,恨不得跳起来大叫一声 Eureka。但是下一刻你就不得不面对更多的需求,而且今天必须要做完。

也可能是地铁上遇到了一个美女,愉快的聊了一路。可是上海地铁开起来就是那么快,挥手告别,才发现连微信都没有来得及加。

调味剂始终只是调味剂,此刻饥肠辘辘,只想填饱肚子。

这样想着,你已经走到了门口的小吃街。

于是,你将作出一天之中最重要的选择,晚饭到底吃什么?


牛肉汤,一个念头一闪而过。

为什么是牛肉汤?当你开始思考这个问题的时候,你已经坐在店里了。从长远来看,很多的决定都是无关紧要的,但是此时此刻,又是如此的意义重大。你试图找出一个合理的原因。

这时候老板走过来:老乡,要吃点什么?

你不假思索的答到:老板,来一碗牛肉汤,三个锅巴膜。

在等待牛肉汤端上来的间隙,你继续思考刚才的那个问题。

究竟是什么使我们做出决定?为什么是牛肉汤?不是隔壁的麻辣烫,也不是这附近的其他餐馆。

等等,你突然想到了一个重要的细节。

对呀,也许我们并不知道自己喜欢什么,但是我们知道自己不喜欢什么,这就足够了。


人生总是面临一个又一个的选择,没有人知道什么才是正确的决定。而我们所能做的,不过是在不断的尝试中,明白自己不想要的是什么,然后找到一个适合自己的,坚持下去。

最重要不是等你想明白自己想要的到底是什么,而是现在就去做。勇敢的去尝试,管他成功或者是失败。大胆的去表达,管他什么的人言可畏。没有什么理由能够让你停滞不前。

总有些事情会让人一筹莫展,可是那又怎样呢?已经忙碌了一整天了,在下班路上,不如暂时放下肩上的责任。

此时此刻你需要的不过是一碗热气腾腾的牛肉汤。十五块钱一碗,免费加汤加粉丝。

1,119 total views, no views today

mysql explain 实例分析

今天有同学在群里面问了这样一个问题:

select t1.*,t2.* from T1 t1 ,T2 t2 where t1.a = t2.a;

select t1.*,t2.* from T1 t1 join T2 t2 on t1.a = t2.a;
是一样的吗?

通过伟大的搜索引擎,我找到这样一个回答:

FROM T1,T2是ANSI SQL-89的旧语法,用逗号分隔FROM子句出现的表名,没有JOIN关键字,也没有ON子句,它只支持交叉联接和内联接,不支持外联接;如果没有指定联接条件就是一个交叉联接。
新的ANSI SQL-92去掉了逗号,引入了JOIN和ON,支持交叉联接、内联接和外联接。
优化器为使用上面两种语法的语句生成了相同的执行计划,性能是一样的。

虽然提问的同学对这个答案很满意,但是还是有同学对这个答案提出了自己的怀疑。于是我试图去证明这个答案的正确性。

由于已经找不到 SQL-89 的语法标准,所以关于 SQL-89 和 SQL-92 的比较只好暂时搁置。

我们来看一下 MySQL 优化器为上面两种语法的语句的执行计划是不是一样的:

mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author;

B17B541C-A33A-419B-ACF2-5FF2118EEA35

mysql> show warnings;

B073A197-A1C3-4705-B2CF-D75CAE050539

mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author;

3E6D5496-AAD3-4532-8FD3-913316BB3860

mysql> show warnings;

7551B96F-193D-4D48-A5D5-E75C8B64C008

我直接使用 wordpress 数据库,分别使用两种语法写了两条查询语句:

select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author

select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author

使用 mysql explain extended 和 show warnings 命令得到 mysql 优化器优化后的查询语句是一模一样的。

select `blog`.`wp_users`.`display_name` AS `display_name`,`blog`.`wp_posts`.`post_title` AS `post_title` from `blog`.`wp_users` join `blog`.`wp_posts` where (`blog`.`wp_posts`.`post_author` = `blog`.`wp_users`.`ID`)

参考


T-SQL查询笔记4: FROM T1,T2与联接的区别
http://www.cnblogs.com/gdjlc/archive/2012/03/06/2382820.html

MySQL执行计划解读
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

603 total views, 2 views today

Thailand

第一次出国旅游,写点什么纪念一下吧。

最难忘的是甲米镇的小酒吧和红树林的皮划艇,不玩手机,就那么静静地坐着聊会天。不需要带相机,就那么慢悠悠地划着小船,用眼睛,用耳朵,用鼻子,用一切的感官去欣赏周围的风景。

然后是清迈的 Massage 和 Mango Rice,真的是舒服,好吃到停不下来。值得一去再去。

曼谷的郑王庙还不错,有时间的话可以去看看。

拜县主要就是拍拍拍,有这方面爱好的可以去。

就这些了,行程和游记看下面的链接。


泰国行程

http://plan.qyer.com/trip/V2UJYFFuBzVTZVI8Cm0NPg

漫游泰国(曼谷-甲米-清迈-拜县 11天)

http://www.mafengwo.cn/i/5500100.html

334 total views, no views today

WordPress 安全漏洞(二)

前几天刚吐槽阿里云盾,今天一大早就到收到了阿里云盾的 “高危漏洞通知”。

阿里云盾"高危漏洞通知"

于是登录阿里云看了一下,果然有一条漏洞提示,而且提供了两种解决方案:

1. 【一键修复】(漏洞补丁),收费服务,需要购买云盾·安骑士,100 RMB 起。

2. 【自己动手修】。

对于我这种动手能力强(穷)的人来说,当然选择第二种解决方案了。

于是网上搜索了一下,找到了下面一种临时解决方案:

打开 wp-includes/media.php , 定位到 2898 行, 或者查找 wp_image_editors。

# vi wp-includes/media.php

2898G or /wp_image_editors

我们看到,WordPress优先选择 WP_Image_Editor_Imagick 来处理图片。

$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );

现在我们把顺序对调一下。

$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_GD', 'WP_Image_Editor_Imagick' ) );

再去阿里云后台验证一下,在服务器安全(安骑士)的补丁管理选项下面点击重新验证,就能看到已经修复了。

改完之后才发现,我根本没装 ImageMagick,所以根本不存在漏洞啊!!!

参考:

安全预警:ImageMagick图象处理软件存在远程代码执行(CVE-2016-3714)

http://www.freebuf.com/vuls/103504.html

830 total views, no views today

WordPress 安全漏洞(一)

最近只要打开博客,就能看到 nginx 502 错误提示。于是尝试着寻找原因:

1. 既然能看到 nginx 502 的错误提示,说明 nginx 还是正常的工作的。

我们来验证一下,查看 nginx 的状态。

# service nginx status

nginx 报告它正在正常工作中。

* nginx is running

抱着怀疑的精神,我们来重启一下 nginx。

# service nginx restart

再打开博客看一下,还是熟悉的 502 页面,nginx 果然是无辜的。

2. 既然 nginx 没有问题,那么我们再来检查一下 php5-fpm 的状态。

# service php5-fpm status

php5-fpm 报告它也在正常工作中。

php5-fpm start/running, process 2424

继续抱着怀疑的精神,我们来重启一下 php5-fpm。

# service php5-fpm restart

再打开博客一看,好了!看来果然是 php5-fpm 出问题了。

3. OK,现在我们已经知道是 php5-fpm 的问题了,那么问题底出在哪里呢?

于是我仔细的检查了一遍 ph5-fpm 的配置文件,然而并没有发现任何问题。

# cat /etc/php5/fpm/php-fpm.conf

然后又看了一下 php5-fpm 的日志文件,还是没有发现任何问题。

# tail -100 /var/log/php5-fpm.log

再次抱着怀疑的精神,我们来查一下 nginx 的日志文件。

# cat /var/log/nginx/access.log | grep 502

不看不知道,一看吓一跳。居然有几个 IP 在一直不停的访问 xmlrpc.php。

185.103.252.170 - - [04/May/2016:12:35:19 +0800] "POST /xmlrpc.php HTTP/1.0" 502 583 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

在网上搜索一下,发现原来是有人在尝试暴力破解,直接删除了 xmlrpc.php 文件,让他感受无尽的 404 去吧。

参考:

XML-RPC放大攻击:针对WordPress的“暴力美学”

http://www.freebuf.com/vuls/81331.html


最后吐槽一下阿里云的云盾,根本没有检测出针对 xmlrpc.php 的攻击。

而且即使是已经检测到的攻击,我也从来没有收到过任何告警邮件或者短信。

582 total views, 1 views today

升级 Ubuntu Server 16.04

Ubuntu Server 16.04 更新了,自带了 PHP 7.0, Mysql 5.7, 而且终于可以脱离尴尬的 nodejs 命令用上 node 了, 所以果断升级。


1. 准备工作

最近使用 “apt-get update” 命令一直出现 “Hashsum mismatch” 错误,可能是阿里云的 Ubuntu 更新源缓存问题,于是尝试切换到 163 mirros。

sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

sudo wget http://mirrors.163.com/.help/sources.list.trusty

sudo mv sources.list.trusty /etc/apt/sources.list

再次运行 “apt-get update”,果然一切正常。(为什么在我的潜意思里面总是会觉得网易要比阿里靠谱一点呢?)

但是我的阿里云服务器在美国,访问 163 的镜像有点慢,所以最后还是切换打算到官方源。

网上没有找到现成的sources.list 文件可以下载,直接在 vim 里面做了一次批量替换。

:%s/mirrors.163.com/archive.ubuntu.com/g

2. 开始升级

Ubuntu 版本升级其实蛮简单的,首先获取 dist-upgrade。

apt-get dist-upgrade

然后运行 do-release-upgrade,重新启动,就大功告成了。

do-release-upgrade -d

3. 升级之后遇到的问题

升级之后需要重新安装 php 和重新配置 nginx,所以建议还是不要直接在生产环境直接升级。

如果一定要使用 Ubuntu 16.04 Server 的话,还是重新安装一台,然后迁移过去比较靠谱。


参考:

Ubuntu镜像使用帮助

http://mirrors.163.com/.help/ubuntu.html

Ubuntu Server 14.04升级Ubuntu Server 16.04

http://blog.csdn.net/chszs/article/details/51236698

660 total views, no views today

三月读书笔记

曾经很长的一段时间,我的梦想是成为一个文字工作者。然而最终,我却成了一个代码搬运工。

这个月都在忙 CCBN 展会的事情,没有时间写技术文章,只好拿出几篇豆腐干的读后感。


一、虚无的十字架

东野圭吾的书,我看的不多。白夜行,解忧杂货店,这是第三本。在上海去北京的火车上,花了一个上午看完了。

和解忧杂货店一样的叙事手法,几个看似毫无关联的故事把几个看似毫无关联的人物命运串联在一起。不过这一次,是一个悲伤的故事。关于废除死刑制度的思考。

单从故事上来讲,是不如白夜行和解忧杂货店的,因为阐述一个观点远比讲好一个故事艰难。但是东野圭吾让我们看到了一个作家的责任。


二、无声告白

说实话,这是一个读起来并不那么轻松的小说。第一章完全不知道作者想要讲什么,差点弃书。不过终于还是花了几天的时间看完了,读完了还久久的沉浸在故事里面。

作者通过细腻的心理描写,把每个人物都刻画得淋漓尽致。不由得越看越心惊,这个故事竟是如此的真实。读完之后想了很多,关于人际关系,关于家庭教育,甚至是关于人性的思考。

毋庸置疑,这是一本好书。那么,为什么看这样一本书会觉得枯燥无味?甚至一度想弃书呢?难道是在这个快餐文化大行其道的时代,我们的阅读能力退化了?或者从某种意义上来说,这是书挑读者?


三、城记

“北京的悲剧在于,由于共产党人的远见,它在战火中奇迹般地保存下来;然后在和平建设时期却被逐渐毁掉。”

北京之行,只去逛了三里屯优衣库,到底是有些遗憾的,于是把这本书又翻出来看了一遍。作者王军是一名新华社的记者,花了十年的时间写作,试图为我们还原一段真实而又有些过于沉重的历史,让我们了解建国以来北京城的变迁。

再次看完之后依然感慨万千,却又不知道说什么好:嗯,我大概就是一个愤青吧。

604 total views, 1 views today

我的外公

很多年前,一次饭后闲聊,我听过这样一件小事:

一次外公出远门,一不小心走错了路,在山上过了一夜,半夜偶尔一声狼叫,一夜都没敢睡觉。

当时我听到这个故事,并没有觉得心惊胆颤,只是突然冒出一句话:可怜之人必有可恨之处。

他并不是一个可爱的外公,甚至有一点可恨。

他脾气不好,喜欢在家里跳来跳去。

他贪钱,常常为了一点钱和外婆吵架。

他年轻时还赌博,一点钱都被拿去了。

可以说,他就是一个脾气暴躁的小老头,几乎是没有优点的。

所以当我在大街上看到那个佝偻的背影是,一时竟有些不知所措。

岁月终于还是没能他打磨成一个温和的老人。

不过这样也好。

279 total views, no views today