作者归档:vicalloy

编程语言们各自的哲学

曾有同事打算将ZOPE和PLONE啃下,我是不建议的。同事说我不够开放,对自己不喜欢的技术都很排斥。我承认,每个人都会有自己的偏好。但我不赞成使用ZOPE恰恰不是因为偏好问题,我也不会因个人偏好而建议采用或不采用某项技术。
在我看来ZOPE是一个很变扭的技术。ZOPE引入了接口/容器等概念,给人感觉ZOPE在很多方面都在有意的模仿JAVA。Python和JAVA在语言哲学方面有着比较大的差异,试图以Java的方式来做一个Python的WEB开发框架无疑是有些别扭的。如果ZOPE真的学的特别象,那我为什么不干脆直接使用Java?
这世界上存在各种编程语言,每种编程语言都有着自己的特点,正是这些差异满足了各类人的不同需求。这些编程语言都有着自己最核心的思想,这个核心思想就是所谓的“哲学”。没有自己“哲学”的编程语言是无法在这个世界上存活的。有些编程语言看上去问题很多,却很流行。或许它的那些问题也正是它流行的原因。

PHP

PHP的使用门槛非常的低,而且通常用PHP写出来的东西代码都不是那么的“漂亮”。于是有些人将PHP看成是业余程序员用的东西。然而就是这么一个看似不怎么专业的东西统治了大半个互联网。PHP的“哲学”是“quick and dirty”。在一定程度上beauty和quick并不容易并存。PHP将quick和简单作为第一要求,代码的漂亮退居第二。dirty的代码并不容易维护,所以通常在系统在复杂后,复杂业务逻辑功能将交由其他技术实现。PHP则安心做着自己表现层的事。

Java

有人说Java是给笨人用的语言。这话虽然很难听,不过在一定程度上这还真就是Java的哲学。Java充分利用语言特性和IDE等自动化工具来避免程序员犯错,让人海战术成为可能。对于大多Java项目只需要少数的牛人来设计系统构架和主要接口,下面的具体实现用“笨人”来做就可以了。

Python

python的哲学是“quick and clean”。在一定程度上说python确实非常clean也很quick。不过python的clean可让也让python变的有些平庸。python号称什么都能做,却又没在哪个领域特别突出。

Ruby

Ruby强调人文关怀,编程是一件有乐趣的事,你可以按照自己喜欢的方式去使用ruby。相对而言ruby可能更容易发挥个人的创造性,但在团队协作时则容易遇到麻烦。

凋零的中国村庄

同事说他出生的小村庄已经严重的凋零,村里的年轻人都外出务工,村里只剩下为数不多的老人。曾经热闹的村小学沦落到只剩个位数的学生。因为生活在城市,此前感受到的都是城市发展的迅速。这次去女朋友家,切实看了一回凋零的村庄。
那也曾是一个繁华的小镇。随着自然资源枯竭,政府开始寻求新的经济增长点,于是引进了大批重污染企业。切实可见的污染让广大居民开始逃离。于是小镇开始没落。工厂的建立后,也有一些附近的居民开始进厂工作,生活得到改善,于是虽然污染但抱怨的人也并不见多。
有时在想,中国饮鸩止渴的经济模式还要继续多久,还能支撑多久。中国一直高呼科技兴国,实际上却一直走的都是粗放型的经济模式。地方官员为了自己的政绩更是将饮鸩止渴的高污染高好耗能的路子发挥到了极致。一时的政绩可能漂亮,但污染过的环境,破坏的资源就没这么容易恢复了。遗憾的是这些糟糕的后果并不需要当前的官员承担,他已经因为漂亮的政绩步步高升了。在中国由于缺少必要的民间监管,官员们此前的烂底子更无人知晓了。马克吐温的精选州长里描述了一个好人如何在参与了州长竞选后名声扫地。竞选中或许有竞争对手的不实攻击,但这也更要求一个人必须更加重视自己的名誉,以及每个行为所产生的后果。

我看好的一些互联网方向

有人说做什么不重要,重要的是坚持不懈的做下去。但我想在做之前多做些准备,选条平坦些的道路总比一条死路走到底的好。就好比刘翔,如果他铁了心的练跳高,即使再努力也无法达到他现在跨栏的高度。
首先,不要试图去找一个没人做过的领域。有这不计其数的人在互联网上找机会,很难有一个点子是只有你才能想到的。如果一个领域没人做,很可能是市场还没有足够的成熟,已经很多人尝试过且败下阵来。或是这个点子在实施过程中的困难远大过你的想象,根本就不可行。
不可否认的是互联网已逐步渗入了人们生活的各个方面,一个好的互联网方向也应当是和人们的生活相关。互联网应用需要满足人们生活中的真实需求。在进入一个成长过程中的市场远比进入一个成熟的市场或是已经开始衰退的市场要来的有前途。如果一个行业的势力范围已经划分完成(已出现寡头),这时候再想进入就不太有必要了。
下面是我看好的一些互联网方向:

  • 旅游 可以说旅游类网站已经非常多了。途牛等旅游网站在广告上大把砸钱。不过旅游是一个足够大的市场,可以有非常多的衍生产品。谁想做到一家独大还真不是一件容易的事。另外近年来旅游市场发展迅速,应当还是大有可为的。
  • 在线票务 和书籍一样,票务是非常适合在线销售的东西。电影、演出演出市场的发展速度也还不错。
  • 宠物 从小区里满地的猫狗可以知道到底有多少人在养宠物。可以预见在接下来的一段时间里宠物的数量还将持续增加。对很多宠物主而言,宠物是他们家庭成员的一部分,他们愿意在宠物上花钱。现在宠物爱好者们还大多分散在各个/各类网站上,能让人眼前一亮的宠物网站还没有出现。

国内代码托管网站不完全列表

可以说GitHub的出现完全颠覆了以往大家对代码托管网站的认识。GitHub不但是一个代码托管网站,更是一个程序员的SNS社区。在GitHub出现后,国内外有的代码托管网站也都开始引入GitHub的某些元素。
GitHub真正迷人的是它的创新能力与Geek精神,这些都是无法模仿的。
有朋友想做基于HG的代码托管网站,所以对国内的代码托管网站有过一些关注。下面是我知道的国内类Github的代码托管网站。

要想在国内做一个成功的代码托管网站并不容易。如果你是一个小团队,且缺乏足够的魄力和觉悟,我是不建议去折腾这个的。

  • 对开发者而言GitHub已是一种流行文化,如果你的特色不够显著很难说动人来。
  • 小团队关门的事情经常发生,如何让人相信你的服务是长久可信赖的是一个挑战。
  • Github没有被墙,或者说不能访问的概率还是太低。如果之是速度快一点点,不足以做为卖点。而且对git而言,需要真正和服务器同步的时间很少。

国内在线P2P信贷平台不完全列表

在线P2P信贷平台介绍

在近年来,出现了一些网站,提供个人之间的借贷平台,这种新的产业又被称作个人间借贷(person-to-person lending)。形象点就是:你有闲钱,但是银行利率太低,你不想就这样贬值了。这时候有人缺钱花想找银行借,但银行审批手续太多批准不下来。有人有闲钱,有人急需借钱,于是你们一拍即合把钱借出去。对你来说,你可以得到高于银行的利率。对方则拿到了自己急需的资金。
如果你想了解在线P2P信贷的更多信息可以参考下面的文章

国内在线P2P信贷平台

从去年开始,国家逐步放宽了对民间借贷的限制,对民间借贷采用睁一只眼闭一只眼的态度。伴着国外Lending Club等在线P2P信贷平台的走红,国内的在线P2P信贷平台也蓬勃的发展了起来。下面是我收集的一些国内P2P信贷平台的网址。

注:

  • 按照Alexa排名进行排序。
  • 列出来的并不代表我认可,只是表示“有这么一个”。我相信里面真正能活下的不会太多,大家可以看看到底有多少能活到明年的这个时候。
  • 如果你知道国内还有哪些其他的在线P2P信贷平台也欢迎补充。

我的一些看法

有朋友说现在的经济环境太糟了,实业都办不下去了,有朋友把深圳的工厂关了回内地放贷去了。前几年先是全民炒股,接着是全民炒楼,到如今变成了全名放贷,就是没人办实业。当一件事发展到全名参与的程度,这时如果缺乏必要的制度保障与监管就必然要出问题。前几年的股市、房产与现在的民间借贷都存在类似的问题。在民间借贷真正发展到全民借贷之前还是可以尝试性的看看,我想在这之前应当会有个半年时间。

MongoDB介绍以及Python的相关库

MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。MongoDB提供了比较丰富的数据库查询接口,是目前最接近关系数据库的NoSql数据库。
近两年MongoDB的发展速度非常的快,不少公司已经将MongoDB应用到实际产品中。在这些公司中最著名的应当是foursquare,国内的淘宝等公司也部分使用了MongoDB。MongoDB更完整的应用列表可以在MongoDB的Production Deployments找到。
技术人员普遍有追新的爱好,看到一个不错的东西就想在自己的项目中用少。在对MongoDB做了些了解后,感觉使用MongoDB作为普通web应用的主数据库或许并不是一个很好的主意。

  • MongoDB的优势是速度以及海量数据的支持,另外一个有点就是schemeless。真正需要用到schemeless的地方似乎并不是太多。目前很多 MongoDB 封装,也都增加了scheme的定义功能,基本上放弃了schemeless特性。另外如果过度的schemeless,日子久了后可能自己都搞不清楚自己到底在数据库里放了什么东西。
  • MongoDB的特性决定了某些关系数据库很容易做的操作在MongoDB中会很不容易实现(比如多表关联查询等,而且据说分页性能也不怎么样?)。为配合MongoDB,在构架设计乃至产品功能需求方面都需要做些调整。
  • MongoDB的另外一个问题是太费内存,在内存不够大的时候性能很可能还不如mysql。所以有人称MongoDB是有钱人用的东西。
  • 可能大多人都不太会有机会遇到真正需要MongoDB的海量数据。

在V2EX上发了一个关于MongoDB的帖子(有谁在用 MongoDB 体验怎么样),引来不少关于MongoDB的吐槽。不是说MongoDB不够优秀。MongoDB有着自己特定的应用场景,如果只是为了尝鲜而贸然使用,可能并不会得到预想的效果。
下面简单的介绍一下MongoDB相关的一些Python库:

  • PyMongo MongoDB的Python接口开发包。PyMongo提供了最原始的MongoDB访问接口,其他的Python MongoDB库基本上都是基于该库进行开发的。
  • MongoEngine 为MongoDB提供了类似Django ORM的API。支持定义Scheme定义,同时提供DynamicDocument类用于支持schemeless。MongoEngine内置了Django提供支持。如果你之前使用过Django,MongoEngine会让你觉得非常舒服。
  • MongoKit 和MongoEngine类似的一个库。个人更倾向于MongoEngine所以对MongoKit没有太多了解。

[django-ajax-validation]Django表单AJAX校验及提交的APP

项目地址https://github.com/vicalloy/django-ajax-validation
django-ajax-validation是一个使Django支持表单AJAX校验的第三方APP。我做了一些修改,增加了表单的AJAX提交以及twitter-bootstrap的支持。

安装

  • pip install git+git://github.com/vicalloy/django-ajax-validation.git
  • 在Django settings的INSTALLED_APPS中加上”ajax_validation”。

一个简单的使用范例

views.py

from ajax_validation.views import validate_form
from ajax_validation.utils import render_json_response
...
class TimelineForm(forms.ModelForm):
    class Meta:
        model = Book
def add_book(request):
    #创建表单并进行校验。返回表单以及校验结果。
    form, validate = validate_form(request, form_class=BookForm)
    if validate['valid']:#如果校验成功,执行保持操作
        book = form.save()
    return render_json_response(validate)//返回JSON

模板

进阶

django-ajax-validation的原始文档就写的非常糟糕,我也偷懒,所以想了解更多还是直接看代码吧。

Node.js相关知识

简单的说Node.js是一个使用Javascript作为开发语言的web开发框架。凭借JS良好的用户基础以及Node.js的高性能等优势Node.js迅速的流行了起来。
此前我一直以为Node.js只是一个使用JS作为开发语言的类ROR开发框架。在对Node.js做过简单的了解后发现这确实是一个很酷的东西。如果有机会非常希望将系统的部分功能改由Node.js实现。
由于Node.js的资料已经不少,这里就不再多费唇舌。想对Node.js有更多了解可以参考下面的一些文档。

  • Node.js 究竟是什么 让你对哦Node.js有个总体概念。Node.js是什么,适合做什么,不适合做什么。
  • Node入门 一本(篇)免费的Node.js入门教程。可以用于了解Node.js一些基础使用以及相关概念。
  • Node.js官方文档(API文档) 可以看前几节,对Node.js的Global Objects有些了解。其他的东西可以用的时候再查。
  • 深入浅出Node.js InfoQ关于Node.js的系列文章。
  • Node Club@GitHub Node Club 是用 Node.js 和 MongoDB 开发的新型社区软件。这是一个开源项目,可以用于熟悉Node.js。简单的阅读过Node Club的代码,感觉用Node.js做传统WEB开发的体验并不是太好。
  • npm Node.js使用的包管理工具。在这里你可以找到很多优秀的JS库。很多JS库不但可以用于Node.js还可以直接用于前端。Node.js的社区非常活跃,第三方库的增长速度非常的快。在这些第三方库中不乏一些很有创意的东西。
    • express 构建在Node.js之上的WEB开发框架。
    • lesscoffee-script 这两个已经太出名了
    • jade 非常酷的一个JS模板语言,看上去有些类似zenCODE。
    • ejs 另一个JS模板语言。相比jade,ejs更适合普通人的使用习惯。
#jade
html
  body
    h1 User <em>#{name}</em>

题外话(About WebSocket&Django)
WebSocket的良好支持是Node.js的一大优势。WebSocket是HTML5里出来的新东西。WebSocket的实质是在浏览器与服务器间建立一个socket连接从而实现客户端与服务端的双向通信。由于Python的WSGI协议无法支持WebSocket,所以包括Django在内的大多WEB框架要支持WebSocket并不是一件容易的事(注:Evented Django这篇文章里有介绍如何使Django支持WebSocket,不过总的来说有些折腾)。Tornado和Node.js一样同为非阻塞的WEB服务框架不需要使用到WSGI,所以不存在这个问题。

web服务器的同步与异步

最近几年node.js和tornado的流行和他们采用的是非阻塞(异步)模式有很大的关系。传统的web服务器通常采用的是同步方式,服务器的每个进程/线程每次只能处理一个请求,在遇到高并发的情况时为即使处理请求必须创建足够多的进程/线程来处理每个请求。举个简单的例子,如果每个请求的处理时间为4秒,为了支持每秒100次请求,你必须为此创建4*100个进程。创建400个进程,这个成本无疑是有些太高了。
node.js和tornado等异步服务器在接收到用户请求后,先将请求放到后台处理,等处理完成后再处理结果返回给用户。node.js和tornado都采用了类似的事件机制,可以在一个进程里并行的处理多个用户请求。在遇到高并发的情况下不需要创建多个进程/线程就可以轻松应对。也真是因此许多人认为异步模式肯定比同步模式要强,异步模式肯定要更好。
Gunicorn是一个Python WSGI HTTP服务器,同时支持同步以及异步模式。Gunicorn默认采用的是同步模式,在它的Design一节中有关于同步以及异步模式的选择说明。前面讲到同步模式下为处理高并发需要创建大量的进程,但如果每次请求的处理时间都非常短就不会出现需要创建大量进程的情况。如前面的例子中,如果每次请求的处理时间为0.1秒,则只要创建0.1×100个进程即可支持每秒100次的请求。node.js、tornado的事件机制虽然要比创建进程和线程的成本要低的多,但也不是完全没有开销的。
最后总结下:
如果服务满足一下特点时可以考虑异步服务器,不然就不是很有必要了

  • 大量的并发请求
  • 每个请求处理的耗时都比较长

将LBForum、“似水流年”的部署环境切换到Gunicorn+Supervisor

Gunicorn 是一个Python WSGI UNIX的HTTP服务器。Gunicorn有着不错的性能以及稳定性。Gunicorn对WSGI、Django、Paster提供了很好的支持,使用起来非常的简单。
此前 LBForum似水流年 使用apache+wsgi的方式部署在webfaction上。为了给服务器节约些内存将部署方式切换到Gunicorn。不过似乎效果并不明显。除工作进程外,Gunicorn还会另外启动一个master进程用于管理子进程。master进程加一个子进程的内存耗用量加在一起大概在40M左右。
注:在一些评测里Gunicorn的性能并不是太好。Gunicorn支持多种 worker-class ,默认的worker-class使用的是同步模式。在将worker-class切换到gevent或tornado性能会好出不少。