« February 2009 | Main | April 2009 »

March 23, 2009

弄了个让csdn blog输出全文的东西

某一天,喝了半瓶大二。然后我就想,我这到底算能喝酒还是不能喝酒呢?前几天喝的还没这个多,怎么就把笔记本丢了呢(这故事回头有时间再写)?

很久以前,喝多了酒,我就喜欢随便找个不规则物体,用微积分来算体积玩。后来就不玩这个了。现在比较喜欢写点好玩的程序或是找个命题来算概率。

想起来xuyou推荐过g9的blog,而csdn blog因为不输出全文,基本被我排除出了订阅列表。于是就顺手扒拉了一个小程序,用来把全文抓出来,塞在rss里面,好订阅用。

结果今天比较清醒的看了看那天扒拉出来的程序,竟然还真能用。

所以就放这了。

这东西是基于magpierss做的。没什么特别的,写了一个基于token的解析器来解析文章,把需要的部分抓出来。这种方法在做语法分析器的时候很常见。当然了,您不能对醉鬼要求太高,所以我这个解析器只分析了单层标签,如果想支持多层的,只要加一个栈就可以了。我暂时用不到,不加了。

说起来php真是个不错的语言,简洁有力。字符串处理很强大。计算机这个家族里面,很大部分的机器是在做字符串处理和数据库工作,还有很大的一部分在做排序工作。所以一个字符串处理功能强大的语言就是最容易流行的语言。

我做了几个我要订阅的rss:

g9的: http://blog.devep.net/tool/magpierss/rss.php?url=http://blog.csdn.net/g9yuayon/rss.aspx

阿朱的: http://blog.devep.net/tool/magpierss/rss.php?url=http://blog.csdn.net/david_lv/Rss.aspx

用法很简单,就在后面加上csdn blog的rss地址就行了。你可以下载代码回去自己搭一个玩玩。

代码在:http://blog.devep.net/tool/magpierss_withparser.tgz

很简单,很粗暴,很粗糙,也没什么版权,拿去随便干点什么用吧。

March 18, 2009

谢谢,请先发邮件给我

今天干了一件不大不小的糗事。

某网站打电话来:"我是XXX"。听了个开头我就很烦躁,此网站给我推销过xx资料,xx活动若干,于是我就没让小姑娘说下去,告诉她,我对你们所有东西都没兴趣,资料不是我需要的,活动我也不想参加。谢谢。小姑娘有点委屈的说"可是...",我说没什么可是的,没兴趣,谢谢。

后来下午有人问我,xx网站的活动,你是嘉宾啊,能不能给我搞点票?我这才明白,原来人家不是推销,是邀请啊...

错怪人家了。但是这个错怪也是有前提的。

愤怒这种情绪一般是累积的,就是同一件事情累积起来的大量的不满。说实话,骚扰我最多的不是这个网站,而是某个卖保险的。我反映最激烈的也不是这个网站,同样是那个卖保险的。

对付那个卖保险的方法是,我弄了一套某"直销"行业的培训资料,在卖保险的销售开口之前,就先开口给他念资料,然后威胁对方不许挂电话,不然我就去公司投诉他。这个办法很好用,一次管够,下次再也不会给我打电话了。

出现这些乱七八糟的事情,首先是个人资料保密太成问题了,人们完全是在裸奔。另一方面也说明商业机构太不拿用户信息当值钱的东西了。一切东西都有使用寿命。一次可以,二次可以,多了必然惹烦了。

对于我们这个职业,其实更严重。我最受不了的就是思考或是写程序的时候被打断。别管是谁我都想破口大骂。短信我已经基本不看了,但是电话总不能不接。这种时候接起来的电话别指望能有什么好结果。要么心不在焉,要么就是一口回绝。

我也没太多要求,再打电话之前,拜托请发个邮件给我。我查邮件比接电话及时,回邮件也比回电话及时。

也不知道为什么,是不是我人品特别不好,之前一段时间,每天我能收到至少5个垃圾短信和至少2个推销电话,当我开始启用了念直销文档这个办法之后,已经让这个数量大大减少了,不过还是挺烦人。

我在考虑是不是干脆拒绝所有通讯录里面没存在的电话....

March 15, 2009

rss解析器magpierss笔记

magpierss是一个不错的rss抓取/解析工具,我本来打算自己写一个php的rss解析工具,不过试了一下magpierss,觉得还不错,能满足需要。

顺便看了看代码,记点笔记。

1 乱码问题
magpierss过去时常出现乱码问题,从0.7版本解决了这个问题
Version 0.7
-----------
- support for input and output charset encoding
based on the work in FoF, uses iconv or mbstring if available

0.7之后的版本可以指定输入和输出字符编码,然后使用iconv或mbstring函数进行编码转换。这个工作在 create_parser 函数里面完成的,如果两个函数都不存在,可以在rss_fetch.inc 中让MAGPIE_DETECT_ENCODING为false,不检测和转换编码,否则就会出错。

一切正常的情况下,把rss_fetch.inc中MAGPIE_OUTPUT_ENCODING定义成你需要的输出编码,比如UTF-8: define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); 就可以获得正确的输出结果了。

2 抓取方法

magpierss用了Snoopy作为http客户端来抓取rss。这个库比较完善,支持https,支持gzip。

需要注意的是,Snoopy用exec命令调用curl,然后返回结果,而不是使用编译进php的curl函数。默认的路径是"/usr/bin/curl",如果这里没有curl或是没有执行权限,就可能失败。不过只有https需要用到curl,普通的http访问是用fsockopen的。

同时,Snoopy可以使用代理服务器,但是magpierss没有使用,如果需要可以在rss_fetch.inc中的_fetch_remote_file函数里面添加$client->proxy_host 和$client->proxy_port。

3 缓存

magpierss设置了一个默认3600秒超时的缓存。在./cache下放了一堆文件,文件名是md5之后的url+MAGPIE_OUTPUT_ENCODING,格式是php的serialize。

所以cache目录要可写。超时时间在rss_cache.inc的var $MAX_AGE = 3600;这行设置,也可以在创建cache对象的时候设置。


综合起来,这个库还是不错的,优点很多,也考虑了主机的各种情况,兼容性很好。函数形式的接口,很容易调用。不过应该先用head来取rss的http header,根据Etag来判断是否抓整个页面回来,这样效率还能再有提高。这个改动之后,cache就可以存在更长的时间,而不是一个固定的3600秒。同时我比较想把文章保存起来,以便以后用,这就需要数据库了。

我将来应该会基于这个东西发布一个新版本,把我想要的功能加进来。

March 9, 2009

关于有道阅读的beta技术沙龙

第一次beta技术沙龙邀请的是有道阅读来分享他们的技术和产品设计。阅读器这个东西听起来不大,但是技术含量并不低。

下面这个图是我根据当时听的情况随手画的,不一定很正确,但是应该基本能够看到产品的架子。简单说来就是前端,web server ,缓存,存储。当然了,任何网站都得这么设计架构。

From blogimg

大概可以分成几个部分:


  • 存储(这里主要说的是文章的存储),是基于关系型数据库和key-value库的结合。这里可以简单理解为mysql+bdb,关系型数据库负责保存索引和基础信息,占用存储最大的文章全文在key-value库里面保存。使用的时候,根据查询结果,通过key到key-value库中取回全文。基本可以保证灵活性和效率,也是相对比较廉价的方案。

  • 缓存直接使用了memcached,memcached现在已经成了网站标准配置,在谁的架构中如果看不到类似的东西存在,反而会有点奇怪。有道阅读采用了一组memcached作为缓存,特别值得一提的是,他们在缓存中保存了24小时内所需要用到的全部数据。据说是经过多次实践的结果。我估计这个缓存的尺寸也不小,而且未来还会增加,不知道未来会通过什么方式来处理。但至少目前的一段时间内是够用了。围绕memcached的相关解决方案和patch已经相当成熟了,看起来有道也没有进行特别多的定制和改动。

  • web的部分比较值得一说。为了保证升级版本的时候,服务失效时间尽可能短,web的处理部分被拆成了一系列的Service,每个Service至少有一对实例承担正常的请求,在升级或是对某些模块进行改动的时候,可以依次对一对(或更多)实例中的某一个进行操作。这样整个应用并不会因为对某个Service的操作而停机。新旧模块的切换只在很短的瞬间(有道称之为"影子服务")。这种思想很类似SOA,不知道实际用起来感觉怎么样。我觉得接口的定义难度还是很大的。否则新旧Service切换的时候,其他相关的Service数据结构一旦不兼容,后果可能很严重。SOA的标准那么复杂,主要就是为了保持兼容和接口标准吧。当然,在一个产品之内,这种接口的定义相对容易点,毕竟复杂程度还是有限的。

  • 用户界面部分使用JQuery,实际用起来响应速度相当不错。JQuery也是成熟的标准产品了,还是值得推荐的。
  • 最后就是备份,除了几层日常备份,全部数据还在网易的存储系统上有一个更全面的备份,目前已经有20T的数据。在大公司内做产品就是有这种好处,轻松的解决了最困难的问题,实在令人羡慕。

总体上看,这个结构很规矩,没什么奇怪的地方,大量采用了现有的开源产品和方法。很务实。成熟的开源产品确实让开发工作变的简化了很多。

时间关系,还有很多细节没有说清楚。比如Service接口怎么定义,如何标准化,公司内部怎么来管理这些接口和文档,每天大量的文章如何抓取回来,如何管理等等。将来有机会再学习吧。

下面是现场的Keynote:。除了上面说的技术方面,在产品方面还有很多值得看看的。尤其是"12个有趣的发现",这些发现是来源于有道阅读的数据统计的。做产品的同学们可以注意看看。

ppt在此

about me:
me.jpg
CC License. Some rights reserved.
署名·非商业用途·保持一致
本站之所有未作特别说明的内容均使用 创作共用协议.
POWERED_BY_MT_3.2