三月读书笔记

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

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


一、虚无的十字架

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

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

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


二、无声告白

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

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

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


三、城记

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

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

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

656 total views, no views today

我的外公

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

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

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

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

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

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

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

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

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

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

不过这样也好。

347 total views, no views today

杭州

“还有什么比一个人不知道自己该做什么更艰难呢?”
— 李志

今天逛了一天的西湖,夜里睡不着,不妨来聊一点往事。


2012年刚毕业的时候,偶然的机会来到杭州。一开始对于杭州的印象并不好,或者也不能说不好,只是当时我更想去苏州(或者上海),根本没有考虑过这样一种可能性。

那个时候处于一个非常不稳定的时期,刚从学校毕业,对未来满怀期待,却又处处受挫。脑子里充满着一些不切实际的理想,却又没有能力去实现,又不肯接受现实。

所以我很少愿意和别人讲起杭州的经历。但是总有人愿意问,为什么从杭州到上海?


对于杭州的印象,大抵就是晚上火车经过钱塘江大桥时,哐当哐当的响。一开始吵得睡不着,后来习惯了,晚上一定要听到火车的声音才能睡得着。不得不说,人类对于环境有着惊人的适应能力。

在杭州的一年半,体会最深的两个字大概是“孤独”。一个人在陌生的城市工作,没有朋友,上班的时候倒还好,时间总是过得很快。一旦到了晚上或者周末,有大把的时间,却又不知道该做什么。

孤独有时候是一个褒义词。然而大部分的孤独,是把自己困在一个叫做“孤独”的世界里。

伴随孤独而来的,是更加难以忍受的是欲望。欲望摧毁一个人的方式有两种,一种是在你放松警惕的时候突然来袭,让你猝不及防。另外一种是在你放弃抵抗的时候又突然消失殆尽,让你后悔莫及。

大学上说,“君子慎其独也”。菜根谭上说,“饱后思味,则浓淡之境都消;色后思淫,则男女之见尽绝。故人常以事后之悔悟,破临事之痴迷,则性定而动无不正。”可以真正能够做到的人又有几个呢?

我们都不是圣人,只是一个平凡的普通人。所以我觉得最好的办法还是去洗个热水澡,不行就洗个冷水澡。

说了这么多,我现在还是一个孤独的人,仍然要随时面对欲望。但是我已经开始认识到孤独并不是那么的让人难以忍受,战胜欲望或者被欲望打败,都是再正常不过的事情。那么为什么不活得更真实一些呢?

720 total views, 1 views today

基于 fluentd 搭建日志收集系统

测试系统版本为 ubuntu 14.04,fluentd 版本为 td-agent 2.2.1。使用 HTTP 方式接收日志数据,并存储到 mysql 仓库。

安装 fluentd

1. 去官网下载deb安装包
2. dpkg -i td-agent_2.2.1-0_amd64.deb
3. 安装好之后td-agent会自启动
4. 测试一下,curl -XPOST 192.168.1.107:8888
400 Bad Request
'json' or 'msgpack' parameter is required
说明工作正常。

/etc/init.d/td-agent status
* td-agent is running

安装 fluentd-ui

1. sudo /usr/sbin/td-agent-ui start
2. 默认端口9292,用户名admin,密码changeme

安装 fluent-plugin-mysql

1. sudo apt-get install libmysqlclient-dev
2. /usr/sbin/td-agent-gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
3. /usr/sbin/td-agent-gem install fluent-plugin-mysql


参考:

http://www.fluentd.org

http://stackoverflow.com/questions/3608287/error-installing-mysql2-failed-to-build-gem-native-extension

834 total views, no views today

如何搭建LNMP环境(二)

上一篇我们介绍了如何在 ubuntu 14.04 上面搭建 lnmp 环境,今天我们来介绍如何在 centos 7.0 上面搭建 lnmp 环境。

和 ubuntu 的更新策略不同,centos 更看重可靠性和稳定性,所以官方源更新的非常慢,里面自带的 php 版本很低,不符合生产部署的要求,所以我们选择源码编译的方式来安装 php。


如何在 centos 7.0 上面搭建 lnmp 环境

1. 创建 nginx 用户 和 nginx 用户组

$ sudo adduser -U nginx
$ sudo passwd nginx

2. 编译安装 nginx

下载 nginx 源码并解压

$ wget http://nginx.org/download/nginx-1.10.0.tar.gz
$ tar xzvf nginx-1.10.0.tar.gz
$ cd nginx-1.10.0

参考 nginx 官方打包使用的配置(所有参数应该全在一行)

$ ./configure
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-threads
--with-stream
--with-stream_ssl_module
--with-http_slice_module
--with-mail
--with-mail_ssl_module
--with-file-aio
--with-http_v2_module
--with-ipv6

make & make install

$ make
$ sudo make install

3. 编译安装 php

下载 php 源码并解压

$ wget http://cn2.php.net/distributions/php-7.0.6.tar.gz

$ tar xzvf php-7.0.6.tar.gz

$ cd php-7.0.6

配置参数

$ ./configure --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-openssl --with-curl --enable-mbstring --with-mcrypt --with-mysqli --with-pdo-mysql --enable-zip

make & make install

$ make
$ sudo make install

参考:

http://nginx.org/en/docs/configure.html

http://nginx.org/en/linux_packages.html

http://php.net/manual/zh/install.unix.nginx.php

601 total views, 1 views today

如何搭建LNMP环境(一)

当你想学习一门语言的时候,第一步应该做什么,写 Hello World?

No, 首先你要学会如何搭建开发环境。这个系列一共有两篇,第一篇介绍如何在 ubuntu 14.04 上面搭建 lnmp 环境,第二篇介绍如何在 centos 7.0 上面搭建 lnmp 环境。


如何在 ubuntu 14.04 上面搭建 lnmp 环境

1. 使用 apt-get 安装nginx, php, mysql

# sudo apt-get install nginx php5-cli php5-fpm php5-mysql mysql-server

2. 修改 nginx 配置

安装好 nginx 之后,你可以在 /etc/nginx 目录下面找到 nginx 的配置文件。

# cat /etc/nginx/nginx.conf

查看 nginx.conf 文件,我们发现如下一行配置,加载 sites-enabled 目录下面的所有配置文件。

include /etc/nginx/sites-enabled/*;

然后我们查看 sites-enabled 目录,发现有一个指向 /etc/nginx/sites-available/blog 配置文件的软链接。

# ls -l /etc/nginx/sites-enabled/

blog -> /etc/nginx/sites-available/default

如法炮制,我们首先在 sites-available 目录下面创建一个新的配置文件 blog,然后把它放到 sites-enabled 目录下面。

# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/blog

# ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/blog

然后修改 sites-available 目录下面的 blog 配置文件,注意不要直接修改 sites-enabled 目录下面的软链接。

# sudo vi /etc/nginx/sites-available/blog

最后移除 default 配置文件软链接。

# rm /etc/nginx/sites-enabled/default

重新加载 nginx 配置文件,nginx 的配置就到此为止了。

# service nginx reload

参考:

https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

551 total views, no views today

PHP 技术栈

写代码三年了,庆幸自己还没有厌倦。然而日复一日的写一些业务逻辑代码,程序员该怎么提高自己呢?这是一个不得不面对的问题。看书,写博客是一个很好的方法。可是该看什么书呢?每天都会涌现出一大批新技术,该学什么好呢?


PHP

入门

当我是一个新人的时候,总是渴望别人能给我意见。可是现在当别人要我给点建议的时候,我才发现写代码其实就是每天坚持不断地写,写多了自然就会了。

如果一定要说点什么的话:自学就好,没有必要参加培训班。这个阶段不要想太多,网上搜索 w3school,按照教程搭建一个开发环境,直接开始写代码。

初级

初级是怎样的一个阶段呢?不管你是几天、几个月、还是几年的时间入门,当你找到工作,把写代码当做职业而不是兴趣的时候,你就是一位初级工程师了。

开始的一两年是成长的最快的一个阶段,作为一个 PHP 程序员,你可能已经可以独立完成一个小项目的开发。

需要警惕的是,千万不要停止学习,有些人一辈子就停留在了初级程序员这个阶段。

中级

我想处在这个阶段,大多数人已经可以轻松的完成开发任务。那么如何写更少的代码,更快的完成开发任务呢?

我认为还是多看书,多总结。目前的学习的规划是:理解设计模式,阅读框架源码,或者自己实现 PHP 框架。

高级

我原本认为高级 PHP 程序员的标准是,能够阅读 PHP 源码,能够编写 PHP 扩展。但是现在觉得太肤浅了,等我达到那个阶段再来回答这个问题吧。


技术栈

什么是技术栈?我所理解的的 “技术栈” 就是为了完成特定的 “工作” 所需要的 “技术储备”。

比如作为一个 PHP 程序员,除了 LNMP,你可能还需要会 HTML、CSS、JavaScript 等等。

这里分享一张 PHP 程序员画的 “全栈工程师技能树” 思维导图:

925 total views, 1 views today

如何科学上网

“The best time to plant a tree was 20 years ago. The second best time is now.”
— Chinese Proverb

一直想写点什么,却由于各种各样的原因一直没能实现。

最近红杏挂了,用阿里云的服务器搭了一个简单的 vpn,顺便用 WordPress 搭了一个个人博客。

可能会写一些技术文章,读书笔记,旅行日记,一切皆有可能。

对于一个拖延症晚期的人来说,保证按时更新基本是不可能的。

所以至少每月一篇吧。


为什么科学上网(翻墙)是每个科技工作者必备的技能?

因为一些众所周知的原因,包括 Google 在内的许多海外知名网站都被封了,而且随着 GFW 的不断升级,会有越来越多的网站无法访问。

那么问题来了,如何用正确的姿势来科学上网(翻墙)呢?

如果你去网上搜索一下,你会发现原来有这么多种科学上网的方法,不管你是没有什么经验的新手,还是已经解锁多种姿势的老手,相信都会大开眼界的。

这里主要介绍一些我用过的科学上网方法。

1.ssh 代理

首先你需要一个 ssh 账号。我当时用的是公司的账号。网上可以找到免费试用的 ssh 账号,如果需要购买可以去淘宝。

然后你需要 Bitvise SSH Client (以前叫 Bitvise Tunnelier),Firefox 浏览器 和 Foxyproxy 插件。

由于没有 Windows 系统的电脑(其实是懒),就不写详细的步骤了,教程可以自行网上搜索。

2.红杏

鉴于红杏已经挂了,不知道什么时候能恢复,这里就不介绍了。

3.vpn

不得不说,vpn 用户才是科学上网的主力军。

今天我们主要介绍怎么在 ubuntu 14.04 上搭建 PPTP 服务器。

安装和配置 pptp 服务器

首先我们用 apt-get 安装 pptp 服务器

# sudo apt-get install pptpd

然后我们需要修改 pptp 服务器配置文件

# sudo vi /etc/pptpd.conf

在文件结尾添加 server IP 和 client IP. 比如下面这样:

localip 192.168.0.1
remoteip 192.168.0.100-200

把 PPTP 服务器的 IP 配置为 192.168.0.1, 同时给连接到该 PPTP 服务器的 PPTP 客户端分配 192.168.0.100 到 192.168.0.200 的地址段。

配置当 PPTP 客户端 连接到 PPTP 服务器时使用的 DNS 服务器

# sudo vi /etc/ppp/pptpd-options

去掉 ms-dns 配置前面的 #,你可以像下面一样添加 google 的 DNS 服务器或者其他的 DNS 服务器

ms-dns 8.8.8.8
ms-dns 8.8.4.4

然后在配置文件 /etc/ppp/chap-secrets 里面添加用户数据

# sudo vi /etc/ppp/chap-secrets

每一行是是一个用户,一共四项数据,用空格隔开。

第一项是用户名。第二项是服务器名称,你可以填 “pptpd”。第三项是密码。最后一项是 IP 地址,填 * 代表允许所有 IP 访问。

# client server secret IP addresses
username * password *

最后启动 PPTP 服务器

# /etc/init.d/pptpd restart

OK,现在可以使用你的用户名密码连接到 PPTP 服务器了,是不是就大功告成了呢?

然而并没有,你会发现虽然你已经连上了 VPN,但是根本上不了网。因为你忘了一个重要的步骤。

配置 IP 转发

我们可以通过修改/etc/sysctl.conf 文件来启用 IPv4 转发。

# sudo vi /etc/sysctl.conf

把下面一行的注释去掉

net.ipv4.ip_forward=1

然后重新加载配置文件

sudo sysctl -p

把转发规则添加到 iptables

# sudo vi /etc/rc.local

在 exit 0 之前添加下面两行

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp --syn -s 192.168.0.0/24 -j TCPMSS --set-mss 1356

重启之后你就可以连接到你的 PPTP 服务器,并且愉快的 Google 一下了。

参考:

免费 ssh 代理

http://blog.onlybird.com/getfreessh

Bitvise SSH Client 下载地址

https://www.bitvise.com/ssh-client-download

在Ubuntu上搭建VPN(PPTP)

https://help.ubuntu.com/community/PPTPServer


最后说点题外话,这个世界上并没有绝对的自由。当我们讨论如何科学上网时,我们讨论的是一种技术问题,而不是是非问题。

1,698 total views, no views today