Loading...

有多少人在收听你的广播

Filed under: 编程, 网络 — 深柳堂主 @ 2008-10-21 00:19:11 Comments

MS之前已经引用过一次了,我再不厌其烦地引用一次——

“譬如咱们这次同船的许多人,没有一个认识的。不知道他们的来头,为什么不先不后也乘这条船,以为这次和他们聚在一起是出于偶然。假使咱们熟悉了他们的情形和目的,就知道他们乘这只船并非偶然,和咱们一样有非乘不可的理由。这好像 开无线电。你把针在面上转一圈,听见东一个电台半句京戏,西一个电台半句报告,忽然又是半句外国歌啦,半句昆曲啦,鸡零狗碎,凑在一起,莫名其妙。可是每 一个破碎的片段,在它本电台广播的节目里,有上文下文并非胡闹。你只要认定一个电台听下去,就了解它的意义。我们彼此往来也如此,相知不深的陌生人——”柔嘉打个面积一寸见方的大呵欠。像一切人,鸿渐恨旁人听自己 ” 说话的时候打呵欠,一年来在课堂上变相催眠的经验更增加了他的恨,他立刻闭嘴。柔嘉道歉道:“我累了,你讲下去呢。”鸿渐道:“累了快去睡,我不讲了。”柔嘉怨道:“好好的讲咱们两个人的事,为什么要扯到全船的人,整个人类?”鸿渐恨恨道:“跟你们女人讲话只有讲你们自己,此外什么都不懂!你先去睡罢,我还要坐一会呢。”柔嘉佯佯不睬地走了。鸿渐抽了一支烟,气平下来,开始自觉可笑。

其实大家不论是在twitter,饭否,还是做啥,都像方鸿渐说的那样,都只是一句句支离破碎的电台广播而已。在频繁换台的陌生人耳朵里,随意泛听时,或许会有只言片语引起注意;只有认定你的频道收听下去,才能连贯地读懂你的心脉,理解你的悲欢。今天我的话题就是,在blog上显示你的饭否或“做啥”听众数量。

这本不是我的创意。是前天我无谓中浏览一位饭友的博客时,发现了http://twittercounter.com/提供了这样的服务,能将你在twitter中的followers的数量以图像形式显示出来,例如本人的图片是TwitterCounter for @zhasm。可是我最常用的饭否却没有类似网站提供类似服务。我思考了一下,觉得不太难,自己也可以实现。

实现思路:

  1. 通过现有的饭否API http://api.fanfou.com/users/show.xml?id=zhasm 来获得当前饭否用户的信息,其中的ID就是所要统计的用户的ID,听众数量在followers_count节点中。其结构是:<followers_count>(\d+)</followers_count>。
  2. 使用网页语言(我用的是PHP)来获得该数值,并将其转换成图片。基本要求是即时更新,即,不是只生成当前听众数量统计,当数量有变动时,还能随时更新。
  3. 提供在线的图片输出服务。

由于饭否的API比较完备,第一步没问题;第二步我没有使用php的xml解析函数,而是使用了比较顺手的正则表达式来获取该数值;生成图片的模板,我参考了feedsky的。其三维效果是通过明暗的线条来实现的。为省事,将中文改为英文了。至于在线的图片输出,我慷慨地使用了自己博客所在的cph空间,将网页放在http://zhasm.com/fanfou/里面。效果如图:

饭否听众统计图片使用方法很简单,因为功能也很简单:)。具体如下:

  1. 取得你的饭否ID。如果你的饭否链接是http://fanfou.com/regex,而你的饭否用户名是正泽,则你的ID是regex,而不是正泽。值得一提的是,我写的听众统计功能,暂时还不支持中文ID。
  2. 取得图片。图片位置在
    http://zhasm.com/fanfou?id=regex


    http://iregex.org/fanfou?id=regex
    推荐国内的用户使用前者(zhasm对应cph主机),国外的用户使用后者(iregex.org对应dreamhost主机)。
  3. 您可以在blog中这样调用(请酌情将YourfanfouID换成相应值):
    <a href="http://fanfou.com/YourfanfouID" title="个性提示语,例如hello world,当鼠标移动到链接上时显示的文字" target="_blank">
    <img src="http://zhasm.com/fanfou?id=YourfanfouID" />
    </a>

实现此功能后,我将此消息群发到fanfou、twitter、jiwaide、zuosa、plurk上。zuosa的老大alex发现了我的消息,委托我为zuosa也写一个。

我阅读了zuosa的api文档,发现对应的函数并没有提供followers_count功能;与alex沟通,zuosa两天后就在http://api.zuosa.com/users/show.xml加上了本功能。而我原有的php脚本也无需改动太多,只需要修改两行就能服务于zuosa,一条是api接口,另一条是正则式解析的位置。根据alex要求,将followers修改为粉丝;同时去掉了原来数值的前导0。现在效果如下:

类似,做啥听众统计图片使用方法如下:

  1. 取得你的做啥ID。如果你的做啥链接是http://zuosa.com/rexxer,而你的饭否用户名是zhasm,则你的ID是rexxer,而不是zhasm。值得一提的是,我写的听众统计功能,暂时还不支持中文ID。
  2. 取得图片。图片位置在
    http://zhasm.com/
    zuosa?id=rexxer

    http://iregex.org/zuosa?id=rexxer
    推荐国内的用户使用前者(zhasm对应cph主机),国外的用户使用后者(iregex.org对应dreamhost主机)。
  3. 您可以在blog中这样调用(请酌情将YourZuosaID换成相应值):
    <a href="http://zuosa.com/YourZuosaID" title="个性提示语,例如hello world,当鼠标移动到链接上时显示的文字" target="_blank">
    <img src="http://zhasm.com/zuosa.com?id=YourZuosaID" />
    </a>

目前的不足之处是,不支持中文ID;没有提供更详细的定制功能。还有什么不足之处呢,请留言告之。

2008.10.23更新:
应alex要求,新增一种风格,如图所示:,使用方法不变,图片路径改为http://zhasm.com/zuosa/2?id=YOUR_ZUOSA_ID。

2008.10.27更新:
将alex要求的方式做为默认,格式如,使用方法不变,图片路径改为http://zhasm.com/zuosa?id=YOUR_ZUOSA_ID。

正则表达数与合数判定

Filed under: 编程 — 深柳堂主 @ 2008-04-01 10:00:40 Comments

quhao那里,了解到这样一篇文章:牛B的正则表达式:素数判定与线性方程求解

今天又学到一个牛B东西。你相信吗?正则表达式竟然可以用来判定素数,甚至可以用来解方程!下面这段正则表达式可以用来判断,一个字符串的长度是否为合数(假设这个字符串里全是字符’1′):
^1?$|^(11+?)\1+$

初看上去,这条正则式怪怪的。不过,略为分析一下,它就原形毕露。

中间的备选符竖线把正则式分数两部分,^1?$和^(11+?)\1+$。

先看第1部分。
^1?$匹配的是,行首,1个或者0个’1‘,行尾。
换言之,它匹配的是一个空行或者只含一个’1‘的行。

再看第二部分。
先说一下正则式的基本规则。

  • +:量词,表示前面一个单位的一次或多次重复。
  • ?:量词,表示前面一个单位的出现0次或1次。
  • +?:连用,表示前面一个单位的一次或多次重复,不过倾向于越少越好。正所谓:懒惰模式。
  • ():捕获。这里面的内容重复出现时,可以使用\1,\2之类的代词来表示。

我们切入正题。
^(11+?)\1+$
,它匹配的是,
行首,紧接着是由’1‘和m个1组成的捕获组(m是大于等于1的自然数),紧接着是N个这样的捕获组(n是大于等于1的自然数,n与m不必相等)。

11+?和\1+是理解这条正则表达式的关键。
我们再细分一下。

  • 1,匹配1个’1‘,仅此而已;
  • 1+?不能再分,它匹配的是1次或更多次的’1‘(为了表示方便,该次数我们用m来表示),?表示懒惰式匹配。因此,11+?可以表示为(1+m)个1
  • \1 表示前面所捕获的括号内的内容。后边又一个+,它匹配的是1次或更多次的’\1‘(为了表示方便,该次数我们用n来表示)。

这样,我们澄清了这条正则式试图表达的意思:
^(11+?)\1+$,它匹配的是由(1+m)(1+n)个1组成的字串。其中m和n都是大于等于1的自然数。n和m可以相等,也可以不相等。

全局来看,^1?$|^(11+?)\1+$匹配的是一个空行,或者一个’1‘,或者(1+m)(1+n)个’1‘。

(1+m)(1+n)的集合是什么样的数呢?连编程都不用,我直接在excel里列了一张表格:

考虑到n和m相等的情况会出现对称。我们只考虑其中一半即可:

即,得到的数列为:

4,6,8,9,10,12,14,15,16,18,20,…

从其产生的规则来说,上面的数全是合数(均由乘积构成);但是,上面这些数列是否就等同于合数集,这就不是我能证明的了,给数学系的同学去证明吧。

值得补充的一点是,上面两个图表只是使用的后半部分的正则式,即只有^(11+?)\1+$不包括^1?$。如果按照原正则式补全,此数列就会变成:

0,1,4,6,8,9,10,12,14,15,16,18,20,…

根据合数的定义,0和1是不包括在内的。不知原作者为什么把0和1也要囊括进来。

虽如此,我十分佩服写出这条正则式的大牛。理解其含义之后,我也会心微笑。同理,我们还可以构造许多类似的正则式,只要满足两个条件,一是你知道有某条简洁的公式;二是你知道如何使用正确的正则语法来表达出来。

PS:

原贴中有一条例子是三元一次方程11x + 2y + 5z = 115

^(.*)\1{10}(.*)\2{1}(.*)\3{4}$

解密:此处的.*共出现3次,互不约束,当然是三元一次

急就章

Filed under: 随笔 — 深柳堂主 @ 2008-02-15 23:02:18 Comments

善始善终,不能始乱终弃……

1. fanfou.com

原来准备写一个fanfou的工具,现已实现了理想中的大部分功能。关于分享、私信的处理,暂时不在我能力范围之内。不过,倒是有很高的兴趣来学习。

现在觉得,使用Php写这样的工具,把这样的工具放在自己的blog空间上,是不太好的选择。这与采集工具一样,会占用太多的资源,尤其是作为网络程序,不好控制。我曾经设想使用推荐制,限时制,乃至会员制,来限制饭友的使用。但是无论哪种方法都大大地与我的初衷背道而驰。网络给予人的是自由,而不是这样或那样的限制。

现在觉得使用本机版程序是比较好的选择。这样一来,占用的是用户的CPU和带宽,不会对某一服务器造成太大冲击--如果有的话,也只能是可怜的fanfou.com了。不过,我对它的潜力抱积极的乐观态度。

还有一种方法,就是伟大的开源方式了。我准备在做出完整的本机版程序之前--这可能需要太长的时间--先把源代码无私地公开出来,事实上我早已经这样做过了。如果您读过批量抓饭脚本:一次性打包输出自己全部的饭否消息!的话,您知道我在说什么。

我计划把与之相关的几个函数写出来,主要是curl:远程文件的抓取,sqlite:数据库的打开,建立,保存,regex:使用正则表达式对文本进行深度解析。附上详尽的解释,尤其是regex部分。

为什么要先写计划,而不是先完成呢?因为本文的主旨是“善始善终,不能始乱终弃”,我写在这里,防止自己食言而肥,因此立此存照。

2. yeeyan.com

最近在yeeyan.com搜索到自己喜欢的一篇文章,正在翻译。已经完成85%+了,剩下的部分是硬骨头了。我的目标是“举重若轻”,争取把长难句也翻译得不显山不露水,风过了无痕。

目的:别把英语扔远了;把学英语跟兴趣爱好联系起来;做出一点点贡献,增加一点点人气和点击量;为自己干瘪的blog增加内容。

善始善终,不能始乱终弃;防止食言而肥,立此存照。

3. iRegEx.org

早就有建立正则表达式网站的雄心,一向摩拳擦掌,苦练内功,http://fanfou.com/regex就是明证之一。经常在chinaunix潜水的我,前两天突然发现,www.regex.net.cn悄然开张了。就差一步呀!我像彪哥对着泰勒的“尸体”那样滴下了发自肺腑、痛心疾首的泪。为了促成跟该网站的良性竞争,防止它垄断坐大,我毅然决然地推出了自己的网站。由于现在刚刚开始布展,一切都还没有做成熟,一向低调的我就不在这里大事张扬了。我先不告诉大家我做的网站叫“爱正则”。等我做好了,再向大家公布!

善始善终,不能始乱终弃;防止食言而肥,立此存照。

uuid in twitter and fanfou

Filed under: 编程 — 深柳堂主 @ 2008-01-30 09:13:54 Comments

简要分析了一下twitter和fanfou消息的uuid格式.对于twitter和fanfou,每一条消息都有一个全局的唯一的”身份证号”–uuid.在可视化的操作中,这是不需要的.而使用api来进行统一操作时,uuid就必不可少.

饭否的uuid格式是[-_a-zA-Z0-9]{11},例如jMzxknImnRs,因此理论上可以标识64^11=73,786,976,294,838,206,464条消息; 而twitter的uuid是\d{9},例如609308932,貌似只能标识10^9条消息,即1,000,000,000.不过, 后者貌似可以增加到\d{10,},即开放式增长.早期的twitter消息的uuid号码长度为8,不过没刻意去寻找更短的.

由此作出”大胆推测”,twitter程序员喜欢使用C语言的数组来存储消息;而fanfou的程序员喜欢使用perl语言的散列来存储消息.姑妄听之,没有作”小心证明”的必要了吧,呵呵.