使用ekhtml简介 

ekhtml是一个非常简单的html解析库,不但可以解析html而且对于xml也有一定的解析效果。鉴于没有前国内还没有这个简单的库的教程,所以我把学习体会写在下面,供新人参考。

1.安装
1.1 下载
安装ekhtml除了在官方网站下载之外,你还可以在cvs上面下载。在你的Unix/Linux主机上面安装cvs之后执行下面的命令:

cd ~
cvs -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml login
cvs -z3 -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml co -P ekhtml

1.2 编译
1.进入ekhtml的目录
2.执行 ./autogen.sh
3.执行 make
4.用root身份执行 make install

这样就完成了安装。
2.ekhtml使用
2.1 数据
1.struct ekhtml_string_t
这是ekhtml的字符串,这个字符串没有'\0'字符作为结尾。但是它包含两个成员: *char str ,和一个 int len。
1.struct ekhtml_attr_t
对象属性,其实可以用对象属性作为一个列表。
对象属性里面有四个字段:name,val 是ekhtml_string_t类型的。isBoolean是个unsigned int类型。最后一个字段指向下一个属性。

2.2 一些Typedefs
typedef ekhtml_string_t ekhtml_string_t;
typedef ekhtml_attr_t ekhtml_attr_t; //这两个类型上面已经说过了
typedef ekhtml_parser_t ekhtml_parser_t;
//parser_t的对象保存了一些状态信息,比如读到了一个标签,要调用什么函数来进行处理。多少数据开始处理等等。

2.3 回调函数
typedef void(* ekhtml_data_cb_t )(void *cbdata, ekhtml_string_t *data);
typedef void(* ekhtml_starttag_cb_t )(void *cbdata, ekhtml_string_t *tag, ekhtml_attr_t *attrs);
typedef void(* ekhtml_endtag_cb_t )(void *cbdata, ekhtml_string_t *tag);

上面这几个函数,我放到一起说明。如果我们要处理一个页面,那么这个页面也许会是这样:

<html>
<head>
<title>测试页面</title>
</head>
<body>
页面信息!
</body>
</html>


被"<>"包围的内容是 ekhtml_starttag_cb_t 所要处理的内容。我们可以定义一个函数:

static void handle_starttag(void *cbdata, ekhtml_string_t *tag,
ekhtml_attr_t *attrs);

第一个参数是你处理出来的数据,也就说是个返回结果。
第二个参数是个字符串,也可以是NULL。是字符串说明你要解析的标签名,NULL会处理所有你没有指定标签名的标签。
第三个参数,负责返回标签属性。

在</ >中间的内容是标签结束 ekhtml_endtag_cb_t 会处理它们。 参数和第一个比只是少了最后标签属性。

比如“测试页面”,“页面信息!”这样的字是标签数据。你自己定义的ekhtml_data_cb_t会处理这些东西。

我们可以定义一些类似这样的函数来处理我们的页面。那么如何把这些回调函数关联到我们的解析里面呢?

2.4 如何解析
首先要 ekhtml_parser_new 新建一个parser对象,然后执行下面的代码:

ekhtml_parser_datacb_set();
ekhtml_parser_commentcb_set();
ekhtml_parser_startcb_add();
ekhtml_parser_endcb_add();
ekhtml_parser_cbdata_set();

第一个函数和第二个函数处理数据和注释。这些函数的作用是把你定义的回调函数绑定到你指定的ekhtml_parser_t 类型的对象上面。

当你完成了绑定,你就可以去处理网页了。比较简单的处理方式是:

while()
{
fread(...); //读你的文件 标准函数没啥说的了。
//在这里运行
ekhtml_parser_feed(); //这里就是解析 这里是解析传进来的部分,和下面一句配合。通过fread可以把数据组合在一起
ekhtml_parser_flush(); //刷新缓冲 第一个参数是 parser 第二个参数如果是true 就强制刷新
}


这最后我们强制刷flush一下后就ekhtml_parser_delete

这就是整个解析过程。

3 参考资料
http://ekhtml.sourceforge.net/docs/index.html
http://ekhtml.cvs.sourceforge.net/ekhtm ... iew=markup

[ ] [ 0 ]
[转帖][整理] 用VC6进行UNICODE编程 


最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。

1. 添加 UNICODE 和 _UNICODE 预处理定义

位置:Project Settings -> C/C++ -> Preprocessor definitions

添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)

2. 使用宽字符相关类型,如:

char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR

3. 对字符串常量使用 _T() 宏

4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等

类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等

5. 将 Project Settings -> Link -> Output -> Entry Point 设为 wWinMainCRTSTartup

否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本

可在StdAfx.h中:

#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等

7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:

CString s = _T("ABC");
ASSERT(s[0] == 'A');

8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte
[ ] [ 0 ]
[LUPA学习向导]如何成为Linux平台C语言程序员 

[LUPA学习向导]如何成为Linux平台C语言程序员

目标:
成为合格的Linux平台C语言程序员
技能:
掌握C语言基本语法,掌握Linux平台系统调用,熟悉Linux平台开发流程,掌握anjuta以及glade使用方法,了解kernel结构编写高质量程序。

步骤:
1、学习C语言语法
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... m_lang.zip

2、学习linux平台系统调用
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... efault.htm

3、提高C编程技能
预计时间:30天
参考书籍
http://man.lupaworld.com/content/develo ... m_idea.zip
http://man.lupaworld.com/content/develo ... answer.zip

4、学习开发流程
预计时间:30天
参考书籍
http://man.lupaworld.com/content/manage ... nuxdev.htm

5、学习图形界面编程初步
预计时间:30天
参考书籍
http://www.scivoid.net/doc/gtk/glade/

6、了解linux,了解kernel
预计时间:50天
参考书籍
http://man.lupaworld.com/content/develop/joyfire/

更多电子书请查看 http://man.lupaworld.com/

参与讨论交流请进入 http://www.lupaworld.com/bbs/forum-242-1.html
[ ] [ 0 ]
什么让我爱上Linux? 

什么让我爱上Linux?

前言:谨以此文献给大过年跟家人奋战五十K的我最亲爱的另一半谢谢她对我时间上的支持。

接触Linux是个很奇特的情缘,可能因为物以类聚,可能因为缘份。Linux就那样的出现在我的视野中,走进我的生活中,让我疯狂!

我喜欢简单,崇尚自然,保持简单低调是我做人的准则。对我来说一杯清茶可能就是我想要的。而Linux正是这一杯清茶,或者如果我喜欢咖啡的话,那就是我的上等咖啡。真正简单的东西,其实不会简简单单。它会蕴含某种不能从直观来感受的东西,需要慢慢去品味这种美好。

我只在自己的笔记本上装了一套很简单的ArchLinux。我的笔记本有1GMhz 的CPU,256M内存,8M的集成显示卡。对一些人来说,这种配置可以说是很老的配置了,对我来说,这足够了。我喜欢使用的功能不多,平时边听音乐边学习写程序,看电影,上网,聊天,BT下载等等……网虫的一天,也许就可以这么开始上路了。

也许有人会问我这样一个问题,我们有Windows,我们不需要Linux什么事儿都是那么麻烦。我在这里用个不太恰当的比喻吧,有了速溶咖啡,我们还需要喝现煮的咖啡么?我们有很多方便面,我们为什么还要自己煮饭给自己的家人呢?这就是我想说的,因为我知道我最想要什么。一个理智的人到什么时候都会知道自己最想要的是什么不对么?我们不为追求新技术而追求新技术,而是因为这些技术能给我们生活带来好多变化。Linux和开源社区的技术来自于需要,而不是对市场需要的猜测。

Linux发行版是个整体
我们说Linux总是说起Redhat,Ubuntu,Debian等等……,其实Linux是说的Linux内核部分。如果把Redhat比作一辆汽车,那么Linux就是这辆汽车的发动机。它赋予Redhat以动力。当然一台发动机你是开不走的。好像Redhat,Ubuntu,Debian这样的东西,我们把这称作Linux发行版。他们来自不同的社区(也就是发行机构)。这些社区为Linux装上各种软件,比如:GUI操作界面,版本管理器,软件开发工具,办公软件,浏览器等等……而这些软件大多来自于社区。这样汽车就有了轮子,有了方向盘,仪表盘,座椅,甚至CD播放机。

Linux是非常灵活的系统
这也是我最喜欢Linux的地方,就是我可以为我的机器的操作系统选择各种与众不同的零配件。我刚才说了,我的本子配置相当于7年前的主流配置,所以我可以选择轻量级的软件来让我计算机更加顺畅的运行我希望它完成的任务。因为发行版的社区,通常为我们提供了数量多达几万种的软件和工具可供选择。我们不需要在互联网上四处寻找这些软件。我们通常有个叫做软件包管理器“小软件”(其实是个系统,我怕说系统大家会觉得很庞大)。这个小精灵一样的东西会让我们告别从上网站下载软件历史。我们只需要知道自己想要什么软件名字,这个小东西就会告诉我们,软件仓库里面有没有我们需要的东西。如果没有,那很不幸,你还是要去网站下载然后安装。但你至少大多数时候可以不用这样做。我们都经历过装系统之后到处找驱动的窘境,而软件包管理器可以帮你免除这些麻烦,简单一个命令,你就可以下载同时安装好你要的软件。

强大的文档支持
我们很多时候不知道一些软件如何使用,其实学习这些使用的方法有很多种:
1)Linux里面自带有一个man 命令,可以通过这个命令来查看软件附带的文档。虽然大多都是英文的,但总比没有的好。
2)可以通过论坛提问方式来找到问题解决方法。
3)Google是你最好的老师。
4)我们还可以在书店找到很多书籍。
5)如果你喜欢花钱来学,直接找个学习班吧。

自由和社区
Linux中的大多数软件,都是自由软件(FreeSoft不是免费软件)。自由软件有自己独特的开发流程,它来自于社区,是一种松散的开发方式。社区由若干小组构成,不同的小组负责软件的不同部分。这些人很多都没有报酬的做这些软件,并且按照自由软件的协议,共享自己的代码,让以后更多人能够阅读理解这些代码。从而对代码做出改进。就这样Linux诞生了,发行版诞生了,世界上有了自由软件。因为自由,所以我对这些软件的生产和加工很放心,我可以自己修改软件的任何部分(如果我能达到那种高度,我会的!)。

系统安全
Linux中带有很强大的防火墙,当然也有杀毒软件。其实非常的安全,它的用户管理,磁盘分配,包括文件管理,网络传输都更加严密,让我们很少能中一些乱七八糟的东西。所以我暂时没必要安装专门的防火墙和杀毒软件。系统发现漏洞更新也非常迅速。

这只是Linux无数特点的一个子集,这些特点满足我再合适不过了。我在Linux上面工作,学习,娱乐。用我自己独一无二的系统。跟我的思想合而为一!

谢谢大家对我文章的支持!
[ ] [ 0 ]
xinetd方式vsftpd简单配置 

vsftp简单配置

这篇文章适合时不常用ftp来共享文件的linuxer,本文希望能对使用xinetd方式架设vsftp的朋友给以提示.

vsftp简介
vsftp是一款非常小巧的ftp服务器软件,作为一款ftp软件,它可以提供浏览,上传,下载等基本的服务.同时还可以限制客户端最大线程和最大ftp速度.可以匿名登录.因为他结构和配置都很简单vsftp除了适合专业ftp服务器之外还同样非常适合家庭用户.

工作方式
vsftp有两种工作方式.
1.实时在线模式:
这种方式适合专门的ftp模式.vsftp实时相应用户连接.
2.xinetd方式:
这种方式是当客户端请求登录vsftp时才调用vsftp进行服务.这种方式比较灵活也就是我下面所讲的方式.

安装配置
网络上介绍vsftp的安装的文章有很多,你所用的linux发行版本也有相应的编译好的安装包,您可以参考发行版文档来安装vsftp
如我使用archlinux作为我的系统:

pacman -Sy xinetd vsftpd

这里我首先安装了xinetd这个服务

然后我们就可以配置xinetd服务:
建立/etc/xinetd.d/vsftpd文件(如果有就直接编辑)

service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_success += HOST DURATION
log_on_failure += HOST
disable = no
}

最后的disable表示这个端口是否启用.当然如果不知道这些参数的作用可以参考xinetd的man页或者其他相关文章.

配置/etc/vsftpd.conf文件.
网络上很多中文参考文章,请自己google这里不做详解.

最后配置 /etc/hosts.allow 这一步很关键!不然端口打开了也不能连接服务器.

vsftpd:192.168.1.

这个意思就是vsftpd 接受192.168.1.xx下面ip地址来的链接
当然vsftpd还需要建立一个ftp默认的root路径.并且建立ftp用户.
如何配置vsftpd可以参考:
http://www.linuxsir.org/main/?q=node/152
[ ] [ 0 ]

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | > >>