<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>面朝大海，春暖花开 --- diytz&#039;s blog</title>
	<atom:link href="http://www.diytz.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://www.diytz.cn</link>
	<description>关注互联网和Flex开发，关注dota，记录生活点滴，自娱自乐......</description>
	<lastBuildDate>Fri, 12 Mar 2010 13:55:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>哥换的不是工作，是寂寞</title>
		<link>http://www.diytz.cn/on_the_road/job-not-jimo.html</link>
		<comments>http://www.diytz.cn/on_the_road/job-not-jimo.html#comments</comments>
		<pubDate>Fri, 12 Mar 2010 13:42:54 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[在路上]]></category>
		<category><![CDATA[寂寞]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=224</guid>
		<description><![CDATA[春天来了，又到了万物交配的季节。从春节之前我就不停地思索，我是该离开呢，该离开呢，还是该离开呢。今天终于办完了所有的手续，下周一就可以去新公司报道了。
在北京爱可信的这一年中，我度过了我职业生涯最“美好”的一段时光。我住在离公司附近，去年三月份爸妈从老家过来陪我住，照顾我生活。每天九点半上班，晃悠两个小时回家吃饭。在家吃晚饭，还可以小憩一会儿，一点多回公司上班。下午的时光是最美好的，公司的活动室里有台球桌和乒乓球桌，我和身边的同事总是无视公司规定，偷偷地去活动室打台球。其实这种忙碌之余偷偷摸摸的欢愉往往是最值得回味和让人向往的，既满足了自己的纯粹的欲望，又体会到了这种偷偷摸摸的冒险的刺激。不过经常邀请我去打球的那位同事最近却怂了，今天我叫他去打球，他小声的跟我说，昨天又被Vivian（人事MM）抓住了，说再抓一次就要劝退了，对此我无语的同时，也十分佩服人事MM旺盛的经历。在爱可信的一年里，我的台球水平有了质的飞跃。离开这里，最怀念的也是给我们留下无数回忆的那张台球桌。
当然，工作也是要做的。我们一起打造了友密网这个潮流女性虚拟社区。尽管我从不觉得这是个有价值的网站，但是我依然恬不知耻的在这里骗吃骗喝了一年有余，并且看着公司里好多人做着我觉得没有意义但却不知道他们觉得有没有意义的事情。有时候为某些人不负责任的行为感到无奈，甚至愤怒，但往往很快就知趣的劝自己，大家都是混口饭吃嘛。我想我从这个项目唯一得到的东西就是大型互联网项目的失败经验。我看到了一堆没有凝聚力的行尸走肉从头到尾是如何把项目做成一堆狗屎的。而我自己，也从刚进入公司一个积极奋进认真负责的小二逼青年，退化成木讷的代码工具，整天被无知的产品人员虐。直到有一天，我不知道哪根神经被刺激到了。我开始蛋疼地思索自我价值的实现，开始考虑几年后自己的发展，开始问自己他妈的这样有劲么。问题都很尖锐，答案也都很悲剧。我的底线是，不管做什么，至少要让我觉得我做的事情是有意义，有价值的。可是在这个公司，我发现这条线早已被越过十万八千里。
找工作的过程也是一波三折，面了六七家，有被我拒的，有拒我的。最终选择了一个环境和待遇还算满意的国企。同事们都很不解，还以为我这么早就开始养老了。记得是发哥还是谁说过，其实我才刚上路。群硕、爱可信、中新影。谁知道下一站是哪里。
很多人对幸福做过总结，前些天看到和菜头（需翻墙）总结的还比较平实：照顾好自己的家人，从事自己喜欢的工作，并且还做的不错。然后他举了韩寒和柴静的例子。我改一改，降低一下标准：照顾好自己的家人，从事自己觉得有意义的工作，并且做的还不错。
]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-225" title="39924_200712160002041.thumb" src="http://www.diytz.cn/wp-content/uploads/2010/03/39924_200712160002041.thumb-300x300.jpg" alt="39924_200712160002041.thumb" width="300" height="300" /><strong>春</strong>天来了，又到了万物交配的季节。从春节之前我就不停地思索，我是该离开呢，该离开呢，还是该离开呢。今天终于办完了所有的手续，下周一就可以去新公司报道了。</p>
<p>在北京爱可信的这一年中，我度过了我职业生涯最“美好”的一段时光。我住在离公司附近，去年三月份爸妈从老家过来陪我住，照顾我生活。每天九点半上班，晃悠两个小时回家吃饭。在家吃晚饭，还可以小憩一会儿，一点多回公司上班。下午的时光是最美好的，公司的活动室里有台球桌和乒乓球桌，我和身边的同事总是无视公司规定，偷偷地去活动室打台球。其实这种忙碌之余偷偷摸摸的欢愉往往是最值得回味和让人向往的，既满足了自己的纯粹的欲望，又体会到了这种偷偷摸摸的冒险的刺激。不过经常邀请我去打球的那位同事最近却怂了，今天我叫他去打球，他小声的跟我说，昨天又被Vivian（人事MM）抓住了，说再抓一次就要劝退了，对此我无语的同时，也十分佩服人事MM旺盛的经历。在爱可信的一年里，我的台球水平有了质的飞跃。离开这里，最怀念的也是给我们留下无数回忆的那张台球桌。</p>
<p>当然，工作也是要做的。我们一起打造了<a href="http://www.uummii.cn">友密网</a>这个潮流女性虚拟社区。尽管我从不觉得这是个有价值的网站，但是我依然恬不知耻的在这里骗吃骗喝了一年有余，并且看着公司里好多人做着我觉得没有意义但却不知道他们觉得有没有意义的事情。有时候为某些人不负责任的行为感到无奈，甚至愤怒，但往往很快就知趣的劝自己，大家都是混口饭吃嘛。我想我从这个项目唯一得到的东西就是大型互联网项目的失败经验。我看到了一堆没有凝聚力的行尸走肉从头到尾是如何把项目做成一堆狗屎的。而我自己，也从刚进入公司一个积极奋进认真负责的小二逼青年，退化成木讷的代码工具，整天被无知的产品人员虐。直到有一天，我不知道哪根神经被刺激到了。我开始蛋疼地思索自我价值的实现，开始考虑几年后自己的发展，开始问自己他妈的这样有劲么。问题都很尖锐，答案也都很悲剧。我的底线是，不管做什么，至少要让我觉得我做的事情是有意义，有价值的。可是在这个公司，我发现这条线早已被越过十万八千里。</p>
<p>找工作的过程也是一波三折，面了六七家，有被我拒的，有拒我的。最终选择了一个环境和待遇还算满意的国企。同事们都很不解，还以为我这么早就开始养老了。记得是发哥还是谁说过，其实我才刚上路。群硕、爱可信、中新影。谁知道下一站是哪里。</p>
<p>很多人对幸福做过总结，前些天看到<a href="http://www.caobian.info">和菜头</a>（需翻墙）总结的还比较平实：照顾好自己的家人，从事自己喜欢的工作，并且还做的不错。然后他举了韩寒和柴静的例子。我改一改，降低一下标准：照顾好自己的家人，从事自己觉得有意义的工作，并且做的还不错。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/on_the_road/job-not-jimo.html/feed</wfw:commentRss>
		<slash:comments>81</slash:comments>
		</item>
		<item>
		<title>再谈AS3中的深度复制</title>
		<link>http://www.diytz.cn/flex_as3_research/as3-deep-clone-2.html</link>
		<comments>http://www.diytz.cn/flex_as3_research/as3-deep-clone-2.html#comments</comments>
		<pubDate>Fri, 05 Feb 2010 13:40:10 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[Flex&AS3研究]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[深克隆]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=218</guid>
		<description><![CDATA[在也谈AS3中的深度复制这篇文章中简单的记录了一些google的总结个人的看法，但终觉不够深入，不够全面。到底哪些类是可以通过序列化和反序列化的方法深复制，哪些类不可以，始终是困扰我的一个迷雾。我曾经试图从as3在内存中的对象模型（感兴趣请猛击这里）入手，来窥探AS3内部的秘密，但这似乎无法直接敲开那所AS3序列化规则的大门。
在上一篇文章中曾经提到，AS3序列化的结果是AMF格式。从这条线索入手，可能会找到些许答案。果然，Adobe在AMF的文档中详细的列出了所有可序列化的数据类型,包括：


undefined(囧)
null
false
true
int
double
String
XMLDocument
Date
Array
Object
XML
ByteArray

这里面比较纠结的是Object类型，按理说，所有的类型都继承自Object，为什么要单独拿出来呢。原来，Adobe从序列化的角度，把Object分为四类：Anonymous，Typed，Dynamic，Externalizable。这里面Anonymous指的是没有注册别名（alias）的类，这样的对象在反序列化的时候会被转化成Object类的实例；Typed指的是注册了别名的类，这样的对象在反序列化的时候必然可以被转化成对应的类型；Dynamic指的是AS3中的动态类，这样的类在序列化的时候除了要序列化trait里面描述的属性，还要序列化一些运行时动态加上去的属性；Externalizable指的是实现了flash.utils.IExternalizable的类，这样的类对于序列化和反序列化有着完全的控制。
在flash.utils.IExternalizable接口的描述中，明确指出，如果一个类自己没有实现这个接口，并且也不是继承自实现了这个接口的类，那么它的实例在序列化的时候将按照默认的机制来执行，也就是只去序列化public的成员，private，internal，protected的成员均不可用。
这样也很容易解释为什么ArrayCollection在序列化和反序列化的时候是那么的好用了，因为它自己实现了flash.utils.IExternalizable这个接口，同样实现这个接口的还有mx.Utils.ObjectProxy。
undefined-marker
=
0&#215;00
null-marker
=
0&#215;01
false-marker
=
0&#215;02
true-marker
=
0&#215;03
integer-marker
=
0&#215;04
double-marker
=
0&#215;05
string-marker
=
0&#215;06
xml-doc-marker
=
0&#215;07
date-marker
=
0&#215;08
array-marker
=
0&#215;09
object-marker
=
0&#215;0A
xml-marker
=
0&#215;0B
Page 5 of 13
Adobe Systems Incorporated AMF 3 Specification
byte-array-marker
=
0x
]]></description>
			<content:encoded><![CDATA[<p>在<img class="alignright size-medium wp-image-219" title="PD*914983" src="http://www.diytz.cn/wp-content/uploads/2010/02/2366470367_694c7d8c26_o-257x300.jpg" alt="PD*914983" width="257" height="300" /><a href="http://www.diytz.cn/flex_as3_research/as3_deep_clone.html">也谈AS3中的深度复制</a>这篇文章中简单的记录了一些google的总结个人的看法，但终觉不够深入，不够全面。到底哪些类是可以通过序列化和反序列化的方法深复制，哪些类不可以，始终是困扰我的一个迷雾。我曾经试图从as3在内存中的对象模型（感兴趣请猛击<a href="http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f3f.html">这里</a>）入手，来窥探AS3内部的秘密，但这似乎无法直接敲开那所AS3序列化规则的大门。</p>
<p>在上一篇文章中曾经提到，AS3序列化的结果是AMF格式。从这条线索入手，可能会找到些许答案。果然，Adobe在AMF的文档中详细的列出了所有可序列化的数据类型,包括：</p>
<p><span id="more-218"></span></p>
<ul>
<li>undefined(囧)</li>
<li>null</li>
<li>false</li>
<li>true</li>
<li>int</li>
<li>double</li>
<li>String</li>
<li>XMLDocument</li>
<li>Date</li>
<li>Array</li>
<li>Object</li>
<li>XML</li>
<li>ByteArray</li>
</ul>
<p>这里面比较纠结的是Object类型，按理说，所有的类型都继承自Object，为什么要单独拿出来呢。原来，Adobe从序列化的角度，把Object分为四类：Anonymous，Typed，Dynamic，Externalizable。这里面Anonymous指的是没有注册别名（alias）的类，这样的对象在反序列化的时候会被转化成Object类的实例；Typed指的是注册了别名的类，这样的对象在反序列化的时候必然可以被转化成对应的类型；Dynamic指的是AS3中的动态类，这样的类在序列化的时候除了要序列化trait里面描述的属性，还要序列化一些运行时动态加上去的属性；Externalizable指的是实现了flash.utils.IExternalizable的类，这样的类对于序列化和反序列化有着完全的控制。</p>
<p>在flash.utils.IExternalizable接口的描述中，明确指出，如果一个类自己没有实现这个接口，并且也不是继承自实现了这个接口的类，那么它的实例在序列化的时候将按照默认的机制来执行，也就是只去序列化public的成员，private，internal，protected的成员均不可用。</p>
<p>这样也很容易解释为什么ArrayCollection在序列化和反序列化的时候是那么的好用了，因为它自己实现了flash.utils.IExternalizable这个接口，同样实现这个接口的还有mx.Utils.ObjectProxy。</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">undefined-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;00</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">null-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;01</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">false-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;02</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">true-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;03</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">integer-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;04</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">double-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;05</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">string-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;06</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">xml-doc-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;07</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">date-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;08</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">array-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;09</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">object-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;0A</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">xml-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0&#215;0B</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Page 5 of 13</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Adobe Systems Incorporated AMF 3 Specification</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">byte-array-marker</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">0x</div>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/flex_as3_research/as3-deep-clone-2.html/feed</wfw:commentRss>
		<slash:comments>291</slash:comments>
		</item>
		<item>
		<title>怡帆加油！</title>
		<link>http://www.diytz.cn/on_the_road/help-yifan.html</link>
		<comments>http://www.diytz.cn/on_the_road/help-yifan.html#comments</comments>
		<pubDate>Thu, 14 Jan 2010 13:09:42 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[在路上]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=214</guid>
		<description><![CDATA[每当我和周围的人谈论起街边要饭的人的时候，大多数人态度总是觉得他们都是职业要饭的，或者小孩子都是被大人利用的。开始的时候，看到要饭的我偶尔会施舍一点。随着对大家的看法的逐渐认同，久而久之，看到要饭的我总是看都不看，直接走过。因为我有了一个冠冕堂皇的理由，来对自己进行道德上的安慰，那就是他们都是职业要饭的，他们比我有钱。而他们是不是真的是我想的那样，有多少是，有多少不是，我则发扬了蒋介石“宁可错杀一千，绝不放过一个”的革命精神，统统的否定掉。
来到北京后，在地铁里面总会遇到要饭的，不过形式比较高级，往往是两个人一起，其中一个是四肢健全的，一个是残疾的，往往还有不同程度的烧伤。他们唱着歌，在车厢里走过，向每个人点头哈腰，希望能给些施舍。遇到这种情况，我总会多少给些。一方面是觉得那个残疾人确实可怜；一方面觉得人家毕竟都爬到你跟前，冲你点头微笑了，也值这点钱了。生命对那些残疾人已经很不公平了，就算是被他们骗点小钱，那有何妨？
QQ群里经常会发来某某人患了绝症没钱治病寻求社会捐款的消息，并且希望看到这个消息的人转发到其他的群。对于这样的消息，我一般会直接忽略掉。或许是那颗生命离我实在是太遥远，我连一点想象的空间都没有；或许是我已经麻木了，毕竟这样的消息太多了，发来发去，恐怕没有几个人会当真，除了增加网络通信量，没有什么用处。可是当今天我打开Google Reader，打开和菜头的树洞专栏那篇网友来信中的链接，当我看到小怡帆的照片时，我一切的疑虑，迟疑烟消统统云散。立马按照上面的捐款方式，尽了一份微薄之力，并且决定利用自己的小小的影响力，传播小怡帆的故事，让更多的人加入帮助怡帆的行列中来。不管你贫穷富裕，请加入到帮助怡帆的行列中来。一万个人每人捐一元的意义，要远大于一个人捐一万的意义，因为前者意味着爱心在传播，意味更多的爱心会奉献。
那是一张多么可爱的面孔，她这么大的孩子是最天真无邪最讨人喜欢的时候，而小怡帆却要天天带着呼吸机，承受病魔无情的折磨。我是个喜欢孩子的人，在外面看到别人家可爱的孩子总是忍不住捏上一把。看到小怡帆，我只觉得天空是灰色的，我只觉得上帝是不存在的，佛也是不存在的，如果存在，这么美丽的一颗小生命，凭什么让她遭受如此的苦难？！期待奇迹的发生，怡帆加油！
关于怡帆的介绍，请猛击这里。里面有各大媒体的报道和详细的捐款方式，以及怡帆父母的联系方式。
]]></description>
			<content:encoded><![CDATA[<p>每<img class="alignright size-full wp-image-215" title="小怡帆" src="http://www.diytz.cn/wp-content/uploads/2010/01/a.jpg" alt="小怡帆" width="389" height="389" />当我和周围的人谈论起街边要饭的人的时候，大多数人态度总是觉得他们都是职业要饭的，或者小孩子都是被大人利用的。开始的时候，看到要饭的我偶尔会施舍一点。随着对大家的看法的逐渐认同，久而久之，看到要饭的我总是看都不看，直接走过。因为我有了一个冠冕堂皇的理由，来对自己进行道德上的安慰，那就是<strong>他们都是职业要饭的，他们比我有钱</strong>。而他们是不是真的是我想的那样，有多少是，有多少不是，我则发扬了蒋介石“宁可错杀一千，绝不放过一个”的革命精神，统统的否定掉。</p>
<p>来到北京后，在地铁里面总会遇到要饭的，不过形式比较高级，往往是两个人一起，其中一个是四肢健全的，一个是残疾的，往往还有不同程度的烧伤。他们唱着歌，在车厢里走过，向每个人点头哈腰，希望能给些施舍。遇到这种情况，我总会多少给些。一方面是觉得那个残疾人确实可怜；一方面觉得人家毕竟都爬到你跟前，冲你点头微笑了，也值这点钱了。生命对那些残疾人已经很不公平了，就算是被他们骗点小钱，那有何妨？</p>
<p>QQ群里经常会发来某某人患了绝症没钱治病寻求社会捐款的消息，并且希望看到这个消息的人转发到其他的群。对于这样的消息，我一般会直接忽略掉。或许是那颗生命离我实在是太遥远，我连一点想象的空间都没有；或许是我已经麻木了，毕竟这样的消息太多了，发来发去，恐怕没有几个人会当真，除了增加网络通信量，没有什么用处。可是当今天我打开Google Reader，打开和菜头的树洞专栏那篇网友来信中的<a href="http://help-yifan.org/index.html">链接</a>，当我看到小怡帆的照片时，我一切的疑虑，迟疑烟消统统云散。立马按照上面的捐款方式，尽了一份微薄之力，并且决定利用自己的小小的影响力，传播小怡帆的故事，让更多的人加入帮助怡帆的行列中来。不管你贫穷富裕，请加入到帮助怡帆的行列中来。一万个人每人捐一元的意义，要远大于一个人捐一万的意义，因为前者意味着爱心在传播，意味更多的爱心会奉献。</p>
<p>那是一张多么可爱的面孔，她这么大的孩子是最天真无邪最讨人喜欢的时候，而小怡帆却要天天带着呼吸机，承受病魔无情的折磨。我是个喜欢孩子的人，在外面看到别人家可爱的孩子总是忍不住捏上一把。看到小怡帆，我只觉得天空是灰色的，我只觉得上帝是不存在的，佛也是不存在的，如果存在，<strong>这么美丽的一颗小生命，凭什么让她遭受如此的苦难？！</strong>期待奇迹的发生，怡帆加油！</p>
<p>关于怡帆的介绍，请猛击<a href="http://help-yifan.org/index.html">这里</a>。里面有各大媒体的报道和详细的捐款方式，以及怡帆父母的联系方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/on_the_road/help-yifan.html/feed</wfw:commentRss>
		<slash:comments>69</slash:comments>
		</item>
		<item>
		<title>【转】BBS十大定律</title>
		<link>http://www.diytz.cn/blabla_internet/bbs_top10_rules.html</link>
		<comments>http://www.diytz.cn/blabla_internet/bbs_top10_rules.html#comments</comments>
		<pubDate>Sun, 03 Jan 2010 11:57:45 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[大话互联网]]></category>
		<category><![CDATA[bbs]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=211</guid>
		<description><![CDATA[
第一定律：回复最多的帖子，是拥有马甲最多的人写的。
第二定律：帖子的价值和回复的人数成反比；与感叹号的多少成反比。
第三定律：网名的香艳煽情程度和该人的丑陋程度成正比 。
第四定律：在BBS上好不容易成名了，可又厌倦了。
第五定律：你拍过某人的一次板砖，以后就再也不会忘记他了。
第六定律：有人爱现实所以爱网络，有人因为恨现实才爱网络。
第七定律：争论中没有获胜的，与女性争论，没有不惨败的。
第八定律：拍你砖的人比捧你场的人更理解你的帖子。
第九定律：高手对垒，一开始比的是才气和知识，最终分高下的是人格因素。
第十定律：签名档越复杂，头脑越简单。

转自：http://www.kenengba.com/post/2197.html
]]></description>
			<content:encoded><![CDATA[<ol>
<li>第一定律：回复最多的帖子，是拥有马甲最多的人写的。</li>
<li>第二定律：帖子的价值和回复的人数成反比；与感叹号的多少成反比。</li>
<li>第三定律：网名的香艳煽情程度和该人的丑陋程度成正比 。</li>
<li>第四定律：在BBS上好不容易成名了，可又厌倦了。</li>
<li>第五定律：你拍过某人的一次板砖，以后就再也不会忘记他了。</li>
<li>第六定律：有人爱现实所以爱网络，有人因为恨现实才爱网络。</li>
<li>第七定律：争论中没有获胜的，与女性争论，没有不惨败的。</li>
<li>第八定律：拍你砖的人比捧你场的人更理解你的帖子。</li>
<li>第九定律：高手对垒，一开始比的是才气和知识，最终分高下的是人格因素。</li>
<li>第十定律：签名档越复杂，头脑越简单。</li>
</ol>
<p style="padding-left: 30px;">转自：http://www.kenengba.com/post/2197.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/blabla_internet/bbs_top10_rules.html/feed</wfw:commentRss>
		<slash:comments>32325</slash:comments>
		</item>
		<item>
		<title>也谈Flash Player中的安全沙箱</title>
		<link>http://www.diytz.cn/flex_as3_research/flash-security-sandbox-type.html</link>
		<comments>http://www.diytz.cn/flex_as3_research/flash-security-sandbox-type.html#comments</comments>
		<pubDate>Sun, 20 Dec 2009 04:26:08 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[Flex&AS3研究]]></category>
		<category><![CDATA[flash player]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=204</guid>
		<description><![CDATA[安全沙箱问题说白了是个访问资源的权限问题。只不过规则比较复杂，而且需要先理解好多概念。Adobe（或者以前的Macromedia）之所以弄这么复杂的规则，一个很重要的原因就是Flash Player客户端的安全问题。试想如果一个从网络加载的.swf既能访问网络，又能访问本地文件，就相当于在客户端安装了一个木马，还有谁会安装Flash Player。一个.swf能否成功访问某个资源，取决于很多因素，包括：

访问的资源的类型，或者说访问方式。
.Swf文件的安全沙箱类型。
访问的资源所处的位置。
资源的所有者或者创建者对资源赋予的访问权限（crossDomain文件，Security.allowDomain()方法）。
用户对.swf文件赋予的权限（主要是对麦克风和摄像头的访问）。
Flash Player运行.swf文件的模式。

这里主要讨论了前四个因素。首先要理解一些关键概念，包括什么是安全沙箱，资源的类型，资源的所有者，资源的创建者。理解完这些概念，也就自然会对安全沙箱有一个清晰的认识了。
安全沙箱
安全沙箱是个容易让人迷糊的概念。我第一次看到这个词，觉得是个它容器，在里面的就是安全的。其实，大多数情况下我们提到这个词，往往指的是一个.swf文件的安全沙箱类型（Security-Sandbox-Type）。说白了就是.swf文件的一个属性。就像一个Canvas对象的width属性。一般来说，.swf文件的安全沙箱类型可能是以下几种：


远程网络域（remote）。通过网络协议加载的swf都属于远程网络域。
本地文件域 （local-with-filesystem）。通过文件系统访问，并且编译时-use-network=false。
本地网络域（local-with-networking）。通过文件系统访问，并且编译时-use-network=true。这个是默认选项。
本地受信任域（local-trusted）。这个就比较麻烦了，需要在Flash Palyer的一个叫做FlashPlayerTrust的文件夹中的某个.cfg文件中配置路径，那么在这个个路径下的.swf文件就算是在本地受信任域中了。该文件夹在2000和XP系统的路径是：%userprofile%\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust在Windows7系统的路径是%userprofile%\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust比方说你想让C盘下所有的.swf文件都属于本地受信任域，那么就在%userprofile%\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust下面新建一个文件，比方说叫myTrust.txt,在里面写入“c:\”，然后将文件名改为myTrust.cfg就可以了。用Flex Buider开发的程序默认都属于本地受信任域（在本地运行），原理就是Flex Buider会在上面提到的文件夹中添加一个flexbuilder.cfg文件，里面的内容就是项目的big-debug文件夹和big-release文件夹。我曾经遇到过这样的情况，用as调用外部的javascript，在用Flex Buider调试时是可以的，但是把release出来的文件拷贝到本地硬盘的另外一个地方，就报安全沙箱的错误。原因就是我运行的位置不属于受信任区域，通过添加一个配置文件就可以解决了。

资源的类型（或者说访问方式的类型）

加载视听内容。比方说显示图片或者播放音频或视频文件。注意，只是用来显示或播放。如果访问loader的content方法，就是另外一回事了。用下面几个方法加载资源，都属于加载视听内容：





加载视听内容的方法


类型


flash   player9支持的文件类型




flash.display.Loader.load()


Image,Adobe   Flash


jpeg,gif,png,swf




flash.media.Sound.load()


Audio


mp3




flash.net.NetSteam.play()


Progressive   Video


flv





将视听内容作为数据访问。上面的几个方法，如果加载完成后访问了loader的content属性，就不仅仅是加载视听内容了，而是加载视听内容并且将视听内容作为数据访问。因为访问了loader的content属性就相当于访问了被加载文件的二进制流。下面几种情况都属于将视听内容作为数据访问：





操作


描述




通过loader的实例属性content访问图像


相当于解析出一个被加载图片的Bitmap对象




调用BitmapData的draw()方法


拷贝一个BitmapData对象




调用SoundMixer的computeSpectrum方法


将音频文件的数据拷贝到一个ByteArray对象中




访问Sound对象的id3属性


读取一个音频的id3元数据





脚本互访。通过编程的方式访问一个被加载的.swf文件都属于脚本互访。包括：





使用loader对象的content属性




访问被加载.swf文件的属性和方法




使用bitmapData对象的draw()方法来将一个被加载swf文件的像素拷贝到一个BitmapData对象中。





加载数据。加载数据和加载视听内容的区别在于：加载视听内容只是用来显示或播放，并不会通过编程的方式获得其在内存中的二进制；而加载数据是获得其二进制流。下面两种方法都属于加载数据：通过URLLoader来加载文本、二进制数据；通过URLStream加载数据。
连接到socket。
向外部的URL发送数据。
访问用户的摄像头和麦克风。
访问本地的shared Object。
上传或下载文件。

资源的所有者
即拥有该资源的一方。比方说http://www.example.com/a.png这张图片，他的发布者就是example.com该站点的管理员。而所有者允许就是指网站管理员在网站根目录下放置一个crossDomain文件，里面包括对允许那些站点访问该网站资源的配置。crossDomain文件的格式一般如下：
&#60;?xml version=&#8221;1.0&#8243;?&#62;
&#60;!DOCTYPE cross-domain-policy
SYSTEM &#8220;http://www.adobe.com/xml/dtds/cross-domain-policy.dtd&#8221;&#62;
&#60;cross-domain-policy&#62;
&#60;allow-access-from domain=&#8221;www.example1.com&#8221;/&#62;
&#60;/cross-domain-policy&#62;
资源的创建者
一般指swf类的资源，该swf的创建者是指该swf文件的作者，或者说在编译前有能力改变其源代码的人。创建者允许是指在代码内通过设置Security.allowDomain(&#8221;site-b.com&#8221;)来允许某个站点的swf的脚本互访。
常见的一些安全沙箱的限制

远程网络域的安全沙箱：





操作


本地域


与主SWF同域


与主SWF异域




加载视听内容


禁止


允许


允许




将视听内容作为数据访问


禁止


允许


所有者允许的情况下允许




脚本互访


禁止


允许


创建者允许的情况下允许




加载数据


禁止


允许


所有者允许的情况下允许





本地网络域安全沙箱





操作


本地非swf资源


本地文件系统域下的swf


本地网络系统域下的swf


本地受信任域下的swf


远程网络域




加载视听内容


允许


禁止


允许


允许


允许




将视听内容作为数据访问


禁止


不适用


不适用


不适用


所有者允许的情况下允许




脚本互访


不适用


禁止


允许


创建者允许的情况下允许


创建者允许的情况下允许




加载数据


禁止


不适用


不适用


不适用


所有者允许的情况下允许





 本地文件域的安全沙箱





操作


本地非swf资源


本地文件系统域下的swf


本地网络系统域下的swf


本地受信任域下的swf


远程网络域




加载视听内容


允许


允许


禁止


允许


允许




将视听内容作为数据访问


允许


不适用


不适用


不适用


禁止




脚本互访


不适用


允许


禁止


创建者允许的情况下允许


禁止




加载数据


允许


不适用


不适用


不适用


禁止





本地受信任域的安全沙箱





操作


本地非swf资源


本地文件系统域下的swf


本地网络系统域下的swf


本地受信任域下的swf


远程网络域




加载视听内容


允许


允许


允许


允许


允许




将视听内容作为数据访问


允许


不适用


不适用


不适用


允许




脚本互访


不适用


允许


允许


允许


允许




加载数据


允许


不适用


不适用


不适用


允许




总结
从上面的表格可以看出，加载视听内容的限制是最宽松的，大多数情况下是允许的。脚本互访是的限制是最严格的，只有在所有者允许的情况下才可以。将视听内容作为数据访问和加载数据的限制实际上是同的，本质上它们也是相同的操作，都是访问数据。当我们遇到一个安全沙箱问题时，不妨先想一想swf文件的安全沙箱类型和访问资源类型，再参照下上面的表格，也许就会清楚一些了。还有很多操作这里并没有总结其限制方式，如连接到socket，调用外部的javascript等。这些内容在Adobe的官方文档中都有相应的介绍，具体可参见Adobe’s Security Topic Center，Adobe’s Flash Player Help，还有http://www.adobe.com/devnet/flashplayer/articles/flash_player_9_security.pdf。
]]></description>
			<content:encoded><![CDATA[<p align="left"><strong><img class="alignright size-full wp-image-205" title="tn_sandbox_725290816" src="http://www.diytz.cn/wp-content/uploads/2009/12/tn_sandbox_725290816.jpg" alt="tn_sandbox_725290816" width="200" height="200" />安</strong>全沙箱问题说白了是个访问资源的权限问题。只不过规则比较复杂，而且需要先理解好多概念。Adobe（或者以前的Macromedia）之所以弄这么复杂的规则，一个很重要的原因就是Flash Player客户端的安全问题。试想如果一个从网络加载的.swf既能访问网络，又能访问本地文件，就相当于在客户端安装了一个木马，还有谁会安装Flash Player。一个.swf能否成功访问某个资源，取决于很多因素，包括：</p>
<ol>
<li>访问的资源的类型，或者说访问方式。</li>
<li>.Swf文件的安全沙箱类型。</li>
<li>访问的资源所处的位置。</li>
<li>资源的所有者或者创建者对资源赋予的访问权限（crossDomain文件，Security.allowDomain()方法）。</li>
<li>用户对.swf文件赋予的权限（主要是对麦克风和摄像头的访问）。</li>
<li>Flash Player运行.swf文件的模式。</li>
</ol>
<p align="left">这里主要讨论了前四个因素。首先要理解一些关键概念，包括什么是安全沙箱，资源的类型，资源的所有者，资源的创建者。理解完这些概念，也就自然会对安全沙箱有一个清晰的认识了。</p>
<h4>安全沙箱</h4>
<p>安全沙箱是个容易让人迷糊的概念。我第一次看到这个词，觉得是个它容器，在里面的就是安全的。其实，大多数情况下我们提到这个词，往往指的是一个.swf文件的安全沙箱类型（Security-Sandbox-Type）。说白了就是.swf文件的一个属性。就像一个Canvas对象的width属性。一般来说，.swf文件的安全沙箱类型可能是以下几种：</p>
<p><span id="more-204"></span></p>
<ul>
<li>远程网络域（remote）。通过网络协议加载的swf都属于远程网络域。</li>
<li>本地文件域 （local-with-filesystem）。通过文件系统访问，并且编译时-use-network=false。</li>
<li>本地网络域（local-with-networking）。通过文件系统访问，并且编译时-use-network=true。这个是默认选项。</li>
<li>本地受信任域（local-trusted）。这个就比较麻烦了，需要在Flash Palyer的一个叫做FlashPlayerTrust的文件夹中的某个.cfg文件中配置路径，那么在这个个路径下的.swf文件就算是在本地受信任域中了。该文件夹在2000和XP系统的路径是：%userprofile%\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust在Windows7系统的路径是%userprofile%\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust比方说你想让C盘下所有的.swf文件都属于本地受信任域，那么就在%userprofile%\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust下面新建一个文件，比方说叫myTrust.txt,在里面写入“c:\”，然后将文件名改为myTrust.cfg就可以了。用Flex Buider开发的程序默认都属于本地受信任域（在本地运行），原理就是Flex Buider会在上面提到的文件夹中添加一个flexbuilder.cfg文件，里面的内容就是项目的big-debug文件夹和big-release文件夹。我曾经遇到过这样的情况，用as调用外部的javascript，在用Flex Buider调试时是可以的，但是把release出来的文件拷贝到本地硬盘的另外一个地方，就报安全沙箱的错误。原因就是我运行的位置不属于受信任区域，通过添加一个配置文件就可以解决了。</li>
</ul>
<h4>资源的类型（或者说访问方式的类型）</h4>
<ul>
<li>加载视听内容。比方说显示图片或者播放音频或视频文件。注意，只是用来显示或播放。如果访问loader的content方法，就是另外一回事了。用下面几个方法加载资源，都属于加载视听内容：</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="189" valign="top">
<p align="left">加载视听内容的方法</p>
</td>
<td width="189" valign="top">
<p align="left">类型</p>
</td>
<td width="189" valign="top">
<p align="left">flash   player9支持的文件类型</p>
</td>
</tr>
<tr>
<td width="189" valign="top">
<p align="left">flash.display.Loader.load()</p>
</td>
<td width="189" valign="top">
<p align="left">Image,Adobe   Flash</p>
</td>
<td width="189" valign="top">
<p align="left">jpeg,gif,png,swf</p>
</td>
</tr>
<tr>
<td width="189" valign="top">
<p align="left">flash.media.Sound.load()</p>
</td>
<td width="189" valign="top">
<p align="left">Audio</p>
</td>
<td width="189" valign="top">
<p align="left">mp3</p>
</td>
</tr>
<tr>
<td width="189" valign="top">
<p align="left">flash.net.NetSteam.play()</p>
</td>
<td width="189" valign="top">
<p align="left">Progressive   Video</p>
</td>
<td width="189" valign="top">
<p align="left">flv</p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>将视听内容作为数据访问。上面的几个方法，如果加载完成后访问了loader的content属性，就不仅仅是加载视听内容了，而是加载视听内容并且将视听内容作为数据访问。因为访问了loader的content属性就相当于访问了被加载文件的二进制流。下面几种情况都属于将视听内容作为数据访问：</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="284" valign="top">
<p align="left">操作</p>
</td>
<td width="284" valign="top">
<p align="left">描述</p>
</td>
</tr>
<tr>
<td width="284" valign="top">
<p align="left">通过loader的实例属性content访问图像</p>
</td>
<td width="284" valign="top">
<p align="left">相当于解析出一个被加载图片的Bitmap对象</p>
</td>
</tr>
<tr>
<td width="284" valign="top">
<p align="left">调用BitmapData的draw()方法</p>
</td>
<td width="284" valign="top">
<p align="left">拷贝一个BitmapData对象</p>
</td>
</tr>
<tr>
<td width="284" valign="top">
<p align="left">调用SoundMixer的computeSpectrum方法</p>
</td>
<td width="284" valign="top">
<p align="left">将音频文件的数据拷贝到一个ByteArray对象中</p>
</td>
</tr>
<tr>
<td width="284" valign="top">
<p align="left">访问Sound对象的id3属性</p>
</td>
<td width="284" valign="top">
<p align="left">读取一个音频的id3元数据</p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>脚本互访。通过编程的方式访问一个被加载的.swf文件都属于脚本互访。包括：</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p align="left">使用loader对象的content属性</p>
</td>
</tr>
<tr>
<td width="568" valign="top">
<p align="left">访问被加载.swf文件的属性和方法</p>
</td>
</tr>
<tr>
<td width="568" valign="top">
<p align="left">使用bitmapData对象的draw()方法来将一个被加载swf文件的像素拷贝到一个BitmapData对象中。</p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>加载数据。加载数据和加载视听内容的区别在于：加载视听内容只是用来显示或播放，并不会通过编程的方式获得其在内存中的二进制；而加载数据是获得其二进制流。下面两种方法都属于加载数据：通过URLLoader来加载文本、二进制数据；通过URLStream加载数据。</li>
<li>连接到socket。</li>
<li>向外部的URL发送数据。</li>
<li>访问用户的摄像头和麦克风。</li>
<li>访问本地的shared Object。</li>
<li>上传或下载文件。</li>
</ul>
<h4>资源的所有者</h4>
<p align="left">即拥有该资源的一方。比方说<a href="http://www.example.com/a.png">http://www.example.com/a.png</a>这张图片，他的发布者就是example.com该站点的管理员。而所有者允许就是指网站管理员在网站根目录下放置一个crossDomain文件，里面包括对允许那些站点访问该网站资源的配置。crossDomain文件的格式一般如下：</p>
<p align="left">&lt;?xml version=&#8221;1.0&#8243;?&gt;</p>
<p align="left">&lt;!DOCTYPE cross-domain-policy</p>
<p align="left">SYSTEM &#8220;http://www.adobe.com/xml/dtds/cross-domain-policy.dtd&#8221;&gt;</p>
<p align="left">&lt;cross-domain-policy&gt;</p>
<p align="left">&lt;allow-access-from domain=&#8221;www.example1.com&#8221;/&gt;</p>
<p align="left">&lt;/cross-domain-policy&gt;</p>
<h4>资源的创建者</h4>
<p align="left">一般指swf类的资源，该swf的创建者是指该swf文件的作者，或者说在编译前有能力改变其源代码的人。创建者允许是指在代码内通过设置Security.allowDomain(&#8221;site-b.com&#8221;)来允许某个站点的swf的脚本互访。</p>
<h4>常见的一些安全沙箱的限制</h4>
<ul>
<li>远程网络域的安全沙箱：</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="142" valign="top">
<p align="left">操作</p>
</td>
<td width="142" valign="top">
<p align="left">本地域</p>
</td>
<td width="142" valign="top">
<p align="left">与主SWF同域</p>
</td>
<td width="142" valign="top">
<p align="left">与主SWF异域</p>
</td>
</tr>
<tr>
<td width="142" valign="top">
<p align="left">加载视听内容</p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="142" valign="top">
<p align="left">将视听内容作为数据访问</p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="142" valign="top">
<p align="left">所有者允许的情况下允许</p>
</td>
</tr>
<tr>
<td width="142" valign="top">
<p align="left">脚本互访</p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="142" valign="top">
<p align="left">创建者允许的情况下允许</p>
</td>
</tr>
<tr>
<td width="142" valign="top">
<p align="left">加载数据</p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="142" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="142" valign="top">
<p align="left">所有者允许的情况下允许</p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>本地网络域安全沙箱</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="90" valign="top">
<p align="left">操作</p>
</td>
<td width="91" valign="top">
<p align="left">本地非swf资源</p>
</td>
<td width="91" valign="top">
<p align="left">本地文件系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地网络系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地受信任域下的swf</p>
</td>
<td width="90" valign="top">
<p align="left">远程网络域</p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载视听内容</p>
</td>
<td width="91" valign="top">
<p align="left">允许</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">将视听内容作为数据访问</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left">所有者允许的情况下允许</p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">脚本互访</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left">允许</p>
</td>
<td width="91" valign="top">
<p align="left">创建者允许的情况下允许</p>
</td>
<td width="90" valign="top">
<p align="left">创建者允许的情况下允许</p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载数据</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left">所有者允许的情况下允许</p>
</td>
</tr>
</tbody>
</table>
<ul>
<li><span style="line-height: normal; font-size: small;"> </span>本地文件域的安全沙箱</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="90" valign="top">
<p align="left">操作</p>
</td>
<td width="91" valign="top">
<p align="left">本地非swf资源</p>
</td>
<td width="91" valign="top">
<p align="left">本地文件系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地网络系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地受信任域下的swf</p>
</td>
<td width="90" valign="top">
<p align="left">远程网络域</p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载视听内容</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">将视听内容作为数据访问</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">脚本互访</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
<td width="91" valign="top">
<p align="left">创建者允许的情况下允许</p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载数据</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #ff0000;">禁止</span></p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>本地受信任域的安全沙箱</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="90" valign="top">
<p align="left">操作</p>
</td>
<td width="91" valign="top">
<p align="left">本地非swf资源</p>
</td>
<td width="91" valign="top">
<p align="left">本地文件系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地网络系统域下的swf</p>
</td>
<td width="91" valign="top">
<p align="left">本地受信任域下的swf</p>
</td>
<td width="90" valign="top">
<p align="left">远程网络域</p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载视听内容</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">将视听内容作为数据访问</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">脚本互访</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
<tr>
<td width="90" valign="top">
<p align="left">加载数据</p>
</td>
<td width="91" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="91" valign="top">
<p align="left">不适用</p>
</td>
<td width="90" valign="top">
<p align="left"><span style="color: #339966;">允许</span></p>
</td>
</tr>
</tbody>
</table>
<h4>总结</h4>
<p>从上面的表格可以看出，加载视听内容的限制是最宽松的，大多数情况下是允许的。脚本互访是的限制是最严格的，只有在所有者允许的情况下才可以。将视听内容作为数据访问和加载数据的限制实际上是同的，本质上它们也是相同的操作，都是访问数据。当我们遇到一个安全沙箱问题时，不妨先想一想swf文件的安全沙箱类型和访问资源类型，再参照下上面的表格，也许就会清楚一些了。还有很多操作这里并没有总结其限制方式，如连接到socket，调用外部的javascript等。这些内容在Adobe的官方文档中都有相应的介绍，具体可参见<a href="http://www.adobe.com/devnet/security/" target="_blank">Adobe’s Security Topic Center</a>，<a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/index.html">Adobe’s Flash Player Help</a>，还有<a href="http://www.adobe.com/devnet/flashplayer/articles/flash_player_9_security.pdf">http://www.adobe.com/devnet/flashplayer/articles/flash_player_9_security.pdf</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/flex_as3_research/flash-security-sandbox-type.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>难得一见的血性Dota &#8211; 记Ehome vs Fanatic&amp;赛场外的花絮</title>
		<link>http://www.diytz.cn/dota/ehome_vs_fanatic.html</link>
		<comments>http://www.diytz.cn/dota/ehome_vs_fanatic.html#comments</comments>
		<pubDate>Sat, 05 Dec 2009 05:25:47 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[dota]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=195</guid>
		<description><![CDATA[这场比赛让我感觉仿佛回到了48时代，Ehome和Fnatic仿佛就是当年的VP和MYM。从前期双方的你来我往；到中期Ehome巧妙地使用分而治之的策略；再到后期Fanatic调整策略寻求正面战场的5v5团战，从而慢慢扭转战局，再到那场60分钟莫名其妙的团战团灭Fnatic。可以说打得风生水起，有声有色。具体的过程可以看下面芙蓉哥哥（飘逸的DC）和路人甲姐姐的激情解说和Reply。

这里想说些场外的事情，Sgamer不是有个常规赛各项最佳评选么，小生精力有限，先来个本场比赛各项TOP评选吧：

最装逼战队评选：ENOTHOME（前Fnatic）
评：也许北欧人无法理解，在中国，好莱坞的电影里有中国演员演狗都会被群情激昂的群众认为辱华（李连杰），耐克拍广告穿耐克鞋的小伙子打败了中国功夫也会被认为辱华。这个在19世纪被列强蹂躏，又经历了各种丧权辱国的不平等条约和侵华战争的民族，是缺乏民族自信心的，尽管正在艰难的崛起。你开这种半开玩笑式的挑衅，必将成为某些人利用来煽动极端爱国主义情绪的话柄。只能对你说，没文化真可怕，以后去外国装逼前先做好功课，不然如果到了伊拉克估计就没有在天朝这么温柔了，估计就是自杀式站弹袭击了。
最脑残团体评选：跟随71的极端爱国主义众喷子
loda：看我们的队标，ENOTHOME，哈哈哈@！￥#￥%6&#38;*
众喷子：你这是挑衅我们中国战队 ，我要代表中国战队，代表中华民族，代表党和人民日你。
（评：71你确实赢了比赛，也赢的很漂亮，从这个角度来说，你是个爷们儿（或者说Ehome是爷们）。但请不要利用我国人脆弱而敏感的爱国主义情绪去煽动不和谐的音符。人家确实挑衅你了，不是被你日回去了么。见好就收吧，群众的眼睛是雪亮的。在这个纯商业比赛里，Ehome !=China，也代表不了China，求求你们了。）
最囧的言论：
71在Ehome赢了比赛后在自己的blog中说，loda是个喜欢在赢了比赛后更新自己blog的人，所以大家管他叫大嘴（原文见http://dota.sgamer.com/News/Detail/39247）。
（评：71或许应该叫大嘴2号？）。
最杯具人物评选：

Roshan，整场比赛被Ehome连日三次，每次被日都送复活盾，最后一丝还送奶酪；
GK的兽王，这场比赛经常看到这样的画面，兽王越塔吸引兵线和对面三个英雄，队友拿塔，自己被日。肉做到这个份上，可以了。

Fnatic全队，挂ENOTHOME的队标，明显的挑衅，结果被Ehome很爷们儿地日了，恩，比赛很精彩，日的也很精彩。


最牛逼团体：Sgamer众水友
挺71派：

滚回你妈碧里去，在这装你妹啊
沙比队吧，瞧你改的那欠操的队名 好好奉献精彩比赛得了 非装逼，你装逼不虐你啊 草，被虐成狗了吧，脸都没了 以后老老实实打比赛吧
资本主义和社会主义之间的矛盾不能和社会主义人民内部矛盾相混淆，大家一定要清楚认识。。。支持EHOME，支持中国。。。
现在还喷71的 SB喷子们 你们就是SB 鄙视你们 中国人就得干死外国人
71你这个算不算赢了就不停更新blog? 你打假赛 弄虚作假 玷污比赛的时候也闭嘴了段时间吧 现在又跳出来了?

黑71派：

71这jian人，是个喜欢赢了比赛不停装碧的人，全中国的DOTAER让你闭嘴一辈子，有你在EHOME的FANS最少减30%.
是ehome赢得比赛，你71算个毛啊，gank还分国界，这么会说，下次你上场比赛gank 啊，看你到底是gang bang kill 还是gank!

不得不说，喷子们太强大，以后在Sgamer要多灌水，少发言，珍爱生命，远离喷子。


]]></description>
			<content:encoded><![CDATA[<p>这场比赛让我感觉仿佛回到了48时代，Ehome和Fnatic仿佛就是当年的VP和MYM。从前期双方的你来我往；到中期Ehome巧妙地使用分而治之的策略；再到后期Fanatic调整策略寻求正面战场的5v5团战，从而慢慢扭转战局，再到那场60分钟莫名其妙的团战团灭Fnatic。可以说打得风生水起，有声有色。具体的过程可以看下面芙蓉哥哥（飘逸的DC）和路人甲姐姐的激情解说和Reply。</p>
<div class="VideoCode"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="align" value="middle" /><param name="src" value="http://player.youku.com/player.php/sid/XMTM2NDAyNzE2/v.swf" /><param name="quality" value="high" /><embed type="application/x-shockwave-flash" width="480" height="400" src="http://player.youku.com/player.php/sid/XMTM2NDAyNzE2/v.swf" quality="high" align="middle"></embed></object></div>
<p>这里想说些场外的事情，Sgamer不是有个常规赛各项最佳评选么，小生精力有限，先来个本场比赛各项TOP评选吧：</p>
<p><span id="more-195"></span></p>
<h5>最装逼战队评选：ENOTHOME（前Fnatic）</h5>
<p>评：也许北欧人无法理解，在中国，好莱坞的电影里有中国演员演狗都会被群情激昂的群众认为辱华（李连杰），耐克拍广告穿耐克鞋的小伙子打败了中国功夫也会被认为辱华。这个在19世纪被列强蹂躏，又经历了各种丧权辱国的不平等条约和侵华战争的民族，是缺乏民族自信心的，尽管正在艰难的崛起。你开这种半开玩笑式的挑衅，必将成为某些人利用来煽动极端爱国主义情绪的话柄。只能对你说，没文化真可怕，以后去外国装逼前先做好功课，不然如果到了伊拉克估计就没有在天朝这么温柔了，估计就是自杀式站弹袭击了。</p>
<h5>最脑残团体评选：跟随71的极端爱国主义众喷子</h5>
<p><strong>loda</strong>：看我们的队标，E<strong><span style="color: #ff0000;">NOT</span></strong>HOME，哈哈哈@！￥#￥%6&amp;*</p>
<p><strong>众喷子</strong>：你这是挑衅我们中国战队 ，我要代表中国战队，代表中华民族，代表党和人民日你。</p>
<p>（评：71你确实赢了比赛，也赢的很漂亮，从这个角度来说，你是个爷们儿（或者说Ehome是爷们）。但请不要利用我国人脆弱而敏感的爱国主义情绪去煽动不和谐的音符。人家确实挑衅你了，不是被你日回去了么。见好就收吧，群众的眼睛是雪亮的。在这个纯商业比赛里，Ehome !=China，也代表不了China，求求你们了。）</p>
<h5>最囧的言论：</h5>
<p>71在Ehome<span style="color: #ff0000;">赢了比赛</span>后在自己的<span style="color: #ff0000;">blog</span>中说，loda是个喜欢在<span style="color: #0000ff;">赢了比赛</span>后更新自己<span style="color: #0000ff;">blog</span>的人，所以大家管他叫大嘴（原文见<a href="http://dota.sgamer.com/News/Detail/39247">http://dota.sgamer.com/News/Detail/39247</a>）。</p>
<p>（评：71或许应该叫大嘴2号？）。</p>
<h5 style="font-size: 1em;">最杯具人物评选：</h5>
<ol>
<li>Roshan，整场比赛被Ehome连日三次，每次被日都送复活盾，最后一丝还送奶酪；</li>
<li>GK的兽王，这场比赛经常看到这样的画面，兽王越塔吸引兵线和对面三个英雄，队友拿塔，自己被日。肉做到这个份上，可以了。</li>
<li>
<h5>Fnatic全队，挂ENOTHOME的队标，明显的挑衅，结果被Ehome很爷们儿地日了，恩，比赛很精彩，日的也很精彩。</h5>
</li>
</ol>
<h5>最牛逼团体：Sgamer众水友</h5>
<p>挺71派：</p>
<ul>
<li>滚回你妈碧里去，在这装你妹啊</li>
<li>沙比队吧，瞧你改的那欠操的队名 好好奉献精彩比赛得了 非装逼，你装逼不虐你啊 草，被虐成狗了吧，脸都没了 以后老老实实打比赛吧</li>
<li>资本主义和社会主义之间的矛盾不能和社会主义人民内部矛盾相混淆，大家一定要清楚认识。。。支持EHOME，支持中国。。。</li>
<li>现在还喷71的 SB喷子们 你们就是SB 鄙视你们 中国人就得干死外国人</li>
<li>71你这个算不算赢了就不停更新blog? 你打假赛 弄虚作假 玷污比赛的时候也闭嘴了段时间吧 现在又跳出来了?</li>
</ul>
<p>黑71派：</p>
<ul>
<li>71这jian人，是个喜欢赢了比赛不停装碧的人，全中国的DOTAER让你闭嘴一辈子，有你在EHOME的FANS最少减30%.</li>
<li>是ehome赢得比赛，你71算个毛啊，gank还分国界，这么会说，下次你上场比赛gank 啊，看你到底是gang bang kill 还是gank!</li>
</ul>
<p>不得不说，喷子们太强大，以后在Sgamer要多灌水，少发言，珍爱生命，远离喷子。</p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/dota/ehome_vs_fanatic.html/feed</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>有关学习的15个习惯</title>
		<link>http://www.diytz.cn/favorite/study_15_habit.html</link>
		<comments>http://www.diytz.cn/favorite/study_15_habit.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 04:49:07 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[转载收藏]]></category>
		<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=186</guid>
		<description><![CDATA[这篇文章转自laan的博客，估计他也是转的，源头在哪就不得而知了。这个是一个缺失梦想的浮躁的年代，我们可以改变的只有我们自己。这篇文章，至少让我在看完之后内心能平静一些，能反思下自己，能计划一下未来，我想，这样的文章就称得上好文了。子曰：朝闻道，夕死可矣 。有时候越学习，越能感受到自己的无知，就越有学习的动力，我想这才是一个良性过程。下面是转来的内容：


这里有一些让你养成终身学习习惯的小提示:
1)总带一本书无论你花一年或者一周去读一本书，这都无所谓。随身带着它，当你有时间的时候就努力去阅读,通读。每天只需花挤出来的几分钟，一周就能读一本。那么一年至少就能读50
2)建一个”要学习什么”的名单我们都有需要做的事情的清单。这些就是我们需要完成的任务。努力建立一个”要学习什么”的清单。你可以把想要学习新领域的思路写在上面。或许你想掌握一门新语言,学习新技能,或者读莎士比亚全集。无论是什么激励你的,都要把它写下来。
3)寻找更多明智的朋友开始花更多的时间与那些善于思考的人在一起。并不仅因为他们聪明,而且是因为他们投入了很多时间学习新的技能。他们的好习惯也会在你的身上摩擦出火花。甚至更好的,他们可能会与你分享他的知识。
4)指导自己的思想爱因斯坦曾经说过:”任何读多思少的人都会养成懒惰思维的习惯”。只是简单的学习别人的东西，这样的智慧是不够的,你要在此之上建立自己的想法。多花点时间写日记,把你对这些学到的知识的思考和想法记录下来。
5)付诸实践如果不使用,学来的技能也是无用的。读一本C++的书,和写一个相同的程序,是完全不同的两码事。学画画可不是简单的拿起画笔。如果你的知识能被应用,那就付诸实践吧。

6)教导别人寓学于教。如果你能把知识教给别人,你也可以巩固学习。建立一个博客,开导别人或者与朋友们讨论想法。
7)整理你的博客订阅有些形式的学习很容易消化,但往往缺乏实质内容。我就经常定期清理我订阅的博客。伟大的博客就是一个新思路的巨大源泉。但每隔几个月,我就意识到我总是收到那些我不关注的博客的信息。每隔几个月,清理你们的订阅,就可以节省时间,注意重点.
8 )在群体中学习终身学习并不意味着让自己陷于一堆落满灰尘的课本。加入教授技能的组织。这种群体学习和小组学习活动,都可以培养自己的乐趣和社会经验。
9)将假设忘掉 【把你脑中先入为主的观念忘掉】杯子满了就不能再往里面倒水了。所以我总是尽量与任何想法保持距离。学到了太多的信念，就意味着太少产生新想法的机会。积极寻找那些能改变你的世界观的想法。
10)找一份能鼓励多学习的工作找一份能鼓励不断学习的工作。如果你的工作让你没有多少学习知识的自由,就该考虑换工作了。不要每周花40小时来做一项没有挑战的工作。
11)开始的一个项目列举一些你不知道该从何做起的事情。强迫这样去学习才能得到乐趣,并具有挑战性。如果你不懂电脑,尝试学一学。如果你认为你一个可怕的艺术家,那就试试画画。
12)跟随你的直觉终身学习有时感觉就好像在荒野中漫游。你不知道你在期望什么,而且心里也不是总有一个明确的最终目标。那就让你的直觉指引你吧,这样可以让自我教育更有乐趣。我们的生活已经被完全的逻辑思维所打破，以至于异想天开的想法不复存在了。
13)早上15分钟把早上的前15分钟定为学习期。如果你发现自己筋疲力尽,你也许想要等一会再学。但是不要把它推迟的过晚,因为某些紧急活动可能就会完全把它推之门外。
14)获得回报学习你可以使用的资料。了解一些基本的编程,其他人需要外界帮助才能完成的项目,我就可以独立完成。要知道能够利用你的学习成果,这可是值得自豪的。
15)把它作为首要任务很少有外部力量能说服你去学习。渴望应该来自内部。一旦你决定把终身学习作为一种习惯,你就应该把它作为你生命里的首要任务。

]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;"><img class="alignright size-medium wp-image-191" title="有关学习的15个习惯" src="http://www.diytz.cn/wp-content/uploads/2009/12/1104554q119209.844242-300x225.jpg" alt="有关学习的15个习惯" width="300" height="225" /><strong>这</strong>篇文章转自<a href="http://www.laaan.cn/">laan的博客</a>，估计他也是转的，源头在哪就不得而知了。这个是一个缺失梦想的浮躁的年代，我们可以改变的只有我们自己。这篇文章，至少让我在看完之后内心能平静一些，能反思下自己，能计划一下未来，我想，这样的文章就称得上好文了。子曰：朝闻道，夕死可矣 。有时候越学习，越能感受到自己的无知，就越有学习的动力，我想这才是一个良性过程。下面是转来的内容：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">
<blockquote>
<h6>这里有一些让你养成终身学习习惯的小提示:</h6>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">1)总带一本书<br style="padding: 0px; margin: 0px;" />无论你花一年或者一周去读一本书，这都无所谓。随身带着它，当你有时间的时候就努力去阅读,通读。每天只需花挤出来的几分钟，一周就能读一本。那么一年至少就能读50</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">2)建一个”要学习什么”的名单<br style="padding: 0px; margin: 0px;" />我们都有需要做的事情的清单。这些就是我们需要完成的任务。努力建立一个”要学习什么”的清单。你可以把想要学习新领域的思路写在上面。或许你想掌握一门新语言,学习新技能,或者读莎士比亚全集。无论是什么激励你的,都要把它写下来。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">3)寻找更多明智的朋友<br style="padding: 0px; margin: 0px;" />开始花更多的时间与那些善于思考的人在一起。并不仅因为他们聪明,而且是因为他们投入了很多时间学习新的技能。他们的好习惯也会在你的身上摩擦出火花。甚至更好的,他们可能会与你分享他的知识。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">4)指导自己的思想<br style="padding: 0px; margin: 0px;" />爱因斯坦曾经说过:”任何读多思少的人都会养成懒惰思维的习惯”。只是简单的学习别人的东西，这样的智慧是不够的,你要在此之上建立自己的想法。多花点时间写日记,把你对这些学到的知识的思考和想法记录下来。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">5)付诸实践<br style="padding: 0px; margin: 0px;" />如果不使用,学来的技能也是无用的。读一本C++的书,和写一个相同的程序,是完全不同的两码事。学画画可不是简单的拿起画笔。如果你的知识能被应用,那就付诸实践吧。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;"><span id="more-186"></span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">6)教导别人<br style="padding: 0px; margin: 0px;" />寓学于教。如果你能把知识教给别人,你也可以巩固学习。建立一个博客,开导别人或者与朋友们讨论想法。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">7)整理你的博客订阅<br style="padding: 0px; margin: 0px;" />有些形式的学习很容易消化,但往往缺乏实质内容。我就经常定期清理我订阅的博客。伟大的博客就是一个新思路的巨大源泉。但每隔几个月,我就意识到我总是收到那些我不关注的博客的信息。每隔几个月,清理你们的订阅,就可以节省时间,注意重点.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">8 )在群体中学习<br style="padding: 0px; margin: 0px;" />终身学习并不意味着让自己陷于一堆落满灰尘的课本。加入教授技能的组织。这种群体学习和小组学习活动,都可以培养自己的乐趣和社会经验。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">9)将假设忘掉 【把你脑中先入为主的观念忘掉】<br style="padding: 0px; margin: 0px;" />杯子满了就不能再往里面倒水了。所以我总是尽量与任何想法保持距离。学到了太多的信念，就意味着太少产生新想法的机会。积极寻找那些能改变你的世界观的想法。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">10)找一份能鼓励多学习的工作<br style="padding: 0px; margin: 0px;" />找一份能鼓励不断学习的工作。如果你的工作让你没有多少学习知识的自由,就该考虑换工作了。不要每周花40小时来做一项没有挑战的工作。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">11)开始的一个项目<br style="padding: 0px; margin: 0px;" />列举一些你不知道该从何做起的事情。强迫这样去学习才能得到乐趣,并具有挑战性。如果你不懂电脑,尝试学一学。如果你认为你一个可怕的艺术家,那就试试画画。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">12)跟随你的直觉<br style="padding: 0px; margin: 0px;" />终身学习有时感觉就好像在荒野中漫游。你不知道你在期望什么,而且心里也不是总有一个明确的最终目标。那就让你的直觉指引你吧,这样可以让自我教育更有乐趣。我们的生活已经被完全的逻辑思维所打破，以至于异想天开的想法不复存在了。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">13)早上15分钟<br style="padding: 0px; margin: 0px;" />把早上的前15分钟定为学习期。如果你发现自己筋疲力尽,你也许想要等一会再学。但是不要把它推迟的过晚,因为某些紧急活动可能就会完全把它推之门外。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">14)获得回报<br style="padding: 0px; margin: 0px;" />学习你可以使用的资料。了解一些基本的编程,其他人需要外界帮助才能完成的项目,我就可以独立完成。要知道能够利用你的学习成果,这可是值得自豪的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding: 0px;">15)把它作为首要任务<br style="padding: 0px; margin: 0px;" />很少有外部力量能说服你去学习。渴望应该来自内部。一旦你决定把终身学习作为一种习惯,你就应该把它作为你生命里的首要任务。</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/favorite/study_15_habit.html/feed</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>也谈Flex组件的生命周期</title>
		<link>http://www.diytz.cn/flex_as3_research/flex_component_lifecycle.html</link>
		<comments>http://www.diytz.cn/flex_as3_research/flex_component_lifecycle.html#comments</comments>
		<pubDate>Tue, 01 Dec 2009 13:47:45 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[Flex&AS3研究]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[组件]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=181</guid>
		<description><![CDATA[引子：作于一名由ASP.NET开发转到Flex开发的程序员，最开始适应的过程是相当愉悦和轻松的。由于我早在ASP.NET中习惯了标签式的布局和对应的code behind的编程方式，在Flex中的MXML语言只不过是MXML元素和AS3语法的重新熟悉。但是就像ASP.NET中的标记语言，MXML只不过是AS3的一种封装，归根到底它会被转化成AS3再进行编译，所以，只有了解这门语言的底层运行机制，才有可能真正成为一名优秀的Flex开发人员。由于有过ASP.NET的开发经验，我清楚地认识到像这种以XML标签为基础的组件式的开发方式，只有弄清楚组件的生命周期，才能进行高级开发，才能在遇到复杂情况时有思路去解决，就像做ASP.NET的开发要熟悉页面的生命周期一样。
为此，我刚接触Flex不久就开始研究Flex组件的生命周期。幸运的是，Flex Builder内嵌的帮助文件十分犀利，很容易就查到了Flex组件的的生命周期部分。不幸的是作为没有Flash开发经验的程序员，对里面的某些名词并不是很明白。就这样在没有Flash基础的情况下，我曾经看过很多遍帮助文件，但感觉脑子里一直不是很清楚，对整个生命周期不能形成一个完整的轮廓。最后终于滤清了一些思路，结果还是停在了一个名词上，叫做“Render Event”。里面两次提到了这个词，都是在关键的地方。前些天搞到了《Essential.ActionScript.3.0》的电子版，阅之如醍醐灌顶，不愧为AS3的经典。其中一章就专门讲了Flash运行时的屏幕更新机制，里面当然也提到了Flex帮助文件中所谓的“Render Event”。
先看看Flex帮助文件是怎么说的吧，这里拷贝了原文（可以先略过，只为提供参考）：



You call the component&#8217;s constructor, as the following code shows:
// Create a Button control.
var b:Button = new Button()

You configure the component by setting its properties, as the following code  shows:
// Configure the button control.
b.label = "Submit";
Component setter methods might call the invalidateProperties(), invalidateSize(), or invalidateDisplayList() methods.
You call the addChild() method [...]]]></description>
			<content:encoded><![CDATA[<p>引子：作于一名由ASP.NET开发转到Flex开发的程序员，最开始适应的过程是相当愉悦和轻松的。由于我早在ASP.NET中习惯了标签式的布局和对应的code behind的编程方式，在Flex中的MXML语言只不过是MXML元素和AS3语法的重新熟悉。但是就像ASP.NET中的标记语言，MXML只不过是AS3的一种封装，归根到底它会被转化成AS3再进行编译，所以，只有了解这门语言的底层运行机制，才有可能真正成为一名优秀的Flex开发人员。由于有过ASP.NET的开发经验，我清楚地认识到像这种以XML标签为基础的组件式的开发方式，只有弄清楚组件的生命周期，才能进行高级开发，才能在遇到复杂情况时有思路去解决，就像做ASP.NET的开发要熟悉页面的生命周期一样。</p>
<p>为此，我刚接触Flex不久就开始研究Flex组件的生命周期。幸运的是，Flex Builder内嵌的帮助文件十分犀利，很容易就查到了Flex组件的的生命周期部分。不幸的是作为没有Flash开发经验的程序员，对里面的某些名词并不是很明白。就这样在没有Flash基础的情况下，我曾经看过很多遍帮助文件，但感觉脑子里一直不是很清楚，对整个生命周期不能形成一个完整的轮廓。最后终于滤清了一些思路，结果还是停在了一个名词上，叫做“Render Event”。里面两次提到了这个词，都是在关键的地方。前些天搞到了《Essential.ActionScript.3.0》的电子版，阅之如醍醐灌顶，不愧为AS3的经典。其中一章就专门讲了Flash运行时的屏幕更新机制，里面当然也提到了Flex帮助文件中所谓的“Render Event”。</p>
<p>先看看Flex帮助文件是怎么说的吧，这里拷贝了原文（可以先略过，只为提供参考）：</p>
<p><span id="more-181"></span></p>
<ol>
<blockquote>
<li>You call the component&#8217;s constructor, as the following code shows:
<pre>// Create a Button control.
var b:Button = new Button()</pre>
</li>
<li>You configure the component by setting its properties, as the following code  shows:
<pre>// Configure the button control.
b.label = "Submit";</pre>
<p>Component setter methods might call the <samp>invalidateProperties()</samp>, <samp>invalidateSize()</samp>, or <samp>invalidateDisplayList()</samp> methods.</li>
<li>You call the <samp>addChild()</samp> method to add the  component to its parent, as the following code shows:
<pre>// Add the Button control to the Box container.
boxContainer.addChild(b);</pre>
<p>Flex performs the following actions:</li>
<li>Sets the <samp>parent</samp> property for the component to  reference its parent container.</li>
<li>Computes the style settings for the component.</li>
<li>Dispatches the <samp>preinitialize</samp> event on the  component.</li>
<li>Calls the component&#8217;s <samp>createChildren()</samp> method.</li>
<li>Calls the <samp>invalidateProperties()</samp>, <samp>invalidateSize()</samp>, and <samp>invalidateDisplayList()</samp> methods to trigger later calls to  the <samp>commitProperties()</samp>, <samp>measure()</samp>, or <samp>updateDisplayList()</samp> methods during the next <samp>render</samp> event.The only exception to this rule is that Flex does not call the <samp>measure()</samp> method when the user sets the height and width of  the component.</li>
<li>Dispatches the <samp>initialize</samp> event on the component.  At this time, all of the component&#8217;s children are initialized, but the component  has not been sized or processed for layout. You can use this event to perform  additional processing of the component before it is laid out.</li>
<li>Dispatches the <samp>childAdd</samp> event on the parent  container.</li>
<li>Dispatches the <samp>initialize</samp> event on the parent  container.</li>
<li>During the next <samp>render</samp> event, Flex performs the  following actions:
<ol>
<li>Calls the component&#8217;s <samp>commitProperties()</samp> method.</li>
<li>Calls the component&#8217;s <samp>measure()</samp> method.</li>
<li>Calls the component&#8217;s <samp>layoutChrome()</samp> method.</li>
<li>Calls the component&#8217;s <samp>updateDisplayList()</samp> method.</li>
<li>Dispatches the <samp>updateComplete</samp> event on the  component.</li>
</ol>
</li>
<li>Flex dispatches additional <samp>render</samp> events if the  <samp>commitProperties()</samp>, <samp>measure()</samp>, or <samp>updateDisplayList()</samp> methods call the <samp>invalidateProperties()</samp>, <samp>invalidateSize()</samp>, or <samp>invalidateDisplayList()</samp> methods.</li>
<li>After the last <samp>render</samp> event occurs, Flex performs  the following actions:
<ol>
<li>Makes the component visible by setting the <samp>visible</samp> property to <samp>true</samp>.</li>
<li>Dispatches the <samp>creationComplete</samp> event on the  component. The component is sized and processed for layout. This event is only  dispatched once when the component is created.</li>
</ol>
</li>
<li>Dispatches the <samp>updateComplete</samp> event on the  component. Flex dispatches additional <samp>updateComplete</samp> events whenever the layout, position, size, or other visual characteristic of  the component changes and the component is updated for display.</li>
</blockquote>
</ol>
<p>看起来这么多步，总结起来其实就三步：</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 530px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1. 实例化阶段（1-6）。这个阶段调用组件的构造函数，设置组件的属性和样式。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 530px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2. 初始化阶段，说白了就是构造显示列表阶段（7-11）。在这个阶段，以这个组件为根节点，在数据结构层面构造显示列表（相对于屏幕呈现层面）。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 530px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3. 屏幕呈现阶段（12-14）。在这个阶段，其实就是前面提到的Render Event抛出后（关于Render Event请看下面的分析），执行那些布局的方法，包括设置组件大小，设置位置等等。最后将组件的visible属性设为true，呈现组件，然后就会抛出creationComplete事件。</div>
<ol>
<li>实例化阶段（1-6）。这个阶段调用组件的构造函数，设置组件的属性和样式。</li>
<li>初始化阶段，说白了就是构造显示列表阶段（7-11）。在这个阶段，以这个组件为根节点，在数据结构层面构造显示列表（相对于屏幕呈现层面）。</li>
<li>屏幕呈现阶段（12-14）。在这个阶段，其实就是前面提到的Render Event抛出后（关于Render Event请看下面的分析），执行那些布局的方法，包括设置组件大小，设置位置等等。最后将组件的visible属性设为true，呈现组件，然后就会抛出creationComplete事件。</li>
</ol>
<p>你也可以从按事件来分阶段，结果是一样的。preinitialize事件标志着实例化阶段的结束；initialize事件则标志着构造显示列表阶段的结束；creationComplete 事件当然就是标着着屏幕呈现阶段的结束了。起始这些阶段这么分就是为了容易理解，并不是死的。</p>
<p>现在到了关键部分了，里面的“Render Event”是个啥意思？其实就像视频一样，flash中有帧这样的概念。不同的视频文件可以有不同的帧率当然就是，flash也可以自己控制帧率。Flex默认一秒24帧，而高速摄像机能达到1000000帧/秒。flash开始就是做动画的，后来模型奇妙的成为RIA界的扛把子，所以到现在Flex框架，还是得继承那套以动画为基础的衣钵。就像Java，本来设计是用来做机顶盒的软件的，结果不小心成了目前最流行的开发语言，这就是命。当然这都是题外话了。回到我们的“Render Event”，一切还要从Flash中的屏幕更新机制说起。</p>
<h4>Flash运行时中有两种屏幕更新机制</h4>
<p>一种是定时更新（Scheduled Screen Updates），这就跟帧率相关了。比如说Flex默认的一秒24帧，那Flash运行时就会每隔1/24秒检查一下程序状态，看看有没有添加组件啊，有没有组件被重新设置导致大小，颜色有变化啊等等，如果有，就重绘屏幕，以将变化呈现到屏幕上。当然这里的1/24秒是理想的频率，实际过程往往由于其他代码执行导致相应的拖延，但如果没有代码执行并不会提前，而是等着，一直到过完这1/24秒。所以说所谓的帧率只能体现一个最快帧率，实际帧率要有实际情况决定。</p>
<div>
<p>还有一种机制是事件强制更新（Post-Event Screen Updates）。这种机制是专门为某些事件服务的，如鼠标事件和键盘事件。由于鼠标事件需要一个即时的反应，就需要事件派发后第一时间更新屏幕，这样就可以调用MouseEvent或者KeyboardEvent的一个实例方法updateAfterEvent()，这样就可以在事件派发后所有事件处理函数执行完后更新屏幕，不用等待。</p>
<h4>关于Render Event</h4>
<p>请允许我将《Essential.ActionScript.3.0》中对Render Event的描述直接粘贴在这里，讲的实在是太精彩了。我唯恐我的理解或转译有问题。</p>
<blockquote><p>The Event.RENDER event is a specialized type of screen-update event used in advanced situations where graphics performance is critical. Its primary purpose is to let the programmer defer the execution of all custom drawing routines until the precise moment before the screen is rendered, thus eliminating duplicate drawing-routine execution. Unlike all other built-in Flash runtime events, the Event.RENDER event must be requested manually by the programmer. The Flash runtime dispatches the Event.RENDER event when the following two conditions are both true:</p></blockquote>
<ul>
<blockquote>
<li>The Flash runtime is about to check if the screen needs updating (whether due to a frame passing or an updateAfterEvent( ) call).</li>
<li>The programmer has invoked stage.invalidate( ). (stage.invalidate( ) is the programmer’s way of asking the Flash runtime to dispatch the Event.RENDER event the next time a screen-update check occurs).</li>
</blockquote>
</ul>
</div>
<p>Colin Moock已经讲的很清楚了，Flash运行时将要检查屏幕是否需要更新前，会先检查程序员时候调用过stage.invalidate( )这个方法，只有调用过，才会抛出这个Event.RENDER事件。这样做的目的就是允许程序员延迟那些引起屏幕更新的操作，让它们在真正屏幕更新之前（Event.RENDER事件之后），只执行一次就够了。stage.invalidate()这个方法是不是有些眼熟，如果没猜错的话，UIComponent里的invalidateProperties(), invalidateSize(), and invalidateDisplayList() 就会间接地调用stage.invalidate()方法，从而导致在下一个Event.RENDER的时候会调用commitProperties(), measure(), or updateDisplayList() 这些方法。</p>
<h4>结语</h4>
<p>如果你曾经有和我类似的困惑，我想讲到这里应该已经明白了。Colin Moock在《Essential.ActionScript.3.0》这本书中甚至模拟了Flex组件的屏幕更新机制，就在前面那段文字的后面。大师不愧为大师，写的东西确实让人受益匪浅。再有困惑的话就去找这本书吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/flex_as3_research/flex_component_lifecycle.html/feed</wfw:commentRss>
		<slash:comments>232</slash:comments>
		</item>
		<item>
		<title>两杯浓茶，三局dota &#8211; 记SMM2009决赛</title>
		<link>http://www.diytz.cn/dota/smm2009_final.html</link>
		<comments>http://www.diytz.cn/dota/smm2009_final.html#comments</comments>
		<pubDate>Sun, 29 Nov 2009 10:12:01 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[dota]]></category>
		<category><![CDATA[smm]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=171</guid>
		<description><![CDATA[都说SMM是dota的世界杯，这句话常常让我想起悲剧的中国男足。这届SMM中国军团异常威武，包揽了前三甲，大大让祖国的dotaer们扬眉吐气，欧亚dota谁强的争论似乎也毫无意义。其实hyhy和mealk在论坛上相互挖苦打嘴仗时，低调的中国军早就团笑而不语。其实08年的EHOME如果能参加ESWC,我想笑到最后的恐怕就不是yamede了。好吧，以上纯属个人意淫，意淫无罪，莫喷。
一共看了三场比赛。第一场败者组决赛，Ehome对09的FTD。过程就不说了，无比的枯燥。我常常想dota为什么会变成这个样子，各种farm，然后40分钟一两场决定性的团战，往往是连破两路，对方gg。不敢说100%是这样，但就这届SMM来说，至少应该是个大趋势了。SMM应该是体现dota的最高水平了吧，到了决赛时这就是最稳的方式，或者说时最能体现实力的方式。很遗憾，08年各种比赛的霸主ehome出局了，其实我是希望ehome赢的，这样的话ehome将越来越像一个传说，一个王朝。在NBA,至少要三连冠才称得上是王朝，ehome在比较重要的线下赛事夺冠应该是至少三次了，07、08的ACG，08的SMM。恩，不管怎样，ehome配得上王朝这个词，曾经的。

第二场是总决赛cd对FTD的第一场，关键词是09的火枪秀。不到三十分钟cd外塔全倒，而FTD外塔全在（如果没记错的话）。09的火枪霸气十足，中路对TK完全压制。这场比赛节奏完全在FTD这边，这场比赛无疑是最后三场比赛中最精彩的一场。欣赏比赛之余，一个值得另人深思的问题一直困扰着我，节奏是怎么打出来的。看着09的火枪毫无忌惮的霸线打钱，我百思不得其解。如果没记错的话cd的阵容是tk，潮汐，小黑，sg，wl，先手、后手、nuke、减速、沉默样样都有，团战不应该吃亏，推塔有wl的大，前期也应该拿几个外塔。但是感觉整场比赛cd都被FTD牵着鼻子走。什么？节奏？对不起，我知道，但关键的是节奏是怎么打出来的。09把ID改成了ForTheDream，我看了之后感觉除了羡慕，更多的是感慨。毕业一年多了，在北京稳稳当当，迷迷茫茫的混着，其实我们都是有梦想的，只不过慢慢被悲剧时代和自己消磨掉了。韩寒一句话说得好，什么时候中国房地产垮掉了，中国年轻一代才会有梦想。好像跑题了，我想这场比赛的rep是值得反复研究的，cd这个阵容30分钟拿不到一个外塔，是个奇迹。
第三场是总决赛cd对FTD的第二场，关键词是悲剧的双游。10分钟的时候一个五级，一个三级的lion和老牛，让cd的中期完全处于弱势。从而无法压制对面三核sf，死灵龙，小娜迦的打钱空间，影魔的bot,bkb,死灵龙的mek，暗灭（还是小电？），小娜迦的散失早早到手。而对面的三核电魂，tk，nec则同样稳健，虽然装备稍差（电魂和死灵法师先锋盾、刃甲，tk飞鞋羊刀），等级却是领先对面两级。但dota毕竟是五个人的游戏，尤其是己方大控等级，核心装备都没有的情况下，团战的失利则是必然的结果了。到最后牛仍没有做出跳刀，也没有二级大，好像最后是7级吧。可以看得出，FTD对影魔，死灵龙，小娜迦情有独钟。看来这真是一个多核的时代。
最后祝贺2009，在这个电子竞技并不景气的年代，你和你的队伍，远离各种绯闻和争论，以一种低调的姿态(从败者组杀上来)连拿两个顶级线下赛事的冠军，无疑是给dota届树立了一个优秀队伍的榜样。我想，无论是电子竞技，还是其他体育竞技，光有才华是不够的，踏实，低调的的做人做事，勤奋的训练才是制胜之王道。cd其实也蛮可惜的，包括ehome都是很优秀的队伍，正是有你们这样的队伍，中国才能在这届SMM上大放异彩（怎么又想到中国男足了）。
值得担心的是，随着电子竞技的广泛开展，国家体育总局的介入已经是必然，但愿电子竞技不会像中国男足那样成为体制的悲剧。任何松散的，缺乏约束的圈子都遵循一句老话，叫“林子大了什么鸟都有”。论坛如此，游戏平台亦如此。而独立系统总是趋于无序，就像60年代的中国和80年代末的苏联，与其说是人为的因素，不如说是历史的必然。
]]></description>
			<content:encoded><![CDATA[<p><strong>都</strong><img class="alignright size-full wp-image-172" title="smm 2009" src="http://www.diytz.cn/wp-content/uploads/2009/11/smm-logo.jpg" alt="smm 2009" width="233" height="203" />说SMM是dota的世界杯，这句话常常让我想起悲剧的中国男足。这届SMM中国军团异常威武，包揽了前三甲，大大让祖国的dotaer们扬眉吐气，欧亚dota谁强的争论似乎也毫无意义。其实hyhy和mealk在论坛上相互挖苦打嘴仗时，低调的中国军早就团笑而不语。其实08年的EHOME如果能参加ESWC,我想笑到最后的恐怕就不是yamede了。好吧，以上纯属个人意淫，意淫无罪，莫喷。</p>
<p>一共看了三场比赛。第一场败者组决赛，Ehome对09的FTD。过程就不说了，无比的枯燥。我常常想dota为什么会变成这个样子，各种farm，然后40分钟一两场决定性的团战，往往是连破两路，对方gg。不敢说100%是这样，但就这届SMM来说，至少应该是个大趋势了。SMM应该是体现dota的最高水平了吧，到了决赛时这就是最稳的方式，或者说时最能体现实力的方式。很遗憾，08年各种比赛的霸主ehome出局了，其实我是希望ehome赢的，这样的话ehome将越来越像一个传说，一个王朝。在NBA,至少要三连冠才称得上是王朝，ehome在比较重要的线下赛事夺冠应该是至少三次了，07、08的ACG，08的SMM。恩，不管怎样，ehome配得上王朝这个词，曾经的。</p>
<p><span id="more-171"></span></p>
<p>第二场是总决赛cd对FTD的第一场，关键词是09的火枪秀。不到三十分钟cd外塔全倒，而FTD外塔全在（如果没记错的话）。09的火枪霸气十足，中路对TK完全压制。这场比赛节奏完全在FTD这边，这场比赛无疑是最后三场比赛中最精彩的一场。欣赏比赛之余，一个值得另人深思的问题一直困扰着我，节奏是怎么打出来的。看着09的火枪毫无忌惮的霸线打钱，我百思不得其解。如果没记错的话cd的阵容是tk，潮汐，小黑，sg，wl，先手、后手、nuke、减速、沉默样样都有，团战不应该吃亏，推塔有wl的大，前期也应该拿几个外塔。但是感觉整场比赛cd都被FTD牵着鼻子走。什么？节奏？对不起，我知道，但关键的是节奏是怎么打出来的。09把ID改成了ForTheDream，我看了之后感觉除了羡慕，更多的是感慨。毕业一年多了，在北京稳稳当当，迷迷茫茫的混着，其实我们都是有梦想的，只不过慢慢被悲剧时代和自己消磨掉了。韩寒一句话说得好，什么时候中国房地产垮掉了，中国年轻一代才会有梦想。好像跑题了，我想这场比赛的rep是值得反复研究的，cd这个阵容30分钟拿不到一个外塔，是个奇迹。</p>
<p>第三场是总决赛cd对FTD的第二场，关键词是悲剧的双游。10分钟的时候一个五级，一个三级的lion和老牛，让cd的中期完全处于弱势。从而无法压制对面三核sf，死灵龙，小娜迦的打钱空间，影魔的bot,bkb,死灵龙的mek，暗灭（还是小电？），小娜迦的散失早早到手。而对面的三核电魂，tk，nec则同样稳健，虽然装备稍差（电魂和死灵法师先锋盾、刃甲，tk飞鞋羊刀），等级却是领先对面两级。但dota毕竟是五个人的游戏，尤其是己方大控等级，核心装备都没有的情况下，团战的失利则是必然的结果了。到最后牛仍没有做出跳刀，也没有二级大，好像最后是7级吧。可以看得出，FTD对影魔，死灵龙，小娜迦情有独钟。看来这真是一个多核的时代。</p>
<p>最后祝贺2009，在这个电子竞技并不景气的年代，你和你的队伍，远离各种绯闻和争论，以一种低调的姿态(从败者组杀上来)连拿两个顶级线下赛事的冠军，无疑是给dota届树立了一个优秀队伍的榜样。我想，无论是电子竞技，还是其他体育竞技，光有才华是不够的，踏实，低调的的做人做事，勤奋的训练才是制胜之王道。cd其实也蛮可惜的，包括ehome都是很优秀的队伍，正是有你们这样的队伍，中国才能在这届SMM上大放异彩（怎么又想到中国男足了）。</p>
<p>值得担心的是，随着电子竞技的广泛开展，国家体育总局的介入已经是必然，但愿电子竞技不会像中国男足那样成为体制的悲剧。任何松散的，缺乏约束的圈子都遵循一句老话，叫“林子大了什么鸟都有”。论坛如此，游戏平台亦如此。而独立系统总是趋于无序，就像60年代的中国和80年代末的苏联，与其说是人为的因素，不如说是历史的必然。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/dota/smm2009_final.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>也谈AS3中的深度复制</title>
		<link>http://www.diytz.cn/flex_as3_research/as3_deep_clone.html</link>
		<comments>http://www.diytz.cn/flex_as3_research/as3_deep_clone.html#comments</comments>
		<pubDate>Thu, 26 Nov 2009 14:04:14 +0000</pubDate>
		<dc:creator>大工小田</dc:creator>
				<category><![CDATA[Flex&AS3研究]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[深克隆]]></category>

		<guid isPermaLink="false">http://www.diytz.cn/?p=160</guid>
		<description><![CDATA[深度复制（也叫深克隆）在一门成熟的面向对象语言中已经不是什么新鲜的事情了，在Java和.NET中都有着比较完善的实现方式。而在AS3中似乎没有一个完美的解决方案。网上有些所谓的AS3深度复制的终极方案，但都经不起推敲，反倒不如一些虽然不完善但比较客观的论述来的有说服力。最近几天google了很多关于深度复制的资料，也翻了很多各大论坛的老帖子，得出的结论是AS3并不支持复杂对象的深克隆的相关功能。至于是Adobe有意为之，还是机制上的缺陷，不是本文讨论的范畴。写这篇文章，一是对这几天查阅资料的一个总结，再就是记录下我这几天的一些有意义思考。
说到深克隆，思路无非有两个：一是通过序列化和反序列化；二是通过语言的反射机制，递归遍历对象的各级属性，然后copy之。Java和.NET上最成熟的做法是第一条，序列化和反序列化。而且这两种语言在序列化的时候都保存了类型信息，这样做的好处在于反序列化的时候可以把得到的对象转化成对应的类型。而到了AS3中，情况就比较复杂了。

对于Object类型的对象，直接用ObjectUtil.copy()方法，就可以得到该对象的一个深拷贝。不妨先看看ObjectUtil.copy()方法的源代码：
public static function copy(value:Object):Object
{
&#160; &#160; var&#160;buffer:ByteArray = new ByteArray();
&#160; &#160; buffer.writeObject(value);
&#160; &#160; buffer.position = 0;
&#160; &#160; var&#160;result:Object = buffer.readObject();
&#160; &#160; return&#160;result;
}
典型的序列化和反序列化的实现。只不过序列化的结果是AMF格式。关于AMF，又是一个很大的话题，这里也不多做讨论。
对于非Object类，用ObjectUtil.copy()方法返回对象，然后将其强制转换为之前的类型，目前只发现了int，uint，Number，Boolean，Array，Date，ArrayCollection这几个类型可以成功转化。规律暂时未找到。而且就算是Array,ArrayCollection这两个类，元素如果不是前面提到的类型，都无法转化为原类型，只能以Object类型存在。
网上还提到了一个注册对象类型的方案，也被某些人称为终极方案。就是在上面那个函数函数体的前面加上注册当前对象类型的语句:
public static function copy(value:Object):Object
{
&#160; &#160; var&#160;typeName:String = getQualifiedClassName(source);//获取全名
&#160; &#160; var&#160;packageName:String = typeName.split(&#34;::&#34;)[0];//切出包名
&#160; &#160; var&#160;type:Class = getDefinitionByName(typeName) as Class;//获取Class
&#160; &#160; registerClassAlias(packageName, type);//注册Class
&#160; &#160; var&#160;buffer:ByteArray = new ByteArray();
&#160; &#160; buffer.writeObject(value);
&#160; &#160; buffer.position = 0;
&#160; &#160; var&#160;result:Object = [...]]]></description>
			<content:encoded><![CDATA[<p>深度复制（也叫深克隆）在一门成熟的面向对象语言中已经不是什么新鲜的事情了，在Java和.NET中都有着比较完善的实现方式。而在AS3中似乎没有一个完美的解决方案。网上有些所谓的AS3深度复制的终极方案，但都经不起推敲，反倒不如一些虽然不完善但比较客观的论述来的有说服力。最近几天google了很多关于深度复制的资料，也翻了很多各大论坛的老帖子，得出的结论是AS3并不支持复杂对象的深克隆的相关功能。至于是Adobe有意为之，还是机制上的缺陷，不是本文讨论的范畴。写这篇文章，一是对这几天查阅资料的一个总结，再就是记录下我这几天的一些有意义思考。</p>
<p>说到深克隆，思路无非有两个：一是通过序列化和反序列化；二是通过语言的反射机制，递归遍历对象的各级属性，然后copy之。Java和.NET上最成熟的做法是第一条，序列化和反序列化。而且这两种语言在序列化的时候都保存了类型信息，这样做的好处在于反序列化的时候可以把得到的对象转化成对应的类型。而到了AS3中，情况就比较复杂了。<br />
<span id="more-160"></span><br />
对于Object类型的对象，直接用ObjectUtil.copy()方法，就可以得到该对象的一个深拷贝。不妨先看看ObjectUtil.copy()方法的源代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Teal;">copy</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">buffer</span><span style="color: Gray;">:</span><span style="color: Blue;">ByteArray</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ByteArray</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Blue;">writeObject</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Teal;">position</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">result</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span><span style="color: Gray;"> = </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Blue;">readObject</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">result</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>典型的序列化和反序列化的实现。只不过序列化的结果是AMF格式。关于AMF，又是一个很大的话题，这里也不多做讨论。</p>
<p>对于非Object类，用ObjectUtil.copy()方法返回对象，然后将其强制转换为之前的类型，目前只发现了int，uint，Number，Boolean，Array，Date，ArrayCollection这几个类型可以成功转化。规律暂时未找到。而且就算是Array,ArrayCollection这两个类，元素如果不是前面提到的类型，都无法转化为原类型，只能以Object类型存在。</p>
<p>网上还提到了一个注册对象类型的方案，也被某些人称为终极方案。就是在上面那个函数函数体的前面加上注册当前对象类型的语句:</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">static</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Teal;">copy</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">typeName</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Gray;"> = </span><span style="color: Blue;">getQualifiedClassName</span><span style="color: Olive;">(</span><span style="color: Teal;">source</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//获取全名</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">packageName</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Gray;"> = </span><span style="color: Blue;">typeName</span><span style="color: Gray;">.</span><span style="color: Teal;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">::</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//切出包名</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">type</span><span style="color: Gray;">:</span><span style="color: Blue;">Class</span><span style="color: Gray;"> = </span><span style="color: Blue;">getDefinitionByName</span><span style="color: Olive;">(</span><span style="color: Blue;">typeName</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">Class</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//获取Class</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">registerClassAlias</span><span style="color: Olive;">(</span><span style="color: Blue;">packageName</span><span style="color: Gray;">, </span><span style="color: Teal;">type</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//注册Class</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">buffer</span><span style="color: Gray;">:</span><span style="color: Blue;">ByteArray</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ByteArray</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Blue;">writeObject</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Teal;">position</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">result</span><span style="color: Gray;">:</span><span style="color: Teal;">Object</span><span style="color: Gray;"> = </span><span style="color: Blue;">buffer</span><span style="color: Gray;">.</span><span style="color: Blue;">readObject</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">result</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>很不幸的是这个做法漏洞百出，首先构造器带参数的类不行，再就是对于复杂对象来说，其内部的属性的类往往也需要注册。这就涉及到一个判别属性的递归问题。也就涉及到AS3的反射机制了。如果运气好的话，也许用这种方法你自定义的类可以成功转化，但请记住，这个方法并不是一个通用的成熟的解决方案。</p>
<p>还有一个折中的解决方案，就是依然用ObjectUtil.copy()去处理复杂对象，但得到的结果不去强制转换。这样可以得到一个Object类型，里面的属性和源对象基本是相同的，但会少一些。将他们都用ByteArray.writeObject()写进ByteArray里，会发现ByteArray的长度不一样，复制得到的对象稍微小一些。原理还不清楚，估计和AS3的对象模型有关，我猜是少了原型那一部分。哪位高手知道，请赐教。</p>
<p>综上来说，在AS3中：</p>
<ol>
<li>如果你想拷贝深克隆Array，ArrayCollection，请用ObjectUtil.copy()方法，然后将返回的对象强制转换一下就可以了。当然前提是里面的元素是只能是前面提到的几个类型，不然只能转化为Object类型了，不过数据还在。</li>
<li>如果你想用序列化和反序列化的方法完全深克隆一个像Sprite这样的复杂对象，并将其进行正确的类型转化，对不起，不可以，至少在google能找到的网页上，没有人说可以。</li>
<li>如果你只是想复制一个复杂对象的数据，完全可以用ObjectUtil.copy()方法就可以了，你会得到一个Object类型的对象，属性名和源对象一样，只不过无法用编辑器的自动完成功能了：）。</li>
<li>如果你想深入研究这个问题，请从以下几方面入手：序列化和反序列化，AMF，AS3的反射机制，其他语言的深克隆的实现和机制，AS3的对象模型，AVM2的运行机制等，as3 byte code的格式等。</li>
</ol>
<p>另外，突然想到一个有意思的问题，假设AS3中有一个实现了深克隆的方法，那么对于两个互相引用的对象，会有什么样的结果呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diytz.cn/flex_as3_research/as3_deep_clone.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
Դ