yafei 的个人资料要做就做到全球最棒 要麼就不做照片日志列表更多 工具 帮助
2月27日

僅改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/(簡體)

     
 


最新版本》》》》》》:

《PHP for Flash FMS動態網站開發手札》繁體第三版由上奇科技出版


      

http://zhang-yafei.spaces.live.com/blog/cns!5358FA09E8EB6188!1264.entry

 
     




2月3日

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

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

《Flash ActionScript X》勘误(1)

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

对于submit.htm文件,应该做如下修改(注意图中标红突出显示的部分):
 
<form name="form1" method="post" action="receive.asp">
  <input type="textField" name="textPut" id="textPut">
  <input type="submit" name="Submit" value="Submit">
</form>
 
感谢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作为远程服务方法