再见

我和昕猫终于还是没能走到最后. "我们还是分开吧", 她总是很坦然. "那好吧", 我希望我也能这样坦然的回答, 然而这并不是事实. 在那一刻, 我的情绪淹没了所有的理智, 我一句话也说不出来, 像是有什么东西哽在喉咙里. 不得不承认的是, 真实的我甚至比她口中的那个男孩还要幼稚可笑. 表面上看, 我似乎是比较懂得照顾人的那一个, 事实上, 只有我才知道自己对她是多么的依赖. 一直以来, 失去她对我来说都是一个不存在的选项. 我朋友很少, 昕猫除了是我曾经的爱人, 也是我最好的朋友. 值得庆幸的是, 我们之间作为朋友的关系在一定程度上还能得以保留, 她会笑着打电话问我饺子馅应该买哪种肉, 和面应该加多少水, 我也乐于告诉她小托最近又长胖了, 以前套肩膀的绳子现在只能套脖子. 她说, 她一直被我身上那种生活的气息所吸引, 跟我在一起也让她学会了如何更好地生活. 而我知道和这些比起来, 她带给我的惊喜要多得多. 我看见自己是怎样变成了一个更好的人, 我说的"更好", 指的是更快乐. 我们相互扶持着经历过了人生中最尴尬的阶段, 结束了学生时代, 步入社会, 既没本事也没钱, 租便宜的房子, 每隔几天就强迫症般地去查查银行卡上的余额. 她说, 我在她的人生里占据着一个不可取代的位置, 那个在她最糟糕最狼狈的日子里陪伴在她身边的人, 糟糕的日子已经过去了, 所以也不会再有一个这样的人. 对我来说, 也是一样. 小托昨天晚上拉肚子,…

Appium:移动端自动化测试之道

如果你曾接触过Selenium的话, 那么, Appium就是一个移动端的 Selenium, Appium通过调用Andriod SDK提供的API实现对应用的操作, 从而实现对各种功能的模拟测试. Android Test with Appium (written with python client) 环境准备(Android) Windows 1. 安装JAVA: 可从官网获取JDK1.8安装包 2. 安装ANDROID SDK MANAGER: 可从官网获取ANDROID SDK MANAGER安装包, 并配置环境变量 ANDROID_HOME 到 ANDROID SDK 安装目录, 如:D:\Program Files\Android\android-sdk 3. 通过ANDROID SDK MANAGER安装所需的版本的ANDROID SDK 4. 安装appium: 可从[…

PHP自动化发布工具:Deployer

项目迭代的过程中, 不断把新开发的功能发布到不同的系统环境是一件家常便饭的工作. 传统的做法一般是: 登录到某台服务器上; 更新代码; 更新依赖(composer up); 重启一些服务(比如队列什么的)... 随着项目逐渐长大, 服务器的数量会越来越多, 每次发布新功能都需要亲自登录到20台服务器上, 一遍又一遍的做着重复的操作,还得确保每一次操作都正确且没有疏漏, 对于程序员来说, 这样的事情是不可想象的。重复的工作,就交给代码去完成吧! Deployer 是一款用PHP开发的自动化发布工具。又要发布新版本了? 你所要做的仅仅是在命令行中输入一行命令,执行预先写好的脚本,之后所有的工作deployer会帮你完成。甚至,你还可以把它和版本控制工具的Hook结合起来,例如,当master分支收到新的提交后,deployer自动从版本控制中拉去新的代码,并在指定服务器上完成后续的发布工作,自动化发布实现了! 如果你是一名PHP程序员那就太棒了, 因为deployer的部署脚本也是用PHP来写的。deployer的原理其实很简单,添加服务器配置,通过ssh方式以秘钥或者密码登录到远程服务器并执行脚本。服务器配置文件大概是这样: prod: host: domain.com user: www identity_file: ~ stage: production deploy_path:…

如何正确使用composer

composer 是一款优秀的PHP依赖管理工具,正如pip之于python、gem之于ruby、gem之于node。无论任何一门语言,在现代软件开发实践中,依赖管理对于开发者而言都是必不可少的一个部分。敏捷开发强调不要重复造轮子,而依赖管理工具则提供了一种最容易的方式帮助我们方便的获取到别人造好的漂亮轮子,并且完美的安插到我们的项目之中。理想总是好的,但当理想落地成为现实的时候,一切又变得不那么美好,尤其是当它准备落在中国的土地上。 因为众所周知的原因,composer在国内并不好用,虽然在PHP社区里也有一些为国内开发者提供的镜像网站,然而经过尝试,这些镜像的表现也不尽人意,常常出现502等让开发者们叫苦不迭。简单分析一下,composer更新缓慢主要在两个地方,一是从packgist获取依赖包的下载地址时常常会卡死(也就是: Loading composer repositories with package information 这一步); 二是从github下载文件时,有时会因为网络请求超时而中断 自建镜像 Satis是composer官方提供的一个搭建私有镜像的工具, clone satis 到自己的服务器以后, 在配置文件中申明需要的依赖, 如: { "repositories": [ { "type": "composer", "url": "http://packages.example.org/" } ], "require"…

如何快速搭建一个VPN服务器

这里提供两种快速搭建一个VPN服务器的方案(首先,你需要准备一台墙外的 *nix 服务器)。 L2TP L2TP服务器的搭建过程相对比较麻烦,不过Github上总会有不少前人造好的轮子,我们所要做的只是了解如何使用它 setup-simple-ipsec-l2tp-vpn。 clone下项目后,根据自己的系统环境,执行对应的setup.sh脚本。以CentOS为例: $ ./setup_centos.sh 安装完成后,还需要配置iptables转发规则 $ echo 1 > /proc/sys/net/ipv4/ip_forward #开启ipv4转发 iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth1 -j MASQUERADE #将ppp数据转发至公网网卡(规则中的IP网段和网卡变化根据实际情况确定) $ iptables-save $ service iptables…

用Supervisor管理后台进程

在服务器上时常会有一些需要在后台长时间运行的脚本,比如队列服务的监听器及某些服务的server端等。Supervisor是一套用python开发的进程管理软件,将需要长期运行的脚本交由supervisor进行管理以便对进程状态进行监控,如当进程意外终止时,supervisor能自动重启该进程,达到类似守护进程的效果。 在 *inux 中,你可以直接通过软件源获取安装包进行安装,如:apt-get install supervisor,不过还是更推荐通过python软件管理工具进行安装,以便获取到较新的版本: easy_install supervisor Supervisor 由两个部分组成:supervisord 和 supervisorctl。supervisord是服务端,用于将指定的进程当做子进程来运行。supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程。 通过easy_install安装的supervisor并没有创建软件的目录及默认配置文件,推荐的目录结构最好是这样的: - etc/ - supervisor/ - conf.d/ - supervisord.conf 在命令行输入 echo_supervisord_conf > /etc/supervisor/supervisord.…