2008年10月16日星期四

2007年2月集合

僅改2位元組,WinXP Home即刻變身WinXP Pro


一份名為《C'T》的德國電腦雜誌在一年前的一次報導,它已經成功實現把Windows XP Home的安裝檔變成WinXP Pro。真的不錯。

具體說明看這裏:

http://hk.knowledge.yahoo.com/question/?qid=7007011202727

不過,也有文章說“要小心”了:

http://download.enet.com.cn/blog/index.php?itemid=1519

2月25日

一虎一席谈:“伪科学”PK

我已經很長時間沒有看過鳳凰衛視了,想不到還有這樣的節目,強烈推薦,目前看到有兩次辯論.

第一次PK,分5段視頻:
http://v.blog.sina.com.cn/b/585710-1192346960.html

第一次PK,分4段視頻:
http://v.blog.sina.com.cn/b/585036-1192346960.html

強,約2個小時,我剛看完,方舟子\司馬南\何祚庥等皆登場,節目現場就差打起來了,有些年紀大的當場都吃高血壓的藥了,這比什麼大專辯論賽強多了.

我正在搜索,如果以後還有的話一定會再推薦給大家.真得非常強,不看可惜了.
2月22日

机顶盒的flash界面程序GUI

机顶盒的flash界面程序,这是即将爆发的一个应用方面,很有借鉴例,推荐观看。

http://www.6rooms.com/watch/18179.html

现在看起来,flash之对于视频应用还是刚刚起步,不要看youtube、56、tudou等现在还没有什么前途可言,但未来可能改变视频媒体的格局,目前互联网新闻和广告已经改变了平面媒体,虽也无法预料到“会发生什么”,但我们可以预料到“可能发生什么”。

加油,Flash!!!!!
2月12日

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(8)

第Ⅲ篇 Flash网络应用程序和FMS
在前面的两篇,我们介绍了如何使用JSP网页结合Flash开发网络应用程序,也介绍了如何使用Flash Remoting(各种RPC)与Flash有效的结合,可以说已经可以创建数据驱动的富媒体应用程序了。
但是,Flash技术还远不止这些,围绕着Flash Player,Macromedia为用户带来了更为丰富的体验,这就是Flash Media Server(简称FMS)。
Macromedia于2002年年末发布了令人惊异的Flash Communication Server MX服务器(简称FCS),这是FMS的前一个版本。使用FMS,你只需要配备Web摄像头和麦克风,并加上十几行ActionScript脚本便可以完成一个电视会议系统。
FMS给全世界的人带来一种全新的通讯方式。有了FMS服务器,您可以参加实时网络会议;使用FMS的功能在工作中进行协作以及通过Internet或企业Intranet共享信息。
还不只是这一点,Flash Player的强大功能使得实时通讯和应用程序的集成由梦想变为现实,这正是未来网络软件发展的趋势,这都是Flash Player惹的“火”。
本篇将介绍如何将Java和FMS结合起来以创建更为强大的Flash网络应用程序。
2月6日

Flash和PHP結合的方式總結(Flash和PHP通訊的方式)★☆★☆★☆★☆★☆★☆

《PHP for Flash網站開發手札》內包含了明確地介紹了Flash和PHP結合開發時要用到的各種技術,但是它比較太寬了,包含了web伺服器和PHP應用程式伺服器,下面我們在這裏做一個分隔出來的技術總結,怎樣在Flash和PHP應用程式伺服器之間通訊:

[1]使用MovieClip物件的getURL、loadVariables、loadVariablesNum方法可以使用HTTP或HTTPS協定以URL編碼格式向PHP應用程式伺服器傳遞和接收資料。

[2]使用LoadVars類的load、send和sendAndLoad方法可以使用 HTTP 或 HTTPS 協定以URL編碼格式向PHP應用程式伺服器傳遞和接收資料。

[3]使用XML類的XML.send、XML.load和XML.sendAndLoad方法可以以XML格式向PHP應用程式伺服器傳遞和接收資料,這還包括一些基於XML的變種形式,例如WDDX、SOAP等。
[4]使用XMLSocket類的XMLSocket.connect 和 XMLSocket.send方法可以創建和使用TCP/IP套接字連接從而以XML 格式向PHP應用程式伺服器傳遞和接收資料。

[5]使用Connection類或者NetConnection的call方法可以使用AMF協定向PHP應用程式伺服器傳遞和接收資料,這被稱為AMF-RPC的方式,還包括其他的變種形式,但都統稱為AMF-RPC方式。

現在馬上出發
作者邀您訪問他的BLOG: http://zhang-yafei.spaces.live.com(繁體)
作者邀您訪問他的BLOG: http://blog.csdn.net/zhang_yafei/(簡體)
2月3日

惊曝!从没有公布的液晶电视天生缺陷!(液晶电视很容易烧毁?)

今天看到一个文章,标题《惊曝!从没有公布的液晶电视天生缺陷!》,其介绍了液晶电视很容易烧毁的现象,真得触目惊心呀。
我很早以前只是觉得太费电,没有想到它会这么容易烧毁,幸亏还没买。
介绍给大家看一下:
2月2日

《Flash ActionScript X》勘误(1)

勘误1(chapter_11简体中文版)、

对于submit.htm文件,应该做如下修改(注意图中标红突出显示的部分):

textField" name="textPut" id="textPut">

感谢lzp710的来信。
勘误2(第188-190页,增加代码的注释)、
/**-------------------------------------------------------

*《Flash ActionScript X开发入门》勘误
* @勘误目的 代码补充注释
* @page 188--190
* @version Created on Dec 7, 2006
* @author zhang yafei
* @BLOG http://zhang-yafei.spaces.live.com/
-------------------------------------------------------**/
/**-------------------------------------------------------
*总体的思路是将Sound对象的属性与GUI模块关联起来
*我想无论是何种考虑,都无法躲过使用此方法来实现
*-------------------------------------------------------
*我利用了一系列变量和onEnterFrame事件配合来达到这个目的
*另外一些变量用来控制状态:前进、后退、拖动音轨滑块等
*-------------------------------------------------------
* newPosition Sound对象的播放位置,每次播放都检查这个变量
* advance 前进
* goBack 后退
* dragging 拖动音轨滑块
* playing 是否正处于播放状态
-------------------------------------------------------**/
//stop()是基于时间轴应用程序最常见的命令
//你随处都可以用它,并且不要吝啬
stop();
//首先声明和初始化变量
var newPosition:Number;
var advance:Boolean;
var goBack:Boolean;
var dragging:Boolean;
var playing:Boolean = true;
butt_play.enabled = false;
//创建Sound的一个实例,然后从库中加载并开始播放
var mySound:Sound = new Sound();
mySound.attachSound(varSound);
mySound.start(0, 1);
//声音播放完毕时,一切复原
mySound.onSoundComplete = function() {
mysound.stop();
newPosition = mySound.duration/1000;
playing = false;
butt_play.enabled = true;
};
//初始化变量和属性
//音轨属性,主要是用来控制滑块的拖放范围
//startDrag要用这些变量
var fade_track_top:Number = panel_open.fade_track._y;
var fade_track_bottom:Number = panel_open.fade_track._y;
var fade_track_left:Number = panel_open.fade_track._x;
var fade_track_range:Number = panel_open.fade_track._width-1;
var fade_track_right:Number = panel_open.fade_track._x+fade_track_range;
/**
*GUI按钮的控制事件,主要就是运算几个变量
*其中主要的就是注意newPosition变量
*因为这个变量代表的是当前播放的位置
*/
butt_play.onRelease = function() {
if (!playing && newPosition<mySound.duration) {
mySound.start(newPosition, 1);
playing = true;
}
butt_stop.enabled = true;
butt_pause.enabled = true;
butt_play.enabled = false;
};
butt_pause.onRelease = function() {
if (playing) {
newPosition = mySound.position/1000;
}
mySound.stop();
butt_pause.enabled = false;
butt_stop.enabled = true;
butt_play.enabled = true;
playing = false;
};
butt_rewind.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
panel_open.butt_fade._x = fade_track_left;
butt_play.onRelease();
butt_pause.enabled = true;
butt_stop.enabled = true;
butt_play.enabled = false;
};
butt_fastforward.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
butt_play.enabled = true;
panel_open.butt_fade._x = fade_track_right;
};
butt_stop.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
panel_open.butt_fade._x = fade_track_left;
butt_pause.enabled = false;
butt_stop.enabled = false;
butt_play.enabled = true;
};
butt_stepforward.onPress = function() {
advance = true;
};
butt_stepforward.onRelease = function() {
advance = false;
};
butt_stepforward.onReleaseOutside = function() {
advance = false;
};
butt_stepBack.onPress = function() {
goBack = true;
};
butt_stepBack.onRelease = function() {
goBack = false;
};
butt_stepBack.onReleaseOutside = function() {
goBack = false;
};
//__________________________________________________________
//利用onEnterFrame事件配合快进和快退按钮命令
//在其中,我们定义了一个变量playing用来显示是否正在播放
//从而根据mySound对象属性来和音轨对应
this.onEnterFrame = function() {
//注意这里是根据播放的方向来控制的
//根据不同播放方向来不断改变音轨滑块的位置
if (advance) {
if (mySound.position/1000+1<mySound.duration/1000) {
if (playing) {
newPosition = mySound.position/1000+1;
mySound.stop();
mySound.start(newPosition, 1);
} else if (butt_fade._x<fade_track_right) {
butt_fade._x++;
newPosition = ((panel_open.butt_fade._x/fade_track_range)*mySound.duration)/1000;
}
}
}
if (goBack) {
if (playing) {
newPosition = mySound.position/1000-1;
mySound.stop();
mySound.start(newPosition, 1);
} else if (panel_open.butt_fade._x>fade_track_left) {
panel_open.butt_fade._x--;
newPosition = ((panel_open.butt_fade._x/fade_track_range)*mySound.duration)/1000;
}
}
//拖放移动音轨滑块,两个事件
//开始拖动和停止拖动
panel_open.butt_fade.onPress = function() {
startDrag(panel_open.butt_fade, false, fade_track_left, fade_track_top-5, fade_track_right, fade_track_bottom-5);
dragging = true;
playing = false;
};
panel_open.butt_fade.onRelease = function() {
stopDrag();
mySound.stop();
dragging = false;
if (panel_open.butt_fade._x/fade_track_range == 1) {
playing = false;
panel_open.butt_fade._x = fade_track_right;
newPosition = mySound.duration/1000;
} else {
playing = true;
newPosition = (((panel_open.butt_fade._x-fade_track_left)/fade_track_range)*mySound.duration)/1000;
if (playing) {
mySound.start(newPosition, 1);
}
}
};
//音轨滑块自动移动情况
if (playing) {
panel_open.butt_fade._x = (mySound.position/mySound.duration)*fade_track_range+fade_track_left;
}
};
感谢instanceof的来信。
勘误3(第195-199页,增加代码的注释)、
/**-------------------------------------------------------
*《Flash ActionScript X开发入门》勘误
* @勘误目的 代码补充注释
* @page 195--199
* @version Created on Dec 7, 2006
* @author zhang yafei
* @BLOG http://zhang-yafei.spaces.live.com/
-------------------------------------------------------**/
/**-------------------------------------------------------
*@总体的思路
*我们使用外部的XML文件来作为MP3文件的数据库
*主要就是MP3文件的的名称和路径
*因此下面来构造一个XML对象来加载和解析XML文件
*目的就是获得MP3文件的的名称和路径
-------------------------------------------------------**/
//soundList是一个列表框组件,用来显示MP3文件
//首先清空组件,也就是一个初始化
//变量myOutSound用来定义是播放库中的声音
//还是播放外部的MP3文件
soundList.removeAll();
_parent._parent.myOutSound = true;
//下面构造一个XML对象来加载和解析XML文件
var xmlSound:XML = new XML();
xmlSound.load("soundlist.xml");
xmlSound.ignoreWhite = true;
function myOnLoad():Void {
var myVar:String = xmlSound.firstChild.nodeName;
var myVar2:String = xmlSound.firstChild.firstChild.attributes.path;
var myVar3:String = xmlSound.firstChild.firstChild.nodeName;
var myVar4:String = xmlSound.firstChild.firstChild.nextSibling.nodeName;
var myVar5:String = xmlSound.firstChild.firstChild.firstChild.nodeValue;
var soundNum:Array = new Array();
soundNum = xmlSound.firstChild.childNodes;
for (i=0; i<=soundNum.length; i++) {
if (soundNum[i].nodeName.substr(0, 5).toLowerCase() == "sound") {
//填充列表框组件
soundList.addItem(soundNum[i].firstChild.nodeValue+" in "+soundNum[i].attributes.path, soundNum[i].attributes.path);
}
}
soundInput = soundList.getItemAt(0).data;
trace(soundList.getItemAt(0).data);
}
xmlSound.onLoad = myOnLoad;
/**-------------------------------------------------------
*处理用户的选择事件**
*1、用户选择复选框,表明他将播放库中的声音元件
*2、用户取消选择复选框,并点击列表框,那么表明将播放外部的MP3文件
**
*我们创建两个监听对象以处理用户对复选框和列表框的选择事件
-------------------------------------------------------**/
var myListBox:Object = new Object();
var myCheckBox:Object = new Object();
//为监听对象定义事件函数
//事件函数中有一些向播放器传递消息和命令的代码
//主要就是播放器按钮的状态、播放状态
//变量myOutSound用来定义是播放库中的声音
//还是播放外部的MP3文件
myListBox.change = function(event_obj:Object) {
soundInput = event_obj.target.selectedItem.data;
trace(event_obj.target.selectedItem.data);
_parent._parent.playing = false;
_parent._parent.mySound.stop();
_parent._parent.butt_rewind.onRelease();
_parent._parent.myOutSound = true;
};
myCheckBox.click = function(event_obj:Object) {
if (event_obj.target.selected) {
soundList.enabled = false;
soundInput = "";
_parent._parent.mySound.stop();
_parent._parent.playing = false;
_parent._parent.myOutSound = false;
_parent._parent.myInSound = true;
_parent._parent.butt_rewind.onRelease();
}
if (!event_obj.target.selected) {
soundList.enabled = true;
_parent._parent.mySound.stop();
_parent._parent.playing = false;
_parent._parent.myOutSound = true;
_parent._parent.myInSound = false;
_parent._parent.butt_rewind.onRelease();
}
};
//将监听事件函数赋给监听对象
soundList.addEventListener("change", myListBox);
soundCheck.addEventListener("click", myCheckBox);
//stop()是基于时间轴应用程序最常见的命令
//你随处都可以用它,并且不要吝啬
stop();

感谢instanceof的来信。

Flash v.s. Flex

想看看老外怎么讲,但是却访问不了,谁能转贴一下:
2月1日

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(7)

21 AMF-RPC的开源实现OpenAMF

OpenAMF是一个开源的AMF-RPC实现,几乎可以替代Flash Remoting MX for Java。并且也有自己的一些特点,本章我们就来介绍一下怎样使用OpenAMF开发Flash网络应用程序。

21.2嗨!Flash Remoting MX for Java

现在,我们将创建一个最简单的使用OpenAMFFlash影片应用程序——一个类似传统的 Hello World程序。

webapps\3JK\WEB-INF\classes目录下将flashRemoting目录复制到webapps\3JK_with_OpenAMF\WEB-INF\classes目录下,实际上这些类都可以被用于OpenAMF

打开前面我们调用JavaBeansFlash影片应用程序,只需修改一下网关的地址就可以了。

找到下面的一行代码:

var myService:Service = new Service("http://localhost:8080/3JK/gateway", null, "flashRemoting.javaBeansTest.FlashJavaBeans", null, null);

修改为:

var myService:Service = new Service("http://localhost:8080/3JK_with_OpenAMF/gateway", null, "flashRemoting.javaBeansTest.FlashJavaBeans", null, null);

Ctrl+Enter键测试Flash影片应用程序,可以看到在“输出”面板中出现我们在JavaBeans中定义的信息。如图21.1所示:

21.1 “输出”面板中显示返回值

同样也可以调用其它的例子,但是要注意将支持的类(例如rowset.jar)复制到3JK_with_OpenAMF\WEB-INF\lib目录下。

技巧与提示

OpenAMF不支持将ServletJSP作为远程服务方法