串流媒體

所謂串流式通道,其實就是在使用者端的電腦上創造一個緩衝區,在播放前預先下載一段資料作為緩衝,當網路實際連線速度小於播放所耗用資料的速度時,播放程式就會取用這一小段緩衝區內的資料,避免播放中斷,如此將使得播放品質得以維持。

採用串流式通道最有名的播放程式之一就是RealNetworks 的RealPlayer,現在的版本已經是8.0了。最早期的RealPlayer叫做RealAudio,公司名稱尚未改為RealNetworks的 Progressive Network,而RealAudio Player當時還只能撥放音樂呢!1995年Xing這家公司所推出的Streamworks才是第一個採用串流式通道的影音播放程式。不過隨著市場的 變化,RealNetworks因其穩定品質及使用方便的特色,逐漸地統一了串流播放程式的市場, 順勢購併了Xing,這家在軟體MPEG解碼程式曾經稱霸一方的公司也就煙消雲散了,也因為併購了Xing,RealNetwork才能在後來的 RealVideo大放異彩,且在後起之秀Microsoft提供免費程式的壓力下,至今還能屹立不搖。

RealNetworks成功的一大原因是它採用新一代的串流式通道—RTSP(Real-Time Streaming Protocol),使用專屬的串流伺服器RealServer 來替代使用HTTP(HyperText Transfer Protol)通道的Web Server,因此,在播送影音內容給使用者時,能夠取得比Web Server來得快又穩定的效果。另外,由於串流格式的檔案播放後不會在使用者端留下播過的資料,所以被音樂業者認為是比MP3安全,且較有著作權保護的音樂格式。當時由於RealAudio的盛行,帶來一陣線上音樂流行的風潮,許多音樂網站如雨後春筍般興起。

資料來源:串流媒體-線上影音的大時代

串流媒體檔案編碼比較

對串流媒體檔案進行編碼

我們強烈建議對檔案進行編碼動作,但是在一些高品質串流媒體播放場合裡面,對檔案進行編碼則並非絕對必要。編碼動作指的 是將原始的聲音或者影片檔案進行壓縮,這項程序能夠縮小檔案尺寸,以利於更有效率的串流播放效果。編碼過程中需要使用特殊的編碼方式(Codecs, compression algorithms 亦即檔案壓縮的演算法)。不同的編碼方式對於不同的頻寬條件有各自的最佳化方式。 RealPlayer 以及 QuickTime Player 兩者都可以直接播放許多不同格式的未壓縮媒體檔案,但是請銘記在心,絕大多數未經壓縮的媒體檔案尺寸都非常大,串流播放的下載過程將會變得非常緩慢,令人 難以忍受。

檔案編碼過程相當容易,因為有編碼軟體會自動替你進行檔案編碼動作,但是這個編碼程序需要時間,所需時間長短則視你的電腦配備而定。有些較長的音效或者影片檔案往往需要一整晚的時間才能編碼完成。

RealNetworks 公司免費提供了基本的編碼軟體(連同編碼方式一起提供)讓大家下載使用,而且事實上光是這套軟體便已足敷所需了。市面上也有更高階的編碼軟體,例如 Terran 公司的 Media Cleaner Pro 便是一例。高階編碼軟體使用了特殊的編碼方式,宣稱能夠製作出極佳的聲音訊號,不過事實上其中的差異性可能只有專業的音響愛好者才查覺得出來。然而這些高 階編碼程式可以清除聲音訊號中的背景雜訊(產生的效果不錯,而且容易察覺),並且還提供了批次處理功能,對於大量製作以及長時間徹夜編碼程序相當有幫助。

一些網站提供了線上編碼服務,例如 Loudeye 網站便提供大量檔案編碼服務,讓一般使用者不需要長時間佔用電腦資源進行編碼工作。

RealNetworks 編碼

你可以從 RealNetworks 公司網站上免費下載 RealProducer 這套軟體來進行檔案編碼工作。如果需要進階功能的話,也可以付費購買 RealProducer Plus(美金 $149 元)或者 RealProducer Pro(美金 $399 元)。不過如果只需要基本功能的話,就不需要去另外花這筆錢了。RealMedia 編碼方式能夠很有效地針對不同頻寬需求對檔案進行編碼。此外為了免除使用者為不同頻寬分別進行編碼程序的麻煩,RealProducer 使用了 SureStream 技術,它能夠搭配使用不同類型的編碼方式來針對不同場合的串流媒體需求進行適當的編碼程序。有了 SureStream 技術,RealProducer 軟體便可能為 28k 與 56k 數據機選用相同的編碼方式,而為 ISDN 線路使用者選用另一種不同的編碼方式。使用者只需要指定內容播放的場合與類型(聲音檔案,影像片段檔案或者其他),SureStream 便會自動選擇適當的編碼方式來為不同的頻寬條件進行編碼,使用者便不需要自己針對不同頻寬進行多次編碼了。

QuickTime 編碼

免費的 QuickTime Player 播放程式僅提供檔案播放功能。如果需要檔案製作功能,你可以付費 $29 美元,在蘋果公司網站上購買 QuickTime Pro 軟體。這套軟體除了播放功能以外,也可以用來將檔案進行編碼,並且轉換成 QuickTime 格式。QuickTime 提供了智慧串流功能,類似於 RealNetwork 公司的 SureStream 技術,然而不同的是在 QuickTime Pro 裡面你必須為不同的場合分別使用不同的編碼方式產生各自的影片檔案,然後再使用一項名為 MakeRefMovie 的工具程式產生一個檔案,用來參照到先前製作好的不同影片檔案。QuickTime Pro 的自動化程度並不及於 SureStream 技術。如果需要更多 QuickTime 相關資訊,可以參考 Peachpit Press 公司出版的《QuickTime Pro 4 快速視覺入門導引》(QuickTime Pro 4 for Macintosh and Windows: Visual Quickstart Guide),作者是 Judith Stern 與 Robert Lettieri。

資料來源:對串流媒體檔案進行編碼

IMS

IP多媒體子系統(IP Multimedia Subsystem;IMS)產品組合,使服務供應商更易提供個人化多媒體服務,以連結無線、有線與有線電視寬頻服務的各種裝置,此IMS整合服務網路升級產品預計於2006下半年上市。

北電表示,IMS解決方案是一重視存取(access-aware),並支援3GPP(IMS)、3GPP2(MMD)、Packet Cable 2.0與TISPAN標準。此外,北電IMS整合服務網路採用北電無線行動閘道器Wireless Mobility Gateway 6000 (WMG 6000)與多媒體應用伺服器(AS 5200),兩者皆以北電IMS標準為核心。而WMG 6000符合新興IMS語音呼叫持續性(Voice Call Continuity)標準,可使服務供應商連結3G無線網路與無線公眾(WLAN)網路,為消費者及企業用戶提供無縫隙與安全的通訊體驗。

IMS整合服務網路提供包括來電顯示、來電等候、來電保留、快速撥號、來電過濾、簡訊與路徑選擇、即時訊息(IM)先進電話功能。

資料來源:北電IMS強化行動性與寬頻支援

撰寫網頁程式注意事項

這篇寫的不錯 將一些寫網頁程式該注意的事項都列出了

利用明確的指定方式來取得頁面傳來的變數

不管是 GET 或 POST 的參數,我會希望明確地指定它的型態,例如 id 應該是整數, content 是文字等。而且我也常常發現有人把接到這些變數後,沒有事先做處理就直接串到程式中,這是非常危險的一件事情!

最明顯的例子就是 SQL Injection 了,我想這應該不用多說了。總而言之,不要過份相信用戶端傳來的資訊,把它轉換成你能掌握的型態再用吧。

資料庫的連結每個頁面只作一次

資料庫連結是網站頁面常做的事情,但是儘可能不要讓一個頁面產生太多的資料庫連結。我們可以利用 Singleton 模式來取得資料庫連結物件,這樣可以確保程式裡只會用到一個資料庫連結;當然需要連結不同資料庫的話就另當別論。

所以我們要確定資料庫會在頁面初始化時連結,頁面結束時關閉。這樣有單一的入口與出口,程式也就不容易出現奇怪的問題。

相同的邏輯不要寫兩遍以上

如果發現有兩支程式會用到相同的程式邏輯時,不要猶豫,把它抽出來變成類別或函式 (最好是類別,原因在下一則) 。因為如果哪一天需要更新程式的邏輯時,你只需要更改一支程式即可。對健忘的人來說,這點尤其重要。

我就遇過有人把產生選單的邏輯重複寫在十多支程式裡,結果有次客戶要求要修正其中一個地方,可憐的維護人員 (就是我啦) 就得一支一支地去翻出來改。

利用物件來管理錯誤

我這裡指的錯誤是任何預期中的狀況,也就是你不希望使用者操作的方式,例如編號不存在或是檔案大小超過限制等。

當錯誤發生時,不要立刻結束,應該利用錯誤上升機制來讓通知上一層的程式,最後再由頁面控制程式來決定要如何處理錯誤。我常常會遇到有人在函式裡利用 exit 離開程式,但是這時候頁面的資料庫或其他物件等等都還沒釋放掉;雖然程式平台可能會幫你做,但那總是很難預期。

所以我建議不要使用函式,而改為使用物件的方法,然後利用類似 PEAR::isError() 來判斷是否執行成功;如果失敗的話就把錯誤往上丟,直到頁面能夠控制為止。

該釋放的要記得釋放

不管是物件還是資料庫,都應該在頁面結束前將它們銷毀或關閉,而不要過於依賴程式執行平台。網頁程式是很多人會同時存取的,如果沒有正確地將資源即時釋放掉的話,久而久之就會造成系統效能上的不穩定。

而釋放的動作要什麼時候做呢?記住一句話:誰開的就誰負責關。例如上面頁面控制程式開啟資料庫連結,那就在頁面控制程式的最後把資料庫連結關閉。類 別建構函式產生的物件,就在類別解構程式裡銷毀。函式開的頭,當然就在函式尾收掉;不過有個例外,那就是這個函式如果本身就是要回傳產生的物件時,那就不 能把它給釋放囉,而是要改為呼叫這個函式的程式來釋放。

利用樣版技術

樣版是用來分離程式邏輯與視覺頁面的,也常常有人用 MVC 這個模式來稱呼它。然而兩者分離除了不相互干擾外,其實還有一個好處:那就是程式可以在錯誤發生後,決定要顯示的結果。就像上面提到的錯誤管理,當我們在 頁面控制程式取得錯誤訊息時,我們就可以而用置換樣版來避免掉頁面的錯誤,或者是導向別的處理程式。

這點我覺得 PHP 的 Smarty 就考慮得很好,因為它是後期頁面綁定 (Binding) ,而不會像傳統樣版引擎在前期就把頁面拉進程式處理,導致錯誤發生時徒然浪費處理時間 (當然要看怎麼設計的) 。

徹底瞭解開發環境的性質

網頁程式和一般應用程式 (例如視窗應用程式) 在本質上是有差異的,這些差異不僅是在操作上,就連執行的過程都非常的不一樣。雖然現在有 AJAX 或其他技術可以縮小彼此的差距,但是它還是建構在 HTTP 這個無狀態協定之上。身為網站程式開發人員,其實應該要瞭解這些基礎,而不要只熟稔某些已經被包裝過的技術就顯得自得意滿。

最簡單的就是伺服端程式與用戶端程式之間的溝通,例如 PHP 和 JavaScript 。我常常在網路上看見有人問道:要如何讓 PHP 和 JavaScript 之間的變數互通?如果瞭解 HTTP 執行的過程,那麼你就會自己發現這些問題的答案。

資料來源: 網站製作學習誌

Oracle資料如何匯出成文字檔

# sqlplus username/password@TNSName   (1)
SQL> set pagesize 50000   (2)
SQL> set linesize 1000   (3)
SQL> spool member.txt   (4)
SQL> select id ||’[,]‘|| name ||’[,]‘|| age from member;   (5)
SQL> spool off   (6)
說明:
(1) 進入sqlplus。
(4) 將螢幕的內容輸出到member.txt。
(6) 結束輸出螢幕資料到檔案。
(2) 將螢幕長度設為每頁50000行,如果資料超過螢幕,輸出到檔案時,系統會在每頁開頭加入header,所以把螢幕每頁的長度設到超過資料筆數。
(3) 將螢幕寬度設為每行1000個字元,如果資料每行超過螢幕寬度,會自動折行,輸出到檔案就不是一行一筆資料,所以將每行的長度加大。
(5) 從table member抓出欄位id、name、age的資料,各欄位資料以[,]分開,欄位的分隔符號不限一個字元。

資料來源 : 史帝芬心得筆記

Oracle資料如何匯出成文字檔

# sqlplus username/password@TNSName   (1)
SQL> set pagesize 50000   (2)
SQL> set linesize 1000   (3)
SQL> spool member.txt   (4)
SQL> select id ||’[,]‘|| name ||’[,]‘|| age from member;   (5)
SQL> spool off   (6)
說明:
(1) 進入sqlplus。
(4) 將螢幕的內容輸出到member.txt。
(6) 結束輸出螢幕資料到檔案。
(2) 將螢幕長度設為每頁50000行,如果資料超過螢幕,輸出到檔案時,系統會在每頁開頭加入header,所以把螢幕每頁的長度設到超過資料筆數。
(3) 將螢幕寬度設為每行1000個字元,如果資料每行超過螢幕寬度,會自動折行,輸出到檔案就不是一行一筆資料,所以將每行的長度加大。
(5) 從table member抓出欄位id、name、age的資料,各欄位資料以[,]分開,欄位的分隔符號不限一個字元。

資料來源 : 史帝芬心得筆記

Apache 啟動失敗

# /etc/init.d/httpd start
啟動 httpd:httpd: Could not determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName
[失敗]

// 查詢error_log (/var/log/httpd/error_log),出現下列錯誤
mod_unique_id: unable to find IPv4 address of “h39-203-70-33.askey.com.tw”

//解決方法 加入host
# vi /etc/hosts
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
203.70.33.39 h39-203-70-33.askey.com.tw localhost