2010-12-15

開發 CodeIgniter 時,NetBeans 的程式碼自動完成設定

CodeIgniter auto complete with Netbeans

原理是把以下的註解格式存成 php 檔,放置 nbproject 目錄內

/**
* @property CI_Loader $load
* @property CI_Form_validation $form_validation
* @property CI_Input $input
* @property CI_Email $email
* @property CI_DB_active_record $db
* @property CI_DB_forge $dbforge
*/

2010-11-30

MySQL 剔除某欄重複的資料

使用 GROUP BY:
SELECT * FROM `some_table` GROUP BY `some_field`

將結果寫入另一張表:

CREATE TABLE `tmp_table` AS (
SELECT * FROM `some_table` GROUP BY `some_field`
)


使用 DISTINCT 只能用於某一欄或著某些欄位:
SELECT DISTINCT `some_field` FROM `some_table`
SELECT DISTINCT `some_field`, `another_field` FROM `some_table`
SELECT DISTINCT * FROM `some_table` (含主鍵的話,此行無用)

另外,計算重複的個數:
SELECT *, count(*) FROM `some_table` GROUP BY `some_field`

2010-11-29

本機設定虛擬網域

在 Windows,修改下列的設定檔:
C:\WINDOWS\system32\drivers\etc\hosts

在 Mac,修改下列的設定檔:
/etc/hosts

在 Mac,用 TextEdit 的方式(使用 Terminal):
sudo -s
/Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts

內容格式為:
127.0.0.1  my_pseudo_domain.com

2010-11-22

在 PHP 中使用 SQLite3

很早就知道 PHP5 內建 SQLite 的功能,但是一直沒在 PHP 上使用 SQLite,原因無它「有 MySQL 幹嘛用 SQLite」。
Adobe AIR 上的是 SQLite3,Firefox 的外掛 SQLite Manager 也(只)支援 SQLite3,搭配起來還蠻方便的。
最近有個案子是要做多國語言的展示平台(當然是用 Flash 做囉),要讓管理人員(不會是我)上平台的內容。問題出在那台機器可能沒有網路,就算有網路,頻寬也可能會是個問題,所以要做單機的版本。
展示端無庸置疑 Adobe Flash/AIR 是個好選項,但內容管理用 AIR 就顯得麻煩。為了方便更新內容(拷貝/貼上),目前考慮使用 PHP + SQLite,而把 MySQL 排除在外。

PHP 目前最新的版本是 5.3.X,我租用的 PHP 空間為 5.1.6,雖然這個專案不會用到租用的空間,但為了可以通用,就會以 5.1.6 為預設版本。
用了 PHP5 的 SQLite 才知道原來它的版本是2。PHP 5.1.6 要使用 SQLite3 必須透過 PDO。PHP 5.3 之後的版本才有直接支援 SQLite3 的類別。SQLite2 有啥不好?其實沒什麼不好,只是個人用慣 SQLite Manager 了,而且用舊版心中總會掛念它是舊版,若要用新版的功能時,可能就悔不當初 :P

2010-11-20

承上篇「無法使用phpMyAdmin時的DB資料備份及回復」

sqlbuddy 試用了一下, 功能雖然較 phpMyAdmin 簡單許多, 但其實已經很夠用了 :)

2010-09-03

無法使用phpMyAdmin時的DB資料備份及回復

在某些情況,無法使用 phpMyAdmin,資料庫操作時都會挷手挷腳。
資料備份可以使用 Old Guy Mybackup,只有一個檔案,加密碼設定一下連線帳號資料,再用瀏覽器連一下就 OK 了,很方便。
回復資料的話,用 BigDumpbriian 的介紹阿修的介紹

2010-08-30

本地端測試 Facebook App

Facebook App 註冊之後,可以使用 appId 在本地端測試,而不用上傳到 Canvas URL。
然而,測試時只能使用 127.0.0.1 而禁止使用 localhost 或其它網域名。

2010-08-22

SWFAddress 和 SWFObject 還得配對了才行 ?!

用SWFAddress時,瀏覽器的 back 和 forward 按鈕老是失效。JS 和 AS 都是再三檢查,寫的都是對的。索性把 swfaddress.js 和 swfobject.js 換成 SWFAddress cs3 範例裡的 js,結果就 OK 了。這會不會太瞎了 :-&

2010-08-19

Flash 以 multipart/form-data 的方式上傳資料/檔案

AS3 的 FileReference 和 FileReferenceList 實際上一次只能上傳一個檔案,若一次要上傳多個檔案或者多個資料(數個 ByteArray)時,就會遇到困難。

使用 URLRequest 和 URLLoader 以 POST 的方式傳送或許可以解決部份情況,但同時傳遞變數和 ByteArray 時會有問題,除非是很了解 HTTP 資料格式的工程師。

這裡介紹的當然是現成的工具 MultipartURLLoader class,MultipartURLLoader 是 in-spirit 專案裡的一部份(作者 Eugene 是俄國人),其 blog 介紹在 http://blog.inspirit.ru/?p=139

MultipartURLLoader 使用起來非常方便,Eugene 的 blog 就有很好的例子,enjoy it :)

2010-08-18

Flash 可以透過 JavaScript 取得 Facebook 的 session

Flash 可以透過 ExternalInterface (JavaScript) 取得 Facebook 的 session,
只要取得 session 裡的 access_token 就可以在 Flash 呼叫 Facebook 的 Graph API。

以下程式碼的要點:
1. 使用 swfobject 顯示 Flash 內容。
2. JavaScript 都載入後再顯示 Flash。
3. Flash 先呼叫 JS function,JS function 呼叫 FB function,callback function 呼叫 Flash function。
4. JS function 裡,swf movie name 和 callback function name 以傳入的方式設定。
5. access_token 以 get 方式傳送。
6. Graph API 回傳的內容是格式化過的 JSON 字串。
Code 參考

2010-08-15

在 Win7 console 啟動 FMS

在 Win7 上安裝 FMS 3.5.1 接著安裝 3.5.3 update
用「開始」的工具列啟動 FMS 卻發生沒有啟動的情況, 不知道是否是權限問題 -.-

後來決定用 console (命令列) 來啟動:

  • 在桌面放一個命令列的捷徑
  • 在命令列的捷徑圖示上按滑鼠右鍵,選「以系統管理員身份執行」
  • 啟動 FMS 用「>net start FMS」
  • 停止 FMS 用「>net stop FMS」
  • 啟動 FMSAdmin 用「>net start FMSAdmin」
  • 停止 FMSAdmin 用「>net stop FMSAdmin」

2010-08-12

從 AS3 改寫的 JavaScript JSON Formatter

參考 http://qops.blogspot.com/2010/04/json-formatter.html
用法
var jf = new JsonFormatter(JSON.stringify(response));
jQuery("#show1").html("<pre>" + jf.getResult() + "</pre>");

2010-08-11

JavaScript JSON Formatter

Blog: http://joncom.be/code/javascript-json-formatter/
Source file: http://static.joncom.be/script/jsonformatter.js

FaceBook 的 JavaScript 和 jQuery 混用

FaceBook 的 JavaScript 和 jQuery 混用時,Chrome 執行是正常的(如預期),但是 FireFox 和 IE8 卻看不到東西,也沒有錯誤提示。
後來想說會不會是 $ 衝到,不使用 $ 而以 jQuery 替代之後,執行就正常了。
難道 FB 的 JavaScript API 裡使用 $ 當變數,嘖!
Code 參考

目前瀏覽器幾乎都實作了 JavaScript 的 JSON 物件

以往在 JavaScript 要使用 JSON 的功能必須要使用 http://www.json.org/json2.js
目前各家 browser 應該都實作了 JSON 功能,無需使用 JavaScript 的 library,
直接就可以使用 JSON.stringify() 和 JSON.parse()。
測試過的有 FireFox 3.6、Google Chrome、IE8。手持裝置的瀏覽器沒試過

2010-07-08

Netbeans 編輯區的字體反鋸齒

編輯 Netbeans 安裝目錄裡的 /etc/netbeans.conf,在啟動設定 netbeans_default_options 加參數
-J-Dawt.useSystemAAFontSettings=on

2010-06-22

用 AIR2 透過 DatagramSocket (UDP) 及截圖做簡陋的監視服務

安裝 PicServer.air 的電腦必須要有 Webcam,當然也要有網路功能,使用 port 24688,啟動後會等待 client 登入。安裝 PicClient.air 的電腦是監看端,使用 port 24689,記得防火牆要讓訊息通過才行。由於使用 UDP,所以無法得知連線狀態,因為 client 必須傳 session 給 server,server 才會傳畫面資料給 client。client 端還可以發展成調整時間間隔、畫面品質、及存檔等。
原始碼如下(請使用 Flash CS5)。

2010-06-18

值得注意的專案:ZipUtil、AppengineJS、Axiis

訊息來源:A Simple Zip Utility for Adobe AIRFour short links: 18 June 2010: Facebook Scraping, Law Code, AppEngine in Javascript, and Flash Visualization

A) ZipUtil: 專門給 Adobe AIR 用的 zip 壓縮解壓工具。
B) AppengineJS:利用 JavaScript 寫 App Engine 的專案,架在 Java 平台之上,使用 Rhino。
C) Axiis: 建立在 Degrafa graphics framework 之上的資料視覺化工具。

2010-06-17

使用 Adobe AIR 建立 RTMP Proxy

在此使用 Adobe AIR 建立 RTMP Proxy 的目的是去查看 RTMP 傳送的內容。雖然 Adobe 已經釋出 RTMP Specification,但是在 Flash Player 10.0.32.18 後還是有變動()。
注意事項:
A) Fla 檔記得使用 Flash CS5 開 AIR 2。
B) 在桌面建立個空的 rtmp_proxy 目錄,用來存放執行時的資料存檔。
C) 在 Flash Media Server,開個名為「test」的 Application,並啟動 Server。
D) 先執行 RTMPProxy 再執行 VideoTest,
E) 跑一下子就關掉 VideoTest,否則檔案會越來越多,硬碟可能會爆。

以下是 兩個 Document Classes 的內容,Fla 就不附了:

2010-06-15

Groovy 使用 JSON-simple

想在 Groovy 上使用 JSON,想說 Json-lib 還滿多人用的,就試試看。結果,Json-lib 相依性太多,還需要另外 4 支 jar,而且 run 的時候,錯誤一堆,浪費一些時間後,決定放棄 Json-lib。
後來找到 json-simpe, 果然比較簡單, 搭配 Groovy 顯得更容易使用。不過中文的部份似乎不會轉成 Unicode 的表示法, 這部份在傳給別的程式語言時可能會發生問題。

2010-06-10

Eclipse 混合專案功能

查到這篇 Eclipse 中 將Java Project 轉換為Dynamic Web Project
在專案目錄的 .project 中的 natures 節點增加子節點:

org.eclipse.wst.common.project.facet.core.nature
org.eclipse.wst.common.modulecore.ModuleCoreNature
org.eclipse.jem.workbench.JavaEMFNature

再將其它專案的 nature 放在一起就可以有不同專案的功能了,例如放入下行就有 Groovy project 的功能,當然 Eclipse 必須先安裝 Groovy 外掛:
org.eclipse.jdt.groovy.core.groovyNature

2010-06-09

在 App Engine 上執行 PHP

Google App Engine 目前只支援 Java 和 Python,支援 Java 就有許多好玩的東西。Quercus 是 Caucho 用 Java 實現的 PHP 解譯引擎,在 Java 環境就可以執行。最早,webdigi 就弄了個 Demo,後來 Quercus 官網也弄了個範例。以下是個人實作的方式:

2010-06-03

利用 MDM Zinc 做的 Flash 除錯工具「ZDebugger」

利用 LocalConnection 類別做的工具。使用時,先開啟 ZDebugger.exe,滙入 lin.shinder.mdmzinc.ZTracer類別,接著用 ZTracer.print(你的訊息)。
下載:含原始碼及執行檔的壓縮檔

2010-05-09

AIR 不支援提供系統資料表 sqlite_master

Adobe AIR 不支援提供系統資料表 sqlite_master 和 sqlite_ 開頭的資料表,
可以透過 SQLConnection.loadSchema() 取得相關資料。

Adobe AIR 這樣的做法有點討厭。

2010-04-24

Ajax Animator

Ajax Animator 是個動畫編輯器, 顧名思義是用 Ajax 做的, 能用 JavaScript 做到這樣實在不容易~
這種東西才能在 iPad 上跑 :P
它也可以利用後台技術和 Flex SDK (或 MING ) 生成 SWF
其它非官方、開源、免費工具請參考 Open Source and free Development Tools for Flash

2010-04-23

Flash CS5 支援的 XFL 格式


XFL 的簡單介紹
XFL - eXtensible Form Language Format first

XFL 算是蠻新的格式, 在 Flash CS4 時就支援了, 但 CS4 只能開不能存或滙出。我用 CS5 beta 存 XFL,但在 CS4 卻沒辦法開,應該是格式有更新過。


CS4 時 After Effects 可以滙出,再用 Flash 開

下面這篇說明 XFL 的功能以及為什麼 Flypaper 很快就支援了

重點來了,XFL 是 XML 格式不是 Binary 格式,Spec一定會公開,支援編輯、轉換的軟體也會變多,如此一來 Flash <-> HTML5 中間的隔閡是越來越小。Flash: Die-hard
:D

2010-04-16

MDM ZINC 3 雜記

最近使用 MDM ZINC 3 的雜記:
  1. 使用 AS2 時,SWF 發佈的版本必須為 for Flash Player 8 (含) 以下。
  2. AS2 類別檔使用到 mdm 時,宣告為 dynamic。
  3. AS3 Flash document class 一定要在 constructor 內呼叫 domdm.Application.init()。
  4. 載入其它 SWF 時,記得在主要的 Flash Movie 的最前面下 mdm.Flash.setSWFDir()。
  5. SQLite 無法存放中文,可以用 URL-encoded 解決(mdm 存入時不會自動轉換為 UTF-8)。
  6. SQLite 開啟資料庫時,檔案會自動建立。
  7. SQLite 判斷資料表是否存在用 "SELECT * FROM sqlite_master WHERE type='table' AND name='DB_TABLE'"。
  8. Firefox 的附加元件 SQLite Manager 相當好用。
  9. 中文輸入有問題,會變亂碼。

2010-04-12

Flash AS3 翻頁、翻書效果

這是個被問到爛的效果, 不過難得有 open source 又是 ActionScript 3 的版本
http://megazine.mightypirates.de/
使用前還是請看一下說明文件。

2010-04-09

JSON Formatter 用法

Frame Actions:
import lin.shinder.utils.JsonFormatter;
input_txt.text='[{"name":"shinder", "num":"123"}, {"name":"dephne", "num":"124"}]';
format_btn.addEventListener(MouseEvent.CLICK, formatClick);

function formatClick(event) {
 var jf:JsonFormatter=new JsonFormatter(input_txt.text);
 output_txt.text = jf.result;
}

JSON Formatter

可搭配 as3corelib 裡的 JSON 類別使用, 格式化 JSON 字串, 以方便給人閱讀。在這裡並不會檢查JSON 的格式是否正確。

2010-03-29

寫了個方便處理 FacebookSession 的類別

承上一篇「Flash Builder 4 寫 Facebook Apps」,有自行測試者應該都會覺得在開發 Facebook appa上,除錯顯得很麻煩。必須先把 AppKey 和 AppSecret 填入程式中,測試完,拿掉 AppKey 和 AppSecret,編譯再上傳測試,中間會來來回回很多次。時間應該浪費在美好的事物上,玩 Games 應該比寫 Codes 美好 :P。
可以將 AppKey 和 AppSecret 放到一個檔案裡,再載入。URL-encoded 的文字檔是個選擇,為了讓本篇看起來有深度點(誤),在此採用SWF。若要更有深度可以用ZIP、DOC...,也可以修改副檔名偽裝一下。
若可以載入 Key 檔,表示是在開發過程,必須連一下 Facebook 取得 Session。若無法載入 Key 檔,表示己經發佈了。

2010-03-26

Flash Builder 4 寫 Facebook Apps

Adobe Developer Center 上 Jeanette Stallons 的兩篇 Quick Start 是必看的文章:Build and test locallyDeploy on Facebook。熱騰騰的 Flash Builder 4 當然要好好利用一下 :D

Step 1: 先要有網站空間,使用免費的也行。設定一個空目錄,如:「http://www.riarock.net/fbapps/fbastutorial/」給 Facebook App 使用。

Step 2: 登入 Facebook 並在「http://www.facebook.com/developers/」建立新的應用程式。其中必填的項目為:
基本資料→應用程式名稱 :: 就是應用程式名稱,不能用 Face、FB 等混淆視聽的字眼,所以在此用了 Footbook。
畫布→畫布頁面網址 :: 如「http://apps.facebook.com/fbastutorial/」。
畫布→Canvas Callback URL :: 在這個例子設定為「http://www.riarock.net/fbapps/fbastutorial/」。
畫布→呈現方法 :: 設定使用「Iframe」。
聯外通→聯外通網址 :: 在這個例子設定為「http://www.riarock.net/fbapps/fbastutorial/」。
進階→沙盒模式 :: 測試時先設定為「啟用」。

Step 3: 安裝好 Flash Builder 4 之後,開一個新專案,命名為 fbastutorial。將 Facebook_library_v3.4_flex.swc 放到專案的 libs 目錄。 預設的 Application 為 fbastutorial.mxml,不寫程式,直接執行。

Step 4: 將產生的 bin-debug/fbastutorial.html 複製到 src/index.html。並在指定的位置增加下面標起來的程式碼,用來取得 Facebook 給的 GET 參數。
var flashvars = {}; // ← 找到這一行,增加下面的程式碼
// *** START 增加的部份 ***
var strHref = window.location.href;
if ( strHref.indexOf("?") > -1 ) {
var strQueryString = strHref.substr(strHref.indexOf("?")+1);
var aQueryString = strQueryString.split("&");
for ( var iParam = 0; iParam < aQueryString.length; iParam++ ) {
var aParam = aQueryString[iParam].split("=");
flashvars[aParam[0]] = aParam[1];
}
}
// *** END 增加的部份 ***

Step 5: fbastutorial.mxml 的內容如下。
<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="840" minHeight="500"
applicationComplete="init()"
viewSourceURL="srcview/index.html">
<!-- *** 注意:這裡是用 applicationComplete,不是用 creationComplete *** -->

<fx:Script>
<![CDATA[
import com.facebook.Facebook;
import com.facebook.commands.friends.GetFriends;
import com.facebook.commands.users.GetInfo;
import com.facebook.data.friends.FriendsCollection;
import com.facebook.data.friends.GetFriendsData;
import com.facebook.data.users.FacebookUser;
import com.facebook.data.users.FacebookUserCollection;
import com.facebook.data.users.GetInfoData;
import com.facebook.events.FacebookEvent;
import com.facebook.net.FacebookCall;
import com.facebook.utils.FacebookSessionUtil;

import mx.controls.Image;

private var session:FacebookSessionUtil
private var facebook:Facebook;
private var fbUser:FacebookUser;
private var dictionary:Dictionary;

private function init():void {
// *** 一開始測試時可以先填入 API Key 和 Application Secret
//session = new FacebookSessionUtil("<API Key>", "<Application Secret>", loaderInfo);
session = new FacebookSessionUtil(loaderInfo.parameters.fb_sig_api_key, null, loaderInfo);
// 取得 Facebook Session,有 Session 才有權使用 Facebook API
facebook = session.facebook;
// 取得 Facebook Session 並連結之後,呼叫 onSessionConnect 方法
session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);

if(loaderInfo.parameters.fb_sig_added == true){
// 有登入時,呼叫核對 Session,OK的話發出 CONNECT 事件
session.verifySession();
} else if(loaderInfo.parameters.fb_sig_added == false){
// 沒登入時
navigateToURL(new URLRequest("http://www.facebook.com/login.php?api_key="+loaderInfo.parameters.fb_sig_api_key),"_top");
} else {
// 沒取得資料時
session.login();
btnLogin.visible = true;
}
}

private function onSessionConnect(event:FacebookEvent):void {
// 呼叫取得朋友資料
var call:FacebookCall = facebook.post( new GetFriends() );
// 取得朋友資料之後,執行 onGetFriendsComplete
call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsComplete);
}

private function onGetFriendsComplete(event:FacebookEvent):void {
// 呼叫時用 GetFriends,取得時用 GetFriendsData
var friendsData:GetFriendsData = event.data as GetFriendsData;
var friends:FacebookUserCollection = friendsData.friends;
// 將朋友的 ID 放入 uids 陣列
var uids:Array = [];
for(var i:int=0; i< friends.length; i++) {
var f:FacebookUser = friends.getItemAt(i) as FacebookUser;
uids.push(f.uid);
}
// GetFriends 只能取得朋友的 uid,必須呼叫 GetInfo 才能取得朋友資料
var call:FacebookCall = facebook.post(
// 設定要取得的資料項
new GetInfo(uids, ["name", "pic_square"])
);
call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsAttr);
}

private function onGetFriendsAttr(event:FacebookEvent):void {
// 呼叫時用 GetInfo,取得時用 GetInfoData
var getInfoData:GetInfoData = event.data as GetInfoData;
var userCollection:FacebookUserCollection = getInfoData.userCollection;
dictionary = new Dictionary();
// 一一取出朋友資料
for(var i:int=0; i<userCollection.length; i++) {
var usr:FacebookUser = userCollection.getItemAt(i) as FacebookUser;
var img:Image = new Image();
// 沒有大頭貼時用預設的圖
if(! usr.pic_square) {
img.source = 'http://static.ak.fbcdn.net/pics/q_silhouette.gif';
} else {
img.source = usr.pic_square;
}
img.toolTip = usr.name;
img.buttonMode = true;
// 使用字典以方便用物件取得字串
dictionary[img] = usr.uid;
img.addEventListener(MouseEvent.CLICK,onImageClick);
tilesPic.addElement( img );
}
}
private function onImageClick(event:MouseEvent):void {
var img:Image = event.currentTarget as Image;
navigateToURL(new URLRequest("http://www.facebook.com/profile.php?id="+dictionary[img]),"_blank");
}
]]>
</fx:Script>

<s:Button x="10" y="10" label="點按登入 Facebook" id="btnLogin"
visible="false" click="session.validateLogin()"/>
<s:Scroller x="30" y="30" width="800" height="450">
<s:TileGroup width="100%" height="100%" clipAndEnableScrolling="true" id="tilesPic">
</s:TileGroup>
</s:Scroller>

</s:Application>

Step 6: 發佈,上傳至「http://www.riarock.net/fbapps/fbastutorial/」測試。

Step 7: 範例在「http://apps.facebook.com/fbastutorial/」,於 swf 上按右鍵選「View Source」就可以看到原始檔,並下載專案檔了。

新作:FLASH+PHP資料庫網站開發設計

個人新作「FLASH+PHP資料庫網站開發設計」出版了,感謝舊雨新知的支持!

個人新作「FLASH+PHP資料庫網站開發設計」出版
試讀「第6章」18頁

出版公司書籍介紹
博客來
金石堂
建議:老話一句,一本書是無法滿足所有人需求的,請先到實體書店翻閱,符合需求再購買!

2010-03-13

AMFPHP 1.9

AMFPHP 終於在 2010/02/02 釋出 1.9 正式版, 原本以為開發主角換人後, 專案應該會掛掉, 顯然 AMFPHP 還活著 :P。
1.9 正式版的 gateway.php 中, 明顯不同在 PRODUCTION_SERVER 預設為 true, beta 版預設為 false。
PRODUCTION_SERVER 設為 true 時, 在 Flash IDE 測試, 會發生 NetConnection.Call.BadVersion 的錯誤, 但是發佈後卻又正常。應該是 Debug 版 Flash player 造成的問題。
所以使用 Flash IDE 搭 AMFPHP 時, PRODUCTION_SERVER 請設為 false。

2010-02-22

Video 保護

目前 FLV 的保護主要由 FMS 下手, 但是用 FMS 有諸多缺點。
Adobe AIR 2 將提供 DRM 的功能, 但是需搭配 Flash Access 2 使用。依據之前的經驗, Flash Access 2 應該不會便宜到哪去, 而且 Video 的傳輸頻寬也是問題。

在簡單保護方面(防外行), NetConnection 和 NetStream 實在包的太「好」了, 沒有下手的空隙。如果使用 AIR 2, 可以用 ServerSocket 弄個 HTTP Server 來傳 Video 資料。這個時候, Video 就可以編碼(隨君高興)存成檔案, 在 Server 讀資料送出時, 可以自行解碼, 再送給 Client。這樣做的缺點是效能會略差, 而且要想辦法藏好解碼的 KEY(可以透過登入機制再拐個彎, 有心要找的人還是可以找到)。

FB 留言