<?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>Flashlight</title>
	<atom:link href="http://q.pnq.cc/feed" rel="self" type="application/rss+xml" />
	<link>http://q.pnq.cc</link>
	<description>Flash, Game, Web</description>
	<lastBuildDate>Sun, 25 Apr 2010 09:50:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用Fiddler提高前端工作效率 (实例篇)</title>
		<link>http://q.pnq.cc/archives/422</link>
		<comments>http://q.pnq.cc/archives/422#comments</comments>
		<pubDate>Sun, 25 Apr 2010 08:19:06 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[fiddler]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[调试]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=422</guid>
		<description><![CDATA[
在上一篇（介绍篇）中，我们对Fiddler Web Debugger有了简单的接触，也许你已经开始在用Fiddler进行HTTP相关的调试，在这一篇，我们将通过一个实例了解Fiddler的神奇魔法。
在我们前端开发的日常工作中，发现服务器上某个css/javascript文件有问题，需要修改，那真是家常便饭。通常，我们需要将文件进行修改，然后重新发布再验证，这样就很容易影响到生产环境的稳定性。更普遍的做法是，我们在开发环境中修改文件并验证，然后发布到生产环境。虽然安全，却比较繁琐。而利用Fiddler的可以修改HTTP数据的特性，我们就非常敏捷地基于生产环境“修改——验证——发布”。
假设我们发现这个页面有问题，需要修改所引用的js文件（http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102）。
第一步：用Fiddler查看页面的数据流列表，找到这个js文件的session

tip: 最好是没有缓存的返回内容（Result Code是200），这样可以进行下一步的保存。不是200也没关系，你只要本地硬盘上有这个文件就好了。
第二步：将js文件保存到本地（如果本地已经有这个文件，可以跳过这步）

在这个js session上右键点击，选择“Save – Response –Response Body…”，将js文件的内容保存到本地。记住存的位置，下面我们会用到这个保存下来的文件。
第三步：开启Fiddler的请求自动重定向功能

打开AutoResponder标签设置。有没有看到界面上有两个复选框？第一个的作用是开启或禁用自动重定向功能，我们就可以在下面添加重定向规则了。第二个复选框框勾上时，不影响那些没满足我们处理条件的请求。
第四步：创建重定向规则，将目标是这个js的HTTP请求重定向到本地文件
我们可以通过“Add…”按钮手动添加规则，不过这个URL已经出现在我们的session列表中，可以直接拖动过来。在左侧的Session列表中选择第一步找到的session，拖动到AutoResponse标签中。这样就创建了一个针对这个URL的规则。

Fiddler帮我们生成的规则是：

当URL为：http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102
返回200，使用和Session 4一模一样的内容返回

我们需要修改这个规则，

选择“Find a file…”，就可以选择本地的文件作为返回的body内容。

选择我们刚刚保存下来的文件。
刷新一下浏览器页面，看一下session列表，如果像下面这样，这个session的底色是灰色的，那么恭喜你，你已经成功将这个请求重定向到本地文件了！

tip: 如果浏览器用的是Firefox，记得先清一下临时文件缓存，因为Firefox是真正的缓存，当判断文件的缓存还未过期时，就不会再发请求出来，Fiddler就获取不到了。
第五步：修改本地文件，进行测试
我们在本地的js文件中加一句alert(‘hello’)

刷新浏览器，看看效果，如果alert出来，那就成功了。
继续修改这个文件并测试，成功修复问题后，我们就可以发布修改后的文件了。
小结：自动重定向功能是Fiddler最实用的功能，这里的Rule可以自由地设定，可以使用搜索（默认）、精确匹配（EXACT）、正则表达式匹配（REGEX）。处理方式可以选择使用文件，也可以选择合适的时间暂停数据流（*bpu、*bpafter），人工干预。通过以上几个步骤，我们演示了怎样将HTTP请求重定向到本地的文件，进行web调试。这种调试方式不需要发布到线上再验证，避免了修改不成功、对用户造成影响的风险，而且不需要搭建复杂的开发服务器等开发环境，非常适合快速web调试。
延伸阅读：

Fiddler使用帮助
Fiddler AutoResponder标签说明

]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-429" title="fiddler-title" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-title2.jpg" alt="" width="500" height="176" /></p>
<p>在<a href="http://q.pnq.cc/archives/368">上一篇（介绍篇）</a>中，我们对<a href="http://www.fiddler2.com/fiddler2/">Fiddler Web Debugger</a>有了简单的接触，也许你已经开始在用Fiddler进行HTTP相关的调试，在这一篇，我们将通过一个实例了解Fiddler的神奇魔法。</p>
<p>在我们前端开发的日常工作中，发现服务器上某个css/javascript文件有问题，需要修改，那真是家常便饭。通常，我们需要将文件进行修改，然后重新发布再验证，这样就很容易影响到生产环境的稳定性。更普遍的做法是，我们在开发环境中修改文件并验证，然后发布到生产环境。虽然安全，却比较繁琐。而利用Fiddler的可以修改HTTP数据的特性，我们就非常敏捷地<strong>基于生产环境</strong>“修改——验证——发布”。<span id="more-422"></span></p>
<p>假设我们发现<a href="http://www.aliued.cn/?p=2335" target="_blank">这个页面</a>有问题，需要修改所引用的js文件（<a href="http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102">http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102</a>）。</p>
<h2>第一步：用Fiddler查看页面的数据流列表，找到这个js文件的session</h2>
<p><a href="http://q.pnq.cc/wp-content/uploads/2010/04/image.png"><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image_thumb.png" border="0" alt="image" width="502" height="122" /></a></p>
<blockquote><p>tip: 最好是没有缓存的返回内容（Result Code是200），这样可以进行下一步的保存。不是200也没关系，你只要本地硬盘上有这个文件就好了。</p></blockquote>
<h2>第二步：将js文件保存到本地（如果本地已经有这个文件，可以跳过这步）</h2>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image1.png" border="0" alt="image" width="573" height="345" /></p>
<p>在这个js session上右键点击，选择“Save – Response –Response Body…”，将js文件的内容保存到本地。记住存的位置，下面我们会用到这个保存下来的文件。</p>
<h2>第三步：开启Fiddler的请求自动重定向功能</h2>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image2.png" border="0" alt="image" width="473" height="382" /></p>
<p>打开AutoResponder标签设置。有没有看到界面上有两个复选框？第一个的作用是开启或禁用自动重定向功能，我们就可以在下面添加重定向规则了。第二个复选框框勾上时，不影响那些没满足我们处理条件的请求。</p>
<h2>第四步：创建重定向规则，将目标是这个js的HTTP请求重定向到本地文件</h2>
<p>我们可以通过“Add…”按钮手动添加规则，不过这个URL已经出现在我们的session列表中，可以直接拖动过来。在左侧的Session列表中选择第一步找到的session，拖动到AutoResponse标签中。这样就创建了一个针对这个URL的规则。</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image3.png" border="0" alt="image" width="463" height="44" /></p>
<p>Fiddler帮我们生成的规则是：</p>
<ul>
<li>当URL为：<a title="http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102" href="http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102">http://www.aliued.cn/wp-includes/js/comment-reply.js?ver=20090102</a></li>
<li>返回200，使用和Session 4一模一样的内容返回</li>
</ul>
<p>我们需要修改这个规则，</p>
<p><a href="http://q.pnq.cc/wp-content/uploads/2010/04/image4.png"><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image_thumb1.png" border="0" alt="image" width="467" height="337" /></a></p>
<p>选择“Find a file…”，就可以选择本地的文件作为返回的body内容。</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image5.png" border="0" alt="image" width="563" height="420" /></p>
<p>选择我们刚刚保存下来的文件。</p>
<p>刷新一下浏览器页面，看一下session列表，如果像下面这样，这个session的底色是灰色的，那么恭喜你，你已经成功将这个请求重定向到本地文件了！</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image6.png" border="0" alt="image" width="503" height="172" /></p>
<blockquote><p>tip: 如果浏览器用的是Firefox，记得先清一下临时文件缓存，因为Firefox是真正的缓存，当判断文件的缓存还未过期时，就不会再发请求出来，Fiddler就获取不到了。</p></blockquote>
<h2>第五步：修改本地文件，进行测试</h2>
<p>我们在本地的js文件中加一句alert(‘hello’)</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://q.pnq.cc/wp-content/uploads/2010/04/image7.png" border="0" alt="image" width="511" height="386" /></p>
<p>刷新浏览器，看看效果，如果alert出来，那就成功了。</p>
<p>继续修改这个文件并测试，成功修复问题后，我们就可以发布修改后的文件了。</p>
<p>小结：自动重定向功能是Fiddler最实用的功能，这里的Rule可以自由地设定，可以使用搜索（默认）、精确匹配（EXACT）、正则表达式匹配（REGEX）。处理方式可以选择使用文件，也可以选择合适的时间暂停数据流（*bpu、*bpafter），人工干预。通过以上几个步骤，我们演示了怎样将HTTP请求重定向到本地的文件，进行web调试。这种调试方式不需要发布到线上再验证，避免了修改不成功、对用户造成影响的风险，而且不需要搭建复杂的开发服务器等开发环境，非常适合快速web调试。</p>
<p>延伸阅读：</p>
<ol>
<li><a href="http://www.fiddler2.com/Fiddler/help/">Fiddler使用帮助</a></li>
<li>Fiddler <a href="http://www.fiddler2.com/Fiddler2/help/AutoResponder.asp">AutoResponder标签说明</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/422/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>使用Fiddler提高前端工作效率 (介绍篇)</title>
		<link>http://q.pnq.cc/archives/368</link>
		<comments>http://q.pnq.cc/archives/368#comments</comments>
		<pubDate>Sun, 18 Apr 2010 12:11:14 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[fiddler]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=368</guid>
		<description><![CDATA[
1. Fiddler 是什么？
Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器。英语中Fiddler是小提琴的意思，Fiddler Web Debugger就像小提琴一样，可以让前端开发变得更加优雅。
Fiddler是以代理服务器的方式，监听系统的网络数据流动。运行Fiddler后，就会在本地打开8888端口，网络数据流通过Fiddler进行中转时，我们可以监视HTTP/HTTPS数据流的记录，并加以分析，甚至还可以修改发送和接收的数据。Fiddler还提供了清除IE缓存、请求构造器、文本转换工具等等一系列工具，对前端开发工作很有价值。
2. 下载和安装Fiddler


安装.net framework 2.0以上版本
从官方网站免费下载Fiddler。


Firefox中用Fiddler，可以下载一个插件：Fiddler开关
3. Fiddler的界面和功能
列表

左侧是数据列表，以不同的图标区分数据类型和状态，以下是图标对应的含义：




正在将请求数据发往服务器



正在从服务器下载返回数据



请求过程中暂停



返回过程中暂停



请求中使用了HTTP HEAD方法; 返回中应该没有body内容



请求中使用了HTTP CONNECT方法，建立HTTPS连接通道



返回的内容类型是HTML



返回的内容类型是图片



返回的内容类型是Javascript



返回的内容类型是CSS



返回的内容类型是XML



普通的成功的返回



返回内容为 HTTP/300,301,302,303 or 307 跳转



返回内容为HTTP/304: 使用本地缓存



返回内容为一个证书请求



返回内容是服务器错误



请求被客户端、Fiddler或服务器中断



查看器

利用查看器提供的很多形式，我们可以查看数据流的内容。
请求构建器（Request Builder）

可以创建任意数据的请求
过滤器

过滤器可以对左侧的数据流列表进行过滤，我们可以标记、修改或隐藏某些特征的数据流。
AutoResponse功能

这个功能可以算的上是Fiddler最实用的功能，可以让我们修改服务器端返回的数据，例如让返回都是HTTP404或者读取本地文件作为返回内容。我们将在实例中介绍利用AutoResponse功能。
文本编码和解码

提供了常用的一些文本编解码的转换。
此外，还可以对两个数据流进行比较

Fiddler可以保存和打开“SAZ”格式的文件，这样就可以将监听到的数据流保存下来，下次再重新打开分析。可以利用FiddlerCap——一个专门用来录制保存SAZ的小工具——保存SAZ文件。SAZ文件可以设置密码保护，比较贴心。
延升阅读：使用Fiddler提高前端工作效率 (实例篇)
]]></description>
			<content:encoded><![CDATA[<h2><img class="alignnone size-full wp-image-407" title="FiddlerLogo" src="http://q.pnq.cc/wp-content/uploads/2010/04/FiddlerLogo.png" alt="" width="277" height="84" /></h2>
<h2>1. Fiddler 是什么？</h2>
<p>Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器。英语中Fiddler是小提琴的意思，<a href="http://www.fiddler2.com/fiddler2/">Fiddler Web Debugger</a>就像小提琴一样，可以让前端开发变得更加优雅。</p>
<p>Fiddler是以代理服务器的方式，监听系统的网络数据流动。运行Fiddler后，就会在本地打开8888端口，网络数据流通过Fiddler进行中转时，我们可以监视HTTP/HTTPS数据流的记录，并加以分析，甚至还<span style="color: #ff0000;"><strong>可以修改</strong></span>发送和接收的数据。Fiddler还提供了清除IE缓存、请求构造器、文本转换工具等等一系列工具，对前端开发工作很有价值。<span id="more-368"></span></p>
<h2>2. 下载和安装Fiddler</h2>
<div>
<ol>
<li>安装<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=333325fd-ae52-4e35-b531-508d977d32a6">.net framework</a> 2.0以上版本</li>
<li>从<a href="http://www.fiddler2.com/fiddler2/">官方网站</a>免费<a href="http://www.fiddler2.com/fiddler2/version.asp">下载</a>Fiddler。</li>
</ol>
</div>
<p>Firefox中用Fiddler，可以下载一个插件：<a href="https://addons.mozilla.org/zh-CN/firefox/addon/9373V">Fiddler开关</a></p>
<h2>3. Fiddler的界面和功能</h2>
<h3>列表</h3>
<p><img class="alignnone size-full wp-image-372" title="fiddler-333" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-333.png" alt="" width="555" height="555" /></p>
<div>左侧是数据列表，以不同的图标区分数据类型和状态，以下是图标对应的含义：</div>
<table>
<tbody>
<tr>
<td><img class="nobd alignnone size-full wp-image-375" title="fiddler-371" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-371.png" alt="" width="14" height="18" /></td>
<td>正在将请求数据发往服务器</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-377" title="fiddler-387" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-387.png" alt="" width="14" height="18" /></td>
<td>正在从服务器下载返回数据</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-348" title="使用Fiddler提高前端工作效率-403" src="http://q.pnq.cc/wp-content/uploads/2010/04/使用Fiddler提高前端工作效率-403.png" alt="" width="16" height="18" /></td>
<td>请求过程中暂停</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-378" title="fiddler-414" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-414.png" alt="" width="16" height="18" /></td>
<td>返回过程中暂停</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-379" title="fiddler-425" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-425.png" alt="" width="17" height="17" /></td>
<td>请求中使用了HTTP HEAD方法; 返回中应该没有body内容</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-461.png" alt="" width="15" height="16" /></td>
<td>请求中使用了HTTP CONNECT方法，建立HTTPS连接通道</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-381" title="fiddler-497" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-497.png" alt="" width="16" height="18" /></td>
<td>返回的内容类型是HTML</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-382" title="fiddler-513" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-513.png" alt="" width="16" height="18" /></td>
<td>返回的内容类型是图片</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-383" title="fiddler-527" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-527.png" alt="" width="17" height="17" /></td>
<td>返回的内容类型是Javascript</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-385" title="fiddler-574" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-550.png" alt="" width="18" height="18" /></td>
<td>返回的内容类型是CSS</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-574.png" alt="" width="15" height="16" /></td>
<td>返回的内容类型是XML</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-591.png" alt="" width="15" height="16" /></td>
<td>普通的成功的返回</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-605.png" alt="" width="15" height="16" /></td>
<td>返回内容为 HTTP/300,301,302,303 or 307 跳转</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-647.png" alt="" width="15" height="16" /></td>
<td>返回内容为HTTP/304: 使用本地缓存</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-674.png" alt="" width="15" height="16" /></td>
<td>返回内容为一个证书请求</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-691.png" alt="" width="15" height="16" /></td>
<td>返回内容是服务器错误</td>
</tr>
<tr>
<td><img class="nobd alignnone size-full wp-image-380" title="fiddler-461" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-707.png" alt="" width="15" height="16" /></td>
<td>请求被客户端、Fiddler或服务器中断</td>
</tr>
</tbody>
</table>
<h3>查看器</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-779.png" alt="" width="555" height="262" /></div>
<div>利用查看器提供的很多形式，我们可以查看数据流的内容。</div>
<h3>请求构建器（Request Builder）</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-815.png" alt="" width="453" height="545" /></div>
<div>可以创建任意数据的请求</div>
<h3>过滤器</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-834.png" alt="" width="555" height="251" /></div>
<div>过滤器可以对左侧的数据流列表进行过滤，我们可以标记、修改或隐藏某些特征的数据流。</div>
<h3>AutoResponse功能</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-894.png" alt="" width="555" height="367" /></div>
<div>这个功能可以算的上是Fiddler最实用的功能，可以让我们修改服务器端返回的数据，例如让返回都是HTTP404或者读取本地文件作为返回内容。我们将在实例中介绍利用AutoResponse功能。</div>
<h3>文本编码和解码</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-1003.png" alt="" width="461" height="545" /></div>
<div>提供了常用的一些文本编解码的转换。</div>
<h3>此外，还可以对两个数据流进行比较</h3>
<div><img class="alignnone size-full wp-image-392" title="fiddler-779" src="http://q.pnq.cc/wp-content/uploads/2010/04/fiddler-1041.png" alt="" width="504" height="417" /></div>
<div>Fiddler可以保存和打开“SAZ”格式的文件，这样就可以将监听到的数据流保存下来，下次再重新打开分析。可以利用FiddlerCap——一个专门用来录制保存SAZ的小工具——保存SAZ文件。SAZ文件可以设置密码保护，比较贴心。</div>
<p>延升阅读：<a href="http://q.pnq.cc/archives/422">使用Fiddler提高前端工作效率 (实例篇)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/368/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>帮助我提升Actionscript 开发效率的一些工具</title>
		<link>http://q.pnq.cc/archives/326</link>
		<comments>http://q.pnq.cc/archives/326#comments</comments>
		<pubDate>Tue, 11 Aug 2009 00:13:31 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[- linux -]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=326</guid>
		<description><![CDATA[一个好用的工具不仅仅可以解决问题，还可以提高工作的效率。追求最高效敏捷的开发，是一种精神。在平常工作中，我不断在寻找提高效率的软件，以下是Flash开发时候用到的一些工具，与大家分享一下，拋砖引玉，如果你有更好的，不妨来交流一下。
1.开发环境类

Flashdevelop

Adobe Flash Builder (FLex)
Adobe Flash Catalyst —— 快速处理设计资源，构建程序原型
Adobe Flash CS4 —— 处理设计资源偶尔用到
FDT 

Eclipse
Aptana

2.帮助、工具书

 Tour de flex

 在线文档
DOC?

3.测试类

Fiddler

 Flash player 调试版本 —— 很基础确很实用的调试工具 

 Monster debugger —— 强大的外部调试工具 

firebug —— 与JS通信时的调试很有用


4.代码管理

Google Code —— Google 提供的代码托管

subversion ——建立自己的SVN服务器
tortoisesvn —— SVN客户端软件

5.通用工具

 launchy


xmind



]]></description>
			<content:encoded><![CDATA[<p>一个好用的工具不仅仅可以解决问题，还可以提高工作的效率。追求最高效敏捷的开发，是一种精神。在平常工作中，我不断在寻找提高效率的软件，以下是Flash开发时候用到的一些工具，与大家分享一下，拋砖引玉，如果你有更好的，不妨来交流一下。</p>
<h3>1.开发环境类</h3>
<ul>
<li><cite><strong><a href="http://www.flashdevelop.org">Flashdevelop</a><br />
</strong></cite><a href="http://www.flashdevelop.org"><img class="alignnone size-full wp-image-330" title="flashdevelop2" src="http://q.pnq.cc/wp-content/uploads/2009/08/flashdevelop2.gif" alt="flashdevelop2" width="500" height="300" /></a></li>
<li><a href="http://labs.adobe.com/technologies/flashbuilder4/" target="_blank"><cite><strong>Adobe Flash Builder (FLex)</strong></cite></a></li>
<li><a href="http://labs.adobe.com/technologies/flashcatalyst/" target="_blank"><cite><strong>Adobe Flash Catalyst</strong></cite></a> —— 快速处理设计资源，构建程序原型</li>
<li><a href="http://www.adobe.com/products/flash/" target="_blank"><cite><strong>Adobe Flash CS4</strong></cite></a> —— 处理设计资源偶尔用到</li>
<li><cite><strong><a href="http://fdt.powerflasher.com/" target="_blank">FDT </a><br />
</strong></cite></li>
<li><a href="http://www.eclipse.org/" target="_blank"><cite><strong>Eclipse</strong></cite></a></li>
<li><a href="http://www.aptana.com/" target="_blank"><cite><strong>Aptana</strong></cite></a></li>
</ul>
<h3>2.帮助、工具书</h3>
<ul>
<li> <a href="http://flex.org/tour" target="_blank"><cite><strong>Tour de flex</strong></cite></a><br />
<a href="http://flex.org/tour" target="_blank"><img class="alignnone size-full wp-image-332" title="tour-de-flex" src="http://q.pnq.cc/wp-content/uploads/2009/08/tour-de-flex.png" alt="tour-de-flex" width="500" height="451" /></a></li>
<li> <a href="http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/" target="_blank"><cite>在线文档</cite></a></li>
<li><a href="http://www.airdoc.be/" target="_blank"><cite><strong>DOC?</strong></cite></a></li>
</ul>
<h3>3.测试类</h3>
<ul>
<li><a href="http://www.fiddler2.com" target="_blank">Fiddler</a><br />
<a href="http://www.fiddler2.com"><img class="alignnone size-full wp-image-333" title="fiddler" src="http://q.pnq.cc/wp-content/uploads/2009/08/fiddler.png" alt="fiddler" width="500" height="286" /></a></li>
<li> <cite><a href="http://www.adobe.com/support/flashplayer/downloads.html" target="_blank"><strong>Flash player</strong> 调试版本</a></cite><a href="http://tortoisesvn.tigris.org/" target="_blank"><cite></cite></a> —— 很基础确很实用的调试工具 <cite><br />
</cite></li>
<li> <a href="http://demonsterdebugger.com/" target="_blank"><cite><strong>Monster debugger</strong></cite></a> —— 强大的外部调试工具 <cite></cite><a href="http://demonsterdebugger.com/" target="_blank"><cite><br />
</cite></a></li>
<li><a href="http://getfirebug.com/" target="_blank"><cite><strong>firebug</strong></cite></a> —— 与JS通信时的调试很有用<a href="http://demonsterdebugger.com/" target="_blank"><cite><br />
</cite></a></li>
</ul>
<h3>4.代码管理</h3>
<ul>
<li><a href="http://code.google.com/intl/zh-CN/" target="_blank"><cite><strong>Google Code</strong></cite></a> —— Google 提供的代码托管<br />
<cite></cite></li>
<li><cite><strong><a href="http://www.subversion.org.cn/" target="_blank">subversion</a></strong></cite> ——建立自己的SVN服务器</li>
<li><a href="http://tortoisesvn.tigris.org/" target="_blank"><cite><strong>tortoisesvn</strong></cite></a> —— SVN客户端软件</li>
</ul>
<h3>5.通用工具</h3>
<ul>
<li> <cite><strong><a href="http://www.launchy.net/" target="_blank">launchy</a><br />
<a href="http://www.launchy.net/"><img class="alignnone size-medium wp-image-336" title="launchy-1" src="http://q.pnq.cc/wp-content/uploads/2009/08/launchy-1-480x300.png" alt="launchy-1" width="480" height="300" /></a><br />
</strong></cite></li>
<li><cite><strong><a href="http://www.xmind.net">xmind</a><br />
<a href="http://www.xmind.net"><img class="alignnone size-medium wp-image-338" title="xmind1" src="http://q.pnq.cc/wp-content/uploads/2009/08/xmind1-499x440.gif" alt="xmind1" width="499" height="440" /></a><br />
</strong></cite></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/326/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>异步+Vector版本的JPEG编码器</title>
		<link>http://q.pnq.cc/archives/307</link>
		<comments>http://q.pnq.cc/archives/307#comments</comments>
		<pubDate>Mon, 01 Jun 2009 10:37:23 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[alchemy]]></category>
		<category><![CDATA[haxe]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=307</guid>
		<description><![CDATA[业界大牛 Thibault Imbert (bytearray.org) 近日将很常用的JPEGEncoder类用vector类改写了一下，做了一个vector版本的JPG编码类，效率大幅提升。正好，前不久我也已经做了一个vector版本的JPEG编码类，在项目中使用，最近正在整理代码准备分享出来。当然啦，我所做的没有Thibault那么深入，仅仅是把Array换成Vector，所以现在就拿他的版本重新修改了一下，加上了异步功能。
所谓的异步编码，是延时处理代替循环处理。比如写入1000行文字到一个文件内，可以用for/while循环1000次，一次性写入，这就是同步处理；也可以写1行，隔0.5秒再写下一行，再隔0.5秒继续写下一行，这就是异步处理。同步处理的好处是快速，但是对计算机的压力也比较大，在浏览器中使用时，会造成假死，可能会引发稳定性问题。
Vector的效率比Array高了大约4～10倍，但还是不够高，Alchemy或者haxe的效率会更高一些，因为它们使用了Flash10未公开的opcodes接口，可以直接操作一段内存数据。Mateusz Malczak（http://segfaultlabs.com）就做了一个异步Alchemy版的JPEGEncoder，效果很赞，速度比我vector异步版的要快很多，但是缺少了一些自定义参数设置（在压缩小图片的时候，看上去效率反而不如Vector，其实不然，实际上，这是因为程序中写死了大小2800×2800）。Alchemy的C源码修改起来也比较麻烦，要用Alchemy重新编译。而且因为编译了整个libjpeg，所以文件体积也比较大，用C重新写一遍所有相关的类可以解决大小问题，但问题也会更加麻烦。看起来，haxe生成的swc应当是最佳选择，正在考虑有空的时候改写一个。  
我将这个几个放在一起，来看一下例子吧！（需要安装Flash Player10）

下载 源文件
下载 带有异步压缩功能的vector版JPEGEncoder
关于 Alchemy 和 Haxe：
Alchemy是Adobe实验室的一个项目，它的前身是Scott Petersen的“FlaCC (Flash C Compiler)”，目标是让C语言写的类能够被Flash重用。在MAX 2007 大会上，Scott凭借Flash中畅玩Doom一鸣惊人。Alchemy可以将C语言代码变成Flash可用的swc文件。这种方式类似于在C语言里面直接执行汇编语言，效率自然提高很多。目前Alchemy还只是测试项目，但是已经开放了SDK下载，可以编译许多常用的C类库。
Haxe 是传奇的 Nicolas Cannasse 创造的语言。Nicolas 发明了大名鼎鼎的MTASC (Motion-Tween Actionscript Compiler)，在AS2.0的时代，改变了AS开发的方式，Flash也进入开源时代。进入AS3.0时代后，Nicolas选择了自己创造一种语言，这种语言吸取了Flash的优点，并且在语言和编译器上做了很多优化，使得效率上大幅度提升，这就是Haxe。时至今日，Haxe已经发展为一个丰富、高效的高级语言，也对Actionscript的发展产生了影响，例如Flash10的Vector，就和Haxe的概念和语法非常相似。
Alchemy公开之后，Nicolas 找到了 Flash播放器中留给Alchemy的未公开的接口，通过这些接口，AS可以直接操作一段内存中的数据。Haxe也使用了这些接口，并称之为Flash Memory，借助Alchemy的接口，Haxe的效率也大为提升。
]]></description>
			<content:encoded><![CDATA[<p>业界大牛 <a href="http://bytearray.org">Thibault Imbert</a> (<a href="http://bytearray.org">bytearray.org</a>) 近日将很常用的JPEGEncoder类用vector类改写了一下，做了一个<a href="http://www.bytearray.org/?p=775">vector版本的JPG编码类</a>，效率大幅提升。正好，前不久我也已经做了一个vector版本的JPEG编码类，在项目中使用，最近正在整理代码准备分享出来。当然啦，我所做的没有Thibault那么深入，仅仅是把Array换成Vector，所以现在就拿他的版本重新修改了一下，加上了异步功能。</p>
<p>所谓的异步编码，是延时处理代替循环处理。比如写入1000行文字到一个文件内，可以用for/while循环1000次，一次性写入，这就是同步处理；也可以写1行，隔0.5秒再写下一行，再隔0.5秒继续写下一行，这就是异步处理。同步处理的好处是快速，但是对计算机的压力也比较大，在浏览器中使用时，会造成假死，可能会引发稳定性问题。</p>
<p>Vector的效率比Array高了大约4～10倍，但还是不够高，<a href="http://labs.adobe.com/technologies/alchemy/">Alchemy</a>或者<a href="http://www.haxe.org">haxe</a>的效率会更高一些，因为它们使用了Flash10未公开的<a href="http://ncannasse.fr/blog/adobe_alchemy">opcodes</a>接口，可以直接操作一段内存数据。<a href="http://segfaultlabs.com">Mateusz Malczak</a>（<a href="http://segfaultlabs.com">http://segfaultlabs.com</a>）就做了一个<a href="http://segfaultlabs.com/blog/post/asynchronous-jpeg-encoding">异步Alchemy版的JPEGEncoder</a>，效果很赞，速度比我vector异步版的要快很多，<span><span style="text-decoration: line-through;">但是缺少了一些自定义参数设置（</span><span style="text-decoration: line-through;">在压缩小图片的时候，看上去效率反而不如Vector，其实不然，实际上，这是因为程序中写死了大小2800×2800</span><span style="text-decoration: line-through;">）</span></span><span style="text-decoration: line-through;">。</span>Alchemy的C源码修改起来也比较麻烦，要用Alchemy重新编译。而且因为编译了整个libjpeg，所以文件体积也比较大，用C重新写一遍所有相关的类可以解决大小问题，但问题也会更加麻烦。看起来，<a href="http://www.haxe.org">haxe</a>生成的swc应当是最佳选择，正在考虑有空的时候改写一个。 <img src='http://q.pnq.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>我将这个几个放在一起，来看一下例子吧！（需要安装Flash Player10）</p>
<p><object width="500" height="340" data="http://q.pnq.cc/wp-content/uploads/2009/06/test_jpegencoders.swf" type="application/x-shockwave-flash"><param name="src" value="http://q.pnq.cc/wp-content/uploads/2009/06/test_jpegencoders.swf" /></object></p>
<p><a href="http://q.pnq.cc/wp-content/uploads/2009/06/test_jpegencoders.zip">下载 源文件</a><br />
<a href="http://q.pnq.cc/wp-content/uploads/2009/06/JPGEncoderIMP.as">下载 带有异步压缩功能的vector版JPEGEncoder</a></p>
<h3>关于 Alchemy 和 Haxe：</h3>
<p><a href="http://labs.adobe.com/technologies/alchemy/">Alchemy</a>是<a href="http://labs.adobe.com/">Adobe实验室</a>的一个项目，它的前身是Scott Petersen的“FlaCC (Flash C Compiler)”，目标是让C语言写的类能够被Flash重用。在<a href="http://mx.adobe.com">MAX 2007</a> 大会上，Scott凭借Flash中畅玩Doom一鸣惊人。Alchemy可以将C语言代码变成Flash可用的swc文件。这种方式类似于在C语言里面直接执行汇编语言，效率自然提高很多。目前Alchemy还只是测试项目，但是已经开放了SDK下载，可以编译许多常用的C类库。</p>
<p><a href="http://www.haxe.org">Haxe</a> 是传奇的 <a href="http://ncannasse.fr/blog">Nicolas Cannasse </a>创造的语言。Nicolas 发明了大名鼎鼎的<a href="http://www.mtasc.org/">MTASC</a> (Motion-Tween Actionscript Compiler)，在AS2.0的时代，改变了AS开发的方式，Flash也进入开源时代。进入AS3.0时代后，Nicolas选择了自己创造一种语言，这种语言吸取了Flash的优点，并且在语言和编译器上做了很多优化，使得效率上大幅度提升，这就是<a href="http://haxe.org">Haxe</a>。时至今日，Haxe已经发展为一个<a href="http://lib.haxe.org/">丰富</a>、高效的高级语言，也对Actionscript的发展产生了影响，例如Flash10的Vector，就和Haxe的概念和语法非常相似。</p>
<p>Alchemy公开之后，Nicolas <a href="http://ncannasse.fr/blog/adobe_alchemy">找到了 Flash播放器中留给Alchemy的未公开的接口</a>，通过这些接口，AS可以直接操作一段内存中的数据。Haxe也使用了这些接口，并称之为<a href="http://ncannasse.fr/blog/virtual_memory_api">Flash Memory</a>，借助Alchemy的接口，Haxe的效率也大为提升。</p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/307/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于FlashDevelop中使用中文的一些经验</title>
		<link>http://q.pnq.cc/archives/298</link>
		<comments>http://q.pnq.cc/archives/298#comments</comments>
		<pubDate>Sat, 18 Apr 2009 15:05:02 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[flashdevelop]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=298</guid>
		<description><![CDATA[1. 中文乱码问题和解决方案
新安装的 Flashdevelop 打开有中文的文件时，会有乱码现象，如图：

手动选择编码为UTF-8格式（File -&#62; encoding -&#62; UTF-8 )，会发现如果汉字是奇数个一起的时候，最后几个字符会变成乱码。这是由于 Flashdevelop 读取文件，没有找到文件内的编码标记，就默认以8bit方式读取，再转回utf-8格式的时候就会出问题。
解决方案：
选择菜单 Tools &#8211; 将设置中的 Fallback Codepage 设置为utf-8，这样flashdevelop在不知道文件应该用什么编码的时候，就会以utf-8处理。这里顺便也将其他几个编码设为utf-8，这样就更好了。

2. 修改默认字体大小
默认情况下中文字比较小，看着会比较累。选择 Tools -&#62; Syntax Color&#8230; 就可以修改了。
注意哦，默认只是改编辑AS3 的字体。我就犯了错，拿AS3的设置修改，然后看XML文件的显示效果，结果发现怎么改都没效果 -__-!
我用的是Verdanda/10pt, 最终的效果：

]]></description>
			<content:encoded><![CDATA[<h3>1. 中文乱码问题和解决方案</h3>
<p>新安装的<a href="http://www.flashdevelop.org"> Flashdevelop </a>打开有中文的文件时，会有乱码现象，如图：<br />
<img class="alignnone size-full wp-image-299" title="snap0024_flashdevelop" src="http://q.pnq.cc/wp-content/uploads/2009/04/snap0024_flashdevelop.png" alt="snap0024_flashdevelop" width="474" height="310" /></p>
<p>手动选择编码为UTF-8格式（<em>File -&gt; encoding -&gt; UTF-8</em> )，会发现如果汉字是奇数个一起的时候，最后几个字符会变成乱码。这是由于 Flashdevelop 读取文件，没有找到文件内的编码标记，就默认以8bit方式读取，再转回utf-8格式的时候就会出问题。</p>
<p><strong>解决方案：</strong><br />
选择菜单 Tools &#8211; 将设置中的<span style="color: #ff0000;"><strong> Fallback Codepage</strong> </span>设置为utf-8，这样flashdevelop在不知道文件应该用什么编码的时候，就会以utf-8处理。这里顺便也将其他几个编码设为utf-8，这样就更好了。<br />
<img class="alignnone size-full wp-image-301" title="snap0026_flashdevelop3" src="http://q.pnq.cc/wp-content/uploads/2009/04/snap0026_flashdevelop3.png" alt="snap0026_flashdevelop3" width="539" height="202" /></p>
<h3>2. 修改默认字体大小</h3>
<p>默认情况下中文字比较小，看着会比较累。选择<em> Tools -&gt; Syntax Color&#8230;</em> 就可以修改了。<br />
注意哦，默认只是改编辑AS3 的字体。我就犯了错，拿AS3的设置修改，然后看XML文件的显示效果，结果发现怎么改都没效果 -__-!</p>
<p>我用的是<em>Verdanda/10pt</em>, 最终的效果：</p>
<p><img class="alignnone size-full wp-image-300" title="snap0025_flashdevelop2" src="http://q.pnq.cc/wp-content/uploads/2009/04/snap0025_flashdevelop2.png" alt="snap0025_flashdevelop2" width="466" height="311" /></p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/298/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用Filereference时的一些注意事项</title>
		<link>http://q.pnq.cc/archives/292</link>
		<comments>http://q.pnq.cc/archives/292#comments</comments>
		<pubDate>Mon, 06 Apr 2009 15:26:54 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[filereference]]></category>
		<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=292</guid>
		<description><![CDATA[FileReference用来上传文件，结合FileReferenceList使用，可以弹出一次文件选择框就上传很多个文件，比HTML form形式的友好很多。但是使用的时候，有些地方需要注意的：

上传文件时，不能增加自定义request header
这点不同于URLLoader：URLLoader是可以增加自定义头部信息（request header）的，但是敏感的字段是不可以更改的，比如refer、cookie、host等等；而FileReferrence则不可以增加任何自定义头信息，所有自己添加的自定义header，都被播放器悄无声息地忽略掉了，没有任何报错和提示。如果一定要增加字段，只能添加到POST变量中。

只有IE才能附带浏览器Cookie信息
在非IE浏览器中，利用FileReference发出的HTTP请求，带的cookie资料都是IE的cookie。即便在Firefox或者chrome中，传送的cookie也是IE的！有的同学说这和默认浏览器设置有关，例如将默认浏览器设为Firefox，那么IE就得不到cookie。但是我测试了一下，发现无论默认浏览器是什么，发送的都是IE的cookie。解决方案暂时是借用JS得到cookie（ ExternalInterface.call(&#8220;javascript:document.cookie&#8221;) ），当作变量post过去。麻烦的是，服务器端也要做相应的调整。这个BUG到目前（2009年4月6日）为止，已经差不多存在了一年了。

得不到文件的本地路径
Flash10的Reference可以得到本地文件的二进制文件，但是得不到文件路径（file://&#8230;）。这个问题还附带导致了一个问题，FilereferrenceList不能判断出重复选择的文件。就是说第一次弹出文件选择对话框的时候，用户选择了一个文件。过了一段时间再继续浏览文件，又选择了这个文件，这时候Flash是没有办法知道重复选择的。

不能设置上传的content-type
可能会让人郁闷的是，这个也没有任何throw/warning报错。

只支持实际存在的文件的上传下载
要是要上传一些动态生成的数据到服务器存储，那就用不得Filereference，也看不到上传进度了。


顺便说一下，内存里面的数据，希望上传到服务器保存为文件，可以用URLLoader,URLStream之类的代替。但是FlashPlayer10有个新增的安全性限制，当上传文件的时候，播放器会检查操作是否由用户点击触发。没有点击就上传，会被浏览器阻挡掉请求。播放器判断一个HTTP请求是否是文件上传的依据是form-based-HTML-file-upload规范，有两个标志：
一是content-type含有“ multipart”，例如“multipart/form-data”，“mymultipartxxx”；
二是字段名含有 filename。
满足了这两点，flash播放器就会把这次请求当作文件上传处理，进而检查是否符合安全限制。要防止被阻挡掉也很简单，不要用filename这个关键字做数据的字段名即可。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://help.adobe.com/zh_CN/AS3LCR/Flash_10.0/flash/net/FileReference.html">FileReference</a>用来上传文件，结合FileReferenceList使用，可以弹出一次文件选择框就上传很多个文件，比HTML form形式的友好很多。但是使用的时候，有些地方需要注意的：</p>
<ol>
<li><strong>上传文件时，不能增加自定义request header</strong>
<p style="font-family: Georgia; line-height: 19px; white-space: normal; ">这点不同于URLLoader：URLLoader是可以增加自定义头部信息（request header）的，但是敏感的字段是不可以更改的，比如refer、cookie、host等等；而FileReferrence则不可以增加任何自定义头信息，所有自己添加的自定义header，都被播放器悄无声息地忽略掉了，没有任何报错和提示。如果一定要增加字段，只能添加到POST变量中。</p>
</li>
<li><strong>只有IE才能附带浏览器Cookie信息</strong>
<p style="font-family: Georgia; line-height: 19px; white-space: normal; ">在非IE浏览器中，利用FileReference发出的HTTP请求，带的cookie资料都是IE的cookie。即便在Firefox或者chrome中，传送的cookie也是IE的！有的同学说这和默认浏览器设置有关，例如将默认浏览器设为Firefox，那么IE就得不到cookie。但是我测试了一下，发现无论默认浏览器是什么，发送的都是IE的cookie。解决方案暂时是借用JS得到cookie（ ExternalInterface.call(&#8220;javascript:document.cookie&#8221;) ），当作变量post过去。麻烦的是，服务器端也要做相应的调整。这个BUG到目前（2009年4月6日）为止，已经差不多存在了一年了。</p>
</li>
<li><strong>得不到文件的本地路径</strong>
<p style="font-family: Georgia; line-height: 19px; white-space: normal; ">Flash10的Reference可以得到本地文件的二进制文件，但是得不到文件路径（file://&#8230;）。这个问题还附带导致了一个问题，FilereferrenceList不能判断出重复选择的文件。就是说第一次弹出文件选择对话框的时候，用户选择了一个文件。过了一段时间再继续浏览文件，又选择了这个文件，这时候Flash是没有办法知道重复选择的。</p>
</li>
<li><strong>不能设置上传的content-type</strong>
<p style="font-family: Georgia; line-height: 19px; white-space: normal; ">可能会让人郁闷的是，这个也没有任何throw/warning报错。</p>
</li>
<li><strong>只支持实际存在的文件的上传下载</strong>
<p style="font-family: Georgia; line-height: 19px; white-space: normal; ">要是要上传一些动态生成的数据到服务器存储，那就用不得Filereference，也看不到上传进度了。</p>
</li>
</ol>
<blockquote><p><span style="font-family: Georgia; line-height: 19px; white-space: normal; ">顺便说一下，内存里面的数据，希望上传到服务器保存为文件，可以用URLLoader,URLStream之类的代替。但是FlashPlayer10有个<a href="http://www.adobe.com/devnet/flashplayer/articles/fplayer10_security_changes_02.html#head34">新增的安全性限制</a>，当上传文件的时候，播放器会检查操作是否由用户点击触发。没有点击就上传，会被浏览器阻挡掉请求。播放器判断一个HTTP请求是否是文件上传的依据是form-based-HTML-file-upload规范，有两个标志：<br />
一<strong>是content-type含有“ multipart”</strong>，例如“</span><span style="line-height: 19px; white-space: normal;"><span style="color: #3366ff;">multipart</span></span><span style="font-family: Georgia; line-height: 19px; white-space: normal; ">/form-data”，“my</span><span style="line-height: 19px; white-space: normal;"><span style="color: #3366ff;">multipart</span></span><span style="font-family: Georgia; line-height: 19px; white-space: normal; ">xxx”；<br />
<strong>二是字段名含有 </strong></span><span style="line-height: 19px; white-space: normal;"><span style="color: #3366ff;"><strong>filename</strong><span style="color: #000000;">。<br />
满足了这两点，flash播放器就会把这次请求当作文件上传处理，进而检查是否符合安全限制。要防止被阻挡掉也很简单，不要用<span style="color: #3366ff;">filename</span>这个关键字做数据的字段名即可。</span></span></span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/292/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Flash10+3D] 简单的、清晰的卡片翻转效果</title>
		<link>http://q.pnq.cc/archives/268</link>
		<comments>http://q.pnq.cc/archives/268#comments</comments>
		<pubDate>Wed, 04 Mar 2009 16:18:00 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[flash 10]]></category>
		<category><![CDATA[non fuzzy]]></category>
		<category><![CDATA[三维]]></category>
		<category><![CDATA[模糊]]></category>
		<category><![CDATA[清晰]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/archives/268</guid>
		<description><![CDATA[这几天在做的一个项目需要做一个卡片翻转效果，实践了一下Flash 10的新的3D功能。果真是方便至极，所有的可视化对象现在都有了3D相关的属性，只需要设置rotationY变化，就可以做出很炫的翻转效果了。但是我发现，经过3D变换后的对象，都会被Flash转成位图缓存的方式显示，这样原先清晰的一些文字、图片等内容，就会显得比较模糊，演示：（需要安装 Adobe Flash Player 10 才能看到效果）

第一面的文字本来是清晰的，翻转一遍之后就模糊了。Google了好久都没有找到解决方案，抓狂。。后来突然想到，是不是可以这样，将要变回清晰的对象换个清晰的父对象？实验了一下，果然可行，大喜！好像我太out了吧，直觉告诉我，在Flash9+Papervision3D的年代，大家应该都已经知道这个方法的了，但是我确实没有找到……现在将代码重新整理了一遍，记录下来，也许对大家有所帮助。
先看看效果：

主要的类：
 

/**
 *
 * @author qhwa, , qhwa@163.com
 * This class is a sample of Flash-10-3D-flipping,
 * that can keep faces clear, not as fuzzy as
 * default.
 *
 * 这个类演示了如何使用Flash10自带的3D功能创建一个
 * 简单的卡片翻转效果，同时保持文字和其他内容的
 * 清晰
 *
 */
&#160;
package qhwa.twosideflip
&#123;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	import gs.easing.Back;
	import gs.TweenLite;
&#160;
	/**
	 * ...
	 * @author [...]]]></description>
			<content:encoded><![CDATA[<p>这几天在做的一个项目需要做一个卡片翻转效果，实践了一下Flash 10的新的3D功能。果真是方便至极，所有的可视化对象现在都有了3D相关的属性，只需要设置rotationY变化，就可以做出很炫的翻转效果了。但是我发现，经过3D变换后的对象，都会被Flash转成位图缓存的方式显示，这样原先清晰的一些文字、图片等内容，就会显得比较模糊，演示：（需要安装 Adobe Flash Player 10 才能看到效果）</p>
<p><object width="500" height="430" data="/wp-content/uploads/2009/03/testf10twosideflipping-fuzzy.swf" type="application/x-shockwave-flash"><param name="src" value="/wp-content/uploads/2009/03/testf10twosideflipping-fuzzy.swf" /></object></p>
<p>第一面的文字本来是清晰的，翻转一遍之后就模糊了。Google了好久都没有找到解决方案，抓狂。。后来突然想到，是不是可以这样，将要变回清晰的对象换个清晰的父对象？实验了一下，果然可行，大喜！好像我太out了吧，直觉告诉我，在Flash9+Papervision3D的年代，大家应该都已经知道这个方法的了，但是我确实没有找到……现在将代码重新整理了一遍，记录下来，也许对大家有所帮助。</p>
<p>先看看效果：</p>
<p><object width="500" height="430" data="/wp-content/uploads/2009/03/testf10twosideflipping.swf" type="application/x-shockwave-flash"><param name="src" value="/wp-content/uploads/2009/03/testf10twosideflipping.swf" /></object></p>
<p>主要的类：<br />
 </p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/**
 *
 * @author qhwa, , qhwa@163.com
 * This class is a sample of Flash-10-3D-flipping,
 * that can keep faces clear, not as fuzzy as
 * default.
 *
 * 这个类演示了如何使用Flash10自带的3D功能创建一个
 * 简单的卡片翻转效果，同时保持文字和其他内容的
 * 清晰
 *
 */</span>
&nbsp;
package qhwa.<span style="color: #006600;">twosideflip</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">DisplayObject</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">MouseEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #006600;">TextFieldType</span>;
	<span style="color: #0066CC;">import</span> gs.<span style="color: #006600;">easing</span>.<span style="color: #006600;">Back</span>;
	<span style="color: #0066CC;">import</span> gs.<span style="color: #006600;">TweenLite</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * ...
	 * @author ...
	 */</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Card <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">'../../../lib/goodbyewow02.jpg'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> FrontFace:<span style="color: #000000; font-weight: bold;">Class</span>;
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">'../../../lib/goodbyewow04.jpg'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> BackFace:<span style="color: #000000; font-weight: bold;">Class</span>;
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> fFace:Sprite;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> bFace:Sprite;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> cleanObj:Sprite;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> dirtyObj:Sprite;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Card<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">stage</span><span style="color: #66cc66;">&#41;</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #b1b100;">else</span> addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ADDED_TO_STAGE</span>, init<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> init<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:Event = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			removeEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ADDED_TO_STAGE</span>, init<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #808080; font-style: italic;">// entry point</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> frontBg:DisplayObject = <span style="color: #000000; font-weight: bold;">new</span> FrontFace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> backBg:DisplayObject = <span style="color: #000000; font-weight: bold;">new</span> BackFace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			frontBg.<span style="color: #006600;">x</span> = backBg.<span style="color: #006600;">x</span> = - frontBg.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">2</span>;
			frontBg.<span style="color: #006600;">y</span> = backBg.<span style="color: #006600;">y</span> = - frontBg.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">2</span>;
			fFace = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			bFace = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			fFace.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>frontBg<span style="color: #66cc66;">&#41;</span>;
			bFace.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>backBg<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #808080; font-style: italic;">//背面需要额外处理一下，</span>
			<span style="color: #808080; font-style: italic;">//翻转过来，并且暂时隐藏</span>
			bFace.<span style="color: #006600;">scaleX</span> <span style="color: #66cc66;">*</span>= -<span style="color: #cc66cc;">1</span>;
			bFace.<span style="color: #0066CC;">visible</span> = <span style="color: #000000; font-weight: bold;">false</span>;
			bFace.<span style="color: #006600;">buttonMode</span> = fFace.<span style="color: #006600;">buttonMode</span> = <span style="color: #000000; font-weight: bold;">true</span>;
&nbsp;
			<span style="color: #808080; font-style: italic;">//测试的文字</span>
			<span style="color: #000000; font-weight: bold;">var</span> testTF:<span style="color: #0066CC;">TextField</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			testTF.<span style="color: #0066CC;">width</span> = <span style="color: #cc66cc;">400</span>;
			testTF.<span style="color: #0066CC;">height</span> = <span style="color: #cc66cc;">200</span>;
			testTF.<span style="color: #0066CC;">textColor</span> = 0xFFFFFF;
			testTF.<span style="color: #0066CC;">htmlText</span> = <span style="color: #ff0000;">&quot;验证码是防止被机器人恶意灌水的一个方法，&quot;</span>+
				<span style="color: #ff0000;">&quot;产生一个只有服务器才知道的信息（例如一个单词、数字等），&quot;</span> +
				<span style="color: #ff0000;">&quot;在客户端浏览器中以机器人不能分析的方式（通常是图片）出现，&quot;</span> +
				<span style="color: #ff0000;">&quot;作为判断机器人和真人的一个依据。一般是在服务器端生成图片，&quot;</span> +
				<span style="color: #ff0000;">&quot;由用户在文本框输入看到的文字。&quot;</span>;
			testTF.<span style="color: #006600;">appendText</span><span style="color: #66cc66;">&#40;</span>testTF.<span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#41;</span>;
			testTF.<span style="color: #0066CC;">selectable</span> = <span style="color: #000000; font-weight: bold;">true</span>;
			testTF.<span style="color: #0066CC;">multiline</span> = <span style="color: #000000; font-weight: bold;">true</span>;
			testTF.<span style="color: #0066CC;">wordWrap</span> = <span style="color: #000000; font-weight: bold;">true</span>;
			testTF.<span style="color: #006600;">x</span> = frontBg.<span style="color: #006600;">x</span> + <span style="color: #cc66cc;">10</span>;
			testTF.<span style="color: #006600;">y</span> = frontBg.<span style="color: #006600;">y</span> + <span style="color: #cc66cc;">200</span>;
			testTF.<span style="color: #0066CC;">type</span> = TextFieldType.<span style="color: #006600;">INPUT</span>;
			fFace.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>testTF<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			cleanObj = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			dirtyObj = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			dirtyObj.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>fFace<span style="color: #66cc66;">&#41;</span>;
			dirtyObj.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>bFace<span style="color: #66cc66;">&#41;</span>;
			addChild<span style="color: #66cc66;">&#40;</span>dirtyObj<span style="color: #66cc66;">&#41;</span>;
			addChild<span style="color: #66cc66;">&#40;</span>cleanObj<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			addEventListener<span style="color: #66cc66;">&#40;</span>MouseEvent.<span style="color: #006600;">CLICK</span>, clickHandler<span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<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: #0066CC;">e</span>:MouseEvent = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">// 修改文字时不动</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span> is <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>;
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span> == fFace <span style="color: #66cc66;">||</span> <span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span>.<span style="color: #006600;">parent</span> == fFace<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #808080; font-style: italic;">// flip to back</span>
				dirty<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				TweenLite.<span style="color: #006600;">killTweensOf</span><span style="color: #66cc66;">&#40;</span>dirtyObj<span style="color: #66cc66;">&#41;</span>;
				TweenLite.<span style="color: #006600;">to</span><span style="color: #66cc66;">&#40;</span> dirtyObj, 1, <span style="color: #66cc66;">&#123;</span>
					rotationY:180,
					ease: Back.<span style="color: #006600;">easeOut</span>,
					onComplete: cleanBackFace,
					<span style="color: #0066CC;">onUpdate</span>: update
				<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span> == bFace <span style="color: #66cc66;">||</span> <span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">target</span>.<span style="color: #006600;">parent</span> == bFace<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #808080; font-style: italic;">// flip to front</span>
				dirty<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				TweenLite.<span style="color: #006600;">killTweensOf</span><span style="color: #66cc66;">&#40;</span>dirtyObj<span style="color: #66cc66;">&#41;</span>;
				TweenLite.<span style="color: #006600;">to</span><span style="color: #66cc66;">&#40;</span> dirtyObj, 1, <span style="color: #66cc66;">&#123;</span>
					rotationY:0,
					ease: Back.<span style="color: #006600;">easeOut</span>,
					onComplete: cleanFrontFace,
					<span style="color: #0066CC;">onUpdate</span>: update
				<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/**
		 * 检查应该显示哪个面
		 */</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> update<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			bFace.<span style="color: #0066CC;">visible</span> = dirtyObj.<span style="color: #006600;">rotationY</span> <span style="color: #66cc66;">&gt;</span> 90 <span style="color: #66cc66;">&amp;&amp;</span> dirtyObj.<span style="color: #006600;">rotationY</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">270</span>;
			fFace.<span style="color: #0066CC;">visible</span> = <span style="color: #66cc66;">!</span>bFace.<span style="color: #0066CC;">visible</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/**
		 * 清晰化封面
		 */</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> cleanFrontFace<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>dirtyObj.<span style="color: #006600;">contains</span><span style="color: #66cc66;">&#40;</span>fFace<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				dirtyObj.<span style="color: #006600;">removeChild</span><span style="color: #66cc66;">&#40;</span>fFace<span style="color: #66cc66;">&#41;</span>;
				cleanObj.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>fFace<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/**
		 * 清晰化背面
		 */</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> cleanBackFace<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>dirtyObj.<span style="color: #006600;">contains</span><span style="color: #66cc66;">&#40;</span>bFace<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				dirtyObj.<span style="color: #006600;">removeChild</span><span style="color: #66cc66;">&#40;</span>bFace<span style="color: #66cc66;">&#41;</span>;
				cleanObj.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>bFace<span style="color: #66cc66;">&#41;</span>;
				bFace.<span style="color: #006600;">scaleX</span> <span style="color: #66cc66;">*</span>= -<span style="color: #cc66cc;">1</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/**
		 * 封面和背面都放入dirty容器，进行旋转操作
		 */</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> dirty<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>cleanObj.<span style="color: #006600;">contains</span><span style="color: #66cc66;">&#40;</span>fFace<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> cleanObj.<span style="color: #006600;">contains</span><span style="color: #66cc66;">&#40;</span>bFace<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> face:DisplayObject = cleanObj.<span style="color: #006600;">getChildAt</span><span style="color: #66cc66;">&#40;</span>0<span style="color: #66cc66;">&#41;</span>;
				cleanObj.<span style="color: #006600;">removeChild</span><span style="color: #66cc66;">&#40;</span>face<span style="color: #66cc66;">&#41;</span>;
				dirtyObj.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>face<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>face == fFace<span style="color: #66cc66;">&#41;</span>
				<span style="color: #66cc66;">&#123;</span>
					dirtyObj.<span style="color: #006600;">swapChildren</span><span style="color: #66cc66;">&#40;</span>face, bFace<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					bFace.<span style="color: #006600;">scaleX</span> <span style="color: #66cc66;">*</span>= -<span style="color: #cc66cc;">1</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><a href="http://q.pnq.cc/wp-content/uploads/2009/03/test_f10_twosideflipping.zip">下载源文件 (source)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/268/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>专业的Flash相册</title>
		<link>http://q.pnq.cc/archives/266</link>
		<comments>http://q.pnq.cc/archives/266#comments</comments>
		<pubDate>Mon, 23 Feb 2009 13:19:00 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Cool Sites : 酷站 -]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/archives/266</guid>
		<description><![CDATA[因为近期工作的内容很多涉及到Flash相册，这段时间我对网上的Flash相册比较留意，试着整理了一些很好的Flash相册形式。但是我发现这些整理基本上属于多此一举，因为有个提供Flash相册的网站，里面的效果涵盖了我整理的大部分，而且可以很详细地自定义细节！她的名字叫做：PictureTrail

]]></description>
			<content:encoded><![CDATA[<p>因为近期工作的内容很多涉及到Flash相册，这段时间我对网上的Flash相册比较留意，试着整理了一些很好的Flash相册形式。但是我发现这些整理基本上属于多此一举，因为有个提供Flash相册的网站，里面的效果涵盖了我整理的大部分，而且可以很详细地自定义细节！她的名字叫做：<a href="http://www.picturetrail.com" target="_blank">PictureTrail</a></p>
<p><a href="http://www.picturetrail.com" target="_blank"><img src="http://www.picturetrail.com/static/images/logo.gif" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/266/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FlashPlayer 10 新功能：Vector</title>
		<link>http://q.pnq.cc/archives/251</link>
		<comments>http://q.pnq.cc/archives/251#comments</comments>
		<pubDate>Mon, 12 Jan 2009 12:38:18 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Flash -]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[vector]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=251</guid>
		<description><![CDATA[FlashPlayer 10附带的内部类，多了一个vector，它的作用是对数组的数据结构进行优化，相当于一串只能存放指定数据类型的链表。所以在执行效率上，比数组有很大的提升。 Adobe的文档写得很详细，值得一看。他的 forEach, every 方法，很强大。
]]></description>
			<content:encoded><![CDATA[<p>FlashPlayer 10附带的内部类，多了一个vector，它的作用是对数组的数据结构进行优化，相当于一串只能存放指定数据类型的链表。所以在执行效率上，比数组有很大的提升。 Adobe的<a href="http://help.adobe.com/zh_CN/AS3LCR/Flash_10.0/Vector.html">文档</a>写得很详细，值得一看。他的 forEach, every 方法，很强大。</p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/251/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mindmeister：免费的在线思维导图程序</title>
		<link>http://q.pnq.cc/archives/241</link>
		<comments>http://q.pnq.cc/archives/241#comments</comments>
		<pubDate>Thu, 08 Jan 2009 16:26:42 +0000</pubDate>
		<dc:creator>qhwa</dc:creator>
				<category><![CDATA[- Cool Sites : 酷站 -]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[mind map]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[思维导图]]></category>
		<category><![CDATA[脑图]]></category>

		<guid isPermaLink="false">http://q.pnq.cc/?p=241</guid>
		<description><![CDATA[
思维导图，又称概念图、心智图、脑图、Mind map等，是描述一些概念的图。有很多软件可以方便地绘制脑图，例如 Mindjet 公司的软件 MindManager 是我用过最好的的软件，不过是收费的，而且只能在windows下用，自从我用ubuntu之后就一直没有找到好用又美观的概念图程序。
今天看到一个非常不错的在线概念图软件：Mindmeister，可以媲美MindManager的，而且是免费、跨平台的（废话，人家是web application嘛！）、设计也很美观。

试用了一下，功能非常强大，除了基本功能之外，还有分享、离线编辑、发送到Email和手机的功能。
值得一提的是，不仅可以保存到服务器上，还可以导出成很多格式，甚至兼容MindManager！

via: 免费资源网路社群
____
ps. 看到这个，不免又回忆起波希米亚的一篇文章：《未来我们只需要浏览器》，现在的在线程序功能越来越强大，也许有一天，操作系统＝web。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mindmeister.com"><img class="alignnone size-full wp-image-244" title="snap0021_online-mind-mapping-mindmeister" src="http://q.pnq.cc/wp-content/uploads/2009/01/snap0021_online-mind-mapping-mindmeister.png" alt="snap0021_online-mind-mapping-mindmeister" width="500" height="294" /></a></p>
<p><a href="http://baike.baidu.com/view/30054.htm">思维导图</a>，又称概念图、心智图、脑图、Mind map等，是描述一些概念的图。有很多软件可以方便地绘制脑图，例如 <a href="http://www.mindjet.com/">Mindjet</a> 公司的软件 <a href="http://www.mindjet.com/products/mindmanager/">MindManager</a> 是我用过最好的的软件，不过是收费的，而且只能在windows下用，自从我用ubuntu之后就一直没有找到好用<strong>又美观</strong>的概念图程序。</p>
<p>今天看到一个非常不错的在线概念图软件：<a href="http://www.mindmeister.com/">Mindmeister</a>，可以媲美MindManager的，而且是免费、跨平台的（废话，人家是web application嘛！）、设计也很美观。</p>
<p><a href="http://www.mindmeister.com/"><img class="alignnone size-full wp-image-243" title="snap0022_mind-map-ivote-mindmeister" src="http://q.pnq.cc/wp-content/uploads/2009/01/snap0022_mind-map-ivote-mindmeister.png" alt="snap0022_mind-map-ivote-mindmeister" width="500" height="519" /></a></p>
<p>试用了一下，功能非常强大，除了基本功能之外，还有分享、离线编辑、发送到Email和手机的功能。<span id="more-241"></span></p>
<p>值得一提的是，不仅可以保存到服务器上，还可以导出成很多格式，甚至兼容MindManager！<br />
<img class="alignnone size-full wp-image-242" title="snap0023_mind-map-ivote-mindmeister" src="http://q.pnq.cc/wp-content/uploads/2009/01/snap0023_mind-map-ivote-mindmeister.png" alt="snap0023_mind-map-ivote-mindmeister" width="500" height="394" /></p>
<p>via: <a href="http://www.freegroup.org/2009/01/free-online-mind-mapping-mindmeister/">免费资源网路社群</a></p>
<p>____<br />
ps. 看到这个，不免又回忆起<a href="http://blog.b3inside.com/">波希米亚</a>的一篇文章：<a href="http://blog.b3inside.com/essay/we-need-browser-only-in-the-future/">《未来我们只需要浏览器》</a>，现在的在线程序功能越来越强大，也许有一天，操作系统＝web。</p>
]]></content:encoded>
			<wfw:commentRss>http://q.pnq.cc/archives/241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
