27 五月, 2005

libxml2: how to bypass the UTF-8 checking of the parser when you use xmlReader

libxml2库功能很强大,除了早先的SAX和DOM解析方式外,在2.5.0版本以后,推出XmlTextReader接口,即保留了DOM的简便易用,又结合SAX的灵活高效,所以这次解析RSS,我选择的就是Reader方式。

实际使用中,碰到一个问题,libxml2内部的UTF-8合法性检察过于严格,只要碰到有不符合UTF-8编码的任何字符,它就会报错(Input is not proper UTF-8, indicate encoding !)并中止当前解析。当然,这种错误是由xml文档自身引起的,即便你使用传统的DOM或者SAX,都不能避免。

但是,rss文件中,这种小的编码错误还是比较常见的,象utblog的atom 0.3中有一项summary,截取文章的前200个字符,因为截取程序不判断文章编码,所以会出现半个UTF-8码的情形,这时候,libxml2解析程序就会执行失败。

那么,该如何跳过libxml2内部的UTF-8 checking呢?一个办法是直接修改libxml2源码,并重新编译。但是使用这个库的应用很多,仅仅为了这一个需求,就作这样的内部改动,扩展性和可用性都不强。仔细看了internalparser.c中相应的代码,在检查之前,程序会判断ctxt->charset == XML_CHAR_ENCODING_UTF8,如果有办法使得parser context(ctxt)的charset不等于XML_CHAR_ENCODING_UTF8,岂不是就可以了?

但是Reader接口没有公开_xmlTextReader结构的细节,所以为了能够得到ctxt,首先必须自己创建一个完全相同的structure。这个不难,直接从xmlreader.c中copy就是了,这样就取得了Reader的内部结构。

接下来,就是修改reader->ctxt->charset,我设置的值是ctxt->charset=XML_CHAR_ENCODING_ASCII + 99; 注意,这里不能设置为XML_CHAR_ENCODING_NONE,否则parser还是会重新设置此值。

测试下来,成功,原先解析失败的atom文档,现在可以顺利地被解析了。

不清楚bypass this internal UTF-8 checking可能会带来什么样的影响,只能到时候再说了。


14 五月, 2005

会编程是有好处的

这个大概就像那个笑话说的,老鼠学狗叫,吓跑了猫,说明会一门外语是有用场的。如果只是从实用的角度讲,确实如此。在这个越来越依赖于电脑,越来越依赖各种各样的软件、服务的internet时代,会编程有时候能派上大用场。象echo同学了解了一些html tag的知识,就比其它同学更得心应手地编排blog的格式,增加一些有趣的功能,譬如插图,背景音乐等。肉骨头同学学习了php,html和javascript,现在正忙着设计web版的Rally 1000游戏,这个游戏在palm上很流行,她和echo都很喜欢玩,我那个古董palm中间出牌的地方都快被她们杵破了。


昨天半夜搞统计,整理出有100类数据,每类数据有近两个月的数据,现在需要搞清出他们那些是逐步增长的,那些是停滞不前的,哪些却是后退的。先是在exel里做了图表,画出趋势线,可以看到增长趋势了。但是分别对100类做图表,工作量实在太大,而且进行这样没有价值的重复劳动会让人非常郁闷,后果非常严重。并且,即使居然做出来了,100条趋势线的判断还是很复杂。所以就先在纸上推导散列点到趋势线的方程式,然后编了一个小程序计算出结果,无非就是方差最小,二次方程求解的问题。但是因为对笔和纸如此不熟悉,也破费了些周折(昨天拿起笔,连“柬埔寨”三个字都写不全,中文,真的快被遗忘了)。虽然搞的很晚,但是看到100个结果瞬间出现在面前,那感觉还是蛮爽的。


关于编程,关于程序员,尤其是中国的程序员,真的有很多感慨。不过现在时间不多,还是少发感慨,少发议论,多干实事。转发C++语言大师(Stan Lippman)对中国程序员的忠告一文,表示一下意思吧(扩展内容)

 查看全文

12 五月, 2005

通用Makefile及部分解释

######################################
# Copyright (c) 1997 George Foot (george.foot@merton.ox.ac.uk)
# All rights reserved.
######################################
#目标(可执行文档)名称,库(譬如stdcx,iostr,mysql等),头文件路径
DESTINATION := test
LIBS :=
INCLUDES := .


RM := rm -f
#C,CC或CPP文件的后缀
PS=cpp
# GNU Make的隐含变量定义
CC=g++
CPPFLAGS = -g -Wall -O3 -march=i486
CPPFLAGS += $(addprefix -I,$(INCLUDES))
CPPFLAGS += -MMD

#以下部分无需修改
SOURCE := $(wildcard *.$(PS))
OBJS := $(patsubst %.$(PS),%.o,$(SOURCE))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.$(PS),$(MISSING_DEPS)))

.PHONY : all deps objs clean rebuild

all : $(DESTINATION)

deps : $(DEPS)
        $(CC) -MM -MMD $(SOURCE)


objs : $(OBJS)

clean :
        @$(RM) *.o
        @$(RM) *.d
        @$(RM) $(DESTINATION)

rebuild: clean all

ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
        @$(RM) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(DESTINATION) : $(OBJS)
        $(CC) -o $(DESTINATION) $(OBJS) $(addprefix -l,$(LIBS))
#结束


11 五月, 2005

RSS的15个用途

http://del.icio.us/popular

原文:http://timyang.com/comments.php?id=630_0_1_0_C

[观点不新颖,不过提到了很多RSS服务供应商,有参考价值]

实际上,你可以使用RSS自动并重复地做任何需要搜索或者从服务器上获取信息的事情。这里列出我比较喜欢的15个用途,是希望能有更多的人来使用RSS阅读器,同时想表明,RSS不仅仅是网志联合(weblog syndication)和新闻聚合(news aggregation)

更新:[此处作者推广它的产品ScrappyGoo, 一个根据你的输入搜索Google新闻并输出为RSS的在线工具。如果你有兴趣,可以一试。我以前做IM的时候,有一个功能,是根据某些规则解析目标网 页,将感兴趣的内容提取出来,譬如sina的滚动新闻,某些BBS论坛的最新贴等。如果将结果输出成为RSS,相信对那些网站的用户会很有吸引力。其实,已经有人做了,原文回复中提到Wotzwot,就是提供这样一种服务的网站][“[]”内是我加的内容]

1. 从多个新闻源订阅新闻

各大传媒都陆续在输出RSS,你使用RSS阅读器可以很方便地阅读这些新闻。需要指出的是新兴的RSSmix.com,它允许你组合多个RSS发布的内容成为一个RSS。

2. 阅读email

Gmail用户可以享受Google公司提供的这项服务,用RSS阅读器就可以查看新邮件了。mailbucket.org提供email到RSS的服务,工作方式是首先你需要注册一个mailbucket的邮箱,然后将其他帐户的邮件自动转发(auto forward功能,绝大多数邮件服务都提供这项功能)到这个信箱,mailbucket会为你输出RSS。特别的,Mailinator.com用户可以使用由dodgeit.com提供的类似功能。

3. 跟踪Fedex包裹

Ben Hammersley says

4. 获取Ebay交易提醒

RSSauction.com 允许你根据产品类型,描述或者价格范围等条件定制Ebay RSS

5. 股票信息

太多了,Tim Bray made a customisable feed算一个,Yahoo也正在推它的股票RSS服务。

6. 天气预报

Weather Underground 预报世界每一个城镇的天气情况,同时输出对应的RSS(RSSweather.com)

7. Internet上都有哪些人在谈论你、你的公司或者你的产品

technorati.compubsub.com 提供被称为“持久搜索递送”(persistent search delivery)的服务。你输入你的姓名、你的公司或者产品的名称等搜索条件,“持久搜索递送”功能可以将最新结果以RSS方式返回。这两个服务搜索的区域是网志(blogs),如果你想在更大范围内获取结果,可以使用Googlealert.com,Google公司提供的搜索通知服务。[我订阅了有关“CB’s Blog”的Google Alert,现在,什么时候,那些文章被人搜索,一目了然]

8. 获取音乐、电台和视频

podcasts (podcastalley.com)正热闹着。另外,象Comedy Central's Daily Show等广播电视公司正逐步认识到RSS方式是一种推广和发布他们的节目的有效途径。Mcfeedia.com 还同时向那些视频博客们提供向RSS上贴标签的服务(tag)

9. 获取某人最新的日程安排

RSScalendar.com 提供在线的日程表服务,并提供RSS供订阅。这就是说,你可以通过订阅某个RSS,来掌握那位同志的最新动向。[是不是有偷窥嫌疑?话说回来,隐私这个东西,保护也热,暴露也热,动不动就被拿来说事,快和垃圾邮件一样了]

10.影院播映日程

大影院网络还没动作,仍旧使用email提醒服务,倒是一个本地的小院线City Cinema走在了前头。不过,使用前面提到的email到RSS的服务(mailbucket.org),将那些电影日程安排提醒邮件聚合成RSS,也不失为一种好方法。[国内电影少,几部大片,这个放了,那个放,价格还贵,属于奢侈娱乐,我看没必要预定了]

11.预定动漫

[这个我不太感兴趣,就放几个链接在这儿吧] Dilbert一个动漫作者的网站,提供RSS[很有名?网站打不开。今天gmail和google很多服务都打不开,不知道是不是和Google的Web Accelerator有关],更好的搜索动漫的途径是通过 Feedster.comBloglines.com。而Comicalert.com 维护一个庞大的动漫RSS列表。

12.其他人在网上都在看些什么

不是指spyware[和修改注册表弹出广告窗口一样臭名昭著的间谍软件,常以免费软件为幌子,在你不知情的时候,将你的操作行为或者个人信息发布出去]。这里说的是类似del.icio.us, feedmarker.com, furl.netwists.com 这些在线收藏夹。[象del.icio.us/popular,提供RSS,你可以大概了解其他人这些天最关注哪些话题]

13.自动备份你的网志

大部分网志服务商还没有提供个人网志导出功能,备份就成为一个问题。如果你使用桌面RSS阅读器,本地会有一份你阅读过的网志的备份。你还可以选择在线阅读器,譬如Bloglines.com的服务,会将你所有的网志保存到它的服务器上,虽然还是没法导出,至少你知道他们在那儿。

14.获取软件更新

[又是更新,都一样,不赘述了] Download.comversiontracker.com

15.获取最新的BT(bittorrent)文件和ahem, p*rn

[ahem, p*rn没接触过] 是否合法暂放一边,有用就行。Torrentspy.com 第一个提供RSS,藉此,你可以获知最新上传文件的列表。[p*rn, CMSes]

[其实,RSS本身只是一项技术,重要的是RSS包含的内容。这里提到的RSS的不同用途,就是RSS包含的不同内容。象原文回复中提到的“交通状况”、“匪警火警”、“病毒和恶作剧”等等,实际上是这些内容的RSS表示]

[国内讨论RSS的摘要:http://www.donews.net/sayonly/archive/2005/05/03/361752.aspx]


2 五月, 2005

XML学习及HTML引用RSS测试

HTML引用RSS测试 (使用IE6打开,Firefox不支持)
http://www.w3schools.com/xml/
http://www.w3c.org/xml
扩展标记语言XML1.0第二
小奀的XML CHM