2014年7月 ’ 的文章存档

为什么程序员跟其他人比起来应该喝更多的水

我们都不止一次的听到人们说:“你至少一天要喝8杯水。”

可问题是,几乎没有人做到了每天喝那么多水。从事编程职业这么多年来,我发现,尤其是程序员,饮水量明显不足。

程序员需要比常人喝更多的水。我在下棋时突然意识到了这一点。连续一个小时的下棋后,我就开始感到口渴。

看起来,是当我的大脑高速运转时,我们需要更多的水。

2

 

缺水状态下我的感受

我通常是早上起来喝一杯咖啡。咖啡有利尿作用——也就是它会导致小便更多。

在编程的时候,我会全神贯注,根本想不起、也感觉不到要喝水。

工作日里,我有时候会在午餐的时间喝一杯水,或者再加一杯咖啡。

到了晚上,我会在晚饭后再喝一杯。
阅读全文

ZeroMQ的学习和研究

ZeroMQ,史上最快的消息队列

—– ZMQ的学习和研究

一、ZeroMQ的背景介绍

引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。”

近几年有关”Message Queue”的项目层出不穷,知名的就有十几种,这主要是因为后摩尔定律时代,分布式处理逐渐成为主流,业界需要一套标准来解决分布式计算环境中节点之间的消息通信。几年的竞争下来,Apache基金会旗下的符合AMQP/1.0标准的RabbitMQ已经得到了广泛的认可,成为领先的MQ项目。
阅读全文

PEP8 Python 编码规范整理

决定开始Python之路了,利用业余时间,争取更深入学习Python。编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的。所以今天下午我根据PEP 8整理了一份,以后都照此编码了,还会持续更新。

PEP8 Python 编码规范

一 代码编排
1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。

二 文档编排
1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
2 不要在一句import中多个库,比如import os, sys不推荐。
3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。

三 空格的使用
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
阅读全文

当客户说:你们先开发出来我再提需求

小鱼儿(注:Pilot Fish,本文主角的名字)接到了一个软件项目,项目的要求是能够处理公司客服中心收到的各种服务请求,内容包括服务调度,设备跟踪,工程师的服务请求以及一些设计问题。

“我非常尽心尽责,拿着纸笔一个一个地跟各个部门的头头谈话,想把他们的需求或者意见记录下来。”小鱼儿苦恼的说。“他们给我的答复却千篇一律:’我不知道,你先大概弄一下,然后我们再看看了。‘”

小鱼儿并没有气馁,他跑到各个部门的潜在用户那里去征求意见。可这些家伙跟他们的老板们如出一辙。他们给小鱼儿的答复是:“大致搞一下,然后我们再给建议。”
阅读全文

集中日志服务器Rsyslog

基于主机的管理一般需要收集服务器的日志信息用于及时发现错误,处理故障。

搭建linux下的集中日志服务器的程序一般可以用syslog,rsyslog,syslog-ng,还有scribe和fluentd等。

基本每一种方式都是服务器端和客户端的模式。

一般syslog,syslog-ng,rsyslog用于收集系统日志,scribe和fluentd用于收集业务日志,rsyslog和syslog-ng也可以收集业务日志,并可定制和过滤、筛选。
阅读全文

URL相似度计算的思考

在做一些web相关的工作的时候,我们往往可能需要做一些对url的处理,其中包括对相似的url的识别和处理。这就需要计算两个url的相似度。

那么怎么进行url相似度的计算的?我首先想到的是把一个url看作是一个字符串,这样就简化成两个字符串相似度的计算。字符串相似度计算有很多已经比较成熟的算法,比如“编辑距离算法”,该算法描述了两个字符串之间转换需要的最小的编辑次数;还有一些其他的比如“最长公共字串”等方法。但这些方法对于url相似度的计算来说是不是够了呢?比如给以下三个url:

url1: www.spongeliu.com/xxx/123.html
url2: www.spongeliu.com/xxx/456.html
url3: www.spongeliu.com/xxx/abc.html

这三个url的编辑距离是一致的,但是直观上我们却认为url1和url2更加相似一些。

再比如我们要判断两个站点是否同一套建站模版建立的,抽出两个url如下这样:
url1: www.163.com/go/artical/43432.html
url2: www.sina.com.cn/go/artical/453109.html

这两个url按照情景应该是相似的,这就超出了字符串相似度判断的能力范围。

重新回到问题,要判断的是两个url的相似度,但是字符串的判断方法又不能很好应用。那么url和字符串的区别在哪里?这取决于如何定义相似的url。可以注意到,url比字符串含有更多的信息可以参考,因为url本身是包含结构和特征的,比如站点、目录。定义相似url的时候,是否要考虑站点?是否要考虑目录的一致?是否要考虑目录的深度?这取决于具体的需求。

考虑到url本身的结构,对其相似度的计算就可以抽象为对其关键特征相似度的计算。比如可以把站点抽象为一维特征,目录深度抽象为一维特征,一级目录、二级目录、尾部页面的名字也都可以抽象为一维特征。比如下面两个url:
url1:  http://www.spongeliu.com/go/happy/1234.html
url2:  http://www.spongeliu.com/snoopy/tree/abcd.html

先不定义他们是否相似,先来抽象一下他们的特征:

1、站点特征:如果两个url站点一样,则特征取值1,否则取值0;
2、目录深度特征:特征取值分别是两个url的目录深度是否一致;
3、一级目录特征:在这维特征的取值上,可以采用多种方法,比如如果一级目录名字相同则特征取1,否则取0;或者根据目录名字的编辑距离算出一个特征值;或者根据目录名字的pattern,如是否数字、是否字母、是否字母数字穿插等。这取决于具体需求,这里示例仅仅根据目录名是否相同取1和0;
4、尾页面特征:这维特征的取值同一级目录,可以判断后缀是否相同、是否数字页、是否机器生成的随机字符串或者根据编辑长度来取值,具体也依赖于需求。这里示例仅仅判断最后一级目录的特征是否一致(比如是否都由数字组成、是否都有字母组成等)。
阅读全文

如何将 Vim 打造成一个成熟的 IDE

如果你稍微写过一点代码,就能知道“集成开发环境”(IDE)是多么的便利。不管是Java、C还是Python,当IDE会帮你检查语法、后台编 译,或者自动导入你需要的库时,写代码就变得容易许多。另外,如果你工作在Linux上,你也会知道Vim在进行文本编辑的时候是多么的方便。所以,你可 能会想从Vim中也获取这些IDE特性。

事实上,很少有方法可以帮你做到。有些人可能会想到试着把Vim打造成C语言IDE的,比如c.vim;也有把Vim集成到Eclipse里的 Eclim 。但是我想要告诉你的是一个更加通用的,只用插件实现的方案。你肯定不想因为安装了太多的面板和特性而让你的编辑器变得臃肿不堪。只用插件实现的方案可以 让你只选择那些你想要集成到Vim的特性。这样做的额外的一个好处是,这个IDE不是专门针对某一种语言的,可以让你写任何类型的代码。下面就来看一下我 的 把IDE特性带进Vim的前10款插件 吧。

先来个福利: Pathogen

首先,可能不是所有人都熟悉Vim的插件,并知道该怎么安装这些插件。所以,我推荐的第一个插件就是Pathogen,因为这个插件会让你更容易安装其他插件。如果你要安装另外的没有在这里列出来的插件,用Pathogen会变得非常简单。它的官方页面的文档写的非常好,去下载安装一个吧。接下来插件的安装也会变得容易很多。

1. SuperTab

a1

 

我们习惯于IDE的第一个原因就是它的自动补全功能。所以,我喜欢这个非常方便的,给了Tab键“超能力”的 SuperTab 插件。

2. Syntastic

a2
阅读全文

Dijkstra算法求解最短路径分析

最短路径是图论算法中的经典问题。图分为有向图、无向图,路径权值有正值、负值,针对不同的情况需要分别选用不同的算法。在维基上面给出了各种不同的场景应用不同的算法的基本原则:最短路问题

针对无向图,正权值路径,采取Dijkstra算法

Dijkstra_Animation

 

如上图,是求a到b的最短路径,这里并不限定b节点,修改为到任意节点的路径,问题是完全一样的。
阅读全文

shell解决DNS负载均衡RS的健康检测

DNS负载均衡,是最早的实现负载均衡技术的。在DNS的配置文件中为多个地址配置同一个名字,即配置多条指向不同ip的A记录,而客户端在查询这条A记录的时候将随机获得其中一个地址。通过以上描述不难发现,DNS负载均衡有着配置简单,性能优异,没有修改架构的开销等特点。因此,经常被用在内网。

说了优点,也要说说缺点。DNS负载均衡采用的是简单的轮循负载算法,不能分辨服务器的差异,不能根据后端服务器的运行状态进行动态调整,即健康检查。由于实现算法的随机性,不能为性能较好的服务器更多的分配请求,经常会出现将请求集中在某一台服务器上的现象。

如果你负载均衡的要求很高,不如使用其他负载均衡技术来的容易,比如LVS,Nginx或者HAproxy。修改算法,不仅要看明白洋洋散散几万行源码,还要将自己的代码完美融合进去,这个成本因人而异,但肯定不是一朝一夕之功。但如果只是后端服务器的健康检测问题,使用shell脚本就可以办到。

思路:DNS服务器通过某种机制对后端RS主机的运行状态进行判断,如果后端主机出现故障,那么DNS所要做的是修改配置文件,将问题主机从配置文件中提出并重启服务。更进一步,当RS主机恢复时,DNS主机还要将其恢复到配置文件中。
阅读全文

Python运维项目中用到的redis经验及数据类型

先感叹下,学东西一定要活学活用!   我用redis也有几年的历史了,今个才想到把集合可以当python list用。  最近做了几个项目都掺杂了redis, 遇到了一些个问题和开发中提高性能的方法,这都分享出来,共同学习。

下面先简单讲讲Redis集合的数据类型。

Sets 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。  上面说的是新浪微博的应用。
阅读全文