September 2007 - Posts
Title
研究wwf也有一段时间,感觉他确实很棒,也出点成果。下面我来介绍一下关于开发wwf应该注意的事项!
刚开始研究wwf的时候 ,始终有个疑问缠绕着我,看着别个画流程,我也跟着画流程,盲目的很,不明白其中的参数配置,和其中的奥妙。
当时有一个疑问一直缠绕着我,就是我如何把我的流程在应用中用起来。在流程中如何控制我的实例,什么时候销毁,如果一个停顿在内存中,
我的流程就没有意义。在内存中销毁拉。如何得到,这些问题 困扰我很久,其实很简单就是持久化的问题 钝化,现在来看图说话
。
上面2个图就是我的流程审批界面,1图提交信息界面,2图解决问题界面

上面的这个图:就是需要首先创建一个workflowRuntime 是的环境
然后注册一些事件,需要留意一个workflowdled这个事件,是在流程实例不用的时候,立刻销毁内存中的占用的资源
ExternalDataExchangeService 这个就是一个服务扩展,
通过他来接外来事件。
sqlWorkflowPersistenceService 保存流程实例的,
上面很重要哦 钝化 就需要这个。。

这个就是最简单的工作流传递参数。
type = typeof(WorkflowHelpCenterDemo.Workflow1);这个就是我们的流程引擎,然后获取他的type
然后就可以通过theWorkflowRuntime.CreateWorkflow(type,parameters)得到一个流程的实例
还有就是要注意,传递参数给流程。workflow1的时候,流程那边必须有对应的属性来接应他的参数,要不燃,会包错。

kk上面的这个图,就是用来获取已经被钝化的流程实例,得到这个实力然后进行操作。
流程图
事件激活,和函数调用
。 

这个就是上面注册的workflowruntime的销毁实例的事件,通过他来销毁占用资源
。
下面就是具体的销毁过程,大概里面应该注意的一些细节。。

上面只是简单的说明,具体代码在后天发布出来,没有开虚机,没有贴代码。
流程应该很清楚。。
提交问题 ========钝化==========解决问题
希望大家能学习到一些关于wwf的简单的皮毛。。
代码在后天上传。。。
=========================================================AA
因项目需要,文件索引的设计为了方便搜索引擎在取得文档进行切词后分析形成的文件索引。我发了我的设计上来让大家看看。我知道还有很多不对和考虑不到的地方,麻烦各位兄弟姐妹们多评评,提高宝贵意见。谢谢大家。大家狠狠的砸砖吧!
文件索引设计
索引文件采用倒排档结构,建立数据库表(三个索引表)
一级索引表
1、一级索引表按词曲中的首字母分N个扩展表,如A—G为一个表;H—N为一个表;O—W为一个表。
2、一级索引文件属于记录式文件,每一记录大小固定
共有四个数据项构成,WordID、文档数、第一个文档开始位置(存放在哪个二级索引表)、第一个文档开始位置(存放在二级索引表哪个ID)
WordID是词典中词条的ID,文档数是指这个词总共在多少个文档中出现,文档开始位置是一个文件指针指向二级索引中出现当前词的文档集中的第一个文档存储位置,这个指针是由二级索引表的表名(定长字符串)和第几条记录组成(数字形值)。通过这个指向可以直接定位到二级索引表读取位置,然后读取nDocs个记录即可,因为它们是存放在连续的地址空间上(通过链表形式)。
|
WordID
|
文档数
|
FirstTable
|
FirstID
|
|
WordID
|
nDocs
|
放在哪个二级索引表
|
二级索引表哪个ID
|
|
WordID
|
nDocs
|
放在哪个二级索引表
|
二级索引表哪个ID
|
|
WordID
|
nDocs
|
放在哪个二级索引表
|
二级索引表哪个ID
|
…………………………………………………………..
二级索引表
1、 二级索引表根据数据量自动扩展N个二级索引表
2、 二级索引也是一种记录式文件,每一记录有三个数据项组成,DocID、出现次数、第一个Hit位置。其中DocID是文档的ID,出现次数指的是当前文档中某一个词出现的次数,第一个Hit位置也是一个指针,指向Hits表中的某一位置。通过这个指针就可以直接定位到Hits位置中的读取位置,这样连续读取nHits个记录就可以将所有当前词在当前文档中的出现的位置信息都读入。通过下一文档的指针找到下一个出现当前词的文档,形成一个链表。该链表的最后一个指针指回第一个指针,形成封闭的链表
|
ID主键
|
文档的ID
|
首次出现位置(表)
|
首次出现位置
|
下一文档的指针(表)
|
下一文档的指针(位置)
|
|
ID
|
DocID
|
Hits表
|
Hits位置
|
哪个二级索引表
|
二级索引表哪个ID
|
|
ID
|
DocID
|
Hits表
|
Hits位置
|
哪个二级索引表
|
二级索引表哪个ID
|
|
ID
|
DocID
|
Hits表
|
Hits位置
|
哪个二级索引表
|
二级索引表哪个ID
|
…………………………………………………………..
Hits位置表
1、Hits位置表根据数据量自动扩展N个Hits位置表
2、Hits位置信息文件:些文件每一记录只有一个数据项,即Hit位置信息,只记录了各词在文档中出现的位置。将同一词在同一文档中的出现位置按出现的先后排列。这样在读取文档并提取摘要时只需对字符串从头到尾扫描一边即可,不需要来回扫描。
|
ID主键
|
出现次数
|
出现位置
|
|
ID
|
出现次数
|
1,4,6,10………..
|
|
ID
|
出现次数
|
43,46,66,100………..
|
|
ID
|
出现次数
|
8,50,89,213………..
|
好处:
1)、将倒排档索引文件组织成数据库系统,由数据库系统来管理会大提高系统的效率并在数据维护方面有一定的优越性。
2)、每处理完一文档无须导出顺排数据
3)、在一级索引表中对关键字分块,按wordID顺序排序、有利于搜索性能
4)、数据更新方便,删除,增加数据只需更改指针指向。
存在问题:
1)、搜索二级索引表将出现循环搜索
还有存在什么问题,大家说出来。还有我真正应该怎么去想这样的问题!
微软在我心目中应该是个人才济济,高手林立的地方,总想着能跟微软的人一起做几个项目,一定是特幸福的事。可万万没想到,我参与的第一个微软项目,却让我碰上了一位史上最烂的微软的项目经理,完全破坏了微软在我心目中的形象。真希望这只是个个案,我相信微软只是一不小心,出了这么一个蛀虫而以。本不想说什么,但经昨晚一事,已让我如鲠在喉,不吐不快。
6月底,我来到烟台,加入到微软的一个上海通用东岳项目组,让我见识到了位微软王姓顾问,担任项目的项目经理。
“尊重”二字,你懂吗?
第一次见到他,是我加入项目一个星期后(我到烟台时,他已回上海),给我的第一印象就是,这位经理不知道“尊重”二字。当时跟我差不多新来的,还有一位兄弟,他进门后当作没看到一样,完全不屑跟我们打个招呼,更别说跟我们聊聊,介绍下项目情况了,还是我跟那位兄弟起来,主动跟他介绍了下自己。更让我没想到的是,我本是他打电话面试来的,二天后安排任务时,他竟然指着我问边上的另外一位同事说:“他叫什么?”。
不打招呼也许是一时没在意,记不住名字也许是真的忘了,但接下来的时间里,真让我确信他根本不知道“尊重”二字。他的MSN是从不加我们这些外派的,他的邮件是从不发给我们这些外派的,有兄弟生病,他是绝不会说句问候的话的,平时同事跟他说话,问他事情时,他的头是不会转过来的,有同事向大家询问东西,哪怕他知道,只要是不直接问他,他就会装着没听到,绝不会主动回答的。
项目经理就是这样当的吗?
我加入项目组后,他至始至终没有跟我或让人跟我讲给项目需求,后来才发现,原来他自己也不清楚。当问他问题的时候,他会回答的只有一句:“看以前的Java源码吧”。平时能听到他说得最多的,除了这句外,就是不停地找人问:“你那边怎么样了?”,频率基本上能达到一小时一次。
他管理项目也有他比较独特的一套,因为他只用Excel,他把一个个任务列出来,再把一个个人列出来,再用除法一除,就是他的项目计划了。最离谱的是,我有次拿到的任务单上写着“报表1 2天,报表2 2天,报表3 2天……”,别外一位兄弟拿到更简洁,只写着“2天,2天,2天……”。
管理不行,技术应该好点吧,有时他还真装模作样的写代码,可惜是只会装。而且还挺会装的,他经常是拿一个问题,与某个兄弟说上半天,然后说这个很简单的,我做给你看,写了一会儿到写不下去时,就说:“那,这个我基本上实现了,你就照这个思路下去吧。”唉,总是弄得兄弟们哭笑不得。
此乃周扒皮在世,王扒皮是也。
项目一开始,他就在不停地强调加班,我们一周上六天班,早8点到晚8点,他还在后面不停地催。据说,在我没来时,都是干到十一二点的,曾经有位兄弟上厕所久了点,他竟然跑去敲他厕所的门。从项目开始到现在,这里除了他之外,所有的兄弟都有被累病过的记录,轻的重感冒,重的因胃出血住院,还有搞得神精衰弱的,别人生病了,他是连一句问候的话也不舍得说的,装着没看见,反正病的不是他自己。
项目紧,加点班还不算什么,他还非常得小气,扣门。我们加班,吃饭、打的都得自己解决,而且脸皮特厚,你们怎么有意见,他装着没听到。最后终于在我们的强烈要求下,他为我们解决晚上加班的晚饭,星期天加班仍然自行解决。我们十几个人,每次他只订6个菜,还不停地在旁边大呼“丰盛”。
我们只是外派的,对我们这样我们无话可说,他连请客户吃饭也是如此,记得有次,他请客户吃饭,正好捎带上我们,十四个人,坐了一桌,挤得手都伸不开,点了几个菜就开吃,还不停地发出惊叹的呼声:“我们的战斗力真强啊”。
他如此吝啬,可每个月的报销总是几万几万的,唉,真不知道他在哪花的钱?
如此举止,象个项目经理吗?象个微软人吗?象个据说是出过国的人吗?
真不知道他是属什么的,在我们的办公室里,在他的可视距离之内,最好不要出现食物、水果之类,否则一定会在最短的时间之内,被他以最快的速度消灭,有阵子,坐他旁边的几位兄弟从食堂带回的桃子总是突然就没了,他拿着出去洗,回到办公室,已经连桃核都没了,问他有没有拿,他还死不承认。吃完东西之后,最恶心的一个动作就是用小指扣鼻屎,再拿食指去扣牙齿。
昨天那点事。
昨天,那位曾经胃出血住院的兄弟因身体坚持不下去,撤出项目组要回家了。那位兄弟毕竟辛辛苦苦在这干了三个月,他也不提请他吃顿饭,为他饯行一下。最后我们几个兄弟私下决定为那位兄弟饯行,有位同事忍不住就跟他说让他表示一下,他实在没办法,就答应了。在我们集体出发时,他说:“你们去找个包厢先吃吧,我待会就过来。”最后,我们直到吃完,中间差不多二个多小时,他都没出现。狠狠地放了我们一回鸽子。
在这件事上,我们也不是一定要他去,不是一定要他付钱,很多东西其实对我们来说也是无所谓的,但问题是,你要么就说我不去了,答应了去的却又放我们鸽子就太过份了。我们在场的兄弟,看到这位兄弟离开时是如此惨淡,我们的心里也是拔凉拔凉的。
跟着这样的项目经理,真是我们的悲衰,希望项目早点结束,早点离开了。不是因为其它,就是因为有这样一个史上最烂的项目经理。
今天发现了一个小问题,不知道大家遇到没有:
在一个类中作了两个类似的方法,
方法1:返回dataset,tables中有两表,一个是统计一个字段的集合,类似select aa ,sum(value) from table1 ,另一个是明细,类似select aa,bb,cc,value from table1.
然后建立一个relation;
方法2:与上一个方法相似,统计的表中统计二个字段,类似select aa,bb,sum(value) 所以在relation中主和从column都是数组,
在界面调用这两个方法时,用datagridview显示,单独用没什么问题,但当交替调用时,返回的结果就出问题了。在这时,如果多次连续调用一个方法,就有内存溢出了。
大家不妨验正一下。
我在实际程序中有多个方法,只是在这两个类似的方法调用中,会出现问题。
摘要: MonoRail的文档已经比较全面,我再写教程似乎是重复劳动了。所以这里以FAQ的形式把我的心得分享出来
阅读全文
摘要: 本文通过比较Hibernate3.0和ADO.net 2.0对数据库存储过程的执行来比较两者的基本情况。
由于本人对Hibernate不熟悉,所有Hibernate代码均转载自http://java.e800.com.cn/articles/2007/515/1179165860296629767_1.html
如果有任何不恰当的地方请多多指教
本文的目的是
如果Nhibernate没有其它的过人之处,在.net环境下要他干嘛呢?
阅读全文
摘要: 新的Visual Studio 代码编辑器字体,更加美观,更加清晰,特别为数字做了优化,使用了Consolas的数字。英文字符使用的是ADOBE的CourierStd字体,更好看。
阅读全文
摘要:
首先解释一下标题的定语:
- 实例讲解:文章中会出现可以运行并可立即看到结果的实例代码
- 中国特色的:中国网民使用最多的浏览器是IE和FireFox.所以这些CssHack主要是为了解决这2种浏览器的兼容问题.中国电脑用户的操作系统主要是Windows,所以这些CssHack主要针对Windows操作系统浏览器,并不包含Mac等
- 网络现状的:现在网民中最多使用的浏览器是IE6,其次是IE7,再次是FireFox.所以这些CssHack主要是为了解决这3种浏览器的兼容问题
- 实用的: 阅读全文

摘要: 一个leader在团队中也应该扮演一个老师的角色,给他的队员随时随地的教育。随时随地或许很难做到,但至少我们要明白如何做这个教育,才能有效果而又不至于让自己焦头烂额。
阅读全文
摘要: 前段时间一直在封装一个权限系统,时常为如何给调用方提供一个良好的编程接口烦恼,加之前前段时间考虑的日志、异常接管、事务、缓存等等一些横向组件的架构分析,自然就想用AOP技术实现,但是由于实现难度实在不小作罢;这两天又重新学习研究了PostSharp的架构与实现思想,觉得还是尝试一下,将其融入现有框架;
我们假设有这么个场景,其实这也是实际业务中很常见的处理方式:有一定单管理模块,具备新增、删除两功能,我们在新增删除的时候必须校验权限,在删除的时候还必须记录日志,出现异常了还必须捕捉并记录异常;
顺便宣传一下我另一个用来自娱自乐的博客:
冰戈工作室(www.pvtbill.com),欢迎大家访问!
阅读全文
在OO设计中,对象有属性和方法.方法就是进行操作的一个过程,它一旦写成,逻辑也就定下来了.工作流出现后,我理解它的作用是:把对象的方法抽象出来,单独定义,从而形成工作流.
对象:人
状态:饥,饱
方法:吃,消化
工作流定义如何吃:是去家里吃,还是去饭馆吃.
要问,工作流为什么定义"吃"和"消化",而不定义"工作",这是由一个接口(用例图中得到)定义的.所以要完成这个吃,伪代码得由原来的:
某人.吃()
变成:
接口实例.吃(工作流实例,某人)
一、 定制Pipeline component的assembly的部署
定制Pipeline component的assembly不一定要放在GAC中,可以放在<biztalk install directory>\Pipeline Components目录下,但是这时定制Pipeline component所引用的其它assembly必须也放在此目录中。
如果把定制Pipeline component的assembly放到GAC中,那么定制Pipeline component所引用的其它assembly必须也放在GAC中,否则定制Pipeline component不知道去哪找到它所引用的其它assembly。
当定制Pipeline component的assembly在GAC和<biztalk install directory>\Pipeline Components目录下有存在,那么优先使用<biztalk install directory>\Pipeline Components目录下的assembly。
二、 定制Pipeline component的调试
无论把定制Pipeline component的assembly放到GAC中还是放在<biztalk install directory>\Pipeline Components目录下,都可以对定制Pipeline componen进行源代码级别调试。
为了方便,一般把Pipeline component项目的输出路径指向<biztalk install directory>\Pipeline Components目录。
1、 调试已部署的Pipeline component
对于已经部署的biztalk项目,项目中使用到了定制的Pipeline component,可以在VS2005环境下对Pipeline component进行源代码级的调试。
l 在VS2005中打开Pipeline component项目
l 将Pipeline component项目输出路径指向<biztalk install directory>\Pipeline Components目录。
l 在VS2005的debug菜单中选“Attach to Process”,如下图。在进程中选“BTSNTSvc.exe”,这是biztalk的服务进程,然后点击Attach按钮,把进程附加到VS2005。

Figure1. 附加进程
l 在Pipeline component源代码中需要调试的地方设置断点。
l 在相应的输入位置提供输入消息,以便消息进入使用了定制Pipeline component的管道,在运行到设置了断点的代码处,进程暂停,即可进行断点调试。
2、 利用pipeline.exe调试未部署的Pipeline component
如果只定制了Pipeline component,并使用这个Pipeline component设计了一个管道,即有了使用这个定制Pipeline component的btp文件,这时就可对Pipeline component进行源代码级的调试了。
这种情况需要使用pipeline.exe工具调试Pipeline component。
l 在VS2005中打开Pipeline component项目
l 将Pipeline component项目输出路径指向<biztalk install directory>\Pipeline Components目录。
l 改变Pipeline component项目的启动动作,打开Pipeline component项目的属性页。选左边debug标签,在start action下选择“Start external program”,然后点击“…”按钮,在路径<biztalk Installation Folder>\SDK\Utilities\PipelineTools中选择 Pipeline.exe,表示使用pipeline来启动这个Pipeline component项目。在Start Options输入相应的命令行参数。参数设置:
首先指定btp文件,即在管道中使用了这个Pipeline component的管道文件。
其次指定输入文件
最后指定输入文件
一个参数看上去像这样:
C:\Samples\UnzipDisassembler\PipelineTest\UnzipTest.btp -d C:\Samples\UnzipDisassembler\test.zip -t -m C:\Samples\UnzipDisassembler\out\Part_%MessagePartID%.out
l 在Pipeline component源代码中需要调试的地方设置断点。
l 把输入文件放入到参数中指定的位置。
l 按F5开始运行
三、 定制Disassembler Pipeline component的注意事项
1、 不要在代码中关闭输入stream
输入消息的stream不仅在Pipeline component,别的组件功能可能也需要使用这个stream,比如HAT跟踪组件也要使用消息stream来跟踪消息。如果在定制Pipeline component代码中关闭了stream,将会影响到HAT对消息的跟踪。
2、 在代码中保证生成的stream的当前位置放置在stream的起点
使用类似下面的代码将stream的当前位置设置到stream的起点:
myDataStream.Seek(0, SeekOrigin.Begin);
因为如果不把stream的当前位置设置回起点,还处于stream的终点处,这个stream进入到下一个stage的组件中,组件代码直接读取stream,会读不出内容,导致意想不到的结果。
3、 在定制管道组件的任何字符串变量中都不要包含换行符
在使用biztalk 2006时,在在定制管道组件的任何字符串变量中都不要包含换行符,比如”\n”,否则,在编译这个组件是会得到一个“newline in constant”错误。
摘要: 摘要:自动完成功能在Ajax时代已经见的很多了,像Google Suggest,很多邮箱中也都有应用。在Atlas对于自动完成功能提供了很好的支持,提供了客户端的AutoComplete Behavior和服务器端的AutoComplete Extender的支持。本文主要看一下使用AutoComplete Extender来实现自动完成功能。
主要内容
1.AutoComplete Exte...
阅读全文
摘要: 本系列通过通俗易懂的讲解,让您就像读小说一般,轻轻松松就能理解数字签名的基本原理和应用方法(即使您是一个并不精通计算机的企业老总,也能读懂本篇文章)。然后我们再逐步深入技术细节,最后将给出一个在B/S信息系统中使用数字签名的DEMO。
阅读全文
摘要: 可能我比较笨,,别人都在向程序员DEMO微软的MOSS是如何如何地好、方便开发的同时, 我却背道而驰在向最终用户DEMO一些让程序员吃之以鼻的原始级功能。下面我所DEMO的“白领小秘Vivien的一个上午”,是以最终用户的身份来使用SharePoint的过程。其中用到的SharePoint网站是我花半个小时创建出来的一个没有经过开发的空白工作组模板网站。
要点1:SharePoint网站日历、任务与OutLook整合方便了使用者!
要点2: 文档库模板是统一公司文档格式的最佳选择。
要点3: SharePoint网站与网上邻居的整合
要点4:SharePoint网站与WORD集成:文档管理器。
要点5:SharePoint工作流:发给部门经理批准
阅读全文
More Posts
Next page »