加菲猫窝

现在专注于streaming server & CDN

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 104, 评论 - 509, 引用 - 61

导航

关于

专业流媒体服务网
网络防盗链

PageRank
添加到百度搜藏 添加到百度搜藏


和博主MSN

标签

每月存档

最新留言

广告

【第1页/共2页,26条】
首页
前页
1

session_onend,你到底什么时候才能激发

转自微软新闻组

? 要说到session这个东西,很多人可能都不屑一顾。这个东东嘛,n年前就开始做了,有
啥好讲的啊。可是,在很多地方我们还是会发现一些问题,比如有的人说,我的
session_start激发了,怎么session_end没有啊,我在session_end做了些善后工作,
这下没法完成了,怎么办啊?

? 最近看了些文章,结合自己的一些经验,想和大家一起讨论一下其中的说法。

? 其实,很多这类的问题都是由一个东西引起的,它就是session ID。首先,是不是我
一个IE client起来,访问一个页面,只要我不关浏览器,session ID就是一样的呢?
很多人会想,应该是一样的吧,我浏览器都没关,web server总归会认为我是同一个
client,不会把session ID变来变去的。要验证这个,让我们现在做一个简单的试验。
用vs.net创建一个简单的asp.net web app.在web form1上加个button,然后在页面的
page prefix上enable trace.接下来浏览这个页面,不停的click button来提交
request。感谢asp.net的这个trace功能,我们可以看到session ID其实是在不停的变
化的。也就是说,这时候在服务器端,根本就不关心这个client的存在,每次都觉得它
是来自一个新的client.

? 那这到底是怎么回事呢?OK,让我们在page_load里面加上一句,
session["variable1"]="testvalue";然后再做一下测试。Bingo,现在session ID就保
持一致了。我想,很多人也许以前就没有注意到这点。这里我们可以得出一个结论:要
建立一个持续的session,咱们需要至少使用一下session变量,用行话来说,就是要至
少往session dictionary中写入一次。

? 不过,值得注意的是,这只是个必要条件,还不是充分条件。

? 在提到下一个必要条件前,我们先来弄清一件事,如果我们在程序中间有
global.asax,里面有session_onstart, session_onend,上面的实验是不会成功的。原
因是一旦定义了session_onstart处理函数后,session的state就总是会被保存了,即使
里面是空的,这样的话,session ID就不会改变了。因为session这东西还是消耗资源
的,所以在asp.net web app中如果没有必要,你就不要把session_onstart,
session_end写在global.asax中。

? 上面的实验中,我们也可以看到,如果session ID在变化,我们就跟踪不到
session_onend,一旦稳定下来,session_onend就出现了。

? 现在,我们再来谈谈另一个条件,还是先从实验做起,我们在刚才例子的基础上(包
括session_onstart, session_onend),在page_load的session那行的下面加上一句,
session.abandon().再来运行一把,咦,这是你会发现一点奇怪的地方,session_onend不
执行了,尽管session_onstart执行过了一遍。(这里我们需要写一些log语句来观察
到)而且,如果我们把session.abandon()写在button.onclick事件里面,
session_onend就立马执行了。奇怪吧,这里有什么区别呢?

? 这样,第二个必要条件就引发了,要让session_onend成功执行,至少要有一个
request已经被完整地执行过。上面的第一种情况,在page_load中就中止的话,第一个
request都没有执行完毕,session_onend就没法激发了。

? 综合这两个必要条件,我们终于可以得出要让session_onend执行的充分条件了:
? 1)至少有一个request成功完整地执行
? 2)至少存储一些data在session state中。可以通过session变量或者加上
session_onstart来实现。

? 最后声明一点,session_onend只在InProc模式中支持,也就是说,只在session
data在asp.net worker process中时支持。


? ps: 打字真是很辛苦,中英文切来切去更是辛苦,不过还是希望大家可以从中受益,
俺也不枉费功夫了。最后,有什么问题的话希望大家多多回帖,一起讨论讨论。笑脸

posted on 2004-03-31 17:26:00 by peon  评论(13) 阅读(7045)

关于过度狂热的linux/unix fans

看到了一篇文章 http://www.blogchina.com/new/display/13665.html

觉得作者可以说是一个极度狂热的unix/linuxer ,当然window也有发晕的Fans,这个暂且不论,因为自己也曾经搞过linux,也有一些难于割舍的感情,对于里面一些过于感情用事的话有些不吐不快。

UNIX 是自晶体管发明以来最伟大的发明,它从诞生那一天开始就比 Windows 的设计出色

假如要探讨Unix和windows的设计,恐怕n本书都不够,但是就这句话,恐怕连最资深的Unix专家也不敢说。Unix诞生于1969年,至80年代中后期,发展20多年,趋于成熟。Unix操作系统是一个分层结构,当时是天才的结构,但是在现在绝对不算绝顶先进的东西,在发展的过程中,内核不断的被加入新的功能,成为一个庞大的怪物,有人比喻它为垃圾倾倒场,分层模型已经显示出它的局限性,在这种情况下,新的设计思想被不断提出,其中最重要的就是微内核(microkernel)。

1990年5月22日,windows诞生,在windows95以前,严格讲windows还是dos的一个shell,到了windows95才可以称作真正的操作系统。但是真正可以作为Unix对手的是NT。在1992年,微软正式立项,成立专门的团队,开发Windows NT。

NT围绕着微内核思想而设计的,它提供线程调度、中断和意外事件管理、多处理器同步和系统恢复(在掉电之后)。必须指出NT的微内核相比Mach有些不一样,有些进程运行于特权态,在Mach中他们运行于用户态,这个主要是为了效率的考虑。

现在看看,Unix自诞生那天结构经历了许多的改进,NT的设计也吸收了众多的先进思想.称Unix从诞生那一天开始就比Windows 的设计出色,是不是太过武断?

连 863 项目都用 VC 写程序了

这句话充满了感情色彩,为什么863项目不可以用VC写?是因为VC不够档次?是因为有那么多的科学家鄙视微软?
我只知道完成一个项目要使用什么技术,不是看这个技术cool不cool,不是看这个技术有多少人鼓掌,而是看这个技术这个工具能不能圆满的完成任务,说"连 863 项目都用 VC 写程序了"这样的话,感觉就像在小孩子赌气,你们用啊!我鄙视你们!我自己就不用!

Linux 机器根本不用整理硬盘,这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系统,它们不但可以对文件设置权限,实施完全的保护,而且可以“越用越整齐”,“越用碎片越少”!

FAT文件系统是dos时代的产物,的确比不上unix的文件系统,但是稍微了解文件系统实现的人,都知道“越用越整齐”,“越用碎片越少”是个不折不扣的鬼话!在不断有文件增加删除的系统中,“越用碎片越少”是不可能的,除非系统定期做整理.

就算有了好的文件空间分配算法,文件不会产生过多的碎片需要以下条件:

1.磁盘有相当的剩余空间

2.频繁增删的文件大小差别不悬殊

高明的 UNIX 程序员不用 IDE,IDE 从来就是给初级 Windows 程序员用的

这人好像和能给人带来方便的工具有仇,有本事你就连make都不用算啦!你可知道borland发明IDE带来的轰动影响么?

 

posted on 2004-03-27 19:32:00 by peon  评论(5) 阅读(1747)

简易的备份方案

昨天买了移动硬盘(40G-900元)来备份文件,我的主板只支持usb1.1,我的文件定期备份成了一件很耗时的事情,想找个办法每次只拷贝更新的内容,到网上找了一下,有一个Second Copy不错,可是要注册的,最后偶然发现xcopy也有这个功能,使用 /d参数就可以只copy日期更新的文件。

以下是我一个备份的批处理文件的内容:

xcopy .  /d/e/v/y  e:\patch2\
pause

表示把当前文件夹下更新过的文件(/d)备份到 e:\patch2 目录,包含空或非空子目录(/s),覆盖文件时不提示(/y),拷贝后校验(/v)。

另外今天询问了卖硬盘的人,他说如今的移动硬盘返修率变高了,有的是盒子,有的是盘体,啊!看来还是要经常刻光盘:(  丢失数据是大事啊!

posted on 2004-03-26 12:43:00 by peon  评论(0) 阅读(1485)

赛门铁克的安全在线检测

http://security.symantec.com/default.asp?productid=globalsites&langid=cs&venid=sym

主要就是黑客暴露程度检查,漏洞检查和木马检查,发现我的机器还是比较安全的笑脸

posted on 2004-03-26 12:39:00 by peon  评论(0) 阅读(2164)

某友人评价台湾选举

(沙子哼哼哈嘿) 20:59:14
狗屎政治
(  56K℡) 21:00:06
我比较喜欢欧洲的那种政治风度和方式
(沙子哼哼哈嘿) 21:00:42
嗯,台湾的那群政客,就知道骂人,养小老婆,收黑钱,打架
(  56K℡) 21:02:00
大陆的政治也不好,就是形势比较重,还有很多家长试的那种
(沙子哼哼哈嘿) 21:18:38
干活干活,谈政治不如谈工作和加班,呵呵
(tonyvicky) 21:19:10
到底怎么了,每个论坛都在谈论政治,出什么大事了?
(沙子哼哼哈嘿) 21:19:22
台湾今天大选结果出来啊
(沙子哼哼哈嘿) 21:19:35
一堆烂苹果里面选一个不是很烂的苹果
(沙子哼哼哈嘿) 21:19:47
其实仔细一看还是一个大大的烂苹果

posted on 2004-03-21 21:27:00 by peon  评论(0) 阅读(1293)

笑傲HUB.路由器.交换机之教学篇

http://www.blueidea.com/computer/net/2003/310.asp

令狐冲十四岁那年进入华山,那年岳灵珊八岁,岳不群白天给两人指点剑法,晚上令狐冲给小师妹讲故事哄她入睡。后来,岳不群陆续收了劳德诺,陆大有等徒弟,又忙于修炼紫霞神功,就没有时间指点徒弟。于是他做了一个hub,从此华山派实现教育电子化,岳不群在网上同时给每个徒弟授课,这种方法很快在五岳剑派内部推广。为了在五岳剑派之间互连,嵩山派掌门左冷禅研制出路由器,使得五岳剑派之间可以互联互通。

令狐冲晚上就通过网络给小师妹讲故事。

很快,岳灵珊已经十六岁,变成了一个亭亭玉立的小姑娘了。令狐冲发现自己的目光总是不由自主的在小师妹身上停留,每次和小师妹在一起的时候,总能听到自己强烈的心跳声,经过了一段时间的茶饭不思后,终于有一天晚上,令狐冲在网上给小师妹发了一首情意绵绵的诗:你是风儿我是沙,你是蜜蜂我是花,你是梳子我是头发,你是牙膏我是牙刷。

第二天,华山派开例会,令狐冲怀着忐率不按的心情来到了会议室,发现小师妹红着脸躲在师父后面,而其它的师弟都在偷偷朝自己笑,开完会,一个调皮的师弟就过来叫牙刷师兄,赶紧蒙面逃走。问陆大有,才知道是劳德诺用一个叫netxray的工具把自己在网上的大作全抓了出来。令狐冲悔恨万分,于是,闭门研究rfc,成功的研制出lanswitch。它能够识别设备mac地址,这样,令狐冲发送给小师妹的数据只有她一个人能够收到。令狐冲晚上可以在网上放心的给小师妹讲故事,偶尔手痒还能敲几句平时心里想又说不出口的话来过瘾,然后,红着脸想象小师妹看到后的表情。

lanswitch是二层交换设备,它可以理解二层网络协议地址mac地址。二层交换机在*作过程中不断的收集资料去建立它本身的地址表,这个表相当简单,主要标明某个mac地址是在哪个端口上被发现的,所以当交换机接收到一个数据封包时,它会检查该封包的目的mac地址,核对一下自己的地址表以决定从哪个端口发送出去。而不是象hub那样,任何一个发方数据都会出现在hub的所有端口上(不管是否为你所需)。这样,lanswitch在提高效率的同时,也提高了系统的安全性。

接下来的一年,岳不群大量招收门徒,华山派得以极大的壮大,所使用的lanswitch也多次级连。但门徒中难免鱼龙混杂,当时华山派一批三、四代弟子崇拜万里独行田伯光,成立了一个田协,经常广播争论比赛八百米还是一千米很合理的问题;第三代弟子中有一个叫李洪至的,每天在华山派内部广播发轮大法;更让令狐冲受不了的是,随着师父年龄的增大,变得越来越罗嗦,每句话都要重复二十遍,然后在网上广播。令狐冲想和小师妹,陆大有等人专门使用一个广播域,但如果另外使用一个lanswitch的话,师父肯定不会同意,于是,他修改了lanswitch的软件,把小师妹,陆大有等人和自己划成一个虚拟网(vlan),其它人使用另外的vlan,广播包只在vlan内发送,vlan间通过路由器连接。岳不群也深受田协,李洪至其害,但为与左冷禅抗争,用人之际,只能隐忍,知道了这件事,大为高兴,但仍为令狐冲私自修改软件一事,罚他到思过崖面壁一年,一年之内不得下山。?在华山派内重新使用vlan进行子网划分,分为五个子网,师父和师娘,小师妹还有林平之在一个vlan,发轮功弟子用一个vlan;田协弟子用一个vlan,其它弟子用一个vlan,而思过崖上也有单独的一个vlan。令狐冲到了思过崖,并不难过,终于,世界安静了,依靠左冷禅的路由器,令狐冲还可以每天在网上给小师妹讲故事,聊天。

局域网交换机的引入,使得网络节点间可独享带宽,但是,对于二层广播报文,二层交换机会在各网络节点上进行广播;同时,对于二层交换机无法识别的mac地址,也必须在广播域内进行广播。当多个二层交换机级连时,二层交换网络上的所有设备都会收到广播消息。在一个大型的二层广播域内,大量的广播使二层转发的效率大大减低,为了避免在大型交换机上进行的广播所引起的广播风暴,需要在一个二层交换网络内进一步划分为多个虚拟网(vlan)。在一个虚拟网(vlan)内,由一个工作站发出的信息只能发送到具有相同虚拟网号(vlanid)的其他站点,其它虚拟网(vlan)的成员收不到这些信息或广播帧。采用虚拟网(vlan)可以控制网络上的广播风暴和增加网络的安全性。不同虚拟网(vlan)之间的通信必须通过路由器进行。

但是幸福永远是短暂的,接下来总是无尽的烦恼。随着整个五岳剑派势力的增大,路由器的速度越来越慢。令狐冲发现每次给小师妹讲故事时,小师妹的回答总是珊珊来吃,而且话也很少,总是"嗯","噢"或者"我听着呢"。终于有一天,路由器再也ping不通的,令狐冲三天没有得到小师妹的消息,对着空空的显示屏,再也忍不住,在一个下着雪的晚上,偷偷下山找小师妹,到了小师妹窗前,发现小师妹正在网上和小林子热烈的聊天,全没注意一边的自己,内心一阵酸痛,回到思过崖,大病一场。病好后潜心研究,终于有一天,做出来一个路由器,这时,令狐冲发现,此时华山派已经有了三十个vlan,路由器必须为每个vlan分配一个接口,接口不够用,而且,两个子网内通过路由器的交换速度远远低于二层交换的速度。二层交换机划分虚拟子网后,就出现了一个问题:不同虚拟子网之间的转发需要通过其它路由器来实现。二层交换机的不同vlan节点间的转发需要通过路由器设备来实现大大浪费了端口,而路由器的高成本,低效率又使它无法满足大量子网情况下的三层转发需求,三层交换的概念就在这种情况下被提了出来。

这天晚上,令狐冲心灰意懒,借酒消愁,这时,一个黑影出现在他的面前,原来是一个道风仙骨的老人,正是风清扬。风清扬听了令狐冲的疑惑,说:路由器接口不够,把路由器做在lanswitch内部不就可以了;交换速度慢,是因为路由器查找的是网段路由,而lanswitch直接查mac对应出端口,当然速度快。为什么不能直接根据ip地址查到出端口呢?令狐冲一听,大为仰慕,但还是不明白,ip地址那么多,而且经常变化,如何能够直接查到出端口呢?风清扬说:

"你先坐下,让我来问你,华山派有多少弟子?"
"一万六千左右。"
"你全知道他们住哪里吗?"
"不知道。"
"岳不群要你找一个不知道住哪里的人,如何去找?"
"查华山派电话号码查询系统,找到他的地址,然后去找他。"
"如果你回来后再让你找这个人,又如何去找?"
"如何....?,查华山派电话号码查询系统,找到他的地址,然后去找他。"
"你不知道到这个人的地址吗?"
"知道,但师父说,华山派的地址那么多,而且经常变化,不用知道地址。"
"岳不群这小子,把徒弟都教成木头了!我问你,你自己认为应该如何找?"
"直接去找!"
"好!你这人还不算太苯。那你知道了一个人的地址后,是不是永远记住了?"
"有的人记住了。其它的都忘了。"
"为什么忘了?"
"因为我记不了那么多人,而且一段时间没有去找他。"
"华山派电话号码查询系统里的地址是如何获得的?"
"我在空旷处大喊一声他的名字,他听到后就会来找我,告诉我他的地址。"

风清扬又问了大把类似脑筋急转弯的问题,然后风清扬说:"现在你明白根据ip地址直接查出端口的道理了吗?等到你明白这个道理,你自然会做出三层交换机来",令狐冲仔细回忆了今天的话,终于明白了和二层转发由mac地址对应到出端口的道理一样,三层转发也可以直接由ip地址对应到出端口,ip地址的路由可以通过arp来学习,同样需要老化。这样,vlan间转发除第一个包需要通过arp获得主机路由外,其它的报文直接根据ip地址就能够查找到出端口,转发速度远远高于路由器转发的速度。抬头看时,风清扬已经走了。

一年后,令狐冲下思过崖,成功的推出quidway?s8016路由交换机。实现了vlan间的互通,并且与嵩山,黑木崖等路由器实现互通。三层交换机是在二层交换机的基础上增加三层交换功能,但它不是简单的二层交换机加路由器,二而是采用了不同的转发机制。路由器的转发采用最长匹配的方式,实现复杂,通常使用软件来实现,。而三层交换机的路由查找是针对流的,它利用cache技术,很容易采用asic实现,因此,可以大大的节约成本,并实现快速转发。很多文章会提及三层交换机和路由器的区别,一般的比较是三层交换机又快又便宜。这些话没有错,但场合是汇聚层。我们看到,在汇聚层,面向三层交换机直接下挂的主机,因为能够获得其主机路由,所以三层交换机能够实现快速查找;而对于通过其它路由器连接多个子网后到达的主机,三层交换机和路由器的处理是一样的,同样采用最长匹配的方法查找到下一跳,由下一跳路由器进行转发。

因此,通常的组网方式是在骨干层使用gsr,汇聚层使用三层交换机。当然,对于一个小型的城域网,也可以直接拿三层交换机组网,不需要gsr。

posted on 2004-03-21 20:55:00 by peon  评论(2) 阅读(2963)

中文RFC

http://www.leepig.com/rfc/

posted on 2004-03-21 20:10:00 by peon  评论(0) 阅读(2077)

武当学艺之反向代理-原创

上集和相关内容请见:http://blog.joycode.com/peon/articles/16504.aspx

接下来发生了一些事情,张翠山夫妇双双自尽,他们的儿子张无忌又被打伤,张三丰和武当诸侠都忙于给张无忌疗伤,无暇顾及各自弟子的武学,而且为了诸侠和张老道的安全,给他们的问题不再直接交到他们手里,每人选了一个得意的弟子,代替自己解答问题,这些弟子的记忆力和反应都不错,可以解答大部分的问题,假如遇到不会的问题,就先向师父请教,然后回答给提问题的弟子,这样不仅大大减轻了诸侠的负担,而且防止了一些危险,比如在在便条上下毒,保护了诸侠的安全(徒弟的命就不值钱了?)。

在这种关系里,武当诸侠和他们的代理弟子构成了反向代理(Reverse Proxy)的关系,反向代理一般作用有三:减轻源服务器负载,保障源服务器安全,对源服务器进行负载均衡(Load Balance)。

一般反向代理置于源服务器的前端,配备大容量的内存和高速磁盘,缓存客户的请求,所以反向代理又称为服务器加速(Server accelerate)。源服务器一般不再和客户直接通讯,当客户请求没有缓存的内容或者动态内容时,反向代理向源服务器发送请求,然后把回应转发给客户,在这种情况下,反向代理服务器通常要为一个请求同时维护两个会话。和普通的代理不同,反向代理一般只代理一台或者有限的几台服务器,对于客户而言,反向代理服务器对于他们就相当于源服务器,对于源服务器而言,反向代理服务器通常就是唯一的客户,因为一般客户不和源服务器直接通信。典型情况下,源服务器对于客户或者客户对于源服务器,都是不可见的。

过了一段时间,张三丰觉得无法根治张无忌的体内的玄冥寒气,决定带他下山到少林寺去碰碰运气,为了让请教张三丰的弟子不至于得不到解答,宋远桥和俞莲舟暂时代替张三丰答题,凡是有请教张三丰的问题,宋青书就轮流送到宋远桥或者俞莲舟的住所。

张老道不在山上,可是他负责的服务不会中断,这种情况可以称为离线缓存(Offline Caching),宋青书的所作的相当于把一个域名交替解析到两个或者以上的地址上去,这个就是DNS轮询。

张三丰所学太过渊博,单凭宋或者俞任何一人都难以回答所有的问题,两个人的知识加起来才可以勉强做到,但是宋青书却有时候把宋远桥不会的问题送到宋远桥那里,俞莲舟也常常遇到这种尴尬(说明宋青书到底还是少了根筋)。这两位到底是高人,一合计,决定视情况采取以下三种办法之一:
1.假如宋远桥收到自己不会的,就写回复说自己很忙,而且这个问题俞莲舟很有研究,叫弟子另外写纸条问俞莲舟,俞也是如此这般。
2.宋远桥把纸条给俞莲舟解答,然后自己把解答给弟子。
3.宋远桥把纸条给俞莲舟解答,俞把解答给弟子。

第一种方法称为内容转向(URL Redirection),就是当服务器发送给客户端一个特殊回应和新的URL,表示客户应该在其他的地方取得内容,然后客户向新的URL提出请求以获取内容,很多的协议都支持,开发过web的人对redirection和302 code应该都很熟悉。

第二种方法中,问问题的弟子,宋远桥,俞莲舟,还有张三丰构成了多重代理关系,宋相当于俞的反向代理,俞又是张三丰的反向代理。这个过程,对客户是完全不可见的。

第三种方法称为三角传输,宋,俞,弟子的请求应答构成了一个三角形,这种方式中,客户向A服务器发起请求,A服务器把请求转发到B服务器,然后根据客户的控制由B服务器向客户发送内容。

这三种方式各有优缺点,内容转向比较灵活,但是需要应用协议的支持(目前HTTP,MMS,RTSP支持),而且转向次数一般有限制。多重代理构造复杂,而且因为代理需要维持双倍的会话,服务器负担很重。三角传输适合于请求流量小而回应内容流量多(比如流媒体)的情况,但是需要特殊网络设备(radware wsd)的支持,某些情况下,三角传输的前端还易于成为瓶颈。

posted on 2004-03-21 17:21:00 by peon  评论(26) 阅读(10049)

SQL Server全文索引的个人总结(下)-关于中文分词

在使用SQL Search的过程中,还发现了一个问题:它对中文,是按字分词的,下面我解释一下:

比如对'博客堂成员很多是MVP'这句话,假如一个个的字的作索引,会比使用'博客堂','成员',MVP'几个词作索引生成的索引大很多,这样不仅浪费空间,也影响索引的效率和准确度。假如英文是按照字母而不是单词作索引,估计世界上如今就没有全文索引,也没有google了。

但是中文在分词上,相比英文有天然的屏障,英文的单词之间有间隔,但是中文不是,必须使用计算机的人工智能把句子分成一个个的词,有些时候,根据句子本身还不够,还必须根据上下文,或者一些日常知识才能判断。比如 乒乓球拍/卖/完了乒乓球/拍卖/完了 ,电脑咋能知道是哪个意思并正确分词呢!

根据使用的结果,SQL Search对中文使用的应该是按字分词(可能是因为原来是英文引擎的缘故),比方说你要查'马克',它会把'马克思'也给你倒腾出来。

我的一个123M的数据库,全文索引有55M,每次全文查询都比较慢(当然机器也很次)。

--------------------------------------------------------------------------------------------------

关于按字分词:

应该还是怡红公子的说法比较妥当,大家看看这个句子:

操作系统能否用汇骗语言改写限制它对每个端口的使用率

为了验证分词,故意使用错误的分词,假如都可以索引出该句子,就说明是按字分词的。比如使用 '用汇' ?查询,也可以查出句子,所以得出了SQLServer按字分词的结论,我没有进一步检查,但是现在发现使用'写限',使用'统能'就无法查出来了,证明SQLServer中还是有简单分词的,只是分词结果不理想。

此外,SQLServer还可以使用第三方的产品增强分词的能力。

--------------------------------------------------------------------------------------------------

假如对分词有兴趣的朋友,这里有一些代码可以看,使用发现分词正确率还是很高的,不过要注册才可以得到:http://www.nlp.org.cn/project/project.php?proj_id=6

posted on 2004-03-19 11:22:00 by peon  评论(20) 阅读(18615)

SQL Server全文索引的个人总结(上)

大家都知道LIKE查询很慢,全文索引就是事先做好相关的索引,表示哪个主题词可以在哪些记录里找到,甚至事先计算好RANK,检索时可以把相关度高的先列出来,这可以大大提高检索的速度。

打个比方,你有很多的小抽屉,每个抽屉里面放一些杂物,假如你要找东西,最原始的方法就是一个个抽屉翻,这就是没有索引的情况。

假如聪明一点,给抽屉编号(唯一键),把哪个号码的抽屉有什么东西记录在纸上,找东西先看看这张纸,这就是普通索引,假如你要知道哪个抽屉有什么,你可以在纸上迅速找到抽屉号码(大家知道这是使用查找树),然后得到相关的信息,这种情况普通索引是很快的;但是要找到一个特定的东西哪些抽屉有,你就要把整张纸遍历一次,这就是LIKE查询,假如你要找哪些抽屉同时有2种甚至更多种物品,LIKE就更加繁琐了。假如一个表有上千万的纪录,大家可以想象查询的代价。

可以换一个思路,另外找张纸,记录一样东西存在于哪些抽屉:

夹子:1,3,4,5,6,9,12...

钱币:2,3,4,7,12...

药丸:1,3,5,6...

这样找到某样东西或者某几样东西都很容易。

全文索引和普通的SQL索引有很多的区别:

普通 SQL 索引 全文索引
存储时受定义它们所在的数据库的控制。 存储在文件系统中,但通过数据库管理。
每个表允许有若干个普通索引。 每个表只允许有一个全文索引。
当对作为其基础的数据进行插入、更新或删除时,它们自动更新。 将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生。
不分组。 在同一个数据库内分组为一个或多个全文目录。
使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。 使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。

使用全文索引的话,可以看看下面的帖子(感谢大力和lihonggen0):

???? 如何在sqlserver中建立全文索引:
???? http://www.csdn.net/develop/Read_Article.asp?Id=17137
???
???? 如何使用image字段:
???? http://expert.csdn.net/Expert/topic/1594/1594455.xml

发现大家有一个常问的问题,就是关于以下的信息的:

查询子句只包含被忽略的词

这是因为使用一些很简单的词,比如'是',进行查询的缘故。

提出的解决办法不外乎是把C:\Program Files\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\noise.chs 清空

觉得这种方法是不可取的,大家打开这个文件看看,发现里面是一些这样的词:is,are,be,at,我,是

这些词都是频率很高的词,而且在查询中的意义不大,就好像几乎每个抽屉里面都有纸屑一样,为这些词作索引得不偿失,所以全文引擎把这些词称为干扰词不做索引,个人觉得在应用中过滤这些词然后向用户提出友好的提示更好,而不是使用清空noise.chs粗暴的对待全文引擎。比方大家可以看看在Google中搜索“的”

-------------------------------------------------------------------------

另外谢谢ghj,一个很重要的东西遗漏了,与一般的索引立即更新不同,全文索引一般是定期维护索引的,所以对于频繁更新的数据不合适,需要做全文索引的对象一般都是论文网页之类,还算适合拉!

个人觉得我的数据库没有代表性,所以也不细说:作索引的时候,CPU和内存使用都很高,时间也很长(下面我的数据库是整个晚上),完成以后并不需要使用很多的系统资源,多个全文查询并发的时候也有不小的CPU消耗,但是比LIKE强。

我的系统上数据库是123M,太小,使用全文索引没有感到特别的优势,但是可以想想对于GOOGLE那样的海量数据,使用LIKE是不可想象的:)当然别人也没有使用关系数据库。

posted on 2004-03-19 10:33:00 by peon  评论(41) 阅读(51442)

缓存代理CDN和群集系统之个人集合

1.武当学艺与缓存代理 http://blog.joycode.com/peon/archive/2004/03/08/15171.aspx

2.武当学艺之反向代理 http://blog.joycode.com/peon/archive/2004/03/21/16756.aspx

以下未完成:

3.武当学艺之NLB和智能DNS

4.明教教主张无忌和CDN(内容分发网络)

posted on 2004-03-17 17:14:00 by peon  评论(0) 阅读(4641)

对自己的苦笑

VC编程经验总结第一版完成的post,居然发现自己和里面的大多数人差不多,我已经知道http://expert.csdn.net/Expert/topic/2826/2826246.xml?temp=5.338687E-02第3条回复就是下载地址了,鼠标还是习惯性的一拉而下,准备在最后丢一个信箱地址。

今天一个同事离职,一个做事认真踏实,我一贯佩服的人,发现他自己copy给我要刻盘的只是一些自己写的例子和lib而已,而我已经在硬盘上留下10多个G的各式各样的文档资料,已经删除的还有n个G(n=?不清楚,反正删的都刻了碟,现在大概1盒多吧,特别声明:不刻电影)。

特别归纳自己的特点如下:

1.硬盘的空间总是不够用

2.拥有一堆可以砸死人的书,其实从来买书的速度比看书的速度快得多

3.在网上浏览文章的速度可以让鼠标的滚轮迅速损坏

4.看到什么可以下载的东西,常常不假思索,down了再说

5.可以在一屏幕的文字里迅速找到大全,宝典,内幕之类的词语 :-P

假如大家觉得刚才我说的太乏味,可以看一些文字:程序员的老婆 & 无责任书评 ,我一对朋友的原创,一笑置之,俺也好在背后好好反省。

posted on 2004-03-10 22:16:00 by peon  评论(9) 阅读(1900)

程序员的老婆 & 无责任书评

http://home.liumeiti.org/archives/000028.html

程序员的老婆
1、你永远不要希望他明白早睡早起的意思。
2、每天要花比做减肥操还要多的力气,叫他起床。
3、电脑永远是他的妻,你只是妾。如果可能他更愿意和电脑结婚,雇你做保姆
4、他会每天记得擦擦电脑,也不会记得每周擦擦桌子。
5、你永远也不清楚,他究竟有多少个JJMM网友。
6、他每天和你在网上说得话,是网下的数倍。
7、他的参考书多的砸死人,你却没有见过他看过多少。
8、他会偷偷把"打小老鼠"的游戏中的程序改动,换上你的面孔,在和你闹别扭或者不闹别扭的时候,一个人玩。
9、无论你多苗条,都比不上劳拉,无论你多酷,都比不上cs。所以他不介意你的体形,也不在意你的发型你的着装,当然也不在意自己的。
10、他不牵你的手,他总是握住你的手腕,一边握,一边有节奏的敲打。
11、他笑得时候像个孩子。
12、即使在家里,他的活动范围也只是定格在电脑桌前,大大增加了房屋的宽敞感觉。
13、他没有心思搞外遇,有多余的精力他宁愿开发自我娱乐的小程序,或者握着你的手到处晃晃,以弥补平常的愧疚。
14、他不会烧饭做菜,但是经常会从网上下载菜单,按照样子做个你吃。
15、你是他除了父母、公司同事和领导之外,唯一和外界真实接触的途经。
16、他不会有意识,拒绝你的各种要求,但是脑子会不断的想,那种方法来完成。
17、只要有吃有穿有程序写有你有网络有MP3,他没有其他的更多的要求。
18、所以我还是觉得很幸福。

无责任!书评:)
1、永远长了点,也许50岁以后会知道,目前觉得晚睡晚起挺好。
2、为了帮忙你减肥,我只能这样:-D。
3、如果可能,我还是愿意和你结婚,让电脑做保姆。
4、每天擦擦电脑,是让你觉得我很干净。在我想起来家里还有桌子的时候,你已经把它擦干净了。
5、其实不多,也就几百个,可是我只陪你一个Mm聊天。
6、没办法~,~,我要做家务事。
7、参考书是用来参考的,没有人每天看字典。
8、程序员有他自己的发泄方式。
9、暂时保持沉默
10、程序员喜欢控制系统,系统没有交互性。
11、你永远也长不大。
12、坦白地说,我怕你练瑜伽碰伤了我,你还说过,练功的时候不可以打扰你。
13、内疚说不上,我喜欢这样。
14、嘿嘿,你总是说那很好吃。对巴@_@
15、程序员的生活总是这样,如果有很多的接触途径,那是销售。
16、弊病,思维有深度,无广度。
17、足以。
18、所以,我觉得更幸福。

posted on 2004-03-10 22:01:00 by peon  评论(3) 阅读(2430)

武当学艺与缓存代理...原创

续集和相关内容请见:http://blog.joycode.com/peon/articles/16504.aspx

话说武当山上,张三丰老道开创武当一派,收了七个弟子,分别是:宋远桥、俞莲舟、俞岱岩、张松溪、张翠山、殷梨亭、莫声谷七人,号称武当七侠。七弟子中,宋远桥是掌门,精研易理,同时对于相面算命很有研究。俞莲舟武功最强,太极拳很厉害,殷梨亭擅长剑术,其他弟子也各有所长。

张三丰常年闭关,钻研武学,而这七个弟子又收了一些弟子,其中宋远桥的儿子宋青书是武当第三代弟子中的佼佼者。

依照武当的规矩,各个弟子(Client)可以向七位师傅(Server)讨教,可以把练功中的疑难写在纸上(Request),送到各位师父的住处,然后由各个师傅解答(Response)。
 
这种关系,就是最直接的服务器-客户机关系。

但是,这样存在一些问题,武当七侠住在不同的地方,有的地方很艰险,不是所有的弟子都可以到达的,这样,宋远桥就叫宋青书跑腿(Proxy Server),每个弟子只要知道宋青书的住处(设定代理地址),把疑难写在纸条上,再写上要请教的师父的姓名,再交给宋青书,就可以了。宋青书将纸条转交给七侠之一,将答复的纸条给各个弟子。
 
对于宋青书而言,各个弟子向他投递纸条,由他转交各位师父,在这种关系里,宋青书相当于师父(Server),各位弟子是徒弟(Client),然后宋青书向七侠请教,这种关系里,宋青书是Client,七侠是Server,中间的过程,就叫代理(Proxy),宋青书就相当于代理服务器。

这种代理关系里面,各个弟子需要知道宋青书的地址(设定代理地址),这种关系叫做显式代理(Explicit Proxy),IE,MediaPlayer都可以设置代理。

经过一段时间,各个弟子也觉得这种方法虽然避免了很多的麻烦,但是很慢。宋青书也对这种跑腿的事情感到厌烦,他发现大多数人问的问题集中在几个问题上(80%的访问集中在20%的内容上),于是,宋青书就把这几个问题的答案记在自己的IBM笔记本上(缓存),以后凡是弟子们问到这几个问题,宋青书不需要再去问七侠,直接找出答案回复给各个弟子,这样各个弟子得到答复的速度快多了,武当七侠也有更多的时间干点其他事情(减轻了Server的负担)。宋青书的脑袋比较灵活,他还写了个程序,统计各个问题被问到的频率,随时记下新的热门问题,淘汰不再热门的问题(缓存替换算法)。

过了一段时间,宋远桥偷偷告诉宋青书,说准备把他作为掌门继承人,让他好好表现。宋青书于是改变工作作风,不再让各个弟子把纸条交给他,而是跑来跑去收集纸条,交给武当七侠。很多新弟子只是知道把纸条写好放在门口,自然会得到武当七侠的指导,大家都忘了宋青书干的这份事情,但是张三丰老道对宋青书可是十分的赞赏,立他为武当掌门继承人。

这种关系,叫做隐式代理(Implicit Proxy),客户意识不到代理服务器的存在,也不需要设定代理服务器的地址,但是客户请求和服务器回应都会经过代理服务器,对于客户而言,代理服务器是透明的(transparent)。

续集: http://blog.joycode.com/peon/archive/2004/03/21/16756.aspx

posted on 2004-03-08 11:29:00 by peon  评论(35) 阅读(9591)

开源的人得罪了谁?

http://www.csdn.net/develop/article/25/25146.shtm

gigix这次招致了大量的攻击,当然每次他都如此。

gigix说:

我唯一的评价是——鼠目寸光。抛开软件的美感和对技艺的热爱不谈,即使单从利益的角度来说,为open source做贡献不仅是一个难得的锻炼、交流、学习的机会,更是一个难得的获得名声和尊敬的机会——在开发者的社群,名声和尊敬几乎就意味着高薪。那些把自己的成果无偿贡献给大家的程序员到底得罪了谁?

---end

通过开源社区功成名就的程序员毕竟是少数,据说Richard.Stallman的物质生活也很一般,就算这些人的物质生活很不错,我想就Stallman在编译器方面的造诣,投身商业软件,可以活的更加滋润。为了名利斤斤计较的人不适合OpenSource。

但是,那些把自己的成果无偿贡献给大家的程序员到底得罪了谁?

他们并没有妨碍大家卖软件,Apache做的好,但是他们没有说,IIS是罪恶的。只是假如你的东西还没有他们业余捣鼓的好,结果多半很惨;也没有妨碍大家使用软件,你可以继续使用MS的东西,假如你觉得不爽,也可以搞个开源的东东玩玩。 大家各自有各自的活法。

我不是个开源者,我想我只能说是温饱,常常被项目压得喘不过气,我无法做到他们这么无私,但是我不想否认这些人的价值,我尊重他们。

软件是有价值的,其实每一个思维,每一行代码,都是有价值的,要不要把这个价值兑现成money,是每个人的自由。无论是MVPs,还是CodeProject上的,或者是SourceForge上的程序员们,都是乐意通过把自己的价值共享给大家而实现自己价值的人。他们可以从中感到快乐,这就是他们的重要动机,这就够了。

posted on 2004-03-07 22:26:00 by peon  评论(14) 阅读(2604)

校园偶见

今日在校园漫步,发现一横幅,上书“庆祝女子节--团委宣”,呵呵,看来各位PLMM对“妇女”这个称谓是略有不满的笑脸

然后祝愿各位大小女子,包括光临博客堂的JJMM节日快乐,日日快乐。

沙子说她过节发了一箱啤酒,呵呵,他们的的领导真的很有幽默感 :)

下面是特别祝福:

沙子,HelloCat,人渣渣,红糖水,小雨,谷癞子,一只鱼,533

傅MMs,楚楚,蒋彦紫,豆豆,刘MMs,大腌菜,还有在家过节的cony

posted on 2004-03-07 16:36:00 by peon  评论(1) 阅读(1836)

windows下的unix命令行工具-Using UNIX style command line tools in windows

虚线后的内容转自我的另外一个BLOG:  http://ms.blogger.cn/peon/posts/610.aspx

一直对下面的东西没有ps而耿耿于怀,终于在winmag网站的论坛发现了vbs脚本: http://blog.joycode.com/peon/posts/15026.aspx

这里也可以看出区别:windows的重用一般是基于COM的,而unix的一般基于单个的程序。

毫无疑问,使用COM的重用粒度更小,对于UNIX的基于程序的方式,无疑在文本方式下很有优势(假如你认为基于程序的组合与重用毫无用处,最好了解一下你写程序的IDE,Visuanl Studio,C++ Builder等开发环境的基本上都使用这种方式调用编译器),但是在GUI下几乎毫无用处。

在CUI下的重用使用的是基于管道的标准输入输出重定向,但是在GUI下,这种方式失去了意义。虽然程序通信有众多的方式,比如窗口MESSAGE,SOCKET,管道等,但是GUI桌面程序都尽力把自己做大作全,而且通信方式缺乏统一性,一般都不会考虑程序间的协作。

------------------------------------------------------------------------------------

使用过linux/unix的人一定感觉得到unix下命令行工具的强大,至少grep对于程序员,作用多多啊!今天发现我的SFU到期了,想起什么时候看过一个GNU的windows下的unix命令工具箱,于是到google上把它翻了出来,大家有兴趣的看看:

http://www.cs.utk.edu/~acm/labstaffsessions/session1/Windows_talk9.html

也可以在这里下载:http://unxutils.sourceforge.net/

还看到一个vim的Windows版本的介绍,这个以前用过,就算是在windows下,vim也是一个不错的编辑器,特别是对程序员而言: http://www.cs.utk.edu/~acm/labstaffsessions/session1/Windows_talk10.html

posted on 2004-03-06 12:09:00 by peon  评论(2) 阅读(8275)

一段相当于unix的ps的vbs脚本

转贴自:http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=390494

'********************************************************************
'*
'* file:           PS.vbs
'* Created:        March 1999
'* Version:        1.0
'*
'*  Main Function:  Gets CPU information for a machine.
'*
'*  PS.vbs      [/S ] [/U ] [/W ]
'*              [/O ]
'*
'* Copyright 咖啡 1999 Microsoft Corporation
'*
'********************************************************************

OPTION EXPLICIT

    'Define constants
    CONST CONST_ERROR                   = 0
    CONST CONST_WSCRIPT                 = 1
    CONST CONST_CSCRIPT                 = 2
    CONST CONST_SHOW_USAGE              = 3
    CONST CONST_PROCEED                 = 4

    'Declare variables
    Dim intOpMode, i
    Dim strServer, strUserName, strPassword, strOutputFile
    Dim intSortProperty, intWidth, intSortOrder
    ReDim strProperties(2), intWidths(2)


    'Make sure the host is csript, if not then abort
    VerifyHostIsCscript()

    'Parse the command line
    intOpMode = intParseCmdLine(strServer     ,  _
                                strUserName   ,  _
                                strPassword   ,  _
                                strOutputFile    )


    Select Case intOpMode

        Case CONST_SHOW_USAGE
            Call ShowUsage()

        Case CONST_PROCEED                
            Call ListJobs(strServer       , _
                          strOutputFile   , _
                          strUserName     , _
                          strPassword     , _
                          intSortOrder    , _
                          intSortProperty , _
                          intWidth        , _
                          strProperties   , _
                          intWidths         )

        Case CONST_ERROR
            'Do Nothing

        Case Else                    'Default -- should never happen
            Call Wscript.Echo("Error occurred in passing parameters.")

    End Select

'********************************************************************
'* End of Script
'********************************************************************

'********************************************************************
'*
'* Sub ListJobs()
'*
'* Purpose: Gets CPU information for a machine.
'*
'* Input:   strServer           a machine name
'*          strOutputFile       an output file name
'*          strUserName         the current user's name
'*          strPassword         the current user's password
'*
'* Output:  Results are either printed on screen or saved in strOutputFile.
'*
'********************************************************************

Private Sub ListJobs(strServer       , _
                     strOutputFile   , _
                     strUserName     , _
                     strPassword     , _
                     intSortOrder    , _
                     intSortProperty , _
                     intWidth        , _
                     strProperties   , _
                     intWidths         )

    ON ERROR RESUME NEXT

    Dim objFileSystem, objOutputFile, objService, strQuery, strMessage
    Dim objEnumerator, objInstance
    Dim k, i, j, intUBound

    'Open a text file for output if the file is requested
    If Not IsEmpty(strOutputFile) Then
        If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
            Call Wscript.Echo ("Could not open an output file.")
            Exit Sub
        End If
    End If

    'Establish a connection with the server.
    If blnConnect("root\cimv2" , _
                   strUserName , _
                   strPassword , _
                   strServer   , _
                   objService  ) Then
        Call Wscript.Echo("")
        Call Wscript.Echo("Please check the server name, " _
                        & "credentials and WBEM Core.")
        Exit Sub
    End If

    'Set the query string.
    strQuery = "Select processid, name, executablepath From Win32_Process"

    'Now execute the query.

    intUBound = UBound(strProperties)
    'Need to use redim so the last dimension can be resized
    ReDim strResults(intUBound, 0), intOrder(0), strArray(0)

    Set objEnumerator = objService.ExecQuery(strQuery,,0)
    If Err.Number Then
        Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred during the query."
        If Err.Description <> "" Then
            Print "Error description: " & Err.Description & "."
        End If
        Err.Clear
        Exit Sub
    End If

    'Properties to get
    strProperties(0) = "processid"
    strProperties(1) = "name"
    strProperties(2) = "executablepath"
    intWidths(1) = 15
    intWidths(0) = 15
    intWidths(2) = 40

    'Read properties of processes into arrays.
    i = 0
    For Each objInstance in objEnumerator
        If objInstance is nothing Then
            Exit For
        End If
        ReDim Preserve strResults(intUBound, i), intOrder灯泡, strArray灯泡
        For j = 0 To intUBound
            Select Case LCase(strProperties(j))
                Case "processid"
                    strResults(j, i) = objInstance.properties_(strProperties(j))
                    If strResults(j, i) < 0 Then
                    '    is 0x100000000.
                        strResults(j, i) = CStr(strResults(j, i) + 4294967296)
                    End If
                Case "owner"
                    Dim strDomain, strUser
                    Call objInstance.GetOwner(strUser, strDomain)
                    strResults(j, i) = strDomain & "\" & strUser
                Case Else
                    strResults(j, i) = CStr _
                        (objInstance.properties_(strProperties(j)))
            End Select
            If Err.Number Then
                Err.Clear
                strResults(j, i) = "(null)"
            End If
        Next
        intOrder灯泡 = i
        'Copy the property values to be sorted.
        strArray灯泡 = strResults(0, i)
        i = i + 1
        If Err.Number Then
            Err.Clear
        End If
    Next

    'Check the data type of the property to be sorted
    k = CDbl(strArray(0))
    If Err.Number Then      'not a number
        Err.Clear
    Else                    'a number
        'Pack empty spaces at the begining of each number
        For j = 0 To UBound(strArray)
            'Assume the longest number would be less than 40 digits.
            strArray(j) = strPackString(strArray(j), 40, 0, 0)
        Next
    End If

    If i > 0 Then
        'Print the header
        strMessage = vbCRLF & Space(2)
        For j = 0 To intUBound
            strMessage = strMessage & UCase(strPackString(strProperties(j), _
                intWidths(j), 1, True))
        Next
        WriteLine strMessage & vbCRLF, objOutputFile

        'Sort strArray
        Call SortArray(strArray, 1, intOrder, 0)

            For j = 0 To intUBound
                'First copy results to strArray and change the order of elements
                For k = 0 To i-1    'i is number of instances retrieved.
                    strArray红唇 = strResults(j, intOrder红唇)
                Next
                'Now copy results back to strResults.
                For k = 0 To i-1    'i is number of instances retrieved.
                    strResults(j, k) = strArray红唇
                Next
            Next

        For k = 0 To i-1
            strMessage = Space(2)
            For j = 0 To intUBound
                strMessage = strMessage & strPackString(strResults(j, k), _
                    intWidths(j), 1, True)
            Next
            WriteLine strMessage, objOutputFile
        Next
    End If

    If IsObject(objOutputFile) Then
        objOutputFile.Close
        Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
    End If

End Sub


'********************************************************************
'*
'* Function intParseCmdLine()
'*
'* Purpose: Parses the command line.
'* Input:  
'*
'* Output:  strServer         a remote server ("" = local server")
'*          strUserName       the current user's name
'*          strPassword       the current user's password
'*          strOutputFile     an output file name
'*
'********************************************************************
Private Function intParseCmdLine( ByRef strServer,        _
                                  ByRef strUserName,      _
                                  ByRef strPassword,      _
                                  ByRef strOutputFile     )


    ON ERROR RESUME NEXT

    Dim strFlag
    Dim intState, intArgIter
    Dim objFileSystem

    If Wscript.Arguments.Count > 0 Then
        strFlag = Wscript.arguments.Item(0)
    End If

    If IsEmpty(strFlag) Then                'No arguments have been received
        intParseCmdLine = CONST_PROCEED
        Exit Function
    End If

    'Check if the user is asking for help or is just confused
    If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
        OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _
        OR (strFlag="h") Then
        intParseCmdLine = CONST_SHOW_USAGE
        Exit Function
    End If

    'Retrieve the command line and set appropriate variables
     intArgIter = 0
    Do While intArgIter <= Wscript.arguments.Count - 1
        Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
 
            Case "/s"
                If Not blnGetArg("Server", strServer, intArgIter) Then
                    intParseCmdLine = CONST_ERROR
                    Exit Function
                End If
                intArgIter = intArgIter + 1

            Case "/o"
                If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
                    intParseCmdLine = CONST_ERROR
                    Exit Function
                End If
                intArgIter = intArgIter + 1

            Case "/u"
                If Not blnGetArg("User Name", strUserName, intArgIter) Then
                    intParseCmdLine = CONST_ERROR
                    Exit Function
                End If
                intArgIter = intArgIter + 1

            Case "/w"
                If Not blnGetArg("User Password", strPassword, intArgIter) Then
                    intParseCmdLine = CONST_ERROR
                    Exit Function
                End If
                intArgIter = intArgIter + 1

            Case Else 'We shouldn't get here
                Call Wscript.Echo("Invalid or misplaced parameter: " _
                   & Wscript.arguments.Item(intArgIter) & vbCRLF _
                   & "Please check the input and try again," & vbCRLF _
                   & "or invoke with '/?' for help with the syntax.")
                Wscript.Quit

        End Select

    Loop '** intArgIter <= Wscript.arguments.Count - 1

    If IsEmpty(intParseCmdLine) Then _
        intParseCmdLine = CONST_PROCEED

End Function

'********************************************************************
'*
'* Sub ShowUsage()
'*
'* Purpose: Shows the correct usage to the user.
'*
'* Input:   None
'*
'* Output:  Help messages are displayed on screen.
'*
'********************************************************************
Private Sub ShowUsage()

    Wscript.Echo ""
    Wscript.Echo "Lists all jobs currently running on a machine."
    Wscript.Echo ""
    Wscript.Echo "SYNTAX:"
    Wscript.Echo "  PS.vbs [/S ] [/U ]" _
                &" [/W ]"
    Wscript.Echo "  [/O ]"
    Wscript.Echo ""
    Wscript.Echo "PARAMETER SPECIFIERS:"
    Wscript.Echo "   server        A machine name."
    Wscript.Echo "   username      The current user's name."
    Wscript.Echo "   password      Password of the current user."
    Wscript.Echo "   outputfile    The output file name."
    Wscript.Echo ""
    Wscript.Echo "EXAMPLE:"
    Wscript.Echo "1. cscript PS.vbs"
    Wscript.Echo "   List the jobs running on the current machine."
    Wscript.Echo "2. cscript PS.vbs /S MyMachine2"
    Wscript.Echo "   List the jobs running on the machine MyMachine2."

End Sub

'********************************************************************
'* General Routines
'********************************************************************

'********************************************************************
'*
'* Sub SortArray()
'* Purpose: Sorts an array and arrange another array accordingly.
'* Input:   strArray    the array to be sorted
'*          blnOrder    True for ascending and False for descending
'*          strArray2   an array that has exactly the same number of
'*                      elements as strArray
'*                      and will be reordered together with strArray
'*          blnCase     indicates whether the order is case sensitive
'* Output:  The sorted arrays are returned in the original arrays.
'* Note:    Repeating elements are not deleted.
'*
'********************************************************************

Private Sub SortArray(strArray, blnOrder, strArray2, blnCase)

    ON ERROR RESUME NEXT

    Dim i, j, intUbound

    If IsArray(strArray) Then
        intUbound = UBound(strArray)
    Else
        Print "Argument is not an array!"
        Exit Sub
    End If

    blnOrder = CBool(blnOrder)
    blnCase = CBool(blnCase)
    If Err.Number Then
        Print "Argument is not a boolean!"
        Exit Sub
    End If

    i = 0
    Do Until i > intUbound-1
        j = i + 1
        Do Until j > intUbound
            If blnCase Then     'Case sensitive
                If (strArray灯泡 > strArray(j)) and blnOrder Then
                    Swap strArray灯泡, strArray(j)   'swaps element i and j
                    Swap strArray2灯泡, strArray2(j)
                ElseIf (strArray灯泡 < strArray(j)) and Not blnOrder Then
                    Swap strArray灯泡, strArray(j)   'swaps element i and j
                    Swap strArray2灯泡, strArray2(j)
                ElseIf strArray灯泡 = strArray(j) Then
                    'Move element j to next to i
                    If j > i + 1 Then
                        Swap strArray(i+1), strArray(j)
                        Swap strArray2(i+1), strArray2(j)
                    End If
                End If
            Else                 'Not case sensitive
                If (LCase(strArray灯泡) > LCase(strArray(j))) and blnOrder Then
                    Swap strArray灯泡, strArray(j)   'swaps element i and j
                    Swap strArray2灯泡, strArray2(j)
                ElseIf (LCase(strArray灯泡) < LCase(strArray(j))) and _
                        Not blnOrder Then
                    Swap strArray灯泡, strArray(j)   'swaps element i and j
                    Swap strArray2灯泡, strArray2(j)
                ElseIf LCase(strArray灯泡) = LCase(strArray(j)) Then
                    'Move element j to next to i
                    If j > i + 1 Then
                        Swap strArray(i+1), strArray(j)
                        Swap strArray2(i+1), strArray2(j)
                    End If
                End If
            End If
            j = j + 1
        Loop
        i = i + 1
    Loop

End Sub

'********************************************************************
'*
'* Sub Swap()
'* Purpose: Exchanges values of two strings.
'* Input:   strA    a string
'*          strB    another string
'* Output:  values of strA and strB are exchanged.
'*
'********************************************************************

Private Sub Swap(ByRef strA, ByRef strB)

    Dim strTemp

    strTemp = strA
    strA = strB
    strB = strTemp
 strb = 4/0
End Sub

'********************************************************************
'*
'* Function strPackString()
'*
'* Purpose: Attaches spaces to a string to increase the length to intWidth.
'*
'* Input:   strString   a string
'*          intWidth    the intended length of the string
'*          blnAfter    Should spaces be added after the string?
'*          blnTruncate specifies whether to truncate the string or not if
'*                      the string length is longer than intWidth
'*
'* Output:  strPackString is returned as the packed string.
'*
'********************************************************************
Private Function strPackString( ByVal strString, _
                                ByVal intWidth,  _
                                ByVal blnAfter,  _
                                ByVal blnTruncate)

    ON ERROR RESUME NEXT

    intWidth      = CInt(intWidth)
    blnAfter      = CBool(blnAfter)
    blnTruncate   = CBool(blnTruncate)

    If Err.Number Then
        Call Wscript.Echo ("Argument type is incorrect!")
        Err.Clear
        Wscript.Quit
    End If

    If IsNull(strString) Then
        strPackString = "null" & Space(intWidth-4)
        Exit Function
    End If

    strString = CStr(strString)
    If Err.Number Then
        Call Wscript.Echo ("Argument type is incorrect!")
        Err.Clear
        Wscript.Quit
    End If

    If intWidth > Len(strString) Then
        If blnAfter Then
            strPackString = strString & Space(intWidth-Len(strString))
        Else
            strPackString = Space(intWidth-Len(strString)) & strString & " "
        End If
    Else
        If blnTruncate Then
            strPackString = Left(strString, intWidth-1) & " "
        Else
            strPackString = strString & " "
        End If
    End If

End Function

'********************************************************************
'*
'*  Function blnGetArg()
'*
'*  Purpose: Helper to intParseCmdLine()
'*
'*  Usage:
'*
'*     Case "/s"
'*       blnGetArg ("server name", strServer, intArgIter)
'*
'********************************************************************
Private Function blnGetArg ( ByVal StrVarName,   _
                             ByRef strVar,       _
                             ByRef intArgIter)

    blnGetArg = False 'failure, changed to True upon successful completion

    If Len(Wscript.Arguments(intArgIter)) > 2 then
        If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
            If Len(Wscript.Arguments(intArgIter)) > 3 then
                strVar = Right(Wscript.Arguments(intArgIter), _
                         Len(Wscript.Arguments(intArgIter)) - 3)
                blnGetArg = True
                Exit Function
            Else
                intArgIter = intArgIter + 1
                If intArgIter > (Wscript.Arguments.Count - 1) Then
                    Call Wscript.Echo( "Invalid " & StrVarName & ".")
                    Call Wscript.Echo( "Please check the input and try again.")
                    Exit Function
                End If

                strVar = Wscript.Arguments.Item(intArgIter)
                If Err.Number Then
                    Call Wscript.Echo( "Invalid " & StrVarName & ".")
                    Call Wscript.Echo( "Please check the input and try again.")
                    Exit Function
                End If

                If InStr(strVar, "/") Then
                    Call Wscript.Echo( "Invalid " & StrVarName)
                    Call Wscript.Echo( "Please check the input and try again.")
                    Exit Function
                End If

                blnGetArg = True 'success
            End If
        Else
            strVar = Right(Wscript.Arguments(intArgIter), _
                     Len(Wscript.Arguments(intArgIter)) - 2)
            blnGetArg = True 'success
            Exit Function
        End If
    Else
        intArgIter = intArgIter + 1
        If intArgIter > (Wscript.Arguments.Count - 1) Then
            Call Wscript.Echo( "Invalid " & StrVarName & ".")
            Call Wscript.Echo( "Please check the input and try again.")
            Exit Function
        End If

        strVar = Wscript.Arguments.Item(intArgIter)
        If Err.Number Then
            Call Wscript.Echo( "Invalid " & StrVarName & ".")
            Call Wscript.Echo( "Please check the input and try again.")
            Exit Function
        End If

        If InStr(strVar, "/") Then
            Call Wscript.Echo( "Invalid " & StrVarName)
            Call Wscript.Echo( "Please check the input and try again.")
            Exit Function
        End If
        blnGetArg = True 'success
    End If
End Function

'********************************************************************
'*
'* Function blnConnect()
'*
'* Purpose: Connects to machine strServer.
'*
'* Input:   strServer       a machine name
'*          strNameSpace    a namespace
'*          strUserName     name of the current user
'*          strPassword     password of the current user
'*
'* Output:  objService is returned  as a service object.
'*          strServer is set to local host if left unspecified
'*
'********************************************************************
Private Function blnConnect(ByVal strNameSpace, _
                            ByVal strUserName,  _
                            ByVal strPassword,  _
                            ByRef strServer,    _
                            ByRef objService)

    ON ERROR RESUME NEXT

    Dim objLocator, objWshNet

    blnConnect = False     'There is no error.

    'Create Locator object to connect to remote CIM object manager
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    If Err.Number then
        Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
                           " occurred in creating a locator object." )
        If Err.Description <> "" Then
            Call Wscript.Echo( "Error description: " & Err.Description & "." )
        End If
        Err.Clear
        blnConnect = True     'An error occurred
        Exit Function
    End If

    'Connect to the namespace which is either local or remote
    Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
       strUserName, strPassword)
    ObjService.Security_.impersonationlevel = 3
    If Err.Number then
        Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
                           " occurred in connecting to server " _
           & strServer & ".")
        If Err.Description <> "" Then
            Call Wscript.Echo( "Error description: " & Err.Description & "." )
        End If
        Err.Clear
        blnConnect = True     'An error occurred
    End If

    'Get the current server's name if left unspecified
    If IsEmpty(strServer) Then
        Set objWshNet = CreateObject("Wscript.Network")
    strServer     = objWshNet.ComputerName
    End If

End Function

'********************************************************************
'*
'* Sub      VerifyHostIsCscript()
'*
'* Purpose: Determines which program is used to run this script.
'*
'* Input:   None
'*
'* Output:  If host is not cscript, then an error message is printed
'*          and the script is aborted.
'*
'********************************************************************
Sub VerifyHostIsCscript()

    ON ERROR RESUME NEXT

    Dim strFullName, strCommand, i, j, intStatus

    strFullName = WScript.FullName

    If Err.Number then
        Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
        If Err.Description <> "" Then
            Call Wscript.Echo( "Error description: " & Err.Description & "." )
        End If
        intStatus =  CONST_ERROR
    End If

    i = InStr(1, strFullName, ".exe", 1)
    If i = 0 Then
        intStatus =  CONST_ERROR
    Else
        j = InStrRev(strFullName, "\", i, 1)
        If j = 0 Then
            intStatus =  CONST_ERROR
        Else
            strCommand = Mid(strFullName, j+1, i-j-1)
            Select Case LCase(strCommand)
                Case "cscript"
                    intStatus = CONST_CSCRIPT
                Case "wscript"
                    intStatus = CONST_WSCRIPT
                Case Else       'should never happen
                    Call Wscript.Echo( "An unexpected program was used to " _
                                       & "run this script." )
                    Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
                                       & "be used to run this script." )
                    intStatus = CONST_ERROR
                End Select
        End If
    End If

    If intStatus <> CONST_CSCRIPT Then
        Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
             "This can be achieved by" & vbCRLF & _
             "1. Using ""CScript PS.VBS arguments"" for Windows 95/98 or" _
             & vbCRLF & "2. Changing the default Windows Scripting Host " _
             & "setting to CScript" & vbCRLF & "    using ""CScript " _
             & "//H:CScript //S"" and running the script using" & vbCRLF & _
             "    ""PS.VBS arguments"" for Windows NT/2000." )
        WScript.Quit
    End If

End Sub

'********************************************************************
'*
'* Sub WriteLine()
'* Purpose: Writes a text line either to a file or on screen.
'* Input:   strMessage  the string to print
'*          objFile     an output file object
'* Output:  strMessage is either displayed on screen or written to a file.
'*
'********************************************************************
Sub WriteLine(ByVal strMessage, ByVal objFile)

    On Error Resume Next
    If IsObject(objFile) then        'objFile should be a file object
        objFile.WriteLine strMessage
    Else
        Call Wscript.Echo( strMessage )
    End If

End Sub

'********************************************************************
'*
'* Function blnErrorOccurred()
'*
'* Purpose: Reports error with a string saying what the error occurred in.
'*
'* Input:   strIn  string saying what the error occurred in.
'*
'* Output:  displayed on screen
'*
'********************************************************************
Private Function blnErrorOccurred (ByVal strIn)

    If Err.Number Then
        Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
        If Err.Description <> "" Then
            Call Wscript.Echo( "Error description: " & Err.Description)
        End If
        Err.Clear
        blnErrorOccurred = True
    Else
        blnErrorOccurred = False
    End If

End Function

'********************************************************************
'*
'* Function blnOpenFile
'*
'* Purpose: Opens a file.
'*
'* Input:   strFileName  A string with the name of the file.
'*
'* Output:  Sets objOpenFile to a FileSystemObject and setis it to
'*            Nothing upon Failure.
'*
'********************************************************************
Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)

    ON ERROR RESUME NEXT

    Dim objFileSystem

    Set objFileSystem = Nothing

    If IsEmpty(strFileName) OR strFileName = "" Then
        blnOpenFile = False
        Set objOpenFile = Nothing
        Exit Function
    End If

    'Create a file object
    Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    If blnErrorOccurred("Could not create filesystem object.") Then
        blnOpenFile = False
        Set objOpenFile = Nothing
        Exit Function
    End If

    'Open the file for output
    Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
    If blnErrorOccurred("Could not open") Then
        blnOpenFile = False
        Set objOpenFile = Nothing
        Exit Function
    End If
    blnOpenFile = True

End Function

'********************************************************************
'*                                                                  *
'*                           End of File                            *
'*                                                                  *
'********************************************************************

posted on 2004-03-06 11:03:00 by peon  评论(0) 阅读(2432)

自己业余做点小电影?

看了题目不要想歪笑脸

用Windows XP应该有不少人了吧!想没有想过几段视频,几张相片,搞点东西和大家一起欣赏一下?看看使用 Windows Movie Maker 制作电影吧!非常简单,简直和拷贝一个笑话发给朋友差不多。

微软提供了很多例子:http://www.microsoft.com/china/windowsxp/moviemaker/videos/samples/default.asp

这里还有一个网友做的她的BLOG宣传片:http://home.liumeiti.org/sandblog.wmv

下载:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=82887484-6f21-43e2-b4e2-051f72c11a77

 

posted on 2004-03-05 18:24:00 by peon  评论(4) 阅读(2689)

关于协议和NAT的亲和性

MMS和RTSP都是用于通过网络进行流媒体服务的协议(mms是微软的私有协议,和那个手机的MMS没有关系的)。

前两天在内容重定向上碰到了问题:http://blog.joycode.com/peon/posts/14725.aspx

今天看了这篇文章:http://msdn.microsoft.com/library/en-us/dnwmt/html/mmsfirewall.asp

提到微软的mms协议关于NAT的问题,终于对这个问题有了初步的头绪:mms协议和rtsp协议都把流分为控制流和数据流,当使用udp作为数据流时候一般这样:

client连接到server的一个固定端口比如1755,一切就绪后,然后发送自己的ip地址和端口号给server,server就向这个IP和端口发送数据流。

但是经过NAT时,NAT修改IP包的端口和IP地址,但是NAT并不了解MMS协议,当然不知道修改client发送给server的信息了,于是server发出的数据就无法到达client,类似的还有FTP采用主动模式的情况。

原来一直没有意识到这个问题,因为我是采用的mms的方式,当使用这两种协议描述字的时候,其实client和server私下里会协商采用mmst(走tcp通道)或者mmsu(通过udp发送数据),这个过程称为协议翻转,通过NAT以后,一般都采用了tcp的方法(就是mmst),这种方法似乎数据流和控制流使用了同一个连接,对于NAT是友好的。

今天才意识到mmsu协议其实不是NAT友好的。

然后Client在重定向以后再协议翻转的时候(mms->mmst),出了问题,为什么会出问题,原因仍然不是很清楚,MediaPlayer可没有源代码看 :D

posted on 2004-03-05 16:55:00 by peon  评论(2) 阅读(3430)

【第1页/共2页,26条】
首页
前页
1