in

SDT Community Server

SDT Forums, Blogs, Photos server.

Floating Heart

No description is bad.

March 2006 - Posts

  • 原来中国人真的没毛

    我同事的外甥女(下简称外甥女,占个小便宜)和我同岁,移民到英国几年了,嫁了个老外是冰岛人(大外甥女2岁,同龄人)。

    外甥女在英国做北京某电器品牌的代理生意,做的有声有色;冰岛的外甥女婿开始在一家公司干工程师,后来看老婆的生意挺红火,就辞职不干了,和老婆一起打理公司----我交代这些,是表明外甥女并非是传统模式中的嫁老外做家庭主妇在经济上完全依附于丈夫(因而被老外丈夫瞧不起),而是完全的人格和经济独立,按咱们的说法,外甥女才是当家的。

    但外甥女的苦恼是,几乎不愿意和冰岛丈夫谈论中国。在他的心目中,中国实质的缩影就是脏、穷、愚昧、黑暗、独裁、非人道、不民主,除此之外,别无其他。这种思想在他心里已经是根深蒂固了,无论你列举多少权威的、有说服力的事例和数据,都不能使他信服,他认 为是精心编造的谎言;即便你摆出客观存在无法否认的事实,他也不会接受,认为这完全是例外。

    我同事的姐姐姐夫老两口去年去英国看小两口,外甥女的公公婆婆也从冰岛赶来看中国的亲家。闲聊开来,难免聊起中国,冰岛的老两口直言不讳地流露出和他们儿子一样根深蒂固的偏见,老外是直性子,心里怎么想就怎么说,小两口也是不加修饰的予以翻译。

    中国老两口听着冰岛亲家对中国的认识,怎么听怎么象在描述19世纪末清朝晚期统治下的中国。任何有一点爱国心(哪怕就一丁点)也不可能接受这种荒唐的没有一点影子的对祖国的评价,这根本就是“污蔑”!中国老两口开始苦口婆心地逐条反驳,讲道理摆事实,外甥 女在一旁苦笑,知道父母即便有涌莲之舌说得天花乱坠也是白搭的。可不,只要说道中国的好处,对方全不接受,认为是政府精心编造蒙骗老百姓的谎言;实在无可辩驳的事实,他们和儿子一样,认为完全是例外。

    中国老两口拿自己当例子,来证明中国还不至于那么穷那么愚昧和黑暗。冰岛亲家看着衣着光鲜打扮入时的中国亲家,穿着比自己还好,气色也不错,说明平日还能吃饱饭,于是回答说:你们完全是特例。中国老两口说:我们就是最普通的中国老百姓,怎么就是特例了,再 说我们就住在中国,你们远在北欧,是我们了解中国还是你们了解中国呀?冰岛的说:你们就是特例,而且不敢说实话,中国不民主,老百姓都不敢说实话。中国老两口说:中国可能没有你们国家民主,但也不至于老百姓都不敢说实话呀,甚至在外面都不敢讲?冰岛的说: 你们要是民主,你们怎么不上街打标语推翻GCD,打倒HJT呢?中国老两口说:我们真心拥护GCD,为什么要推翻他呢?!

    ……

    两国亲家的交流情况就说到这里,再说一个小趣事,大家笑笑。

    欧洲人的皮肤很粗糙,毛孔粗大,体毛也浓密。看到中国人细腻而体毛稀少的皮肤,他们很羡慕,但绝对不相信那是天然的。他们认定,中国人(尤其是中国女人)天天刮体毛,而且是背着人,偷偷地刮,有空就刮。甚至我们冰岛的外甥女婿也是这般认为,结婚一块住了, 还是这么认为,认为老婆是背着他偷偷地刮毛,而且天天如此。(你觉得可笑吗?)

    直到最近,一块生活的时间久了,才恍然大悟:原来中国人真的没毛呀!

    冰岛的外甥女婿来中国探亲的次数多了,耳闻目睹,亲眼所见,慢慢地也接受了一些不愿意接受的事实,对中国的看法终于也有了一些改变,真难得呀。但他父母以为,儿子是被中国媳妇给同化了,也开始说假话了。

    Posted Mar 31 2006, 10:23 AM by wicky with no comments
    Filed under:
  • 中国人为何私下满腹牢骚 开会却一言不发?

    Alex(俄罗斯)/文


     我曾提倡系里员工每周五搞一次早餐聚会,大家聚在一起交流各自教学、科研的心得。第一个周五,我汇报了自己的科研现状;第二个周五,一位美国同事作了报告;第三个周五,一位访问学者发了言。到了第四个周五早晨,我们这几个“外来人员”都已表述过了,该轮到香港本地同事汇报了,然而香港同事个个沉默不语,早茶会最后就这样“无疾而终”。

      与聚会上沉默寡言相反,私底下的飞短流长却异常活跃,人与人之间都紧张地相互提防着。同事总喜欢抱怨他人的工作条件、待遇比自己好,若我询问怎么个好法,他们的回答是:“那还用说,很明显就是好。” 我又追问有什么具体例子,他们说:“具体情况就不便讲出来了,但可以感觉出来。” 我与系里的美国、法国同事聚在一起揣测香港人的这种“感觉”,始终未能破解。由于人人宁愿天天去“很明显地感觉”同事,于是到了全系员工大会上,要大家谈谈各自的想法时,会场里始终鸦雀无声,个个好像都还在沉思、“感觉”着,但就是拒绝道明自己肚子里那些“很明显的感觉”。

      系里有些教师去外面讲学捞了些外快,系主任在全系大会上宣读了一个通知:要求挣了外快者上缴一部分所得给系里。我当即提出这种做法不妥:“这是变相征收所得税,无论是系里还是主任都无权修改政府的个人所得税法律,这是违法行为。”系主任愣了半晌后表示:“你提醒得对,我们得尊重法律。所以我改为要大家以自动捐赠的名义缴纳30%的校外兼课收入,我马上起草一份《自愿捐赠书》,每位员工都要签字。看来我们还得建立一个监督机制,让大家互相检举不上缴外快的员工。” 听了主任的这番高论,我瞠目结舌。在场的员工则无人提出异议,我纳闷中国人怎么不敢挺身维护自己的权益呢?让同事之间互相监视和鼓励暗地里打小报告,这也太恐怖了吧。

      与中国人一起开会都堪称是“哑巴会”,奇怪的是,中国人私底下交头接耳时个个都挺能高谈阔论的,一旦到了正式会议上领导征询大家意见、看法时,他们的舌头都好像被割掉了似的一片死寂。大会上,站出来表态提意见的全是外籍职员,外国人于是成为离经叛道、故意挑刺的麻烦制造者。我询问中国同事,明明满肚子牢骚,有了表达的机会时为何却一言不发呢?他们回答:“干吗我要出那个头,又不是我个人的私事,中国有句古语‘枪打出头鸟’。”

    Posted Mar 31 2006, 10:15 AM by wicky with no comments
    Filed under:
  • asp.net

    The official microsoft ASP.Net 2.0 site.

    There are many ASP.Net resources.

    http://www.asp.net

     

  • 411asp.net

    Welcome to ASP.NET Resource Index.  We are the definitive guide for ASP.NET web applications, controls, scripts, and other related resources for Active Server Pages .NET.  Accomplishing more with your ASP.NET website is easy with the help of these pre-packaged, tested, and ready-to-run resources.  Dig in and have fun!

    http://www.411asp.net/

  • Another ASP.NET HTTP Compression Module: WinFxHttpCompression

    Here is an ASP.NET HTTP Compression Module that WILL compress WebResource.axd requests.

    =====================================

    This is an HTTP Module that allows one to enable compression on a specific ASP.NET web application. This module supports GZIP and DEFLATE compression. This implementation supports the following features: 1) GZIP and DEFLATE 2) Does NOT compress GIF, JPEG, or GIF images. 3) Does NOT suffer from the Response.End issue of some other implementations. 4) Uses the .NET 2.0 Compression Libraries

    http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=2ccc1da1-e45c-401f-9b58-9b533eadb66b

     

  • GridView + SqlDataSource 的性能让人担忧

    同一台数据库服务器,同一台网页服务器,同一个表(138686条记录), 每页10条记录,用HttpWatch观察

    Oracle JDeveloper + JDBC + JSP

    初始显示第一页:25秒,点第二页:17秒,点第三页:17秒 ...

    IIS + GridView + SqlDataSource

    初始显示第一页:39秒,点第二页:39秒,点第三页:39秒 ...

    如果SqlDataSource.EnableCache=true

    初始显示第一页:39秒,点第二页:<1秒,点第三页:<1秒 ...

    真是令人担忧啊,难道要EnableCache? 对服务器的影响如何呢?

    Posted Mar 28 2006, 12:11 PM by wicky with no comments
    Filed under:
  • Bug of GridView.EnableSortingAndPagingCallbacks?

    如果设置EnableSortingAndPagingCallbacks = true,用HttpWatch进行观察,发现GridView的Post Size每次都增大一点,也就是排序/换页点得越多次,速度就越慢。设置成false就是比较恒定的数值。

    怪不得MS默认设置成false ...

     

    Posted Mar 28 2006, 11:58 AM by wicky with 1 comment(s)
    Filed under:
  • How To Install CS Modules

     
    Installing a CSModule is generally very easy. Just follow these easy steps:
    1. Your CSModule should come as an external assembly. Simply drop that .dll file into the bin/ directory of your Community Server installation.
    2. Edit your communityserver.config file (found in the root folder of your Community Server installation), scrolling down to the <CSModules> node. There, you will need to add a registration line (see below for specific syntax).
    3. Generally, it should just work now. In some cases you may want "touch" the web.config to make sure the configuration changes are loaded.

    <CSModule> add syntax

    Use the following syntax to add and register a CSModule with your Community Server installation:

    <add name="VoiceFilterModule" type="CommunityServer.Team.ModuleContest.VoiceFilterModule, ModuleContest" />

    Where:

    • "name" is just a unique name for the module and installation
    • "type" is the fully qualified class name, a command, and the assembly in which it is found

    http://developer.communityserver.org/default.aspx/CS.HowToInstallCSModules

     

  • First CS Module Content

    On the weekend of January 20th, we set out a internal CSModule contest. The goal was to give the CS developers the weekend to build as many CSModules they could, and in the end a vote would be taken internally to figure out the top 3 modules. The winners would receive a few gifts, and more importantly bragging rights ......

    http://developer.communityserver.org/default.aspx/CS.FirstCSModuleContent

     

  • 印度的软件工业

    虽然很老了,但是还是很有现实意义。

    ========================================================

    印度的软件工业

    我在工作中,接触到印度软件公司开发出来的软件:


      整个体系架构非常清晰,按照我们的要求实现了全部功能,而且相当稳定。但是打开具体的代码一看,拖沓冗长,水平不咋样。我们自己的一些程序员就有怪话了,说他们水平真低。但是!印度人能够把软件整体把握得很好,能够完成软件,并得到相当好的设计文档。
      而中国人在那里琢磨数据结构、算法,界面人员就还没编码就想着是Outlook式的还是Visual Studio式的界面。到最后就成为Code高手,对某 些特定的开发工具精通,但是就是不能保证能够把一个软件稳当、完整的开发出来。
      举个简单的例子:
      软件中需要一个列表,用来表示我们处理的事务。该类表在业务繁忙的时候将变得很大。中国人就用双向链表,抱着《数据结构》书在那里写 链表的类。印度人开了一个大数组,然后就开始干。为什么印度人不用链表,他们说:
      1.你们给出的设备(小型机),最少具备512M内存,浪费一些没有什么。
      2.数组方式访问方便、效率高。
      看出了一拿到东西就吭哧吭哧作Code,和好好进行软件分析的不同了吗?正好前几天我有几个同事从印度回来和我们交流,那家公司是CMM4级 公司。我感受的几点:
      1.流程重于项目
      2.QC(就是QA)独立于研发部门,专门检查研发部门的开发流程是不是按照既定流程走。如果QC觉得流程不对,他会直接上报高层,项目肯定就此停止。
      3.所谓的项目经理(PC)一般也是从编码人员升上来的,并不是所谓的不懂技术,一般都至少有四年以上的经验
      4.PC主要就是制定开发计划,负责协调,填写各种表格。
      5.所有的东西(包括草稿)都有文档。
      6.详细文档要求达到只有这个文档就可以编码的程度,一般写文档时间占60%,编码时间极少
      7.有各种详细的review(同行评审),项目组内的,项目组之间的,客户的……
      8.计划很详细,的确能达到小时级,但是实际情况还是误差比较大,所以他们也有加班。
      先学习UML和Rose以及RUP,不要总是要找着证据。在中国的软件开发水平下,很难给你一个好的例子,OK?中国人总是要看到一个东西有了试 验田,而且稻子长得好,才换稻种。要知道在国外上述的软件开发模式的应用,大可以看看 Rational网页上的story。Just do it!一句话,中国的软件开发水平低得很。赶不上印度人,印度的软件公司可以让高中生编代码,它的软件工程水平可想而知。
      当然,你如果是个很牛的程序员。估计够呛,因为中国的气氛中,很牛的程序员都很难接受软件工程的。你可以测试一下自己,看看自己适不适合现在学习软件工程
      1.你是不是不能忍受一个编程序不如你的人做你的项目经理?
      2.你是不是觉得你的老板对客户吹牛皮、夸大自己而感到不舒服?
      3.你是不是一个拿到一个需求脑袋里第一念头就是如何实现的人?
      4.你是不是很崇拜Stallman,Linus,很讨厌Microsoft?
      5.你是不是曾经在深夜编码的时候,突然感觉到一种乏味,对Code的生涯感到一种无趣?我们现在处于深深的自卑当中,感到中国的软件工程水平的低下已经是牵涉到民族劣根性的问题了。
      1.他们的软件教育水平:我们招聘印度人,给应聘者出了一份与国内差不多的试卷,有基础概念和编程题目。等到他们完成后,我们这些中国 的自认高手惊呆了!他们的编程题目简直象是抄袭的??程序结构,注释,变量命名就不说了吧,全部都是极其类似!
      反观中国的牛人、高手,每个人有自己的一套。到了新的岗位,先把前任的程序贬损一通,然后自己再开发更多的问题的代码来代替。我的公 司统计,一个软件中有4个以上CSocket版本,每个人都觉得别人做得差,自己再搞一套。中国人,就是这个样子,还会辩解说“我们这样有创造
    性”。其实软件发展,早就走过了求伯君那个编码英雄的年代,程序员已经是个坐办公室的蓝领了。你具备拧好一个螺丝钉的能力就可以了,Code 是最低级的事情了。
      2.他们许多公司的项目经理根本就不懂技术。中国的项目经理如果不能在技术上压服下属,那么下属将与他搞鬼,越是高手越喜欢搞鬼,根本不知道作软件的终极目的是从别人兜里掏钱,而在内部搞不团结。技术高手都会纠集一些对他技术上崇拜的菜鸟,与管理层作 对。
      而印度的软件经理根本就不懂正在做的东西,许多甚至直接就是MBA,或者是领域专家(工业设计、地理专家等),而不是编码的专家。但是却 能够领导大群素质良好的程序员把工作做好,没有内部不团结的情况。许多印度的程序员加入一个公司很长时间,都不知道自己整天编的代码是干
    什么用的。给他们的任务可能就是一个函数的声明以及该函数要实现的功能。我们呢?
      3.他们的编程人员的流动率达到 30%!他们的编程人员流动率(包括内部项目之间的流动)高达 30%,可以想见他们的文档水平如何。他们的 产品不依赖任何一个人,谁都可以立即辞职,产品的开发还是会正常进行。而中国,是老板怕总工。技术骨干拥兵自重,抗拒管理。任何制定好的计 划,都有可能被技术人员推翻或者跟你消极怠工。
      4.他们的开发计划能够做到小时级别。如果一个印度公司的项目经理没有上班,那么他的下属将可能不知道作什么。他们的计划一般都定到天,每个基层开发人员每天的工作量就是 8小时。而我们能够给出月度计划的公司就很少,而给出的月度计划要么不可能实现,要么就可能被取消。开发人员被初略的给个任务,他在月初,可以慢慢琢磨是做成什么样子,然后上上网,聊聊天。到了月中和月末,就开始熬夜编码。
      看到每年,从各大高校不尽牛人滚滚来,我们是不得不要召人,同时又是不抱希望。我公司现在有意以后将核心软件开发外包给印度公司,中国人?做做界面吧,中国人做界面会极尽奇技淫巧,搞得花里胡哨的。BTW,大家不要误会我有什么种族歧视。但是我们现在 就是对自己歧视,自卑得很。中科院那么多研究院,连个能用的操作系统 都搞不定。
      北大开发一些东西,比如什么青鸟CASE,就是给一帮人评职称的。杨芙清院士整天搞来搞去,搞出了什么东西?B大,T大的人最难管理,牛得看不见人。中国的程序员骂微软,追 Linux是全世界最狠的,可是我们除了汉化Linux,做了什么东西出来。CDE 是瑞典人写的,Linus是芬兰的,GNome是墨西哥人写的。哎,我们曾经是多么的瞧不起印度人......

    Posted Mar 25 2006, 08:14 PM by wicky with no comments
    Filed under:
  • ic#code ( ICSharpCode )

    ic#code ( ICSharpCode )
    #develop (SharpDevelop)

    What is #develop? SharpDevelop is a free IDE for C# and VB.NET projects on Microsoft's .NET platform.

    Web site

    #ziplib (SharpZipLib)

    What is #ziplib? SharpZipLib is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform.

    SharpZipLib was designed and created for SharpDevelop.

    Web site

    #usblib (SharpUSBLib)

    What is #usblib? SharpUSBLib is used for low level access to USB devices. It works under WIN32/.NET and Linux/Mono.

    Web site

    #cvslib

    What is #cvslib? SharpCvsLib is a client CVS (Concurrent Versioning System) library written in C#.

    SharpCvsLib was designed and created by Mike Krüger for SharpDevelop, and it is now maintained by Clayton Harbour.

    Web site

  • Style of release history document

    通常一个软件的新版本都有一个变动历史,简洁而又清晰的列表是很重要的。

    下面是Kerio WinRoute Firewall 的Release history,使用简单的legend和字体风格列出了主要变动。

    Release history

    Legend:
    + Added feature
    * Improved/changed feature
    - Bug fixed (we hope)
    ! Remaining bugs / Missing features

    • Version 6.2.0 Release Candidate 1
      February 23, 2006
      * Administration Console now remembers last view in address groups
      * antiviruses now have running/error/disabled indicators in console
      - fixed antivirus quarantine for FTP
      - fixed external antivirus in SSL-VPN
      - fixed console freeze when turning off both antiviruses
      - fixed quota of 0MB not working as expected
      - fixed folder operations in SSL-VPN if folder contains special characters
      - fixed changes in quota action not immediately implemented
      - fixed incorrect sorting by quota for inactive users
      - fixed refresh in SSL-VPN loading previous folder
      - fixed lost antivirus setting after upgrade
      - fixed slowness of statistics screens
      - fixed slow loading of pages from cache
      - fixed nonworking HTTPS via parent proxy
      - fixed saving log to HTML file
      - fixed logs sometimes stopping to update
      - fixed strange downloading of session_refresh.html in SSL-VPN
      - fixed encoding of antivirus messages in emails
      - fixed wild card matching of filenames in antivirus HTTP/FTP rules

    • Version 6.2.0 Beta 2
      February 9, 2006
      - many bugs fixed in the anti-virus code
      - fixed several stability issues
      - many other minor bugs fixed

    Posted Mar 22 2006, 08:51 AM by wicky with no comments
    Filed under:
  • Microsoft Visual Studio 2005 Team Foundation Server Workgroup Edition is released

    Microsoft Visual Studio 2005 Team Foundation Server Workgroup Edition is released ...
    Posted Mar 21 2006, 12:26 PM by wicky with no comments
    Filed under:
  • 讲MBA课的出租车司机

    我要从徐家汇赶去机场,于是匆匆结束了一个会议,在美罗大厦前搜索出租车。一辆大众发现了我,非常专业的、径直的停在我的面前。这一停,于是有了后面的这个让我深感震撼的故事,象上了一堂生动的MBA案例课。为了忠实于这名出租车司机的原意,我凭记忆尽量 重复他原来的话。

    “去哪里……好的,机场。我在徐家汇就喜欢做美罗大厦的生意。这里我只做两个地方。美罗大厦,均瑶大厦。你知道吗?接到你之前,我在美罗大厦门口兜了两圈,终于被我看到你了!从写字楼里出来的,肯定去的不近~~~”

    “哦?你很有方法嘛!”我附和了一下。

    “做出租车司机,也要用科学的方法。”他说。我一愣,顿时很有些兴趣“什么科学的方法?”

    “要懂得统计。我做过精确的计算。我说给你听啊。我每天开17个小时的车,每小时成本34.5元……”

    “怎么算出来的?”我追问。

    “你算啊,我每天要交380元,油费大概210元左右。一天17小时,平均每小时固定成本22元,交给公司,平均每小时12.5元油费。这是不是就是 34.5 元?”,我有些惊讶。我打了10年的车,第一次听到有出租车司机这么计算成本。以前的司机都和我说,每公里成本0.3元,另外每天交多少钱之类的。

    “成本是不能按公里算的,只能按时间算。你看,计价器有一个“检查”功能。你可以看到一天的详细记录。我做过数据分析,每次载客之间的空驶时间平均为7分钟。如果上来一个起步价,10元,大概要开10分钟。也就是每一个10元的客人要花17分钟的成本,就 是9.8元。不赚钱啊!如果说做浦东、杭州、青浦的客人是吃饭,做10元的客人连吃菜都算不上,只能算是撒了些味精。”

    强!这位师傅听上去真不象出租车司机,到象是一位成本核算师。“那你怎么办呢?”我更感兴趣了,继续问。看来去机场的路上还能学到新东西。

    “千万不能被客户拉了满街跑。而是通过选择停车的地点,时间,和客户,主动地决定你要去的地方。”我非常惊讶,这听上去很有意思。“有人说做出租车司机是靠运气吃饭的职业。我以为不是。你要站在客户的位置上,从客户的角度去思考。”这句话听上去很专业,有 点象很多商业管理培训老师说的 “put yourself into others' shoes.”

    “给你举个例子,医院门口,一个拿着药的,一个拿着脸盆的,你带哪一个。”我想了想,说不知道。

    “你要带那个拿脸盆的。一般人病小痛的到医院看一看,拿点药,不一定会去很远的医院。拿着脸盆打车的,那是出院的。住院哪有不死人的?今天二楼的谁死了,明天三楼又死了一个。从医院出来的人通常会有一种重获新生的感觉,重新认识生命的意义,健康才最重要。 那天这个说:走,去青浦。眼睛都不眨一下。你说他会打车到人民广场,再去做青浦线吗?绝对不会!”

    我不由得开始佩服。

    “再给你举个例子。那天人民广场,三个人在前面招手。一个年轻女子,拿着小包,刚买完东西。还有一对青年男女,一看就是逛街的。第三个是个里面穿绒衬衫的,外面羽绒服的男子,拿着笔记本包。我看一个人只要3秒钟。我毫不犹豫地停在这个男子面前。这个男的上 车后说:延安高架、南北高架~~~还没说后面就忍不住问,为什么你毫不犹豫地开到我面前?前面还有两个人,他们要是想上车,我也不好意思和他们抢。我回答说,中午的时候,还有十几分钟就1点了。那个女孩子是中午溜出来买东西的,估计公司很近;那对男女是游 客,没拿什么东西,不会去很远;你是出去办事的,拿着笔记本包,一看就是公务。而且这个时候出去,估计应该不会近。那个男的就说,你说对了,去宝山。”

    “那些在超市门口,地铁口打车,穿着睡衣的人可能去很远吗?可能去机场吗?机场也不会让她进啊。”

    有道理!我越听越有意思。

    “很多司机都抱怨,生意不好做啊,油价又涨了啊,都从别人身上找原因。我说,你永远从别人身上找原因,你永远不能提高。从自己身上找找看,问题出在哪里。”这话听起来好熟,好像是“如果你不能改变世界,就改变你自己”,或者Steven Corvey的“影响圈和关注圈”的翻版。“有一次,在南丹路一个人拦车,去田林。后来又有一次,一个人在南丹路拦车,还是去田林。我就问了,怎么你们从南丹路出来的人,很多都是去田林呢?人家说,在南丹路有一个公共汽车总站,我们都是坐公共汽车从浦东到 这里,然后搭车去田林的。我恍然大悟。比如你看我们开过的这条路,没有写字楼,没有酒店,什么都没有,只有公共汽车站,站在这里拦车的多半都是刚下公共汽车的,再选择一条最短路经打车。在这里拦车的客户通常不会高于15元。”

    “所以我说,态度决定一切!”我听十几个总裁讲过这句话,第一次听出租车司机这么说。

    “要用科学的方法,统计学来做生意。天天等在地铁站口排队,怎么能赚到钱?每个月就赚500块钱怎么养活老婆孩子?这就是在谋杀啊!慢性谋杀你的全家。要用知识武装自己。学习知识可以把一个人变成聪明的人,一个聪明的人学习知识可以变成很聪明的人。一个很 聪明的人学习知识,可以变成天才。”

    “有一次一个人打车去火车站,问怎么走。他说这么这么走。我说慢,上高架,再这么这么走。他说,这就绕远了。我说,没关系,你经常走你有经验,你那么走50 块,你按我的走法,等里程表50块了,我就翻表。你只给50快就好了,多的算我的。按你说的那么走要50分钟,我带你这么走只要25分钟。最后,按我的路走,多走了4公里,快了25分钟,我只收了50块。乘客很高兴,省了10元钱左右。这4公里对我来说就 是1块多钱的油钱。我相当于用1元多钱买了 25分钟。我刚才说了,我一小时的成本34.5块,我多合算啊!”

    “在大众公司,一般一个司机3、4千,拿回家。做的好的大概5千左右。顶级的司机大概每月能有7000。全大众2万个司机,大概只有2-3个司机,万里挑一,每月能拿到8000以上。我就是这2-3个人中间的一个。而且很稳定,基本不会大的波动。”

    太强了!到此为止,我越来越佩服这个出租车司机。

    “我常常说我是一个快乐的车夫。有人说,你是因为赚的钱多,所以当然快乐。我对他们说,你们正好错了。是因为我有快乐、积极的心态,所以赚的钱多。”

    说的多好啊!

    “要懂得体味工作带给你的美。堵在人民广场的时候,很多司机抱怨,又堵车了!真是倒霉。千万不要这样,用心体会一下这个城市的美,外面有很多漂亮的女孩子经过,非常现代的高楼大厦,虽然买不起,但是却可以用欣赏的眼光去享受。开车去机场,看着两边的绿色, 冬天是白色的,多美啊。再看看里程表,100 多了,就更美了!每一样工作都有她美丽的地方,我们要懂得从工作中体会这种美丽。”

    “我10年前是强生公司的总教练。8年前在公司作过三个不同部门的部门经理。后来我不干了,一个月就3、5千块,没意思。就主动来做司机。我愿意做一个快乐的车夫。哈哈哈哈。”

    到了机场,我给他留了一张名片,说:“你有没有兴趣这个星期五,到我办公室,给微软的员工讲一讲你怎么开出租车的?你就当打着表,60公里一小时,你讲多久,我就付你多少钱。给我电话。”

    我迫不及待的在飞机上记录下他这堂生动的MBA课。
    Posted Mar 16 2006, 12:46 PM by wicky with no comments
    Filed under:
  • RSS.Net

    RSS.NET is an open-source .NET class library for RSS feeds. It provides a reusable object model for parsing and writing RSS feeds. It is fully compatible with RSS versions 0.90, 0.91, 0.92, and 2.0.1, implementing all constructs.

    http://rss-net.sourceforge.net/

  • Power Collections and Power Threading

    Power Collections

     

    With .NET 2.0 comes the ability to implement what has been known in C++ as template classes. Generics are like C++ templates, only better.. READ MORE

    Power Threading

     

    This library includes its own thread pool, thread utility methods, thread synchronization locks, and classes to help developers build the asynchronous programming model into their own classes. . READ MORE

    http://www.wintellect.com/Resources.aspx

  • Add a Bloggers list to Default page

    Put these codes into your page:

         <div class="CommonSidebarArea">       
          <h4 class="CommonSidebarHeader">Bloggers</h4>
          <div class="CommonSidebarContent">
           <%
            //GetWeblogs(bool cacheable, bool ignorePermissions, bool flush)
            ArrayList blogs = Weblogs.GetWeblogs(true,false,false);
            
            for (int i = blogs.Count; --i>=0; )
            {
             for (int j = 0; j<i; j++)
             {
              Weblog blog1 = (Weblog) blogs[j];
              int count1 = blog1.PostCount + blog1.ArticleCount;
              Weblog blog2 = (Weblog) blogs[j+1];
              int count2 = blog2.PostCount + blog2.ArticleCount;
              
              if (count1<count2)
              {
               object o = blogs[j];
               blogs[j] = blogs[j+1];
               blogs[j+1] = o;
              }
             }  
            }
            
            for(int i=0; i<blogs.Count; i++)
            {        
             Weblog blog = (Weblog) blogs[ i ];
             int count = blog.PostCount+blog.ArticleCount;
             if(count<1) continue;
           %>
           <div class="CommonSidebarContentItem">
           <a title="<% =blog.Name %>" href="<% =blog.Url %>"><% =String.Format("{0} ({1})",blog.Name, count) %></a>
           </div>
           <%
            }
           %>
          </div>
         </div>

    It is not good for large site, but for small site with scores of bloggers, it should be good enough.

  • Blowery HttpCompress Module for ASP.Net

    A pretty HTTP filter which compress HTTP stream for ASP.Net.

    Version 6 for .Net 2.0 is out.

    http://www.blowery.org/code/HttpCompressionModule.html

    后记:

    这个版本并不支持WebResource.axd,如果使用了MagicAjax等控件。

    要修改excludedPaths:

          <excludedPaths>
            <add path="WebResource.axd"></add>
          </excludedPaths>

  • 飞花

    飞花

    曲:李偲菘 词:陈少琪 编:Ansen
    唱:李克勤

    凌晨同静望 奇幻冰雕亮光
    你我抱拥于陌生的地方
    同游零度下 纯白色的札幌
    你说要永远拥有这夜风光

    绵绵头上飞花 散聚了无牵挂
    谁能求漫天雪地里这温暖长留下
    (谁能求漫天雪地里这足印不退下)
    绵绵头上飞花 能遇上壮丽落霞
    (绵绵头上飞花 能遇上一次落霞)
    如像你跟我 暂借的火花
    (怀念那一剎 耀眼的火花)

    为何流下泪 沉在一碗热汤
    你说你担心 若我不在旁
    为何还在愿望黎明后捉紧曙光
    你我有过这个故事 便至死未忘

    其实我更喜欢谭咏麟在“左麟右李”演唱会上的版本,原版听完都没什么印象。

     

    Posted Mar 13 2006, 01:01 PM by wicky with no comments
    Filed under:
  • 面向.NET开发人员的Ajax 技术平台策略

    面向.NET开发人员的Ajax 技术平台策略

    小气的神 (ccBoy)
    2006.02.15

    在这里我将试图考察一下目前.NET平台的下的Ajax框架,我也试图从中总结出来一种方法,使得你可以在众多基于.NET平台的Ajax框架和工具包中找到你所合适的一种,同时也希望你在考察、预研和使用这些流行的这些Ajax-NET 的框架时,做得理性和有的放矢。

    我想,文章的方法会给目前使用Ajax的.NET用户带来帮助,从而提高你在.NET平台下使用Ajax的体验。为什么这么说,因为最近我的一个客户(应该是一些客户)的研发主管对我说,我们对Atlas 非常兴趣,想了解更多一些相关的内容和如何开始看待Atlas,因为下个月会来一个Atlas的专家和我们交流。。。。因为我知道这个主管手上掌握着一个Ajax架构的业务应用,目前在考虑从.NET v1.1迁移到.NET v2.0,Atlas能在怎样的程度上帮忙他或他的Team?我没有说太多,因为心里我有些吃惊,目前的他们的架构应用Atlas 可能并不是一个明智的选择,当然这个担心基于我目前对Atlas的理解。

    我列举和讨论的Ajax-NET的框架和工具包括Atlas(Jan CTP), Anthem.NET, MagicAjax.NET , Ajax.NET Professional wwHoverPanel Control,这基本都是我关注的.NET平台的下的Ajax 的一些框架和实现。 基本上也都是我的这篇文章中列举的,另外一个原因是因为他们基本上都是开源的,这个非常重要,因为没有源代码,我们将不知道究竟发生了什么。另外我无意于使之成为像Daniel Zeiss作的这个比较报告

    首先,开门见山的说明我的观点,这是前些天Ajax书评中忽略过的话题和论点,今天就在这里补上。


    对于开源或现有的Ajax-NET技术或框架的选用必须针对你目前应用的架构来选取和考虑,如果你目前的架构是"似Ajax"的,那么你在选择现在所有流行的Ajax-NET的技术的时候都必须非常小心;而如果你目前的应用是使用传统的ASP.NET的应用架构(或准备用ASP.NET v2.0开始创建新的应用),那么目前流行的Ajax-NET的框架和技术都是普遍适合的,关键你要在合适的时机选择合适的某个框架或实现。

    在我的眼中,目前流行的Ajax-NET的框架或实现都是Add-in (Plug-in)的模式的,也就是说这些框架对于所有后一种即使用传统的ASP.NET的应用架构(或准备用ASP.NET v2.0开始创建新的应用)是Awared的也就是非常有利和方便的。但对于"似Ajax"的架构来说,情况有所不同,需要你从另外的角度来衡量,有选择的使用。

    那什么是"似Ajax" 的架构呢,这就是说,你的应用程序是在Ajax概念提出之前就创建的。从客户端和服务器端的交互分析来说,你的客户端有大量的Javascript 代码接受XML数据,进行对象的序列化,然后使用Javascript配合其它的HTML技术展现这些对象和数据,也可能你还有一堆HTC或其它的Javascript的HTML表现层控件。你的服务器端是一个Facade(或者是Adapter,Observer)模式的(Handler)控制器,接收客户端Javascript的XML请求数据后,然后解析XML,然后调用相应的某个服务或业务组件,再将结果以XML的形式返回给客户端Javascript ,客户端的Javascript接收之后,再进行处理和显示,因为可以使用HTML的DOM 和CSS,所有页面的展现是动态的。
    这样客户端是<Ajax in Action>中描述的Script-centric architecture 或Data-centric interactions 的方式。而且这种方式和Jesse James Garrett列举的Ajax 是最类似的,只不过那时你或我不知道这个可以叫Ajax,只不过是现在的人误解了Ajax,Ajax成了一种技术,一种特性,而首先不是一种某种架构下Web 应用了。

    而且目前流行的Ajax-NET的框架基本上都没有实现双向序列化,因为实现一个TextBox的自动完成客户端只用接收数据就行了,根本不用传回数据/对象到服务器端,同样做一个Ajax的状态进度条也不用,但这些都是Ajax啊,我们衡量的标准是异步的、页面没有刷新。

    很抱歉,我用了这么字才解释完我的观点。最后可以这么说,如果你的应用已经是Ajax架构的,那么你需要仔细选择使用目前的Ajax-NET框架,确保它也提供双向序列化功能,兼容你原来的应用和架构。如果你的应用不是Ajax架构的,那么你可以依据一些条件来选择Ajax-NET框架

    然后我们回到文章的开始,来看一些流行的Ajax-NET框架


    1. MagicAjax.NET

    这是目前框架中版本号最小的一个Ajax-NET实现,许多人很喜欢它,甚至一见如故,但真的看过它的代码之后,我有些担忧。
    MagicAjax.NET基于这样一种策略,即__doPostBack 会提及整个的ASP.NET页面,这样会导致页面刷新,所以MagicAjax.NET使用AJAXCbo.DoPostCallBack 做局部的提交,而每个Ajax
    Panel 中的内容则对应客户端即时的HTML内容,因为在MagicAjax.NET中,客户端只用执行eval(responseText) 服务器端Rendered返回的HTML就可以了(很被动)。

    由于DoPostCallBack 会提交ViewState 以及AjaxPanelx$RBS_Store,几乎是用XMLHttpRequest 模拟一个正常的提交,所以服务器端可以创建页面的实例也可以根据ViewState 恢复所有的控件状态,同样AjaxPanel 以及AjaxControl 也都会实例化,然后接收客户端传来的_EventTarget, _EventArgument 走正常的ASP.NET控件的处理过程,等控件Rendered之后,最终的HTML输出被传回客户端,然后被客户端的eval 显示出来。

    整个过程非常巧妙,这几乎是ASP.NET __doPostBack 的"Hook ASP.NET"版和加强版本。
    而HttpModel 主要是为了解决Session和交叉提交,进行客户端Javascript的整理和注入,当然也是这里接收客户端的请求,在Application_EndRequest中返回结果。剩下的代码都是处理控件在VS Web Design中的设计时支持。AjaxCallObject.js 和WebParts.js 每次都要传到客户端。

    MagicAjax.NET 的一些不足和想法:
    1。 __doPostBack 的加强版,适合于ASP.NET的高级用户使用
    2。由于和ASP.NET的页面处理机制依赖非常密切,控件的默认动作发生变化则可能不工作,比如第三方的某个自定义控件;
    3。依赖ViewState ,如果是加密的ViewState,则可能工作不正常,我没有试,在代码中好像没有看见__VIEWSTATEENCRYPTED
    4。是对ASP.NET 全部页面提交的优化,实现有限的Ajax功能,可扩展性不大

    如果是基于ASP.NET 提供的控件和开发,那么MagicAjax.NET 是非常有效的,很好的解决了Session和跨页面状态的问题。而且客户端的操作和工作基本可以忽略,MagicAjax.NET设计贴近最近的ASP.NET的版本,目前不提供调用客户端直接调用页面的方法。但随着其发展,优势可能渐少,因为Atlas 最新的版本提供类似的UpdatePanel 控件。

    经典必看文章-Magic AJAX: Applying AJAX to your existing Web Pages -Argiris Kirtzidis
    http://www.codeproject.com/Ajax/magicajax.asp#xx1313380xx


    2. Anthem.NET

    目前是1.0版本,其设计理念是通过另外一个思路,遵循这样的理念--既然ASP.NET的各个标准控件没有实现提交功能,那么我可以产生一个提交的接口,然后继承原来的标准控件,然后再实现这个接口,这样每个控件都可以向服务器端单独进行提交。

    每个控件的发生过程类似MagicAjax.NET,Anthem.NET提供了各个控件Javascript端的提交函数-这等于也截取了__doPostBack,之后Anthem.NET 还提供了完善的客户端的事件比如PostCallBack 和PreCallBack 这样的客户端事件,之后也将使用XMLHttpRequest 模拟一个传统的页面提交请求到服务器端,服务器端生成页面实例,这个过程和MagicAjax.NET一样,最后是将Rendered的HTML在控件的Render() 事件传回到客户端,客户端控件的innerHTML被赋值,动态更新

    和MagicAjax.NET不同的是,Anthem.NET没有容器的概念,因为每个控件都增加了提交接口,所以可以单独的提交,所以单位是以一个控件为单位进行一次提交,Anthem.NET的花费更小些(但服务器端是类似的,因为整个ASP.NET页面的Pipeline都会进行)。

    此外,Anthem.NET 还有另外的功能,就是可以通过客户端调用页面中的方法并获得结果/数据,这种情况下,你将调用Anthem_InvokePageMethod 方法,而不是Anthem.NET提供的默认各个控件的提交方法。这样Javascript的回调处理函数中的result.value 将可以获得调用的服务端的某个方法(该方法以[Anthem.Method]为标记)的执行结果,因为JavascriptPost的数据中有Page/MasterPage/Control 了,那么服务器端很容易通过这个标识获得方法的地址,应用反射寻找[Anthem.Method]标记,然后调用,将结果返回到客户端。

    Anthem.NET支持返回对象,DataSet,DataTable和 WriteDataRow(WriteDataSet,WriteDataTable,WriteDataRow,WriteObject),返回的是符合是JSON规范的字符串,这样客户端的Javascript就可以使用这些对象了。不同于MagicAjax.NET,Anthem.NET 没有使用HTTP Model,所以结果是在页面的PreRender() 事件中处理和返回请求的结果。

    2.1 Ajax.NET Professional
    我没有看过Ajax.NET Professional 的源代码,但从例子中看得其支持调用页面的某个方法,以及返回对象,DataSet,DataTable的数据,我认为Ajax.NET Professional 的实现和Anthem.NET 原理是一样的,虽然Ajax.NET Professional 使用了HTTP Model,这个只是和Anthem.NET 一样,最终处理结果的返回处理上稍有不同不同。比较起来,Ajax.NET Professional 没有重新继承所有常用的ASP.NET控件实现部分提交的功能,所以可能Ajax.NET Professional 比较强项的是调用页面上的某个方法,并在客户端获得结果的数据,这个已经够实现大部分的Ajax的功能了。

    从这个层面上看,我认为Ajax.NET Professional 是相对笨重和复杂了。Anthem.NET不使用HTTP Model,提供控件基本的局部提交,也提供数据层面的客户端方法调用。Ajax.NET Professional 的源代码似乎总是不想共享,这也是我不喜欢它的另外一个原因。
    无论如何,大家都没有提供两路的数据交换,即客户端可以获得服务器端的方法并获得结果和数据,但是目前都支持将这些对象/数据修改之后返回给服务器端。

    Anthem.NET 的一些不足和想法:
    1. Anthem.NET 也是一种"Hook ASP.NET"原理,旨在弥补ASP.NET的整页面的提交和PostBack,并且在客户端的数据访问和交互上做了加强。
    2. Anthem.NET需要重新将ASP.NET提供的控件进行继承和包装,所以使用和功能的兼容性上非常敏感。
    3. 也许微软下个版本的ASP.NET的标准控件可以借鉴Anthem.NET的做法,给各个控件增加这个远程回调的接口。
    4. 目前版本的功能已经非常强大和略有些复杂了,而且部署比较方便,无需设置HTTP Model。

    经典必看文章-Introduction to Anthem.NET
    http://www.codeproject.com/useritems/AnthemNET.asp#xxxx


    3. wwHoverPanel AJAX Control for ASP.NET

    wwHoverPanel AJAX Control for ASP.NET 这也是一个ASP.NET的控件,但是提供了客户端回调(高级回调)、客户端调用页面方法,以及双向两路的序列化功能。
    wwHoverPanel 吸取了MagicAjax.NET 和 Anthem.NET的优点,同时又结合了ASP.NET的客户端回调功能,是一个轻量级的Ajax组件。

    看待wwHoverPanel 最大的两个特性中的一个是用很简单的方式实现了一个HoverPanel Behavior,这个实现比目前Atalas的Behavior 要简单,作者Rick Strahl 也强调这个主要是结合他具体的应用,比如这里提供了一个小的HTML板,可以显示获得的结果信息。

    wwHoverPanel 也提供一个局部回调的方法,但是这点的实现上和MagicAjax.NET 以及 Anthem.NET完全不同,它是使用一个StartCallback的Javascript来组合查询字符串提交并且使用XMLHTTP发请求到服务器的某个页面(由ServerUrl 属性指定),之后这个页面将结果以Response.Write()的原生HTML内容返回。这个和ASP.NET的回调方法非常类似,而且还支持将请求发到本页之外的ASP.NET并获得结果,所以它增强了原来ASP.NET的客户端回调的方法,即支持其它页面的回调。可以说,这是一种基于URL的客户端回调。

    wwHoverPanel 提供的第二个功能是,客户端可以调用服务器端中的某个页面的方法(这些方法以[CallbackMethod]进行标识),这种情况下,你要设置EventHandlerMode="CallPageMethod" ,然后使用wwHoverPanel.服务器方法名(参数,参数,...,回调处理函数)的方式进行调用。这个其实使用的是一个Javascript的CallMethod 方法,调用服务器端的请求。Javascript 的HandleCallback 则用来处理返回的结果,逻辑相对简单,尽管控件的innerHTML 也被赋值,但这个主要是为了维护作为客户端回调结果显示的小的HTML板的内容,否则就是调用页面中的方法了,那么结果就直接给客户端的回调方法了。

    特色三,就是我说的双路的序列化功能了,其实这个场景我们也非常需要,比如我们用客户端回调或XMLHTTP请求获得了一个定单对象,那么客户端修改之后,我还想把它作为一个客户端调用的输入参数,返回到服务器端。这时候两路双向的序列化就需要了,因为这次服务器需要将Javascript的函数传了的数据序列化成.NET的类。这也就是JSON的双向序列化了(主要代码在JSONSerializer.cs ),这也是我挺喜欢的一个功能,因为我对这个功能关注很久,但是目前流行的Ajax-NET的框架都不支持这个功能。
    目前在wwHoverPanel 的场景中,我认为这是一种轻量级的实现,对于多层嵌套多组引用的对象图类型或是大规模容量访问压力下,客户端和服务器端都还需要优化,所以如果其作为Ajax架构,客户端和服务器端通信和传递数据的通讯层上,显然是有些单薄了。

    wwHoverPanel 的一些不足和想法:
    1. 该控件是目前我见过.NET平台下,惟一同时支持客户端回调和页面方法调用的Ajax 控件,同时又支持两路双向的序列化。
    2. 相对来说,wwHoverPanel是设计最简单的一个,而且是基于控件不依赖HTTP Model和ASP.NET Page Pipeline,也不依赖ViewState
    3. 该控件能够让你在Ajax特性实现的技术层面上,能够在客户回调和客户端调用页面方法两者中取得平衡。
    4. 目前的客户端回调支持其它页面的回调,但是其结果输出需要输出原始的HTML,这个影响应用的分层和设计。
    5. JSON的双向序列化是一个不错的方案,但高性能的场景下,应该考虑实现更高效的序列化框架

    经典必看文章-wwHoverPanel AJAX Control for ASP.NET posted
    http://west-wind.com/weblog/posts/4408.aspx



    4. Atlas

    这个产品,我就不列举具体的功能了,而主要说一下我对其的看法和持有的态度。因为在我的Ajax书评中提到过问题。
    Atlas 是一个个性鲜明的产品,其优点是明显的,缺点也是明显的,但首先你必须认识到它还是一个比较复杂,拥有较高学习曲线的解决方案。对于其复杂性,老实说目前,大多数人还缺乏真实的感受。

    最近的一个个版本-Jan CTP,我们看到了一些特性,其强大之处在于:

    1.客户端(Javascript)的数据绑定、校验带来便利。
    2. 新的Update Panels不仅拥有了MagicAjax.NET 的特性,而且功能更强,是目前Atlas中异步回调的主要控件。
    3.内置了一些具体Ajax特性的控件,比如AutoCompleteExtender ,DragOverlayExtender
    4. 提供了一些使用的控件比如,ScriptManager, Triggers ,TimerControl
    5. 主要用途着重在提供一个客户端控件和服务器端控件的特性集成的方案和容易使用的开发效率上。

    但缺点也是明显的,比如:
    1. 客户端的Behaviors还很弱,模板(Templates)和UI增强(UI Enhancements)功能还没有看到。
    2. 所谓的客户端Atlas控件(“Atlas” Client Controls)和服务器端的Atlas控件(“Atlas” Server Controls) 还没有一个明确的规范,所以现在你基本上还不能创建自定义的Atlas控件(无论客户端还是服务器端的)。
    3. 目前还只支持调用Web Services的服务,对于ASP.NET的内置的服务以及WCF的服务支持也没有看见,也不支持页面或控件内的方法调用
    4. 功能上还不稳定,一些功能仅是在特定条件下的特性实现,还不能满足部署生产环境的要求。我认为,如果Atlas发布Go-Live License,那么可以考虑Atlas的放入到正式的项目或应用中。

    我并不建议,你现在就将它应用在一个老的ASP.NET 项目中,或是老项目迁移到ASP.NET v2.0时优先考虑它;更多时候,如果你是创建一个新的ASP.NET应用,而又跨越了其学习曲线的情况下,可以考虑使用它。目前的情况下,对于Atlas,我建议,你应该保持足够的关注和实践学习,但是要抑制住将其应用到项目中的兴趣;因为Ajax,你现在可以开始关注和学习它,但是你不能因为要实现Ajax一个特性,而立即选择Atlas,那么是可能有风险的。

    注: Atals 的Microsoft.Web.Script.Serialization 命名空间中有JavaScriptObjectDeserializer和JavaScriptObjectSerializer两个对象,第一,我不确定其是否也是JSON 序列化,而且我也不确定目前是否支持两路双向的序列化;第二,目前的版本,我还不能进行自定义或扩展,同时也很难对于其性能做任何的结论。

    经典必看文章- Atlas 快速学习参考
    http://atlas.asp.net/quickstart/default.aspx



    基于Ajax 架构的Web应用框架
    之前我提到过"似Ajax" 的架构,现在我要说的Ajax框架也就是指专门针对这种Ajax架构而提供的框架。目前,我还没有听说过特别好的这个领域的流行框架。但我知道我的身边,.NET领域,J2EE领域或PHP平台上都有这样的框架和应用,我认为,正是因为有很多这样应用,所以Ajax才会像某个模式一样,被撰有一个专门的名词。不过我感觉Ajax 渐渐变成了Ajax feature的代名词,变成了XMLHTTP的代名词,成了异步通讯,不刷新页面的技术表示法。直到我看过Ajax in Action这本书,我才把Ajax和系统的架构、设计模式,分布式对象的序列化和我之前的项目和经历联系在一切。

    我修改了一些Jesse的图,来说明我认为的基于Ajax的架构是什么样的。



    这也就是我上面说的“似Ajax”架构,首先它是一个Web应用;它的表现层用DHTML+CSS + HTC控件+ Javascript ,服务器端用.NET或任何的服务器端技术,中间以XML方式序列化和反序列化进行传递数据。

    简单的说,客户端需要将请求的数据封装成一个XML数据通过HTTP传递给服务器端,服务器端处理这个请求,并将结果也以XML的形式返回到客户端,客户端再处理这些请求,然后使用HTML+CSS进行展示。其实如果不是Web客户端(浏览器)的问题,这是最简单的架构,但关键问题在于上面我们说的Javascript端的对象封装成一个XML,以及到服务端解析XML变成服务器端对象,然后再将结果封装成XML,传回给客户端(Javascript),客户端也解析XML数据,然后变成Javascript 中的对象的这个序列化和反序列化的问题。另外一个问题就是表现层的展现问题,怎么展现,用什么控件?

    所以,一个Ajax架构的Web应用程序,必须解决下面的问题:
    1. 双向两路的序列化问题
    2. 表现层展现的问题
    3. 传输时客户端和服务器端的数据安全问题
    4. 性能问题
    5. 国际化支持

    最好玩的双向两路的序列化问题,最早接触的是JSON ,它的问题在于扩展性,数据类型的支持和性能,但是平台无关性比较好,什么浏览器都可以,因为它不需要用msxml2.DOMDocumen分析XML,本质上就是用字符串描述对象;之后多平台的应用的迁移经历中(比如CORBAR,J2EE的后台应用),开始接触到XML-RPC ICEHessian,Web Services等等。其中XML-RPC有Javascript 的支持库,Web Services也有Javascript的支持库,也就是你可以使用Javascript访问或者获得XML-RPC/Web Services的对象,但是如果你将其作为一个主要的通讯协议,那么就会遇到另外一些问题,比如性能、国际化的问题,又会困扰你,XML-RPC和Web Services的一个主要问题都是性能,因为他们传输的XML大小都太大了,但显然用这些实现一个Ajax的特性,那是完全没有问题了。

    比如,Atlas目前不也是使用一个Javascript库调用Web Services吗?,所以,你也可以这么做,同样你也可以用XML-RPC.NET 很快就可以实现一个Service,然后使用Scotandrew的XML-RPC javascript 库就可以在Javascript中发一个XML-RPC 消息请求这个服务,然后异步的获得这个结果,然后展现它。所以从技术的实现上讲,Ajax的特性非常容易实现,但从架构上来看。你需要思考更多的因素。当然直到最后,我们才发现,在项目中,最完美的方案是你自己写一个双向两路的序列化引擎供你的Javascript客户端使用。

    这就说到了第二个问题,界面表现的问题,这个问题也是一个大的问题。这个问题一直会永远存在,Ajax之前没有人会太注意这些,但今天不同了,我想未来还会有很大的一个飞跃, Yahoo! 不是最近也开源了他的Yahoo! Web UI库,Atlas 也表示要提供更多的前端UI控件。无论如何,这个问题是,你的团队或组织是否有一套经过项目或客户检验的前端Javascript的库。无论是自己用Javascript写的也好,是自己写的一套HTC的控件库也好,总之这些是Ajax 架构中非常重要的一环。

    Atlas 带来了另外一个思考问题,就是服务器端控件可能可以通过某种方式和Javascript的控件很好的集成在一起,以前我们用HTC解决了重用、性能、Behaviors、甚至模板功能。但是新的特性还是有比如数据的绑定、缓存和校验、甚至是数据编码和压缩、加密和解密,Javascript UI前端还是有许多可以做的,而且如何无缝的集成两者,这个有非常大的意义。

    接着安全、性能、国际化等等,架构中的问题需要你依次考虑和解决,如果这么看Ajax,我认为,目前的Ajax框架还有很长很长一段路要走,同样真正完美支持Ajax架构的还需要继续努力。这些也是我在这篇专栏文章中的观点。

    把这些合在一起,那么Ajax架构的开发包或框架,就应该是包含了上述几个问题(两路双向的序列化、Javascript UI 表现库、安全、国际化和性能等等)解决方案的一个平台实现。

    同样也许你会说,不就是Ajax吗? 我干嘛要搞这么复杂,一定要搞到架构这个层面。
    我认为,
    第一,从架构的层面看Ajax,然后再应用相关的技术,比你直接使用某个Ajax框架然后再理解Ajax,你会从这个过程中收获更多。
    第二,对于一个开发团队/组织来说,真正Ajax架构的产品,可以带来效益和具体的生产力。比如,我身边就有拥有这样的优势的团队,他们拥有一套统一的由Javascript+HTML+CSS+HTC的前端表现层,而后台的业务系统有两个平台,一个.NET平台和J2EE平台;同样我身边的也有这样的团队,他们拥有一套统一的由Javascript+DHTML+CSS+HTC+VML+ASP.NET的前端表现层,但他们的后台业务层分别来自.NET平台、J2EE平台和Unix平台,我不能说Ajax架构的应用似乎就是统一Web 表现层。因为从今天看到他们的明天,也许会是, 一个ASP.NET V2+Atlas 的统一表现层,一个统一CAB+Smart Client 的统一表现层,也可以是一个WPF 3D的统一表现层,也可以是一个Xgl 桌面的统一层。。。。
    第三,从这架构的层面上,你也能够非常容易理解SOA或ESB概念,和SOA相比,Ajax架构的区别在于,Ajax有足够的松散耦合,但它依然以应用的数据为中心,更多的是一个面向Messages的架构,而且对于流行的WS-*协议的支持非常有限。

    但是假如,今天你或你的团队已经有了一个Ajax 架构的应用,那么你是不是应该要小心选择现有的Ajax框架,因为这些Ajax的特性,相对于目前的架构来说,是多么小,但又可能会产生很大危害的一个因素。也许这样的团队并不多,也许也很多,但是只有我们从更高更深的层次来思考,那么我们就能做出正确的选择,并且从新的Ajax技术和研究中获得好处。



    结论
    当我们回到文章的起点,我希望这样能够说明的我观点,即Ajax-NET的框架或实现分为两类,一类是基于Ajax应用程序架构的,一类是基于Ajax特性的,目前几乎大部分的Ajax-NET的框架或实现都是基于Ajax特性,以Add-in 方式提供的代码或框架。

    Ajax-NET的实现/框架选取上的建议:
    • ASP.NET控件形式已经成为连接服务器和客户端Ajax通信的主要形式和选择。
    • 客户端调用服务器端页面中的方法是Ajax的重要手段,使得客户端可以更加灵活的获得服务器端的数据。
    • MagicAjax.NET,Anthem.NET用了"Hook ASP.NET"和Add-In的技术手段,使用上受到的影响比较多,这两个框架中,最简单的应用,第一选择MagicAjax.NET,但总是优先使用Anthem.NET
    • 如果是自己写的服务器端控件,那么应该先掌握Anthem.NET的技术,然后使自己的控件拥有Ajax的特性
    • MagicAjax.NET, Anthem.NET和wwHoverPanel 对于国际化的支持都有待加强
    • 在Atlas没有正式发布之前,在ASP.NET的应用中优先在自己的项目中使用类似wwHoverPanel的技术,即尽可能的使用客户端回调功能,在特别需要的地方使用其方法调用的功能,充分发挥Ajax的特性,而不要因为Ajax而特意选择某个Ajax的框架
    • Atlas的强项在于服务器端和客户端控件特性的集成、客户端的数据绑定、校验、内置的多个客户端Ajax 特性UI或组件,与ASP.NET的Profile, Membership ,Role 服务的集成,与Web Services和WCF 服务的集成,以及良好的国际化/开发工具支持的。因为它是一个完整的解决方案,所以最大的弱点是不能很容易地被老的Ajax架构的应用使用。另外该产品目前还在不断开发中,距离部署到生产环境中的要求还有差距。
    • 轻量级的双向序列化可以考虑JSON格式,安全问题可以在传递的对象中增加字段,然后在服务器端进行校验。
    • 对于原来已经有一套序列化框架的组织来说,其主要的目标是尽快将这个框架迁移/升级到ASP.NET V2,而不是优先考虑实现某个Ajax的特性
    • Ajax 要求有足够的力量关注前端的UI展现或开发,所以对Ajax实现/框架的选择,最先要考察其客户端的实现以及提供的Web UI
    看完这篇文章,我希望,2006年我们再谈起Ajax的时候,
    • 作为技术人员,我不用谈论什么Web 2.0,我一样可以清楚的表达Ajax的概念
    • 如果你是一个架构师,Ajax 不再是什么异步的XMLHTTP调用,不再是不刷新页面,它可以帮忙你Review应用程序的架构。
    • 对于你的团队或老板来说,Ajax可以是你统一界面表现层的一个策略,同样也可能让你有了一个创建一套部门或公司级能够重用的UI类库的机会。
    • 同样对于Javascript的开发人员来说,Ajax让你们还需要了解一些业务,并证明前台的Web开发人员一样很昂贵,后台开发也可以是技术含量不高的
    • 对于SOA的爱好者来说,Ajax架构让你能够站在面向消息的架构和系统上来看面向服务;一般我们说,对内你首先要有一套面向消息的架构,然后对外你就很容易延伸成一个面向服务面向Internet的分布式架构。
    • 最后,不要讨论Ajax的消亡,因为Ajax对于程序员来说,是一种力量均衡的策略,在Ajax中,Web前端的开发人员被重新重视,成为一支重要的力量。
    后记
    写这些文字的某几个段落,让我有些痛苦,因为我本来没想些这么多。所以你不要太在意我对各个框架的评价和描述,这些都是技术的层面的东西,其实我写这篇文字,主要是想突出Ajax的架构观,以及设计模式和Web应用架构重构的考虑,续而你也能够用类似横切面的角度,用Ajax来看你目前的应用和架构,从而更深的了解分布式对象的序列化、性能、安全以及Ajax 和ASP.NET服务器端控件的融合。最后欢迎大家斧正。

    注意-文章原创作品,版权所有,不得擅自转载或以其它方式的传播

    名词:
    SOA = Service-Oriented Architectures
    ESB = Enterprise Service Bus
    Ajax-NET = .NET平台下的Ajax实现或框架
    Ajax架构 = Ajax-Oriented Architectures
    HTC = HTML Components
    VML = Vector Markup Language
    DHTML = Dynamic HTML
    WPF = Windows Presentation Foundation
    WCF = Windows Communication Foundation
    Xgl = Xgl graphics subsystem(Novell )
    JSON =JavaScript Object Notation
    CAB = Composite UI Application Block
  • Let LinkCategoryList Popup New Window

    Open ...\Themes\Blogs\default\Skins\Skin-LinkCategoryList.ascx and add target to ListItemLink in ItemTemplaete.

    <ItemTemplate>
    <CS:ListItemLink id="Link" runat="server" target="_blank" />
    </ItemTemplate>

     

  • Add Blog Links Section to Default Theme

    Found a way to add links to the side bar.  Edit <site>\Themes\Blogs\Default\Skin\Skin-BlogSideBar.ascx  Add the following line where ever you would like to show a section for links.   Then add the following line and save things.

    <Blog:LinkCategoryList runat="Server" ApplicationType="Weblog" ID="Linkcategorylist1"/>

     

  • Infragistics NetAdvantage 2006 Vol 1 is out

    Infragistics NetAdvantage 2006 Vol 1 for Net Framework 1.1 and 2.0 are out.

    You need to set your windows to full English environment in Control Panel to install it.

    You can get "Trial" version from ...

     

  • AJAX Magazine: Ajax and .NET

    AJAX Magazine: Ajax and .NET

    http://ajax.phpmagazine.net/ajax_and_net/

    Everything about AJAX...

  • www.pinvoke.net

    PINVOKE.NET attempts to address the difficulty of calling Win32 or other unmanaged APIs in managed code (languages such as C# and VB .NET). Manually defining and using PInvoke signatures (also known as Declare statements in VB) is an error-prone process that can introduce extremely subtle bugs. The rules are complex, and if you make a mistake, you’ll probably corrupt memory.

    Therefore, this site is a repository where you can find, edit, and add PInvoke signatures, user-defined types, and any other information that helps us leverage each other's efforts. Think of this as the 21st century version of VB6's "API Text Viewer," a standalone application which used static files such as WIN32API.TXT as input. Did you spend hours figuring out how to successfully define & call a given unmanaged API in managed code? Share (and get credit for) your discovery here! Is there an error on this site? Go ahead and fix it!

    It's time to stop writing PInvoke signatures from scratch! Instead, copy and paste your way to productivity!

    And this site has more than just signatures & type definitions. For example:

    • Folks like you are sharing gotchas, tips, and samples specific to managed code. For example, check out why you shouldn't call CoInitializeSecurity from managed code.
    • Alternative managed APIs are suggested as a replacement for using PInvoke in the first place.
    • This site contains miscellaneous community resources that are helpful for being successful at unmanaged code interoperability. Feel free to add to these pages, too!

    PINVOKE.NET is a Wiki (created with FlexWiki), enabling users like you (yes, you) to freely and easily contribute to the repository. New to Wikis? Try the Playground to experiment with the editing process. Enjoy!

     

  • Comparison of AJAX frameworks

    Read it online or download attached file.

    Comparison of AJAX frameworks