2009年12月15日

Gentoo Linux 與 Windows 7 安裝心得

這幾天一直在安裝 Windows 7 和 Gentoo Linux 10.1 之間奮戰,浪費了不少時間踩了不少的地雷,恰好可作為部落格的文章以為紀念... XD

Dual Boot

首先因為 Windows 7 在安裝時會在硬碟中產生兩個 Primary Partition ,這讓我在評估是否雙系統共存時有了很慎重的考慮,並為此選擇在 VirtualBox 3.1 中先行試驗確認。不過,經過多次測試總無法經 Grub 對 Windows 7 開機,在最後關頭時決定直接上機測試成功時,才驚覺整整浪費了 2 個工作天在無任何產值的測試作業中... (嘆)

另外對於 Dual Boot 這件事,Gentoo 其實沒有先 Windows 再 Linux 之類的條款,因為它不會幫你建立預設的開機環境設定。Grub 裝在 MBR 也無所謂,反正 Windows 7 開機是從第一個 Partition 中的特定檔案啟動的。最後我還放棄了 SWAP 分割區的設置,將 4 個 Primary Partition 平均分給兩個作業系統,Gentoo 就一個 / partition 及一個 /home partition 。

發行套件的選擇

基本上這是因為安裝過程不太順利下,為什麼還選擇 Gentoo 的原因說明

Gentoo 之所以在某些群體中受到歡迎經常受到誤解,認為這些愛用者是因為迷信自行編譯所帶來的無上效能。其實在目前的中、高階 CPU 及便宜的記憶體市場下,自行編譯所帶來的效能改善情形非常有限,很多人應該也不是那麼心甘情願的願意浪費 1 ~ 2 天的時間進行系統編譯的工作(尤其 Windows 7 安裝一遍只要 20 分鐘),只因為目前還沒有看到更有彈性的軟體套件管理機制,導致短時間內無法轉投入另套發行套件。像格揆本人我就一直想要知道 Arch Linux 究竟有沒有類似 Portage USE 選擇的機制,只是說從所有的範例中似乎嗅不出類似機制的可能性,我也只好繼續使用 Gentoo 系統了!

基楚系統建置

在進行 Gentoo 基礎系統建置時切記不要過早投入 Portage Overlay 的設定,雜亂的套件相依設定是造成系統編不出來的主要原因,尤其在桌面管理系統上影鄉尤為深遠。

另外為了簡化系統的複雜度,一開始也不宜過早加入 ACCEPT_KEYWORDS 的設定,儘量先以系統預設的、穩定的套件版本為基礎完成配置後再加以強化為宜。

2009年11月16日

ExtJS 筆記 - EXTJS 的事件處理函式

jQuery 不同,ExtJS 的事件處理函式略顯複雜了些!原因在於 jQuery 的事件綁定機制永遠只作用於 jQuery 物件,但 ExtJS 的事件綁定機制卻必須先確定事件綁定對象的種類。

在 ExtJS 中有兩種類型的 Ext 物件可以進行事件綁定,一種是 Ext.Component,另一種是 Ext.Element。雖然它們都會對應到頁面上的 HTML Element ,但實際上來看 Ext.Component 算是以 Ext.Element 為基礎進行擴充的衍生物件,常因為特別需要而自行提供許多自定的事件,例如 Ext.form.Checkbox 這個 Ext.Component 物件會額外提供 check 事件,當然你可以把這個 check 事件當成原本 click 事件的再包裝。

所以說只要弄清楚事件綁定的對象後也就能夠確定所使用的事件處理函式的參數型態,對 Ext.Element 而言它的事件處理函式參數格式為:
/* 此的處 element 是一個 HTML Element ,也就是原本的 HTML DOM 物件 */
function eventHandler( event, element, object ) { }
但若是 Ext.Component 的話它的事件處理函式則為:
function eventHandler( component [, value/state ] ) { }
其實寫 ExtJS 應用系統很容易遇到事件處理函式未能如預期反應的情況,這是因為搞錯了事件作用的對象以及事件處理函式的參數匹配不正確所導致,要不是因為此次的系統開發時用到了 Ext.form.Checkbox 這個元素,也許格揆我還沒發現原來 ExtJS 的事件模型有分成兩種情形,而大致搜尋了一下也沒有啥文章特別提到這個明明就在 API 文件中,但工程師顯然不會特別注意到的情形。

但我們該怎麼取得 Ext.ComponentExt.Element 物件呢?只要記住除了 Ext.getCmp() 外,其他的 DomQuery 函式都只會傳回 Ext.ElementExt.CompositeElement(可把它當成多個 Ext.Element 物件的集合) 物件。

以下的範例可看出 Ext.ComponentExt.Element/Ext.CompositeElement 在注冊事件處理函式時的差異:
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="http://www.extjs.com/deploy/dev/resources/css/ext-all.css" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript" src="http://www.extjs.com/deploy/dev/adapter/jquery/ext-jquery-adapter.js"></script>
        <script type="text/javascript" src="http://www.extjs.com/deploy/dev/ext-all.js"></script>
        <script text="text/javascript">
            function init() {
                var viewport = new Ext.Viewport({
                    layout: 'form'
                    ,defaults: {
                        xtype: 'checkbox'
                        ,labelWidth: 70
                        ,labelAlign: 'right'
                    }
                    ,items: [
                        {
                            fieldLabel: '選項一'
                            ,id: 'chbox1'
                        }
                        ,{
                            fieldLabel: '選項二'
                            ,id: 'chbox2'
                        }
                        ,{
                            fieldLabel: '按鈕一'
                            ,id: 'btn1'
                            ,xtype: 'button'
                            ,text: '按鈕一'
                        }
                    ]
                });
  
                // 對 Ext.Component:chbox1 物件注冊 check 事件處理函式
                Ext.getCmp( 'chbox1' ).on( 'check', function ( chbox, checked ) {
                    alert( chbox.getId() + ' is ' + checked );
                });
  
                // 對所有的 Ext.CompositeElement:Checkbox 物件注冊 click 事件處理函式
                // 實際上有兩個物件被注冊了事件處理函式
                // 如果想在 Ext.Element 物件上綁定 check 事件的話,它是不會生效也不會有錯誤的喔!
                Ext.select( 'input[type=checkbox]' ).on( 'click', function( evt, el ) {
                    Ext.Msg.alert( 'Event Tester', el.id + ' is ' + el.checked );
                });

                // 對 Ext.Component:btn1 物件注冊 click 事件處理函式  
                Ext.getCmp( 'btn1' ).on( 'click', function( button ) {
                    alert( button.getId() + ' clicked' );
                });
  
                // 對所有的 Ext.CompositeElement:button 物件注冊 click 事件處理函式
                // 實際上有一個物件被注冊了事件處理函式
                Ext.select( 'button' ).on( 'click', function( evt, el ) {
                    Ext.Msg.alert( 'Event Tester', el.id );
                });
 
                return viewport;
            }
     
            $( document ).ready( init );
        </script>
    </head>
    <body>
    
    </body>
</html>

參考資訊:

2009年10月26日

閃擊點行動 - 龍之堀起 ( Operation Flashpoint - Dragon Rising )

閃擊點行動 - 龍之堀起 ( Operation Flashpoint - Dragon Rising ) 是 CodeMasters 公司前陣子新堆出的遊戲,同時支援 PC / XBox 360 / PS3 三平台。

總括而言,這是一套除了畫面遠勝 2001 年首次推出的 閃擊點行動 - 冷戰危機 外其他部份都完敗的失敗作,甚至嚴格而言本遊戲也不算是 冷戰危機 的續作,至少從遊戲命名中是完全看不到 2 這個字眼的。

簡單條列個人覺得這套遊戲和 冷戰危機 相比失敗的地方:
  1. 從班戰鬥縮水成小隊戰鬥:沒錯,這是個精英小隊 ,但是一次 12 個人可以有更多的戰術配置。沒記錯的話在 冷戰危機 中有一個關卡還是一整個排去打敵人的設定呢!這項改變大致上可以猜到是因為 PS3 / XBox 360 操控手把所做的限制。
  2. 戰術指令缺乏細節設定:記得 冷戰危機 中可以命令隊友去撿拾槍枝和補充彈藥,也可以把整個班透過撿拾殂擊槍的命令而變成殂擊班。本遊戲中似乎電腦隊員都沒有缺彈危機?把戰術指令大幅刪減的原因大概也是為了配合遊戲機的操控吧!對了,我曾對隊員下達接敵指定對象的命令,但是... 他們都不鳥我... (怒)
  3. 可遠觀而不可褻玩焉的載具:在 冷戰危機 及其資料片中有一大堆的載具(飛機、輪型車輛、民車、以及裝甲車等)可以操作,但到了 龍之堀起 時真的開過的只剩下悍馬車和最後關卡的直昇機而以。不過看電玩快打介紹的影片中有戰鬥直升機可以操作,但我的軍旅生涯回憶錄中只有被戰鬥直升機追殺的慘烈而以.... (嘆)
  4. 過關條件的限縮: 冷戰危機 最為人所贊頌的是他無特定規則的過關選擇,在 冷戰危機 中除了從外圍一路殺進敵營外,還可以先溜進敵營偷一台裝甲車或雌鹿攻擊機後再殺出來,這是 龍之堀起 總是走進去敵營又一路打出來的固定模式難以超越的。
  5. 隊員養成:在 冷戰危機 是可以透過經驗值累積以提昇班兵的能力的,但是 龍之堀起 中每次帶的隊員都一定不同,隊員陣亡也只需等到檢查點後就會重新復活,當然也就少了經驗值作為隊員養成的依據了。
  6. 關卡的變化性不足:在 冷戰危機 中有防禦、有攻擊、有步行機動、有車輛接送、也有裝甲車專屬關卡,還有直昇機攻擊,而 龍之堀起 則是突擊後防禦為主。其中雖然有一關是監控解放軍將領 - 韓將軍逛大街的特殊關卡,但最後用 JDAM 轟掉房子的設定其實覺得挺空虛的... (默)
  7. 關卡過短,故事性不足:記得 冷戰危機 約有 20 關... 吧,龍之堀起 只有 10 關的樣子,搞的玩家還沒融入故事情節時遊戲就結束了.... -.-
認為 龍之堀起 不如原本 冷戰危機 的原因大致如上,如果不是 CodeMasters 和原開發 冷戰危機 的波西米亞工作室鬧僵的話,也許真正的 Operation Flashpoint 2 早就推出了。

2009年10月19日

S60 手機平台與 Google Service

註:Mobile01 新版的 Symbian^3 系統如何設定 Google Service 同步的說明,見N8同步於Google服務(聯絡人、行事曆) + N8社群介紹

老實說,從 因故 購入 Nokia 5800XM 這半年以來,我一直沒有一次就完成 Nokia 智慧型手機(S60 作業系統)在商務需求上的設定。今次經由一再的重試與手機硬格後,似乎有了一點點可以依據的脈胳可循。

商務需求包括那些呢?我想至少會包含通訊錄、行事曆、還有 EMAIL 三者間與原作業平台的相互同步,除了一般企業內部常見的 Microsoft Exchange Server 外,一般個人所能接觸到可同時提供這些服務的公司顯然以 Google 最廣為人知(其實 Nokia 自己也有提供一個整合性服務叫 Ovi ,除包含前述服務還有些其他的)。本文的主要目標是設法將 Google 上的資料與 S60v3/v5 手機相結合。

說到 Google 採用 Microsoft 的 ActiveSync 技術協定的目的就是希望能一次滿足前述三個願望,可惜事與願違,Google 目前在 S60 平台上確實還無法達成 EMAIL 同步,因此整個作業要分成兩部份來進行:通訊錄與行事曆可以合併處理、至於 EMAIL 則需另尋他法。

Push EMAIL

說 EMAIL 要另尋他法其實也不是說需要多複雜的設定,只要透過第三方服務即可達成,這服務就是 Nokia Messaging

首先,把手機扔一邊吧!如果你一心想找 Nokia Messaging 的用戶端軟體自行安裝的話,保證事倍功不成。

如果是第一次使用 Nokia Messaging 服務時必須先建立一個 Nokia Messaging 帳號,但這帳號並不需重新選擇 ID/PWD ,實際要做的只是選擇一個需要被 Push 到手機的現有 EMAIL 帳號即可。Nokia Messaging 支援 POP3/IMAP 郵件協定,也支援包括 Yahoo! Mail、Google Mail、Windows Live Hotmail、Ovi Mail 以及郵件代管類型的 Google Apps、Yahoo! Small Business 等郵件資源,總而言之挑一個出來當主信箱帳號即可。另外 Nokia Messaging 可以支援最多 10 個郵件的推播服務,可以依需要自行增減信箱個數。

Nokia Messaging 主要畫面當然如果不放心把 EMAIL 交給 Nokia 的話,可以考慮只設定那些非日常使用的次要信箱即可。一般來說次要信箱通常很少主動去開啟的,讓 Nokia Messaging 協助追蹤這些信箱似乎也不錯!

決定好主要信箱後即可 Sign Up 進行申請程序。在申請的過程中會發送簡訊到手機上以便開始下載及安裝 Nokia Messaging 用戶端軟體。這程序很重要,整個啟用 Nokia Messaging 用戶端軟體的相關設定都包含在這則簡訊中,當你讀取這則簡訊時會觸發軟體下載、安裝然後手機自動重開機的流程。這過程需要一點時間,也許可以趁這時間回到 Nokia Messaging 官網中把需要 Push 的各郵件信箱設一設。

當手機重新啟動後有機會看到一個標為『簡訊佈建』的畫面,這時手機會進行一些內部設定,完成後即可看到 Nokia Messaging 手機軟體的登入畫面(請參考 Nokia的Push mail--Nokia Messaging 一文中的第二張圖),輸入前述申請作業中設定的主信箱帳號的密碼即可登入。

Nokia的Push mail--Nokia Messaging 一文是以 E71 做說明,如果是 S60v5 平台的話則主要畫面如右圖所示,可以選擇要看那個信箱,也可以另外新增其他信箱。

Reinstall Nokia Messaging另外,如果因為某些因素必須重新安裝 Nokia Messaging 手機端軟體時也請切記一定要從 Nokia Messaging 網站上進行,只需在登入後點選頁面右方的 Install now 即可。如果是自行由手機內安裝先前下載的 .sisx 檔的話是不會與 Nokia Messaging 服務有任何關連的,這個時候對 Nokia Messaging 手機軟體的各項操作都會被寫進手機訊息中心內的電子郵件項目中,在 Nokia 5800XM 上會發生一件很糟糕的情形 - 這些 EMAIL 帳號設定無法刪除...

以上是個人選用為 S60 手機與 EMail 整合的一種方式,目前 Nokia Messaging 服務仍然免費但後續可能會改為收費服務,此點請特別注意。(別擔心,Google Sync 屆時就可以支援 Symbian 平台上的 EMAIL 同步了.... 我猜的... )

※ 2010-01-17: 目前 Nokia Messaging 10.1 版用戶端程序已經可以自行重新建立相關設定了!
  1. 在 Nokia Messaging 10.1 版直接點選電子郵件設定時會開啟新的(大概吧)設定頁面,按下開始後即可進行設定。
  2. 接下來這頁是選擇郵件種類,不過格揆懷疑這是為了方便給新使用者所提供的選項。像格揆這種早就有申請 Nokia Messaging 的使用者可以直接選其他即可。
  3. 然後分別輸入原先 Nokia Messaging 服務中指定的郵件帳號及密碼後即進行驗證。
  4. 如果在進行帳號匹配時未插入 SIM 卡的話,Nokia Messaging 會要求手動輸入電話號碼以便和原登錄的資料進行驗證,是否有實際用途則不確定(誰沒事常換號呢?)
  5. 一旦帳號密碼匹配成功後即可看到 歡迎再次使用 的訊息,同時也告知還要再輸入一次 Nokia 訊息密碼。
  6. Nokia 訊息密碼就是 Nokia Messaging 服務的密碼,不太瞭解為什麼還要再輸入一次?輸入後即可看到熟悉的 Nokia Messaging 畫面,原先的設定也會同時自動下載。

※其實我是想反正 Nokia 開始收費時我就跳到 Android 去了,沒差啦!

行事曆、通訊錄同步

再來就是如何同步行事曆和通訊錄,大致上請先參考 Google Sync 的說明。至於格揆則需要花點時間擷圖... 擷圖的目標放在如何同步 Google Apps 上的個人行事曆與通訊錄。請大家等個一、兩天吧... :p
先期準備 - Google Apps 管理設定
如果需要同步的通訊錄、行事曆來源是 Google Apps 服務,那麼必須先確定 Google Apps Manager 已同意開啟手機行動 Google Sync 支援,詳見 Enable Google Sync via ActiveSync 內說明。
更新 Mail for Exchange
Mail for Exchange 必須要 2.0(9).158 以上版本才能支援,Symbian 手機可以透過內建的更新機制進行軟體更新,在更新的過程中會有警告訊息提醒一旦使用 Mail for Exchange 後就不可以再使用其他同步軟體。
Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定

雖然也可以從 Mail for Exchange 官網自行下載手機端程式,不過似乎還是比透過手機更新的版本來的舊。
Mail for Exchange 同步設定
執行 Mail for Exchange(以下簡稱 MfE)後即可進行同步設定,併隨 MfE 安裝的公司目錄工具是用來查詢 Microsoft Exchange Server 上的通訊錄用的,因為 Google Sync 使用 ActiveSync 協定進行同步作業,所以日後可以使用這個工具查詢 Google 通訊錄上的內容。
Mail for Exchange 安裝/設定

第一次執行 MfE 時會因為沒有任何同步設定而詢問是否建立操作模式,反正只能選擇不然就沒得用。
Mail for Exchange 安裝/設定

首先填入 EMAIL 基本資訊,不管是 GMail 還是 Google Apps 都請在電子郵件位址使者用名稱部份填入完整的 EMAIL 信箱全名。至於網域部份則因為軟體限制直接填入 google 即可,存取點則通常設為網際網路,如果有申請 mCool 49 之類的 WAP 上網吃到飽的則可以選擇 WAP 。
Mail for Exchange 安裝/設定

輸入完 EMAIL 基本資訊無誤後即可按下確定鈕,MfE 會嘗試擷取郵件伺服器的設定。如果是在一般企業內部的話應該可以自動捉取到 Exchange Server 的相關資訊,但 Google 的手機服務似乎是透過另一個獨立主機做橋接的,因此 MfE 會出現擷取失敗的訊息並要求手動輸入 Exchange Server 的相關資訊。
Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定

在 MfE 中總共有八個設定頁籤分別對應到連線認證同步排程行事曆工作通訊錄郵件不在辦公室,不過一開始第八個設定頁是看不到的。
2009/10/20

連線設定:主要就是指定 Exchange 伺服器的名稱,請填入 m.google.com 即可。
Mail for Exchange 安裝/設定

認證:先前輸入的完整 EMAIL 全名會自動帶入這個設定頁中,完全不用更改。
2009/10/20

同步排程:此頁籤用於設定同步的頻率,預設為尖峰時段永遠連線,離峰時段則每 30 分鐘連線同步乙次。基本上因為電信訊號並不穩定且人員也不一定都在 WiFi 訊號範圍內之故,把同步頻率改為定時更新應該比較適合。
Mail for Exchange 安裝/設定

行事曆:Google Sync 目前可以支援行事曆同步,原則上雖然可以保留手機上即有的行事曆內容,但這麼做很容易把行事曆搞亂(N82 時代同時同步 Outlook 及 Google Calendar 的心得,每重建乙次手機設定就會多一倍的行事曆項目)。所以這裡通常會選擇先清空手機上的行事曆資料。
Mail for Exchange 安裝/設定

工作:待辦事目前尚不支援同步作業,請選擇不同步。
Mail for Exchange 安裝/設定

通訊錄:一樣建議先刪除手機上的內容後再進行同步。如果手機上的資料完全沒有和 GMail / Google Apps 上重覆的話可以考慮保留以便傳回 GMail / Google Apps 上。
Mail for Exchange 安裝/設定

郵件:目前 Google 仍不提供在 Symbian 支援郵件同步,而且前面不是已經使用 Nokia Messaging 提供 Push Mail 服務了嗎?
Mail for Exchange 安裝/設定

不在辦公室:這必須先能連上 Exchange 伺服器後才能檢視,目前 Google 也不支援。

完成各頁籤的設定且確認無誤後就可以按下 選項儲存 將設定保存下來,之後回到首頁時會看到 MfE 已開始嘗試連線進行同步了!
Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定

當你專心的注意畫面上的訊息時,會發現目前狀態這項訊息會依序改變: 連線中已連線閒置,那麼結果究竟成功了沒?經由檢視記錄的功能應該會看到這個畫面:
Mail for Exchange 安裝/設定
同步作業
什麼?搞半天竟然沒成功?嗯,稍安勿噪!之前格揆都只進行到這個步驟就放棄了,所以不知原來事有蹊蹺。其實啊,真正的同步作業現在才要開始呢!不如,再試著同步一下看看?
Mail for Exchange 安裝/設定

咦?它顯示出正在同步行事曆耶!趕快檢查記錄也確認有 5 筆行事曆記錄被匯入。
Mail for Exchange 安裝/設定 Mail for Exchange 安裝/設定

可是為什麼通訊錄沒有同步呢?再來同步一次好了,又發現通訊錄的也開始匯入了,記錄中也確認有 34 筆記錄被匯入。靠么,原來同步作業是需要耐心和勇於嘗試的作為啊?
Mail for Exchange 安裝/設定Mail for Exchange 安裝/設定

基本上同步的設定到此即算完成,若不是還放心的話可以嘗試分別在手機及 GMail / Google Apps 中分別新增一筆行程及一筆通訊錄,然後等排程時間一到看會不會完成同步。
結論
之前一直朝著完整重新同步的想法去進行測試,結果沒有一次成功。沒想到最後是因為選錯項目才發現只要一直同步就有機會完成整個同步程序,這實在有夠瞎就是了。

2009年10月12日

Tomcat: Cannot create PoolableConnectionFactory

因為在修改某系統的部署方式而遇到這個問題,特此記之!

錯誤訊息:
12:15:11,605 ERROR jsp:228 - Cannot create PoolableConnectionFactory (IO 異常: The Network Adapter could not establish the connection)
據說這個例外的成因還不少,但在使用 Oracle 資料庫的情形時有個比較特殊的原因:連線設定參數與資料庫設定不符。最直接的驗證方式是將資料庫連線設定改用 tnsnames.ora 檔案內的寫法取代即可。Ex:
<Resource 
    name="jdbc/oracle" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.OracleDriver"
    url="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP))(HOST=192.168.1.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MY_DB)))"
    username="賣哀滴"
    password="賣怕死我"
    maxActive="8"
    maxIdle="4"
    maxWait="30"/>

部落格搬家紀實 - 從 SnipSnap 到 Blogger

前言

基本上在已經營部落格 5 年的情形下搞搬家是需要很大的勇氣的,當然也可能只是因為愚蠢的關係... XD

會決定部落格要搬家的首要原因是因為前陣子系統硬碟陣亡後,一時間找不到/想不起來把 SnipSnap 的 Source 塞那邊去了。沒了 Source 就沒辦法再加新功能,所以開始考慮搬家的問題。

決定要搬家意謂著得把過去所有的文章統統帶到新家,但是由於 SnipSnap 是一套極小眾化的部落格共筆系統,所以完全找不到任何工具可以快速的達成這項作業,於是退而求其次是自行寫小工具進行搬家。最原始的想法是將資料庫內的文章記錄全部翻出來後轉成 Blogger 的備份檔案,這樣只要直接 Import 馬上完成辦家作業,任務終了!

有了方向就開始進行測試了。弄了幾篇文章後匯出成 Blogger 匯出備份檔,東刪西砍後弄了一份假檔案去玩匯入功能,先是被 Blogger 吐槽說不支援別人家的備份檔,再修改後的測試則讓 Blogger 吐出一串奇怪的錯誤訊息。查詢過 Google 後確定應該不是因為我這個簡化過的備份檔的關係(難不成大家都有偽造備份檔的習慣?),顯然這個想法的可行性有執行上的問題...囧rz

雖然生出 Blogger 可用的匯出備份檔是個問題,但實際上 SnipSnap 儲存在資料庫內的資料和頁面上顯示的內容也因為 Macro 的存在而有極大的差異。因為沒辦法自行呼叫 SnipSnap 內建或自行開發的 Macro 去解析原始資料,很快的便把腦筋動到內建 RSS 輸出功能,至少從 FeedBurner 上可以確定產生的 RSS 檔已經將所有 Macro 、Filter、Formatter 等等都套用過了,更重要的是 Blogger 就是收這種 HTML 格式成為一篇文章的。

不過有點可惜的是內建的 RSS Servlet 只能輸出首頁的指定筆數資料,為了能夠倒出所有的文章內容,我必須安裝修改過的 Servlet 到 SnipSnap 內。這個問題不算難,確認那個 class 才是系統用來轉換 RSS format 的部份則花了點時間。最後實際執行 RSS 匯出的時間好像才 30 秒不到而以。

有了所有文章的 RSS 檔後就可以開始匯入了。於是我開始搜尋 rss2blogger 這個關鍵字,還真的在 Google Code 中找到一個 rss2blogger 開源專案,可惜的是他完全沒有記載怎麼使用。

之後,我決定自行開發匯入工具,本來名稱就叫做 RSS2Blogger,不過因為和上面那個開源專案名稱衝突,所以實際上真正 commit 進去的名稱叫做 RSS2Blogspot ,對!這是 Blogger 的另一個名字。

之所以需要自行開發匯入工具的主要且唯一的原因在於必須更正原本指向 SnipSnap 內其他文章的連結。如果使用現有工具直接導入 Blogger.com 的話,後續顯然得要花上更多的時間去修正所有文章中的連結,連結問題一直是所有搞部落格搬家工程的部落客心中最大的傷痛。

RSS2Blogspot

初期對這個匯入工具的想法除了採用 Google Data API 外,在功能上應當要具備以下功能:
  1. 可以設定是否存為草稿
  2. 可以濾除指定字串
  3. 可以標示出該文章有 Blog 內部參考連結
符合以上要求的第一個版本就是以下這張圖的執行畫面:
RSS2Blogger 執行匯入過程

匯入一些文章進行測試後認為程式碼部份應該可以再美化些(最後還是一樣醜),功能可以再增強些(還好達成了),以及訊息應該改回英文。想要只顯示英文的原因在於先前的 ass2srt 工具因為都是中文字結果造成網路上一些外國朋友使用上的問題,也許用一些不太工整、破破的英文訊息就可以讓這個工具活久一點(ass2srt 比我想像的活的還久)。

正式上傳到 Google Code 的 rss2blogspot 就是修改過後的版本,它提供了(在 RSS2Blogger 開發記錄中曾提到過):
  1. 可以單篇或全部 RSS 內文章都指定為草稿:其實後來我都指定為直接發佈了!
  2. 將濾除功能改為替換功能:原本濾除功能就是一種替換作業,加上我有一大堆的表情符號要重新指定連結網址,所以這個功能就被強化了。
  3. 使用參數方式檢驗文章內部的連結。
  4. 加入分類標籤設定:因為原本的 rss 檔中就有 <category /> 元素,所以直接拿來當做文章分類標籤使用。
因為功能上的強化,所以我又回頭改寫了 SnipSnap 的 RSS 輸出,將所有表情符號的對照表及內部連結格式等資訊統統直接輸出到 rss 檔案內,這樣子當開始搬移 Blog 文章後需要再檢核的項目就會大符減少。

匯入前檢查

至於實際上在匯入的時候,我會先檢查 rss 檔內部的發佈時間及文章標題是否正確。在早期發文習慣不良時是有少數幾篇文章沒有捉到文章標題的。另外也會針對文章內容是否有保留價值進行篩選,因為早期好像真的有一些無病呻吟的搞怪文章,這些後來都決定予以放棄了。

至於什麼時候可以搬完呢?我想應該還是會花上 1 ~ 2 個月吧! 畢竟人懶的時候會忘了要上傳文章... :p

應用

因為目前 RSS 資料是如此的容易取得,這個工具的應用似乎也挺有看頭的。舉一個最最簡單的例子來說,這個工具可以協助建立一個 Blog 備份站台。只要在原本的 BSP 中編寫完文章,然後捉下 rss 檔後馬上就可以再 Post 到 Blogger 內。除了一般的部落格文章外當然還可以用來處理別的資料類型如 picasaweb / flickr 的圖像記錄,只是這需要再修改程式進行客製化就是了。

2009年10月4日

部落格正式移轉至 Blogger

今天將整個 RSS Feed 自原本的 SnipSnap 系統上改到 Blogger 這邊了。由於 Blogger 本身的每天 50 篇文章的限制,原本有訂閱本格的網友應該會開始收到因搬家所匯入的舊的文章內容。

又因為這個 50 篇文章的限制,這次搬家大概要花上 2 個月以上才能完整搬完,時間似乎拖的有點久,但也提供格揆我回首當年和移除當年為了湊文章所留下的無意義發言的機會。

至於為什麼要花上 2 個月的時間搬家呢?另一篇文章內會提供說明,也算是提供另一種搬家方式的選擇!

以上,謹此告知!

※喔,對了!使用 FeedBurner RSS 的朋友會自動取得新的文章來源,使用 SnipSnap 自帶 RSS 機制者,另外會在舊系統內發文告知。

2009年9月27日

RSS2Blogger 開發記錄

最近很努力在搞 RSS2Blogger 搬家工具,事實上也弄出了一個試用版可以開始進行搬家作業。不過因為一開始規劃失當,加上拿別家的 rss 檔測試時出了一點小 Trouble ,所以目前重新改寫中...

本文作為開發過程中的點滴記錄...
  1. Google Data API 的版號設定很奇怪:在檔案名稱部份只編到 1.0/2.0/3.0 ,但實際上的版本設定已經到了 1.38 了。這種怪異的版本設定方式導致 Maven 很難對 GData API 的 jar 檔進行版號管理,除非在建立檔案庫時將版本號改成 xxxx-1.0-1.38.jar 這類格式。
  2. 原本的 SnipSnap 及 WordPress 這兩個 Blogger 系統都會在 RSS 檔中加入一個 <content:encoded /> 元素,但是 Blogger 只有 <description /> 元素。檢視的結果發現部份 BSP 會使用 <description /> 元素放置文章摘要,而 <content:encoded /> 則放置完整內文。
  3. 順手查了一下各 BSP 的 RSS 檔,Pixnet、Yam 有提供 <content:encoded /> 元素,Wretch 則沒有。另外補充一點是 Wretch 還特地封鎖掉諸如 wget 這類工具讀取 RSS 檔的資格,有點莫名其妙。
  4. 在設定文章的發表時間時是使用 Entry.setPublished() 這個 method,不過當用來匯入 Blogger 的 RSS 檔時會出現這麼個訊息,但問題是所傳入的日期資訊好歹也是用 GData API 內的工具去 parse 的,結果自己吐出來的東西又不吃?只能說 GData API 真偏食...
    Entry.published must have a timezone.
  5.  後來,我自行填入 TimeZone Offset 值為 0 終於通過前述考驗,不過當文章發佈出來後卻發現,時間一整個莫名其妙的不對... 發佈時間從本來的 +00:00 變成 -07:00 了... 莫名其妙嘛...
  6. 我已針對漏失 TimeZone 資訊的部份發起了一份 issue ,希望能快點確定是否為 bug !

特殊控制:因為懶的另外處理設定檔,所以某些設定可以掛在 RSS 檔內
  1. 草稿模式:預設匯入文章時會統一指定成草稿模式,不過如果患心有室肥大症,心臟比較大顆的人,可以在 RSS 檔中加入以下設定。如果是放在 channel 區段中屬於全域設定,放在 item 區段中則限該 item 有效。
    <draft>false</draft>
  2. 替換作業:原本是規劃將不需要、不正確的圖形刪除,但後續為方便處理表情符號所需,改成可執行替換方式辦理。共有三種設定型態:
    • <pattern>
        <regex><![CDATA[source string]]></regex>
        <replacement><![CDATA[replacement string]]></replacement>
      </pattern>
    • <pattern>
        <regex><![CDATA[source string]]></regex>
      </pattern>
    • <pattern><![CDATA[source string]]></pattern>
    第一種屬於原始設定方式;第二種是第一種的簡化型,其意等同於將指定字串替換成『空字串』(等於刪除功能);第三種再等於第二種的簡化型,總而言之就是懶而以。
  3. 待處理連結:主要是因應連結不正確的情形,此時一律會設定成草稿模式以利後續處理。
    <forceDraft><pattern><![CDATA[<img src="http://blog.adahsu.net/ada/[^>]*>]]></pattern></forceDraft>

逆境:基本上 RSS2Blogger 相關功能似乎已備妥,問題是偉大的 Google Data API 有每天 50 筆的限制。而且這個 50 筆限制的解除得等 24 小時候才能解除,等於每 50 篇約需花上 24.5 小時。這表示要把 13xx 筆一般文章搬到 Blogger 就要花上 54 天以上的時間...

有沒有 Blogger 討厭人家把 Blog 搬進 blogspot.com 的八卦啊?

2009年9月7日

安裝 Google Data for Java 套件庫給 Maven 使用

基本上 Google 並未替 Google Data API 建立 Maven 檔案庫,而目前 Google 到的 Maven Repository 又早已過期,所以最終只能自行下載原始檔案後再安裝到本機上的 Maven Repository 中。

Windows 下可以參考 Adding Googles GData Java API to your maven repository,如果是 Linux 的話則可以使用以下的 bash 命令稿:
#!/bin/bash

MVN=$(which mvn)

VER=1.38

for FILE in $(ls *.jar);
do
  T=$(echo $FILE | sed -e 's/\.jar$//')
  V=$(echo $T | gawk -F- '{ print $NF }')
  F=$(echo $T | sed -e 's/'$V'//' | sed -e 's/-$//')
 
  $MVN install:install-file -DgroupId=com.google.gdata \
        -DartifactId=${F} -Dversion=${V}-${VER} -Dfile=${FILE} -Dpackaging=jar \
        -DgeneratePom=true
done;

※註:我使用的版本是 1.38 版,所以設定上是會將 Google 提供的 .jar 檔改名為 -1.0-1.38.jar 之類的版號以方便 Maven 進行版號管理。

2009年8月8日

Tomcat 與 Port 80

在 Linux 環境下除了 root 使用者外是無法開啟低於 1024 以下的通信埠,當然 Tomcat/Jakarta 預設的使用者 tomcat 也不例外,所以 Tomcat/Jakarta 預設的 HTTP 服務埠號是指定在 8080 上的。

Port 8080 意謂著訪客必須特地修正瀏覽器網址列上的資訊,但這即不便民也與網路習慣不符,所以網站系統管理員必須設法修正 Tomcat/Jakarta 的這個設定。

過去由於心臟比較肥大(心室肥大症?)的關係,個人是直接改用 root 去啟動 HTTP 服務。這麼危險的舉動雖然目前看來並沒有啥意外,但或許這只是無知之人所獨自擁有的小小幸福,搞不好硬碟中深藏已久的性感睡姿照早就被幹走而不自知。總之,這其實是個簡單卻危險且不便的解決方式。何以不便?每次進行 Tomcat 小改版時總是會被套件管理系統提示需修復啟動檔的附帶效應就是每次升版時都需小心翼翼以免阻卻了 Tomcat 的執行。

比較正規的方式是利用 Port Redirect 的方式將來自 Port 80 的連線需求重新導到實際提供服務的 Port 8080 上,這又有兩種作法:

  1. 利用 iptables :網路防火牆本來就可以進行這類動作
  2. 使用 xinetd :超級服務管理員原始的目的就是作為所有服務的代理窗口
因為第一項設定試了半天一直無法成功,所以此處只介紹第二項設定。
  1. 請安裝 xinetd 這個 super daemon 套件,它會在 /etc/xinetd.d/ 內塞進一堆設定檔,但是我們用不到。
  2. 編輯 /etc/xinetd.conf 檔,將 only_from 這個設定給註銷掉。
  3. 在 /etc/xinetd.d 目錄中放置以下設定檔後啟動 xinetd 服務即可。
  4. xinetd 啟用後應可在 netstat 中看到 port 80 已被開啟且由 xinetd 提供服務,如附圖。
# vim /etc/xinetd.d/tomcat
# Redirects any requests on port 80 to port 8080 (where Tomcat is listening)
service http
{
        disable                 = no
        flags                   = REUSE
        wait                    = no
        user                    = root
        socket_type         	= stream
        protocol                = tcp
        port                    = 80
        redirect                = localhost 8080
        log_on_success  -= PID HOST DURATION EXIT

# per_source = UNLIMITED # instances = UNLIMITED }

iptables 的作法等我研究出來後再看看… XD

※ 2009-08-10 補充

  • 此法會導致 Tomcat 無法捉到正確的 Client IP … -.-
  • 另外,下一篇文章開始將改用 Blogger.com 發佈,資料移轉問題目前暫時還沒有辦法… XD

2009年7月29日

jQuery w/ jqGrid 錯誤訊息處理

這兩天遇到最鳥的錯誤訊息是 jqGrid 所發出來的...

假如您的使用者反應 jqGrid 無法顯示 grid 內容時,可能是因為 jqGrid 內部發生了一個例外所導致。這個例外在 Firefox w/ Firebug 時會出現類似以下畫面最下端的 Syntax Error 訊息,基本上這是個有看沒有懂的錯誤訊息:

IE6 的話只會彈一個提示視窗,至於為什麼錯則當然一點眉目也沒有…

假如有安裝 Script Debugger 的話會標示錯誤出在以下這句:

eval( "(" + js + ")" )

當您遇到此問題時,請確認一下 jqGrid 的 url 參數是有指定為一非 null 值,若未設定時即會出現上述問題,請隨意給定任意值即可;後續您的程式可依需要重新指定正確 URL 後透過 trigger( 'reloadGrid' ) 即可觸發 jqGrid 自 URL 載入相關數據並顯示之!

2009年7月26日

對於噗浪網路經營之我見

這是針對以下兩則新聞的個人看法: 雖然不確定我們秀蓮阿姨暗指的是誰,不過比對一下後也可以猜的到大概是指誰(也許要加 s 表複數型)。然而就結論而言個人是有限度認同秀蓮阿姨的看法的。(話說回來,我似乎經常在一定範圍下認同阿姨的說法?)

基本上在網路的世界中從未曾規定或限制參予的方式,所以想在 噗浪 上搞什麼其實也不關阿姨的事。想把噗浪當流水帳用也好、透過噗浪發洩心中不平事也,總而言之想將噗浪當成何種工具是看使用者對噗浪的定位為何,譬如個人將噗浪當成 心情的垃圾筒 在上面亂吐口水用,這是外人管不著也不必管的。

但是有些群組成員的身份特殊,像是線上的政治人物或政黨等因為受到社會的期待心理因素導致不見得能夠隨心所欲的在噗浪上搞踩線、問安、流水帳之類的作為,也許這是秀蓮阿姨之所以認定噗浪沒有內容的原因。只是再怎麼說四天王目前並非線上的政治人物,所以他們若想要透過噗浪單純的分享他們個人生活狀況、政治看法、或是用於作為與網友們互動的直接管道其實都不能算是沒有內容。

反觀 DPP Online 這個以民進黨之名所創的噗浪帳號因為建立當時只拿來問問安、踩踩線之故,原本想要將之由追蹤名單中移除。記得當時立法院內有一堆極具爭議性的案子在處理,DPP Online 未能透過噗浪即時將狀況公佈給網友知道讓人好生遺憾,甚至一度衝動的直接在 DPP Online 某噗中留言希望別再玩踩線遊戲,畢竟這個具有政黨官方身份的帳號若不能在短期間內建立公信力及代表性的話,後續大概很難吸引更多人留意正在民進黨內發生的各種重大事件。之後 DPP Online 開始釋出民進黨的一些重要活動訊息、對騜政府政策的看法等,成為個人掌握民進黨各項訊息的主要來源(其他媒體總是會做出一些莫名其妙的自我解)。

總而言之,在經營噗浪微網誌這部份只要是屬於特殊身份的成員都不該只把噗浪當成問安的管道。至於脫離特殊身份的前政治人物或許現在仍然受到媒體的關注,但他們想在噗浪上留下什麼訊息其實都很隨興的啦!

PS:

  • 話說秀蓮阿姨的反應會不會也透露出她的權力慾呢?
延伸閱讀:
  1. BillyPan:呂秀蓮認為噗浪毫無內容…
  2. Jas9 Taipei: 整個網路的不求上進
四大天王噗浪(順序無意義): 其他:

2009年6月19日

部落格是個公開的場合,但也是私人的領域

個人認為部落格雖然是個資訊公開的場所,但也算是私人的領域。我即批評台灣目前政治環境的惡劣卻也會捍衛台灣這跛腳的民主自由環境。在這種情形下請不要挑戰格揆我的政治立場底限,個人或許會開放台灣藍丁們為了他們的政治主張所做的有意義的留言,但絕不會放任外國(尤其是中國)人士侵犯、干預台灣自主生活的各種主張。

基於以上立場宣示,以下文章即日起予以刪除不另通知!至於 FredCN 這位中國朋友可請回到您自個兒的部落格上繼續主張您的主張,謝謝!

2009年5月26日

jQuery 使用感想

雖然並不是第一次將 jQuery 使用在案子中,不過這次因為有比較明顯的對照組而益發感受到 jQuery 所帶來的便利性。

也許我應該在螢幕週圍貼上一段上、下聯...

上聯:該做的事不會自己變少 下聯:有人分擔就能多睡一些 橫枇:jQuery 真好用

嗯,雖然並不是真的有對仗,不過… 反正我國文考的也不好… XD

2009年5月20日

某網站設計人員的建議

不知道該說啥比較好,為什麼台灣的網頁設計公司總喜歡限制網頁訪客的解析度呢?

話說,我為什麼要犧牲 DELL 2405 的最佳解析度不用去配合一個可有可無網站的需求呢?(搖晃~~)

2009年5月10日

幹!這算啥?台灣被賣了嗎?

中天新聞有這麼一篇報導:

幹,現在馬英九是想怎樣?賣台也賣的太快了吧?而那些天真的以為政治和你沒有關係的人們,現在你要被賣了知道嗎?

馬的,到時候公安和台灣人民衝突和警察會幫哪一邊… (別以為會幫台灣人啦… )

2009年4月22日

Tomcat 5.5 異常腫脹的 catalina.out

最近接了個 case 在家裡 加減 困難做,然後發現了一個以前未曾注意的問題:Tomcat 5.5 有個會卯起來 腫很大,腫不用錢 的 log 檔:catalina.out ,當我注意到它時它已經成長茁壯到 2.4G 了…

網路上查的到的資料都有些奇怪,大概是除了透過 cronolog 以外剩下的各種說法中一直都沒在相關設定中看到這麼一個關鍵檔名 Catalina.out,就此點來看那應該都不是正確答案。

回到剛剛提到的 cronolog 上,它提及必須修改 startup.sh 檔將 Catalina 的輸出轉給 cronolog 去處理,cronolog 就可以在必要時依設定分成每天或每小時一個檔案。

問題就在這邊:為什麼要把 Catalina 的 console 輸出利用管道方式轉給 cronolog 去處理呢?明明同個目錄下還有一個 catalina.yyyy-MM-dd.log 的檔案,它的內容正好就是 catalina.out 扣除使用 System.out 方式輸出後,依日期區分好的輸出結果。同一目錄下有兩份相同的 log 記錄是否表示 catalina.out 其實根本就沒有存在的必要呢?

所以,個人最後決定直接將 Catalina 的 console 輸出直接仍到黑洞去,於是修改 tomcat 啟動命令稿 catalina.sh (其實 Gentoo 是改 /etc/init.d/tomcat.sh 啦) ,將

>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
全部改為
>> /dev/null 2>&1 &

※ 其他:

  1. 有些 Linux 套件所提供的 Tomcat 5.5/6 已內建自動做 Daily Rolling 的設定,不用想太多這些有的沒的。
  2. Linux 套件沒有內建 Daily Rolling 的話也無妨,利用 crontab 在半夜時分將 tomcat 暫停,把舊檔案改名,再重新啟動 tomcat 也是一種解決方法。這種方式還可以插進備份檔案的作業。
以上,無責任修改介紹說明完畢,謝謝收看!

2009年4月11日

82,俺好想你!

那個… 昨天下班回到家中一摸,竟然發現手機 N82 不見了,努力回想是否忘在公司仍不可得,於是今早特地回公司一趟,確認了這個令人心痛的結果:N82 它失蹤了… 於是,我只能在人來人往的街頭邊泣訴:『82, 俺好想你… 』

什麼?這個梗太老套了?那換成『82,出去玩也要記得回家!也差不多玩夠了,記得回來!我很想你,82~~~ 』這梗很新喔!昨天才首播…


可以從 3:10 直接開始!

2009年4月2日

喝咖啡的習慣

嗯,這不是講個人有喝咖啡的習慣,而是指喝咖啡時才有的習慣:
  1. 要喝熱的,所以夏天幾乎沒看我在喝咖啡的。
  2. 只喝美式熱咖啡,不加糖但加一顆奶油球。
  3. 不攪拌,讓奶油球自然的擴散、沉澱到咖啡裡。這是因為個人想要品嚐奶油與咖啡間不同濃度交流時的微妙口感,不過遲頓的舌頭顯然無法分辨此一口感上的極小差異....
  • 剛加入奶油球時的 7-11 小杯美式熱咖啡(沒想到這竟是 N82 最後一次貢獻的照片)

2009年3月21日

難不成又是金石堂個資外洩?

03/19 接近 18:00 時刻接到一通來自 0228739193 自稱是金石堂客服的電話,除了說出在金石堂的交易狀況外還提到取貨方式為超商取貨。一開始人笨沒注意這個時間點不正確的問題而慷慨激昂的控訴 對該公司贈品的不滿,但因為後續談話內容中扯到啥 誤簽 12 期繳款單 這樣的問題後已讓我相信這是通詐騙集團的電話。

不過這傢伙可能是個新手吧,在我提出所有的作業疏失所導致的錯誤都應由金石堂與全家便利商店去承擔時還想堅持說服我這樣的分期扣款是合理的,最後只好撂下狠話將追究貴公司洩露個人資料的法律責任後才悻悻然以『 本公司僅是儘告知義務,若您不願意處理的話相關責任請自行承擔 』之類的用詞做結尾。有趣的是一開始她自稱客服部門,後來變成了會計單位… 哈哈!

查了查網路可知金石堂網路書店的問題恐怕不小,當然實際情況有可能是錯在消費者的電腦上,但也不要以為這些被詐騙集團鬧過的消費者都是電腦白痴,一味兒的把過失推給消費者並不是企業負責任的表現,但顯然金石堂網路書店就正麼做。

至於是否要繼續在金石堂購書應該是個很明確的選擇。

2009年3月3日

電視螞蟻 TVAnts

因為新住處房東沒有牽第四台之故,其實我最近睡眠超正常,但是原本透過第四台所獲取的新聞訊息則等於完全中斷,於是只得開始評估是否需自費拉第四台的問題。

雖然第四台收視費用不算太高,但為了少部份頻道而支付這筆費用是否合理划算則是個有趣的議題,電視螞蟻 TVAnts 為我等這類還看又不想花錢的傢伙提供了一個替代方案 - 使用網路看電視。

基本上 TVAnts 並不是個 Linux Solution,不過它可以在 Wine 環境下正常運作,所以把 Wine 裝一裝後再執行 TVAnts用戶端安裝程式 就算完成大部份的準備工作。和 Windows 環境不同,在 Wine 下面不需要安裝 TVAnts 的 ActiveX 元件,那是用來在 IE 中內嵌 TVAnts 播放連結用的(大概吧)。

在執行 TVAnts.exe 主程式前應先開放 TVAnts 使用的連接埠 (16800,16900),它們分別對應到 TVAnts 的 Share Port 及 Broadcast Port,如下:

www ~ # iptables -L | grep 16.00
ACCEPT     udp  --  anywhere             anywhere            udp dpt:16900 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:16800 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:16800 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:16900 
www ~ #
  • Share Port 設定
  • Broadcast Port 設定
  • 開放連線通訊埠後即可執行 TVAnts 主程式,然後可以先加入一個新的頻道來源 (Server List):fanshoptv.no-ip.info,如圖(點圖可看原圖):
  • 加入頻道來源後應該可以收到頻道列表,可能是因為頻道清單是以 GB18030 為編碼,所以顯示上可能會不太正常,如圖(點圖可看原圖):
  • 選定頻道資訊後即可將指定頻道加入列管頻道清單中,這邊才是真正要用來分享(TVAnts 是個 P2P 架構的共享平台)電視節目的主體,當一個頻道的狀態變成 運行 時,還得注意速度欄位需有顯示速度資訊後才能真正觀看,如圖中的三立新聞台:
  • 當一個頻道狀態為 運行 時,我們便可以使用 mplayer 或其他播放工具連上伺服器觀看。在 Windows 平台下當我們點選一個頻道後即可按下 播放 按鈕自動呼叫 Windows Media Player 來播放媒體串流。不過 Linux 下沒有 Windows Media Player,所以會彈出一個訊息視窗告訴我們媒體串流的實際位址,記下這個位址後可以按下 關閉這個視窗,如圖。
  • 使用系統中已安裝的媒體播放器傳入前述的媒體串流位址後即可進行觀看,除了 http 協定外也可以使用 mms:// 協定。與 http 協定的差異除了修改 http 為 mms 外,網址尾端的 .asf 也不須輸入,所以以下範例與前述 http 媒體串流完全相同:
    mplayer mms://localhost:16900/2
  • 對 mplayer 而言可以加入 -nocache 的不快取設定,降低快取緩衝的等待時間。
  • 實際播放效果如下:
  • 基本上個人的感覺是...... 實用性恐怕不如預期!