RSS

Monthly Archives: 九月 2007

Excel 2007 的重大bug

在水木上看到的,Excel 2007在公式计算中有一个超级弱智的大bug:

计算乘法时,当计算结果等于65535,且两个乘数中有一个是小数时,有些时候结果会变成100000……

image

真是不知道产品组是怎么搞的。。。这种毫无理由的bug。。。

想当年似乎有一种计算器还是计算芯片,当计算两个特定的数相乘的时候,结果是错的

 

Posted by on 2007 年 09 月 27 日 in 未分类

Leave a comment

Tags:

FriendlyQuery正式发布

可以像写SQL语句那样来写CAML查询,点击这里免费下载。

我没有经过太大量的测试(没有覆盖到每种可能的分支),目前还处在beta版,欢迎大家试用。

如果有什么问题,可以在这里回复,或致信通向分享:feedback(at)CollaDec.com。感谢支持!

 

其实之前也有一些国外的人做了一些生成CAML查询的东西(毕竟CAML还是太难写了,主要问题倒不在于xml,而在于那些内部名称)

不过看了一眼之前的那个CAML Generator,本质上还是像xmlwriter那样去加那些结点,而且没有解决内部名称的问题

然后想写一个客户端去生成CAML,就像SQL Server里做视图的那样,后来觉得还是不太方便,索性打算写一个直接像SQL那样的语句去直接查询内容

其实这个东西的核心内容就是一个T-SQL语句的解析器

之前一直想不好怎么做比较方便,也参考了一些开源的解析器,帮助不是很大,这也是拖了很久的原因。

最近在做实验室的程序的时候做了类似的东西,于是借着手熟就顺手写了

主要就是借助几个数组去存那些查询字段、查询条件、排序字段、分组字段,

手写了一个状态机(懒得再去找开源状态机组件了,而且还得再带个dll,比较麻烦),标记出每个成分后面允许的内容(比如在select后面的返回字段后面,可以是一个逗号,也可以是where、order或者group),难度并不大,只要想清楚了就是个体力活。不过估计这个状态机应该还能再精简一些,等有空再分析分析吧。

另外一个比较核心的部分就是查询表达式的处理,把那种查询条件转换成xml格式的,这个其实就相当于表达式计算问题,随便找本数据结构的书上应该就有(分成两步:中缀表达式转后缀表达式、后缀表达式的计算)。

然后就是把那些列表名称、字段名称该分析的分析、该转换的转换,这个就很容易了。

下一步对这个的打算,除了找找bug、优化一下算法,可能考虑添加对跨列表、跨网站查询的支持,以及对moss中search的支持(这个可能比较麻烦)。

给个小sample:

SPWeb web = SPContext.Current.Web;
string queryStr = "SELECT * FROM 通知 WHERE ID>10";
FriendlyQuery query = new FriendlyQuery(web, queryStr);
query.RowLimit = 100;
query.Scope = FriendlyQuery.QueryScope. AllItemsAndFolders;
SPListItemCollection items = query.GetItems();
foreach(SPListItem i in items)
    Response.Write(i.Title + "<br/>");
 

Posted by on 2007 年 09 月 16 日 in 未分类

Leave a comment

Tags:

FriendlyQuery即将发布!

你还在为SharePoint中那麻烦的查询语句而烦恼么?

你还在由于不熟悉CAML而厌恶查询么?

你还在为了查询去到处翻找一个字段的内部名称么?

 

现在不必了!

有了CollaDec即将发布的FriendlyQuery类库(免费的),让你像写SQL查询那样方便地完成SharePoint列表的查询和排序,你不需要了解CAML、不需要知道那些杂乱的内部名称,只需要简单地写上一行,就能大量地解决你的开发时间。

 

也许原来你会写出这样冗长且超级难读的CAML查询串:

<Where><And><And><Or><Geq><FieldRef Name='_0x006e_um1' /><Value Type='Number' >15</Value></Geq>
<IsNull><FieldRef Name='_0x006e_um1' /></IsNull></Or><Eq><FieldRef Name='CreatedBy'/><Value Type='Integer'>
<UserID Type='Integer' /></Value></Eq></And><Gt><FieldRef Name='_0x1111__0x2222__0x3333__0x4444__0x5555__0x6666_' />
<Value Type='DateTime'><Today /></Value></Gt></And></Where>

 

但是现在,只需要用这种形式:

SELECT 标题, num1, [now] FROM 列表A

WHERE

(num1 >= 15 OR num1 IS NULL) AND 创建者 = ME AND 过期时间 > TODAY

 

敬请关注CollaDec,本Blog,以及OTEC

 

Posted by on 2007 年 09 月 14 日 in 未分类

Leave a comment

Tags:

版本控制 + 文档比较

版本控制和文档修订留痕的比较是在文档管理中很重要的组成部分。在SharePoint中,版本控制是默认支持的。在mdms2003中,利用word2003的文档修订功能,以及event handler实现了将文档的修订留痕保留到SharePoint中的功能。在mdms2007中,也用了类似的方法。

但是熊总那天突然发现了word2007一个非常好的内置的版本比较功能,完全可以通过客户端来替代那种简陋的文档修订留痕记录。而且它支持和SharePoint中的文档版本做比较。(word果然是一个很强大的东西,只不过有80%的功能我们从来都没有用到过……)

比如在文档库中的某篇文档,其版本记录如下:

image

我们在线打开这篇文档(只读或者编辑都可以),然后使用版本比较功能:

image

这里可以和SharePoint上该文档的上一个主版本或者最新版本、或者任意的一个版本之间进行比较。我们选择1.0版本:

image

可以选择比较过程包含哪些内容。之后会打开一个很友好的页面列出两个版本的文档中有哪些地方不同(并可以方便地在几个不同处自由跳转)以及两篇文档的原文。(注意在原文中并不是通过修订的方式来修改的,也就是说版本间的差异是通过相似度计算得到的结果)

image

并且,我们可以把比较的结果(包含两个版本的差异)另存成一份文档保存下来(这个就不截图了)

总结!这是一个很有用的功能!不过也是有缺点的,就是文档版本的比较粒度不够细,是在句子和句子之间进行比较的,而句子中究竟修改了哪个词,只能靠人眼去看了。

 

Posted by on 2007 年 09 月 12 日 in 未分类

Leave a comment

Tags:

终于开始写技术博客了

在我以懒为借口的前提下,平时只是极其偶尔地更新一下普通的blog,写个游记、写个小说连载、接个镖什么的。然而就在懒洋洋地晃悠之间,发现周围的一票人都变成MVP了……

So, ……

 

Posted by on 2007 年 09 月 12 日 in 未分类

Leave a comment

Tags:

终于搞定了Protocol Handler…

根据熊总的指示和安排,在关于Search的startkit中,有关于IFilter和Protocol Handler这两大部分的内容。与一般的SharePoint开发不同的是,这两个关于Search的扩展是深嵌在底层的,需要直接使用C++的COM来编写……无奈我不会COM……不过至少看一看代码改一改还是可以的。实际上不论是IFilter还是Protocol Handler都不是SharePoint中的新生事物,早在windows desktop search中就有这俩东西的身影了(尤其是IFilter)。

IFilter比较顺利,网上的资料也比较多,虽然网上没有sample,但是可以从windows的sdk中找到几个例子,有简单的也有复杂的。于是照猫画虎地研究了一把mp3格式,写了一个mp3的IFilter。如果有机会地话再详细介绍IFilter吧。

而Protocol Handler这个东西就比较麻烦了,复杂程度不是IFilter可比的(实际上在Protocol Handler中,是包含了一种特殊的IFilter的),网上的资料很少,更别提sample code了。翻遍google和各个blog,只找到了一个用C#来编写的东西(来自John Kozell),不过这只是一个框架,没有实质的内容。我按照这个框架尝试写了个例子,无奈在moss上跑不成功,并且把moss的搜索给搞死了……于是只好等待。

(提外话,其实在SharePoint2001的sdk中,有一个Protocol Handler的例子,但是这个sdk已经找不到下载了……)

终于前些天等到了2007的SDK 1.2版发布,其中激动人心地包含了一个Protocol Handler的例子,拿过来翻了一遍代码,功能并不复杂,只是换一种方式实现了共享文件夹的搜索。但是,且不说这个sample毫无说明文档(那个readme.txt不算),当我试图编译它的时候居然编译都编译不过去……改吧了好几天终于在昨天晚上成功搞定,以下为内容。

这个sample编译不过的主要原因,是因为缺了一个资源文件:SampleProtocolHandler.rc(在readme里还有关于它的说明)。其实如果换一个对COM和ATL有些了解的人,估计搞这么个东西应该不费吹灰之力。关键是我不会COM……

该文件我放在otec上了,解压后请自己改个扩展名…… 地址:SDK 1.2中Protocol Handler Sample中缺失的文件

用这个rc的时候,需要把那个工程中资源的语言改成中文(0x804),当然把rc的语言设置改了也行。

几个关键问题:

1、由于我是在本机编译代码放到虚机上执行的,但是由于虚机上没装vc8(就是vs2005对应的C++),由于在vc8中,编译结果嵌入了manifest清单(这么干的目的是为了防止dll hell,从xp后设计出了一个类似于GAC的WinSxS[Side by Side]),所以要想在没装vc8的环境下运行vc8的程序或者使用其dll,必须先在环境中把对应的东西放到WinSxS里。方法很简单,在装了vc8的机器上,在vs的目录里有SDK\v2.0\BootStrapper\Packages\vcredist_x86这个目录,在需要部署的机器上运行里面的vcredist_x86.exe就行了,会把需要的那些dll扔进winsxs里。

2、在注册COM的时候,一般都是使用regsvr32.exe xxxxx.dll去注册的,实际上是调用了DllServerRegister方法。在sdk的那个sample中,注册表信息是写在那个rgs文件里的,按道理说rgs应该是在.rc中被引用,然后编译成.res,被链接到dll中。由于缺失了rc文件,所以这个注册信息没有写进去,导致了regsvr32注册失败,错误号0x80070715(没有资源)。补上rc后,发生了0x80070716,在资源内没找到注册信息,看了一眼发现是多写了俩引号……。再改再编译再注册,发生了0x80029c4a,未找到tlb文件。原来注册atl的com还要带着tlb啊……把tlb拷过去,终于注册成功了。

其实这里所谓的注册无非就是在注册表里填一些内容,如果有耐心的话,手填也行……我一开始就是手填的……

3、在moss中,新的Protocol Handler要新建一个内容源来跑,但是在管理中心中,没有out-of-box的界面去添加自定义的内容源类型。好在sdk中还有另一个例子是如何添加自定义内容源,这个就不多说了。

放个截图:

image

(爬网日志去爬那个sample://协议)

image

(搜索结果。可以看到除了搜到了sample协议,而且还搜到了mp3里面,这个归功于之前写的mp3的IFilter)

小知识:

IFilter:IFilter是在搜索时按照相应的文件类型、clsid或者progid去搜索该类文件内部的一个插件。在moss中提供了常见的一些IFilter,比如office文档、txt、html、xml等,在搜索时,可以对这些文档进行全文检索。第三方的IFilter主要有pdf和autocad的。其实在windows桌面搜索中已经用到了IFilter技术,在“我的电脑”中进行搜索的时候,会有一个搜索条件是文件内容包含什么什么的,这个地方就是利用了同样的IFilter来检索文件内部的。

Protocol Handler:在moss中进行爬网搜索的时候,会根据不同的类型采用不同的方式进行爬网,默认提供了对于http、sharepoint、exchange public folder、共享文件夹等类型协议的支持。在默认安装了moss搜索后,其支持的协议有:bdc、bdc2、file、http、https、rb、rbs、sps、sps3、sps3s、spsimport、spss、sts、sts2、sts2s、sts3、sts3s这些,可以看到有很多都是sharepoint自己的爬网协议。不同的协议采用了不同的Protocol Handler进行爬网。

 

Posted by on 2007 年 09 月 12 日 in 未分类

Leave a comment

Tags: