趁秋意正浓~

生活在大城市里面,很难感受到季节的变化。

四月份的时候走在淮海中路,落了一身的梧桐花,突然想到一句谚语,“时过清明而桐树不华,则岁有大寒”。才后知后觉的想起来:哦,春天来了。

最近已经明显的能够感受到一阵又一阵的秋凉,但还是不敢确定,直到早上骑车上班的时候突然闻到一阵腻人的桂花香,才确定现在已经是秋天了。

作为一个码字为生的人,最怕的就是突然失去了灵感,已经憋了一个月,一句话都没有写出来。但是伴随着凉爽的秋风,所有失去的灵感又都回来了。

所以说,在这一年四季中,秋天是最好的季节了。不要说桂花、银杏、红枫,光是提起这几个字眼,一幅幅最美的画面已经出现在脑海里。就是看看窗外干枯的树杈,仿佛都能写出一首最美的诗来。

那么我还写什么狗屁的博客呢?趁秋意正浓,出去走走吧。

920 total views, 2 views today

使用 Vagrant 搭建开发环境

使用 Vagrant 搭建基于 Ubuntu 16.04 + nginx + mysql + php 开发环境的最新教程请看这里:https://tanghengzhi.com/using_vagrant_for_develop/


安装步骤:

0. 开始之前的准备

如果你使用的是 Windows 系统,请执行如下操作:

在 BIOS 中开启 VT-X。

安装 Git Bash。

1. 下载和安装 VirtualBox 和 Vagrant

去官网下载对应系统版本的 VirtualBox 和 Vagrant 并安装。

2. 下载 vagrant box 并导入

关于 vagrant box 的选择(https://atlas.hashicorp.com/boxes/search)

hashicorp/precise64 是精简版的 ubuntu 12.04 系统,ubuntu/trusty64 是官方原版的 ubuntu 14.04 系统,laravel/homestead 是基于 ubuntu 16.04 搭建的 php 开发环境。

这里我们选择 ubuntu/trusty64,参考官方文档,直接在 bash 中输入如下命令:

vagrant init ubuntu/trusty64

但是看着几乎为 0 的下载速度,我建议还是复制下载地址,然后迅雷下载比较靠谱。下载完成之后可以执行如下命令导入。

vagrant box add ubuntu/trusty64 /path/to/virtualbox.box

3. 修改 Vagrant 配置文件

运行 vagrant init 之后,会在目录下面生成 Vagrantfile 文件。

打开 Vagrantfile 文件修改其中的配置。

4. 启动 Vagrant 虚拟机

执行 vagrant up

5. 常用 Vagrant 命令

`vagrant up` 启动虚拟机

`vagrant reload` 重启虚拟机

`vagrant ssh` ssh 登陆虚拟机

`vagrant ssh-config` 查看 ssh 配置


遇到的问题

1. 修改 smarty 模版之后刷新两次才能看到变化。

修改 nginx 配置里面的 sendfile off 并没有解决问题,最后关闭了 opcahce 解决问题。

vagrant ssh -c "sudo php5dismod opcache;sudo service php5-fpm restart;"


参考:

https://www.vagrantup.com/docs/getting-started/

https://segmentfault.com/a/1190000000264347/

527 total views, 1 views today

如何下载 NRC 照片

八月份一共参加了 6 场 Nike+ Run Club 的跑步课程。

每次跑步课程开始之前都可以在微信上扫码签到,然后跑完之后会推送这次跑步的照片。那么如何下载这些照片呢?


1. 获取这次跑步课程的“活动代码”

首先我们打开微信推送的链接,然后选择在Safari中打开。

IMG_0383

复制浏览器地址栏的网址到备忘录,或者其他能够编辑文字的地方。

http://runclub.nike.com.cn/events-gallery/#/gallery/8d78654de06d4d6b8b153ba9eb92d410

最后的这一串8d78654de06d4d6b8b153ba9eb92d410,就是我们要的“活动代码”。

2. 使用“活动代码”获取照片下载链接

直接在下面输入“活动代码”,就可以获取这次跑步活动的照片下载链接。

当然,你也可以直接访问这个链接:https://tanghengzhi.com/NRCGalleryDownloader/index.html

886 total views, no views today

一碗牛肉汤

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

1,186 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

629 total views, 1 views today

Thailand

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

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

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

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

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

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


泰国行程

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

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

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

357 total views, 1 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

902 total views, 3 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 的攻击。

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

607 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

700 total views, 1 views today