•   1. 扩展标签跳转词法tag*
         在标签实体集 TagCatSet 中允许标签为 tag* 通配符号形式,表示所有以 tag 开头的标签。
         解释:所有以tag开头的标签
         实现:标签以*结束则在 SQL 查询中将 Tag = 'tag' 改为 TAG LIKE 'tag%' 即可。

         整理:标签跳转十种用例:
               domain/, user:, domain/tag, user:tag, tag,
               domain/*,user:*,domain/tag*,user:tag*,tag*
         标签跳转词法范式:[domain/ | user:][tag][*]

      2. 邮件ElementPop3系统改进
         增加从服务器删除标识为 uid 的邮件的函数 DeleteEmail(uid)。
         暂时设置为: 在邮件列表中,如果“永久删除”邮件,除在 EOffice 中永久删除外,在邮件服务器中也
         永久删除。在 ElementPOP3 类中增加 DeleteEmail(uid) 方法, 已经实现。UID 是 POP3 协议里的一条
         命令“UIDL i”所获取的邮件服务器中第 i 封邮件的“唯一标识UID”,L 是List列出的意思。

         问题:邮件数据库 Email 中没有 UID 字段,邮件类 Email 也没有 UID 属性,如何改造?

      3. Miscs
         1) 调试 eleMentFile 路径返回错误
            ' 仍然有问题,如 ReadDoc.aspx?DocID=°?à???×?[2008]??0003,干脆采用 AbsoluteUri
            mur = Page.Request.UrlReferrer.AbsoluteUri
            AppLog.WriteInfo("Mur: " + mur)
            EOffice/common/file/FileMgmt.aspx?cat=public&dir=%E5%9B%BE%E7%89%87
            混乱,还是采用 Page.Request.UrlReferrer.ToString 函数!
         2) 什么是众包(crowdsourcing)?
            众包(crowdsourcing)是互联网带来的新的生产组织形式。连线(Wired)杂志2006年发明的一个专业术
            语,用来描述一种新的商业模式,即企业利用互联网来将工作分配出去、发现创意或解决技术问题。

  •   1. 标签UI创新实践
         1) 做出TagsRelation页面可自由拖拽组织Tag的分类目录;
            模型:如果说元数据表Misc反映的是棵分层的树的话,则Tag表则反映的是实体间网状图关系;
            也可以折中以导航条形式出现。
            标签合并过滤,目前是在 Entites.Tags 赋值时处理的;
         2) 新的 TagsLabel 计算算法
            颜色层次,字体大小,浮动处理(OnMouseOver);
         3) 真正的标签云图 TagsNephogram 图形布置算法

      2. 系统标签的自动生成
         1) 定单号、客户编号
         2) 用户姓名、部门名称、角色名称、客户名称;
         3) 文件目录名称
         4) 系统自动生成实体标签的方式
            a. 从已有标签中检索是否实体包含,扩展标签实体;
            b. 从实体属性中自动分词生成标签,扩展实体标签;
         5) 实体分两类
            a. 传统的类继承实体实现,如目前的标准六类标签实体;
            b. 泛实体,不继承实现,只通过元数据做连接关联,这需要增加泛标签实体表 TagEntity,实现目前
               标签实体视图 TagEntityView 的标准字段,以用于记录系统自动生成实体标签的方式, 分类及其
               阅读连接信息则通过 Misc 元数据加以管理。
         6) 系统标签是否需要标志?
            比如在标签中加前缀*表示。

  •   1. 标签改造续
       v 1) 标签跳转词法:domain/user:tag
            表示跳转到域 domain 用户 user 的标签 tag 上去,今日实现。如果标签为空或*则只转到域中。 既
            可在 Tags 中也可在 TagDetail 中跳转,处理逻辑统一在 TagCatSet.TagsUrl 方法中。
         2) 是否根据时间段过滤标签?
            这与“热门标签”的计算有关,因为所谓“热门”是相对于时间段的。
         3) 是否在标签实体列表中增加“关联标签”视图?
            关联标签 Related Tags,这涉及标签集合的合并问题。

      2. 完善标签帮助文本
         Tags 标签视图页面:
         本页可按照标签顺序列出全部 [我的标签]、[公共标签] 或 [用户标签],此三类标签称为 [标签域]。使
         用频率高的标签其 [标签权重]也大,以大字号显示。选择 [实体分类]过滤框可按分类过滤标签,缺省为
         全部。所谓标签实体分类就是类似日志、文档、主题、联系人、客户、邮件之类拥有标签功能的 EOffice
         实体。[标签排列顺序]缺省是以标签字母倒序排列,也可在下拉列表中选择不同的排序。点击某个[标签]
         或在文本框中直接输入标签可  [跳转]  到该标签的  [标签引用]  详细页面, 在标签前加用户标识:,
         如 abby:mp3,public/mp3,abby:* 可分别跳转至用户域和公共标签中的该标签实体列表,如果标签为空
         或*则只跳转至相应域的标签列表。

         TagDetail 标签实体列表页面:
         本页列出 [我的标签]、[公共标签] 或某 [用户标签] 关联的所有实体, 此三类标签称为 [标签域]。点
         击 [实体分类] 可浏览该分类的所有标签;点击 [实体名称] 或 [实体标题] 可阅读该实体详细信息,点
         击其后的 [关联标签],可查看关联标签对应的所有实体。 在输入框中输入新标签按 [跳转] 可跳跃至新
         标签,在跳转标签前加用户标识:,如abby:mp3,public/mp3,private/mp4 可分别跳转至用户域、公共
         域或私有域中的该标签实体列表,如果标签为空或*则只跳转至相应域的标签列表。按不同的 [标签域]可
         转至另外域中的同一个标签实体列表。 只有自己的标签可以重命名或删除, 在输入框中输入新标签名按
         [重命名] 可将当前标签全部重新命名为新标签,按 [删除] 可全部删除自己的当前标签。

  •   1. 标签操作总结
         1) 已经实现:重命名、删除、标签跳转、标签分类、排序、领域跳转;
         2) 尚未实现:标签同义词、标签信息、标签历史、关联标签、热门标签;

         标签除了可以删除、重命名操作外,还有关联标签、热门标签、标签关注、附加标签等操作,例如同义词
         的操作即可用附加操作实现。另到了考虑启动RSS订阅源项目、小博客的时候了。

         为何不去掉 Domain 参数?
         UserID=他人,无则为公共,UserID=为我的
         什么叫热门标签?需要最近时间段限制吗?RegDate > '2009-07-01'

    v 2. 标签权重计算算法
         1) Weight
            weight = (cnt - minw) * deg / (maxw - minw)
         2) Rank
            根据 SequenceNo 计算权重,而非
         3) CSS 方案参考 Delicious
            111111  333333  444444  666666  777777  AAAAAA

    v 3. 系统更新注意事项
         1) 首先在老系统上检查 dsz 所能看到的日志清单,并影印记录;
         2) 备份原系统;
         3) 再更新系统,检查 dsz 所能看到的日志清单,并与1)影印记录比队;
            SYA6ftLoccaLbE1uNdkK8Q==
            答案:完全吻合;
         4) 比对结果吻合,则正确;否则检查错误,直至完全无误或确能解释差异,否则则恢复原系统;

  • v 1. 统一 Tags/MyTags 页面
         1) 增加参数 Domain=Private/Public 来区别即可。
         2) 增加排序方法选择:权重频率、最早创建、最近引用;

    v 2. 统一 TagDetail/MyTagDetail 页面
         1) 增加参数 Domain=Private/Public 来区别即可。

  • v 1. 实体四类标准权限Privilege的统一处理
         实体标准四类权限是 EOffice的核心概念之一,看来将这些权限控制措施标准化的时间到了!通过昨日对
         日志权限处理的分析与改造,已经有了基本概念,事实上这要上升到标准化“抽象实体”的层面,并作为
         重要的EOffice基础设施加以建设。
        
         1) 是否考虑增加数据库的标准函数
            比方说:和 dbo.IsOnesReporter 一样,需要增加 dbo.IsShareWith(viewerID, userID) 函数,以确
            定实体作者 UserID 是否可以共享给阅读者 ViewerID 阅读。
            答案:暂不统一处理,因为这会降低查询效率。最终方案采用系统化方法,见2.4节。

         2) Contact 的共享失效
            联系人视图也要支持标准四类权限 Privilege,和以上1/2问题一样。
            处理完毕,采用最新的统一处理方式,见2.4节。

         3) 共享的严格定义
            部门内部可以查看
            问题a:共享关系是否对称?
            解答: dbo.DepContain(did, u.DepID) = 1 OR      '   同父部门或
                   dbo.GetLeaderDep(ViewerID) = u.DepID OR  '   子部门经理或
                   dbo.IsTopDep(did) = 1                    '   总办人员
                   显然是不对称:总办可看各下级部门人员,但底下除一级部门经理外不可看总办的;
            问题b:部门经理的共享是双向共享,是否与定义冲突?即所领导部门可看,同时上级部门也可看。
            解答: 不冲突,他的任何行动本身就是上传下达的。

    v 2. 共享比较三函数改造
         1) DepContain 部门包含,意味着直接上级部门;
            意味着他们可以阅读直接下级部门的共享实体,仍然沿用原 SQL 函数处理方式;
         2) GetLeaderDep 求出领导部门函数
            直接放进 EOffice 管理系统的 User.LeaderDepID 函数,放弃以前 SQL 动态函数 dbo.GetLeaderDep
            方法,加快计算速度。算法本身也放弃以前的烦琐方法,简化为:
            a. 若阅读者为顶层部门,则返回顶层部门;
            b. 若不是经理,则返回本部门;
            c. 若父部门为空,则返回顶层部门;
            d. 返回父部门。
            函数 dbo.IsTopDep 则直接采用 DepSystem.GenDepID = did 来判断即可。
         3) 这样类 TagsView/TagCatSet 就要放进 EOffice.Manage 程序集的 Tag.vb包里了,因为用到管理系统
            的对象和方法。
         4) 改造后的标准格式为,消除开始的 @tid/@lid/@did 的计算。
            Dim vwr As User = UserSystem.GetUser(ViewerID)
             + "   OR c.Privilege = '1S' AND ( " _
             + "     dbo.DepContain('" + vwr.DepID + "', u.DepID) = 1 OR " _
             + "     '" + vwr.LeaderDepID + "' = u.DepID OR " _
             + "     '" + vwr.DepID + "' = '" + DepSystem.GenDepID = "' ) " _
             + "   OR c.Privilege = '1W' AND " _
             + "     dbo.IsOnesReporter('" + userID + "', c.UserID) > 0 " _

  • v 1. 关于抽象标签实体 TagEntity 权限问题的进一步处理
         先参考日志“工作、共享”权限的处理,作出进一步的分析,以实现抽象标签实体的类似权限处理。
         1) dbo.IsOnesLeader
         2) Reporter
         3) User.DepID
         这样可解决大部分问题,论坛的私有就是部门“共享”,客户全是“工作”,邮件全是“私有”;这样只
         剩下文档的处理稍微复杂,文档的批阅参与人等复杂权限处理问题先暂时搁置。

    v 2. 日志的阅读权限选择
         ' 计算阅读人部门 did, 必须指定阅读者 _ViewerID
         Dim did As String = UserSystem.GetUser(_ViewerID).DepID
         ' 阅读权限选择规则:
         '   日志是本人的、或日志权限是公共的、或日志权限是共享的且:
         '     阅读者是(同部门、或父部门、或子部门经理、或最高部门)、
         '   或日志权限是工作的且:
         '     阅读者是日志作者的汇报人。
         str += "    AND (d.UserID = '" + _ViewerID + "' " _                        ' 本人的
              + "      OR d.Privilege = '0C' " _                                    ' 公共的
              + "      OR d.Privilege = '1S' AND ( " _                              ' 共享且
              + "        dbo.DepContain('" + did + "', u.DepID) = 1 OR " _          '   同父部门或
              + "        dbo.GetLeaderDep('" + _ViewerID + "') = u.DepID OR " _     '   子部门经理或
              + "        dbo.IsTopDep('" + did + "') = 1 ) " _                      '   总办人员
              + "      OR d.Privilege = '1W' AND " _                                ' 工作且
              + "        dbo.IsOnesReporter('" + _ViewerID + "', d.UserID) > 0 " _  '   是其汇报人
              + "    )"

    v 3. 标签与实体权限的统一处理
         实体标准四类权限是 EOffice的核心概念之一,看来将这些权限控制措施标准化的时间到了!
         2节讲的是日志处理的情形,事实上这要标准化到“抽象实体”的层面。
        
         以下是根据日志系统对实体标签 TagsView/TagCatSet 的临时改造:
         str = "DECLARE @tid AS VARCHAR(8), @did AS VARCHAR(8), @lid AS VARCHAR(8); " _
             + "SELECT @tid = DepID FROM Department WHERE Layer = 0; " _
             + "SELECT @did = DepID FROM [User] WHERE UserID = '" + ViewerID + "'; " _
             + "SELECT @lid = dbo.GetLeaderDep('" + ViewerID + "'); " _
             + "SELECT a.Category, Name = m.CValue, a.Cnt, " _
         ...
         str += " AND (e.Privilege = '0C' " _
              + "   OR e.UserID = '" + ViewerID + "' " _
              + "   OR e.Privilege = '1S' AND ( " _
              + "     dbo.DepContain(@did, u.DepID) = 1 OR " _
              + "     @lid = u.DepID OR @did = @tid ) " _
              + "   OR e.Privilege = '1W' AND " _
              + "     dbo.IsOnesReporter('" + ViewerID + "', e.UserID) > 0 "
     
         实验经认真反复测试获得通过,但问题是同样权限逻辑处理要反复处理,不漂亮。

    v 4. EOffice改进
       v 1) PUMR 入口参数冲突的解决
            最终保存是在 NG 的 PumParam 插入的,Dok.Send完后,PUMParam 采用 vDocID 而非文档 Dok.DocID
            文档号,就是说没有解决 DocID 文号占用问题。同时 PUMParam 的 DocID 应该和 Doc 表一样是唯一
            的才对,没有设置也是导致该错误拖至今天的原因。
       v 2) zhjl 作为经理为何看不到 xzjl 下级部门经理的工作周报
            答案:总办的二级部门相当于一级部门,需要老总才能看到,果然如此!

  •   1. 标签的与或运算分析
         标签同义词先采用英汉翻译库Word表
         比方说“software”同“软件”,“Tag”同“标签”等,如下查询语句:
           select * from Word where Word = 'tag'
           select * from Word where Explain LIKE '%标签%'
           select * from Word where Word = 'software'
           select * from Word where Explain LIKE '%软件%'
         测试结果如下:
           tag n.特征,标记,标识符 t5g
           label n.标签,标号,标识符 'leibl
           software n.软件 's6ftw43
           package n.插件,(软件)包 'p5kid=
           software n.软件 's6ftw43
         同义词就是“标签或”查询,其逻辑如下:
           SELECT e.Category, e.EntityID, e.Title, e.UserID, e.RegDate, e.Tags
             FROM (
               SELECT DISTINCT Category, EntityID
                 FROM Tag
                 WHERE Tag IN ('Glossary', '术语', 'SCS', 'Term')
               ) t
               LEFT JOIN TagEntityView e ON t.Category = e.Category  AND t.EntityID = e.EntityID
         “标签与”查询逻辑如下:
           SELECT Category, EntityID, Title, UserID, RegDate, Tags
             FROM TagEntityView
             WHERE CHARINDEX(' Glossary ', ' ' + Tags + ' ')>0
               AND CHARINDEX(' 术语 ', ' ' + Tags + ' ')>0

         SQL近似度查询
           SELECT DIFFERENCE('DEL', 'DELETE') 返回 3,0~4越高越相似,但对中文无效。其原理是基于发音的
           SOUNDEX 函数,该函数返回发音四位字串,DIFFERENCE 则求出四个中有几个相同,最多相同为四个。

      2. 文件系统 eleMentFile 新功能设想
         1) 是否考虑PDF的在线阅读?
            将 PDF 作为图片浏览
         2) 目录的播放,或文件集合的播放
            如“jyc*.jpg”的浏览,“MP3目录的播放”等;
         3) 压缩文件包作为虚拟目录的支持
            增加 rar/zip 文件的浏览支持;
         4) 是否考虑将文件也设计为实体?
            a. 增加文件库 Download 的索引 DownloadID/PubID/PubDate/FilePath;
            b. 在表 Download 中增加 Tags 字段;
            c. 在 TagEntity 视图中增加 Download 数据;
            d. 在 ElementFile 中增加 Tags/User/PubID/Name 的相关处理;
            e. 在 Entity 的相关函数中增加 Download.Tags 的相关处理;
            f. 整合 Download 表,看是否改 PubID 为 UserID? 消除 FilePath 的 EnterpriseID 部分;
            g. 有必要建立标准的 Download 类吗?
      
      3. EOffice改进
         1) 在用户首页中增加“用户心情、自我介绍”的点击编辑的 Ajax 改造;
            在“用户心情”后增加到 MiniBlog 的连接;
            在照片底部增加“<<…更多…>>”按钮;
            在日历的“用户心情”中的点击编辑的 Ajax 改造;
         2) 我最近的活动 Recent Activities 功能;
            暂时放置与个人办公的“待办事宜”底部;
         3) 标签页 Tags/MyTags 统一,允许选择排序方式,和标签实体 TagDetail一样,将控制条放在前面并采
            用 TabMenu 用户接口模式;

      4. IBM动态业务流程管理(BPM)是企业优化业务绩效、实现业务敏捷的利器。
         IBM的“智慧”术,的确比较利索!今早报名“IBM智慧运作与业务敏捷”巡展,报名就是一个点击即可完
         成。按照道理讲发送的商业邮件当然知道你是谁,整个系统的设计的确是有点“智慧”!并且实现该报名
         过程的是第三方的ogilvy公司,这需要多方流畅可靠的“网络服务”的设计支持。

  • v 1. 关于标准标签条TagClick的重定义问题
       v 1) 标准标签条 TagsLink 计算中的 TagClick既有公共定义,也可以在本地页面重定义,这个主义很好,
            这可以因地制宜地使用标签连接。
       v 2) 再同样处理标准标签按钮,增加 TagDomain 函数与之对应
            同样在公共客户端工具库 eleMentCalendar.js 文件中增加 TagDomain 的公共定义为 MyTags.aspx,
            这正是目前的做法,但目前不能改正,因此需要客户化地灵活定制才行。
       v 3) 标签文本条 TagCatSet.TagsLabel 计算中的 TagClick 已经在所在标签视图的计算中自动化地定义好
            了连接,因此无须关心。
       v 4) 修改页面的 TagDomain()
            <SCRIPT>
              function TagDomain() { window.location = "../../Tags.aspx"; }
            </SCRIPT>
            增加到如下三个页面:TopicDetail/DiaryDetail/ReadDoc

    v 2. 深化角色汇报关系
       v 1) 系统现有某人的下属用户视图 ReportUserView,在 UserRole->UserRepoter 连接页面中使用;
       v 2) 在 RoleUser 页面的角色介绍中增加子角色列表输出;
       v 3) 在 Role 类中,增加某角色的下属角色 RoleReportView 视图, 一个角色当然可以有多个角色向其汇
            报工作;
       v 4) 可以考虑在 RoleUser 增加子角色管理,现在只能手工设置;
       v 5) 完善角色变更方法 RoleSystem.UpdateRole(rid, ...) 的参数指定。
         6) 是否可考虑仿照 RoleUser,也将 UserRole 的下属按钮 UserReporter 合并进来?

  •   1. 标签问题实施的一年总结
         如下是去年12月写的“统一的EOffice标签Tags系统初步设计”文本罗列,先做总结如下:

       v 1) 增加Tags页面,由Tag的标准图Logo连接过来
         2) 做出TagsRelation页面可自由拖拽组织Tag的分类目录;
            模型:如果说元数据表Misc反映的是棵分层的树的话,则Tag表则反映的是实体间网状图关系;
       v 3) 记录选择范围:某人的(含我的)日志标签、某群人(含部门、组)的日志标签;
       v 4) 让所有的组织实体都由Tag标签,且所有Tag处理都放进实体基类Entity里;
       v 5) 修改数据库DiaryTags表为独立的可扩展的Tag表
       v 6) 扩展Tags到一个具体应用,选择Topic的分类处理作为实验性扩展项目;
       v 7) 安全与效率问题。当系统数据庞大时,如何确保这些问题纠缠在一起时的效率不致出现问题呢?
       v 8) 未来的组织实体大设计设想,可以统一的操作的确有很多,目前能想到的就有四类处理:
            “附件处理、访问统计、标签处理、评论处理”。

         现只完整实现了1/4/5/6四个问题,另外8“访问处理、标签处理”的统一,3/7的私有与公共,2还完全没
         有开始,只能说仅仅过半而已。关键问题是缺乏应用的群众基础与广泛的实验数据。

         几个新问题:
         1) 能否考虑将实体与如下两类处理也结合到一起?
            实体的“粘帖与复制、我关注”;
         2) 用户也是一种实体,而目前用户的标签是自动计算出来的,即所谓“我的公共标签”概念, 这与以前
            设想的“自动标签”是个怎样的关系?
         3) 标签的“同意词”、“多语言同意”、“标签筐”问题;
            如“Product”、“Production”、“产品”的标签归并问题;
         4) 标签与搜索关系问题
            如“标签自动化”问题,“标签查询词法问题”,如 "News + Product" 等。
         5) 关于实体集合标签的计算问题
            论坛的标签就是一个典型的实体集合的标签集合,该问题自然与前面的问题3是相关的;
            此外的应用,如部门的标签就是部门内每个用户标签的并集;
            再如,关联标签,就是拥有某个标签的实体的集合的标签的并集;

      2. EOffice问题与改进
       v 1) 目前用户管理中,所有部门共有2255个用户,而实际上共有2267个用户, 理论上讲这差出来的12个用
            户应该是已关闭的2个部门的用户,这需要验证。
            答案:实际关闭部门的用户,11个全为离职用户, 另外2267多出1个WPDF.VeryfyUser多出来的记录。
                  以下查询的是13个,包含系统部门(DepID=#)的两个用户,实际为11个。
                  SELECT * FROM [User] WHERE DepID IN (SELECT DepID FROM Department WHERE Type='#')
       v 2) 暂停的用户不可再为其分配角色,当然也就不可删除其角色,这有必要吗?
            答案:暂时保留离职用户的历史分配记录是有必要的,因此不必再为其分配角色是有必要的。
            解决:a. 关闭用户管理页面的 UserMng 分配权限;
                  b. 角色用户分配页面的 RoleUser 的离职用户本来就已经过滤;
         3) 标签的排序方法允许用户选择
            目前可实现的四种排序方法如下:
            “标签字母顺序”、“按频率顺序”、“按出现早晚排序”、“按活动新旧排序”
            这留待 MyTag*/Tag* 页面统一后集中处理。
       v 4) 统一处理标签文本条TasgLabel的对齐方式为Justify
            TagsView.TagsLabel 增加 <DIV ALIGN=Justify>...</DIV>
       v 5) 成员日志列表 DiaryMemberView 中增加标签 Tags 列。

      3. Miscs
         数据库中自定义的数据类型的应用
         如 UID 表示UserID,这似乎可以用来解决UID的统一变更问题!目前严格使用的仅有 Email 表采用了UID
         的自定义数据类型。

         在新浪的首页和体育版中全国运动会找不到连接,却只能看到什么意甲、NBA之类的体育麻醉品。 看来除
         了这体育外,媒体也开始了自甘堕落。过去人们讲中国人只能评论国外的政治,看来现今这体育也开始愚
         民了。

  • v 1. 是否考虑让 TagClick 标准化为到“我的标签实体列表MyTagDetail”页面?
         1) 理由:目前的实体过滤已经由标签下拉列表进行了,不必重复。
         2) 优点:这样做的好处是统一处理,不必再在每类页面下进行独立的 TagClick处理了;并且当有页面出
                  现两类实体标签时,会出现冲突。
         3) 缺点:是每类页面要想获得标签过滤必须进行各自的标签下拉列表的处理。
                  点击了他人日志的标签,跑到的我的标签实体列表,有意思吗?
         4) 解决:目前没有进行该处理的实体页面只有日志管理 DiaryMgmt 页面,改造好后刚好也就解决了以前
                  一直困扰的 *Tag:Agent 模仿搜索不精确问题。
         5) 问题:a. 保留两个版本的 TagClick 函数会是什么状况?答案:以本地为准!
                     先暂时只保留 FileStatus/FileProcess 的两个本地 TagClick 做实验。
                  b. 标签下拉列表长度是否限制?

    v 2. 标签实体列表中,让分类按其最近时间 LastDate 倒排。
         核实一下标签下拉列表的顺序问题,答案:以使用频率高低为序:
         TagList.DataSource = Entity.CatTagsView("Customer")
           TagList.DataValueField = "Tag"
           TagList.DataTextField = "Tag"
         TagList.DataSource = Entity.CatTagsView("Contact")
         TagList.DataSource = CurForum.LoadTagsView()

    v 3. 增加公共标签 Tags 页面
       v 1) 在我的标签实体列表中增加公共标签跳转按钮;
            在 TagEntityView 中增加实体权限 Privilege 字段,来抽象平滑处理实体间不同的权限安排;
            问题比较复杂,是留待以后处理还是先简单处理?这涉及到标签是否能够共享的问题!
            标准四类权限Privilege:0C 公开,1S 共享,1W 工作,2P 私人
            文档的三类密级 SecLevel:0PT 普通,1MM  秘密,2JM  绝密
            论坛权限二类型:0 开放论坛,1 私有
       v 2) 权限抽象平滑统一分析
            日志 Diary.Privilege        原四类标准权限:公开,其它三类标准权限;
            文档 Doc.SecLevel           公开,否则:发起人、批阅人、收件人;
            主题 Topic:Forum.Privilege  公开,否则:部门上下领导部门;
            联系人 Contact.Privilege    公开,其它三类标准权限;
            客户 Customer:Reporter      工作:汇报关系;
            邮件 Email Private          私有;
            统一抽象为“原四类标准权限 0C 1S 1W 2P”
       v 3) 视图修改 CREATE VIEW dbo.TagEntityView AS
            SELECT Category = 'Diary', EntityID = CAST(DiaryID AS VARCHAR(32)),
                UserID, RegDate, Title, Tags, Privilege
              FROM Diary WHERE NOT Tags IS NULL
            UNION ALL
            SELECT Category = 'Topic', EntityID = t.TopicID,
                t.UserID, RegDate = t.SponseDate, t.Title, t.Tags,
                Privilege = CASE f.Privilege WHEN 0 THEN '0C' ELSE '1S' END
              FROM Topic t LEFT JOIN Forum f ON f.ForumID = t.ForumID
              WHERE NOT Tags IS NULL
            UNION ALL
            SELECT Category = 'Contact',  EntityID = CAST(ContactID AS VARCHAR(32)),
                UserID, RegDate, Title = Name, Tags, Privilege 
              FROM Contact WHERE NOT Tags IS NULL
            UNION ALL
            SELECT Category = 'Customer', EntityID = CustomerID,
                UserID, RegDate, Title = Name, Tags, Privilege = '1W'
              FROM Customer WHERE NOT Tags IS NULL
            UNION ALL
            SELECT Category = 'Doc',      EntityID = DocID,
                UserID, RegDate = AuthDate, Title, Tags,
                Privilege = CASE SecLevel WHEN '0PT' THEN '0C' ELSE '1W' END
              FROM Doc WHERE NOT Tags IS NULL
            UNION ALL
            SELECT Category = 'Email',    EntityID = CAST(EmailID AS VARCHAR(32)),
                UserID, RegDate = SendDate, Title = Subject, Tags, Privilege = '2P'
              FROM Email WHERE NOT Tags IS NULL
       v 4) 暂时先按以上权限平滑方案执行
            仿照 MyTags/MyTagDetail 增加 Tags/TagDetail 页面,仿照 Entity.MyTagsView/MyCatTagsView 方
            法增加 Entity.TagsView/CatTagsView 方法,仿照 UserTagCatSet 增加 TagCatSet 类即可。增加阅
            读者 ViewerID 可选参数,列出所有“阅读者的或公共权限”实体标签,缺省为“全部公共”。

            重命名和删除标签目前只能由作者对自己的标签进行,那么对于公共标签,如何操作? 原则上标签都
            是私有的,没有事情不是某个个体的人做出来的。这个问题较复杂, 暂时不处理组织作为一个个体的
            所谓组织行为。
           
            公共标签跳转 TagClick 的处理,在此 Tags/TagDetail 全部跳转至公共标签实体 TagDetail 页面。
            同时在 TagDetail 也相应改为到我的标签 MyTagDetail 的互跳。

      4. 标签的域概念分析
         1) 我的标签
            我标注的实体标签,某类实体标签;
         2) 他人的标签
            他人标注的标签,公共、共圈子、工作权限,某类;
         3) 组织公共标签
            某个集体的标签,某类;
         4) 社会外部标签

      5. Miscs
         标签基本Ajax操作完成,如何启动如下工作?
         1) 如何对同义词进行管理?
         2) 标签的域如何管理?
            Fund interest -> Refund
         3) XMLHttp 的异步处理:
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = ProcessReturnResult; xmlHttp.send();
            function ProcessReturnResult () { if (xmlHttp.readyState && xmlHttp.status == 200) {...}}

  •   1. 单个标签的重命名与删除
         直接在 MyTagDetail 中进行即可;
         增加标签的“重命名 Rename / 删除 Delete”按钮操作;
         改造 Entity.MyTagCatSet 数据集计算方法为独立的 UserTagCatSet 类;
         自动过滤重复标签并格式化。

      2. 重命名标签 UserTagCatSet.Rename
         ' 名称:重命名标签
         ' 说明:删除作者 UserID 的全部标签 Tag
         Public Function Rename(ByVal newTag As String) As Boolean
           For Each dtr As DataRow In Tables("TagEntity").Rows
             Dim ent As New Entity(dtr("Category"), dtr("EntityID"))
             ent.Tags = dtr("Tags")
             ent.RenameTag(Tag, newTag)
           Next

           Load()
           Return True
         End Function

         ' 名称:重命名当前实体标签 Entity.RenameTag
         ' 限制:必须先设置全部已有的标签
         Public Function RenameTag(ByVal oldTag As String, ByVal newTag As String) As Boolean
           Dim tga As String() = _Tags.Split(", ;".ToCharArray())
           Dim tgs As String = ""

           For Each tag As String In tga
             If tag <> "" Then
               If tgs <> "" Then tgs += " "
               If tag = oldTag Then
                 tgs += newTag
               Else
                 tgs += tag
               End If
             End If
           Next

           ' 如果存在标签合并,这里会过滤。
           Me.Tags = tgs
           Return UpdateTags(True)
         End Function

      3. Miscs
         增加 Util.TextEscape 函数,将文本看作绝对文本显示,不管是否 HTML 文本;

  • v 1. 标签基本操作的JavaScript设计
       v 1) TemplateHeader.inc
            <SCRIPT SRC="/EOffice/common/javascript/calendar/eleMentCalendar.js"></SCRIPT>
            就在 eleMentCalendar.js 中实现。
       v 2) UI设计 SPAN ID=Cat:EntID
            标签的起始标签列表形态,在 Entity.TagsLink 函数中合成:
            <TD ALIGN=right VALIGN=top>
              <IMG ALIGN=absmiddle SRC="addnew.gif" ONCLICK="TagsEdit('Diary', '158')">
              <SPAN ID="Diary:158">
                <SPAN CLASS="tag" ONCLICK="TagClick('EmailAgent')">EmailAgent</SPAN>
                <SPAN CLASS="tag" ONCLICK="TagClick('Test')">Test</SPAN>
                <SPAN CLASS="tag" ONCLICK="TagClick('Info')">Info</SPAN>
              </SPAN>
              <A HREF="/EOffice/MyTags.aspx"><font face="Webdings">.</font></A>
            </TD>
            编辑时自动变为标签输入文本框形态,在 eleMentCalendar.js 中通过 TagEdit 方法合成:
            <SPAN ID="Diary:158">
              <INPUT ID="Tags:Diary:158" TYPE="text" SIZE="18" CLASS="input" />
              <SPAN CLASS="button" ONCLICK="TagsSave('Diary', 158)">确认</SPAN>
              <SPAN CLASS="button" ONCLICK="TagsCancel('Diary', 158)">取消</SPAN>
            </SPAN>
            保存时,通过 Ajax 传回服务器,并合成新的起始标签列表形态,取消时则合成老的; 老的标签通过
            设置全局变量:cat, entid, tags 加以保存,开始为空;这样保证编辑下个实体标签时,会取消上个
            实体标签。
       v 3) 客户端方法汇总
            TagsEdit 标签修改按钮
            TagsSave 标签保存按钮
            TagsCancel 标签取消修改按钮
       v 4) 服务器端方法
            Ajax 访问页面 UpdateTags.aspx?Cat=EID=Tags=
            实体标签修改 Entity.UpdateTags(cat, eid, tags) 函数
       v 5) “标签列表权限”问题调整测试
            在实体标签 Entity.TagsLink 合成函数中,增加缺省权限 byOwner=False参数:原则上只有实体作者
            可以修改标签,需要在阅读页面增加 Session("gsUserID")=mal.UserID 之类的控制;
            修改页面 CustomerDetail/ContactDetail/ReadEmail/DiaryMgmt/DiaryDetail/TopicDetail/ReadDoc。

  • v 1. 修改“标准标签条”计算函数
         1) Entity.TagsLink(att) -> Entity.TagsLink(cat, eid, tags, att)
            实体标签可增加、删除、修改,可统一在“标准标签条”中通过 Ajax 进行即可;
         2) 标准标签条 TagsLink 的引用修改:DiaryMgmt.aspx, User.aspx
            <%# EOffice.Common.Entity.TagsLink("Diary", Container.DataItem("DiaryID"),
              EOffice.Common.Util.NullStr(Container.DataItem("Tags")),
              EOffice.Common.Util.NullStr(Container.DataItem("Attachment"))) %>

    v 2. EOffice标签改造数据库升级
       v 1) Topic.SponsorID
            ExinfView
       v 2) Misc.TagCats
       v 3) TagEntityView

    v 3. EOffice标签汇聚上线问题
         1) 标签比重计算有问题;
         2) 标签实体应该按时间倒排;
         3) SQL字段公式
             修改表 Contact.RegDate 的默认值为 GETDATE ,而非公式 GETDATE
             原以为在插入时会自动插入;

    v 4. EOffice改进
         1) 增加 RoleDetail 页面
            不必,直接在 RoleUser 后增加参数 Mode=Detail 即可。
         2) 增加获取角色连接 Role.Link(NIDFormat)。
            角色名称函数 Role.NID(NIDFormat)
            RoleUser.aspx?RoleID=123&Mode=Detail
         3) 增加角色引用连接
            a. RoleUser.aspx: Role.ParentID
            b. User.aspx: User.GetRoleName -> User.GetTitleRole.GetLink("NE")
         4) 角色的父角色缺省值(NULL)为 RoleSystem.ROLE_NONE(-1)
         5) 单个标签允许删除、重命名;直接在 MyTagDetail 中进行即可;
         6) 实体标签可增加、删除、修改,可统一在“标准标签条”中通过 Ajax 进行即可;
         7) 通讯录不显示关闭部门;
         8) 用户管理增加全部部门选择,这样可搜索;
         9) 用户面孔Facebook不显示关闭部门;
         10) 修改部门管理 ViewDept 页面,关闭部门不允许进行用户管理等业务;
         11) 登陆统计 TraceMember 可按工号 EmpID 搜索;

  •   1. 智能化同步信息问题很重要
         同一件事情可能需要在不同的环境下记录,这时如何智能化地同步在各个环境下的变更信息情况会显得很
         重要。如在信息系统开发活动中,就同一个开发者的单次活动而言,程序的注释、工作日志、开发帮助、
         用户使用帮助、论坛相应主题下可能都需要同步变更。如果缺乏系统化、工具化的方法,完全依靠手工维
         护其间的信息同步,这些信息很难保证同步与追溯。最终哪方面的信息都很难保证其准确性。组织下的合
         作沟通问题,情况也大致如此,这就是所谓的信息不对称的问题,在每个环节上的参与者都很难保证信息
         的准确、及时与完整,而此时局部目标又要求我们必须要做出决策行动,这就是所谓易错性问题。

    v 2. EOffice标签完善测试
       v 1) 标签数据清洗
            UPDATE Diary SET Tags = NULL WHERE NOT Tags IS NULL AND RTRIM(Tags) = ''
       v 2) 让 TagsLink 的标签图标连接到 MyTags 页面
            Entity.TagsLink(attach)
       v 3) 让 MyTagDetail.com 的 TagClick 工作起来
            <SCRIPT LANGUAGE="javascript">
              function TagClick(tag) { window.location = "MyTagDetail.aspx?Tag=" + tag; }
            </SCRIPT>
       v 4) 让 MyTagDetail.com 的实体自动连接工作起来
            限制:只有阅读邮件后方可连接到,因为目前 Session("EMA")的赋值是在阅读邮件时进行的,这是目
                  前邮件阅读的系统安全安排。

    v 3. 修改TagEntityView视图
         增加统一的 RegDate, Title, Tags 字段
         SELECT Category = 'Diary',    EntityID = CAST(DiaryID AS VARCHAR(32)), UserID,
             RegDate, Title, Tags
           FROM Diary   WHERE NOT Tags IS NULL  UNION ALL
         SELECT Category = 'Topic',    EntityID = TopicID, UserID,
             RegDate = SponseDate, Title, Tags 
           FROM Topic WHERE NOT Tags IS NULL  UNION ALL
         SELECT Category = 'Contact',  EntityID = CAST(ContactID AS VARCHAR(32)), UserID,
             RegDate, Title = Name, Tags 
           FROM Contact WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Customer', EntityID = CustomerID, UserID,
             RegDate, Title = Name, Tags
           FROM Customer WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Doc',      EntityID = DocID, UserID,
             RegDate = AuthDate, Title, Tags  
           FROM Doc WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Email',    EntityID = CAST(EmailID AS VARCHAR(32)), UserID,
             RegDate = SendDate, Title = Subject, Tags
           FROM Email WHERE NOT Tags IS NULL

      4. EOfice改进
         邮件可转化的实体可以是:日志、主题、帖子、日程;
         附件可转化到附件、评论以及相应文件柜;
         可以考虑统一操作方式类似操作系统的“复制”、“粘贴”概念;

  • v 1. EOffice标签实施
         1) 标签实体 TagCats 还是通过 Misc 来动态统一管理
            标签实体分类:日志 Diary、文档 Doc、主题 Topic 、联系人 Contact、客户 Customer、邮件Email
         2) 增加方法 MyTagEntityView
            计算我的某个标签的分类实体视图
         3) 数据视图 MyTagView 增加 Tags 过滤
            过滤条件:NOT Tags IS NULL

    v 2. 增加数据库标签实体视图 TagEntityView
         CREATE VIEW dbo.TagEntityView AS
         SELECT Category = 'Customer', EntityID = CustomerID, UserID
           FROM Customer WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Diary',    EntityID = CAST(DiaryID AS VARCHAR(32)), UserID
           FROM Diary   WHERE NOT Tags IS NULL  UNION ALL
         SELECT Category = 'Contact',  EntityID = CAST(ContactID AS VARCHAR(32)), UserID 
           FROM Contact WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Doc',      EntityID = DocID, UserID  
           FROM Doc WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Email',    EntityID = CAST(EmailID AS VARCHAR(32)), UserID 
           FROM Email WHERE NOT Tags IS NULL UNION ALL
         SELECT Category = 'Topic',    EntityID = TopicID, UserID 
           FROM Topic WHERE NOT Tags IS NULL

  • v 1. 为标签云图逐个理顺三类标签汇聚
         1) 实体CatTagsView/我的实体MyCatTagsView和我的全部/MyTagsView 的标签视图关系;
            增加标签实体 TagCats() 静态只读数组,目前为六类。
            Public Shared ReadOnly TagCats As String() = { _
              "Diary", "Topic", "Doc", "Email", "Contact", "Customer" _
            }
            SELECT t.Tag, Cnt = Count(*)  
              FROM Tag t, (
                SELECT Cat='Diary',    EntityID=DiaryID    FROM Diary    WHERE UserID='jyc' UNION ALL
                SELECT Cat='Topic',    EntityID=TopicID    FROM Topic    WHERE UserID='jyc' UNION ALL
                SELECT Cat='Doc',      EntityID=DocID      FROM Doc      WHERE UserID='jyc' UNION ALL
                SELECT Cat='Email',    EntityID=EmailID    FROM Email    WHERE UserID='jyc' UNION ALL
                SELECT Cat='Contact',  EntityID=ContactID  FROM Contact  WHERE UserID='jyc' UNION ALL
                SELECT Cat='Customer', EntityID=CustomerID FROM Customer WHERE UserID='jyc' 
              ) e  
              WHERE t.Category = e.Cat AND t.EntityID = e.EntityID  
              GROUP BY t.Tag ORDER BY Cnt DESC
         2) UNION 和UNION ALL 的区别
            在数据库中,UNION 和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说
            都有所不同。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排
            序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录。
            而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那
            么返回的结果集就会包含重复的数据了。
            从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数
            据的话,那么就使用UNION ALL。

    v 2. 将主题表 Topic 标准化为 Entity 表
         1) 标准化为 Entity 实体表格式要求有三:
            TopicID, Tags, UserID, RegDate
         2) 需要将 Topic 表的 SponsorID 改为 UserID;
            同时修改 Topic 类的 SponsorID 改为 UserID。
         3) 同时修改一个视图 ExinfView 的 SponsorID 为 UserID。

      3. 尝试使用肖像Logo
         1) <%# EOffice.Common.eleMentFile.PictureHtml(
            EOffice.Manage.UserSystem.GetUser(Container.DataItem("UserID")).Portrait, 12) %>
         2) 在 PictureHtml 参数宽度后再加可选高度参数
            或在 User 类中增加 PortraitHtml 方法,并增加高度处理选择
         3) 对于宽度小于50 的画面的 Thumb 图,不再打印 eleMent 的 Logo

      4. 图片 Cache 的效果不明显问题分析
         1) 下载基本流程
            a. FileDownload.aspx?cat=attachment&width=50&file=UP\zhzhao_DSC00095.jpg
            b. emf = eleMentFile.new
            c. emf.Recalc
               c.1 ExistFile 源文件
               c.2 Thumb
                   c.2.1 File.Exists 拇指文件
               c.3 Cache.Put
            d. emf.ExistFile
            e. emf.Download()
               e.1 File.Exists 拇指文件
               e.2 Cache.Get
         2) 效果差的可能原因是
            依然需要四次访问外设判断文件是否存在File.Exists。
            将 d 和 e.1 的两次合并,删除 d,这样减少为三次
         3) 测试数据
            16 + 31   16 + 0    15 + 32   0 + 15    0 + 94    0 + 16    15 + 266    0 + 15
            2009-10-13 11:40:46.296 eleMentFile.New
            2009-10-13 11:40:46.296 eleMentFile.Recalc
            2009-10-13 11:40:46.296 eleMentFile.DownLoad
            2009-10-13 11:40:46.296 eleMentFile.Finish: UP_jyc_JYC0612_W50.jpg

  •   1. 标签云图TagsNephogram页面设计
         1) 几个概念
            我的标签:我在所有实体分类中定义的全部标签;
            公共标签:所有公开的实体分类中定义的全部标签;
            全部可视标签:我有权看到的所有实体分类中定义的全部标签;
            标签实体分类:目前有如下六类实体具有标签功能:
              日志 Diary、主题 Topic 、联系人 Contact、客户 Customer、文档Doc、邮件 Email
            标签权重
            标签引用
         2) 页面设计
            标签云图:我的标签 MyTags、公共标签 AllTags、
            标签引用:我的标签引用 MyTagDetail、公共标签引用AllTagDetail
            问题:是否通过参数统一“我的标签 MyTags”和“公共标签 AllTags”及其引用?至少UI是一样的。
         3) 标签云图UI设计
            标签跳跃 Jump
            标签云图 Nephogram
            标签实体分类:日志 Diary、主题 Topic 、联系人 Contact、客户 Customer、文档 Doc、邮件Email

      2. EOffice问题
         1) 新闻系统是否进行标签改造?
            实施是很容易的事情,参考文档或日志的做法;
            问题是新闻系统是否考虑在未来直接纳入文档系统呢?有独立存在的理由吗?
         2) 标签的精确搜索
            要从标签 Tags 表中搜索,而非实体表的 Tags 字段上进行文字包含搜索。

      3. Miscs
         要考虑在不同的IM终端上,设置 EOfficeAgent 的 Logo 和 PM 个人消息;
         金蝶K3:周来解决问题,发现更多尚未恢复的数据连接;继续解决中,明天再赴金蝶解决这些问题;

  • v 1. 部门允许修改状态
         1) 数据库设计
            就利用 Department.Type='DEL' 字段表示部门已经删除;需要认真研究 Type 字段的使用情况;
            部门类型 DEPTYPE 普通部门、经理办、综合部、分公司
             #    系统部门
             0GD  普通部门  普通部门  删除 0           1GM  经理办公室  经理办公室  删除 0
             2CD  综合部门  综合部门  删除 0           3BO  分公司      分公司      删除 0
         2) 操作设计
            部门删除时,先转为 Type='DEL',即部门关闭,再删除时则真删除,尽量保存历史不要删除;
            部门修改时,如果关闭,则可再开放;
         3) 使用调整
            DepList 修改即可;
            ' 只有活动(非系统类)部门方可加入部门列表
            If dep.Type <> SYSTEM_DEP Then
              Dim dil As Integer = Math.Max(0, dep.Layer - 1)
              If dep.ParentID = GenDepID Then dil += 1
              depName = "      ".Substring(0, dil) + depName
              _liar.Add(New ListItem(depName, depID))
            End If
            If dpt.Type <> DepSystem.SYSTEM_DEP Then
              DrawDep(dpt...)
            End If
         4) 问题
            a. 部门关闭后,用户是否允许登陆?是否强制暂停其用户?或如果有在职用户,则不允许关闭?
            b. 部门关闭后,部门列表也不出现,在管理员查看时也会找不到。
         5) 关闭生产的设备工程和研发部的项目中心

      2. EOffice安全问题
         1) DeleteDept 页面很不安全;
         2) SecurePage 不允许 UrlReferrer 为空。

      3. K3财务核算问题
         金蝶的财务结帐还是无法解决,要考虑手工结帐,否则问题会堆积。不能依赖 Kingdee,要知道逆向工程
         成功的概率极低。对系统要敬畏、否则发生错误是必然(无法避免)的,不存在怀不怀疑的问题。

  • v 1. 优化加速文件下载 eleMentFile.Download 模块
         1) 采用 Cache.Add
            如果 Cache 中已保存了具有相同 key 参数的项,则对此方法的调用将失败。若要使用相同的 key 参
            数改写现有的 Cache 项,请使用 Insert 方法。
         2) 测试基准
            目前百人负荷时,首页下完时间为 4 秒;面孔需 6 秒;2008春节晚会缩略图需 6 秒;
         3) 图片拇指Thumb文件的高速缓存处理
            统一在文件系统 eleMentFile.Recalc(Page) / Download() 方法中进行缓存 fileCache 存取处理。
            Function Recalc(Pag) ...
              ' Thumb图象予处理
              Dim fnn As String = eleMentImage.Thumb(pathDir, fnm, _
                Util.StrInt(pag.Request("width"), 0), _
                Util.StrInt(pag.Request("height"), 0) _
              )

              ' Thumb图象文件高速缓冲 Cache 处理,15 分钟不用就清除
              If Not fnn Is Nothing Then
                SetFile(fnn)
                If pag.Cache(fnn) Is Nothing Then
                  Dim fst As New FileStream(filePath, FileMode.Open)
                  Dim buf(fst.Length) As Byte
                  fst.Read(buf, 0, fst.Length)
                  fst.Close()
                  fileCache = buf
                  pag.Cache.Add(fnn, fileCache, Nothing, Caching.Cache.NoAbsoluteExpiration, _
                    TimeSpan.FromMinutes(15), Caching.CacheItemPriority.Low, Nothing)
                Else
                  fileCache = pag.Cache(fnn)
                End If
              End If
            End Function
            Function Download() ...
              If fileCache Is Nothing Then
                Page.Response.WriteFile(filePath)
              Else
                ' 文件的缓存处理,在 Recalc(Page) 方法的予处理中已经进行了缓存 fileCache 的存取处理
                Dim ops As Stream = Page.Response.OutputStream
                ops.Write(fileCache, 0, fileCache.Length - 1)
              End If
            End Function
         4) 测试结果
            目前百人负荷时,首页下完时间为2秒;面孔需4秒;2008春节晚会缩略图需4秒;效果并不明显。

  •   1. EOffice使用问答(三)
         1) 什么是标签与如何使用标签?
            像日常文件夹的标签一样,在EOffice系统里,为快速检索信息,也广泛提供标签服务。目前使用标签
            的EOffice实体有:客户管理、联系人管理、论坛主题、日志管理、发文文档、外部邮件。一般标签设
            置时,都是通过空格分割的关键字来设置若干标签。 有的实体检索带有标签过滤功能,实体阅读时也
            带有指向标签过滤功能的标签连接按钮。

         2) 如何建立自己部门的论坛?
            各部门文书和经理都有权建立自己部门的论坛,也可委托系统管理员建立。 在 [我的业务/文书/论坛
            管理] 里新建即可。首先为自己的论坛起个恰当的名字,选定斑竹,为论坛写个序言或简介。 如果您
            想让该论坛只为本部门开放,则勾选“私有”选项,最后保存即可。这样人们就可以在BBS论坛上看到
            该论坛了,论坛由若干主题组成,首先新建主题,并为主题设置标签关键词, 围绕主题大家就可以展
            开讨论了。

         3) 如何利用论坛主题进行投票与评比?
            如果您想在论坛中就各主题进行投票,可以在进入主题帖子页面后为主题投票, 投票可以是赞成、中
            立、反对。这样在论坛页面就可以比较排序各主题的反应数。

         4) 如何用飞鸽访问EOffice/K3查询?
            飞鸽与EOffice的通讯是通过EOfficeAgent代理服务进行。首先在飞鸽中将“总经理室 /EOfficeAgent
            ”的显示优先级置1,这样您可以快速找到EOfficeAgent了。 要让EOfficeAgent知道您是EOffice中的
            哪位,您必须确保最后一次登陆EOffice是在本电脑上。 另飞鸽上的姓名必须和您在EOffice中的用户
            姓名一致,这样您就可以通过飞鸽访问EOffice了。EOfficeAgent提供了哪些EOffice服务呢? 很简单
            给 EOfficeAgent 发条 Help 命令,她会告诉你。其中查K3库存,“BOM 料号”即可。

         5) 智能日期条如何使用?
            所谓智能日期条是类似以下样式的时间段选择工具条, 在周期单位间选择只须按日期条的日期单位右
            边的下尖头即可, 系统自动计算本单位与其前的四个时间段共五个时间区间的起止时间供系统使用。
            再此前的时间段可按“以前”,按“全部”可全部显示。
            “□全部 ○本年 ∨ >2008 >2007 >2006 >2005 >以前”
            “□全部 ○本月 ∨ >8月 >7月 >6月 >5月 >以前”
            “□全部 ○本周 ∨ >39周 >38周 >37周 >36周 >以前”
            “□全部 ○今日 ∨ >9-29月 >9-28 >9-27 >9-26 >以前”

         6) 日历框如何使用?
            在EOffice里,显示在右上角区域称为“日历框”,它可以显示您的近期活动情况,如昨天有个单据需
            要签批,明天安排个会议日程等信息。不同的信息有不同的图标显示在相应日期上。 只要将鼠标移动
            到该日期,该日期的相关事项就会显示在日历的信息提示框内, 可以用鼠标点击相应的消息,即可办
            理与该消息关联的事务。

            在“日历框”的左侧是“今日框”,就是类似“2009年9月1日 星期二 七月十三”的区域。 其左侧两
            个图标是“全屏”、“日历”开关按钮。“全屏”按钮可以让浏览器只显示正文内容, 而“日历”按
            钮可以让开关日历框的显示,并可在您下次登陆时记忆开关状态。

            对经常进行大表浏览查询的用户, 可以点击“今日框”左下脚的“日历”按钮来开关并记忆日历框的
            显示。

         7) 如何在EOffice显示的数据表格中按不同的列和排序方向进行表格排序?
            在绝大部分EOffice显示的数据表格中都可以自主决定排序列和排序方向,缺省情况下数据行是按最近
            时间的倒序列出,即“最近时间↑”。 点击相应的 [列标题] 可按该标题排序,再次按下可改变排序
            方向。可排序的列是以连接色显示。

         8) 为什么我的浏览器看不到图表?
            EOffice里的图表显示是使用ActiveX控件进行的,因此你需要在客户端浏览器上下载该控件。 在IE浏
            览器里的 [工具/Internet选项/安全/受信任的站点],将 192.168.0.12 加入即可, 这样当您再浏览
            EOffice的图表时系统会自动加载控件,就可以看到这些图表了。

         9) 如何建立自己的用户组?
            用户组可以是项目组、兴趣小组、老乡组,甚至委员会之类的跨部门组织, 一旦建立了组织并吸收了
            成员,则可在其上共享系统提供的通讯录、论坛、日志、文件柜之类的支持组的基础设施。 建立组很
            简单,在 [个人办公/组与文件管理/组与文件柜/组管理] 里创建即可,请不要忘记先给自己的组起个
            好听的名字,并简单介绍一下自己的组织。

         10) 如何使用外部邮件?
            和普通的邮件客户端一样,只要您有邮箱的 POP3 和 Smtp 帐号,即可使用 EOffice 提供的外部邮件
            服务。设置方法:[外部邮箱/邮箱设置/增加],设置前请认真阅读帮助。 开始使用,建议您不要选择
            [从服务器删除],这样不会影响您的日常工作。邮件可以设置标签,便于管理过滤; 可以对有价值的
            邮件转化为工作日志。

  • v 1. 推广 GridFere.SortCommand 列排序标准化方法
       v 1) TraceOnline  在线用户列表
       v 2) TraceMember  登陆统计
       v 3) DiaryMember  成员工作日志
       v 4) BBSDefault   论坛列表
       v 5) TopicList    主题列表
       v 6) FileStatus   发文稿纸
       v 7) FileProcess  发文处理
       v 8) File/Search  文档搜索
       v 9) IDT          业务文档列表
       v 10) ListMail    内部邮件列表
       v 11) ListEmail   外部邮件列表
       v 12) Todo/Check  待办事宜
       v 13) AddAgenda   日程安排
       v 14) AddbookMgmt 通讯录管理
       v 15) ContactMgmt 联系人管理

      2. EOffice数据库近期更新,准备今晚更新系统
       v 1) 新增表 Pinyin/Word
         2) 修改EOffice表 Group/GroupUser.GrpID 为标准化的 GroupID
            修改以上表2个,视图2个DepGrpView UserDegView,函数1个GrpContain;
       v 3) 修改 Post.ParentID 字段同 PostID 为 INT 型;

      3. EOffice.LOA系统完善
         1) 各单位经理可以看到部门人员请假状况;
            点击数量可以看到个人的请假细节
         2) 每人可查看自己的请假细节;
            并统计每人的各类型假期的汇总情况;
         3) 与工资、打卡系统相连
         4) 在以上统计模块中增加日期条 Datebar 控件

      4. GPS地图软件问题
         小时搞的导航GPS软件是 Windows Mobile 版本,不是 Windows CE 版本。

  •   1. ' 名称:网格伴侣 GridFere 静态类
         Public Class GridFere
        
           ' 名称:数据表格 DataGrid 的列排序响应方法
           ' 说明:增加对数据表格 DataGrid 的排序列工具支持。首先在 TraceOnline.aspx 中使用,用法如下:
           '       1) <ASP:DATAGRID ALLOWSORTING="True" ID="ContGrid" ...>
           '       2) <ASP:TEMPLATECOLUMN HEADERTEXT="最近登录时间↑" SORTEXPRESSION="LastDate" ...>
           '       3) Private Sub ContGrid_SortCommand(ByVal source As Object, _
           '            ByVal e As DataGridSortCommandEventArgs) Handles ContGrid.SortCommand
           '            GridFere.SortCommand(ContGrid, e)
           '          End Sub
           Public Shared Sub SortCommand(ByVal ContGrid As DataGrid, _
             ByVal e As DataGridSortCommandEventArgs _
           )
             Dim soe As String = e.SortExpression
             Dim i As Integer, spi As Integer
        
             ' 对表格各列的信息进行更新
             For i = 0 To ContGrid.Columns.Count - 1
               With ContGrid.Columns(i)
                 ' 先还原各列本来标题
                 spi = .HeaderText.IndexOf("↑")
                 If spi = -1 Then spi = .HeaderText.IndexOf("↓")
                 If spi > 0 Then .HeaderText = .HeaderText.Substring(0, spi)
        
                 ' 对当前排序列标题和排序表达式分别增加适当的上下方向表示
                 If .SortExpression = soe Then
                   If soe.IndexOf("DESC") > 0 Then
                     .SortExpression = soe.Replace("DESC", "ASC")
                     .HeaderText += "↑"
                   ElseIf soe.IndexOf("ASC") > 0 Then
                     .SortExpression = soe.Replace("ASC", "DESC")
                     .HeaderText += "↓"
                   Else
                     .SortExpression = soe + " DESC"
                     .HeaderText += "↓"
                   End If
                 End If
               End With
             Next
        
             ' 对数据按照新的排序重新绑定到网格上
             Dim dtv As DataView = ContGrid.Page.Session("DTV")
             dtv.Sort = soe
             ContGrid.DataSource = dtv
             ContGrid.DataBind()
           End Sub
        
         End Class

  •   1. 增加 SuggestUserID 用户标识建议函数
         ' 名称:获取系统建议的用户标识
         ' 说明:根据用户姓名“王老五”,先获取姓名wang lao wu拼音数组,再推荐lwwang, wanglw二种;
         '       四字姓名“欧阳老五”,则前二字为姓;先获取 ouyang lao wu 拼音数组,同上;
         '       二字姓名“张三”则“szhang, zhangs”同上;
         '       以上方法均冲突,则再加“全简姓名wlw, 全拼姓名wanglaowu, 全拼名姓laowuwang”三选择;
         '       该函数为静态函数,用于 CheckValid 函数。
         ' 参数:name 用户名称;
         '       可选 oldUID 老的用户标识,缺省为空,表示不与老的比较,否则如果老的符合,则不建议新
         '       的,返回空;
         ' 返回:根据以上规则检查,合法返回最优先用户标识,否则空
         ' 限制:用户姓名必须二字以上,超过三字,前二字为姓,不适合于少数民族的长中文姓名。
         Public Shared Function SuggestUserID(ByVal name As String, _
           Optional ByVal oldUID As String = Nothing _
         ) As String
           ' 限制予处理
           If name Is Nothing Then Return Nothing
           If name.Length <= 1 Then Return Nothing
     
           Dim uid As String, pys As String            ' 用户标识
           Dim lnm As String, lna As String()          ' 用户姓 Last Name
           Dim fnm As String, fna As String()          ' 用户名称 First Name,名简拼
           Dim lns As String, lnf As String            ' 姓简拼 lns,姓全拼 lnf
           Dim fns As String, fnf As String            ' 名简拼 lns,名全拼 lnf
           Dim usr As User
           Dim i As Integer
     
           ' 计算姓 lnm 和 名 fnm
           If (name.Length <= 3) Then
             lnm = name.Substring(0, 1)
             fnm = name.Substring(1, name.Length - 1)
           Else
             lnm = name.Substring(0, 2)
             fnm = name.Substring(2, name.Length - 2)
           End If
     
           ' 计算姓简拼 lns 姓全拼 lnf 和 名简拼 fnm 名全拼 fnf
           lna = Tool.HanziPinyin(lnm)
           For i = 0 To lna.Length - 1
             lns += lna(i).Chars(0)
             lnf += lna(i)
           Next
           fna = Tool.HanziPinyin(fnm)
           For i = 0 To fna.Length - 1
             fns += fna(i).Chars(0)
             fnf += fna(i)
           Next
     
           ' 1) 名简 + 姓全
           uid = fns + lnf
           If uid = oldUID Then Return Nothing
           usr = UserSystem.GetUser(uid)
           If usr Is Nothing Then Return uid
     
           ' 2) 姓全 + 名简
           uid = lnf + fns
           If uid = oldUID Then Return Nothing
           usr = UserSystem.GetUser(uid)
           If usr Is Nothing Then Return uid
     
           ' 3) 姓简 + 名简
           uid = lns + fns
           If uid = oldUID Then Return Nothing
           usr = UserSystem.GetUser(uid)
           If usr Is Nothing Then Return uid
     
           ' 4) 姓全 + 名全
           uid = lnf + fnf
           If uid = oldUID Then Return Nothing
           usr = UserSystem.GetUser(uid)
           If usr Is Nothing Then Return uid
     
           ' 5) 名全 + 姓全
           uid = fnf + lnf
           If uid = oldUID Then Return Nothing
           usr = UserSystem.GetUser(uid)
           If usr Is Nothing Then Return uid
     
           Return Nothing
         End Function

      2. 修改所有 GetUserBy***(value, nth) 函数通过 GetUser(Name, Value, nth) 完全搜索。
         ' 名称:泛获取用户对象
         ' 说明:根据 EmpID/Email/Imail/Mobile 获取用户对象,不管用户是否在职(UserList中)。
         '       所有用户搜索 GetUserBy***(value, nth) 函数都通过该函数进行完全搜索。
         ' 参数:字段名称 FieldName = "EmpID"...
         '       字段值 FieldValue
         '       可选 nth 第几个,按照 UserID 正排序,缺省为首个
         ' 返回:用户对象,找不到时返回 Nothing
         ' 限制:_userList 为全部在职用户哈希表,这里不检查 userID 的合法性
         Friend Shared Function GetUser(ByVal FieldName As String, ByVal FieldValue As String, _
           Optional ByVal nth As Integer = 1 _
         ) As User
           Dim usr As User = New User(FieldName, FieldValue, nth)
           If usr.UserID Is Nothing Then Return Nothing
     
           Return usr
         End Function

  •   1. 汉字拼音表Pinyin与英文单词表Word
         1) 将“汉字读音表GB2312版(共7809个汉字)东方法眼.txt”转到数据库Pinyin表中
            select Pinyin From Pinyin where hanzi like '%给%'
            gei ji
         2) 将“WORD.MDB”表转到数据库Word表中
            select * from Word where Word='jade'
            jade n.硬玉, 翡翠 d=eid
         3) 建立Pinyin项目
            用Windows的IFELanguage接口实现,参考如下链接
            http://blog.sina.com.cn/s/blog_589d32f501000aya.html
            汉字拼音表=hànzìpīnyīnbiǎo

      2. 附件的统一处理
         ' 附件处理,如果存在允许删除
         If Not dok.AttachFile Is Nothing And dok.AttachFile <> "" Then
           vAttachFile.Text = "<BR>" + eleMentFile.AttachHtml(dok.AttachFile)
           DelAttach.Visible = True
         Else
           vAttachFile.Text = ""
           DelAttach.Visible = False
         End If
         问题:如何平滑地在后台业务类、前台JavaScript、Ajax之间平滑漂亮地编程的确是个艰难的选择?!

  •   1. “我关注”解决方案
         1) 主动关注
            关注者 UserID, 关注实体分类 Category, 关注实体标识 EntityID,
            主动/被动关注 Initiative,是否允许通知 AllowNotify, 上次关注时间 LastUpdate
         2) 关联者关注
            只有参与某活动的人才能关注该活动;一般是关注实体的某阶段参与人或对该实体发出评论的人;
         3) 指定关注
            某实体活动发起人指定谁来关注该实体;数据存储采用方案 1) 即可,Initiative设置为False即可。

      2. 凯讲工单查询表分析
         1) 关联表10张12次关联
            a. ICMO 工单表
            b. t_icitem 物料基础表
            c. seorder 定单表          c.finterid 定单号
            k. t_worktype 工单了类型表
            d. t_department 部门表
            e. t_supplier 供应商表
            m. 产品入库复合表 (
               m1. icstockbill 产品入库单
               m2. icstockbillentry 入库单详细表 )
            t. BOM复合表 (
               t1. icbom BOM父表
               t2. icbomchild BOM子表
               t3. t_icitem 物料基础表 )
            h. ICMO 子工单表
         2) 选择列字段
            a.fbillno, a.FCheckDate, c.fbillno as 'YFOrder', k.fname as 'WKTypeName',
            工单号     工单下单日期  销售定单号              工单类型
            case when a.ftype=1067 and a.fsupplyid>0 then a.fsupplyid else a.fworkshop end,
            自制取内部工作中心,否则委外取供应商号
            case when a.ftype=1054 then d.fname else e.fname end as 'WKCenter',
            自制取内部工作中心名称,否则委外取供应商号名称
            CASE a.fstatus when 0 then '计划' when 5 then '确认'
              when 1 then '下达' when 3 then '结案' end as FICMOstatus,
            工单状态
            b.fnumber, b.fname, t.fnumber 'FSubNumber', t.fname 'FSubName', h.fbillno 'FSubICMO',
            物料号     物料名称 子物料号                子物料名称          子工单号
            a.FPlanCommitDate, a.FPlanFinishDate, a.fqty, a.fstockqty, m.mfdate,
            工单计划开工时间   工单计划完工时间   工单数量 入库数量    最近入库时间
            CAST(CAST(CAST(a.fstockqty*100 as decimal(12,4))/cast(a.fqty as decimal(12,4))
              as decimal(12,0)) as nvarchar(10))+'%' as 'StockPercent'
            完成率

  •   3. 信息系统发育的八阶段模型
         任何一个信息系统从发育到成熟都须经历如下八个步骤:“可叙述 -> 可文档 -> 可执行 -> 可需求 ->
         可实现 -> 可运行 -> 可跟踪 -> 可升级”,跳跃省略或糊弄其中任何一个步骤都会影响系统的健康发育
         及其后的成长,当然视系统建设的目标不同,后边的步骤可以不做。

         可叙述:可口头叙述下来,已经有了粗概念,虽可执行但不稳定,可为当局组织执行,但不可推敲,难以
                 适应变化,难以在活动的组织中持续;
         可文档:系统可用文字描述,可整理为完整的系统化的概念,可在组织中执行与持续,但适应变化较难。
                 且受规模化(Scalibilitization)的限制,学习成本较高,学习不透彻,组织持续时易于走形;
         可执行:实际是讲系统是可以在现实中手工完整地运转,典型的特征是系统设计的简单化,表格的易于理
                 解性,一个可执行的手工系统必然伴随着一系列的表格、规则、准则和角色设计,这些表格就是
                 信息系统的数据库。不可想象一个手工不可行的东西会转化为可行的信息系统;
         可需求:可对正在执行的手工(或半自动)系统,提出完整的信息系统化需求,并对系统做出为适应信息化
                 建设适当的系统化改造(流程再造BPR);
         可实现:可以对可需求的“手工系统”,根据可需求的建议,做出满足需求的“自动化信息系统”。这样
                 的可需求系统是可以实施为信息化系统的;
         可运行:系统是可以为组织所利用,从而形成一个真实的、匹配的、高效的、稳定的“双执行系统”,真
                 正让系统成为组织的高效工具或商业机器;
         可跟踪:系统没有没有错误的,没有系统是可以自动进化的,因此对系统进行维护本身就应该是系统的一
                 部分,而这本身也需要高效的手段,这个手段就是高速跟踪,一个纯粹黑匣子的不可跟踪的系统
                 对双系统的发育是个威胁。
         可升级:系统设计之初就要考虑系统的生命周期,考虑系统对技术进步的变化的适应能力,比如一个缺乏
                 设计文档的系统是不可升级的。

  •   1. 用户注册时的“该用户标识已经存在,请另外选择”错误提示是错误的
         经检查确实并不存在,需要调试。qhchen
         ' 名称:检查用户注册信息的合法性
         ' 说明:只检查四中可能的冲突:UserID, Name, EngName, EmpID
         '       该函数为静态函数,也用于 UserModify 页面
         ' 参数:UID 用户标识;
         '       可选:姓名 Name, 英文名字 EName, 工号 EID
         ' 返回:合法返回空,否则返回冲突原因
         Public Shared Function CheckValid(ByVal UID As String,
           Optional ByVal Name As String = Nothing, Optional ByVal EName As String = Nothing,
           Optional ByVal EID As String = Nothing _
         ) As String
         P13n.Settings("Calendar") = "On"

      2. 如何根据情况开关我的日历显示?——关于“日历框”和“今日框”
         在 EOffice里,显示在右上角区域称为“日历框”,它可以显示您的近期活动情况,如昨天有个单据需要
         签批,明天安排个会议日程等信息。不同的信息有不同的图标显示在相应日期上。只要将鼠标移动到该日
         期,该日期的相关事项就会显示在日历的信息提示框内,可以用鼠标点击相应的消息,即可办理与该消息
         关联的事务。

         在“日历框”的左侧是“今日框”,就是类似“2009年9月1日 星期二 七月十三”的区域。其左侧两个图
         标是“全屏”、“日历”开关按钮。详见下图。“全屏”按钮可以让浏览器只显示正文内容,而“日历”
         按钮可以让开关日历框的显示,并可在您下次登陆时记忆开关状态。

         对经常进行大表查询的用户,可以点击“今日框”左下脚的“日历”按钮来开关并记忆日历框的显示。

      3. SCNM的分解错误分析
         1) 现象验证 BC(5) = PC(5) + 2*PC(4) 有错误;
            经手工验证,应为 BC(5) = PC(5) + 2*PC(4) + PC(3),原公式的确有错误;
         2) 原因分析 SC(4,2) != PC(4), 实际情况是 SC(4,2) = SC(4,4) = BC(4)
            问题 SC(4,2) 抽掉一条外边为 SC(4,3), 再抽掉一条外边为 SC(4,4) = BC(4) = PC(4) + PC(3)
            故最后结论为 BC(5) = PC(5) + 2*PC(4) + PC(3)
         3) 问题是 SC(n,m) 会退化,抽边的基本规则为抽掉重复的连接边,如何标准化 SC(n,m) 图?
            必须从外向里抽重复边,外围大于三点也未必就是标准 SC(n,m) 图。
         4) 标准 SC(n,m) 图的定义:
            * 没有重复边;* 内部没有大于三边区域;* 除边界外没有度数小于3的结点。
         5) 问题解决:原递归收缩规则是有问题的
            SC(n,2) != PC(n)
            SC(n,3) = PC(n) 需要调整 PC(n) 的定义,同区域三角剖分图 SC(n,m)的是否标准化一样,也存在非
            标准三角剖分图 PC(n)。在极端的情况下两个完全相同的 BC(n) 相接,其组成的 PC(n)已经完全钝化
            为 BC(n)。从这个意义上讲,SC(n,2) 抽掉一条重复的外边,完全等同于SC(n,3),因此以前的规则也
            不是没有道理。因此如果允许 SC(n,m) 的非标准化,则……?

      4. 电子支付
         1) 财付通是腾讯旗下在线支付平台,同样提供网上跨行还款服务。不过, 还款方式并不是将借记卡里的
            资金直接打入信用卡,而是通过“财付通账户”中转来实现。
         2) 如何为他人的信用卡还款
            有多种还款方式供您选择,如果您开立了一卡通帐户, 您可以使用专业版中“招行同城转帐”、“付
            款计划”功能向他人的信用卡转帐还款。

  •   1. 页面基类 EOffice.CommonPage 的一些“反身性reflexivity”功能
         1) 页面可以自动注册为“EOffice功能 Function”表;
         2) 自动帮助信息,将页面的帮助信息 Help 扩展到 Function 功能表中;
         3) 将功能 Function 表的字段扩展到页面 CommonPage 基类的属性中;

      2. EOfficeAgent 命令“反身性reflexivity”实践
         1) 通过功能表思想来维护命令服务 Service,使命令扩展自动简易化;
         2) 自动帮助信息,使 Help 信息自动生成;
         3) 建立“命令Command”类来统一处理这些问题;

      3. 索罗斯的“易错性fallibility”“反身性reflexivity”哲学
         一是索罗斯反复提到的哲学:第一个哲学原则是,我们并不真正了解我们所处的这个世界,我把这个叫做
         “易错性fallibility”。第二个哲学是,我们对世界的误解、我们对世界的错误看法, 其实反而会改变
         历史,我把这个叫做“反身性reflexivity”。 一方面,我们对这个世界的理解程度取决于种种微妙的可
         变因素。所以,这个世界不可能处于一种常态,它往往受制于两种功能的共同表现。因此,当我们做决定
         的时候,不能仅仅依靠所谓的知识。我们的思想和我们所参与的事态都不具备完全的独立性,二者之间不
         断相互作用,而且相互决定,不存在任何对称或对应,这也就是我所说的反身性。这次史无前例的金融危
         机让我得出了一个结论:反身性原则虽然不是什么新发现,但它作为一种常识,长期为人们所忽略。

  •   1. SCNM 分解的解释
         1) 基础 BC(n) = 3*2^n
            /* BC(3) = PC(3)
             * BC(4) = SC(4,4) = SC(4,3) + SC(3,2) = PC(4) + PC(3)
             * BC(5) = SC(5,5) = SC(5,4) + SC(4,3) = SC(5,3) + SC(4,2) + PC(4) = PC(5) + 2*PC(4)
             * BC(6) = SC(6,6) = SC(6,5) + SC(5,4) = SC(6,4) + SC(5,3) + PC(5) + PC(4)
             *       = SC(6,3) + SC(5,2) + 2*PC(5) + PC(4) = PC(6) + 3*PC(5) + PC(4)
             * BC(7) = PC(7) + 4*PC(6) + 3*PC(5)
             * BC(8) = PC(8) + 5*PC(7) + 6*PC(6) + PC(5)
             */
         2) PC(3) = BC(3)
            PC(4) = BC(4) - PC(3) = BC(3)
            PC(5) = BC(5) - 2*PC(4) = BC(4)
            PC(6) = BC(6) - 3*PC(5) - PC(4) = BC(6) - 3*BC(4) - BC(3) = BC(3)
            PC(7) = BC(7) - 4*PC(6) - 3*PC(5) = BC(7) - 4*BC(3) - 3*BC(4) = 6*BC(4) - 3*BC(4)=3*BC(4)
            PC(8) = BC(8) - 5*PC(7) - 6*PC(6) - PC(5) = BC(8) - 15*BC(4) - 6*BC(3) - BC(4)
                  = BC(4) - 6*BC(3) - BC(4) = -6*BC(3)
            这就是问题所在!!!
            a. PC(3), PC(4) 没有问题
            b. BC(5) = PC(5) + 2*PC(4) 是否有问题?

      2. C:\JYC2008\Birkhoff>java -classpath .;..\classes SC2PC 50
         Hello SC2PC! 2009.08.26 @ Shenzhen  Thu Aug 27 11:31:18 CST 2009
         BC(50) = 1*PC(50) + 47*PC(49) + 1035*PC(48) + 14190*PC(47) + 135751*PC(46) + 962598*PC(45)
                + 5245786*PC(44) + 22481940*PC(43) + 76904685*PC(42) + 211915132*PC(41)
                + 472733756*PC(40) + 854992152*PC(39) + 1251677700*PC(38) + 1476337800*PC(37)
                + 1391975640*PC(36) + 1037158320*PC(35) + 601080390*PC(34) + 265182525*PC(33)
                + 86493225*PC(32) + 20030010*PC(31) + 3108105*PC(30) + 296010*PC(29) + 14950*PC(28)
                + 300*PC(27) + 1*PC(26)
         Thu Aug 27 12:32:11 CST 2009

      3. Miscs
         v Session("gsCalendar") 与 P13n.Setting.Calendar 个性化设置处理