Jun 14

前些天把Adobe官方的p2p Video phone demo的研究了一遍,了解了这个基于Stratus的video phone是如何工作的。由于Adobe的demo需要运行一个python写的web service才可以运行 — 这个web service用于用户名与peer ID之间的转换,真实项目中我们不可能用256-bit 的 peer ID作为联系人的用户名,所以做一个用户名到Peer ID之间的转换是很用必要的,打电话时只需要知道对方的登陆用户名就可以联系,不需要知道这个超长的不可能记住的Peer ID。可能很多不熟悉python的人没有成功运行源代码,现在我就从我的角度告诉大家如何创建这么一个 P2P 电话。(当然不需要额外的web service)

首先还是了解一些必要的知识

RTMFP — RTMFP是Adobe公司开发的一套新的通信协议,该协议可以让使用Adobe Flash Player的终端用户之间进行直接通信, RTMFP基于UDP而Flash Media Service支持的RTMP是基于TCP的。

Stratus — Adobe Stratus service beta 是支持RTMFP 的服务器。它是一个中转式的服务,它的作用是建立flash player之间的通讯。即使它们位于NATs的后面。与FMS不同,Stratus不支持媒体转播,共享对象,脚本等等,你只能开发客户端之间直接联系的应用程序。

我们的网络电话就是基于上面描述的技术,在开始之前有一些准备工作要做。

确定你安装了 Flex SDK3.2. 这里下载
确定安装了flash payer 10 debug version (开发环境最好用debug version) 这里下载
申请一个 Stratus develper key 这里申请
新建一个项目,名字随意,位置随意,编辑项目属性 — Flex compiler — Require Flash player version 到 10:0:0

Continue reading »

Apr 23

转载自http://www.fireyang.com/blog/?p=646

介绍:

使用这个工具,你可以在不改变原始的swf的情况下,直接在flash里查看幀频,内存使用情况,还结合了MonsterDebugger。
反正一个字:赞
ps:我打算把trace也加到里面,那是不是更爽了,哈哈,往下看吧……

参考:

  1. The Ultimate Debugging And Profiling
  2. Almighty PreloadSWF
  3. Flash Visual Profiler.

后面两篇需要翻墙(提议用googleReader订阅,然后自己慢慢找吧)

方法:

ps:期间涉及到mmcfg的配置,可以参考我以前的文章:《在ubuntu中捕获trace》(用mm.cfg来捕捉trace)

  • 安装Debug Player (如果你已经安装可以跳过)
  • 安装De MonsterDebugger并运行(可选)
  • 下载MicroProfiler.swf 到本地
  • 确认放文件的位置(如. d:/whatever/MicroProfiler.swf)必须在本地信任范围(修改信任范围地址: local trasted scope)
  • 打开你的mm.cfg文件并添加如下内容 (在 XP中 C:\Documents and Settings\username\mm.cfg)
    PreloadSWF=c:\whatever\MicroProfiler.swf
  • 关闭所有flashplayer并重启浏览器

就这样,现在起,如果你访问任何as3编译的.swf文件,你将在flash影片里看到MicroProfiler。如果你用MonsterDebugger来接受数据,你可以修改里面的变量进行测试了,非常cool吧。
我在使用中发现经常报一些错误,可能这个工具还不成熟还不稳定,有源码的,回头看看参考下……

Ps:修改“信任目录”方法:

  • xp:在C:\Documents and Settings\[your name]\Application Data\Macromedia\Flash Player\#Security 新建一个以.cfg为扩展名的文件,写入你MicroProfiler.swf所在目录的路径就可以了

我的截图(xp下成功,但是我这里有些动画出现类似花屏,不知道原因,ubuntu下一直报警告,还没找到原因):

原文截图:

Feb 22

客户端预先定义say_Result响应函数,然后调用由Flash Media Server提供给客户端的say方法。而Flash Media Server为客户端定义的say函数实际上是在处理amfphp提供的服务——phpSay,再由其回调HelloWorld类的phpSay_Result方法,进而触发了客户端预定义的say_Result函数。

客户端:
var _nc = new NetConnection();
_nc.say_Result = trace;
_nc.connect(’rtmp://x/helloworld’);
_nc.call(’say’, null, ‘hello world!’);
Continue reading »

Nov 30

’shift’ + ‘tab’:左移代码; 
‘alt’ + ‘/’:代码提示; 或者自己在key里找到 content assist自己设置
‘ctrl’ +’o’:快速查找以及指向变量或函数或者mxml组件的id;
‘ctrl’ + ‘d’:删除一行代码; [用它你会上瘾的]
‘ctrl’ + ‘m’:在最大化与还原之间切换获得焦点的窗口; 很常用的啦, 非常方便, 另外双击窗口也可以实现同样的

‘ctrl’ +’e’:快速查找以及指向打开的文件; [在打开的文件很多时尤其实用]
‘tab’:右移代码; [也很常用,非常方便]
‘ctrl’ + ‘~’:代码和设计模式切换;
‘ctrl’ + ‘/’:注釋一行ActionScript代碼[很常用]
‘ctrl’ + ’shift’ + ‘c’:添加<!– –>或/* */
‘ctrl’ + ’shift’ + ‘d’:添加<![CDATA[  ]]>
‘ctrl’ + 鼠標左鍵: 快速指向所點擊類文件

Sep 10

本文转载自http://www.cnblogs.com/zack/archive/2009/05/30/1492307.html
只是转载,不代表本人对其观点的认同。

PureMVC大大的优化了我们使用FLEX进行前台的开发,使得整个开发过程变的较为可控,但是如果放任程序员去自由的使用pureMVC也会带来很大的隐患。本文内容主要记录我使用pureMVC开发原型这一个星期来使用的一些开发规范和经验总结。

1. 如果有个项目有几个开发人员共同开发,同时采用版本控制工具对项目项目的源码进行版本控制,可是维护通

知的名称着实让人烦恼,我们若要将通知名称放在同一 个类中{ApplicationFacade}就不能很好的使用版本控制工具,因为每个人都要修改这个类 {在你修改时你要看看别人是否已经修改该文件,别人若是修改了还得让他提交,然后自己更新再修改,太痛苦了!} ,而且都放在一个类里也会增加维护的难度,那么有没有什么好的办法呢?

通常一两个人做个例子时遇到这种情况可能比较好解决,单如果参与的人较多的化,可能花在协调上面的工作

量就会比较多,为了增加开发的速度,使开发变的更加的简单,我们可以让通知名称分散到各个模块的Mediator

类中进行维护{每个模块主页面的协调类,可根据自己的系统大小控制粒度},这样每个开发人员可以只要维护自身的通知名称或者只要与一两个人进行协调,同时我们要求每个通知名称都要包含该类所在的包路径和类名称,具体的格式可以是”通知名称+包路径.类名称”,这样我们只要保证通知名称唯一,且便于日后维护。

2. 每个Mediator,Proxy都要定一个NAME属性,通常我要求每个NAME属性必须是”包路径+类名称”,也是

为了避免不必要的冲突,找半天BUG。

3. PureMVC中Mediator似乎什么都可以坐了,Command的用处似乎不大。

这是一个错误的看法,虽然我们在Mediator中可以直接获取到Proxy,Mediator类的对象,也可以注册

Mediator,Proxy,Command,但是我们必须给自已一个约束,不然随着开发的不断深入你会发现代码也越来越乱。所以我们增加了较为严禁的约束:

3.1 通常情况在程序启动后,Mediator负责注册Command,以及派发通知和接收通知,当Mediator类需要进行当前范围外的一些操作时就可以通过派发通知的方式。一般来说页面UI主要负责页面的布局和简单的作,其他的应该交由Mediator来处理。例如,Mediator协调的UI需要获取数据,这是Mediator可以派发一个获取数据的通知(之前已经注册一个用于处理该通知的Command),然后有pureMVC会初始化被注册的Command并执行获取数据的操作。如果你需要告知另外一个页面进行某些操作或者增加一个新的页面,也应该通过派发通知的方式来处理,应避免在当前Mediator类中直接获取响应页面的对象或者获取Mediator类进行操作,如果是增加一个新的页面应当在页面加载后将该页面的对象作为报体通知Command进行注册以及其他操作。

3.2 Command主要负责注册Mediator和Proxy以及协调Mediator和Proxy之间的操作,应当将复杂的操作放在这里处理。Command的注册不必集中但也不可以太过分散,一般来说放在比功能级稍大点的Mediator中来注册(例如一个增删改查,4个页面需要不停的切换,关于这4个页面功能的Command一般来说都是放在这四个页面的上一层页面的Mediator中进行注册,也就是管理这四个页面的Mediator中)。当我们要增加啊一个新的UI时需要通知Command来注册Mediator,需要调用model层对数据进行处理时也应通知Command来调用,如果一个Command类里的代码过多,应当考虑进行拆分,Command类应尽可能分的细点,便于维护。

3.3Proxy主要负责对数据的维护以及与服务器端进行通信处理数据。Proxy应当做到只做纯粹的数据处理不干涉过多的逻辑处理,不关心外面发生了什么事情,只要在数据处理后派发通知来通知外界即可,如果各个Proxy之间需要进行交互,那也应该在Command中来是先调用不用Proxy的方法,不要在Proxy中直接去调用另一个Proxy更不能去调用Mediator。

4.注意清除你不用的Mediator,Proxy,Command应当及时的清除,pureMVC采用观察者模式,及时的清楚能减轻系统的负担,但是有时无法做到清楚指定的Mediator等对象,所以在每次注册新的Mediator,Command,Proxy时要判断是否已经存在相同的类,然后根据自己的需要选择是重新注册还是继续使用以前的,切不可同时注册两个相同的,例如:当你有两个相同的Mediator时,你通过NAME属性去获取该对象,那究竟获取哪一个对象才是你想要的呢?

Aug 07

工作中不怎么用位运算,都有些生疏了.今天温习了下.
下面是用位运算来分离颜色值.

var color:uint=0×123456;
var red:uint=color&0xFF0000>>16;
var green:uint=color&0×00FF00>>8;
var blue:uint=color&0×0000FF>>0;

Jun 03

写了一段时间的flex程序,一开始的时候程序比较简单,不涉及到很多的事件和事务逻辑,所以一般用Alert来调试程序就够用了。随着程序越来越复杂,涉及到bug也越来越多,所以Debug显得很关键了。下面个大家介绍一下如何搭建Flex debug环境。(刚好找到有人写的,就粘贴过来了,)

 

下载地址。其他版本下载地址可以参考adobe网站。

  

 

1. 要具备debug功能,我们必须要首先安装Flash Player Debug 版本。

windows版本

2. 安装好debug版本后,我们还需要添加日志的配置文件mm.cfg。

该配置文件存放的目录如下:
Macintosh OS X MacH D:Library:Application Support:macromedia:mm.cfg
Microsoft Windows XP C:\Documents and Settings\user_name\mm.cfg
Windows 2000 C:\mm.cfg
Linux home/user_name/mm.cfg
以上是从官方文档中找来的,但实际上我用windows2000时,我的mm.cfg文件就是放在C:\Documents and Settings\user_name\mm.cfg下的,和xp一样。
配置文件的配置参数在这里列出:
ErrorReportingEnable        1: 打开error信息写入日志文件 0:关闭
MaxWarnings                      设置waining信息记录最大数量,默认值为100,0:无限制
TraceOutputFileEnable       设置trace日志,1:为开,0:为关,默认值为0
TraceOutputFileName         设置trace日志文件位置,Fleah Player 9 Update版本后该属性设置已经没有用了。笔者也试验过确实没有用。输出文件名为flashlog.txt
mm.cfg例子文件:
ErrorReportingEnable=1
TraceOutputFileEnable=1

3. 输出的日志文件位置:
从Flash Player 9 Update开始,我们不能修改日志文件的位置了,默认的位置为:
Windows C:\Documents and Settings\user_name\Application Data\Macromedia\Flash Player\Logs
Macintosh Users/user_name/Library/Preferences/Macromedia/Flash Player/Logs/
Linux home/user_name/macromedia/Flash_Player/Logs/flashlog.txt

到这里你可以放心的用trace()函数进行数据跟踪了。
4. 这里有个例子:
<?xml version=”1.0″?>
<!– logging/ButtonLifeCycle.mxml –>
<mx:Application xmlns:mx=”
http://www.adobe.com/2006/mxml“>
<mx:Script><![CDATA[
         private function traceEvent(event:Event):void {
         trace(event.currentTarget + “:” + event.type);
}
]]></mx:Script>
<mx:Button id=”b1″ label=”Click Me”
preinitialize=”traceEvent(event)”
initialize=”traceEvent(event)”
creationComplete=”traceEvent(event)”
updateComplete=”traceEvent(event)”
/>
</mx:Application>
运行后如果输出一下内容到flashlog.txt文件的话,那么恭喜你成功了。
TraceLifecycle_3.b1:Button:preinitialize
TraceLifecycle_3.b1:Button:initialize
TraceLifecycle_3.b1:Button:creationComplete
TraceLifecycle_3.b1:Button:updateComplete
TraceLifecycle_3.b1:Button:updateComplete
TraceLifecycle_3.b1:Button:updateComplete

May 25

/*

版本: 8.02

日期: 8/24/2008

ACTIONSCRIPT 语言版本: 3.0 (AS2 版也有提供)

更新 更多文档请访问: http://www.TweenLite.com (这里的链接指向 AS3 )

描述:
        缓动。 我们都在做。我们很多人都知道除了 Adobe’s Tween 类之外,还有很多更好的动画引擎,(比如 Tweener). 每种引擎都有它们各自的优缺点。
        最近几年,为了得到一个更紧凑的,跑得更快,效率更高的引擎,我创建了 TweenLite (我无法接受其它的一些引擎带来的文件尺寸上的负担).它很快就融入到我的所有工作中。我告诉其它人,让大家能够从中获益,最终,我将它发布了出来。在过去的几年中,TweenLite越来越受欢迎,超乎了我的想像.
        基于此,我又添加了一些新的功能,并且尽量保持这个文件的尺寸,让它小于3K。 TweenFilterLite 扩充了 TweenLite 并且加入了滤镜缓动,包含了 ColorMatrixFilter 的一些效果,比如饱和、对比、增亮、色调,甚至是着色,但文件的尺寸始终没有超过3K。与 TweenLite 的做法相似,提供有AS2版和AS3版的类包下载。 Continue reading »

May 25

TweenMax 建立在 TweenLite 和TweenFilterLite 基础之上,因此,又揉合了这二者的功能,使得功能更加的齐备,但是如果说易用性,觉得还是 TweenLite 来得方便一些。我的译文是从 TweenLite 开始的,接着是  TweenFilterLite 最后是  TweenMax ,这也恰好是这个类发展的轨迹,沿着这个轨迹一路读过来,会觉得容易理解很多。

/*
版本: 1.17
日期: 6/10/2008
ACTIONSCRIPT 版本: 3.0 (网站提供有 AS2 版本的类)
更新及更多详细文档,请访问: http://www.TweenFilterLite.com (链接到 AS3 版)
中文翻译:独自行走【闪航AS】 (英文名 Richard ) 博客 http://dzxz.blog.5d.cn
描述:
 TweenMax 建立在 TweenLite 核心类以及它的大哥 TweenFilterLite 基础之上,它为 Tween 家族增加了新的受欢迎的功能(尽管只是锦上添花),从而使家族更加的壮大,比如贝赛尔缓动、暂停/继续能力,简便的连续缓、16进制颜色缓动、以及更多的内容。 Continue reading »

Feb 02

function copyArray(_obj:Array):Array {
        var _bytesarray:ByteArray =new ByteArray;
        _bytesarray.writeObject(_obj);
        _bytesarray.position =0;
        return _bytesarray.readObject();
}

var obj:Array = new Array(”1″, “2″, “3″);
var obj2:Array =copyArray(obj);
trace(obj2);