| William's profileRELEASEPhotosBlogLists | Help |
|
RELEASEI'm thinking, therefore I'm here. September 05 无题传说,人老了总会怀念过去。但是,我似乎还没老丫? 前段时间,晚上做梦,梦到了小学同学,似乎是吵架的事。对方是女生,突然发现,我小时候那么混蛋。当时,把人家弄哭了,而她哭,并不是因为和我吵架,而似乎是一种伤心,失望的感觉。之后,还给我一封算是信的纸条吧,现在回想起来,真的惭愧。 就在昨天,初中兼高中的电脑老师打电话给我,我一下子就猜出来是谁了。应该算我计算机方面的启蒙老师吧。刚上大学时,还有少许联系,之后就断了。其实,之前好几次想找找以前的几位好老师,可惜,学校搬了或是老学校里的老师班子都换了。改天去看看她“老人家”:),还有高3时的班主任,小学的班主任,以及小学3年级的数学老师,都是好老师呀。 小学里,还叫得出名字2个人貌似都结婚了。想想真是可怕,之前还在家附近的小花园跑来跑去,互相串门,转眼,几乎成了2个世界的人了。 我又不知所云了,不知我所云者直接忽略本文……呵。算是纪念一下才活了1/4个世纪的自己吧。 August 31 效率问题,Linq查询/多线程/反射/装箱相关在做ORM=>UI的框架时,对于查询,我没有直接绑定Linq返回的结果集,而是将他们转换为DataTable再绑到DataGridView上,这么做的原因有4:1、Linq结果集是单向访问的,无法让DataGrid自动对其排序。2、外键的处理,Linq直接绑到DataGrid上,外键无法显示,也可以在查询时,使用匿名类的方式创建一个新类型的结果集包含外键信息,但动态Linq的实现颇为麻烦。3、绑定后,不好确定用户选择的对象,特别是如情况2所述的做法。4、本框架的其他部分数据源主要采用DataTable形式,可能会存在交互,故此处还是采用DataTable。 于是,主要的问题就在于IQuayable到DataTable的转换了。实现不是问题,效率却是。由于是一套框架性中间组件,对于最终被应用的Linq O/R mapping类型是完全不可能知道的,所以采用反射的方式。 我的测试数据是9000条数据,5个外键,2个明细档,共20个字段。最初,没考虑性能时的实现,包括查询到显示完毕,耗时26秒。完全不可接受! 于是:做了如下调整: 多线程处理+缓存反射对象如PropertyInfo+改变dr[columnname]=xxx的赋值方式,采用LoadDataRow/Rows.Add(object[])方式,时间缩短为8.5-9.5秒 显然还是不可接受的,最初怀疑对DataTable的填充有更快的方法,通过反编译.NET Framework代码,发现MS填充DT的方式也是LoadDataRow,于是,这个可能排除。 那么,就是反射了……传说中能比直接访问效率差1000倍的反射……于是,我采用动态编译一个类,采用强类型的方式读取数据,然后写入DataTable,时间缩短为7.4秒 只提高了这么点点?!才10%?不是号称1000倍么……可见,问题不在这里。 怀疑是封箱操作占的资源,写了个测试程序,分别测试几种操作的差别和效率,结果如下: 速度基本上是稳定的,封箱操作要比强类型慢2.5倍,而通过外部函数访问外加封箱操作则慢3倍,而反射……则是400倍……(看来1000倍的说法是夸张了,但这里缓存了反射对象,否则的话也许更慢)。 其实还有人提出了通过委托来解决反射的效率问题,不过这仅仅适用于方法调用和对一个对象调用多次的情况。 那么问题到底在哪里……ADO.NET填充一个dt,9000行数据最多也就1秒了吧……我就算多了层linq,外加外键的延时加载,2-3秒应该够了吧。外加别的因素,如子线程可能优先级没主线成高- -?我在填充时还提供了Progress的委托事件(界面上进度条显示),再加1秒……4秒应该能搞定了吧? 反复尝试,最终还是停留在7.4秒……无奈下,加了个分页功能,好歹维持在一页1-2秒吧…… 不过,最终还是把目光放在了延迟加载的问题上,经过sql的跟踪,发现每笔记录都会去加在明细档,恍然大悟,我添加了一个额外的自定义属性,剩余金额=总金额-明细中已付金额之和。原来是这里读的明细档。作了个试验,去掉了这个属性,作了一次查询,4秒……很好,在可接受范围内了。看来真是这玩艺导致的问题。 当然,这是最终项目的设计逻辑上的问题,而非框架层的问题,至少……我可以说,Linq结果集->DataTable的转换,我这已经没什么优化方案了。即便也许转为Dt并非最优解。但基于之前4个原因,这样的转换还是有必要的。 最终,应用层上,我的解决办法是,添加一个剩余金额的字段,在保存记录时,计算该值并一起保存。不过由于这个应用层的失误,导致花了近2天来处理效率问题,还都是无用功,真有些郁闷。但对于各种方式的效率差,也有了一定认识,还是值得的。 DataBase => O/R mapping Class => UI 解决方案(.NET/CS/WinForm/Linq)注:由于基于Linq,对于性能要求很高的项目或模块不一定适合本方案。对于复杂查询要求较高的情况,本方案也不一定适用。本方案主要针对中小型项目,普通信息维护管理系统。 从数据库,到数据访问层,再到界面。一层层的搭,大量的重复劳动。耐心再好的人也会厌倦吧? 比如一个叫做Employee表,EmpID,Name,OnBoardDate,Birthday,Manager,Title等字段,那么,最简单的,要做 新增/修改/删除/查询 4个功能,不一定要ORM,也不一定要数据访问层独立出来,但最麻烦的应该就是画界面了,当然,还有输入数据合法性检查等等。设想一下,表结构设计+表创建,30分钟;增删改查 功能函数,30+10+20+60=120分钟,界面算上调整和格式检查得要1天吧。以上时间算上了基本的测试时间。按平均速度算,应该算是不宽裕了(不排除0.5天或者2天才能搞定的)。 现在,微软随C# 3.0和Visual Stuido 2008一同发布了Linq,其中的Linq2Sql是一套轻量级的Linq解决方案,在数据库设计完成后,即可通过拖拽的方式得到一套ORM类。同时,还包含延时加载机制,就数据查询来说,是通过Reader对象,所以效率来说不会比DataTable/DataSet低。其他特点不再多说,网上满地的介绍。我看中的,在于对于数据库设计信息,完全的包含到了类中。这就为根据这些信息,自动生成界面成为可能。 看一下例子,还是上面描述的员工表: 在Linq2Sql的设计器中,加上 经理->EmpID 的关联关系。ORM这层就算完成了,之后,如果作为基础数据,可以使用已经封装好了frmMaintenance类。如下: frmMaintenance f = new frmMaintenance("Empolyee", null, typeof(Employee), true, true, null, null, null, null, null, null, null); 为null的参数中包括格式验证/权限验证可用的托管,额外的查询条件限制等。运行效果如图: 当然,字段也许还需要修饰一下,为了看出效果,将字段显示为中文,通过提供的配置工具,可以为ORM对象设置默认的字段信息, 还为外键/明细档等提供了额外的属性甚至可以设定外键显示的字段以及配置信息的嵌套功能。最终可以把这些配置序列化保存,作为默认配置。当然也可以为某些控件做个性化设置。 如果要做查询的,可以直接拖一个封装好的Query控件: 以及3句代码执行以下绑定设置: querier1.DataContext = new DataClasses1DataContext(); 看一下执行效果: 可以根据各个字段填入条件,做符合查询。于是,最简单的增删改查,在数据库设计完毕后,仅需要5分钟和4句代码就可以搞定了。当然,还包括一些复杂功能,如数据权限处理,在查询条件上再附加条件,等等,或者希望在更复杂的界面中,集成编辑功能,等,都留有对应的控件和接口。 下面是一个,使用本框架搭出的一个小程序的2个界面: July 12 Stargate: Continuum本来7月底才发行的Stargate系列最新的电影,已经可以下载到了,感谢全球的盗版工作者。 国内fans,字幕组等翻译为《星际之门:连续体/时空连续 》等,总感觉非常别扭,但也难找出合适的中文字与,暂且还是叫英文原名吧。 片子,总的来说不错,情节贯穿本系列的初头,1939-2008。但作为一部电影,感觉情节不够饱满。或许是数个月来过于期待,没有达到理想的高度。空战场面不及S7末尾,整体情节更类似于S8中修改时间线的两集,缺乏新意。 整体感觉,情节实在有些赶,不少内容都可以更好扩充一下。但片子还是喜欢的,美国海军和空军貌似都给这片子开了绿灯,潜艇北极上浮,以及F15的场景。整个片子看完心里又觉得空空的,不知道下一部星门电影什么时候出。美国人好好的买Continuum的DVD啊~~别让电影系列也被砍了。 开始期待Stargate Atlantis S05E02~~ July 10 SQL Server 跨库查询乱码问题问题描述:通过openrowset跨库访问其他数据库,发现select出的中文数据就是乱码,更别说插入当前库中了。如: select * from openrowset('SQLOLEDB','server';'userid';'password',DBNAME.dbo.Table) 解决思路:有乱码的字段显然是varchar类型,sql 2000中,特别容易导致双字节字符乱码。由于问题出在跨库查询(2库默认排序规则相同),因此只要在源库输出数据前将字段转为nvarchar即可。于是改为: select * from openrowset('SQLOLEDB','server';'userid';'password','select cast(F1 as nvarchar) as F1 from DBNAME.dbo.Table') 乱码问题解决。 May 22 看某高考复习题有感,再批一次我国的教育大学毕业都近2年了,本完全无视曾经经历的那段时候了,也完全无视中国教育的种种弊端了,不过今天看到一个关于“三个金人”高考小作文练习题,实在还是想说两句。 貌似这故事也很古老了,我那时候应该就有,只是我运气好,那时没见过这题。故事是这样的:
说实话,这故事,看了之后实在不知所云,或许是我天资愚笨吧?!google一下,原来是说“最有价值的人,不一定是最能说的人的人。老天给我们两只耳朵一个嘴巴,本来就是让我们多听少说的。善于倾听,才是成熟的人最基本的素质。” 说实话,真不知道是我愚钝还是编故事的自作聪明,故事中用词不当,还有错别字,更主要的是逻辑混乱。真的,没知识就别学伊索写寓言,就被学圣经写故事。更重要的是,别当老师误人子弟,特别是浪费要参加高考的同学们的时间来硬凑你的所谓论点。 1:“三个一模一样的金人”,那么“珠宝匠检查,称重量,看做工”就愣是没发现第一个金人2个耳朵的洞是通的? 就是这种为出题而编的故事,堂而皇之的反复用来被高三学生们练习写作,google一下,居然被大量网站当成哲学故事。呜呼,高中的语文老师们,有点判断能力好不好,教学也要取精华,去糟粕;莫为出题而出题。呜呼,网站的编辑们,有点分辨能力,别不动脑子的复制粘贴,互联网也不需要那么多的重复性垃圾。 当然,高考在即,老师们希望学生可以多联系的心情可以理解,但请将真正有价值的题目给学生们练习。别让学生由于看不懂糟粕而丧失信心。 似乎,最近越来越FQ了,哎……应该老了呀:S May 16 地震平日,无聊时,常开打mop,tianya解闷看其口水仗,却从未发言。对于所谓“精英/JY”和“愤青/FQ”,有时也会自评一下,而把自己归为前者。然,今四川地震,再看论坛发现,原来我又变为FQ阵营的了。于是自嘲,我算是不左不右的吧? 7.8级的地震,大家都很关心,讨论也是异常激烈,但一股风气就是把责任往ZF头上推?我真不禁发问,何故?曾被父亲评论为挺反动的我,实在不认为本次地震,各个环节,ZF有什么严重失职与需要被强烈诟病的。 一条条说: 刚地震时,就大量的“那么大地震,政府为什么一点预警也没有?” 然而,接下去,更戏剧化,一些小丑跳出来,“既然预测不了地震,国家养他们干什么?不如养蟾蜍,养狗。”即所谓专家不如狗的言论。 貌似这2轮的无理取闹还没结束(开始对于没有预警的疑问可以理解,表现了广大国人急切的心情),又有人搬出了几年前某硕士论文,预测08年川贵地区会有大地震。这似乎为“地震”可以预测提供了口实。 地震预测告一段落,又开始了对ZF反映速度缓慢的指责。 随着电视里关于学校倒塌的新闻,又是众多关于“为什么倒的都是学校,政府机关都没事?”的论调。 接着,救援不力的声音又出来了。 费口舌之力,不如实际行动,捐款捐物吧?!可接下来的,是对被捐款项是否能到灾民手上而不是贪官口袋里的疑问声。 暂时写这些,偶尔FQ一次吧。不可否认,本次救灾ZF的行动是非常值得肯定的。 April 12 ThinkPad X61t 终于到手整个过程持续了3周~~~特别感谢Milly和Shirley~~~有机会请你们吃饭~~~! 下个月要还买机器的钱了~~~ 原装配置:酷睿2 L7500 1.6G,2G单根内存,80G SATA硬盘,1G迅盘,蓝牙,Intel 802.11 abg无线网卡,1400*1050 12寸SXGA+光视角LCD,指纹,8芯电池 基本感受:整体上很不错,键盘感觉比T4x稍硬,有些不足的地方为:8芯电池只能支持3-4小时比较失望,显卡Vista得分仅2.7 偏低。屏幕上有一层“雾”一样的感觉。 整个过程如下:
再次感谢Milly和Shirley~~~~ 附购买流程和心得 一:购买之前 February 29 本命年倒霉事件列表nnnnn
附:奇特的UPS发货记录:
Your package is in the UPS system and has a rescheduled delivery date of 03/31/2008.
Tracking results provided by UPS: 03/28/2008 1:32 P.M. ET February 24 交城保的再找工作,千万别找交镇保的公司~~~城保/镇保的主要区别: 城保:个人/公司都负担一部分,最低基数为去年上海市平均最低工资,最高基数为最低基数的6倍,若你的个人工资在这区间内,则取个人工资为基数(实际应为去年平均工资)。其中个人负担18%,公司负担38%左右。 (其中包括公积金) 镇保:个人不负担,公司负担统一为去年上海市平均最低工资的60%为基数的24%。不包括公积金。公积金可参考城保基数(个人/公司分别负担7%) 若镇保的养老转到城保,1年镇保=0.6-0.72年城保 若镇保的医疗转到城保,账户余额不会转到城保账户中。(因为镇保个人不负担,公司交的少,所以医保账户中是没钱的) 然而: 如果当前是交城保,中间找了交镇保的新工作,将来再转回城保,那么: 城转镇,医保账户余额转入镇保账户,将来,再从镇保转回城保,那么 医保余额就冻结在镇保账户里了,城保账户里余额=0。这些冻结的钱,只有2种情况能支取: 1:退休 2:城保的医保账户余额=0,且你去医保医院看病,那么可以凭借发票去医保局报销。 3:再交镇保……
什么公司会缴纳镇保: 1:注册在郊区的或浦东新区的 2:要求你和注册在郊区或浦东的人力资源公司签劳动合同的 交镇保而导致的损失: 1:养老金的损失,这是众所周知的了,退休后,退休工资基数为当年平均工资的60%。而城保的退休工资基数为当年退休工资。若要转为城保,那么,工作年限=镇保缴纳年数*60%左右,也就是说,2年等于1年! 2:医保账户,如上所述,城保-〉镇保-〉城保这样的转换将导致以前的城保里的医保资金被冻结在镇保里。
总之,同学们,同志们:小心啊! November 28 Bye~Benny.....November 20 Visual Studio 2008 RTM终于RTM了~~~~不容易.....上次装的其实几乎也是RTM了, 2007/10/22号build的~~~ 框的地方,最后.7是零售版的RTM,图上的.8是自带序列号的内部发布版,MSDN版是啥版本号就不知道了。今天车上,看到Intel的家伙也用2008 RTM了……K,也太快了,Intel和MS的关系原来如此紧密…… 最喜欢的一点,同时支持.NET Framework 2.0/3.0/3.5,不像以前,必须要装2套VS IDE才行。 如果RTM可以捆绑Silverlight和WM6 SDK就好了,可以省不少麻烦~~~VS2008工具条load很慢的问题从Beta1就开始存在,Beta2 branch最严重,RTM都没根治…… October 29 3个多月了~终于装上了VS2008的build~~April 26 使用Windows Live ID SDK提供MSN帐号认证服务可以在上面的网址下载Live ID SDK。Google里通篇找到的结果都说是使用这个SDK提供在线MSN账户认证。其实是不正确的。
处于安全性考虑,隐式认证函数(即直接的提供帐号和密码,返回是否认证成功)均被包装在innerClass中。而开放给用户的是一个认证WinForm窗口。需要在改窗口内输入账户和密码,认证均在这个被封装的窗体内完成。所以,一般来说,使用这个SDK是无法现实在线认证服务的。
但实际上,我们可以通过反射,调用被隐藏的方法来实现隐式认证,从而集成到ASP.NET中实现在线认证。
不过,目前的alpha版本,根据经验,是无法执行在64位系统上的。原因是.NET 2.0程序可以真正的运行在64位模式下,而需要调用的认证dll是一个32位的标准dll。这样调用的话就会发生问题。目前貌似微软没有相关issue。刚把这个问题提交给了Microsoft,等着回音了~ February 15 "熊猫烧香"....写熊猫烧香的家伙算是被抓住了~网上的评论也很多。
其中一种声音却是觉得这是一个人才,觉得他必定会被国家安全局雇用。
真是滑稽,熊猫烧香病毒说白了,一个Delphi程序,包含删文件/自我复制/修改html页面/修改注册表/与server通讯 等一堆网上随便翻翻就能找到例子的代码。缺乏技术含量的一个病毒。而广大的受害者缺乏的却是安全意识。如果不浏览小网站,如果ie提示该网页打算下载一个可执行文件时取消,如果给自己的系统设置管理员密码……
说实在的,一个人写一个病毒也许是好玩,但不停地更新这个病毒就是道德问题了。一个病毒感染可执行文件或是损坏系统等我说算是可以容忍,但一个病毒删除用户文档和备份数据,这就更是道德问题了。虽然我没中过这病毒,但这人的所作所为,确实该枪毙。
只是对于一些崇拜病毒编写者的评论的想法。 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|