<?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>LuoYe</title>
	<atom:link href="http://www.luoye.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.luoye.org/blog</link>
	<description>又一个 WordPress 博客</description>
	<lastBuildDate>Wed, 11 Jan 2012 05:51:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Flex AIR 最小化到系统托盘</title>
		<link>http://www.luoye.org/blog/2012/01/flex-air-dock/</link>
		<comments>http://www.luoye.org/blog/2012/01/flex-air-dock/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 05:45:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=344</guid>
		<description><![CDATA[import mx.events.CloseEvent; import mx.controls.Alert; //====================================系统关闭和托盘小图标处理================= //系统小图标 private var dockImage:BitmapData; //初始化Application里调用此方法,完成上面的第一步: public function initApplication():void{ var loader:Loader=new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,prepareForSystray);//这里就是完成第一步的任务项,这个prepareForSystray就是对托盘的生在和菜单的控制 loader.load(new URLRequest(&#8220;1-5.gif&#8221;));//这里先要加载托盘图标的小图片 this.addEventListener(Event.CLOSING,closingApplication);//设置关闭体的事件 } //关闭窗体的事件 public function closingApplication(event:Event):void{ event.preventDefault();//阻止默认的事件 Alert.yesLabel=&#8221;退出&#8221;; Alert.noLabel=&#8221;最小化&#8221;; Alert.show(&#8220;退出应用程序或者最小化窗口到系统小图标？&#8221;, &#8220;系统提示&#8221;, Alert.YES&#124;Alert.NO&#124;Alert.CANCEL, this, alertCloseHandler);//弹出自定义的选择框, 关于Alert的详细用法,参考官方文档或我前面的相关文章. Alert.yesLabel=&#8221;是&#8221;; Alert.noLabel=&#8221;否&#8221;; } //根据用户的选择来判断做什么,这里选择是就是关闭,选择否(Mini)就是最小化到托盘. private function alertCloseHandler(event:CloseEvent):void{ if(event.detail==Alert.YES){ closeApp(event); }else if(event.detail==Alert.NO){ dock();//最小化到托盘 } } //生成托盘 public function prepareForSystray(event:Event):void{ dockImage=event.target.content.bitmapData; if(NativeApplication.supportsSystemTrayIcon){ setSystemTrayProperties();//设置托盘菜单的事件 [...]]]></description>
			<content:encoded><![CDATA[<p>import mx.events.CloseEvent;<br />
import mx.controls.Alert;<br />
//====================================系统关闭和托盘小图标处理=================</p>
<p>//系统小图标<br />
private var dockImage:BitmapData;</p>
<p>//初始化Application里调用此方法,完成上面的第一步:<br />
public function initApplication():void{<br />
var loader:Loader=new Loader();<br />
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,prepareForSystray);//这里就是完成第一步的任务项,这个prepareForSystray就是对托盘的生在和菜单的控制<br />
loader.load(new URLRequest(&#8220;1-5.gif&#8221;));//这里先要加载托盘图标的小图片<br />
this.addEventListener(Event.CLOSING,closingApplication);//设置关闭体的事件<br />
}<br />
<span id="more-344"></span><br />
//关闭窗体的事件<br />
public function closingApplication(event:Event):void{<br />
event.preventDefault();//阻止默认的事件<br />
Alert.yesLabel=&#8221;退出&#8221;;<br />
Alert.noLabel=&#8221;最小化&#8221;;<br />
Alert.show(&#8220;退出应用程序或者最小化窗口到系统小图标？&#8221;, &#8220;系统提示&#8221;, Alert.YES|Alert.NO|Alert.CANCEL, this, alertCloseHandler);//弹出自定义的选择框, 关于Alert的详细用法,参考官方文档或我前面的相关文章.<br />
Alert.yesLabel=&#8221;是&#8221;;<br />
Alert.noLabel=&#8221;否&#8221;;<br />
}<br />
//根据用户的选择来判断做什么,这里选择是就是关闭,选择否(Mini)就是最小化到托盘.<br />
private function alertCloseHandler(event:CloseEvent):void{<br />
if(event.detail==Alert.YES){<br />
closeApp(event);<br />
}else if(event.detail==Alert.NO){<br />
dock();//最小化到托盘<br />
}<br />
}</p>
<p>//生成托盘<br />
public function prepareForSystray(event:Event):void{<br />
dockImage=event.target.content.bitmapData;<br />
if(NativeApplication.supportsSystemTrayIcon){<br />
setSystemTrayProperties();//设置托盘菜单的事件<br />
SystemTrayIcon(NativeApplication.nativeApplication.icon).menu=createSystrayRootMenu();//生成托盘菜单<br />
}<br />
dock();<br />
}</p>
<p>//生成托盘右键菜单<br />
public function createSystrayRootMenu():NativeMenu{<br />
var menu:NativeMenu = new NativeMenu();<br />
var openNativeMenuItem:NativeMenuItem = new NativeMenuItem(&#8220;还原&#8221;);//生成OPEN菜单项<br />
var exitNativeMenuItem:NativeMenuItem = new NativeMenuItem(&#8220;退出&#8221;);//同理<br />
openNativeMenuItem.addEventListener(Event.SELECT, undock);<br />
exitNativeMenuItem.addEventListener(Event.SELECT, closeApp);//添加EXIT菜单项事件<br />
menu.addItem(openNativeMenuItem);<br />
menu.addItem(new NativeMenuItem(&#8220;&#8221;,true));//separator<br />
menu.addItem(exitNativeMenuItem);//将菜单项加入菜单</p>
<p>return menu;<br />
}<br />
//设置托盘图标的事件<br />
private function setSystemTrayProperties():void{</p>
<p>SystemTrayIcon(NativeApplication.nativeApplication .icon).tooltip =&#8221;我的系统&#8221;;<br />
SystemTrayIcon(NativeApplication.nativeApplication .icon).addEventListener(MouseEvent.CLICK, undock);<br />
stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, nwMinimized);<br />
}</p>
<p>//最小化窗体<br />
private function nwMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void {<br />
if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED) {<br />
displayStateEvent.preventDefault();//阻止系统默认的关闭窗体事件<br />
dock();//将程序放入托盘<br />
}<br />
}</p>
<p>//将本地应用程序放到托盘<br />
public function dock():void {<br />
//stage.nativeWindow.visible = false; //设置本地程序窗体不可见<br />
NativeApplication.nativeApplication.icon.bitmaps = [dockImage];//设置托盘的图标<br />
}</p>
<p>//激活程序窗体<br />
public function undock(evt:Event):void {<br />
//stage.nativeWindow.visible = true;//设置本地程序窗体可见<br />
stage.nativeWindow.orderToFront();//设置本地程序窗体到最前端<br />
//NativeApplication.nativeApplication .icon.bitmaps = [];//将托盘图标清空<br />
}</p>
<p>//关闭程序窗体<br />
private function closeApp(evt:Event):void {<br />
stage.nativeWindow.close();<br />
}<br />
//====================================系统关闭和托盘小图标处理=================</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2012/01/flex-air-dock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe AIR 3新特性（支持iOS和Android平台）</title>
		<link>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/</link>
		<comments>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 12:58:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=341</guid>
		<description><![CDATA[自从2008年发布了第一个版本，Adobe AIR已经走过了很长的一段路。在此期间，我们为AIR增加了几十个较大的特性，上百个较小的特性，性能优化和错误修复，并且我们支持3个额外的平台：iOS (iPhone和iPad),Android, 和Adobe AIR for TV. AIR 3将是我们在不到两年半的时间里的第11个发行版本。虽然我们每次的发行版都代表了很大的进步，但我个人觉得这次是非比寻常的。AIR 3包括以下新的API和特性： Stage3D（桌面特性）。Stage3D是一个底层的，具备硬件加速的二维和三维渲染的 API。对于AIR 3，目前这些API只能在AIR的桌面版本中使用，然而，未来这些特性也将进入移动设备。Stage3D是一个非常重要的特性，它的意义之大让我们感到言语都难以描述，您可以从这里得到更加详细的信息， 请参阅Stage 3D页面。 本地扩展 （所有平台）。这又是一个重要的特性。从AIR 3的版本开始，开发者可以通过绑定本地扩展和应用程序，来增强AIR运行时的功能，然后他们就可以在ActionScript中调用那些扩展（这个特性原先只在Adobe AIR 2.5 for TV中存在，但是基于AIR 3，这个特性在所有的平台可用）。您可以认为Adobe AIR本地扩展（简称ANEs）就是ActionScript库（SWCs），只不过是包含了本机代码实现。ANEs的适用场合，包括让您的应用程序访问 AIR所不支持的原生API（见下面的例子），并授权在某些情况下访问本机代码，以达到更好的性能。关于更多AIR 3本地扩展的信息，请参阅奥利弗.高盛的这篇文章:扩展Adobe AIR。 Android Market的授权集成 （显然只支持Android）。使用ANE文件，开发人员可以访问Android Market的授权服务，让发布者执行许可政策。这是一个能体现ANE强大特性的很好的例子：因为这个特性(授权服务)在iOS中是不可用的，所以我们不会把它作为AIR的直接支持的功能；但是，ANE可以保证我们运行于Android设备的AIR应用可以很轻松的访问这些API。 运行时捆绑 （Android和桌面）。在之前的版本中，需要您的最终用户在安装您的应用之前，已经安装了AIR的运行时(如果没有，则必须先安装AIR运行时)，如果您想改变这个过程(让您的应用程序安装过程和其它本地安装的应用程序没有区别)，或者您是想控制您的应用程序运行所需的AIR版本，AIR 3允许您捆绑AIR运行时和您的应用程序。捆绑运行时非常容易，当您构建一个Android应用时可以设置apk-captive-runtime变量，如果是构建桌面应用，则可以设置bundle变量。（注意在iOS上AIR一直使用一个捆绑的运行时，虽然其机制不太相同。） 背景音频播放 （对于iOS是新特性;在Android上之前就被支持了）。由于iOS独特的多任务模式，在之前如果我们想在AIR应用处于非活动状态的时候继续播放音频，是不可能的。在AIR 3中，您所需要做的只是修改您的应用程序描述文件，声明您需要播放背景音乐，然后它会自动工作。（基本上，当应用程序被放置到后台程序中，它将继续运行。但是，所有的屏幕更新将被禁用，以保持电池寿命，并符合iOS的多任务要求。） 在iPad对CameraRoll的支持。虽然CameraRoll在技术上已经被iPad支持，但是我们在AIR 3中增加了很多更好的支持。在iPad上，图片选择器不再占用整个屏幕，在iPhone和iPod touch上也是如此。相反，它会在调用它的UI组件的相对位置上，出现一个浮动的面板。使用额外的CameraRollBrowseOptions类，开发人员可以选择图像选择器的大小和位置，并指定调用它的UI组件的位置。欲了解更多信息和代码示例，请参阅我的博客文章， 如何正确使用iPad上的CameraRoll API 。 视频硬件加速 （移动设备）：AIR 2.5通过StageVideo为TV带来了视频硬件加速;现在AIR 3则为移动设备也提供了StageVideo。 本机文本字段（移动设备） 。之前版本的AIR提供给开发者访问底层渲染的能力，比如StageVideo (视频硬件加速)和StageWebView (本地的HTML渲染)。AIR 3提供了StageText的API，它允许开发人员将系统原生的文本字段放置在移动应用程序中。虽然您仍然可以使用Flash文本字段，但是 StageText文本字段可以使用所有操作系统底层支持的特性，比如放大镜，文本选择，自动更正等等。 前置摄像头支持 （iOS和Android）。现在ActionScript的摄像头API可以访问 iOS和Android设备的前置摄像头和后置摄像头(如果是Android设备，至少需要2.3的版本)。您可以使用新的 Camera.position属性以及新CameraPosition类中的常量（背部，正面，和UNKNOWN）来确定摄像机的位置。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3前置摄像头支持 。 移动设备的加密本地存储(带来了台式机和移动设备之间的等价实现)。EncryptedLocalStore的API曾经只在桌面上可用，现在则进入了iOS和Android。这个API用于安全地存储用户凭据，加密密钥，私密信息，和类似的重要信息。 设备扬声器控制 （移动设备）。使用新的SoundMixer audioPlaybackMode属性，和新的AudioPlaybackMode类中的常量（媒体和语音），开发人员可以控制是否是通过电话的听筒或扬声器播放音频。 原生JSON支持 （移动和台式机）。原先只能使用ActionScript来解析JSON，现在则是由运行时提供更有效的原生JSON支持。相对于ActionScript实现，原生的JSON API的速度更快，使用更少的内存。欲了解更多信息和代码示例，请参阅 AIR [...]]]></description>
			<content:encoded><![CDATA[<p>自从2008年发布了第一个版本，Adobe AIR已经走过了很长的一段路。在此期间，我们为AIR增加了几十个较大的特性，上百个较小的特性，性能优化和错误修复，并且我们支持3个额外的平台：iOS (iPhone和iPad),Android, 和Adobe AIR for TV.</p>
<p>AIR 3将是我们在不到两年半的时间里的第11个发行版本。虽然我们每次的发行版都代表了很大的进步，但我个人觉得这次是非比寻常的。AIR 3包括以下新的API和特性：<span id="more-341"></span></p>
<ul>
<li><strong>Stage3D（</strong>桌面特性）。Stage3D是一个底层的，具备硬件加速的二维和三维渲染的 API。对于AIR 3，目前这些API只能在AIR的桌面版本中使用，然而，未来这些特性也将进入移动设备。Stage3D是一个非常重要的特性，它的意义之大让我们感到言语都难以描述，您可以从这里得到更加详细的信息， 请参阅Stage 3D页面。</li>
<li><strong>本地扩展</strong> （所有平台）。这又是一个重要的特性。从AIR 3的版本开始，开发者可以通过绑定本地扩展和应用程序，来增强AIR运行时的功能，然后他们就可以在ActionScript中调用那些扩展（这个特性原先只在Adobe AIR 2.5 for TV中存在，但是基于AIR 3，这个特性在所有的平台可用）。您可以认为Adobe AIR本地扩展（简称ANEs）就是ActionScript库（SWCs），只不过是包含了本机代码实现。ANEs的适用场合，包括让您的应用程序访问 AIR所不支持的原生API（见下面的例子），并授权在某些情况下访问本机代码，以达到更好的性能。关于更多AIR 3本地扩展的信息，请参阅奥利弗.高盛的这篇文章:扩展Adobe AIR。</li>
<li><strong>Android Market的授权集成</strong> （显然只支持Android）。使用ANE文件，开发人员可以访问Android Market的授权服务，让发布者执行许可政策。这是一个能体现ANE强大特性的很好的例子：因为这个特性(授权服务)在iOS中是不可用的，所以我们不会把它作为AIR的直接支持的功能；但是，ANE可以保证我们运行于Android设备的AIR应用可以很轻松的访问这些API。</li>
<li><strong>运行时捆绑</strong> （Android和桌面）。在之前的版本中，需要您的最终用户在安装您的应用之前，已经安装了AIR的运行时(如果没有，则必须先安装AIR运行时)，如果您想改变这个过程(让您的应用程序安装过程和其它本地安装的应用程序没有区别)，或者您是想控制您的应用程序运行所需的AIR版本，AIR 3允许您捆绑AIR运行时和您的应用程序。捆绑运行时非常容易，当您构建一个Android应用时可以设置apk-captive-runtime变量，如果是构建桌面应用，则可以设置bundle变量。（注意在iOS上AIR一直使用一个捆绑的运行时，虽然其机制不太相同。）</li>
<li><strong>背景音频播放</strong> （对于iOS是新特性;在Android上之前就被支持了）。由于iOS独特的多任务模式，在之前如果我们想在AIR应用处于非活动状态的时候继续播放音频，是不可能的。在AIR 3中，您所需要做的只是修改您的应用程序描述文件，声明您需要播放背景音乐，然后它会自动工作。（基本上，当应用程序被放置到后台程序中，它将继续运行。但是，所有的屏幕更新将被禁用，以保持电池寿命，并符合iOS的多任务要求。）</li>
<li><strong>在iPad对CameraRoll的支持</strong>。虽然CameraRoll在技术上已经被iPad支持，但是我们在AIR 3中增加了很多更好的支持。在iPad上，图片选择器不再占用整个屏幕，在iPhone和iPod touch上也是如此。相反，它会在调用它的UI组件的相对位置上，出现一个浮动的面板。使用额外的CameraRollBrowseOptions类，开发人员可以选择图像选择器的大小和位置，并指定调用它的UI组件的位置。欲了解更多信息和代码示例，请参阅我的博客文章， 如何正确使用iPad上的CameraRoll API 。</li>
<li><strong>视频硬件加速</strong> （移动设备）：AIR 2.5通过StageVideo为TV带来了视频硬件加速;现在AIR 3则为移动设备也提供了StageVideo。</li>
<li><strong>本机文本字段</strong>（移动设备） 。之前版本的AIR提供给开发者访问底层渲染的能力，比如StageVideo (视频硬件加速)和StageWebView (本地的HTML渲染)。AIR 3提供了StageText的API，它允许开发人员将系统原生的文本字段放置在移动应用程序中。虽然您仍然可以使用Flash文本字段，但是 StageText文本字段可以使用所有操作系统底层支持的特性，比如放大镜，文本选择，自动更正等等。</li>
<li><strong>前置摄像头支持</strong> （iOS和Android）。现在ActionScript的摄像头API可以访问 iOS和Android设备的前置摄像头和后置摄像头(如果是Android设备，至少需要2.3的版本)。您可以使用新的 Camera.position属性以及新CameraPosition类中的常量（背部，正面，和UNKNOWN）来确定摄像机的位置。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3前置摄像头支持 。</li>
<li><strong>移动设备的加密本地存储</strong>(带来了台式机和移动设备之间的等价实现)。EncryptedLocalStore的API曾经只在桌面上可用，现在则进入了iOS和Android。这个API用于安全地存储用户凭据，加密密钥，私密信息，和类似的重要信息。</li>
<li><strong>设备扬声器控制</strong> （移动设备）。使用新的SoundMixer audioPlaybackMode属性，和新的AudioPlaybackMode类中的常量（媒体和语音），开发人员可以控制是否是通过电话的听筒或扬声器播放音频。</li>
<li><strong>原生JSON支持</strong> （移动和台式机）。原先只能使用ActionScript来解析JSON，现在则是由运行时提供更有效的原生JSON支持。相对于ActionScript实现，原生的JSON API的速度更快，使用更少的内存。欲了解更多信息和代码示例，请参阅 AIR 3中的原生JSON支持 。</li>
<li><strong>套接字(Socket)改进</strong>（移动和桌面）。曾经我们认为应该很容易的通过 ProgressEvent.SOCKET_DATA来读取从网络传到ActionScript套接字缓冲区的数据，并确定有多少个字节可供读取（Socket.bytesAvailable）。然而，事实尚非如此。换句话说，在AIR 3之前，没有办法知道有多少数据从ActionScript套接字成功地写入了网络的缓冲区，也不可能知道有多少数据正在等待被写入。这导致开发者不确定调用套接字的关闭是否是安全的，或知道当用户想关闭应用程序的时候，是否有一个网络进程还在处理中。通过AIR 3，开发人员可以使用OutputProgressEvent.OUTPUT_PROGRESS事件和Socket新属性.bytesPending，以确定有多少数据被写入到网络，多少数据在ActionScript套接字中仍在等待写入。这些新的API可以帮助我们构建更强壮的依赖套接字网络访问的应用程序。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3中套接字的改进 。</li>
<li><strong>H.264视频编码</strong> （桌面）。您可以将摄像头捕获的视频基于H.264进行编码。</li>
<li><strong>JPEG XR的支持</strong> （移动和台式机）。AIR 3现在支持JPEG XR，一个新的文件格式，相比JPEG有几个优点。例如，JPEG XR提供了更好的压缩率，更小的压缩损失，更准确的色彩，和Alpha透明度。欲了解更多信息，请查阅Wikipedia上的JEPG XR文章。</li>
<li><strong>更高分辨率的位图</strong>（移动和桌面） 。在之前的AIR中，位图被限制为16万像素（16777215像素）和8191的最大宽度/高度。在AIR 3中，所有的限制已被删除，这意味着现在的最大尺寸是由主机操作系统决定的，而不是AIR限制的。</li>
<li><strong>多声道数字音频输出</strong> （只支持AIR for TV）。现在电视上的Adobe AIR可以播放杜比数字+ 5.1环绕声和DTS 5.1音频流。新的Capabilities.hasMultiChannelAudio属性，新的AudioDecoder类（其中包含代表几个不同的多声道音频类型的常量），和Capabilities.serverString属性，都可以让开发者来检测设备的多声道音频功能，并从 ActionScript中通过RTMP协议输出正确的音频比特流。</li>
<li><strong>高级控制器支持</strong> （只支持AIR for TV）。使用新的GameInput API，开发人员可以构建基于高级电视控制器的游戏。一些新的API允许枚举设备（可用控制器），枚举设备的控制功能（按钮，触发器，加速度等），并从设备中得到控制值。</li>
<li><strong>更容易删除一个容器的所有的子元件</strong> （所有平台）。DisplayObjectContainer现在已经具备了removeChildren（）函数，它可以只用一个方法删除所有的子元件。这当然比下面的操作更有效：
<p>（this.numChildren&gt; 0）this.removeChildAt（0）</li>
<li><strong>更容易判断MovieClip是否在播放</strong> （所有平台）。通过使用新的isPlaying属性，可以很容易判断一个电影剪辑是否在播放。</li>
<li><strong>GC建议的API</strong>(所有平台）。新的System.pauseForGCIfCollectionImminent功能，可以让AIR开发人员更好地控制运行时的自动垃圾回收机制。由于垃圾回收有可能造成动画或音频的暂停，开发者可以在用户难以察觉的时候，使用这个方法鼓励垃圾回收。</li>
<li><strong>安全随机数生成</strong> （移动和桌面）。Adobe AIR中一直有Math.random方法可用，返回“伪随机”的数字，也就是说，这似乎是随机的，但总是包含一些非随机性（比如时间戳）的数字。AIR 3提供了一个用于生成随机数的新方法，称为generateRandomBytes（），位于flash.crypto包。由于 generateRandomBytes（）函数使用操作系统API来产生随机数（在Windows上是CryptGenRandom ，在OSX上是/dev/random , 在Android上是/dev/urandom, 在iOS上则是SecRandomCopyBytes），由此产生的随机数更有效，更安全。</li>
<li><strong>三次贝塞尔曲线</strong> （所有平台） 。新的cubicCurveTo（）方法是Graphics类的功能，允许您以编程方式绘制三次贝塞尔曲线，而且不使用第三方ActionScript代码。</li>
</ul>
<p>Adobe AIR 3作为一个候选发布版可以在Adobe实验室中找到 。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as3 事件流机制的解释</title>
		<link>http://www.luoye.org/blog/2011/09/as3-even/</link>
		<comments>http://www.luoye.org/blog/2011/09/as3-even/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 05:00:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=338</guid>
		<description><![CDATA[通俗一点说吧 房子里面 有 冰箱 冰箱里面有饭盒 饭盒里面有食物 你可以理解成flash画面上的平面显示，也就是三层内嵌结构 Sprite嵌Sprite 再嵌Sprite 当你用鼠标在 食物上点击的时候 FlashPlayer就会沿路径向下寻找 这个过程叫做 捕获阶段，这个过程会走过 房子 冰箱 饭盒 第二步是目标阶段 即已经找到 食物了 第三步是冒泡阶段 FlashPlayer会沿原路向上回索 走的顺序是 饭盒 冰箱 房子 你可以理解成 捕获阶段是找出从顶级stage到目标食物之间的所有父子级包含关系 然后 找到目标了 ，携带着目标所发出的事件对象， 再根据捕获阶段找到的路 ，往回走，看看到底有哪些父级对象侦听了目标所发出的事件类型 上面的明白了 那你就很容易理解 target 和 currentTarget的区别了 target 就是目标对象 currentTarget 在事件流(冒泡阶段)中是不断变化的，依据是当时冒泡冒到哪一级对象 比如一个影片剪辑MC 里面有一个文本框TextField的话，我们为MC赋了侦听事件的话， 如果当时点击的范围在文本框上的话，target会指向这个文本框 而非添加侦听的MC， 在事件发生之初 ，即在目标阶段时 traget == currentTarget的 但因为会有冒泡事件 ，所以在事件冒泡到上级MC的时候，currentTarget 就等于MC了 但在整个事件流过程中，target是不变的 [...]]]></description>
			<content:encoded><![CDATA[<p>通俗一点说吧</p>
<p>房子里面 有 冰箱  </p>
<p>冰箱里面有饭盒</p>
<p>饭盒里面有食物</p>
<p>你可以理解成flash画面上的平面显示，也就是三层内嵌结构   Sprite嵌Sprite 再嵌Sprite</p>
<p>当你用鼠标在 食物上点击的时候</p>
<p>FlashPlayer就会沿路径向下寻找  这个过程叫做 捕获阶段，这个过程会走过  房子  冰箱 饭盒<span id="more-338"></span></p>
<p>第二步是目标阶段  即已经找到 食物了</p>
<p>第三步是冒泡阶段 FlashPlayer会沿原路向上回索 走的顺序是  饭盒 冰箱  房子</p>
<p>你可以理解成  捕获阶段是找出从顶级stage到目标食物之间的所有父子级包含关系</p>
<p>然后 找到目标了  ，携带着目标所发出的事件对象，</p>
<p>再根据捕获阶段找到的路 ，往回走，看看到底有哪些父级对象侦听了目标所发出的事件类型</p>
<p>上面的明白了 那你就很容易理解  target 和 currentTarget的区别了</p>
<p>target 就是目标对象   currentTarget 在事件流(冒泡阶段)中是不断变化的，依据是当时冒泡冒到哪一级对象</p>
<p>比如一个影片剪辑MC 里面有一个文本框TextField的话，我们为MC赋了侦听事件的话，</p>
<p>如果当时点击的范围在文本框上的话，target会指向这个文本框 而非添加侦听的MC，<br />
在事件发生之初 ，即在目标阶段时   traget == currentTarget的<br />
但因为会有冒泡事件 ，所以在事件冒泡到上级MC的时候，currentTarget 就等于MC了</p>
<p>但在整个事件流过程中，target是不变的 ，则哪一个显示对象发生的 ，target永远就是那个对象</p>
<p>最后我们再来看看相关的API知识 </p>
<p>public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void </p>
<p>我们平时用到的addEventListener其实它后边是有5个参数的 ，其中第一 第二个是最常用的 必须指定的参数，其它3个可根据情况使用 所以有默认值</p>
<p>type：即平时那些 MouseEvent.MOUSE_DOWN 之类的， 要侦听的事件类型<br />
listener：即事件的处理函数</p>
<p>useCapture：设置事件侦听的阶段，因为事件流机制是分成三个部分的 捕获 目标 冒泡 ，这个函数默认不指定是false ，即运作于 冒泡阶段的</p>
<p>有时候我们希望父级的侦听先于目标对象，即在捕获阶段就触发父级对象的侦听事件，就可以指定这个参数为true了，否则不指定就是false值</p>
<p>addEventListener(MouseEvent.MOUSE_DOWN, func_mouseDown , true)</p>
<p>后边两个参数不常用  第一个是设置事件的优先级 在多个事件同级的情况下 这个设置执行优先级<br />
第二个是设置处理函数的弱引用 ，  即 上面的 func_mouseDown ，是基于AVM2的内存清理机制 一般极少使用 不详释</p>
<p>另外 再补充两个属性的说明 </p>
<p>显示对象中 </p>
<p>InteractiveObject  &#8211; DisplayObject &#8211;  EventDispatcher &#8211; Object </p>
<p>可接受鼠标键盘的交互对象，它是有一个属性，名字是：mouseEnabled</p>
<p>前边已经说了，as3的显示列表 事件机制是 基于事件流的 </p>
<p>比如有时候 我们为子级和父级都侦听了事件  addEventListener ，但突然有需要屏蔽父级的事件侦听 </p>
<p>我们不可能每次都去removeEventListener的，这时候我们就可以通过设置父级的mouseEnabled = false   ，来临时屏蔽父级对象的事件侦听，需要的时候  mouseEnabled = true就可以马上重新侦听事件</p>
<p>另一个属性是 mouseChildren ，这个属性是影响子级对象的</p>
<p>比如我们平时如果事件处理中用到target的话，  比如我想用一个影片剪辑MC来做按钮的话</p>
<p>前面已经说过了 如果里面有文本的话，点击的时候 侦听事件中的traget有可能会指向这个TextField， 而非上级的MC，这样的话，就容易出错了</p>
<p>如果我们不想发生这样的错误 ，就可以设置 MC的 mouseChildren = false</p>
<p>來屏蔽子级对象的事件发生 ，即事件流过程，最后一级到达  MC 就不会再向下遍历的了</p>
<p>在这一级就马上转入目标阶段 转而再进入冒泡阶段</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/09/as3-even/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP网站MVC架构模式中的种种误区</title>
		<link>http://www.luoye.org/blog/2011/06/php-mvc-mistakes/</link>
		<comments>http://www.luoye.org/blog/2011/06/php-mvc-mistakes/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 14:36:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php mvc]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=330</guid>
		<description><![CDATA[MVC架构模式已不再是新技术，也不再是新名词。但是，如果你能大概看一看因内的开源的PHP开发框架，或者国内的PHP开源软件。我们不难发现，很多这们的代码与其说是MVC，还不如称其为东施效颦。很多是为MVC而MVC。或者，只提供MVC的部分功能。而不是真正意义上的MVC。这其中，很多原因当然是软件开发者不懂得设计模式，不了解MVC的根本目的。     由此，我们先明确一下，MVC的根本目的有哪些：     1、分工：使用MVC可以把数据库开发，程序业务逻辑开发，页面开发分开。      多数人说起MVC的好处，仅限于这一点。认为，MVC不外乎是利于大型团队合作。其实是大错特错了。     2、松耦合。如果不懂得设计模式，根本不知松耦合是什么意思。当然，可以简单说明一下：      我们把模块部分，分为数据库抽象层，数据操作层，和业务逻辑层。这是最简单的业务架构。这样分开的好处是什么？      数据库抽象层，一般会支持多种数据库。这样做的目的，是可以让你的应用快速更换数据库。也能方便你的应用与其它类型数据库交互。      同时，更强大的，还会有链接管理器，从而对大型网站的分库操作，分表操作的支持。      一般，数据库抽象层可以通过向导生成静成的ORM层，或直接提供动态的ORM层（这是最新的DRYSQL模式）。      但除了ORM，CRUD，还有其它的查询。MVC中仍是要求将其写到专门的数据操作模块中的。      为什么要这样做呢？这就是松耦合。当一部分改动，不会影响另一部分。      试想，如果将数据模块与业务模块混合在一起，那么，如果某一日更换数据库，则，你要修改的是庞大的模块部分的代码。但将数据模块独立出来，只要修改数据模块部分的SQL语句即可以了。      对于视图部分，实际也是一样。因为，本来是给PC浏览器用的，如果哪一天要加上手机页面，则只要添加就可以了，其它的都可以共用，但若不分开，就得重新做一套。      从这一点看，有人说，PHP不适合于使用框架，实际上，不用框架，很多是行不通的。      可以看出其目标：这也就实现了，出现问题只要修改一处。而不是修改多处。     3、共享与集中处理。控制器，是一个完全将流程按面向对象方式设计的程序流程中的组件。我们应当能够记得，最普通的PHP程序写法，页头包含 SESSION模块，然后是访问控制。但若想，增加对主机名，子域名控制，则每一个包含的页面，都要再次增加包含。或要在SESSION模块，或访问控制模块增加一个包含文件。于是，程序逻辑变得相当混乱。如果其中有出错与跳转，那么，势必会出现在不需要加载的页面跳来跳去。     控制器的目的，就是让页面请求最终到达所需要的页面。并且是基于面向对象的流程的。     通常：控制器，必须要有Host， SubDomain， IP，URL，ACL的路由检测。由于现在一个网站，同时有浏览器与手机的，所以，还要有UserAgent检测。控制器要能做到最为方便地将一个请求映射到一个模块类的一个方法（事件）中。     4、完全面向对象，MVC程序，多数只有一个客户端请求入口——bootstrap，应用往往基于这个文件进行配置或修改。其它的全部都是class。即实现客户端到服务器端的事件映射。这样做的目的，是将应用的流程规范到了一个完全面向对象的流程中。保证程序的可读性，从而保证与程序员的无关性。     5、目前流行的开放API，如果是良好的MVC架构，开放API只要直接调用数据操作层接口就能实现，这也大大节省了程序的开发量，同时增加了代码的公用与集中处理的能力。这也就实现了，出现问题只要修改一处。     6、视图问题：因为界面的需求是多样的，不断变化的，往往对于WEB模式的企业应用更加显示出这样的变化。目前，可悲的是，PHP仍没有象.net,或 flex相似的视图模式。只有JAVA，有Typstray,JFS这样的面向部件的视图模式，PHP目前均没有成熟的开源产品可用。虽说，Smarty 抄袭了struts,phpFACES抄袭了JFS，但是本质上，均没有完全体充分利用PHP的语言的长处。phpFACES则更是无人问津，国内几乎无人使用。而FLAX RIA的冲击，以及JS框架带来的RIA新技术，也没有能与后端PHP相结合。JSP落后，PHP一样也是落后。人们需要新的开源。当然，phpFACES可以说是这方面的先驱，因为，它是基于DOJO创建的组件库。     7、插件技术：一个好的开发框架。所有的扩展应当均是由插件式方来完成的。但现在有多少框架支持插件？官方的Zend可以说是大全，而不是插件式配置，这纯属是技术误导。当然，最好的，插件最多的，则是symfony. 而symfony的ORM还在使用Propel，没能用上最新的DRYSQL技术。就插件而言，很多情况下限制了软件的应用，推广与发展，比如，大名鼎鼎的WordPress,提供了完美的应用插件，但底层开发框架极为混乱。最简单的，只能用于Mysql数据库，谁要是想用Oracle，那你的恶梦就开始了。所以，一个好的框架，应当在任何一个层面均支持插件。插件由此可以大概分为：数据库驱动插件，数据模块插件，缓存驱动插件，图型库插件等功能类插件，同时还有应用类插件。现时代，没有插件技术，就没有成功可言。也只有支持插件，才能够实现无限扩展，通用性才不是空话。但是，从国内行业论坛上来看，没有专门讨论插件接口实现技术的相关的话题，高处不胜寒！！     8、开发框架的架构：一个WEB应用架构，其内核应当是一个好的开发框架，这一个框架，必须要有的核心是：App对象，一个给入口文件用来完成一切事务的聚合类，AutoLoader 装载器，uxConfig 配置文件读取，uxLocale 本地化管理，Model 模型，View 视图，Controller 控制器（主机，子域名，URI，UA，IP，ACL均需要支持），Exception ErrorHandle错误与异常管理，Security 安全管理（Validator 数据验证，Filter 数据过滤器）状态管理（Session 会话管理，Cache 缓存管理）。然后是应用必须的基本类库，其中，数据库排第一位。架构中所以把数据库放到类库而不是放到内核，主要是两个方面，其一，让用户有选择权，用户可以选择用框架本身的，也可以去选ADODB，DOCTRINE，PEOPEL等第三方的。其次，网站规模的变化，数据库层面变化是最快的。但现在有多少开发框架有这样的规范的架构？     由此，我们发现：MVC架构模式中的种种误区不外乎来源于两个方面：     其一是：人们的认识造成的。PHP开发队伍技术落后，素质差是一大本质原因。对软件架构的不了解，特别是面向对象，设计模式的不了解，从而无法深入理解MVC。 [...]]]></description>
			<content:encoded><![CDATA[<p>MVC架构模式已不再是新技术，也不再是新名词。但是，如果你能大概看一看因内的开源的PHP开发框架，或者国内的PHP开源软件。我们不难发现，很多这们的代码与其说是MVC，还不如称其为东施效颦。很多是为MVC而MVC。或者，只提供MVC的部分功能。而不是真正意义上的MVC。这其中，很多原因当然是软件开发者不懂得设计模式，不了解MVC的根本目的。<span id="more-330"></span><br />
    由此，我们先明确一下，MVC的根本目的有哪些：<br />
    1、分工：使用MVC可以把数据库开发，程序业务逻辑开发，页面开发分开。<br />
     多数人说起MVC的好处，仅限于这一点。认为，MVC不外乎是利于大型团队合作。其实是大错特错了。<br />
    2、松耦合。如果不懂得设计模式，根本不知松耦合是什么意思。当然，可以简单说明一下：<br />
     我们把模块部分，分为数据库抽象层，数据操作层，和业务逻辑层。这是最简单的业务架构。这样分开的好处是什么？<br />
     数据库抽象层，一般会支持多种数据库。这样做的目的，是可以让你的应用快速更换数据库。也能方便你的应用与其它类型数据库交互。<br />
     同时，更强大的，还会有链接管理器，从而对大型网站的分库操作，分表操作的支持。<br />
     一般，数据库抽象层可以通过向导生成静成的ORM层，或直接提供动态的ORM层（这是最新的DRYSQL模式）。<br />
     但除了ORM，CRUD，还有其它的查询。MVC中仍是要求将其写到专门的数据操作模块中的。<br />
     为什么要这样做呢？这就是松耦合。当一部分改动，不会影响另一部分。<br />
     试想，如果将数据模块与业务模块混合在一起，那么，如果某一日更换数据库，则，你要修改的是庞大的模块部分的代码。但将数据模块独立出来，只要修改数据模块部分的SQL语句即可以了。<br />
     对于视图部分，实际也是一样。因为，本来是给PC浏览器用的，如果哪一天要加上手机页面，则只要添加就可以了，其它的都可以共用，但若不分开，就得重新做一套。<br />
     从这一点看，有人说，PHP不适合于使用框架，实际上，不用框架，很多是行不通的。<br />
     可以看出其目标：这也就实现了，出现问题只要修改一处。而不是修改多处。<br />
    3、共享与集中处理。控制器，是一个完全将流程按面向对象方式设计的程序流程中的组件。我们应当能够记得，最普通的PHP程序写法，页头包含 SESSION模块，然后是访问控制。但若想，增加对主机名，子域名控制，则每一个包含的页面，都要再次增加包含。或要在SESSION模块，或访问控制模块增加一个包含文件。于是，程序逻辑变得相当混乱。如果其中有出错与跳转，那么，势必会出现在不需要加载的页面跳来跳去。<br />
    控制器的目的，就是让页面请求最终到达所需要的页面。并且是基于面向对象的流程的。<br />
    通常：控制器，必须要有Host， SubDomain， IP，URL，ACL的路由检测。由于现在一个网站，同时有浏览器与手机的，所以，还要有UserAgent检测。控制器要能做到最为方便地将一个请求映射到一个模块类的一个方法（事件）中。<br />
    4、完全面向对象，MVC程序，多数只有一个客户端请求入口——bootstrap，应用往往基于这个文件进行配置或修改。其它的全部都是class。即实现客户端到服务器端的事件映射。这样做的目的，是将应用的流程规范到了一个完全面向对象的流程中。保证程序的可读性，从而保证与程序员的无关性。<br />
    5、目前流行的开放API，如果是良好的MVC架构，开放API只要直接调用数据操作层接口就能实现，这也大大节省了程序的开发量，同时增加了代码的公用与集中处理的能力。这也就实现了，出现问题只要修改一处。<br />
    6、视图问题：因为界面的需求是多样的，不断变化的，往往对于WEB模式的企业应用更加显示出这样的变化。目前，可悲的是，PHP仍没有象.net,或 flex相似的视图模式。只有JAVA，有Typstray,JFS这样的面向部件的视图模式，PHP目前均没有成熟的开源产品可用。虽说，Smarty 抄袭了struts,phpFACES抄袭了JFS，但是本质上，均没有完全体充分利用PHP的语言的长处。phpFACES则更是无人问津，国内几乎无人使用。而FLAX RIA的冲击，以及JS框架带来的RIA新技术，也没有能与后端PHP相结合。JSP落后，PHP一样也是落后。人们需要新的开源。当然，phpFACES可以说是这方面的先驱，因为，它是基于DOJO创建的组件库。<br />
    7、插件技术：一个好的开发框架。所有的扩展应当均是由插件式方来完成的。但现在有多少框架支持插件？官方的Zend可以说是大全，而不是插件式配置，这纯属是技术误导。当然，最好的，插件最多的，则是symfony. 而symfony的ORM还在使用Propel，没能用上最新的DRYSQL技术。就插件而言，很多情况下限制了软件的应用，推广与发展，比如，大名鼎鼎的WordPress,提供了完美的应用插件，但底层开发框架极为混乱。最简单的，只能用于Mysql数据库，谁要是想用Oracle，那你的恶梦就开始了。所以，一个好的框架，应当在任何一个层面均支持插件。插件由此可以大概分为：数据库驱动插件，数据模块插件，缓存驱动插件，图型库插件等功能类插件，同时还有应用类插件。现时代，没有插件技术，就没有成功可言。也只有支持插件，才能够实现无限扩展，通用性才不是空话。但是，从国内行业论坛上来看，没有专门讨论插件接口实现技术的相关的话题，高处不胜寒！！<br />
    8、开发框架的架构：一个WEB应用架构，其内核应当是一个好的开发框架，这一个框架，必须要有的核心是：App对象，一个给入口文件用来完成一切事务的聚合类，AutoLoader 装载器，uxConfig 配置文件读取，uxLocale 本地化管理，Model 模型，View 视图，Controller 控制器（主机，子域名，URI，UA，IP，ACL均需要支持），Exception ErrorHandle错误与异常管理，Security 安全管理（Validator 数据验证，Filter 数据过滤器）状态管理（Session 会话管理，Cache 缓存管理）。然后是应用必须的基本类库，其中，数据库排第一位。架构中所以把数据库放到类库而不是放到内核，主要是两个方面，其一，让用户有选择权，用户可以选择用框架本身的，也可以去选ADODB，DOCTRINE，PEOPEL等第三方的。其次，网站规模的变化，数据库层面变化是最快的。但现在有多少开发框架有这样的规范的架构？<br />
    由此，我们发现：MVC架构模式中的种种误区不外乎来源于两个方面：<br />
    其一是：人们的认识造成的。PHP开发队伍技术落后，素质差是一大本质原因。对软件架构的不了解，特别是面向对象，设计模式的不了解，从而无法深入理解MVC。<br />
    这与PHP自身发展也有关系，PHP4以前，是不支持面向对象的。PHP是以简易吸引了大量用户。但一旦用于大型网站开发，对于这此嫌JSP烦锁的人，恶梦就开始了。<br />
    其二是：PHP开发框架发以及开源技术发展密切相关的，开发框架对MVC不能提供足够好的MVC架构支持，同时，没有足够好的开源组件，使得人们不能进一步理解MVC。如同，你用了PHP的ADODB，但它也不会要求你在程序中，要把数据模块与业务模块分开。这是架构师的责任。然而，中国PHP行业有多少网络应用架构师？比如，敏捷之履上海活动时，杭州某大公司的某外籍CTO大讲特讲PHP根本不需要框架，云云，这不能不反映出国内PHP行业技术的落后。现实是如此残酷。唯有正视软件产业的现状。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/php-mvc-mistakes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>每个程序员都应该阅读的书籍</title>
		<link>http://www.luoye.org/blog/2011/06/programmer-read-books/</link>
		<comments>http://www.luoye.org/blog/2011/06/programmer-read-books/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 14:34:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[落叶杂记]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=328</guid>
		<description><![CDATA[国外知名网站 stackoverflow 上有一个问题调查： 哪本书是对程序员最有影响、每个程序员都该阅读的书？， 这个调查已历时两年，目前为止吸引了 153,432 人访问，读者共推荐出了 478 本书(还在增加)，其中最火的一本书《Code Complete》被顶了 1333 次。 如果你是个程序员，你一定有兴趣看看这些书里你都看过几本，如果你一本没看过的话，我也不好说什么，也许你是个天 才，但我相信大多数人都知道，你在学校里根本学不到什么真正的工作中需要的知识，我们毕业后能帮助我们在公司中胜任工作的老师就是这些优秀的书籍，一本好 书可以改变一个人的一生。 下面是这个调查中排名靠前的书的一个简单的清单： 第一名：1333票《Code Complete (2nd Ed) by Steve McConnell》，中文版《代码大全（第二版）》,两届Software Jolt Award震撼大奖得主！ 第二名：1181票 《The Pragmatic Programmer》，中文版《程序员修炼之道》 第三名：701票 《Structure and Interpretation of Computer Programs》，中文版《计算机程序的构造和解释》 第四名：572票 《The C Programming Language》，中文版《C程序设计语言》 第五名：481票 《Introduction to algorithms》，中文版《算法导论》 第六名：478票 《Refactoring: Improving the Design of Existing Code》，中文版《重构：改善既有代码的设计》 第七名：447票 《The [...]]]></description>
			<content:encoded><![CDATA[<p>国外知名网站 <a href="http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read?tab=votes#tab-top">stackoverflow</a> 上有一个问题调查： 哪本书是对程序员最有影响、每个程序员都该阅读的书？， 这个调查已历时两年，目前为止吸引了 153,432 人访问，读者共推荐出了 478 本书(还在增加)，其中最火的一本书《Code Complete》被顶了 1333 次。</p>
<p>如果你是个程序员，你一定有兴趣看看这些书里你都看过几本，如果你一本没看过的话，我也不好说什么，也许你是个天 才，但我相信大多数人都知道，你在学校里根本学不到什么真正的工作中需要的知识，我们毕业后能帮助我们在公司中胜任工作的老师就是这些优秀的书籍，一本好 书可以改变一个人的一生。<br />
<span id="more-328"></span><br />
<strong>下面是这个调查中排名靠前的书的一个简单的清单：</strong></p>
<p>第一名：1333票<a href="http://cc2e.com/">《Code Complete (2nd Ed) by Steve McConnell》</a>，中文版《代码大全（第二版）》,两届Software Jolt Award震撼大奖得主！</p>
<p>第二名：1181票 <a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer">《The Pragmatic Programmer》</a>，中文版《程序员修炼之道》</p>
<p>第三名：701票 <a href="http://rads.stackoverflow.com/amzn/click/0262510871">《Structure and Interpretation of Computer Programs》</a>，中文版《计算机程序的构造和解释》</p>
<p>第四名：572票 <a href="http://rads.stackoverflow.com/amzn/click/0131103628">《The C Programming Language》</a>，中文版《C程序设计语言》</p>
<p>第五名：481票 <a href="http://rads.stackoverflow.com/amzn/click/0262032937">《Introduction to algorithms》</a>，中文版《算法导论》</p>
<p>第六名：478票 <a href="http://rads.stackoverflow.com/amzn/click/0201485672">《Refactoring: Improving the Design of Existing Code》</a>，中文版《重构：改善既有代码的设计》</p>
<p>第七名：447票 <a href="http://rads.stackoverflow.com/amzn/click/0201835959">《The Mythical Man-Month》</a>，中文版《人月神话》</p>
<p>第八名：440票 <a href="http://c2.com/cgi/wiki?DesignPatternsBook">《Design Patterns》</a>，中文版《设计模式》</p>
<p>第九名：394票 <a href="http://www-cs-faculty.stanford.edu/~uno/taocp.html">《The Art of Computer Programming(First Volume Hardcover)》</a>，中文版《计算机程序设计艺术第 （第一卷）》</p>
<p>第10名：364票 <a href="http://rads.stackoverflow.com/amzn/click/0321486811">《Compilers: Principles, Techniques, and Tools 》</a>，中文版《编译原理》</p>
<p>第11名：329票 <a href="http://rads.stackoverflow.com/amzn/click/0596007124">《Head-First Design Patterns》</a>，中文版《Head First 设计模式》</p>
<p>当然了，这里的排名并不具有什么权威性，但绝对可以说都是好书，这11本外还有很多书虽然票数不是那么多，但大家估计都耳熟能详，比如 《Effective C++》(中文版《Effective C++：改善程序与设计的55个具体做法》)，《Clean Code》(中文版《代码整洁之道》)，《Effective Java》(中文版《Effective Java中文版(第2版)》等 。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/programmer-read-books/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash CS5内置了物理引擎</title>
		<link>http://www.luoye.org/blog/2011/06/flash-cs5-ik/</link>
		<comments>http://www.luoye.org/blog/2011/06/flash-cs5-ik/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 14:31:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[PhysicsManager]]></category>
		<category><![CDATA[物理引擎]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=324</guid>
		<description><![CDATA[安装Flash CS5这么久，才发现有内置了的物理引擎。在Flash CS5的安装目录下： C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs 可以看到，那个名为“PffLib.swc”的类库就是物理引擎了。同时，还可以看到一个名为“11.0”的文件夹，不知道这个11.0是指flash player的版本还是另有它意。 详细信息和demo可以在国外原文上看到：http://heftybyte.com/?p=36 。有趣的是，那个作者在demo代码里起的变量名为“fuckAdobe”，然后加一个“WARNING”，大概意思是：“源码里有脏话，说了Adobe坏话，但这是由于连夜加班所致，我还是很爱Adobe的。”]]></description>
			<content:encoded><![CDATA[<p>安装Flash CS5这么久，才发现有内置了的物理引擎。在Flash CS5的安装目录下：</p>
<blockquote><p><em>C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs</em></p></blockquote>
<p>可以看到，那个名为“PffLib.swc”的类库就是物理引擎了。同时，还可以看到一个名为“11.0”的文件夹，不知道这个11.0是指flash player的版本还是另有它意。</p>
<p>详细信息和demo可以在国外原文上看到：<a href="http://heftybyte.com/?p=36">http://heftybyte.com/?p=36</a> 。有趣的是，那个作者在demo代码里起的变量名为“fuckAdobe”，然后加一个“WARNING”，大概意思是：“源码里有脏话，说了Adobe坏话，但这是由于连夜加班所致，我还是很爱Adobe的。”<span id="more-324"></span></p>
<p><img title="flcs5_PffLib2" src="http://www.luoye.org/blog/wp-content/uploads/2011/06/flcs5_PffLib.gif" alt="" /></p>
<p><img title="flcs5_PffLib2" src="http://www.luoye.org/blog/wp-content/uploads/2011/06/flcs5_PffLib2.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/flash-cs5-ik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入挖掘Molehill API的一些特征（Flash的真正3D）</title>
		<link>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/</link>
		<comments>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:41:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[flash 3d]]></category>
		<category><![CDATA[flash player11]]></category>
		<category><![CDATA[Molehill]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=320</guid>
		<description><![CDATA[以后Flash Player真正的3D要来了。Molehill（一个代号而已）依靠Windows上的DirectX9、MacOS和Linux上的OpenGL1.3，在手机平台（比如Android）Molehill利用OpenGL ES2来渲染。从性能角度考虑，对于FlashPlayer10.1版本，渲染数千个没有Z轴深度缓冲的三角化物体接近30Hz；通过新的3D API，开发者在全屏高清环境下渲染数万个有Z轴深度缓冲的三角化物体频率能达到60Hz！在不支持GPU的计算机上，将由CPU取代。 关于Molehill的更详细解说： 英文版：http://www.bytearray.org/?p=2555 中文翻译版：http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/]]></description>
			<content:encoded><![CDATA[<p>以后Flash Player真正的3D要来了。Molehill（一个代号而已）依靠Windows上的DirectX9、MacOS和Linux上的OpenGL1.3，在手机平台（比如Android）Molehill利用OpenGL ES2来渲染。从性能角度考虑，对于FlashPlayer10.1版本，渲染<strong>数千个没有Z轴深度缓冲</strong>的三角化物体接近30Hz；通过新的3D API，开发者在全屏高清环境下渲染<strong>数万个有Z轴深度缓冲</strong>的三角化物体频率能达到60Hz！在不支持GPU的计算机上，将由CPU取代。</p>
<p><strong>关于Molehill的更详细解说：</strong></p>
<ul>
<li>英文版：<a href="http://www.bytearray.org/?p=2555">http://www.bytearray.org/?p=2555</a></li>
<li>中文翻译版：<a href="http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/">http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>flash player 11(Molehill)公开测试，附上有用资料链接</title>
		<link>http://www.luoye.org/blog/2011/06/flash-player-11molehill/</link>
		<comments>http://www.luoye.org/blog/2011/06/flash-player-11molehill/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:36:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[IT新闻]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=317</guid>
		<description><![CDATA[这又是一个历史性的转折点，flash player 11 支持GPU加速的3D渲染。 安装使用： 下载安装（Flash Player Incubator Debug Installers）：http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html 安装前，请按指示下载专门的卸载器来卸载旧版本：http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html#uninstallnotes 使用时，请确定：第一，安装了Flash Player incubator；第二，你的显卡支持DirectX 9或OpenGL；第三，确认Flash Player里的启用硬件加速选项打开； 如果你是开发者，请查看部署教程：http://labs.adobe.com/wiki/index.php/Flash_Player_Incubator#Authoring_for_Flash_Player_11.2C0.2C0.2C58_Incubator 如何通过Flex SDK或者Flash Professional来开发测试Incubator：http://jamesli.cn/blog/?p=700 一些demo：http://alternativaplatform.com/en/showcase/ 一些有用教程/资源： 腾讯flashteam将持续跟进并更新flashplayer11和molehill技术的资料：点击这里 深入挖掘Molehill API的一些特征（翻译版）：http://bbs.9ria.com/thread-71980-1-3.html，原文：http://www.bytearray.org/?p=2555 playerglobal.swc：点击这里 API文档：点击这里 目前已有不少3D引擎支持Molehill： Unity 3D 支持输出 flash 格式：http://blogs.unity3d.com/2011/02/27/unity-flash-3d-on-the-web/ Aerys Minko：http://aerys.in/minko Flare3D：http://www.flare3d.com/blog/2011/02/27/welcome-to-flare3d-2-0-pre-release-program/ Zest3D：http://zest3d.digital-glue.com/ Yogurt3D：http://www.yogurt3d.com/ Sophie3D：http://www.sophie3d.com/website/index_en.php CopperCube：http://www.ambiera.com/coppercube/ Away3D：http://www.away3d.com/]]></description>
			<content:encoded><![CDATA[<p>这又是一个历史性的转折点，flash player 11 支持GPU加速的3D渲染。</p>
<p><strong>安装使用</strong>：</p>
<ul>
<li>下载安装（Flash Player Incubator Debug Installers）：<a href="http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html" target="_blank">http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html</a></li>
<li>安装前，请按指示下载专门的卸载器来卸载旧版本：<a href="http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html#uninstallnotes" target="_blank">http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html#uninstallnotes</a></li>
<li>使用时，请确定：第一，安装了Flash Player incubator；第二，你的显卡支持DirectX 9或OpenGL；第三，确认Flash Player里的启用硬件加速选项打开；</li>
<li>如果你是开发者，请查看部署教程：<a href="http://labs.adobe.com/wiki/index.php/Flash_Player_Incubator#Authoring_for_Flash_Player_11.2C0.2C0.2C58_Incubator" target="_blank">http://labs.adobe.com/wiki/index.php/Flash_Player_Incubator#Authoring_for_Flash_Player_11.2C0.2C0.2C58_Incubator</a></li>
<li>如何通过Flex SDK或者Flash Professional来开发测试Incubator：<a href="http://jamesli.cn/blog/?p=700">http://jamesli.cn/blog/?p=700</a><span id="more-317"></span></li>
</ul>
<p><strong>一些demo</strong>：<a href="http://alternativaplatform.com/en/showcase/" target="_blank">http://alternativaplatform.com/en/showcase/</a></p>
<p><strong>一些有用教程/资源</strong>：</p>
<ul>
<li>腾讯flashteam将持续跟进并更新flashplayer11和molehill技术的资料：<a href="http://flashteam.tencent.com/post/294/flashplayer11-%e4%bb%a5%e5%8f%8amolehill3d%e7%a1%ac%e4%bb%b6%e5%8a%a0%e9%80%9f%e6%8a%80%e6%9c%af/">点击这里</a></li>
<li>深入挖掘Molehill API的一些特征（翻译版）：<a href="http://bbs.9ria.com/thread-71980-1-3.html">http://bbs.9ria.com/thread-71980-1-3.html</a>，原文：<a href="http://www.bytearray.org/?p=2555">http://www.bytearray.org/?p=2555</a></li>
<li>playerglobal.swc：<a href="http://download.macromedia.com/pub/labs/flashplatformruntimes/incubator/flashplayer_inc_playerglobal_022711.swc" target="_blank">点击这里</a></li>
<li>API文档：<a href="http://download.macromedia.com/pub/labs/flashplatformruntimes/incubator/flashplayer_inc_langref_022711.zip" target="_blank">点击这里</a></li>
</ul>
<p><strong>目前已有不少3D引擎支持Molehill</strong>：</p>
<ul>
<li>Unity 3D 支持输出 flash 格式：<a href="http://blogs.unity3d.com/2011/02/27/unity-flash-3d-on-the-web/" target="_blank">http://blogs.unity3d.com/2011/02/27/unity-flash-3d-on-the-web/</a></li>
<li>Aerys Minko：<a href="http://aerys.in/minko" target="_blank">http://aerys.in/minko</a></li>
<li>Flare3D：<a href="http://www.flare3d.com/blog/2011/02/27/welcome-to-flare3d-2-0-pre-release-program/" target="_blank">http://www.flare3d.com/blog/2011/02/27/welcome-to-flare3d-2-0-pre-release-program/</a></li>
<li>Zest3D：<a href="http://zest3d.digital-glue.com/" target="_blank">http://zest3d.digital-glue.com/</a></li>
<li>Yogurt3D：<a href="http://www.yogurt3d.com/" target="_blank">http://www.yogurt3d.com/</a></li>
<li>Sophie3D：<a href="http://www.sophie3d.com/website/index_en.php" target="_blank">http://www.sophie3d.com/website/index_en.php</a></li>
<li>CopperCube：<a href="http://www.ambiera.com/coppercube/" target="_blank">http://www.ambiera.com/coppercube/</a></li>
<li>Away3D：<a href="http://www.away3d.com/" target="_blank">http://www.away3d.com/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/flash-player-11molehill/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

