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
######################################
# 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))
#结束
- 原作者是Gorge Foot,写这个Makefile的时候还是一个学生
- ":="赋值,和"="不同的是,":="在赋值的同时,会将赋值语句中所有的变量就地展开,也就是说,A:=$(B)后,B的值的改变不再影响A
- 隐含规则。GUN Make在不特别指定的情况下会使用诸如以下编译命令:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@,这也是为什么这个Makefile最后一个命令没有添加$(CPPFLAGS)的原因,因为缺省是包含这个变量的
- 函数和变量很相似:"$ (函数名,空格,一列由逗号分隔的参数)"
- SOURCES = $(wildcard *.cpp) 列出工作目录下文件名满足"*.cpp"条件的文件,以空格分隔,并将列表赋给SOURCE变量
- patsubst函数:3个参数。功能是将第三个参数中的每一项(由空格分隔)符合第一个参数描述的部分替换成第二个参数制定的值
- addprefix函数:2个参数。将源串(第2个参数,由空格分隔)中的每一项添加前缀(第1个参数)
- filter-out函数:2个参数。从第二串中过滤掉包含在第一个串中的项
- $(CC) -MM -MMD $(SOURCE) : 对每个源文件生成依赖(dependence,Make通过依赖规则来判断是否需要重新编译某个文件),"D"生成".d"文件,-MM表示去掉 depends里面的系统的头文件(使用<>包含的头文件)(若使用-M则全部包含,事实上,系统头文件被修改的可能性极小,不需要执行依赖 检查)
- .PHONY,不检查后面制定各项是否存在同名文件
- ifneg...else...endif,Makefile中的条件语句
- -include $(DEPS) : 将DEPS中的文件包含进来,"-"表示忽略文件不存在的错误
- @$(RM) *.o : 开头的"@"表示在Make的时候,不显示这条命令(GNU Make缺省是显示的)
- all : 作为第一个出现的目标项目,Make会将它作为主要和缺省项目("make"就表示"make all")
- deps : 只生成依赖文件(.d文件)
- objs : 为每一个源码程序生成或更新 '.d' 文件和'.o'文件
- clean : 删除所有'.d','.o'和可执行文件
- rebuild : clean然后重建
- 内部变量$@, $< $^ : 分别表示目标名(:前面的部分,比如all),依靠列表(:后面的部分)中的第一个依靠文件,所有依靠文件
11 五月, 2005
RSS的15个用途
原文: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包裹
4. 获取Ebay交易提醒
RSSauction.com
允许你根据产品类型,描述或者价格范围等条件定制Ebay RSS
5. 股票信息
太多了,Tim Bray
made a customisable feed算一个,Yahoo也正在推它的股票RSS服务。
6. 天气预报
Weather
Underground 预报世界每一个城镇的天气情况,同时输出对应的RSS(RSSweather.com)
7. Internet上都有哪些人在谈论你、你的公司或者你的产品
象technorati.com
和 pubsub.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.com 和 Bloglines.com。而Comicalert.com 维护一个庞大的动漫RSS列表。
12.其他人在网上都在看些什么
不是指spyware[和修改注册表弹出广告窗口一样臭名昭著的间谍软件,常以免费软件为幌子,在你不知情的时候,将你的操作行为或者个人信息发布出去]。这里说的是类似del.icio.us, feedmarker.com,
furl.net 和 wists.com
这些在线收藏夹。[象del.icio.us/popular,提供RSS,你可以大概了解其他人这些天最关注哪些话题]
13.自动备份你的网志
大部分网志服务商还没有提供个人网志导出功能,备份就成为一个问题。如果你使用桌面RSS阅读器,本地会有一份你阅读过的网志的备份。你还可以选择在线阅读器,譬如Bloglines.com的服务,会将你所有的网志保存到它的服务器上,虽然还是没法导出,至少你知道他们在那儿。
14.获取软件更新
[又是更新,都一样,不赘述了] Download.com
和 versiontracker.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测试
- DTD(Data Type Definition) 定义xml元素的合法性。Schema,功能类似DTD
- XML DOM对象,ActiveXObject("Microsoft.XMLDOM")
- XML文件第一行,XML声明,描述xml的版本和编码方式 <?xml version="1.0" encoding="UTF-8"?>
- 标记必须成对。形如
xxx 。但是允许单个的空(EMPTY)元素: <abc xxx />;不允许相互嵌套;大小写敏感;有且只有一个根元素;注释(同html);属性必须加引号;回车(LF = #xA) - XSL (可扩展的样式单语言,the eXtensible Stylesheet Language)比CSS样式单功能要强大的多。XSL的一个主要的用途就是将XML文档转换成HTML格式的文件,然后再交付给浏览器,由浏览器显示转换的结果。一般是第二行(XML声明之后,根元素之前) <?xml-stylesheet type="text/xsl" href="xxxx.xsl"?>
如果使用css: <?xml-stylesheet type="text/css" href="xxxx.css"?> - XML数据嵌入html页面,dso,xml标签,table, 使用html页直接显示RSS,[例如](使用IE6打开,不是标准)
- xmlns : XML Name Space, URI, URL, URN
文本内容中的<,>,&,'," 5个符号需要被替换成&xxxx; - CDATA内部文本不被解析。一个 CDATA 部件以""标记结束,文本中不允许再次出现""
- 不支持从当前的编码格式转换成另一种编码格式(Switch from current encoding to specified encoding not supported)
用xml实现CSS中behavior。MS特有,不是W3C标准- 参考
HTML引用RSS测试 (使用IE6打开,Firefox不支持)
http://www.w3schools.com/xml/
http://www.w3c.org/xml
可扩展标记语言(XML)1.0(第二版)
小奀的XML CHM



