MIME type of corssdomain.xml
16:08 , Qizhi
今天调式播放器时,均衡器模块(具体为SoundMixer.computeSpectrum()方法)总报安全错误,但是音乐却能正常播放,百思不解。后来检查crossdomain.xml,发现服务器返回的Content-Type 为"application/octet-stream",原来是MIME错了。
除了SoundMixer.computeSpectrum方法,调用ID3等较为底层的方法时,仍然会检查crossdomain。
Starting in version 9,0,115,0, Flash Player will ignore any HTTP policy file that is not sent with a Content-Type value that gives some assurance that the file is intended to be a text file. Flash Player requires that a policy file's Content-Type must be one of the following:
text/* (any text type)
application/xml or application/xhtml+xml
除了SoundMixer.computeSpectrum方法,调用ID3等较为底层的方法时,仍然会检查crossdomain。
Starting in version 9,0,115,0, Flash Player will ignore any HTTP policy file that is not sent with a Content-Type value that gives some assurance that the file is intended to be a text file. Flash Player requires that a policy file's Content-Type must be one of the following:
text/* (any text type)
application/xml or application/xhtml+xml
Dec
23
2008
Flash与盒模型-- FIM Media Player
18:38 , Qizhi
草草总结了下Myspace Media Player (FIM Media Player)开发,播放器整合了音乐、视频点播、视频直播等功能为一体,具备自定义皮肤、MP3/WMA等多种格式混播支持等等功能。FIM Media Player主要被用在由Myspace.com与美国四大唱片公司合作的Myspace Music频道。
MoxModel(盒模型)原指在HTML中,利用DIV+CSS定义页面样式。FIM Media Player的UI系统借鉴了这种模型,使用XML+CSS定义样式,就如同使用HTML+CSS一样是的皮肤的定制变得十分方便,而设计师只用考虑UI的设计,是的设计与开发能很好的分离与协作。一个皮肤定义文件如http://lads.myspacecdn.com/videos/userInternational.xml所示。
体验Myspace Media Player
MoxModel(盒模型)原指在HTML中,利用DIV+CSS定义页面样式。FIM Media Player的UI系统借鉴了这种模型,使用XML+CSS定义样式,就如同使用HTML+CSS一样是的皮肤的定制变得十分方便,而设计师只用考虑UI的设计,是的设计与开发能很好的分离与协作。一个皮肤定义文件如http://lads.myspacecdn.com/videos/userInternational.xml所示。
体验Myspace Media Player
Dec
12
2008
发布Air Reader RSS读写器,开放源代码
10:26 , Qizhi

这是我一个人写了3个多月的个人项目,实现了Google Reader绝大多数功能以及博客离线编辑、远程发布、管理等等功能,没有什么初衷,但是从项目开始就有了开源的打算,其中涉及数据库优化、性能调优、配置文件的使用等等,应该对Actionscript3、AIR初学者有一定参考。接下来时间很紧,就暂时发布Beta版,慢慢做更新,一个人负责程序+美术设计+产品+测试,是一件十分消耗精神的事情,错误难免很多,高手见谅。
项目是使用PureMVC Multicore版,支持多模块加载。这是第三次重构是引入的。实际上,这个项目经历了5次大的重构,小的改动和调整不计其数。
第一次重构:引入PureMVC,重构整体代码。一开始是想自己架构整个软件,各自功能分层显示。但是发展到后来,Event满天飞,真是out of control了,对比多家MVC框架后最终没选Cairngorm,而是使用PureMVC。Cairngorm的ModuleLocator模式还不如没有模式,当然,PureMVC的观察者模式是Object,类型安全上有缺陷,但整体优于Cairngorm。
第二次重构,引入DAO模式分离数据库与业务。
第三次重构,引入Multicore PureMVC,抽离部分模块为子模块。
第四次重构,数据库优化,改写了绝大部分程序语句以提升性能。
第五次重构,由于牵扯到DAO、内存回收等一系列问题,决定取消模块化的程序,模块不可控了,也没时间去深入研究Module,但是保留了Multicore PureMVC,日后有时间会再次改装。模块主要是将RSS FEED、Blog Writer、Report(未完成)三部分。所以这次重构工作量不是很大。
AIR Reader项目地址:http://www.moorwind.com/reader/product.html
最新源代码可以通过Google Code的SVN获取
Code License: Artistic License/GPL
---------------------------------
Air Reader集成了RSS阅读器与Blog离线编辑功能,使用Air Reader,您可以轻松订阅好友博客,撰写原创博文,或者与好友共享精彩文章。
Air Reader支持RSS搜索,您可以通过输入关键词搜索好友FEED,或者通过QQ号订阅好友博客,甚至导入您在Myspace、Flickr等社区的好友博客。
Air Reader支持同步发表文章到您在Myspace、MSN Space等社区的博客平台。如果您的博客支持Metaweblog协议,Air Reader可以轻轻松松设置您自定义的博客远程发布。
Air Reader使用Adobe AIR 1.5开发,给您带来舒适的阅读享受。
Air Reader使用本地数据存储,当您离线后仍然可以快速阅读好友的博文。

Nov
27
2008
大数据量下AIR SQLlite的瓶颈不在SQLite
18:22 , Qizhi
是的,在使用事务、为表添加索引后,AIR访问数据库的速度飞快无比。但是...看下面的代码:
var result:SQLResult = execute(query, data, prefetch); //execute a SQL select command
if(!result || !result.data)
{
return null;
}
var dataArray:Vector.<BlogItemVO> = new Vector.<BlogItemVO>();
for each(var obj:Object in result.data)
{
var BlogItem:BlogItemVO = new BlogItemVO();
BlogItem.blogId = obj["blogId"];
BlogItem.blogSourceId = obj["blogSourceId"];
BlogItem.title = obj["title"];
BlogItem.authors = obj["authors"];
BlogItem.link = obj["link"];
BlogItem.guid = obj["guid"];
BlogItem.description = obj["description"];
BlogItem.pubDate = DateUtil.parseRFC822(obj["pubDate"]);
BlogItem.isRead = obj["isRead"];
BlogItem.isStar = obj["isStar"];
BlogItem.isKeepUnread = obj["isKeepUnread"];
BlogItem.creatDate = obj["creatDate"];
BlogItem.isSelected = false;
dataArray.push(BlogItem);
}
这段代码如果只是取二位数数据,很正常,没任何问题。但当数据在三位数以上是,花销就大了。测试发现,仅仅获取1000条数据花费查询时间250ms,但是从取到数据,转换Object类型为BlogItemVO类型却花了4609ms。
问题是,数据类型必须转换,我的做法是大数据暂时不转换类型,只在显示该数据是在做转换。
var result:SQLResult = execute(query, data, prefetch); //execute a SQL select command
if(!result || !result.data)
{
return null;
}
var dataArray:Vector.<BlogItemVO> = new Vector.<BlogItemVO>();
for each(var obj:Object in result.data)
{
var BlogItem:BlogItemVO = new BlogItemVO();
BlogItem.blogId = obj["blogId"];
BlogItem.blogSourceId = obj["blogSourceId"];
BlogItem.title = obj["title"];
BlogItem.authors = obj["authors"];
BlogItem.link = obj["link"];
BlogItem.guid = obj["guid"];
BlogItem.description = obj["description"];
BlogItem.pubDate = DateUtil.parseRFC822(obj["pubDate"]);
BlogItem.isRead = obj["isRead"];
BlogItem.isStar = obj["isStar"];
BlogItem.isKeepUnread = obj["isKeepUnread"];
BlogItem.creatDate = obj["creatDate"];
BlogItem.isSelected = false;
dataArray.push(BlogItem);
}
这段代码如果只是取二位数数据,很正常,没任何问题。但当数据在三位数以上是,花销就大了。测试发现,仅仅获取1000条数据花费查询时间250ms,但是从取到数据,转换Object类型为BlogItemVO类型却花了4609ms。
问题是,数据类型必须转换,我的做法是大数据暂时不转换类型,只在显示该数据是在做转换。
Nov
15
2008
很值得一看的幻灯片,这些观点不论是开发Flex / Flash还是Silverlight都很有益处。对幻灯片的详细描述见http://www.joshholmes.com/2008/10/27/ArchitectureOfRIAFromJAOO.aspx。作者是Josh Holmes和James Ward ,有意思的是,他们俩分别是Adobe和Microsoft的evangelist。
Nov
8
2008




