2009年12月 的存档

成为高深Flasher,你够资格了吗?

原文

PV3D.org版的高深Flasher必知必会:

1.灵活的跑道

你需要知道什么时候发送一个event,什么时候执行代码,什么时候播放器渲染画面。这真的是最基本不过了。
http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/

2.FlexSDK, mxmlc, compc以及所有所有你要知道当你在Eclipse里面按下“Run”按钮时会发生什么。
http://www.senocular.com/flash/tutorials/as3withmxmlc/
http://livedocs.adobe.com/flex/3/html/help.html?content=apparch_08.html

3.内置事件,自定义事件,事件冒泡过程(Event Bubbling)

真不知道那个Flash不用处理帧和鼠标点击。
http://www.adobe.com/devnet/actionscript/articles/event_handling_as3_03.html
http://livedocs.adobe.com/flex/3/langref/flash/events/package-detail.html
http://www.tink.ws/blog/custom-events-in-as-30-dont-forget-to-override-the-clone-method/
http://jacwright.com/blog/70/how-to-listen-to-flash-events-that-dont-bubble/

4.语句、关键字、指令

你不应该对AS3里面的新词语感到迷惑,如果你不清楚static或者override或者其他的话,去学一下咯。

http://livedocs.adobe.com/flex/2/langref/statements.html

5.ASDoc
终有一天,你会再次读一下自己的代码,然而发现完全不清楚这是什么。这一条的重点是写适当的文档,用工具生成文档也相当不错的。
http://livedocs.adobe.com/flex/3/html/help.html?content=asdoc_3.html

6.管理好可视资源(图片,字体, CSS等)
Flash是很visual的,所以你要知道怎么用代码管理可视资源。
http://www.gskinner.com/talks/flexlovesflash/
http://code.google.com/p/queueloader-as3/
http://code.google.com/p/bulk-loader/

7.Arrays, Collections, Dictionaries, Mapping
你不单单跟一个MC打交道,所以你要懂得怎么一次操纵多个对象。
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html
http://www.gskinner.com/blog/archives/2006/07/as3_dictionary.html
http://code.google.com/p/as3ds/

8.编程式的动画(tweening, easing)
如果你只想东西都是静止的,你应该跟HTML呆一块。
http://blog.greensock.com/tweenmaxas3/
http://www.amazon.com/Foundation-Actionscript-3-0-Animation-Making/dp/1590597915/ref=sr_1_1?ie=UTF8&s=books&qid=1243014431&sr=8-1

9.OOP和利用框架编程
以往只用一个巨大的as文件的日子已经远去了。你要灵活的把代码移动到安排有序和可重用的对象那里。而且现在有N多流行的AS3框架帮你,试着学习如何使用它们吧。
http://www.adobe.com/devnet/actionscript/articles/oop_as3.html
http://www.actionscript.org/resources/articles/684/1/Object-Oriented-Programming-in-AS3/Page1.html

10.  版本控制
除非你认为你的代码没有价值,否则你应该学习如果正确地备份。
http://tortoisesvn.net/downloads
http://versionsapp.com/
http://en.wikipedia.org/wiki/Revision_control
http://git-scm.com/
http://www.nongnu.org/cvs/

~~~~~~~~华丽丽的分割线~~~~~~~~~

gskinner.com版的高深Flasher必知必会:

  • AS开发(这很明显)
  • OOP经验
  • 一些软件架构/使用设计模式的经验
  • 代码标准(Code standards)
  • 整合数据服务(Data services integration): XML, JSON, SOAP等。
  • 解决问题的能力(Problem solving)
  • 修补漏洞(Debugging)
  • 代码优化和图像优化
  • 质量检测(Quality testing)
  • Reasonable understanding of UX and interaction design
  • 基本的图像设计和动画设计能力(要足够到能理解并实现设计师的想法)
  • 导入图形(Graphics import)
  • 有一定的Ps、Ai、Fw的基础(for tweaks / exporting art)
  • 对视频压缩、音频压缩有简单的认识
  • 编程式的动画(Programmatic motion)
  • 写文档的能力(for team / client communication, documentation, comments, etc)
  • 要能跟团队或客户沟通,要有处理人际关系的能力。
  • 有使用Flash和Flash里面的时间轴的经验。
  • 有使用外部代码编辑器的经验(例如:FlexBuilder, FDT, FlashDevelop)
  • 对以下事物有深入了解:Flex, FMS, Remoting, FlashLite, AIR 和其他一些Flash平台的核心产品、核心类库。
  • 对服务器开发和数据库有深入了解(并不一定需要真能做到这些,但需要一些关于这些model的经验或知识。)
  • HTML、JS、CSS的简单认识
  • 懂得与HTML、JS一并使用
  • 社区意识(Community awareness) ——online resources, frameworks等
  • 基本数学——理解和混合使用+, -, /, *, %, 指数和简单三角函数(sin, cos, atan2, etc)

Hibernate MySql 连接池隔天断开解决方法

最近独自写了个小项目,测试的时候都OK,放到服务器後发现隔天便会出现Error:org.hibernate.exception.JDBCConnectionException: could not execute query,几经观察,确认是数据库连接池出了问题,查了些资料,找到了解决方法:

MySQL对所有连接的有效时间默认为28800秒,正好8小时,也就是说,如果一个连接8小时没有请求和操作,就会自动断开;但是对于Hibernate来说,它的连接池并不知道它所管理的连接中是否有被MySQL断开的。如果一个程序要使用数据库连接,而Hibernte的连接池分配一个已经被MySQL断开了的给程序使用,那么便会出现错误。

  为了证实确实是这个错误,我在本机上做了如下测试:首先启动Tomcat,网站能够正常打开;然后修改系统时间,往后调1天;然后再打开网站,同样的问题果然出现!MySQL + Hibernate架构相当普遍,所以这个问题也相当普遍,若读者也有这样的项目,建议做一下同样的测试,看看是否存在此问题!

问题找到了,怎么解决呢?
  思路1:增大MySQL的连接有效时间;
  思路2:从程序自身出发,修改连接池的相关参数。
  显然,思路1是不可行的,一方面这个思路不可能保证这个问题绝对的解决,如果无访问时间够长,还是大于MySQL的连接有效时间,问题同样会发生;另一方面,一般情况下,我们都是将程序部署在别人服务器上,我们不可能去修改MySQL配置。那么只能从思路2入手了。
  经查资料发现,Hibernate支持如下的连接池:
   DriverManagerConnectionProvider:代表由Hibernate提供的默认的数据库连接池
   C3P0ConnectionProvider:代表C3P0连接池
   ProxoolConnectionProvider:代表Proxool连接池
   DBCPConnectionProvider:代表DBCP连接池
   DatasourceConnectionProvider:代表在受管理环境中由容器提供的数据源
  其中,默认连接池并不支持在分配一个连接时,测试其有效与否的功能,而C3P0、Proxool、DBCP都提供了这样的功能,正好可以解决上述问题。综合考虑各个连接池的效率、稳定性、易用性,决定换用Proxool,它确实在各方面表现优良,方便配置。
  下面就看看如何配置Proxool:
  1、Hibernate配置文件:

<session-factory>
<property name=”hibernate.connection.provider_class”>org.hibernate.connection.ProxoolConnectionProvider</property>
<property name=”hibernate.proxool.xml”>proxool.xml</property>
<property name=”hibernate.proxool.pool_alias”>mysql</property>

<property name=”show_sql”>false</property>
<property name=”dialect”>org.hibernate.dialect.MySQLDialect</property>

<mapping resource=”com/lab1000/jcom/pojo/Admin.hbm.xml” />

</session-factory>

  其中各属性含义如下:
hibernate.connection.provider_class:指明使用Proxool连接池
hibernate.proxool.xml:指明Proxool配置文件所在位置,这里与Hibernate的配置文件在同一目录下
hibernate.proxool.pool_alias:指明要使用的proxool.xml中定义的proxool别名。

  2、Proxool配置文件(proxool.xml):

<?xml version=”1.0″ encoding=”UTF-8″?>
<!– the proxool configuration can be embedded within your own application’s.
Anything outside the “proxool” tag is ignored. –>
<something-else-entirely>
<proxool>

<!– proxool别名 –>
<alias>mysql</alias>

<!– 数据库连接Url –>
<driver-url>
jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8
</driver-url>

<!– JDBC驱动名称 –>
<driver-class>com.mysql.jdbc.Driver</driver-class>

<!– 数据库连接帐号 –>
<driver-properties>
<property name=”user” value=”root” />
<property name=”password” value=”password” />
</driver-properties>

<!– proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 –>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>

<!– 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受 –>
<maximum-new-connections>20</maximum-new-connections>

<!– 最少保持的空闲连接数 –>
<prototype-count>3</prototype-count>

<!– 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 –>
<maximum-connection-count>20</maximum-connection-count>

<!– 最小连接数 –>
<minimum-connection-count>3</minimum-connection-count>

<!– 在分配连接前后是否进行有效性测试,这个是解决本问题的关键 –>
<test-before-use>true</test-before-use>
<test-after-use>true</test-after-use>

<!– 用于测试的SQL语句 一定要写(不知道问什么)–>
<house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql>

</proxool>
</something-else-entirely>

  3、下载和安装Proxool的包文件
  下载地址:http://proxool.sourceforge.net/download.html
  下载后并解压后,将其中lib文件夹下的jar文件拷贝到你站点的WEB-INF/lib下

  自此,Proxool配置成功。重新启动Tomcat,再次做上述测试,问题解决。
  此外,如果要使用C3P0或DHCP,可以参考以下资料:
  http://blog.csdn.net/lip8654/archive/2008/02/26/2121387.aspx
  http://azi.javaeye.com/blog/182146
  http://fishyych.javaeye.com/blog/90793

PS:解决方案参考网络资源(忘了是在哪里看到的了:))

Flex开发者应该知道的十件事 (轉載)

http://swfever.com/?p=744

Michael Portuesi发表了一篇名为Top 10 things new Flex developers should know的博文,个人认为写的比较到位(很多同类文章总有些故弄玄虚的味道)。我无意通篇翻译,只挑些只言片语总结一下,顺便加一些我自己的看法。

开始学习Flex之前
如果你了解HTML/CSS,也略懂JavaScript,但从没接触过Flex和ActionScript,那你真的应该先去了解一些面向对象的知识,因为ActionScript3是一门纯粹的面向对象语言,Flex则是一个面向对象框架。

1. 事情经常是“异步”发生的
什么是“异步”?恩,就是说当你执行了一行代码,你不能假设这行代码会立刻起到实际的作用。Flex是一个充满着异步机制的框架。这不仅仅意味着你在使用WebService这样的组件时是异步的,甚至连为DataGrid这样的控件设置DataProvider也是异步的。
[Jinni] Flex中的很多异步取决于在Flex组件生命周期中非常重要的一种“推迟”技术,即把所有的更新推迟到每次渲染前进行。

2. 分清Flex组件的属性和样式
Flex组件既有属性,也有样式。你需要了解这两者的区别。因为在ActionScript中设置组件和样式的方法是不同的。
[Jinni] 在MXML中你可能看不出属性和样式的区别,这时候最好的办法就是查API手册。

3. CSS的样式和HTML不完全一样
虽然标准CSS使用连字符(例如text-font)格式来定义样式名称,但是Flex使用驼峰式的命名格式(例如textFont)。一个显而易见的原因是连字符不能出现在XML的属性中,所以你不能用这样的名字作为MXML标签的属性。
当然,如果你把样式定义在外部的CSS文件中或者Style标签中,你也可以使用连字符格式的样式名。另外,Flex定义了很多HTML中不存在的CSS样式。
[Jinni] Flex 4中支持了更多的CSS Selector类型,例如id selector等等。

4. MXML和ActionScript其实是一回事,就算他们看起来很不一样
所有的MXML标签最终会被Flex编译器转化为ActionScript对象。你也可以在MXML中使用ActionScript。当你创建一个组件时,你可以选择使用ActionScript还是MXML。
[Jinni] MXML和ActionScript的关系,是Flex开发者必须要搞清楚的,如果你想洞悉其中的细节,可以使用-keep的编译参数,看看你写的MXML最终被转化成了什么样的代码。

5. Flex的代码隐藏(Code-behind)模式
MXML和ActionScript虽然通用,但是实际上有各自的职责,一般来说,MXML负责描述界面,而ActionScript用来完成功能。而代码隐藏是指MXML和ActionScript应该解耦,这样设计师可以直接修改MXML而不用接触代码,程序员则可以更好的组织和重用功能。
[Jinni] Flex 4的Spark组件架构把Code-behind模式发挥到了极致。

6. Flex的组件的生命周期
Flex定义了一个优秀的组件生命周期,负责组件的创建,运行,和销毁。同时也定义了一些“入口”,开发者可以由此来完成定制化的工作。对组件生命周期的不甚理解有可能会导致使用错误的编程模式。
[Jinni] 对Flex组件生命周期的理解也是我一直强调的必修课。在之前的一篇博文的最后我推荐了一篇文章,有兴趣可以去看看。

7. Flash Player的“跑道”模型
理解Flash Player的渲染和代码执行机制也是十分重要的。当你执行了改变界面的指令时,Flash Player并不是立刻把你要的内容显示在屏幕上,它根据一定的周期来刷新屏幕,而代码的执行则是另一回事。这和Java正相反,Java总是等待程序主动告诉它什么时候重绘屏幕。
[Jinni] Flash Player的“跑道”模型最早由Ted Patrick提出,而Sean Christmann将这个理论进一步扩展成了“切片”模型,但是我对这个模型的结论抱有很大的质疑,这个模型和我的实验结果有很大的出入,有时间我会专门来撰写文章和大家分享讨论。

8. 理解数据绑定和Watcher的工作方式
Flex提供了一种数据绑定机制,简单地说,就是将一个源属性绑定到一个目标属性上,当源属性发生变化时,目标属性也会随之变化。你不仅仅可以绑定到属性,也可以绑定到函数。甚至你可以为某个属性创建一个Watcher,当属性变化时,你会获得事件通知。
[Jinni] Flex 4支持了新的双向数据绑定语法,用法很简单,在{}前面加个@就可以,例如text=@{input.text}。

9. 数据封装与松散耦合
[Jinni] 这段很长,主要是谈一些设计模式和方法学的问题,就不过多说了。 -_-

10. 弱引用与强引用
无论你是使用任何语言开发,内存管理对都是至关重要的,否则你可能会陷入内存泄露或内存碎片的泥淖中。你可以通过这篇文章来了解如何在AS3中创建弱引用。
[Jinni] AS3的垃圾回收有两种方式,一是通过引用计数器,对所有引用数为0的对象进行回收。二是标记+清理模式,从对象树的根节点开始遍历并作标记,没有被标记的对象会被回收。后者的开销更大,但可以用来解决循环引用的问题。而弱引用就是当你为某个对象创建一个引用时,该引用不会影响引用计数器的值,因此即使你不对该引用置空,对象仍然可以被回收(只要该对象身上没有任何强引用)。在AS3中有两个地方可以使用弱引用机制,一是添加监听器时,二是使用Dictionary对象。

以后就用Resin了~

Tomcat用了好久,Weblogic要盗版或掏钱……,终于腻烦了,尝试用Resin,感觉不错,性能也很好。纪录两点使用上的心得:
一、配置文件:\conf\resin.conf,默认端口号为8080,在这里面可以修改端口号
二、安装的时候注意不要安装在Programm files下面(原因暂时是我在使用的时候发现读取不到其中的resin.jar包)
三、安装Resin系统服务的指令为: 进入到Resin根目录,然后执行 httpd.exe -install-as 服务名;删除服务则为httpd.exe -remove-as 服务名

来自百度百科的一段Resin的简介:

resin

  Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的支持servlets 和jsp的引擎,速度非常快。Resin本身包含了一个支持HTTP/1.1的WEB服务器。虽然它可以显示动态内容,但是它显示静态内容的能力也非常强,速度直逼APACHE SERVER。许多站点都是使用该WEB服务器构建的。
  Resin也可以和许多其他的WEB服务器一起工作,比如Apache server和IIS等。Resin支持Servlets 2.3标准和JSP 1.2标准。熟悉ASPPHP的用户可以发现用Resin来进行JSP编程是件很容易的事情。
  Resin支持负载平衡(Load balancing),可以增加WEB站点的可靠性。方法是增加服务器的数量。比如一台SERVER的错误率是1%的话,那么支持负载平衡的两个Resin服务器就可以使错误率降到0.01%。
  你可以从http://www.caucho.com/download/ 站点上查询Resin的最新版本并下载它。
  Resin服务器平台介绍简介:
  Resin提供了最快的jsp/servlets运行平台。在java和javascript的支持下,Resin可以为任务灵活选用合适的开发语言。Resin的一种先进的语言XSL(XML stylesheet language)可以使得形式和内容相分离。 如果您选用jsp平台作为internet商业站点的支持,那么速度、价格和稳定性都是要考虑到的,resin十分出色,表现更成熟,很具备商业软件的要求。而且,它是全免费的。从站点下载的就是完整版本。所以值得向您推荐! 相对于tomcat3.1,后者更象是一个正在研究的项目。目前resin可以支持sun的j2ee,而tomcat不能直接支持,而j2ee是基于java服务器端大系统的基础。但tomcat结构非常合理,而且是apache组织的产品,因此有着很好的远景。
  Resin1.1的特性包括:
  1 支持jsp1.1和在服务器端编译的javascript.
  2 比mod_perl,mod_php更快,比Jakarta Tomcat快3倍。您可以在Caucho的站点看到很全面的各种测试报告。
  3 使用servlet2.2引擎。
  4 自动的servlet/bean编译!
  5 Servlet,XSL Filtering
  6 支持IIS,Apache,Netscape和其它内置了HTTP/1.1的Web服务器。
  7 XSLT和XPath1.0引擎。
  8 企业级的共享软件(基于一个开放源码的协议)安装与启动:安装特别简单,只需将resin-1.1.3.zip解压缩到某个目录即可。在运行之前需要有jdk的支持。启动方式是执行:resin-1.1.3/bin/httpd (在NT)系统已经按照缺省设置启动,系统将监听8080端口。jsp文件可放在resin-1.1.3/doc目录下;servlet可以放在resin-1.1.3/doc/web-inf/classes下面。测试 从 http://localhost:8080/ 中可以看到resin的欢迎界面。 
  下载您可以在此下载最新的Resin1.1.3。大概是2.5M。
  Resin 3.1.9使用jdk 1.6会启动错误,必须使用jdk1.5。。。
  详细资料请参考:http://blog.chinaunix.net/u/15315/showart.php?id=171755
  http://www.cnxuexi.com/computer/wangzhankaifa/JSP/5927.html
  最新的resin版本为Resin 4.0.0 可从 http://www.caucho.com/download/ 上下载 有win 和linux 两个版本(2009-05-05 )

Flex RPC错误整理(转)

原文:http://www.riafan.com/article.asp?id=102

最近不少网友反映使用Fluorine实现Flex与.NET通信老是出错,原因肯定不一样,为节约时间,我想有必要整理一下Flex RPC常见错误。此处先整理一下Flash Remoting方面的,后续会加上HTTP Service和Web Service的。

一、Flex Remoting

  1. Channel definition, mx.messaging.channels.RTMPChannel, can not be found…:最新版的Fluorined在services-config.xml中新增了RTMP Channel,主要是用来配置Flex Messaging,编译时需要FDS.swc支持,当然如果不需要此功能可以注释掉channel-definition这个节点。
  2. RPC Fault faultString=”The requested type … is not accessible”:Flash Remoting服务名不对。详见Flash Remoting支持的远程服务
  3. RPC Fault faultString=”Could not find a suitable method with name …” :找不到对应的方法。首选看方法名对不对,再看方法的参数个数,参数类型,还要检查返回数据的类型。关于数据的类型详见Fluorine环境下AS3与.NET之间的数据转换(一)Fluorine环境下AS3与.NET之间的数据转换(二)
  4. NetConnection.Call.Failed: HTTP: Status 404: url…: ‘虚拟主机的域名/子目录/Gateway.aspx’”:没将Root URL设置为虚拟主机的域名。详见Flex Bulider 2与Flash cs3的发布文件
  5. RPC Fault faultString=”Send failed” faultCode=”Client.Error.MessageSend” faultDetail=”Channel.Connect.Failed errorNetConnection.Call.Failed: HTTP: Status 404: url: ‘http://localhost/Gateway.aspx…’”:Root URL中包含的Context与Context root中设置的不一致。
  6.  [RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048...: 安全沙箱冲突
  7. RPC Fault faultString="MessagingError message='Destination 'fluorine' either does not exist or the destination has no channels defined (and the application does not define any default channels.)'" faultCode="InvokeFailed" faultDetail="Couldn't establish a connection to 'fluorine'"...:FluorineFX没配置或destination 没有定义channels(默认是fluorine),详见配置支持Fluorine Remoting的Web应用
  8. ReferenceError: Error #1056: 无法为 ...创建属性...:当使用[RemoteClass(alias="XXX")],客户端与服务器端Value Object映射时属性名不一致。

二、Http Service

  1. faultCode:Server.Proxy.Request.Failed faultString:’HTTP/1.1 404 Not Found’ faultDetail:’HTTP/1.1 404 Not Found’:url错误。
  2. faultCode:Channel.Security.Error faultString:’Security error accessing url’ faultDetail:’Destination: DefaultHTTP’:不使用代理时遇到安全沙箱冲突。
  3. The URL specified XXX is not allowed by the selected destination ‘DefaultHTTP:使用默认终端代理时遇到安全沙箱冲突。
  4. No destination with id XXX is registered with any service/MessagingError message=’Destination ‘students’ either does not exist or the destination has no channels defined (and the application does not define any default channels.)’:.使用命名终端代理时,destination不一致。