-
v 1. EOffice改善
v 1) 已审批用户的 TodoType=AV-UA 类型的 Todo 需要删除掉;
If IsTodoRequest() Then
usr = New User(Request("FromID"))
' 已审批用户的 TodoType=AV-UA 类型的 Todo 需要删除掉
If usr.Status <> UserStatus.APPLY Then DeleteTodo()
End If
测试:通过!
2) 目前的自动连接探测范围:
用户姓名表、标签表;可以继续扩展探测范围到:
* 标记连接;
* 实体连接,如部门名称自动连接到部门,即 DepName -> Dep#ID 转换或隐式转换;2. 如何接纳外部邮件系统?
v 1) 启动邮件到页面前期工作
修改 blank.hdt 空文档模板,增加 <BASE HREF="/EOffice/">
v 2) 修改 calendar.js 库 printCont 方法
增加 [邮件] 按钮,修正页面的标题 TITLE 和基地址 BASE 参数。
jyc.document.title = document.title;
jyc.document.getElementsByTagName("BASE")[0].href = document.location.href;
jyc.document.body.innerHTML = oaHtml;
v 3) 修改 EOfficePrint.css 样式文件和 EOffice.css 保持基本一致。
.right { float:right; }
.tag { font-family: "宋体" , "Verdana"; font-size: 12px; line-height: 150%; ...}
body { font-size: 12px; ... }
v 4) 测试
首页,文件管理、新闻阅读、论坛主题,都通过!
5) 后期工作分解
* 自动弹出输入窗口,以获取邮件地址参数;
js 代码的获取本身也可作为 ajax 的一部分,好处是代码共享,统一维护;
邮件地址 Adress, 二次 ajax 系统获取,一句话 Message 消息;
* 服务器端的后台邮件发送 Ajax 服务页面 EmailCont.aspx 页面实现;3. 组织过程理论创始人法约尔介绍
法约尔 (Henri Fayol, 1841-1925) 法国人。矿业工程师,企业家,管理大师,组织过程理论创始人。
管理五原则:命令的统一、命令的等级链、权力的分离、集中化授权、组织的秩序。法约尔管理名言:
* 建立秩序是为了避免物质和时间的损失。为了完全达到这个目的,不但应该使物品都在他们的位置上,
排列整齐,而且应该事先选择位置……社会秩序必须以顺利完成两项最艰巨的管理任务为前提,即良好
的组织和良好的选拔工作,确定企业发展所必需的职位,并为职位选拔任职的人,使每个人都在能够发
挥出自己最大能力的岗位上任职。—— 亨利·法约尔
* 集中是一种反映集中规律的现象。它显示出每个动物机体和社会组织中,感觉集中于大脑或领导部门。
从大脑或领导部门发出命令,使各个部分运转起来。—— 亨利·法约尔
* 取得成功的办法是: 第一,领导者的坚定性和好榜样; 第二,尽可能签订公平协议;第三,认真的监
督。—— 亨利·法约尔
* 不要把“统一领导” (一个领导者、一项计划)和“统一指挥”(一个下属人员只应接受一个领导者的命
令) 混淆。人们通过完善的组织来实现一个社会团体的统一领导,而统一指挥则取决于人员如何发挥作
用。—— 亨利·法约尔
* 无论对哪一件工作来说,一个下属人员只应接受一个领导者的命令。这就是“统一指挥原则”。这是一
条普遍的、永久必要的原则。—— 亨利·法约尔
* 劳动分工的目的是,用同样的努力而生产出更多更好的产品。工人总是做同一部件,领导人经常处理同
一些事务,对自己的工作就可以熟练、有信心,从而提高效率。—— 亨利·法约尔
* 在管理方面,没有什么死板和绝对的东西,这全是尺度问题……原则是灵活的,是可以适用于一切需要
的。问题在于懂得如何运用。这是一门很难掌握的艺术。他要求智慧、经验、判断和对尺度的掌握。由
机智和经验合成的掌握尺度的能力是管理者主要的才能之一。—— 亨利·法约尔
* 要管理,人们就需要依据一些原则,也就是说,需要依据一些被接受、被论证过的道理。法规代表了某
个时期的这些道理的总和。—— 亨利·法约尔4. Miscs
周六到坝光排牙山玩发现的以前未见的花:
桃金娘 Rhodomyrtus tomentosa 又名 山棯(Shen);
买麻藤 Gnetum montanum markg;
玉叶金花 Mussaenda macrophylla,叶片椭圆形至卵形,长12~14厘米。原产于中国华南;
紫玉盤 Uvaria macrophylla, Annonaceae 番荔枝科,攀援灌木。 -
1. http://zh.wikipedia.org/wiki/Panoramio
Panoramio 地图相册, 是一个全球定位系统带坐标特征地理及地方相片上载分享网站, 于 2007年7月被
Google收购。Panoramio采用Web 2.0,任何人士都可免费登记成为会员,并可以上载及下载自拍照、在网
上留言及互相品评对方的照片,提供 2GB 的相片存储空间。经过定位的照片经管理人员审查之后, 会在
Google地球和Google地图中相应的拍摄位置得到展现,也不计入2GB的容量限制,为无限数目。Panoramio
的中文意思是“蓝色星球”,简称“蓝星”。Panoramio于2005年夏由两名西班牙企业家,Joaquin Cuenca Abela 和 Eduardo Manchon Aguilar创建。
2005年10月03日,网站正式发布,
2007年03月19日,它已存档超过一百万张用户提交的照片。
2007年06月27日,图片数量达到两百万。
2007年10月25日,这个数字增加到五百万。
2007年05月30日,谷歌宣布计划收购Panoramio.com。同年6月,网站被谷歌收购。
2010年01月20日,Eduardo Manchon在Panoramio的博客宣布了自己离开谷歌的决定。照片的组织方式
用户可以通过标签方式(元数据的一种形式)来组织图片。标签方式的使用使得搜索者可以较为容易地
找到关于一个确定的主题,例如某个地点的照片。
Panoramio 也是使用标签云的先驱网站之一;通过标签云的帮助,用户可以直观地了解到哪些标签的图
片最为热门。
在Google地球上展示
Panoramio 网站上经过用户定位的照片符合谷歌地球收录条件并经管理人员审查通过之后,通常在一星
期后便会在Google 地球上相应的位置展示,而等待接受审查的时间最多需要三星期。2. Miscs
以钱德勒、彭罗斯为代表的企业成长组织理论认为:企业自身作为一种组织安排所具有的学习、协调及组
织能力决定着企业成长的速度、路径和极限。彭罗斯还认为:成长作为一种过程,而规模只是一种状态。
企业增长的实际不是技术规模,而是制度边界。3. // Implentation of multiplication by paper-pencil method
// See: D. E. Knuth 4.3.1
BigInteger& BigInteger::Multiply(DATATYPE const& with) const {
BigInteger& Result = *new BigInteger(Digits()+1,0);
long Carry, Multiply;
SizeT i;
Carry = 0;
for (i = 0; i < Digits(); i++) {
Multiply = Carry + (long)TheNumber[End-i] * (long)with;
Carry = Multiply / BASE;
Result.TheNumber[Result.End-i] = Multiply % BASE;
}
Result.TheNumber[Result.End-i] = Carry;
Result.TrimZeros();
return Result;
}
(10a+b)(10c+d) = 100ac + 10(ad+bc) + bd = 100ac + 10(ad+bc+m) + n = 10(10ac + ad+bc+m) + n
= 10((10a+b)c + ad + m) + n
bd = 10m+n
A(m)*B(n) = (10*A(m-1) + A(1))*(10*B(n-1) + B(1))
= 10*(A(m)*B(n-1) + A(m-1)*B(1) + A(1)*B(1)/10) + A(1)*B(1)%10
A(n) = 10*A(n-1) + A(1)
A(m)+B(n) = 累加进位 -
1. 正则表达式的高级应用
1) 匹配中文字符 [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配HTML标记的正则表达式:<(.*)>.*<\/\1>|<(.*) \/>/
反向引用构造允许在同一正则表达式中随后标识以前匹配的子表达式。
反向引用构造 说明 模式 匹配
------------ ---------------------------------- ------------------- ------------------
\数值 后向引用。匹配编号子表达式的值。 (\w)\1 “seek”中的“ee”
\k<name> 命名后向引用。匹配命名表达式的值。 (?<char>\w)\k<char> “seek”中的“ee”
------------ ---------------------------------- ------------------- ------------------
2) 组的概念:一个正则表达式匹配结果可分成多个部分,这就是组(Group)的目的。
string str = "2005-2-21";
Regex rex = new Regex(@"(?<y>\d{4})-(?<m>\d{1,2})-(?<d>\d{1,2})");
Match mat = rex.Match(str);
mat.Groups["y"].Value;
rex = new Regex(@"(\d{4})-(\d{1,2})-(\d{1,2})");
mat.Groups[1].Value;
rex = new Regex(@"(?<2>\d{4})-(?<1>\d{1,2})-(?<3>\d{1,2})");
mat.Groups[2].Value;
通过以上三例,我们知道了给Regex定义Group的三种办法以及相应的引用组匹配结果的方式。
3) 正则表达式对应于乔姆斯基层级的类型-3文法2. C#中的@符号的三种使用方法
// @不必转义:
string fip = "C:\\Program Files\\Microsoft.NET\\test.txt";
string fip = @"C:\Program Files\Microsoft.NET\test.txt";
// @字符串能够跨越数行。用于在CS中写JS或SQL代码比较方便。
string smr = @"Line1
Line2";
// 允许C#中@保留关键字作为标识符
class @class { ... } -
1. 邮件附件的阅读管理
v 1) 目前的处理方式 EmailDownload.aspx?Name=Bank transfer A1000034.jpg
在那里进行文件分类路由,如将可阅读文件(这里是jpg图片)路由到:
FileMgmt.aspx?cat=attachment&file=Email\Date.Year\Date.Mon\EmailID_file.ext
FileMgmt.aspx?cat=attachment&file=Email\2010\05\5258_Bank+transfer+A1000034.jpg
其实所有可阅读文件皆可按此方法路由阅读。
v 2) winmail.dat 也可在此做特殊的路由处理。
str = new FileStream("winmail.dat", FileMode.Open, FileAccess.Read);
stm = new SharpTnefMessage(str);
stm.Parse("Email\_Winmail");
然后转过去直接阅读目录即可。
复制 Tnef 库。copy C:\JYC2011\Project.NET\Tnef\bin\Tnef.dll
C:\JYC2012\Project.NET\EOffice\Web\bin /Y
3) 此次 TNEF 阅读器项目直接建立成 EOffice 应用;
甚至就是基于 EOfficeAgent API 的用户 eac 应用;
然后分享到 EOffice 公共应用中来;
4) 建立邮件与EOffice应用的无缝连接
基本态度转变:承认Email应用的现实地位,接纳Email作为企业信息系统的基础设施;
扩展邮件附件与应用的关联;
在 EOfficeAgent API 基础类之上,建立文件阅读器类二代接口;2. EOffice改进
1) 邮件的“权限”属性
可使用标准化的“公开/分享/汇报/私有”,可将目前的邮件管理方法理解为缺省的“私有”状态。
2) 承认显式隐式标签的差别
显式标签是明确定义存储,且明确显示,隐式标签通过标记定义,只存储不显示。
3) UIDL命令的集中获取
user yuchun +OK yucn... User ok
pass 61 +OK yucn@yifan.com mailbox has 3 total messages (82763 octets)
list +OK 3 82763
1 28686
2 35970
3 18107
uidl +OK
1 MD50000014768:MSG:28686:30219936:3822943194
2 MD50000014769:MSG:35970:30219938:1795196102
3 MD50000014770:MSG:18107:30219938:2050196102
612封邮件的UIDL信息量大致30K的样子,反正都是要反馈给客户端,应该一次性反馈回客户端。
v 4) 超大文件的阅读点击不能直接阅读
可能会死机,比如50M的txt文件显示在页面上,此时要进行预截取处理,先只读取2M。
5) 实体评论后自动关注实体吗?
其实就是将“主题发帖自动关注主题”,在更一般意义上的实体上“如法炮制”。3. Miscs
己亥杂诗:九州生气恃风雷,万马齐喑究可哀。我劝天公重抖擞,不拘一格降人才。
己亥,是我国古代用天干地支法来标记的年月,在诗中它其实就是一八三九年。这年龚自珍辞官南归,后
又北上接取家属,在南北往返的途中,《己亥杂诗》诞生了。天干地支算法
天干:甲1、乙2、丙3、丁4、戊5、己6、庚7、辛8、壬9、癸0。
地支:子1、丑2、寅3、卯4、辰5、巳6、午7、未8、申9、酉10、戌11、亥0。
算法:(年份 - 3)/ 10 余数为天干
(年份 - 3)/ 12 余数为地支
甲申国难:1644年,农历三月十九,李自成进京,明朝灭亡;
癸酉之变:1813年,嘉庆十八年九月,发端广东,后京城爆发;
甲午战争:1894年,光绪二十年,日本侵略中国和朝鲜;
庚子首义:1900年,孙中山革命;庚子赔款;
辛丑条约:1901年,光绪二十七年,八国联军攻占北京强迫清政府订立;
辛亥革命:1911年,中华民国成立;清王朝灭亡;六十花甲子
1.甲子 11.甲戌 21.甲申 31.甲午 41.甲辰 51.甲寅
2.乙丑 12.乙亥 22.乙酉 32.乙未 42.乙巳 52.乙卯
3.丙寅 13.丙子 23.丙戌 33.丙申 43.丙午 53.丙辰
4.丁卯 14.丁丑 24.丁亥 34.丁酉 44.丁未 54.丁巳
5.戊辰 15.戊寅 25.戊子 35.戊戌 45.戊申 55.戊午
6.已巳 16.已卯 26.已丑 36.已亥 46.已酉 56.已未
7.庚午 17.庚辰 27.庚寅 37.庚子 47.庚戌 57.庚申
8.辛未 18.辛巳 28.辛卯 38.辛丑 48.辛亥 58.辛酉
9.壬申 19.壬午 29.壬辰 39.壬寅 49.壬子 59.壬戌
10.癸酉 20.癸未 30.癸巳 40.癸卯 50.癸丑 60.癸亥十二生肖纪年
子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪
1963年为癸卯年 卯兔 1964年为甲辰年 辰龙 1989年是己巳年 巳蛇;
1844年10月15日 德国哲学家尼采诞辰;天干地支发音:
甲jiǎ、乙yǐ、丙bǐng、丁dīng、戊wù、己jǐ、庚gēng、辛xīn、壬rén、癸guǐ
子zǐ、 丑chǒu、 寅yín、 卯mǎo、 辰chén、巳sì、
午wǔ、 未wèi、 申shēn、 酉yǒu、 戍xū、 亥hài【增长萎缩】二月,民营经济为主的粤浙工业增幅创三年新低
【企业裁员】比亚迪、美的、恒大、三一重工……此前一路高歌猛进的中国企业纷纷裁员
【转型艰难】代工生产商难以转变其业务模式,走向海外的中国本土消费品牌寥寥无几
【泡沫破灭】互联网泡沫从美国烧到中国。优酷和土豆合并,互联网企业在苟延残喘
【房价下滑】货币紧缩的效应开始传导到房价上,房价将会一直下行
【油价高涨】油价早已轻松的漫过100美元大关,油价已取代欧债成为全球经济头号风险 -
v 1. 解决论坛搜索加亮关键字与标记连接的冲突
问题:在论坛搜索“编码规则”
\\192.168.0.16\产品发行资料\成品、半成品及物料 CLASS=HLT>
编码规则
<A HREF="\\192.168.0.16\产品发行资料\成品、半成品及物料<SP
AN">\\192.168.0.16\产品发行资料\成品、半成品及物料<SPAN</A
> CLASS=HLT>编码规则</SPAN>
分析:先 HIGHLIGHT,后 HtmlEscape 两次叠加所致混乱。
* 混合使用正则表达式的“匹配Match”和“分离Split”RegEx.Match/Split 方法,参考算法:
var M = E.match(J), B = M[0], F = E.split(J), G = 0;
if (E.indexOf(F[0])) F=[''].concat(F);
do { H[A++] = F[G++]; H[A++] = N(B) } while (B = M[G]);
H[A++] = F[G] || '';
return H.join('')
* 原来使用方法:
<%= EOffice.Common.Util.HtmlEscape(CurTopic.Content, _
EOffice.Common.TextPseudo.LinkMode.MARK_LINK, , _
Request("HLT")) %>
* 高亮显示处理:
lin = Highlight(lin, hlt)
标记处理:
lin = TextPseudo.MarkLink(lin, hlt)
解决:修改算法,二者同时进行,即让 HIGHLIGHT 渗透进 HtmlEscape 转义之中。
修改 MarkLink 方法:
' 名称:进行内容的标注连接(MarkLink)计算处理
' 说明:如将文本“http://url”转化为连接串“<A HREF=...>...</A>”
' 参数:text 要进行标记处理的文本;
' 可选 hlt 要加亮的关键字,缺省为空 Nothing,无须加亮。
Public Shared Function MarkLink(ByVal text As String, _
Optional ByVal hlt As String = Nothing _
) As String
Return RexMarkLink.Replace(text, AddressOf MarkLinker)
End Function
由原来简单单一的 RegEx.Replace 改为 RegEx.Match 和 Split方法的交替累加,在累加过程中再
分别行高量文本 HighLight 的处理。
测试:用例:测试日志搜索 @张飞、@李斯 #文件系统 #测试:public:\ public:\图片\ 时,搜索字的加
亮显示与标记连接的冲突问题。
搜索“系统”,将包含本日志,加亮与标记显示和谐共处,通过!2. 我的活动
1) 我们部门有约法三章,上班必须登陆EOffice,周末必须写出本周工作总结,内容框架
为:总结本周工作,提出发现的问题,布置下周的工作计划。请自觉遵守!:)
2) 自动化帮助文档对于 API 系统的成功至关重要。需要开始考虑这些问题。
3) 青年人的争夺。 -
1. API类可见范围与生命周期
公式:GetType(EATClass).FullName
结果:EOffice.POffice.EATClass
问题:? New EATClass().Eval() 将死循环!
安全:跟踪:SELECT * FROM Visit WHERE EntityID = 'EOfficeAgent' ORDER BY RegDate DESC2. 绘图语言的实现
Limit
Point / Line / Polyline / Rectangle / Polygon / Circle / Eclipse
Text3. 我们总想走捷径,这世界真有捷径吗?
乔布斯告诉我们Stay Hungry, Stay Foolish,而我们真学习,可惜的是学来告诉员工 Stay Foolish,而
自己却 Too Clever! 有时候傻一点反倒最明智,相反太聪明反倒做傻事。 -
1. 增加 EOfficeAPI 包与 EOfficeAgentFactory 工厂类
仍然放在 EOffice.POffce 程序集和命名空间里;
' 名称:类脚本识别器
Private Shared ReadOnly RegexClass As Regex _
= New Regex("\A(^[\s\t]*'.*)*[\s\t]*Class[\s\t]*(?<Name>\w+)", RegexOptions.Compiled)2. 扩展 AgentService 服务调度
1) 增加EOfficeAgent计算器EVAL/脚本CLASS/FUNCTION/SCRIPT命令。
eac.WriteLine("Eval 计算器公式 当计算器求公式值。")
eac.WriteLine("Class 类定义 End Class 运行自己编写的EOffice代理应用。")
eac.WriteLine("Function 脚本 End Function 运行自己编写的EOffice即时脚本。")
eac.WriteLine("Script 脚本文件 参数 运行自己编写的EOffice脚本文件。")
2) EOfficeAgent命令的类脚本识别
' 名称:类脚本识别器
Private Shared ReadOnly RegexClassFunction As Regex _
= New Regex("\A(^[\s\t]*'.*)*[\s\t]*(Class|Function|Private|Public)", ...)
3) ' 名称:执行 EOffice 类脚本
' 说明:EOfficeAgent 类或函数 Function 脚本定义
' 参数:格式 [类脚本 End Function/Class]
' 返回:计算结果
Private Sub CmdClass()
If eac.ctt Is Nothing Then
eac.WriteLine("必须有脚本代码")
Return
End If
' 动态创建代码、编译、加载
Dim res As Object = EOfficeAgentFactory.Exec(eac.ctt)
If res Is Nothing Then
eac.WriteLine("出错:" + eac.ctt)
Return
End If
eac.WriteLine("运行结果:" & vbCrLf + res)
End Sub3. EOfficeAgent 代码首版示例
' 执行:执行 EOfficeAgent 脚本代码
' 说明:固定用 EOfficeAgent 作为标准入口点方法
' EOfficeAgent 脚本的基本结构:
' ' 注释:EOfficeAgent 代码首版示例
' Private LogSum As New ArrayList()
' Function Sum(ByVal x As Integer, ByVal y As Integer) As Integer
' Return x + y
' End Function
' Public Function EOfficeAgent(ByVal x As Integer, ByVal y As Integer) As String
' Dim s As Integer = Sum(x, y)
' Dim res As String = "(+ " & x & " " & y & ") = " & s
' LogSum.Add(res)
' Return res
' End Function
' 参数:cod 动态的 EOfficeAgent 脚本代码;
' 可选 args 执行参数,即用户定义的 EOfficeAgent 方法的参数。
Public Shared Function Exec(ByVal cod As String, ByVal ParamArray args() As Object) As Object
Dim fac As New EOfficeAgentFactory(cod, "EOfficeAgent")
Dim res As Object = fac.Run(args)
Return res
End Function4. EOffice工具
v 1) 增加EOfficeAgent计算器Eval
测试:EVAL 1+2 = 3 和 EVAL 1+22*5/(7+3) = 12,完全成功!
v 2) 自定义公式/函数,脚本Class/Function
测试:代码如下:
' 注释:EOfficeAgent 代码首版示例
Private LogSum As New ArrayList()
Function Sum(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
Public Function EOfficeAgent() As String
Dim x As Integer = 12, y As Integer = 34
Dim s As Integer = Sum(x, y)
Dim res As String = "(+ " & x & " " & y & ") = " & s
LogSum.Add(res)
Return res
End Function
测试结果:“(+ 12 34) = 46”,测试通过!
3) 自定义类脚本文件Script命令;
4) 电子表格的升级版:网络表格; -
1. EOffice API 马峦计划(II)——脚本框架原形设计
1) 目标脚本设计
遵循 JavaScript 脚本规范;扩展 EOfficeAgent Script 命令:
Script MyEOfficeScript
var usr = new User('jvy');
print(usr.Name, usr.EmpID);
End Script
保存在个人文件柜 EOfficeScript 目录下 MyEOfficeScript.js;
2) IDE 设计
扩展页面 EOfficeAgent 实现 Script 架构;
3) 运行支持
基本库 SDK 包:EOfficeScript.js,实现:
* 基础对象 User 用户类;
* 元命令 print 命令;
4) 实现顺序与步骤
print -> EOfficeAgent -> User -> Script.Save/Load -> import
5) EOfficeAgent 需要在服务器端后台默默实现 JavaScript 脚本运行,如之何?
// 服务器端javascript
如果要在VB.net中执行JavaScript代码,请使用ScriptControl组件。方法:
在你的工程中引用 Microsoft Script Control 1.0 这个COM组件(注意是COM的,不要到.net组件里去
找),然后用下面的方法执行JavaScript:
Dim sct As New MSScriptControl.ScriptControl
sct.Language = "JavaScript" ' 设置语言种类
sct.AddCode("function TestFunc() {return 'Hello world!'}") ' 添加脚本代码
print(sct.Run("TestFunc")) ' 显示一下那段脚本的返回值2. 动态创建类的工厂与动态编译
Public Class EvalClassFactory : Implements IClassFactory
Public Function Create(ByVal formula As String) As String _
Implements IClassFactory.Create
Dim ret As New StringBuilder("")
ret.Append("Imports System").Append(vbCrLf)
ret.Append("NameSpace MyNamespace").Append(vbCrLf)
ret.Append("Public Class MyNewClass").Append(vbCrLf)
ret.Append(" Public Shared Function MySub()").Append(vbCrLf)
ret.Append(" Return ").Append(formula).Append(vbCrLf)
ret.Append(" End Function").Append(vbCrLf)
ret.Append("End Class").Append(vbCrLf)
ret.Append("End NameSpace")
Return ret.ToString
End Function
End ClassDim compiler As ICodeCompiler = New VBCodeProvider().CreateCompiler()
Dim compilerParams As New CompilerParameters()
compilerParams.ReferencedAssemblies.Add("System.dll")
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll")
compilerParams.GenerateInMemory = TrueDim compiled As CompilerResults
compiled = compiler.CompileAssemblyFromSource(compilerParams, code)
If (Not compiled.Errors.HasErrors) Then
errorMsg = "No error."
Else
errorMsg = compiled.Errors.Count.ToString() + " error(s):"
Dim iCount As Integer
For iCount = 0 To compiled.Errors.Count - 1
errorMsg = errorMsg & vbCrLf & "Line: " _
& compiled.Errors(iCount).Line.ToString & " - " _
& compiled.Errors(iCount).ErrorText
Return Nothing
Next iCount
End IfDim myAssembly As System.Reflection.Assembly = compiled.CompiledAssembly
Dim loadedObject As Object
loadedObject = myAssembly.CreateInstance("MyNamespace.MyNewClass")
If loadedObject Is Nothing Then
MessageBox.Show("Couldn't load class.")
Return Nothing
End If
Try
Dim retValue As Object = loadedObject.GetType().InvokeMember(
"MySub", BindingFlags.InvokeMethod, Nothing, loadedObject, Nothing)
Return retValue
Catch e As Exception
MessageBox.Show(e.Message, "Compiler Demo",
MessageBoxButtons.OK, MessageBoxIcon.Information)
End TryPrivate Function runcode(ByVal code As String)
Public Function eval(ByVal code As String) As Object
factory = New EvalClassFactory()
Return runcode(factory.Create(code))
End FunctionPublic Class ScriptClassFactory : Implements IClassFactory
Public Function Create(ByVal script As String) As String _
Implements IClassFactory.Create
Dim ret As New StringBuilder("")
ret.Append("Imports System").Append(vbCrLf)
ret.Append("Imports System.IO").Append(vbCrLf)
ret.Append("Imports System.Windows.Forms").Append(vbCrLf)
ret.Append("NameSpace MyNamespace").Append(vbCrLf)
ret.Append("Public Class MyNewClass").Append(vbCrLf)
ret.Append(" Public Shared Function MySub()").Append(vbCrLf)
ret.Append(script).Append(vbCrLf)
ret.Append(" End Function").Append(vbCrLf)
ret.Append("End Class").Append(vbCrLf)
ret.Append("End NameSpace")
Return ret.ToString
End Function
End Class
' 代码清单5、Evaluator.exec()函数
Public Function exec(ByVal code As String) As Object
factory = New ScriptClassFactory()
Return runcode(factory.Create(code))
End Function3. 诗经·大雅·板
上帝板板 下民卒瘅 出话不然 为犹不远 靡非管管 不实于亶 犹之未远 是用大谏
天之方难 无然宪宪 天之方蹶 无然泄泄 辞之辑矣 民之洽矣 辞之怿矣 民之莫矣
我虽异事 及尔同僚 我即尔谋 听我嚣嚣 我言维服 勿以为笑 先民有言 询当刍荛
天之方虐 无然谑谑 老夫灌灌 小子蹻蹻 匪我言耄 尔用忧谑 多将熇熇 不可救药
天之方懠 无为夸毗 威仪卒迷 善人载尸 民之方殿屎 则莫我敢葵 丧乱蔑资 曾莫惠我师
天之牖民 如埙如篪 如璋如圭 如取如携 携无曰益 牖民孔易 民之多辟 自无立辟
价人维蕃 大师维垣 大邦维屏 大宗维翰 怀德维宁 宗子维城 无俾城坏 无独斯畏
敬天之怒 无敢戏豫 敬天之渝 无敢驱驰 昊天曰明 及尔出王 昊天曰旦 及尔游衍板板:反也。指反常。瘅(音丹):病。出话不然:出其善言而不行之也。犹:道也。指政策,谋划。
靡:无。管管(音贯):无所依也。不实于亶(音胆):言行相违。亶,诚也。宪宪:欣欣。
蹶(音贵):动也。指动乱。泄泄:多言貌。辞:谓政教也。辑:和也。怿(音义):败坏。一说喜悦。
莫:病。指政令病人。一说安定。异事:职务不同。嚣嚣(音敖):傲。一说不听善言。服:事。
刍荛:割草打柴的人。谑谑(音血):喜乐貌。灌灌:诚恳貌。蹻蹻(音决):骄貌。忧:优,调戏也。
熇熇(音贺):火势炽盛貌。懠(音齐):怒。夸毗(音皮):指屈己卑身以柔顺人。卒:尽。迷:迷乱。
善人载尸:贤人君子则如尸矣,不复言语。殿屎(音西):呻吟。葵:揆,度。蔑:无。资:财。
师:指众民。牖(音有):通诱。诱导。如埙如篪…携无曰益:比喻诱导下民很容易。辟(音必):法,刑。
价(音介)人:善人。一说披甲之人,掌军事者。大师:大众。一说三公。大宗:王之同姓之適子也。
宗子:群宗之子。渝:变。驱驰:指放纵自恣。王:往之假借。游:行。衍:溢。游衍,放散之义。
引自《轻松学诗经》http://cuixidong.at.china.com -
v 1. 深化“固定角色”概念
问题:角色“客户经理”怎么不能多部门建立?
分析:目前“CUSMANAGER 客户经理 客户关系管理CRM”被设置为“固定角色”,所以不能增加。
搜索全部关键字“CUSMANAGER”的文件。
解决:' 名称:获取 [某部门] [固定角色代码] [用户] 的角色
' 说明:一般固定角色只有一个,加可选的部门、用户便于检查或未来的扩展;
' 当允许多部门共享该固定角色时,请在固定角色定义中的角色备注前加“*”前缀;
Public Shared Function GetFixedRole(ByVal fixedRoleCode As String, _
Optional ByVal DepID As String = Nothing, _
Optional ByVal UserID As String = Nothing _
) As Role
Dim frn As String = MiscMeta.GetCatItem("FIXEDROLENAME", fixedRoleCode)
If frn.StartsWith("*") Then frn = frn.Substring(1)
Return GetRole(frn, DepID, UserID)
End Function
可重复的固定角色最为典型的就是“经理、文书”,需要在数据库中修改该固定角色定义。
增加函数 RoleSystem.GetFixedRoleKey(RoleName) As String
RoleSystem.AllowFixedRoleRepeat(RoleName) As Boolean
MiscMeta.GetKey("FIXEDROLENAME", RoleName.Text)
问题:需要修改哪些算法?比如数据库函数或存储过程中?
解决:考虑历史兼容性,改成在备注中加*前缀标志是否允许重复,如下 Misc 数据:
FIXEDROLENAME 固定角色名称 固定角色名称,备注带*前缀表示允许重复
测试:通过!2. Miscs
人们有时看待“选择性真实”,好象是带有谎言性质。但其实选择性真实是有其必然性的,人们不必避讳
自己的选择性真实的事实,因为即使你无所选择的真实也必然是带有选择性的,首先它是与你这个个体的
对事物的认识程度相关的,每个人肯定有你自己对该事物的观察视角、深度与历史,另外也与个人对外的
传达能力相关。所以,你所得出的任何所谓全面的结论其实都是有选择性的。 -
1. EOffice API 马峦计划
1) 建立 EOffice 自己的基础 JavaScript IDE 调试环境
改造 sys/EOfficeAgent.aspx 页面
增加 EOfficeAgent 脚本命令
Script ... End Script
统一已有 EOfficeAgent 命令到新的框架下;
重定向 print 方法到输出框;
重定向 alert 方法到消息 Message 标签;
2) 支持脚本的保存与调用;
允许用户设计编程自己的脚本;
最基本的输出可以到 Excel 表格编程输出。
3) EOffice API 基本库
用户对象 User、Department、Doc
EOfficeDeps =
4) 语言选择问题
JavaScript 与 F# 还是坚持自己的语言?
F#语言设计的目的是什么?
遵循什么标准?有宏支持吗?变换如何?2. Miscs
v 1) 扩展一条 EOfficeAgent 的 Dep 命令
像 User 命令一样,这里是获取部门信息;要让系统转起来不简单,基础资料必须真实。真实也很不简单,它更多地体现在一个过程中,很难一蹴而
就。因此 ERP 的真正运转必须化成长时期日常行为的艰苦努力。 -
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
// 参数:E 加密压缩后的 JavaScript 压缩加密脚本;
// I 符号表码表;字符串数组,可以理解为解密需要字典;
// A 码表 I 长度 9,可以省掉,直接用 I.length 即可;
// D 码干扰因子 109 = 100 + 9;
// J 符号分解器,就是个正则表达式;
// K 码符号对应表;
// L 过滤解码表对象;
// H 数组,用途未知,似乎是混淆视听。
// 说明:简单修改 codec 即可既用于解密,也用于反向的加密,参数设计如下:
// 解密:输入 E I A D J L 输出 K;
// 加密:输入 E D 输出 I A K;
// 参考:我所见到的 http://www.cnblogs.com/midea0978/archive/2008/04/19/1161235.html
var codec = function(E,I,A,D,J,K,L,H) {
// 仿base64编码变换的算法,符号序号密码递归生成器。根据序号加偏移干扰因子计算符号密文
function C(A){
return A<62 ? String.fromCharCode(A+=A<26?65:A<52?71:-4)
: A<63 ? '_' : A<64 ? '$' : C(A>>6) + C(A&63)
}
// 生成码、符号对应表 K 知识库
while (A>0) K[C(D--)] = I[--A];
// 码表匹配替换器
function N(A) {
// 编码调用时 I 为空,K 增加 length 属性;
if (I.length==0) K.length = 0;
if (K.length!=undefined) {
for (key in K) if (K[key]==A) return key;
K[key=C(D+(++K.length))] = A;
return key;
}
// 码表无此码则返回码,否则返回解码
return K[A]==L[A] ? A : K[A];
}
// 不支持替换因子的使用该方法,否则直接使用替换因子
if (''.replace(/^/,String)) {
var M = E.match(J),
B = M[0],
F = E.split(J),
G = 0;
if (E.indexOf(F[0])) F = [''].concat(F);
do {
H[A++] = F[G++];
H[A++] = N(B)
} while (B=M[G]);
H[A++] = F[G] || '';
return H.join('');
}
// 密文 E 用密码分解器 J 分解,通过密码表 N 替换回原来的明文
return E.replace(J, N)
};// 直接解码
document.all.tx1.value = codec(
'Bl Bm=Bn;Bo(Bl Bp=Bq;Bp<Bn;Bp++){ Br.Bs(Bm+Bp+"<Bt>"); }',
'var|index|100|for|a|0|document|write|br'.split('|'),
9, 109, /[\w\$]+/g, {}, {}, []
);
// 过滤解码
document.all.tx2.value = codec(
'Bl Bm=Bn;Bo(Bl Bp=Bq;Bp<Bn;Bp++){ Br.Bs(Bm+Bp+"<Bt>"); }',
'var|index|100|for|a|0|document|write|br'.split('|'),
9, 109, /[\w\$]+/g, {}, {Bl:'var'}, []
)// 反向编码 I 码表输入为空,输出为 K 码表
K = {};
document.all.tx3.value = codec(
'var index=100;for(var a=0;a<100;a++){ document.write(index+a+"<br>"); }',
[], 0, 100, /[\w\$]+/g, K, {}, []
)
for (key in K) alert(K[key]);// 自由的 JavaScript,以下语句等价:
document.all.txt.value = '属性也可以是方法?!';
alert(document.all.txt.value);
alert(document['all']['txt']['value']);// 方法也可以是属性,属性与方法是等价的!
document.write('<br>'+document.all.txt.value);
document['write']('<br>'+document['all']['txt']['value']);
// 经过以下符号表变换人就看不懂了,立即让 JavaScript 代码变残废。这里看到的似乎是这样一副颠倒的
// 场景:人们被猪、狗牵着,剁成肉馅,狗拿着笤帚在炒菜,猪拿着铲子在扫地。
var 残废 = ['write','<br>', 'all','txt','value'];
document[残废[0]](残废[1]+document[残废[2]][残废[3]][残废[4]]);</SCRIPT>
-
1. 系统的静态加载问题
1) Shared New 构造函数的执行是不确定的
运行 Shared 构造函数的确切时间基本上是由实现决定的,但需要满足以下几个条件:
Shared 构造函数在创建类型的任何实例之前运行。
Shared 构造函数在引用类型的共享成员之前运行。
Shared 构造函数在加载任何派生类型之前运行。
这一条VB与C#恰好相反。
Shared 构造函数不会在单次程序执行过程中运行一次以上。
2) 还可以构造循环依赖项,以便可以在 Shared变量的默认值状态中观察它的变量初始值设定项,如下例
所示:
Class A
Public Shared X As Integer = B.Y + 1
End Class
Class B
Public Shared Y As Integer = A.X + 1
Shared Sub Main()
Console.WriteLine( "X = " & A.X & ", Y = " & B.Y)
End Sub
End Class
输出结果为:X = 1, Y = 2
解释:I. 为了执行 B.Main 方法,
II. 系统首先加载类 B。
III. 类 B 的 Shared 构造函数继续计算 B.Y 的初始值,
IV. 由于 B.Y 引用了 A.X 的值,Y 的初始值递归地导致加载类 A。
V. 类 A 的 Shared 构造函数反过来继续计算 A.X 的初始值,
VI. 并在此过程中获取 B.Y 的“默认”值,该值为 0。
VII. A.X 由此初始化为 0 + 1 = 1。
VIII. A 的加载过程随之结束,
IX. 返回 B.Y 初始值的计算,其结果变为 1 + 1 = 2。 -
v 1. EOffice改善
v 1) 两种登陆的在线进入限制
问题:可能确实是Authenticate(Password) 是Online OR Active<90禁入,而 Authenticate(Cookie)
则是 Online AND Active<90 才禁入,前后逻辑很蹊跷。
2012-02-17 22:07 通过网页
分析:前者(密码登陆)的意思是: 不在线且不活动才进入;即 (~O AND ~A);
后者(Cookie登陆)的意思是:不在线或不活动都可进入;即 (~O OR ~A);
现在的设计是 Online/Offline设置与活动时间设置与清除是同步的,二者按理讲是不可能出现
矛盾的,因此应该统一二者、或完全分离二者的处理。
解决:在用户的下一次 Heartbeat 时检查到 Offline 应该立即登出用户,即 SignOut 用户,本来也
是这么做的,只是不干净,统一 HeartBeat 只能由 CommonPage.OnInit 来做。
先采取完全分离策略,Active 时间代表客户端的在线时间,只能由心跳方法 Heartbeat 来设
置,而 Heartbeat 只能由客户端的活动设置。
调整 O 和 A 逻辑,即Kill设置用户脱机时不能清除在线时间。
增加客户端是否在线 IsClientOnline 判断函数:
Public Shared Function IsClientOnline(ByVal userID As String) As Boolean
Return DateDiff(DateInterval.Second, GetActiveTime(userID), Now) < 90
End Function
见下表 AP=~S AND ~C;AC=^C
v 2) 关于Kill的路径错误核查
问题:u在A处进入 EOffice,a在B处Kill(u)后,u在B处可再立即登陆,按理讲u在a处会自动退出,但
失败,u在B处退出后,u在A才会自动退出。周一排查错误。
2012-02-17 21:42 通过网页
问题:在线用户有两个 jcy
解决:见下表 AP=~S AND ~C;AC=^C
v 3) 登陆情形状态矩阵
情形与顺序 服务端S 客户端C 手工登陆AP Cookie登陆AC
----------------------- ------- ------- ------------ ------------
登陆(手工/Cookie) On On x x
正常退出 Off Off v v
----------------------- ------- ------- ------------ ------------
非正常退出0~2分 On On x x
非正常退出2~30分 On Off x v
非正常退出30~分理论上 Off Off v v
----------------------- ------- ------- ------------ ------------
非正常退出30~分异常 On Off x v
----------------------- ------- ------- ------------ ------------
阻止后0~2分 Off On x x
阻止后客户未关闭2~分 Off Off v v
阻止后客户关闭2~分 Off Off v v
----------------------- ------- ------- ------------ ------------
总结:对于非系统用户 AP=~S AND ~C AC=^C
注意:2分系EOffice系统刷新时间(Heartbeat=1分),30分是系统在线超时时间(Session Timeout)。
v 4) 测试:通过!
其实在 CommonPage.OnInit 判断阻止的最好办法是:通过 SessionID 判断,Kill.Logout(uid) 时,
会删除掉该用户的 UserOnline 记录,自然其 SessionID 也会丢失,当前在线用户的 SessionID 记
录在数据库 UserOnline 表里是否存在,即可查出,暂时先不考虑。2. 更换ERP系统需要考虑的因素(III)
1) 大家的意见
小公司与大公司;
K3大家公认的问题是,实施团队太弱,不重视实施;他们只是卖软件;
随着实施的推进深入,也会发现很多问题。
演示的时候实际操作层面的东西太少,看我们提供的复杂的BOM,它们的系统如何建立、维护、
销售如何下单再说。我们的产品相比车载电子产品,还是复杂一些。
两个问题:可追溯性,BOM如何维护。
是革命还是改良,看来是个问题。
和往年这个时候不一样,现在生产正忙。
2) 实施费用
三个月,费用48万,以后每月1万。
问题:历史数据如何利用与转化。
物料编码及规则能否沿用;数据库元数据及开放性;源代码问题; -
1. 今日实现EOffice有限连续登陆
v 1) 通过Cookie实现 sxfds自动登陆说明
EOfficeUserID 有效期调整为7天;好处:当系统无端重启时,会话仍可自动还原。
EOfficeLoginDate 有效期为1天;以确保 1 天跟踪记录 Trace 一次;
当无 EOfficeUserID 则强制登陆一次;
当有 EOfficeUserID 且是活动的,则禁止登陆;
当有 EOfficeLoginDate 且是最后一次登陆,则恢复登陆;
当无 EOfficeLoginDate 或 EOfficeLoginDate 不是最后一次登陆,则自动登陆;
v 2) 两个Cookie防止重复登陆方法
如果用户是活动的即 ActiveTime 小于1分钟则禁止登陆;
v 3) 退出按钮,要实现Cookie真退出
实现自动登陆后,取消显式退出;
v 4) 日进日出的Login/Logout的逻辑基本不变
但要靠 Session.OnStart/OnEnd 来实现。
v 5) 实验验证
浏览器不退出,而系统重启时SessionID的变化性,结果如下:
第一个 2x1bgdkyjqrs03s4wayj5jne
配置变更 2x1bgdkyjqrs03s4wayj5jne
杀掉W3WP 2x1bgdkyjqrs03s4wayj5jne
结论:SessionID是跟着浏览器走的。2. 自动登陆方案设计
方案 I:检查如果与最后一次登陆的Session.SessionID、Cookie("EOfficeUserID")、EOfficeLoginDate
三项完全匹配,则自动登陆,并且不增加 Trace 登陆跟踪记录。
增加 Cookie("EOfficeLoginDate") 项,与系统的 Session("gsLoginDate") 完全一致。
否则需要重新登陆。
方案II:在方案 I 的基础上,再增加:
自动让 EOfficeUserID 通过登陆,且增加新的 Trace 登陆跟踪记录,传递新的登陆时间到客户
端 Cookie("EOfficeLoginDate") 记忆。
无 Cookie("EOfficeUserID"),即 Cookie 过期失效或新换客户端登陆,则需要重新登陆,逻辑
同前。
结论:就按方案II实现。3. 自动登陆实现改造
v 1) Authenticate.ascx.Page_Load
Response 设置的 Cookie 在 Redirect 转移时,会带入。
Dim cok As HttpCookie = Request.Cookies("EOfficeUserID")
If Not cok Is Nothing Then
UserID.Value = cok.Value
Dim dat As DateTime = #12:00:00 AM#
Dim cod As HttpCookie = Request.Cookies("EOfficeLoginDate")
If Not cod Is Nothing Then dat = CDate(cod.Value)
Dim usr As User = UserSystem.Authenticate(UserID.Value, Session.SessionID, _
Request.UserHostAddress(), dat, True)
If Not usr Is Nothing Then
SignIn(usr, dat)
End If
End If
v 2) Authenticate.ascx.Login
真正的退出的 Cookie 清除在此处理:
其余的登陆处理移动到新增的共享登陆 SignIn 方法。
v 3) Authenticate.ascx.Logout
' 退出删除 Cookie
Dim cok As New HttpCookie("EOfficeUserID", "")
cok.Expires = Now.AddDays(-1)
Response.Cookies.Set(cok)
cok = New HttpCookie("EOfficeLoginDate", "")
cok.Expires = Now.AddDays(-1)
Response.Cookies.Set(cok)
v 4) UserSystem.Authenticate
增加方法 Authenticate(UserID, SessionID, FromIP, dat, True)
v 5) UserSystem.Login
就没有该方法,原来直接内置于 Authenticate 内,现在移动到 Trace 类构造方法 New 中。
v 6) UserSystem.Logout
无须改变 -
1. 尝试在SQL2008下建立视图的索引
1) 分析整理索引计算的场合
2) 建立视图的索引
3) 观察比较前后性能。与老徐的交流纲要:
全球经济的最大不平衡:欧美的产业空心与中国的创新空心。
西方的经济、产业空心化,创新却很实在;过度的政治诉求与过度的经济诉求。
中国的政治、创新空心化,但产业短期很实在,对于创新基本疲于应付,开始为多年的反复山寨买单,全
民都玩软的数字虚拟世界,甚至是虚拟的虚拟了,无人搞实实在在的物理级的原始创新。此所以造成所谓
的“产业转型升级”的困境。v 2. EOffice错误调试
v 1) 上传文件大小设置调整
* C:\Windows\System32\inetsrv\config\applicationHost.config
<requestFiltering><requestLimits maxAllowedContentLength="2147483647"/>
其中maxAllowedContentLength单位为字节,这里为2G
* web.config
<httpRuntime executionTimeout="1500" maxRequestLength="262144" ... />
其中maxRequestLength单位用KB,这里为262MB。
v 2) 邮件附件下载文件名编码又开始混乱
Dim ctd As String = "attachment; filename=""" + fem.Attach + """"
Response.AddHeader("Content-Disposition", ctd)
改回 EOffice.Common.Util.UTF8URL(fem.Attach) 模式。
测试:通过!v 3. 邮件密码错误导致的发送错误调试
问题:2012-01-11 10:11:02.776 Password Expired for eoffice@yifantal.com 不正确的数据。
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException()
at Org.eleMentSoft.Security.ElementLicenceManager.Decrypt(String cb64, EncMode, ...)
at EOffice.POffice.EmailAccount.get_EPassWD()
2012-01-11 10:11:02.778 Password isn't crypted use Enterprise key
for eoffice@yifantal.com 不正确的数据。
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException()
at Org.eleMentSoft.Security.ElementLicenceManager.Decrypt(String cb64, EncMode, ...)
at EOffice.POffice.EmailAccount.get_EPassWD()
2012-01-11 10:11:03.004 EmtpEmail.Send: admin(eoffice@yifantal.com)
String reference not set to an instance of a String. Parameter name: s
at System.Text.Encoding.GetBytes(String s)
at Org.eleMentSoft.Email.ElementSmtp.Send()
分析:ElementSmtp.Send 方法
Con.SendCommand(Convert.ToBase64String(Encoding.ASCII.GetBytes(Password)));
密码错误 -> 密码解码错误 -> 导致密码为空 -> 自然有异常。其实密码错误时帐户已永久关闭。
解决:需要调整 EmailAccount.SendEmail 方法,增加如下判断即可:
If Not Status Then Return "帐户已经关闭,可能须重新设置"4. 写第一个GPS/KML阅读器
Google地图API:JavaScript API:
http://code.google.com/intl/zh-CN/apis/maps/index.html
Google地球API:COM API
http://code.google.com/intl/zh-CN/apis/earth/index.html5. Google Maps/Earth下载图片封IP的最佳解决方法
由于要买新手机了,对手机应用软件这几天特别感兴趣。这不,前几天就研究了一下Mobile GMaps,以前
这款软件是使用在线地图图片的。由于 Google 的干涉现在的新版本已经不支持 Google 的在线地图了,
因为 Google 认为这是非法使用他的图片。其实叫我用我还不用呢,那得多少上网费啊。新版支持离线地
图,这就有了一个问题,一个老问题。下载 Google 的图片,我们知道下载 Google 的地图图片如果你老
是使用同一个IP下载(不使用 Google 的 API),那你将有可能被封。目前市面上一般的解决办法就是下
载几十张后休息几秒再下,但这始终不是一个非常好的方法,Google想屏蔽这种方法易如反掌。要说我的方法是啥呢?不新鲜了,使用代理。但是使用代理面临着N多的问题, 到哪儿找这么多的代理?
代理是否有效,是否稳定?你还得对每个代理进行链接前的验证,多麻烦啊!我的方法就是找到了一个好
的代理,一个不会稳定而且不会被封的代理,一个 Google 自己的代理,哈哈!先前在做 iGoogle插件的
时候发现了这个代理,因为所有的插件程序都是通过gmodules.com这个代理加载的。其形式为 http://**
.gmodules.com/ig/proxy?url=进行过encodeURIComponent编码的目标地址。 前面的星号是整数,我试过
了1-1000都是有效的。这就意味着我们一下子就拥有了一千个优秀的代理。我使用这个方法下载过中国0-
10级的卫星图片、街道,下面有下载链接,卫星图片有200M+没地方摆 (图片Mobile GMaps 命名格式)。
Google 会封掉自己的代理吗? 我想可能等 Google 自己发现了这篇文章后会考虑这个问题的。最后附上
Mobile GMaps 的地图图片Perl 下载脚本。6. Miscs
“网络民主”、“社会计算”、“全球IP地理信息动态数据库”;
中美网络斗法比较:中国全民忽悠“云计算”,却晕在“云火车票”上;
美国尝试在全球搞“网络民主”,却实实在在地在全球搞“云部署”与“云采集”; -
1. Google Earth 记录GPS轨迹网基础、市场、价值网络与技术考察
1) GPS轨迹记录 KML/GPX/GPRMC;
GPX是GPS设备通用格式,KML是GoogleEarth专用格式,TXT是设备专用格式;
2) Google Earth API;
3) 轨迹内容市场;
4) 轨迹应用市场;
5) GPS设备市场;2. GPX是GPS设备通用格式
标准组织:http://www.topografix.com/GPX/1/0
GPX示例:
<trkpt lat="22.565125000" lon="113.975990000">
<time>2011-12-11T04:18:27Z</time>
<speed>0.527778</speed>
</trkpt>3. KML是OpenGIS标准
标准组织:http://www.opengis.net/kml/2.2
KML示例:
<Placemark>
<name>-0</name><Snippet/>
<LookAt>
<longitude>113.975990</longitude>
<latitude>22.565125</latitude>
<tilt>66</tilt>
</LookAt>
<TimeStamp><when>2011-12-11T04:18:27Z</when></TimeStamp>
<Point>
<coordinates>113.975990,22.565125</coordinates>
</Point>
</Placemark>4. GPRMC推荐定位信息标准了解
NMEA是美国国家海事电子协会(National Marine Electronics Association)的缩写。 该协会是一家专门
从事海洋电子设备方面研究的民间机构, 它制定了关于全球定位系统GPS电子设备之间的通信接口和协议
的NMEA标准。NMEA-0183协议是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处
理软件、导航软件都遵守或者至少兼容这个协议。NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有 $GPGGA、$GPGSA、$GPGSV、
$GPRMC、$GPVTG、$GPGLL等。1) GPS定位信息$GPGGA;2) 当前卫星信息$GPGSA;3) 可见卫星信息$GPGSV
4) 推荐定位信息$GPRMC;5) 地面速度信息$GPVTG;6) 定位地理信息$GPGLL。示例:$GPRMC,041827.000,A,2233.9075,N,11358.5594,E,001.00,234.00,111211,,,A*69
格式:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*<13><CR><LF>
字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)
推荐最小定位信息
字段 1:UTC时间,hhmmss.sss格式
字段 2:状态,A=定位,V=未定位
字段 3:纬度ddmm.mmmm,度分格式(前导位数不足则补0) 字段 4:纬度N(北纬)或S(南纬)
字段 5:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段 6:经度E(东经)或W(西经)
字段 7:速度kkk.kk,节Knots(1.852千米/小时)
字段 8:方位角ddd.dd,度(二维方向指向,相当于二维罗盘)
字段 9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东,W=西
字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
字段13:校验值hh摘自:http://blog.csdn.net/zccst/article/details/4234941
5. 从Google卫星地图服务器上获取卫星照片的方法收藏
Google将全地球卫星图片做为1级卫片,代码为t,只有1张,为256*256像素JPEG图片;
2级卫片将1级卫片进一步细化,共有4张,代码和顺序为:
tq tr
tt ts;
2级图片比1级图片清晰1倍,单张图片大小不变,仍为256*256像素jpeg图片;
3级图片有16张,代码和顺序为:
tqq tqr trq trr
tqt tqs trt trs
ttq ttr tsq tsr
ttt tts tst tss
4级卫片有4^(4-1)=64张,以次类推,第n级(n<=20)卫片有4^(n-1)张。 顺序就是逐级4画面(qrst)分割。
下载方法:在IE地址栏中输入:http://kh0.google.com/kh?n=404&v=26&t=t 可以看到世界全图,输入:
http://kh0.google.com/kh?n=404&v=26&t=trstr 可以看到中国大陆。实际上 Google 有多个服务器域名
提供卫星图片的下载功能,从kh0至kh3都是可用的。需要注意的是:有的地区在服务器上可能存在卫片缺
级现象,即某地区没有15级卫片等。这时如果访问该图片,会提示文件不存在。好了,具备了以上知识,如果你是个程序员,我想你应该是可以开发出一个自己的类似于Google Earth功
能的软件了。摘自:http://www.cnblogs.com/shaoge/archive/2009/08/17/1548086.html
Googel地图Mobile版下载
Foooooot地图下载安装成功,但卫星地图数据获取不到;
Googel地图Windows Mobile 4.1版下载安装通过,可与 Google 帐户与 Google Earth 数据通用;
Googel地图Windows Mobile 2.2太难用,且流氓网络连接太烂,问题是如何导入老数据,并删除掉老的?
Googel地图Java版下载安装通过,但太难用;
Google kware.ji 帐户语音验证通知,密码重置成功!6. 了解EOffice.com功能
1) 文件新闻;
2) 我的影集图片;
3) 我上传的文件列表作为用户宏的微内容;
4) 自然权限:Private -> Report -> Share -> Public 再增加 Follower/Friend 粉丝/朋友:
Private -> Report -> Share -> Follower -> Public7. Miscs
Google邮件SSL引入EOffice
注册 eoffice.com 需要验证激活,google 以前免费开放的邮件服务,也开始学会通过短信验证搜集你的
个人真实信息,结果也未收到验证码,假冒 google 出现了?或被中国政策化强制阉割了?或也被中国带
坏了,google 也开始喜欢全球隐私了?不得而知。 -
1. 管理的例外哲学(三)
1) 例外的处理范围问题
所谓例外处理或例内处理,其实就是“组织业务”或“组织事务”,所谓例外处理的范围, 就是业务
所在的各类或各级组织。当组织内事务不处理例外时,势必将例外引致的事故抛向上层组织, 这些抛
出去的异常,有些可能是下级组织正该处理的,有些是无力处理,需要上级组织协调指导或支援。 但
如果过多的例外被抛向上层组织处理,则他们也会疲累。 这就是所谓的“所有的项目经理都是老大一
人”怪现象的由来。
以上讲的是例外通过组织层层外抛,如果都不处理(有时也可能是掩盖或强行Close)就会抛到消费者手
里, 最终造成所谓的返工或退货。2) 例外处理的递归
组织内任何事务的成功,都是假定没有例外,其实有例外是绝对的,无例外是相对的。 所谓例外处理
的递归,就是如下的情形,在常规处理中,或在异常处理中均允许再出现低层异常处理:// 1 组织事务
try {
// 1.1 此处会有异常
// 1.2 以下不允许有异常,必须局部处理掉
try {
// 1.2.1 此处会有异常
} catch exception {
// 子异常处理
}
} catch exception {
// 异常处理
}此处强制业务 1 以及 1.2 不允许出现例外,业务 1.1 与 1.2.1允许出现异常,但如果内层的子业务
1.2 不/不能处理异常,则势必要抛到上层去处理。协调的例外处理,应该均匀地分散在各及组织中,
且正常情况下不应超过正常业务的一半,否则就会出现失衡。3) 如何才能“不允许有问题”
我们要求改变思路时,说联想的文化假定有问题,如何改善。 我们的思路:不允许有问题!要看死!
这句话用例外的观点可解释为:“你不能将任何例外抛给我,你必须将你组织的例外完全消灭, 我这
里不捕捉与处理你的例外,自己解决问题!我自有自己的例外要处理。”不捕捉例外不等于就没有例外,但可以说“没例外”,因为当大家都处于盲人摸象的懵懂状态, 大家
又都渴望成功,大家假定没有例外比较容易达成,这就是所谓的集体无意识。 因此过分理性的公司总
会假定无问题是不可能的,就是所谓总是假定有问题。 “假定有问题”和“不能有问题”两种思路都
是正确的,只是组织内外视角问题: 假定底下有问题,要自己处理自己的问题,顶层自然就没问题。
前者看似悲观消极,后者看似乐观积极;前者不容易忽视问题,后者易于蒙蔽问题; 前者强调事后堵
漏,后者则强调事先主观能动性。组织内必须养成善于捕捉/分析例外/异常的习惯, 并将新产品在研发、生产、销售各阶段可能存在的
问题分门别类,明确上下层例外的处理职责,并在组织间形成例外处理契约。 逐渐养成“自己的问题
自己解决(而非我替你动脑)”的习惯,其结果自然就是所谓将问题“看死”。我们经常日复一日地“看产品、说产品、做产品”, 但中间惟独缺少了产品分析、产品规划、甚至产
品设计, 或者深度不够或引不起重视。只有有质量的分析,或够深度的分析,才能设置恰当的“管理
设施/机构Facility”或“异常捕捉器Indicator”,才能快速(Rapid)发现并解决问题。2. EOffice改进
v 1) 邮件系统改造:必须将服务器地址不对、端口错误、帐号错误、密码错误从其它异常中分离出来。
因为该类错误,不必重复尝试,下次还是错误,只有网络异常值得重复尝试,直接将引擎停掉即可。
' 增加 TryCount 计数,以停止当前帐户,永久停止需要 Pop3Exception 来判断
' 限制:只是关闭当前引擎帐户,并不永久关闭帐户
Private Const TRY_LIMIT As Integer = 3 ' 允许 Pop3Exception 的最大尝试次数
Private TryCount As Integer = 0 ' 目前 Pop3Exception 的尝试次数
// 无法建立网络连接,也抛出 Pop3Exception 帐号异常
if (nst==null) throw new Pop3Exception("TcpConnect Failed: " + mailhost + ":" + port);
// 异常:网络错误或帐户错误,会抛出原始异常;
// 问题:原来 AcquireStat 才会抛出异常,现在已放弃,似乎不会抛出异常了?
// 子线程的异常会抛到哪里呢?
// 限制:每个 ElementPop3 对象,只允许一个接受(含统计)进程,因为它们共享一个tcp/nst对象。
public bool AcquireAsync()
// 说明:异步启动 AcquireThread 线程方法。
// 原来 AcquireStat 才会抛出异常,现在已放弃,基本不会抛出异常;
// 子线程的异常会抛到 AcquireThread 线程。
2) 系统一旦判定为垃圾邮件,目前无法恢复回去
垃圾邮件需要按标签分类;3. Miscs
处于审美状态的人不是计算着的人,其心灵是宁静的,愉悦的,也是高度自由的。—— 潘天群
资源冲突的实际情况:双方获胜概率配置、资源的价值评价配置、冲突成本配置也不是双方的公共知识。 -
1. 管理的例外哲学
管理中的例外就是所谓出问题或出事,例外就是非常规,也叫异常,英文都是Exception。管理中的所谓
“疲于应付”,就是说异常处理成了管理的主要事务,例内与例外比例严重失衡的结果, 此时管理异化
为异常事务的奴役,管理团队成了救火队。以下是自己一些对例外管理的基本认识。
1) 例外处理框架
以下是用程序语言描述的基本事务例外处理框架,现代网络对象程序语言处理都是这个模式。虽然是
程序语言,其实它也同样来自于人类普遍的管理智慧。
Loop { // 戴明PDCA循环
... // 常规处理,无例外或例内
Try {
... // 非常规处理,会发生各种例外
} Catch Exception ex1 {
... // 例外1处理
} Catch Exception ex2 {
... // 例外2处理
} Catch Exception ex {
... // 未知例外处理
} Finally {
... // 最终处理
} // End Try
} // End Loop
符号说明:{一组事情},// 说明
2) 例外管理需要成本
例外管理的终极目标是要消除例外,但之前还需要些步骤:首先是要一一捕捉例外,然后是增加适当
设施以消化例外。这样一个过程就是事务处理的常规化、模板化、流水化,从而加快生产效率、降低
生产成本、简化管理细节。这一切显然需要资源、成本,需要整理、总结和条分细缕的成本,甚至能
力成本,并非所有的例外都能内部消化。
3) 例外的消化与转化
当事务都转化为常规例程后,就没有了例外及其处理。正是因为不太好常规化,所以才有各种例外处
理,甚至未知例外处理——所谓盲人摸象,这当然未必不是最优的,要鼓励尝试,鼓励敢于失败者。
当然也可以没有例外处理,此时就表现为无管理的例外,其外在表现就是不可控的事故与错误。在资
源如时间不足、能力不足时,这并非不是好的选择。
4) 允许例外,但必须收敛!
管理的真谛:重在预防,不在堵搂!不能老干“一集结差颗料”那种事!计划先行。其实计划与程序
说的是一件事,只是前者强调最后静态的结果,后者强调的全程动态的过程;前者更具命令强制性,
后者则更具因果逻辑指导性;相应地,前者给了实现者更多的自由发挥空间,后者多了些要求与处事
的框架性限制;后者较前者也更具可计算性。
要学会消化例外(Exception),让例外在震荡中趣于收敛,才能最终减少例外; 即使有,也要提高例
外的层次,杜绝低水平重复,此种境界表现出的就是能力和业务、我们与公司的共同成长。2. EOffice改进
1) 邮件系统改造:必须将服务器地址不对、端口错误、帐号错误、密码错误从其它异常中分离出来。
因为该类错误,不必重复尝试,下次还是错误,只有网络异常值得重复尝试,直接将引擎停掉即可。
2) 邮件地址建立独立 EmailAddress 类
在 Manage 包里继承该类以处理 EOffice 用户邮件及其关系处理。
3) 微博删除需要二次确认。 -
1. 什么是过程计算?
1) 什么是过程计算?
现在网络计算领域最时髦的词汇莫过于“云”了。 其实云与过程计算的概念紧密相关,所谓计算的可
持续性问题,大尺度讲让客户的网络交互过程完全独立于时空, 不只是凌驾于物理上的云了,这可能
是过程计算的最高境界,交互计算也属于过程计算范畴。 云在很大程度上是虚拟主机、虚拟存储概念
的应用,此外还有虚拟操作系统、虚拟应用等, 这些问题都涉及过程的迁移、持续性计算领域。过程管理涉及的概念:计算的连续性、现场(Context)/会话(Session)的存储、腾挪、可序列化、对象
的生存周期、冻结/解冻/复活,类工厂化为对象。
2) 共享的历史意义解释
我生产一个信息,属性为共享, 则现组织内可共享,但当我移动到另一个组织时,我的那个历史上在
老组织内共享的信息,能否也在新组织下共享呢?目前的工作日志就是这种情形。 类似的“汇报”关
系也存在类似问题,我给上个领导汇报的东西不想让现领导看到。显然管理粒度细化到这些问题上,其复杂性是显而易见的。
2. 邮件系统问题调试
v 1) Content-Type: image/jpeg
Content-Disposition: attachment
Content-Transfer-Encoding: base64
Content-ID: 532j3na2qkxu@webmail.indonesianetworks.com
v 2) INSERT Email 字段超长
SQuoteEscape(str, maxByteLen)
v 3) 日期格式分析
Tue,22 Mar 2011 19:39:43 +0800 (GMT+08:00)
v 4) info自动邮箱代理不知何故停摆;
可能是以上5点引起的,更新以上5点,暂时先观察再说。3. Miscs
一季度总结与二季度计划;
监事提案:关于提高工人技能培养晋升制度的提案1) 标杆管理的需要
人的标杆,技能标杆,劳动技能竞赛,让他们能看到进步的果实,进而产生学习进步的欲望,这最终
必将直接改善劳动生产率,降低消耗、提高产品质量,产品质量最终都是经他们的手做出来的。
2) 和谐社会建设的需要
提高工人的荣誉感、归宿感,与公司、社会共同成长,共享成长。要从制度上尊重他们,真正做到爱
厂、爱工作,让他们以厂为家。要让“中国制造”很美,首先要和谐。
3) 群策群力与全员管理的需要
关于“群策群力”,我们恐怕叫的最响,但较之那些老牌资本主义国家,我们做的可能是最差的,和
他们相比,我们要惊醒:不能让制度成为“群策群力”的障碍!我们既然确立目标为大生产,就必须
明白所有成功的大生产首先必须是群策群力的。
4) 技能也有福利
为保留住熟练工人,配合机械简单的工龄福利政策,之外再增加与技能挂钩的福利,彻实尊重术有专
长的工人,让他们参与到创新与管理之中。 -
1. EOffice作业系统设计
' 名称:抽象 JobPage 作业页面
' 说明:建立“作业页面JobPage”抽象类,以实现标准的定期自动作业页面。
Public MustInherit Class JobPage : Inherits SecurePage
Private JobName As String ' 作业名称
Public MustOverride Function Refresh() As DataSet ' 由实现类实现
Public Function GetCache(ByVal jobName As String) As DataSet
Me.JobName = jobName
Dim res As DataSet = Cache(jobName)
If res Is Nothing Then
RemovedCallback(Nothing, Nothing, Nothing)
res = Cache(jobName)
End If
Return res
End Function' 名称:作业调度回调方法
' 说明:根据作业调度规则 scd,计算下次调度时间 dan
Public Sub RemovedCallback(k As String, v As Object, r As CacheItemRemovedReason)
Dim dts As DataSet = Refresh() ' 刷新数据
Dim scd As String = MiscMeta.GetCatNote("JobSchedule", JobName)
Dim dat As DateTime = Now
Dim qrt As Integer = Math.Floor(dat.AddMinutes(1).Hour / 6)
Dim dan As DateTime = Now.Today.AddHours((qrt + 1) * 6)
Cache.Insert(JobName, dts, Nothing, dan, _
TimeSpan.Zero, CacheItemPriority.High, AddressOf RemovedCallback)
End Sub' 名称:获取作业数据
' 说明:作业运行调度可系统配置化,采用如下格式:
' Misc:Cat=JobSchedule, CKey=JobName, CValye=PageClassFullName, CNote=ScheduleInfo
' 页面类全名 PageClass 如:EOffice.Web.Class1
' 调度信息格式 ScheduleInfo 如:D/W1/2/3/4/5
Shared Function GetDataSet(ByVal jobName) As DataSet
Dim cln As String = MiscMeta.GetCatItem("JobSchedule", jobName)
Dim typ As Type = Type.GetType(cln)
Dim obj As Object = Activator.CreateInstance(typ)
Dim jop As JobPage = obj
Return jop.GetCache(jobName)
End Function' 名称:作业系统启动初始化
' 说明:系统启动时,由 OnApplicationStart 方法统一调用
Public Shared Function Reset() As Boolean
For Each job As String In MiscMeta.GetCategory("JobSchedule").Keys
GetDataSet(job)
Next
End FunctionEnd Class
2. 事件、回调、委托关系
1) 使用回调函数?Event/AddressOf/AddHandler:
Private Shared VasletTimer As New System.Timers.Timer()
AddHandler VasletTimer.Elapsed, AddressOf EOfficeRegister
VasletTimer.Interval = VASLET_REGISTER_INTERVAL
VasletTimer.Start()
Public Shared Sub EOfficeRegister(sender As Object, ev As Timers.ElapsedEventArgs)
备注: AddHandler和RemoveHandler使您可以在程序执行过程中的任何时候启动和停止事件处理。
Sub TestEvents()
Dim Obj As New Class1()
AddHandler Obj.Ev_Event, AddressOf EventHandler ' Associate an event with handler
Obj.CauseSomeEvent() ' Ask the object to raise an event.
End Sub
Sub EventHandler()
MsgBox("EventHandler caught event.") ' Handle the event.
End Sub
Public Class Class1
Public Event Ev_Event() ' Declare an event.
Sub CauseSomeEvent()
RaiseEvent Ev_Event() ' Raise an event.
End Sub
End Class
2) 委托 Delegate/AddressOf
Public Delegate Function Sub MatchEvaluator(ByVal match As Match) As String
Dim eva As MatchEvaluator = New MatchEvaluator(AddressOf ReplaceCC)
res = rex.Replace(res, eva) ' Replace matched characters using the delegate method.
res = rex.Replace(res, AddressOf ReplaceCC) ' 以上两种方法等价
Public Function ReplaceCC(ByVal m As Match) As String3. EOffice改进
1) 邮件系统改造,理顺异常分类处理;
异常时正确抛出与错误隔离;ReceivedMark.idx 的正确保存;
2) 改StatCount 与 ReceiveEmail 两次打开与邮件服务器连接为一次;
v 3) 为日程新建增加标签输入 Tags 字段。
问题:新增的标签 Tags 字段如何过滤选择的下拉标签?
4) 是否引入“警报Alert”概念?
用户可自定义通用警报器功能? -
v 1. 增加“EOffice剪贴板”Cube 属性
1) 为剪贴板 CubePage 接口增加是否能复制与粘贴属性
' 名称:页面是否支持复制与粘贴
ReadOnly Property CanCopy() As Boolean
ReadOnly Property CanPaste() As Boolean
2) 为安全页面 SecurePage 类增加“EOffice剪贴板”Cube 属性
以 Session("CUB") 来存储。v 2. 剪贴板 CubePage 接口应用矩阵
通过接口 CubePage 来实现邮件复制粘贴。
复制粘贴页面 动作 NewTopic AddAgenda DiartMgmt SendEmail TopicDetail ReadDoc
v Paste v Paste v Paste v Paste v Paste v Paste
------------ ------- --------- ---------- ---------- ---------- ----------- --------
TopicDetail v Copy x v Agenda v Diary v Email v Post v Post
AgendaDetail v Copy v Topic x v Diary v Email v Post v Post
DiaryDetail v Copy v Topic v Agenda x v Email v Post v Post
ReadEmail v Copy v Topic v Agenda v Diary x v Post v Post
ReadDoc v Copy v Topic v Agenda v Diary v Email v Post v Post
------------ ------- --------- ---------- ---------- ---------- ----------- --------
注意:x 表示自身转化,无意义;v 表示已经完成的转化。 -
v 1. 今日完成主题转日程
v 1) 通过 Session("CUB") 存储来解决对象的复制、粘贴;
同时自动增加“实体彼此引用”;
增加Calendar\image\copy/paste.gif 图标;
重新布局 Today.ascx 模块,并实现实体间的复制、粘贴;
' 名称:实体复制
Private Sub CubCopy_ServerClick(ByVal sender As Object, ByVal e As EventArgs) _
Handles CubCopy.ServerClick
Dim cub As CubePage = Page
If cub Is Nothing Then Return
Session("CUB") = cub.EntityCopy()
End Sub
v 2) 在 CommonModule 包增加 CubePage 接口
' 名称:EOffice实体间转换接口
' 说明:通过 Session("CUB") 存储来解决页面实体对象的复制、粘贴
' 说明:每个实现 CubePage 操作的页面必须实现该接口方法
Public Interface CubePage
' 名称:实体复制
' 返回:当前页面返回的复制实体
Function EntityCopy() As Object
' 名称:实体粘贴
' 参数:obj 要粘贴的实体
' 返回:粘贴成功与否
Function EntityPaste(ByVal obj As Object) As Boolean
End Interface
v 3) 实现实体复制接口
首先在 TopicDetail 和 AddAgenda 页面间实现;以完成主题转日程应用。
' 名称:通过复制粘贴 EntityPaste 实现实体转换。
Public Function EntityPaste(obj As Object) As Boolean Implements CubePage.EntityPaste
If TypeOf obj Is String Then
Note.Text = obj
Return True
ElseIf TypeOf obj Is Topic Then
Dim tpc As Topic = obj
Note.Text = "//*引用:Topic#" + tpc.TopicID + ", 作者:@" + GetNID(tpc.UserID) _
+ ControlChars.NewLine + tpc.Content
Return True
End If
Return False
End Function2. 增加微博转发功能
v 1) 用例设计
//*转发:Diary#10784 作者:@张海萍(zhanhp)
我的路非康庄,欠辽阔,但只要努力不懈,前程终能在望!
2) 增加微博排行榜页面
终于找到了真正的“实体引用”应用了,此处即是:“实体引用统计”的应用而已!
3) 问题:转发时如何共享原始图片(如果有)?3. EOffice问题
v 1) 建立 Mention 表索引
IX_Cat/EID/UserID/RegDate/RefCat/RefEID
v 2) 微博页面MicroBlog.aspx显示不超过10行:
3) Topic.Content 限制 4K 长,而邮件 Email.Abstract 是不限制的 Text类型,转化时需要裁剪处理。 -
v 1. EOffice改善
v 1) 客户修改错误
现象:部分客户信息无法修改
分析:在州没有选填的情况下无法修改客户信息……
州需要判断 IsDbNull。
解决:Util.NullStr(Container.DataItem("State"), , "")
v 2) 客户查询 Query.aspx 页面也做
Name +FullName LIKE …… 的同样调整,避免客户简称、名称、全称之间的混乱。
v 3) 客户列表信息布局调整
ITEMSTYLE_WRAP="False" ITEMSTYLE_HORIZONTALALIGN="center"2. Miscs
1) 实体评论附件的命名规则需要调整为:实体分类缩写 + 实体标识 + "_" + 附件名称,即让实体评论
跟着实体走,原来是:帖子分类名PT + 帖子标识 + "_" + 附件名称,是跟着帖子走。这样做的目的
有三:首先让附件浏览有了更大的范围,二是与实体自身附件取得了统一,最后,更重要的是为未来
附件到实体的统一安全搜索铺平了道路。
2) 关注统计
SELECT EntityID, Cnt=COUNT(*) FROM Attention WHERE Category='User'
GROUP BY EntityID ORDER BY Cnt DESC
SELECT UserID, Cnt=COUNT(*) FROM Attention WHERE Category='User'
GROUP BY UserID ORDER BY Cnt DESC
3) 所谓理性就是对目标的计算能力:推理与计算。 个体理性总有局限或困境,此时便产生了群体理性;
所谓群体理性就是若干个个体间的道德与法轨约束。 在更大的群体层面上,群体理性又粒化为个体理
性,更大的群体理性就形成了所谓文明。 -
1. 实体提及Mention与实体收藏Attention方案实现
1) 实体EID 提及/引用 实体RefEID,其实就是在实体之间的建立有向关系!
实施路径:先从微博的提及人与收藏开始,逐步向外一般化扩展;
UI设计:仍然在 MicroBlog 中实施;
2) “收藏实体”就是“关注实体”
这样就可仍然采用 Attention 表存储收藏信息,其UI处理与相关方法函数也会简单化,直接复用“关
注逻辑”即可!
实施路径:微博收藏、日志收藏、新闻收藏;
UI设计:改关注图标为收藏图标,在个人办公/个人信息中增加“我的收藏”Favorite.aspx 页面。v 2. EOffice改善
v 1) 客户查询错误已经修复,今早已经更新,以后要要求他们养成习惯, 发现问题要第一人第一时间在相
应事务中报告。SQL += " AND Name + FullName LIKE '%" + QName.Value + "%'"
//*回复:Diary#10838 作者:@王海玉(hywang)
客户管理,客户名称查询有误
v 2) 扩展实体阅读到实体文件柜阅读
Dim fid As String = CStr(eid)
Dim spi As Integer = fid.IndexOf(":")
目前仍然只有 Forum#BBS001:\ 可以扩展阅读,对于 Group#XYZ:\ 尚不能阅读,因为 Group组尚未纳
入实体范畴,CanIRead 无效,因此不能阅读,将来再说。
v 3) 模板编辑的错误分析
其实没问题,模板参数命名空间ew大小写混乱,而系统是对此敏感的,导致参数列表不能完整生成。 -
1. 客户资料 Customer 的分阶安全解决方案
1) 目前方法:是经理全部,否则自己的:
Dim sql As String = "SELECT * FROM Customer WHERE 1=1 "
If Not Session("gsUser").IsManager Then _
sql += " AND UserID = '" + Session("gsUserID") + "' "
RefreshGrid(sql)
问题分析:首先,组织是复杂的,当组织庞大时会有问题,是经理未必就能看全部的, 只有在该业务
只分配在一个销售部时是正确的;第二,如果有多个销售部时就会出错; 第三,对管理几个客户经理
的主管无效。无论查询 Query 还是管理 Maintain 都是如此的逻辑,显然需要改造。
2) 彻底的解决方案
分开阅读者 vid / 业务员 uid;
完全采用汇报关系 IsOnesReporter(vid, uid) 函数解决;v 2. “非正常定单IFO台帐管理”系统可行性分析
1) “非正常定单”管理的意义和背景
所谓“非正常定单”就是因条件不具备而不能正式确认为定单的定单;
“非正常定单”管理目前没有,基本都跑掉,现在要通过台帐这些动作进行回笼;
“非正常定单”日程是由销售部的客户经理发起,跨部门管理;
v 2) 基本解决方案
就以目前的日程管理为蓝本,增加如下功能:
定制到带标签参数(Tag=IFO)的业务中:业务名称:“非正常定单台帐”;
通过标签技术即可实现,标签就是“非正常定单”或“IFO:Informal Order”;
台帐管理人就是带“非正常定单IFO”标签的日程发起人;
日程管理页面允许带入标签参数,以进行标签过滤,此时新增日程也自动增加该标签;
3) 第二意义发现:
如果将“事务A”“标签IFO”日程管理应用为“非正常定单台帐管理”,则还会有:
“事务B”“标签NCR”日程管理应用为“新客户需求台帐管理”。
事务之间是有关联的,目前的事务是零散的,将事务、组织/人、时间周期、资源、客户、产品再深度
关联就是项目管理。2005年就有按该思路的项目管理PFM初稿,未推动起来。
4) 玄而未决的未来问题
问题1:领导是否可以查看下属的日程;
问题2:日程标签现在是与主日程挂接,是否改造到分享人;
问题3:非正常定单、新客户需求可能都与文档流程系统PUM有关,我有所不知,还是需要倾听凯心中
“非正常定单台帐管理”蓝图;
5) 结论:
下周先出“日程标签IFO”方案的第一版,并推动实行;3. Miscs
1) 日程搜索,日程的多标签过滤,日程标识是否显示?
目前和客户的MeetingMemo一样,先采用统一的 TagDetail.aspx?Tags=Category= 进行多标签过滤。
2) 系统通知消息App("Message")、用户心情(User.Mood)、宣传语Cache("gcSlogan")允许标记连接
res = "<marquee behavior=alternate>通告:" _
+ Util.HtmlEscape(msg, TextPseudo.LinkMode.MARK_LINK) + "</marquee>"
EOffice.Common.Util.HtmlEscape(usr.Mood, EOffice.Common.TextPseudo.LinkMode.MARK_LINK))
DateTodo.InnerHtml = Util.HtmlEscape(Slogan(), TextPseudo.LinkMode.MARK_LINK)
3) 微博备忘
* 增加周期性日程类型、日历框应跟随日期框;
* 汇报圈有问题,应只向上级汇报,不应向上上级汇报,这可能被视为打扰?
* 如何在EOffice中收藏日志? -
v 1. 自动化统计AutoTrace参数扩展
1) TraceMonthly 页面
ext = New ElementXTable("TraceMonthly", Request("Type"), Request("Param"), Request("Title"))
ElementTable.InnerHtml = ext.GenerateXTable()
2) New ElementXTable(Type, Param, Title)
' 参数:AutoTraceCat 自动报表分类,AutoTraceKey 自动报表类型;
' 可选 param 可带参数,诸如用户标识或部门标识之类的参数,允许以SQL格式多参数,如:
' 以“,”分割的两个参数“'UserID',12”,前者为字符串,后边为数字;
' 可选 title 报表标题,缺省则采用 Misc 定义值。
If title Is Nothing Then title = tca(AutoTraceKey)
3) 文档状态 FileStatus 使用
Dim uid As String = Session("gsUserID")
Dim bid As String = Request("BizID")
Dim tit As String = "文档发行数量月度统计"
If Not bid Is Nothing Then
uid = Nothing
tit = bid + tit
ElseIf Not uid Is Nothing Then
tit = uid + tit
End If
Response.Redirect("../../manage/sys/TraceMonthly.aspx?Type=TraceDoc" _
+ "&Param='" + bid + "','" + uid + "'&Title=" + tit)v 2. “当前日程”Current下不该包括非等待日程
If current And type = "MA" Then
str += " AND GETDATE() BETWEEN FinishDate " _
+ " AND DATEADD(DAY, " & TodoHash.AGENDA_PERIOD & ", AskDate) "
If sta = TodoHash.TODO_NONE Then
sta = TodoHash.TODO_WAIT
Me.Status = sta
End If
End Ifv 3. 关于汇报渗透
v 1) 目前的共享解释为“本部门及以上部门人员可阅读”,逻辑如下:
OR e.Privilege = '1S' AND ( " _
+ " dbo.DepContain('" + vwr.DepID + "', u.DepID) = 1 OR " _
+ " '" + vwr.LeaderDepID + "' = u.DepID OR " _
+ " '" + vwr.DepID + "' = '" + DepSystem.GenDepID + "' ) " _
v 2) 目前“工作权限”解释为:“仅直接汇报者可阅读”,逻辑如下:
OR e.Privilege = '1W' AND " _
+ " dbo.IsOnesReporter('" + viewerID + "', e.UserID) > 0 "
v 3) 目前的“IsOnesReporter”返回角色号
可直接修改该函数为“汇报层级数”,直接汇报级数为1,增加一层为 2,依次类推。这样其逻辑就如
同共享一样,对称解释为“汇报人及其上级可阅读”。
这样就等于统一 IsOnesReporter/IsAncReporter 函数。
用新的 IsAncReporter 函数替换老的 IsOnesReporter,删除 IsAncReporter 函数。
4) 是否也需要删除 IsOnesLeader 函数,以与 IsOnesReporter 统一?
目前只有 Porject 里用到该函数,似乎可以删除:
+ "IF dbo.IsOnesLeader('" + uid + "', '" + ManagerID + "') = -1 " _
+ " SELECT @bis = dbo.IsPrjLeader('" + ProjID + "', '" + uid + "'); " _
+ "ELSE " _
+ " SELECT @bis = 1; " -
v 1. EOffice改进
v 1) 邮件标签点击的邮箱选择问题;
* 帐户无法选择;* 发送箱无法选择;
v 2) Email 附件长度由 256 改为 1280;
v 3) 部门介绍 DeptIntro?DepID=质量部(QA) 部门参数支持NID格式有误
问题:部门是实体吗?组呢?
v 4) 新增部门或部门信息修改如何放进首页?
* 部门 Department 表新增 EditDate 字段,在部门修改时,增加 EditDate 信息;
修改 DepSystem.UpdateDepartment 方法:EditDate = GETDATE()
* 扩展新闻视图 Exinf 即可:
UNION ALL
SELECT 'Department', DepID, ManagerID, EditDate, Name + '介绍', NULL
FROM Department
WHERE Type <> '#'
* 修改 InfoQuery?Category 分类浏览路由逻辑;
ExEntity.BrowseUrl(cat)
* 增加 NewsDeaprtment.gif 图标;2. EOffice思想备忘
1) 系统 UI设计对系统成功至关重要,同样的城市道路接驳UI设计对交通顺畅,公民出行方便也是至关重
要的。如何让系统自然自我成长? 和在城市中如何让系统自然自我发育这些问题一样,也都是需要设
计的。自我帮助、自我成长都是重要的环节。 在中国哲学里元、组织、结构、系统、设计这些概念是
缺乏的。
2) 目前“部门意见”、“论坛”、“系统帮助”都是知识管理的入口, 其推动也都很被动的,如何打通
它们之间的屏障?“统一论坛”是它们共同的载体, 对用户而言“我有问题”是共同的入口,如何通
过分散的专家、斑竹、部门经理或文书这些的角色使知识自由在其中顺畅流转就成为至关重要的!
3) 要系统化实体微内容与宏内容的概念与关系。
要重视角色的登记、赋予、关联表等的时间信息。能否画出角色关系图?从而引出用户关系图?
部门留言能否作为部门宏内容?
4) 扩展标签Tag表为既与内部实体关联,又与系统自动实体、外部实体的关联。3. 与Tao探讨MP3/MP4能力不足问题
MP3/4 目前仍然占出货量的 50% 强,但赢利能力仍占 10%左右,而U盘利润率只能占不到5%。因此丢失,
战略重点跑到了30%上的Note/MID上。 MP3/4能力的弱化和两年前U盘能力奇怪地丧失如出一辙,理由都是
那么低的利润率养不活我们“大公司”,因此公司的定位也在奇怪地转移,或上一个阵地奇怪地丧失,照
此循环推算,将来 MID利润率降低时,我们将再转移?《定位》中讲到产品延伸的陷阱时,讲过:1) “产品延伸不利于通用性品牌名称,它使通用性品牌在人们头脑里的清晰印象变得模糊, 使得顾客想
要阿司匹林时,不能再用拜尔来替代”。
2) “来的容易,去得也容易,产品延伸名称容易被人忘记, 因为它在人们心目中没有自己的独立位置,
它们是原有品牌的卫星,只会使原有品牌名称变得模糊不清”。这种状况和这些话需要我们深思,但愿不适用于新兴市场或初创公司。
-
v 1. 部门负责人计算澄清
可以是其它部门人员代管,以“最大角色的父角色”来定义跨部门代管;
计算顺序:先求有无经理、无则再看有无最大角色的父角色,最后看父部门负责人,依次类推;RoleUser.aspx 下属 Join 有问题,见销售经理角色。
' 名称:获取角色的下属用户视图
' 说明:父角色可能有多人导致存在同一下属多汇报关系,因此需要用 Distinct 过滤。
str = "SELECT DISTINCT r.UserID, a.DepID, r.RoleID, RoleName = a.Name "2. 是否消除系统组的概念?
和 GenDepID(总经办)、CompDepID(综合办) 一样,再增加 HRDepID(人力资源)/SysDepID(信息中心),且
可以配置。这样就不会产生 admin 是用户但又不是用户,系统管理部门是个又不是部门的尴尬。 再者,
EOffice“分阶”、系统“生长”的观点,也不支持特殊用户的概念,它们只不过是系统的“种子”。 -
v 1. EOffice.DCC完善
1) 索引优化与同步
索引优化完毕,耗时:445秒钟;
索引空间:deletable 1K, segments 1K, _5gfh.cfs 440M;
优化的同时,有新文档加入;
2) 本地云支持调试
避免本地非云的 D: 被解释为云v 2. UrlReferrer中目录的URL编码问题
1) 解决目录中保留字 "&%#" 对 UrlReferrer 编码影响错误。
mur = Page.Request.UrlReferrer.ToString
AppLog.WriteInfo(mur)
AppLog.WriteInfo(Page.Request.UrlReferrer.AbsoluteUri)
2) 啊 u554a xB0A1
特殊&目录 u7279 xCCD8 u6b8a xCAE2 u0026 x26 u76ee xC4BF u5f55 xC2BC
UrlEncode(Def:GB2312): %cc%d8% %ca%e2 %26 %c4%bf %c2%bc
UrlEncode(UTF8): %E7%89%B9 %E6%AE%8A %26 %E7%9B%AE %E5%BD%95
UrlEncodeUnicode(UTF8):%u7279 %u6b8a %26 %u76ee %u5f55
x http://yucun/EOffice/common/file/FileMgmt.aspx?cat=public&dir=特殊&目录
v http://yucun/EOffice/common/file/FileMgmt.aspx?cat=public&dir=特殊%26目录
x http://yucun/EOffice/common/file/FileMgmt.aspx?cat=public&dir=%E7%89%B9%E6%AE%8A%26...
v http://yucun/EOffice/common/file/FileMgmt.aspx?cat=public&dir=%u7279%u6b8a%26%u76ee...
3) 增加 UriEscape 转转义函数,删除混乱而不必要的 Url2DEF/UTF8DEF/DEF2UTF8 函数。
' 名称:URI保留字转转义
' 说明:目前只用于文件系统的引用地址 UrlReferrer.AbsoluteUri 的参数
' 主要解决IE的UrlReferrer编码的错误Bug,保留必要的"&#%"转义,避免将其暴露给URL指示
' 时被吃掉。
Public Shared Function UriEscape(ByVal str As String) As String
Return HttpUtility.UrlDecode(str.Replace("%25u", "%u"). _
Replace("%25", "%2525").Replace("%26", "%2526").Replace("%23", "%2523"))
End Function3. DRM文件问题
1) 读取错误
LoadDRM failed 这是一个意外的标记。标记应为“SEMICOLON”。 行 3,位置 86。
at System.Xml.XmlScanner.ScanNamedEntity() ...
at System.Xml.XmlDocument.Load(String filename)
at EOffice.Common.eleMentDRM.Load(String fpn)
2) 保存调整
' 名称:将该 DRM 保存到文件消息队列目录 FMQDir 下的 DocID.drm 文件中
' 说明:保存格式以 XML 1.0 保存,编码采用 GB2312;
' Sourece/TargetFile/DRM 文件目录名称和DRM属性信息要进行 XML 转义编码。
' 限制:假定 DocID/Publisher/PubDate 没有 XML 保留字,
Public Function Save() As Boolean
3) 尚未测试 -
v 1. 文件与目录移动文件表的变更 ModCreator 的核实
' 登记文件的移动,废弃共享目录里外的区别逻辑
If IsBrowseCat() Then ModCreator(fis, fid)
云文件柜访问代理 AcquireCloudAgent 跟踪统计。v 2. 目录名称支持“&#%”URL 保留字
目录参数 dir 中保留字 "&%#" 的处理:dir= Util.UrlEscape(firDir)。
' 名称:URL保留字转义
' 说明:目前只用于文件系统的目录参数 "&dir=" + Util.UrlEscape(firDir)
Public Shared Function UrlEscape(ByVal str As String) As String
Return str.Replace("%", "%25").Replace("&", "%26").Replace("#", "%23")
End Function







