Yl 的个人资料段公子和他的美丽娘子照片日志列表 工具 帮助

欢迎


web page traffic counter
次串门

Duan Yl

职业
第 1 张,共 4 张
9月25日

Temporary Post Used For Style Detection (f8be7cca-235c-4d7e-8857-5a68f3ed43e8)

This is a temporary post that was not deleted. Please delete this manually. (db1e8ee0-5049-45a3-ab05-751720fe46f4)

8月30日

嘟嘟

好久没有来这里写东西了,原因是---我要当爸爸喽!!

嘟嘟是她的小名,4个月了,母女一切正常(我们希望他是她)。既然娘子的肚肚都瞒不住,所以就不隐瞒大家,让你们跟我一起开心一下。都说女人有了宝宝体型会变丑,可我觉得俺娘子现在更漂亮,是真话(她们同事也说来着),可不是拍马屁。

真得很奇怪,在知道有宝宝之前,看到小孩子就会发自内心的喜欢,原来可不会这样。一次和同学聊天,他突然告诉我我有宝宝了,就是因为在聊天的时候,我竟然不自觉的反复问他家千金的事情,现在想起来,这个家伙竟然是第一个预言了我们家嘟嘟将要降临的人。

有了嘟嘟之后的感觉很奇妙,千万别问我是什么感觉,你经历一下就知道了;-) 明年是可爱的猪猪年,据我现在了解很多人都在蠢蠢欲动哟,抓紧时间呀,咱公司男宝宝多女宝宝少,等他们长大后,你们家的各位小公子就给我排好队,让我们家嘟嘟挑选,呵呵。

7月5日

Atlas强烈推荐的xml-script原理

背景:
Atlas最新的社区技术预览版发布了强悍的Client Kit Controls,其中允许用户使用一种号称XML描述来开发客户端逻辑,而且从例子上看也非常简单。大家有兴趣可以看看这个网站:
http://dflying.cnblogs.com/archive/2006/04/08/370331.html
也可以访问http://192.168.50.72/AtlasWebSite/ListViewDemo.aspx看看这个demo
 
<script type="text/xml-script">
    <page xmlns:script=" http://schemas.microsoft.com/xml-script/2005">
        <components>
            <dataSource id="listDataSource" autoLoad="true" serviceURL="MyService.asmx"/>
...

简单的通过XML配置就可以实现一个名为MyService的WebService调用(严格来说是微软的一个新的DataService,但原理就是WS)。我只看过text/javascript或者text/vbscript,这个xml-script是什么东西?网上一坨坨的都是介绍这个东西多好用,但是什么东西却不明不白。搞清楚它,就是Atlas的核心。也对我们的JS理解会大有帮助(事后感言)。让我们开始探索之旅:

XML-SCRIPT运行在哪里?
无非Client或Server。用Fiddler(强烈推荐,微软的一个人写的http调试工具,免费)看一下我上面的ListViewDemo的例子,前两个http请求是atlas被着用户搞得事情,做的事情很简单,把Atlas.js和本地语言特征下载到本地,这就是为什么开发Atlas时,一定要写ScriptManager标签的原因。sorry,有点跑题。跳过这两个包,第三个很有意思:

 
POST /AtlasWebSite/MyService.asmx?mn=GetData HTTP/1.1
{"parameters":{},"loadMethod":""}
返回:
new Sys.Data.DataTable([new Sys.Data.DataColumn("Name",String,null,false,false),new Sys.Data.DataColumn("Email",String,null,false,false)],[{"Name":"Dflying 0","Email":" Dflying0@dflying.net"},{"Name":"Dflying 1","Email":"Dflying1@dflying.net "},{"Name":"Dflying 2","Email":"Dflying2@dflying.net"},{"Name":"Dflying 3","Email":" Dflying3@dflying.net"},{"Name":"Dflying 4","Email":"Dflying4@dflying.net "}])
 
 

什么嘛,怎么就调用MyService这个WebService了!太Magic了吧。不过这说明一个问题,IE并没有把XML-Script发给Server去解释执行,而是在Client的某个见不得人的地方把他解释并执行了。

客户端的阴暗角落:
既然是在Client端执行的XML-Script,那还有两种情况,Brower支持,还是前面说的Atlas.js支持。开始我怀疑是前者,因为我的Opera不能运行这个例子。后来证明我开始猜错了,看来Opera对JS的支持还要提高亚。我就就告诉你吧,是JS做的事情。我是从Atlas的ReleaseNote的一句话看到的。但他到底怎么做到呢?

再次深入Atlas.js
既然Atlas.js要解析XML,那Atlas.js里面一定有Tag名称,这时我才发现恐怖的事情,Atlas所有的Control类都实现了一个GetDecription的函数,这个函数就做了一件事,就是往一个td(TypeDescriptor)里面加Tag名字和对应类型(又是NOP)。一定有哪里通过这些NOP来解析XML。搜索一把,在Sys.TypeDescriptor.getTypeDescriptor函数中调用了他,而这个函数调用的地方好多,总算被我找到了:!!!

Sys.MarkupParser

从名字上看,我知道有门了。这个函数的原理不用讲了,想也知道怎么做的,但这个函数是怎么被调用的,怎么就和Html里面的xml-script联系起来了。

豁然开朗:
MarkupParser是在Sys._Application的一个OnRuntimeLoad函数中调用的,一看就是一个EventHandle。它就是通过下列代码绑定消息的:

Sys.Runtime.load.add(onRuntimeLoad);
Sys.Runtime.unload.add(onRuntimeUnload);

这样,整个xml-script的解析和运行时架构就全部清楚了。

最后补充一句:
如果你认为有个一个Sys.Runtime.load/unload消息还不够,想知道这两个消息是怎么回事,下面看:

Sys.Runtime =new function() 
{
  window.attachEvent('onload',onWindowLoad);
  window.attachEvent ('onunload',onWindowUnload);
  this.initialize =function() {
    Sys.Runtime.load.invoke(Sys.Runtime,null);
  }
  function onWindowLoad() {
    Sys.Runtime.initialize();
  }
}

看到了吧,万恶之源就是DOM的window的onload消息和onunload消息,要再问我这是什么,hoho,我真没有招数了。

7月4日

Atlas的TextBox学习心得

前言:
Atlas提供了一套服务端和客户端控件,大大简化了IE开发的难度,尤其是AJAX。服务端控件比较简单,看看UpdatePane这系列就会比较明白,但Atlas的服务端有很多限制,另外,也不是Atlas最推荐的开发方法。Atlas刚刚发布的Client Controls一经面世,立刻引人注意。而他的基础,就是要明白Atlas的JavaScript Framework(Atlas.js,足足200多K,OMG!)
另外,深深的感觉到,我们这些在CPP的世界里混了太久,接触JS,Python等脚本语言都会很困难。
 
类的定义:
Sys.UI.TextBox =function(associatedElement)
{
  this.get_text =function(){return this.element.value;}
  ...此处省略了所有TextBox实现
}
Sys.UI.TextBox.registerClass('Sys.UI.TextBox',Sys.UI.InputControl);
在JS的世界里,定义类是不是很奇怪:
·首先:用"函数"定义类。其实在JS中,所有的东西都是"Name->Object对"(重要!!!今后我都简称NOP),这里就是Sys.UI.TextBox到一

个无名函数function(associatedElement)的映射。当你在html里面调用
var tbInput = new Web.UI.TextBox($('textBoxInput'));
其实就是调用了这个对应的无名函数而已。(当然不止于此,我理解还将Sys.UI.TextBox.prototype这个特殊对象传给了tbInput)。顺便说一下这个例子中的$其实是一个Atlas的函数,其实就是调用DOM的getElementByID。
·其次:怎么所有的实现都在这个无名函数(构造函数)里面?因为TextBox这个Object里面有哪些"NOP"是在运行时添加的。你没有看错,是运行时,也就是说,当你使用new调用构造函数时,在构造函数里面才通过this.get_text=function...给这个对象定义了一个名为"get_text"的属性(准确是NOP的N),他对应的O就是一个无名函数。这就是我弄了半天才转过来的弯,但是这个特性使得JS的运行时很简单,同时语言也具备了很大的灵活性。大家都非常喜欢JS的Eval函数,如果理解所有的都是NOP,小菜一碟。
·最后,TextBox是从InputControl继承下来的(InputControl能对输入内容进行有效性验证),在Atlas是通过调用registerClass实现的。
Function.prototype.registerClass =function(...)
{...
for (var i=0;i <baseType.length;i++){this.prototype._astrPendingInherits.push (baseType[i]);}
...}
Function是JS内建的类,刚才你已经看到了,TextBox这个名字其实对应的是一个Function,所以TextBox.prototype就是Function.prototype。他的实现本质也非常简单,就是把Sys.UI.InputControl的所有NOP全部复制到TextBox的prototype里面。想象不到吧,竟然这么实现继承。
·补充:有兴趣的兄弟强烈推荐看看prototype.js这个Framework的源码,简单且强大。他实现类的方法和Atlas采用完全不同的方法。前面已经看到了,Atlas是通过添加TextBox的NOP实现的,而Prototype是通过直接定义prototype这个特殊对象实现的,也就是说Atlas这种方法的好处是,编程时和传统语言较相似,而缺点就是内存和效率都很差。这里就不再深入了(其实我也深不了了,;P)。

消息和代理(Delegate):
Sys.UI.TextBox =function(associatedElement)
{
this.initialize =function(){
_changeHandler =Function.createDelegate(this,this._onChanged);
this.element.attachEvent('onchange',_changeHandler);
}
this._onChanged =function(){...}
}
·首先:Function.createDelegate其实就是返回一个函数指针(其实就是Function Object),这个函数的作用就是调用this._onChanged。
Function.createDelegate =function(instance,method){return function(){return method.apply (instance,arguments);}}
晕了没有?没有?你强。有?我来解释下。为什么不直接this.element.attachEvent('onchange',this._onChanged);原因是JS的Input控件在触发消息时,是不会传递this指针的。而createDelegate的作用就是创建了一个保存了this指针的函数。明白了么?
·其次:this.element是哪里来的?还记得构造函数唯一的参数associatedElement么?在调用基类的initialize函数时,基类(Sys.UI.Control)的构造函数中this.element =associatedElement;设置的这个NOP。
·最后:attachEvent是DOM函数,允许一个事件有多个处理函数。html中<input type="button" onclick="onBtnClick"/>,其实就是调用了element.attachEvent(onBtnClick);。

7月1日

对JavaScript有所顿悟

 
分析的非常透彻,为了弄明白这里说的"理解js的两种类实例方法",建议大家阅读一下prototype.js的代码。一来代码清晰,便于理解,二来非常成熟,网上文档较多。有兴趣阅读一下获益匪浅。
 
1. javascript试基于原型prototype的继承机制,通过构造函数和原型对象来模拟类。这一点在Atlas中当然不会发生改变。只不过他在暗地里全都处理了,处理得方法是:派生类拷贝了基类原型对象得所有方法到自己得原型对象中。这样当一个派生类继承于一个基类时,自动继承类通过原型对象实现得实例方法(当然派生类的原型对象中若存在同名方法,则不拷贝)。

2. Atlas通过registerBaseMethod来声明得虚方法仅仅时构造函数得内部方法(有一些文档中称为privilege方法,意思时能够访问构造函数得局部变量,Atlas正是通过这个来模拟私有变量的)。而Atlas中大量的get_ set_正是此类方法。

3.在javascript中实现一个类的实例方法有两种途径:1 把方法定义在原型对象中,这个在使用时自动通过访问原型链来访问实例的方法。这种方式的好处是节省内存,效率比较高(这里说的效率是实例化对象时的效率),因为多个实例的方法都存在一个原型对象中。2 定义为原型对象的内部方法(上面已经说过来),这种方式,在初试化实例对象时,实际上是给每个对象实例都定义了一个相应的方法。所以初试化实例对象时需要更多的内存和时间。但这种实现方式有他存在的必要性,那就是利用函数的closure特性来实现特有的需求,比如:生成事件委托,回调函数,实现局部变量等等。但如果对象实例很多时,存在很大的效率问题,所以把他称为privilege方法也时有道理的,那就是他的存在的理由就是为来利用closure。

微软在Atlas种大量使用privilege方式来实现实例方法,而有意无意的淡化来javascript固有的prototype的实现方法,从语法上来看更接近C#的语法,另外Atlas种存在大量的get_ set_ 类方法也只能通过这种方式来实现,我们也看到绝大多数类实例的方法,即使不是必须,也大多采用类这种实现方式,而不是prototype的方式。对于这种动向,本人时持有反对意见的。很明显的看出:Atlas有.net情结。想在javascript环境实现一个稳固严密的架构,但确牺牲了javascript原有的灵活性,并且牺牲了大量的内存和效率。

所以我们可以利用Atlas提供的一些扩展,比如对于String Array Function等的扩展,特别时命名控件,事件委托等等。但不必完全拘役于它或者完全模仿他。

请大家批评。
6月7日

认定.NET会有好的发展

p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;font-size:9.0pt;font-family:Calibri;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;text-indent:21.0pt;font-size:9.0pt;font-family:Calibri;} span.EmailStyle18 {font-family:Calibri;color:windowtext;} .MsoChpDefault {font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;}

最近用.NET写了不少Demo,涉及到RemotingSmartDevice,自定义属性,反射,TcpXXX,系统组件服务,MSMQ等,开发非常方便。尤其是MS发布的CSharp Express Edition让我的老掉牙的笔记本重新焕发了青春,开心呀,明明可以又小又好用的,可惜他不能开发XML SchemaSmartDevice,有点遗憾。

.NET Form上开发多线程程序,真是一个美好的体验,只需调用Invoke就好,甚至连System.Threading都不用using就可以轻松搞定。这样改善开发的体验,最大的好处就是随便写的小东东,界面的体验都能好很多。

本来想写一个xml工程,结果发现自己好久没有写shema,都忘了,离开了xmlspy这种工具,还真不知道怎么办。不过.NETxml的支持非常爽,用了xpathxml的查询,xml文件简直可以当成内存数据结构来用了。

 

附我周日半天的工作成果—QuickRunner的亮点:

l  按照配置,自动遍历指定目录中的所有可执行文件。并为他们创建快速启动记录。

l  可以制定目录搜索深度,提高搜索速度。

l  使用xml进行用户配置数据管理。

l  支持给某个应用程序起别名,如vb对应c:\program files\visual studio\...\vb.exe

l  支持定制应用程序的启动参数。如tc对应c:\program files\...\totalcmd.exe /f:ftplist.ini …

l  多线程搜索,使用没有延迟。

l  输入需要启动的名称时,支持自动完成。

l  系统托盘支持,平时不占用TaskBar

l  ………

有待改进:

l  操作系统级别的热键唤出QuickRunner

l  通过界面修改xml配置

l  自动提取exe的图标资源,方便用户确定是哪个程序

……

 

l   

5月6日

As Long As We Got Each Other

(成长的烦恼主题曲)

Show me that smile again
Oh, show me that smile
Don't waste another minute on your cryin'
We're nowhere near the end
We're nowhere near
The best is ready to begin

All in a cloudy daze
I look into your eyes and see them shining out
Holding you close this way
Holding you this way
Is like having summer everyday
Ooh, ooh

As long as we got each other
We got the world spinnin' right in our hands
Baby, you and me
We gotta be
The luckiest dreamers who never quit dreamin'

As long as we keep on givin'
We can take anything that comes our way
Baby, rain or shine
All the time
We got each other
Sharin' the laughter and love

Promise me here and now
Nothing but jokes
Will never come between us
You can depend on me
'Cause I need you like the air I breathe
Oh, oh

As long as we got each other
We got the world spinnin' right in our hands
Baby, you and me
We gotta be
The luckiest dreamers who never quit dreamin'
As long as we keep on givin'
We can take anything that comes our way
Baby, rain or shine
All the time
We got each other
Sharin' the laughter and love

As long as we got each other
We got the world spinnin' right in our hands
Baby, you and me
We gotta be
The luckiest dreamers who never quit dreamin'

As long as we keep on givin'
We can take anything that comes our way
Oh, baby, rain or shine
All the time
We got each other
Sharin' the laughter and love

每次看这部片子都能找到温馨的感觉,我喜欢这样的感觉。
4月25日

当我们再看到他们时候,请给他们一个真心的笑容

    农民工饮食问题,欠薪问题,这些比较尖锐的社会问题,媒体和政府的关注都不少了,为什么还不能得到有效解决?政府只凭几句口号和几次宣传,不可能治标治本,要想从根本上保护农民工的利益,必须在法律条款中明确规定相关条款,特别是农民工的最低福利状况和饮食、居住标准,如果有哪个包工头敢以身试法,就拿出来“严办”。
    说真的,有时我也感觉到法律力量太微薄了,中国的法律不少了,有法不依,无法钻漏洞的现象太多了。所以有时将希望完全放在法律上,似乎有些天真。中国有良心、有良知的人不少,当他们看到这些令人心痛的报道时,一定也想帮助这个社会弱势群体,但始终缺乏一个合理有效的途径。农民工不像残障人士或身患绝症的人,首先他们身体是健康,其次他们的数量是庞大的,不是几个人,十几个人的资助就能解决问题的。
    迄今为止,我都没想到什么特别好的办法来为农民工切实做点什么。不过,从报道中我看出很多农民工不愿意上街,因为受不了我们城里人“鄙夷轻蔑的目光”,我不知道我们中的很多人是不是这样做了,也许我们并没有觉得目光里含有什么轻视的意味,但也许不经意间我们的确用这样的目光伤害过他们。为了向给昔日给我提供粮食,而今为我们建设美丽家园的农民朋友表示我们心中的敬意,希望每个看过这个帖子的朋友,当你在街上看到农民朋友时,请给他们一个发自内心的真诚笑容,微笑代表友好,代表尊重,这也许是他们此刻最需要的!
 
段娘子