<?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/"
	>

<channel>
	<title>Color Hook</title>
	<atom:link href="http://www.colorhook.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.colorhook.com/blog</link>
	<description>一个关于RIA的部落格</description>
	<pubDate>Sun, 22 Aug 2010 05:07:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>《3 idiots》观后感</title>
		<link>http://www.colorhook.com/blog/?p=719</link>
		<comments>http://www.colorhook.com/blog/?p=719#comments</comments>
		<pubDate>Fri, 06 Aug 2010 19:08:30 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[其它]]></category>

		<category><![CDATA[3 idiots]]></category>

		<category><![CDATA[三傻大闹宝莱坞]]></category>

		<category><![CDATA[电影]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=719</guid>
		<description><![CDATA[3 idiots是朋友@sammyliang力荐的一部电影，豆瓣上的评分也很优。看了之后感受到该片的艺术价值不小，紧密连贯的故事情节、前后铺垫的表现手法，美轮美奂的音乐舞蹈，还有深刻入微的人生哲理，都给人带来了丰富的视听享受，是值得墙裂强烈推荐的。
《肖申克的救赎》中有说生活中很多时候就是例行公事，因为平淡而深刻。回想一下，我们从小学到初中，从高中到大学，很多事情都形成了一种模式，一种游戏规则。每个人都要遵循规则，不遵循规则就会被视为异类，就会遭到抵制和扼杀，这是一种体制化。我想我们每个人都会有梦想，或者最初有梦想，但是经过10多年的“体制化教育”后，还有多少人触及的到那个梦想。大概梦想早就被融化，掠夺和取代了吧，剩下的只有吃饭，睡觉，打豆豆，岌岌于生，岌岌于死。
未经审视的生活是不值得过的，苏格拉底如是说。我们都希望生活的好，但是这个太难了，难的不是目标达不到，反而是目标太不明确了。每个人对“生活”的定义不一样，对“好”的定义又不一样，你认为这是生活，别人不同意；你认为这是好的，别人不赞同；更不巧的是我们往往把目标挂靠在持不同观点的人身上，直接抹杀了自己优秀的人生观和思想成果。摈弃他人不合理的看法吧，多多思考自己所经历的，所要经历的才能为自己的生活明确方向，明确参照物，而把参照物定位到别人身上都将是危险的。
有时候习惯了亦步亦趋，思考能力也就退化了。体制化是这样一种东西，一开始你排斥它，后来你习惯它，直到最后你离不开它。我想我得重新思考起来了，做一个有思想的人，不是为了与众不同，而是人生需要它产生勇气。
]]></description>
			<content:encoded><![CDATA[<p><a href='http://movie.douban.com/subject/3793023/'><strong>3 idiots</strong></a>是朋友<a href='http://twitter.com/sammyliang'>@sammyliang</a>力荐的一部电影，豆瓣上的评分也很优。看了之后感受到该片的艺术价值不小，紧密连贯的故事情节、前后铺垫的表现手法，美轮美奂的音乐舞蹈，还有深刻入微的人生哲理，都给人带来了丰富的视听享受，是值得<del>墙裂</del>强烈推荐的。</p>
<p>《肖申克的救赎》中有说生活中很多时候就是例行公事，因为平淡而深刻。回想一下，我们从小学到初中，从高中到大学，很多事情都形成了一种模式，一种游戏规则。每个人都要遵循规则，不遵循规则就会被视为异类，就会遭到抵制和扼杀，这是一种体制化。我想我们每个人都会有梦想，或者最初有梦想，但是经过10多年的“体制化教育”后，还有多少人触及的到那个梦想。大概梦想早就被融化，掠夺和取代了吧，剩下的只有吃饭，睡觉，<del>打豆豆，</del>岌岌于生，岌岌于死。</p>
<p>未经审视的生活是不值得过的，苏格拉底如是说。我们都希望生活的好，但是这个太难了，难的不是目标达不到，反而是目标太不明确了。每个人对“生活”的定义不一样，对“好”的定义又不一样，你认为这是生活，别人不同意；你认为这是好的，别人不赞同；更不巧的是我们往往把目标挂靠在持不同观点的人身上，直接抹杀了自己优秀的人生观和思想成果。摈弃他人不合理的看法吧，多多思考自己所经历的，所要经历的才能为自己的生活明确方向，明确参照物，而把参照物定位到别人身上都将是危险的。</p>
<p>有时候习惯了亦步亦趋，思考能力也就退化了。体制化是这样一种东西，一开始你排斥它，后来你习惯它，直到最后你离不开它。我想我得重新思考起来了，做一个有思想的人，不是为了与众不同，而是人生需要它产生勇气。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=719</wfw:commentRss>
		</item>
		<item>
		<title>发布as-spring 2.4</title>
		<link>http://www.colorhook.com/blog/?p=706</link>
		<comments>http://www.colorhook.com/blog/?p=706#comments</comments>
		<pubDate>Wed, 04 Aug 2010 14:36:31 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[ActionScript]]></category>

		<category><![CDATA[as-spring]]></category>

		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=706</guid>
		<description><![CDATA[ActionScript作为一个编译型(解释+编译)语言，经常需要把一些变量存在外部文件中，如XML文档。但是经常去解析XML文件就不是一件令人愉快的事情，而且变化点不是String, Number等基本类型的话，解析完XML后还要做更多的事情，于是as-spring诞生了。
as-spring是我的一个基于Flash平台的类库，作为一个Ioc反射框架，它在平时工作中给我带来了很多便利。我以前有过几篇博客提到过它：

在ActionScript中使用简单的Spring框架来实现IOC
使用Spring来配置RemoteObject
发布as-spring 2.1

这次升级加入了部分新的特征，用来消除使用过程中遇到的一些不便之处。具体特征如下：
1. 简化基本类型的数据类型定义
以前定义一个Bean都是用&#60;bean&#62;标签来定义，如果我要定义一个String类型的Bean，需要这样来定义：

&#60;bean class='String'&#62;
    &#60;constructor-arg value='This is a String'/&#62;
&#60;/bean&#62;

现在可以用&#60;element&#62;标签来定义：

&#60;element value='This is a String' type='String'/&#62;


2. 增加了数组定义
以前定义数组没有好的方法，特别是当数组的元素不是基本类型时。现在可以用&#60;list&#62;标签来定义：

&#60;list id='arr'&#62;
    &#60;element value='true'/&#62;
    &#60;bean&#62;
    &#60;/bean&#62;
    &#60;list&#62;
    &#60;/list&#62;
&#60;/list&#62;

3. 增加了Hash Object的定义
这个功能其实在以前就可以很方便的实现，只是现在加入了一个更符合思维的定义方式：

&#60;map&#62;
    &#60;key name='apple' value='[iPhone,iPad]'&#62;
    &#60;key name='google'&#62;
  [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScript作为一个编译型(解释+编译)语言，经常需要把一些变量存在外部文件中，如XML文档。但是经常去解析XML文件就不是一件令人愉快的事情，而且变化点不是String, Number等基本类型的话，解析完XML后还要做更多的事情，于是<a href='http://code.google.com/p/as-spring'><strong>as-spring</strong></a>诞生了。</p>
<p><a href='http://code.google.com/p/as-spring'><strong>as-spring</strong></a>是我的一个基于Flash平台的类库，作为一个Ioc反射框架，它在平时工作中给我带来了很多便利。我以前有过几篇博客提到过它：</p>
<ol>
<li><a href='http://www.colorhook.com/blog/?p=142'>在ActionScript中使用简单的Spring框架来实现IOC</li>
<li><a href='http://www.colorhook.com/blog/?p=214'>使用Spring来配置RemoteObject</a></li>
<li><a href='http://www.colorhook.com/blog/?p=378'>发布as-spring 2.1</a></li>
</ol>
<p>这次升级加入了部分新的特征，用来消除使用过程中遇到的一些不便之处。具体特征如下：</P></p>
<h5>1. 简化基本类型的数据类型定义</h5>
<p>以前定义一个Bean都是用<strong>&lt;bean&gt;</strong>标签来定义，如果我要定义一个String类型的Bean，需要这样来定义：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">'String'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;constructor-arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'This is a String'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>现在可以用<strong>&lt;element&gt;</strong>标签来定义：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'This is a String'</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">'String'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

</p>
<h5>2. 增加了数组定义</h5>
<p>以前定义数组没有好的方法，特别是当数组的元素不是基本类型时。现在可以用<strong>&lt;list&gt;</strong>标签来定义：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;list</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">'arr'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'true'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h5>3. 增加了Hash Object的定义</h5>
<p>这个功能其实在以前就可以很方便的实现，只是现在加入了一个更符合思维的定义方式：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">'apple'</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'[iPhone,iPad]'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">'google'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>android<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">'ms'</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
               <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'XP'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
               <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'Vista'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
               <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">'Win7'</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/map<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

</p>
<p>本来打算加入对flash.utils.Dictionary的定义的，最后还是放弃了，主要是因为暂时没有遇到迫切需要Dictionary的应用场景，如果以后遇到了，可以考虑加入这个功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=706</wfw:commentRss>
		</item>
		<item>
		<title>使用ActionScript更新{新浪微博}</title>
		<link>http://www.colorhook.com/blog/?p=702</link>
		<comments>http://www.colorhook.com/blog/?p=702#comments</comments>
		<pubDate>Tue, 03 Aug 2010 19:28:22 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[ActionScript]]></category>

		<category><![CDATA[sina]]></category>

		<category><![CDATA[SNS]]></category>

		<category><![CDATA[新浪微博]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=702</guid>
		<description><![CDATA[新浪微博作为一个微博应用在国内还是比较流行的，至少我周围的人就有很多是她的用户。由于新浪微博开放了类似twitter的API, 所以有一部分推友使用了twitter至新浪微博的同步脚本，这里我想使用ActionScript来更新一个新浪微博。
通过API来更新新浪微博有一个前提条件，就是需要注册成为sina的开发者，并创建一个应用还获得一个app key。这些不在详述，具体请参考新浪微博官方站点。获得app key后就可以开始使用ActionScript来正常调用相关API了。
这里我没有使用号称相对安全的OAuth方式登陆，而是使用更直接的Basic Authorization来通过验证，下面是完整代码：

//Define parameters
var username:String='新浪微博用户名';
var password:String='新浪微博密码';
var source:String='新浪微博app key';
var API_URL:String='http://api.t.sina.com.cn';  //新浪微博API domain
var status:String='需要更新的状态';
&#160;
//define HTTP request
var encodedCredentials:String=Base64.encode&#40;username + &#34;:&#34; + password&#41;;
var authHeader:URLRequestHeader=new URLRequestHeader&#40;&#34;Authorization&#34;, 
                               [...]]]></description>
			<content:encoded><![CDATA[<p>新浪微博作为一个微博应用在国内还是比较流行的，至少我周围的人就有很多是她的用户。由于新浪微博开放了类似twitter的API, 所以有一部分推友使用了twitter至新浪微博的同步脚本，这里我想使用ActionScript来更新一个新浪微博。</p>
<p>通过API来更新新浪微博有一个前提条件，就是需要注册成为sina的开发者，并创建一个应用还获得一个app key。这些不在详述，具体请参考新浪微博官方站点。获得app key后就可以开始使用ActionScript来正常调用相关API了。</p>
<p>这里我没有使用号称相对安全的OAuth方式登陆，而是使用更直接的Basic Authorization来通过验证，下面是完整代码：</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">//Define parameters</span>
<span style="color: #000000; font-weight: bold;">var</span> username:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'新浪微博用户名'</span>;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">password</span>:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'新浪微博密码'</span>;
<span style="color: #000000; font-weight: bold;">var</span> source:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'新浪微博app key'</span>;
<span style="color: #000000; font-weight: bold;">var</span> API_URL:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'http://api.t.sina.com.cn'</span>;  <span style="color: #808080; font-style: italic;">//新浪微博API domain</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">status</span>:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'需要更新的状态'</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//define HTTP request</span>
<span style="color: #000000; font-weight: bold;">var</span> encodedCredentials:<span style="color: #0066CC;">String</span>=Base64.<span style="color: #006600;">encode</span><span style="color: #66cc66;">&#40;</span>username + <span style="color: #ff0000;">&quot;:&quot;</span> + <span style="color: #0066CC;">password</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> authHeader:URLRequestHeader=<span style="color: #000000; font-weight: bold;">new</span> URLRequestHeader<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Authorization&quot;</span>, 
                                               <span style="color: #ff0000;">&quot;Basic &quot;</span> + encodedCredentials<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">url</span>:<span style="color: #0066CC;">String</span> = API_URL+ <span style="color: #ff0000;">'/statuses/update.xml'</span>;
<span style="color: #000000; font-weight: bold;">var</span> request:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">url</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> variables:URLVariables = <span style="color: #000000; font-weight: bold;">new</span> URLVariables<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
variables.<span style="color: #006600;">source</span> = source;
variables.<span style="color: #0066CC;">status</span> = <span style="color: #0066CC;">status</span>;
request.<span style="color: #0066CC;">data</span> = variables;
request.<span style="color: #006600;">requestHeaders</span>.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>authHeader<span style="color: #66cc66;">&#41;</span>;
request.<span style="color: #006600;">method</span> = <span style="color: #ff0000;">'POST'</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//send HTTP request.</span>
<span style="color: #000000; font-weight: bold;">var</span> loader:URLLoader=<span style="color: #000000; font-weight: bold;">new</span> URLLoader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
loader.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, onLoaderComplete<span style="color: #66cc66;">&#41;</span>;
loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span>request<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//HTTP response</span>
<span style="color: #000000; font-weight: bold;">function</span> onLoaderComplete<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">trace</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span>.<span style="color: #0066CC;">data</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>这里只用到1个外部类Base64，用于HTTP请求中对用户名密码进行加密，该类可以从<a href='http://code.google.com/p/as3crypto/'>as3crypto</a>类库中获得。</P></p>
<p>下载Base64外部库后，设置好正确的classpath，然后替换相关参数，执行代码来更新你的新浪微博吧。</p>
<p>have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=702</wfw:commentRss>
		</item>
		<item>
		<title>Windows下配置gedit笔记</title>
		<link>http://www.colorhook.com/blog/?p=693</link>
		<comments>http://www.colorhook.com/blog/?p=693#comments</comments>
		<pubDate>Sun, 18 Jul 2010 09:20:39 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[gedit]]></category>

		<category><![CDATA[zen coding]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=693</guid>
		<description><![CDATA[下载gedit for Windows
gedit作为Ubuntu默认的编辑器轻便快捷，简单易用，得益于插件机制，扩展起来也很方便。加上Zen Coding的支持，把它作为前端开发的IDE是十分合适的。Windows下的binary版本可以这个网址找到：http://live.gnome.org/Gedit/Windows.
安装Zen Coding插件
Zen Coding是快速开发HTML/CSS的一种方式，如果没听过Zen Coding?这里有介绍，还有Google Code上的wiki。为gedit准备的插件zen-coding-gedit可以从github下载。
安装ActionScript, MXML和GLSL语法高亮插件
gedit集成了很多语言的高亮显示，但是默认没有支持ActionScript，打开as文件或mxml文件却看不到花花绿绿的颜色，这是很难令作为Flash开发者接受的，如果有Flash方面的开发需求，相关的高亮插件可以在 http://conic.se/blog/posts/8/下载。
有待增强的地方

文件关联需要去安装路径浏览exe文件
许多插件无法使用

]]></description>
			<content:encoded><![CDATA[<h5>下载gedit for Windows</h5>
<p>gedit作为Ubuntu默认的编辑器轻便快捷，简单易用，得益于插件机制，扩展起来也很方便。加上Zen Coding的支持，把它作为前端开发的IDE是十分合适的。Windows下的binary版本可以这个网址找到：<a href='http://live.gnome.org/Gedit/Windows'>http://live.gnome.org/Gedit/Windows</a>.</p>
<h5>安装Zen Coding插件</h5>
<p>Zen Coding是快速开发HTML/CSS的一种方式，如果没听过Zen Coding?<a href="http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/">这里</a>有介绍，还有<a href="http://code.google.com/p/zen-coding/wiki/Actions">Google Code上的wiki</a>。为gedit准备的插件<a href="http://github.com/mikecrittenden/zen-coding-gedit">zen-coding-gedit</a>可以从github下载。</p>
<h5>安装ActionScript, MXML和GLSL语法高亮插件</h5>
<p>gedit集成了很多语言的高亮显示，但是默认没有支持ActionScript，打开as文件或mxml文件却看不到花花绿绿的颜色，这是很难令作为Flash开发者接受的，如果有Flash方面的开发需求，相关的高亮插件可以在 <a href="http://conic.se/blog/posts/8/">http://conic.se/blog/posts/8/</a>下载。</p>
<h5>有待增强的地方</h5>
<ul>
<li>文件关联需要去安装路径浏览exe文件</li>
<li>许多插件无法使用</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=693</wfw:commentRss>
		</item>
		<item>
		<title>辞职之工作杂感</title>
		<link>http://www.colorhook.com/blog/?p=689</link>
		<comments>http://www.colorhook.com/blog/?p=689#comments</comments>
		<pubDate>Sat, 10 Jul 2010 17:00:52 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=689</guid>
		<description><![CDATA[这周拿到了离职证明，离开了呆了近21个月的公司BrightCreek, 一家以人为本，以创造力为盈利筹码的高新企业。在过去的1年多，我见证了公司的发展和变更，参与了各种各样的软件项目，写过各种各样的程序语言。
想当初在20世纪五六十年代，那时候的程序被记录在打孔卡片上，我从来没有见过这种卡片，但是听说那时候的程序非常严谨，不仅精简，而且优美，出错极少。因为当时运行程序的代价十分昂贵，有限的主机时间需要预约，所以程序的返工和修改都是不应该发生的。那时候的软件开发如同神话一样充满了传奇色彩。
反观今日，程序的编写不再那么难以进行，打开电脑就可以轻易地进行软件开发，Windows，Mac OS, GUN/Linux各种操作系统下都有成熟的IEDIDE, 软件开发不再那么遥不可及，甚至任何人都可以通过简单的拖拽动作来完成了一个软件界面。但是如今软件的质量不再那么可靠，软件崩溃愈演愈烈，软件垃圾愈来愈多，项目经常被延期，挂起和终止，而造成这一现象的原因却着实令人费解。
我开始回忆在所做项目中自己有用到的语言，印象中有ActionScript, HTML, CSS, JavaScript, PHP, ColdFusion, Java, C#, SQL, 其中JavaScript这块用到的Ajax库有jQuery, Ext, Mootools, Dojo. 想到这里，我也略微知道项目经常失败的原因了:当项目中重要的部分由不称职的人担当着是极其危险的。
某种语言出身的程序员会被投入到另一种语言相关的项目中去，这种情况经常会发生，不是发生在别人身上，就是发生在自己身上。刚开始该程序员会本着依赖于原有程序的思维模式去写新的语言，加上不熟悉新语言的API，写出惨不忍睹的程序真是太容易了，更加杯具的是，这个时候要是没有一个老鸟在旁边指正指导，对于该程序员和项目都是一种灾难。从成本价值的角度去分析，这是一次失败的投资战略，程序员花了时间和精力去越过一条陡峭的学习曲线，得到的只是三流的经验；项目在前期表面上进行的顺利，中后期将越来越杂乱，最后变得难以维护。
如果不幸你成为了上面那个程序员，我想说的是：请寻找正确的学习途径，切忌盲目操刀，不求甚解。
项目遇到缺少专业人员的情况时，最有效的对策应该是找一个合适的人。招人简单吗？很不简单。至少从实际效果上看是这样。招一个自己满意甚至准满意的人都是十分困难的。我面过6、7个前端的职位（是能立马做事的那种），却发现没一个合格的，那时候觉得HR真是神了，每次电话请过来面试的人都是服务器端的程序员。而且从招聘网站上，我也发现很多小公司会对某个职位持续地招聘2、3年，这显然是招人难的侧面表现。
如果觉得招人困难的时候就要花时间去培养了。培养简单吗？也不简单。特别是对于小公司来讲，具备软件技能培养能力的人少之又少，,而且这种人都被拉去做事了，哪有时间去培养其他人。而且软件领域里各个层面都充斥着领域专家。要一个Java程序员心甘情愿地去受一个JavaScript程序员的培训很可能就不是一样很顺利的事情。
如果公司缺少优秀的人才就去赶紧招聘，猎头很多时候是不靠谱的，我这么说可能引起了猎头们的不满，那换一种说法，猎头极少时候是靠谱的。如果没有资金和条件吸引优秀的人才，就花时间和能力去培养，如果连培养的时间和能力也不具备，那就等着杯具吧。
]]></description>
			<content:encoded><![CDATA[<p>这周拿到了离职证明，离开了呆了近21个月的公司BrightCreek, 一家以人为本，以创造力为盈利筹码的高新企业。在过去的1年多，我见证了公司的发展和变更，参与了各种各样的软件项目，写过各种各样的程序语言。</p>
<p>想当初在20世纪五六十年代，那时候的程序被记录在打孔卡片上，我从来没有见过这种卡片，但是听说那时候的程序非常严谨，不仅精简，而且优美，出错极少。因为当时运行程序的代价十分昂贵，有限的主机时间需要预约，所以程序的返工和修改都是不应该发生的。那时候的软件开发如同神话一样充满了传奇色彩。</p>
<p>反观今日，程序的编写不再那么难以进行，打开电脑就可以轻易地进行软件开发，Windows，Mac OS, GUN/Linux各种操作系统下都有成熟的<del>IED</del><ins>IDE</ins>, 软件开发不再那么遥不可及，甚至任何人都可以通过简单的拖拽动作来完成了一个软件界面。但是如今软件的质量不再那么可靠，软件崩溃愈演愈烈，软件垃圾愈来愈多，项目经常被延期，挂起和终止，而造成这一现象的原因却着实令人费解。</p>
<p>我开始回忆在所做项目中自己有用到的语言，印象中有ActionScript, HTML, CSS, JavaScript, PHP, ColdFusion, Java, C#, SQL, 其中JavaScript这块用到的Ajax库有jQuery, Ext, Mootools, Dojo. 想到这里，我也略微知道项目经常失败的原因了:<strong>当项目中重要的部分由不称职的人担当着是极其危险的</strong>。</p>
<p>某种语言出身的程序员会被投入到另一种语言相关的项目中去，这种情况经常会发生，不是发生在别人身上，就是发生在自己身上。刚开始该程序员会本着依赖于原有程序的思维模式去写新的语言，加上不熟悉新语言的API，写出惨不忍睹的程序真是太容易了，更加杯具的是，这个时候要是没有一个老鸟在旁边指正指导，对于该程序员和项目都是一种灾难。从成本价值的角度去分析，这是一次失败的投资战略，程序员花了时间和精力去越过一条陡峭的学习曲线，得到的只是三流的经验；项目在前期表面上进行的顺利，中后期将越来越杂乱，最后变得难以维护。</p>
<p>如果不幸你成为了上面那个程序员，我想说的是：<strong>请寻找正确的学习途径，切忌盲目操刀，不求甚解。</strong></p>
<p>项目遇到缺少专业人员的情况时，最有效的对策应该是找一个合适的人。招人简单吗？很不简单。至少从实际效果上看是这样。招一个自己满意甚至准满意的人都是十分困难的。我面过6、7个前端的职位（是能立马做事的那种），却发现没一个合格的，那时候觉得HR真是神了，每次电话请过来面试的人都是服务器端的程序员。而且从招聘网站上，我也发现很多小公司会对某个职位持续地招聘2、3年，这显然是招人难的侧面表现。</p>
<p>如果觉得招人困难的时候就要花时间去培养了。培养简单吗？也不简单。特别是对于小公司来讲，具备软件技能培养能力的人少之又少，,而且这种人都被拉去做事了，哪有时间去培养其他人。而且软件领域里各个层面都充斥着领域专家。要一个Java程序员心甘情愿地去受一个JavaScript程序员的培训很可能就不是一样很顺利的事情。</p>
<p>如果公司缺少优秀的人才就去赶紧招聘，猎头很多时候是不靠谱的，我这么说可能引起了猎头们的不满，那换一种说法，猎头极少时候是靠谱的。如果没有资金和条件吸引优秀的人才，就花时间和能力去培养，如果连培养的时间和能力也不具备，那就等着杯具吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=689</wfw:commentRss>
		</item>
		<item>
		<title>AIR2对HTML5的支持力度</title>
		<link>http://www.colorhook.com/blog/?p=684</link>
		<comments>http://www.colorhook.com/blog/?p=684#comments</comments>
		<pubDate>Sun, 20 Jun 2010 13:16:10 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[AIR]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=684</guid>
		<description><![CDATA[html5test是一个测试浏览器对HTML5支持情况的一个web应用。在github上可以看到作者公布的一些测试结果。Adobe AIR2对HTML5, CSS3都提供了增强，我记得用html5test对AIR1.5的测试结果在20分左右，今天再用它测试一个AIR2。demo代码如下：

&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;s:WindowedApplication xmlns:fx=&#34;http://ns.adobe.com/mxml/2009&#34; 
					   xmlns:s=&#34;library://ns.adobe.com/flex/spark&#34; 
					   xmlns:mx=&#34;library://ns.adobe.com/flex/mx&#34;
					   creationComplete=&#34;init()&#34;&#62;
	&#60;fx:Script&#62;
		&#60;!&#91;CDATA&#91;
			import spark.components.Group;
			import spark.core.SpriteVisualElement;
&#160;
			protected var htmlLoader:HTMLLoader;
			protected var htmlUI:SpriteVisualElement;
&#160;
			private function init&#40;&#41;:void&#123;
				htmlLoader=new HTMLLoader&#40;&#41;;
				htmlLoader.width=800;
				htmlLoader.height=this.height;
				htmlLoader.load&#40;new URLRequest&#40;'http://html5test.com'&#41;&#41;;
				htmlUI=new SpriteVisualElement&#40;&#41;;
				htmlUI.addChild&#40;htmlLoader&#41;;
				this.addElement&#40;htmlUI&#41;;
			&#125;
		&#93;&#93;&#62;
	&#60;/fx:Script&#62;
&#60;/s:WindowedApplication&#62;

运行后发现得分依然是很低——46分，跟Android 1.6的得分42分差不多，不过跟iPhone, iPod touch的120多的得分来比真是差的很远。Adobe官方有一篇文章讲到了AIR2对HTML, CSS, JavasScript的支持情况以及不支持的个中缘由。
]]></description>
			<content:encoded><![CDATA[<p><a href='http://html5test.com'>html5test</a>是一个测试浏览器对HTML5支持情况的一个web应用。在github上可以看到作者公布的一些<a href="http://wiki.github.com/NielsLeenheer/html5test/">测试结果</a>。Adobe AIR2对HTML5, CSS3都提供了增强，我记得用html5test对AIR1.5的测试结果在20分左右，今天再用它测试一个AIR2。demo代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;s:WindowedApplication</span> xmlns:fx=<span style="color: #ff0000;">&quot;http://ns.adobe.com/mxml/2009&quot;</span> </span>
<span style="color: #000000;">					   xmlns:s=<span style="color: #ff0000;">&quot;library://ns.adobe.com/flex/spark&quot;</span> </span>
<span style="color: #000000;">					   xmlns:mx=<span style="color: #ff0000;">&quot;library://ns.adobe.com/flex/mx&quot;</span></span>
<span style="color: #000000;">					   creationComplete=<span style="color: #ff0000;">&quot;init()&quot;</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;fx:Script</span><span style="color: #7400FF;">&gt;</span></span>
		<span style="color: #000000;">&lt;!<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span></span>
<span style="color: #000000;">			import spark.components.Group;</span>
<span style="color: #000000;">			import spark.core.SpriteVisualElement;</span>
&nbsp;
<span style="color: #000000;">			protected var htmlLoader:HTMLLoader;</span>
<span style="color: #000000;">			protected var htmlUI:SpriteVisualElement;</span>
&nbsp;
<span style="color: #000000;">			private function init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:void<span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">				htmlLoader=new HTMLLoader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">				htmlLoader.width=<span style="color: #cc66cc;">800</span>;</span>
<span style="color: #000000;">				htmlLoader.height=this.height;</span>
<span style="color: #000000;">				htmlLoader.load<span style="color: #66cc66;">&#40;</span>new URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'http://html5test.com'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">				htmlUI=new SpriteVisualElement<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">				htmlUI.addChild<span style="color: #66cc66;">&#40;</span>htmlLoader<span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">				this.addElement<span style="color: #66cc66;">&#40;</span>htmlUI<span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">			<span style="color: #66cc66;">&#125;</span></span>
<span style="color: #000000;">		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/fx:Script</span><span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/s:WindowedApplication</span><span style="color: #7400FF;">&gt;</span></span></pre></div></div>

<p>运行后发现得分依然是很低——46分，跟Android 1.6的得分42分差不多，不过跟iPhone, iPod touch的120多的得分来比真是差的很远。Adobe官方有<a href="http://www.adobe.com/devnet/air/ajax/articles/air_and_webkit.html">一篇文章</a>讲到了AIR2对HTML, CSS, JavasScript的支持情况以及不支持的个中缘由。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=684</wfw:commentRss>
		</item>
		<item>
		<title>使用AIR2录制音频</title>
		<link>http://www.colorhook.com/blog/?p=670</link>
		<comments>http://www.colorhook.com/blog/?p=670#comments</comments>
		<pubDate>Sun, 20 Jun 2010 12:10:42 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[AIR]]></category>

		<category><![CDATA[音频录制]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=670</guid>
		<description><![CDATA[AIR2的正式版总算是出来了，前些天SDK也放出来了，于是就鼓捣一下它的一些新特性，其中一个特性就是录制Microphone，本地录制，本地存储，不需要FMS的协助。
为了完成这个录制Microphone的功能，我们需要先做如下事情：

下载AIR2 SDK并覆盖到Flash Builder的SDK中。
下载adobe官方用于保存WAV音频的开源库WAVWriter。

接下来，新建一个AIR2工程，为了力求简单，本例中只用一个按钮，用于开始录制和停止录制。UI代码大致如下:

&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;s:WindowedApplication xmlns:fx=&#34;http://ns.adobe.com/mxml/2009&#34; 
				xmlns:s=&#34;library://ns.adobe.com/flex/spark&#34; 
				xmlns:mx=&#34;library://ns.adobe.com/flex/mx&#34;
			        creationComplete=&#34;init()&#34;&#62;
        &#60;fx:Script&#62;
		&#60;!&#91;CDATA&#91;
                &#93;&#93;&#62;
	&#60;/fx:Script&#62;
	&#60;s:layout&#62;
		&#60;s:VerticalLayout paddingTop=&#34;10&#34; horizontalAlign=&#34;center&#34;/&#62;
	&#60;/s:layout&#62;
	&#60;s:Button id='controlBtn' label=&#34;{controlBtnLabel}&#34; click=&#34;clickHandler()&#34;/&#62;
&#60;/s:WindowedApplication&#62;

下面开始编写逻辑代码，程序启动后，初始化Microphone， 设置音频文件保存路径。

import com.adobe.audio.format.WAVWriter;
import mx.controls.Alert;
&#160;
protected var targetFile:File;
protected var microphone:Microphone;
protected var recordedData:ByteArray;
&#160;
private var [...]]]></description>
			<content:encoded><![CDATA[<p>AIR2的正式版总算是出来了，前些天SDK也放出来了，于是就鼓捣一下它的一些新特性，其中一个特性就是录制Microphone，本地录制，本地存储，不需要FMS的协助。</p>
<p>为了完成这个录制Microphone的功能，我们需要先做如下事情：</p>
<ol>
<li>下载<a href='http://labs.adobe.com/technologies/air/'>AIR2 SDK</a>并覆盖到Flash Builder的SDK中。</li>
<li>下载adobe官方用于保存WAV音频的开源库<a href='http://code.google.com/p/ghostcat/source/browse/trunk/ghostcatfp10/src/ghostcat/media/WAVWriter.as?spec=svn424&#038;r=424'>WAVWriter</a>。</li>
</ol>
<p>接下来，新建一个AIR2工程，为了力求简单，本例中只用一个按钮，用于开始录制和停止录制。UI代码大致如下:</p>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;s:WindowedApplication</span> xmlns:fx=<span style="color: #ff0000;">&quot;http://ns.adobe.com/mxml/2009&quot;</span> </span>
<span style="color: #000000;">				xmlns:s=<span style="color: #ff0000;">&quot;library://ns.adobe.com/flex/spark&quot;</span> </span>
<span style="color: #000000;">				xmlns:mx=<span style="color: #ff0000;">&quot;library://ns.adobe.com/flex/mx&quot;</span></span>
<span style="color: #000000;">			        creationComplete=<span style="color: #ff0000;">&quot;init()&quot;</span><span style="color: #7400FF;">&gt;</span></span>
        <span style="color: #000000;"><span style="color: #7400FF;">&lt;fx:Script</span><span style="color: #7400FF;">&gt;</span></span>
		<span style="color: #000000;">&lt;!<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span></span>
<span style="color: #000000;">                <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/fx:Script</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;s:layout</span><span style="color: #7400FF;">&gt;</span></span>
		<span style="color: #000000;"><span style="color: #7400FF;">&lt;s:VerticalLayout</span> paddingTop=<span style="color: #ff0000;">&quot;10&quot;</span> horizontalAlign=<span style="color: #ff0000;">&quot;center&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/s:layout</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;s:Button</span> id=<span style="color: #ff0000;">'controlBtn'</span> label=<span style="color: #ff0000;">&quot;{controlBtnLabel}&quot;</span> click=<span style="color: #ff0000;">&quot;clickHandler()&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/s:WindowedApplication</span><span style="color: #7400FF;">&gt;</span></span></pre></div></div>

<p>下面开始编写逻辑代码，程序启动后，初始化Microphone， 设置音频文件保存路径。</pre>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">import</span> com.<span style="color: #006600;">adobe</span>.<span style="color: #006600;">audio</span>.<span style="color: #006600;">format</span>.<span style="color: #006600;">WAVWriter</span>;
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">controls</span>.<span style="color: #006600;">Alert</span>;
&nbsp;
protected <span style="color: #000000; font-weight: bold;">var</span> targetFile:File;
protected <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">microphone</span>:<span style="color: #0066CC;">Microphone</span>;
protected <span style="color: #000000; font-weight: bold;">var</span> recordedData:ByteArray;
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> recordFlag:<span style="color: #0066CC;">Boolean</span>=<span style="color: #000000; font-weight: bold;">false</span>;
<span style="color: #0066CC;">private</span> <span style="color: #0066CC;">static</span> const START_RECORD:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'start recording'</span>;
<span style="color: #0066CC;">private</span> <span style="color: #0066CC;">static</span> const STOP_RECORD:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">'stop recording'</span>;
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> controlBtnLabel:<span style="color: #0066CC;">String</span>=START_RECORD;
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span><span style="color: #0066CC;">Microphone</span>.<span style="color: #006600;">isSupported</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Cannot find a Microphone&quot;</span><span style="color: #66cc66;">&#41;</span>;
		controlBtn.<span style="color: #0066CC;">enabled</span>=<span style="color: #000000; font-weight: bold;">false</span>;
		<span style="color: #b1b100;">return</span>;
	<span style="color: #66cc66;">&#125;</span>
	targetFile = <span style="color: #000000; font-weight: bold;">new</span> File<span style="color: #66cc66;">&#40;</span>File.<span style="color: #006600;">desktopDirectory</span>.<span style="color: #006600;">nativePath</span>+<span style="color: #ff0000;">&quot;/sound.mp3&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #0066CC;">microphone</span> = <span style="color: #0066CC;">Microphone</span>.<span style="color: #006600;">getMicrophone</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #0066CC;">microphone</span>.<span style="color: #0066CC;">setSilenceLevel</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #0066CC;">microphone</span>.<span style="color: #0066CC;">rate</span> = <span style="color: #cc66cc;">44</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>然后处理按钮的动作，执行开始录制或停止录制操作。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> clickHandler<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>recordFlag<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		controlBtnLabel=START_RECORD;
		recordFlag=<span style="color: #000000; font-weight: bold;">false</span>;
		<span style="color: #0066CC;">this</span>.<span style="color: #006600;">stopRecording</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #66cc66;">&#123;</span>
		controlBtnLabel=STOP_RECORD;
		recordFlag=<span style="color: #000000; font-weight: bold;">true</span>;
		<span style="color: #0066CC;">this</span>.<span style="color: #006600;">startRecording</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>开始录制时，先删除原有的音频文件，然后监听Microphone的<code>SampleDataEvent.SAMPLE_DATA</code>事件。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> startRecording<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>targetFile.<span style="color: #006600;">exists</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		targetFile.<span style="color: #006600;">deleteFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
	recordedData=<span style="color: #000000; font-weight: bold;">new</span> ByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #0066CC;">microphone</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>SampleDataEvent.<span style="color: #006600;">SAMPLE_DATA</span>, onMicData<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onMicData<span style="color: #66cc66;">&#40;</span>event:SampleDataEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
	recordedData.<span style="color: #006600;">writeBytes</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #0066CC;">data</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>当点击了停止录制时，移除Microphone的事件监听，并使用<code>WAVWriter</code>来生成一个音频文件。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> stopRecording<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">microphone</span>.<span style="color: #006600;">removeEventListener</span><span style="color: #66cc66;">&#40;</span>SampleDataEvent.<span style="color: #006600;">SAMPLE_DATA</span>, onMicData<span style="color: #66cc66;">&#41;</span>;
	saveWAV<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> saveWAV<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> wavWriter:WAVWriter = <span style="color: #000000; font-weight: bold;">new</span> WAVWriter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> stream:FileStream = <span style="color: #000000; font-weight: bold;">new</span> FileStream<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	recordedData.<span style="color: #0066CC;">position</span> = <span style="color: #cc66cc;">0</span>;
	wavWriter.<span style="color: #006600;">numOfChannels</span> = <span style="color: #cc66cc;">1</span>;
	wavWriter.<span style="color: #006600;">sampleBitRate</span> = <span style="color: #cc66cc;">16</span>;
	wavWriter.<span style="color: #006600;">samplingRate</span> = <span style="color: #cc66cc;">44100</span>;               
&nbsp;
	stream.<span style="color: #006600;">open</span><span style="color: #66cc66;">&#40;</span> targetFile, FileMode.<span style="color: #006600;">WRITE</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
	wavWriter.<span style="color: #006600;">processSamples</span><span style="color: #66cc66;">&#40;</span> stream, recordedData, <span style="color: #cc66cc;">44100</span>, <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span>;
	stream.<span style="color: #0066CC;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=670</wfw:commentRss>
		</item>
		<item>
		<title>控制反转之引导用户</title>
		<link>http://www.colorhook.com/blog/?p=666</link>
		<comments>http://www.colorhook.com/blog/?p=666#comments</comments>
		<pubDate>Thu, 17 Jun 2010 20:18:07 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=666</guid>
		<description><![CDATA[软件项目为何总是延期，为何总是超出预算，最后产生的却还是烂产品？因素应该是多方面的，但是管理上肯定出了问题。管理是什么？一位朋友跟我说过无非就是三个词：计划、组织、控制。我们有计划吗？有。有组织吗？有。有控制吗？也有。但是控制明显不够。在“客户为王”的大背景下，软件从业者长期受到客户们的间接残害，疲于奔命于客户喜好和需求变化之间，然后还要高喊“拥抱变化”的积极口号。用户的控制太多了。
蔡學鏞老师在一篇博客一流的产品中把产品分成了一流、二流、三流3个等级，从文中可以发现跟着用户的想法来做产品反而只能作出三流的产品，做出一流产品却需要先于用户发现需求。另一位博友的东拉西扯：不要听用户的更是引用了多个例子来说明“听用户的”是多么的危险和有害。
但是，不听用户的又不行，毕竟最终由他们为产品买单。既然付了钱，他们也当然要跟踪产品的进度，于是各自的麻烦就来了，这种麻烦和痛苦在外包公司体现的尤为明显。软件行业是一个知识密集、劳动密集的行业，大大小小的分支领域都存在专家，也都需要专家。所以我觉得要想做好产品，需要和客户达成共同的目标，而具体怎么做不能让用户说了算。因为视觉上我们有专业的视觉设计师，交互上我们有专业的交互设计师，程序上有专业的架构师、前端工程师、后端工程师，即使某些专业人员有缺失，那也有准专业的人可以替代，至少比用户“专业”。所以我们要做的应该是引导用户，以完成高质量的产品为共同目标，而不是让客户牵着鼻子走。
]]></description>
			<content:encoded><![CDATA[<p>软件项目为何总是延期，为何总是超出预算，最后产生的却还是烂产品？因素应该是多方面的，但是管理上肯定出了问题。管理是什么？一位朋友跟我说过无非就是三个词：计划、组织、控制。我们有计划吗？有。有组织吗？有。有控制吗？也有。但是控制明显不够。在“客户为王”的大背景下，软件从业者长期受到客户们的间接残害，疲于奔命于客户喜好和需求变化之间，然后还要高喊“拥抱变化”的积极口号。用户的控制太多了。</p>
<p><a href='http://jerrylovesrebol.blogspot.com/'>蔡學鏞</a>老师在一篇博客<a href='http://jerrylovesrebol.blogspot.com/2010/06/blog-post_06.html'>一流的产品</a>中把产品分成了一流、二流、三流3个等级，从文中可以发现跟着用户的想法来做产品反而只能作出三流的产品，做出一流产品却需要先于用户发现需求。另一位博友的<a href='http://it.keso.cn/2007/07/05/dont-listen-to-users/'>东拉西扯：不要听用户的</a>更是引用了多个例子来说明“听用户的”是多么的危险和有害。</p>
<p>但是，不听用户的又不行，毕竟最终由他们为产品买单。既然付了钱，他们也当然要跟踪产品的进度，于是各自的麻烦就来了，这种麻烦和痛苦在外包公司体现的尤为明显。软件行业是一个知识密集、劳动密集的行业，大大小小的分支领域都存在专家，也都需要专家。所以我觉得要想做好产品，需要和客户达成共同的目标，而具体怎么做不能让用户说了算。因为视觉上我们有专业的视觉设计师，交互上我们有专业的交互设计师，程序上有专业的架构师、前端工程师、后端工程师，即使某些专业人员有缺失，那也有准专业的人可以替代，至少比用户“专业”。所以我们要做的应该是引导用户，以完成高质量的产品为共同目标，而不是让客户牵着鼻子走。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=666</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript 数组的 uniq 方法</title>
		<link>http://www.colorhook.com/blog/?p=659</link>
		<comments>http://www.colorhook.com/blog/?p=659#comments</comments>
		<pubDate>Tue, 25 May 2010 15:17:57 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=659</guid>
		<description><![CDATA[首先请原谅我这篇文章盗用了他人的标题，不信请看明城的这两篇博客：
JavaScript 数组的 uniq 方法
更新 JavaScript 数组的 uniq 方法

上面两篇讲的都是关于如何剔除数组中重复元素的问题，这里我把具体要求copy过来：

请给 Array 本地对象增加一个原型方法，它的用途是删除数组条目中重复的条目（可能有多个），
返回值是一个包含被删除的重复条目的新数组。


明城兄文中提及 undefined 元素无法过滤，意思可能是重复的undefined没有被剔除，如果是这个意思的话，那么这些问题同时也存在于NaN, 数组和对象上。朋友们可以试着运行一下下面的代码，它们都将返回false。

console.log&#40;NaN==NaN&#41;;
console.log&#40;&#91;&#93;==&#91;&#93;&#41;;
console.log&#40;&#123;&#125;==&#123;&#125;&#41;;

然后我用了另外一种方式来实现需求，下面这个方法可以过滤掉undefined, NaN, 甚至更复杂的对象。而且只用了一级的for循环，所以理论上它应该有更好的执行效率。

Array.prototype.uniq = function&#40;&#41; &#123;
    var resultArr = &#91;&#93;,
        returnArr = &#91;&#93;,
        len= this.length,
        map=&#123;&#125;;
&#160;
    [...]]]></description>
			<content:encoded><![CDATA[<p>首先请原谅我这篇文章盗用了他人的标题，不信请看<a href="http://www.gracecode.com/">明城</a>的这两篇博客：<br/><br />
<a href="http://www.gracecode.com/archives/319/">JavaScript 数组的 uniq 方法</a><br />
<a href="http://www.gracecode.com/page/111/">更新 JavaScript 数组的 uniq 方法</a>
</p>
<p>上面两篇讲的都是关于如何剔除数组中重复元素的问题，这里我把具体要求copy过来：</p>
<pre>
请给 Array 本地对象增加一个原型方法，它的用途是删除数组条目中重复的条目（可能有多个），
返回值是一个包含被删除的重复条目的新数组。
</pre>
</p>
<p><a href="http://www.gracecode.com/">明城</a>兄文中提及 undefined 元素无法过滤，意思可能是重复的undefined没有被剔除，如果是这个意思的话，那么这些问题同时也存在于NaN, 数组和对象上。朋友们可以试着运行一下下面的代码，它们都将返回false。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>NaN<span style="color: #339933;">==</span>NaN<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">==</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>然后我用了另外一种方式来实现需求，下面这个方法可以过滤掉undefined, NaN, 甚至更复杂的对象。而且只用了一级的for循环，所以理论上它应该有更好的执行效率。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Array.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">uniq</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> resultArr <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        returnArr <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        len<span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span><span style="color: #339933;">,</span>
        map<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> len<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>map<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            returnArr.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            resultArr.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            map<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span> <span style="color: #339933;">=</span> len <span style="color: #339933;">=</span> resultArr.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> len <span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> resultArr<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">return</span> returnArr<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>事实上它在firefox, safari, Opera上都有很好的表现，但是在Google Chrome 4上执行却花费了更多的时间，这个结果让人很丧气，我开始逐行代码找原因，最后发现<strong>if(map[item])</strong>这一行是问题所在之处，之后我迭代了数十万次来对Object进行取值操作，发现Chrome对这个操作确实表现的很“迟钝”。个中缘由有待代码达人们去挖掘了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=659</wfw:commentRss>
		</item>
		<item>
		<title>继AIR 2 RC1发布后更新Twitter Air至0.5</title>
		<link>http://www.colorhook.com/blog/?p=655</link>
		<comments>http://www.colorhook.com/blog/?p=655#comments</comments>
		<pubDate>Wed, 12 May 2010 16:22:05 +0000</pubDate>
		<dc:creator>ColorHook</dc:creator>
		
		<category><![CDATA[Develop & Design]]></category>

		<category><![CDATA[AIR]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[HTML5]]></category>

		<category><![CDATA[Twitter Air]]></category>

		<guid isPermaLink="false">http://www.colorhook.com/blog/?p=655</guid>
		<description><![CDATA[数小时前，Adobe labs上放出AIR 2 RC1版本，从它的release note中可以发现不少的新特性：

增强打印机的支持
支持TLS/SSL socket通信
支持外部存储设备检测
具备高级网络功能，如secure sockets, UDP, 监听sockets
支持本地代码集成
使用默认应用程序打开文件
多点触摸，手势支持
增加获取麦克风数据的API
WebKit更新至支持HTML5/CSS3
全局错误处理
跨平台印刷能力提升
安全性提升

虽然正式版还没有发布，不过已经告别Beta版本了，于是立刻利用这个最新的SDK编译了Twitter Air，并无bug修改和新功能加入。
]]></description>
			<content:encoded><![CDATA[<p>数小时前，<a href='http://labs.adobe.com'>Adobe labs</a>上放出AIR 2 RC1版本，从它的<a href='http://labs.adobe.com/technologies/air2/' target='_blank'>release note</a>中可以发现不少的新特性：</p>
<ul>
<li>增强打印机的支持</li>
<li>支持TLS/SSL socket通信
<li>支持外部存储设备检测</li>
<li>具备高级网络功能，如secure sockets, UDP, 监听sockets</li>
<li>支持本地代码集成</li>
<li>使用默认应用程序打开文件</li>
<li>多点触摸，手势支持</li>
<li>增加获取麦克风数据的API</li>
<li>WebKit更新至支持HTML5/CSS3</li>
<li>全局错误处理</li>
<li>跨平台印刷能力提升</li>
<li>安全性提升</li>
</ul>
<p>虽然正式版还没有发布，不过已经告别Beta版本了，于是立刻利用这个最新的SDK编译了<a href="http://colorhook.com/portfolio/twitterair">Twitter Air</a>，并无bug修改和新功能加入。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorhook.com/blog/?feed=rss2&amp;p=655</wfw:commentRss>
		</item>
	</channel>
</rss>
