Thursday, November 26, 2009

「來給阿婆買花唷」

0 意見

每天早上都要擠「文湖線」上下班,這是搬回家後最大的改變。不再像以前住大湖那麼方便,10 點的 con-call 九點半起床都來的及,中午運動完還可以回家洗個澡再過來也不會錯過兩點的會議。先騎機車或坐公車到科技大樓站,再坐捷運到港漧站,這是我這三個月來的交通模式。

因為捷運的聚集效應,每天往科技大樓站移入和移出的人很多,周邊於是大小商店林立,生意也相當的好。從和平和復興路口靠東側向北延伸的騎樓下,在上下班時間都會自動變成兩線人行道加一線行人自行車雙用道,光是來往的人潮就可以畫出道路分隔線。我就日夜規律地搭著這潮流走,就和擦身而過的上千個凡人一樣。

有一天,一個蒼老的叫賣聲引起我的注意。

「來唷,來嗄阿 ㄅㄜ/ 買花喔~」

一個身型有點像《愛麗絲夢遊仙境》裡這個角色

的阿婆,頹坐在路旁。面前地上就擺了一小盒串好的玉蘭花。

在那當下有個衝動想去幫她一兩串。畢竟她不像有些不怕死的阿桑在紅燈時衝到馬路上攔車叫賣,如果買了會鼓勵他/她繼續做這種危險的舉動。坐在地上的阿婆看起來似乎行動不便,但賣玉蘭花也是自食其力。一把年紀的老人,看了著實令人心疼。相對照之下,我某次下班要牽車回家時,一個手腳建全但看起來像街友的年輕人叫住我,說要「請教個問題」,原來他的問題是「能不能給我20元」。衝著他問得還算客氣,我也微笑回話「對不起,我沒有 20 元」。

被動式賣花的阿婆,和主動式乞討的年輕人,就在台北的街頭,曬一樣的陽光,淋一樣的雨水。行動不便的阿婆生出了玉蘭花來做生意,而行動自如的年輕人只想靠別人救濟。這下問題嚴重了…

以前的社會說,使老有所終,現在不一樣,整個人口結構高齡化了,變成是使老有所養。但,社會景氣如此,薪資低,工時長,房價物價高,面對大陸和米國的夾殺,領導人只左右猶豫著要舔誰的 LP ,沒想過除了對抗在野黨無知的咆哮以外,還能轉頭看看自己的人民發生了什麼事,沒有想過所謂的首都台北市,不但房價高的離譜,生活費也是貴族級的。在高昂的生活費和低簾的薪資中間,大家都想要過好一點的日子,要的,無非是個希望,是個機會。可惜台灣區,台北城並沒有給人民什麼機會,至少,隨著時間的推移,連教人自食其力的尊嚴也沒了。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Wednesday, November 18, 2009

聊 "台灣媒體的智力要到什麼時候才能離開 「手牽手,羞羞臉」 的年紀" 串

0 意見

facebook 上這一串討論還不錯,貼上來

因為 FB 是公開的,我想放在這裡就算留下留言者的名字應該也沒有侵害到隱私…如果不妥再跟我說

(我的FB: http://www.facebook.com/hbtsai )

Benjamin Tsai: 台灣媒體的智力要到什麼時候才能離開 「手牽手,羞羞臉」 的年紀?

Tui Lok:因為大家想牽也牽不到,只好罵牽手的人羞羞臉

Yun-Peng Chiu:少見多怪以及公眾人物的一舉一動都是製造新聞的絕佳材料,所以,你說的大概很難吧。

Benjamin Tsai:酸葡萄主義?XD

Benjamin Tsai:台灣的政客不論道德還是專業都是比爛的,有德有才的人就會被鬥下台,這個渾蛋執政體質已經成型已久,怎麼還有人以為馬家子弟就會例外?不懂…

吳宗恩:因為大部分的人民智未開,愛看這種新聞,媒體當然就大報特報囉~

Yun-Peng Chiu:我覺得另一半是媒體把民眾教育成愛看這種新聞。因此形成了循環,無法解套。

Benjamin Tsai:都什麼時候的人還講民智未開,台灣的大學錄取率機乎100%,生產碩博士像在生產雞蛋一樣,到底是誰的智商未開…

Yun-Peng Chiu:我覺得大學錄取率高還是沒差耶。某種角度上民智仍然未開。

Benjamin Tsai:我同意循環造成問題,但有能力製作和播送的是媒體,有能力選擇的是人民,如果看電視看出問題來,到底是製作的人要負責,還是選擇的人要負責?媒體墮落是世界性的,像CNN近年也超愛用聳動的標題,像跟台灣學來的一樣,紐時在報柯林頓的醜聞時也為了賣報紙而腿開開,讓柯林頓明搞李汶斯基還能暗捅紐時屁眼。但台灣…墮落的太全面了吧…

Tui Lok:未開的不是民智,而是禮教壓抑下的抒解管道。這個社會仍然是一個敢做不敢說的世界。很多事你只敢偷想不敢做,只敢偷做不敢說。說,你想不想?

吳宗恩:講到大學錄取率100%,有幾個大學生是能看的?

Benjamin Tsai:this is getting interesting! :D 經濟學第一課:資源有限,慾望無窮。所以我們在做選擇的時候,除了考量自身的慾望,還會計算機會成本,一般說來我們會往機會成本小的地方走。也就是說,如果你的慾望會造成大災難的話,你會選擇克制慾望。對,你想幹盡天下的正妹,嘗遍中外老少的鮑魚,但你不一定會行動,因為你計算完機會成本後覺得負擔不起,於是選擇不要做。但當有人「覺得」他負擔的起的時候,他會去做。當對於機會成本的計算「失準」時,他會破產。這是我認為符合邏輯的決策模型。至於什麼情況下會發生計算錯誤?要嘛就是笨,要嘛就是粗心,要嘛就是故意,要嘛就是「其實他沒算錯!」以我個人對於台灣政客的評價,尤其是會拜入馬門的人,應該只是單純的笨而已。

我好像失焦的很嚴重…

Benjamin Tsai:能看?能看的很多,每次經過管院都看起來天氣很好,只是到職場時這些人能用的很少 XD

吳宗恩:我覺得你不小心把你內心深處的慾望講出來了耶,你未婚妻知道嗎?XD

Benjamin Tsai:這只是一種比喻,是寫作的手法 (噓!走開!) XD

Tui Lok:大部份的人沒機會上場比賽,只好看轉播球賽。媒體知道大家愛看,就會轉播。一樣的道理。

吳宗恩:我完全相信這是你內心的寫照...:P

Benjamin Tsai:是這樣嗎?我沒看到吳孫大戰三百回呀…台灣風氣對性比較壓抑是沒錯,但媒體緊追不捨到騷擾的態度也很爛,這麼會人肉搜尋怎麼不去把阿扁的海角不知幾百億找出來。只會寫俗不可耐的八點標爛劇本,卻不檢討當事人立委身份是否在職其間有因私害公,分明對人不對事。真的要轉播球賽好呀,分析一下吳孫大戰的轉體動作如何?

Benjamin Tsai:不理你 =.=a 吃飯去...

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Wednesday, November 11, 2009

賣車的人可以連馬路長啥樣都沒概念嗎?

0 意見

前一陣子 Sales 說要我提供一些 LinDVD 的 現況 / 規劃 / 展望 等資料做 presale,除了 roadmap 以外,還要 wishlist 還要 dreamlist。我想說這樣一個一個列好麻煩,就跟他說請他先找台機器裝一次 9.10 + LinDVD 看看,才比較知道 LinDVD 的優缺點在哪裡。該老兄居然跟我說, Sales 的責任在賣產品,不是在練習 / 測試產品。論階級當然他高,我也就不回信罵人了,但說真的,如果 Sales 連產品長什麼樣,甚至產品運行的環境都沒看過,真的能說服客戶我們的產品的競爭力嗎?難道我們打打嘴炮說我們的介面很友善,至於哪裡友善不用說清楚,客戶就會傻傻買單嗎?

不知道 sales 是如何去衡量自己的「skill set」,如果真的是「沒看過的東西都能賣」的話術,那不就等於 RD 「沒寫過的程式都能交差」的技術。「使用者介面」在十年以前是被當作不重要的東西,能讓系統運作才是王道。現在整個想法都反轉過來了,有設計過的介面,真正達到簡單易用的目的,才能讓買家接受。相較於 Windows ,我個人並不覺得自 ubuntu 出現後,Linux 還是一樣難用,很多操作雖然不和 Windows 相容,至少進入障礙已經減小了很多。

好不容易我們的產品有機會會見大客戶,客戶的大頭要跟我們的 sales 開會「了解」 LinDVD 的資料。要命了,該客戶的管理階層可是以擁有雄厚技術經驗和背景聞名,而你老兄連裝一下 ubuntu 都不肯,我真的不知道 sales 是怎麼落力在搶客戶的,產品的好和壞都不知道,只會拿著 PM 寫的 spec 胡亂吹噓,到時就給客戶釘在牆上。對於產品的 market 和 domain 沒有研究沒有分析,賣什麼都是賣假的。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Monday, October 26, 2009

婚紗照的場景?

0 意見

滿滿的粉紅玫瑰耶~ 不知道有沒有這樣的場景可以拍~ 哈哈

rose farm

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Saturday, October 17, 2009

夢想

3 意見

這個時候我應該在寫 gstreamer plugin 的第四部份,但本來想用 twitter 發的文一直發不出去…乾脆寫一篇 blog 好了。

夢想如果能實踐,算不算是夢想?

夢想如果不能實踐,那還真的叫做夢,那些宣稱可以築夢踏實的人都在說謊。

我夢想有一天,能有能力去整頓迂腐顢頇的中華民國政府。我夢想建立有效率而且公正公開的公務系統,領人民的稅,服務人民的事。

我夢想台灣的人民行止有禮,安居樂業,不做違法的事,不做虧心的事,不做違背道德良心的事,不臆測,不猜度,不疑懼他人。生活能有理想,有目標,能實踐,能發展。

人人有書讀,人人有屋住,有車開,有家有伴侶有子嗣。互相合作,守望相助,團結一心,同時顧及個人及群體的利益。

人人心裡得到安定,身體得到安養,以慈悲面對苦難,以包容面對紛爭,以祝福面對他人的成就,以友善面對陌生,以理性面對未知。

我夢想同樣的夢想能在地球的每一個角落得到實現。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Thursday, October 8, 2009

教育乃百年大計…

0 意見

聽聞太多太多令人瞠目結舌的校園壞份子的案例,實在讓人不知道該怎麼看待台灣這個小地方。

往好處想,壞份子只是一個兩個,但孩子還在人格尚未養成的時期,或者父母疏於培養狀況下,人格是很容易受到同儕所影響,而且,學著墮落是比學習成熟還快、還容易的。

當你看到在課堂上操著三字經,威脅對師長性命財產安全不利的學生,你會相信是學校教育出了問題嗎?當大學殿堂大開學生評鑑制度時,竟出現口徑一致因為「太難pass」「上課禁止講手機」而評為零分的老師,你會相信是大學教育出了問題嗎?

台灣的教改,改出一堆怪獸家長。怪獸家長,養出一群無德無才的孩子。這些孩子,是台灣未來的主人翁…。

心焦呀。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Wednesday, September 30, 2009

推動 gstreamer plugin 的第三步

2 意見

前面兩篇我們完成了兩件很重要的事情,第一是建立了編寫插件程式的環境和測試方法,第二是替插件裝好了進出水閥 (sinkpad 和 srcpad) 的格式和屬性,格式不合的資料進不來,也出不去。接下來我們要開始放水,讓資料流進這個插件。

gstreamer 在處理資料的流動有兩種主要的模式,一個是「推」,一個是「拉」。兩種模式需要實作的 routine 不同,在對資料的操作 (manipulation) 上的重點也不一樣,很容易被搞得摸不清方向(其實我到現在還是有很多沒搞懂的地方…)。首先先解釋一下兩者的不同。

「推」模式就是由上游的插件控制資料的大小、流速,向下「推」到下游的插件,所以下游的插件並不會事先知道有多少資料會被送進來,它就必須先準備一個緩衝區來承接資料,然後判斷緩衝區裡的資料是否足夠拆解出一個壓縮單位的資料,夠的話就把資料切割出一個固定大小送給解碼器,剩下的資料要留著和下一筆流進來的資料做連接。

「拉」模式則是需要自己控制資料大小、流速,告訴上游的插件說自己要多少資料,從幾分幾秒開始讀,自己控制速度、大小等等變數,把資料「拉」進來。因為要流進來的資料量 (舉例來說,media-object 的 size、chunk size、packet size) 自己可以控制,就不需要設計一個緩衝區來放資料。

通常,「拉」模式會用在 demuxer,而「推」模式用在其他插件,所以 gst-template 提供的例子是「推」模式的寫法。_chain() 函式就是讓上游插件把資料送進來的接口,當資料開始流動的時候 (完成啟動階段(activation stage)後,啟動的部份留待後述。) 會直接喚起初始階段時向 pad 註冊的 chain 函式,這個函式的介面 (GstPadChainFunction) 是已經被定義好的,其中一個變數是 GstBuffer 的指標,資料就被塞在這個指標所指向的記憶體空間。我們便可以透過註冊進去的函式,取得操作這段資料的 handle 。

Gstreamer 在處理資料流有四個狀態:Null, Ready, Pause, Playing 按順序切換。也就是說,剛開始播放一個檔案時狀態變化是: Null –> Ready –> Pause –> Playing,當播放結束要釋放 pipeline 的順序就是原路走回去:Playing –> Pause –> Ready –> Null。我們寫的這個 mp3dec 插件是要把 mpeg audio decoder libmad 包裝為 gstreamer 插件,所以在開始播放檔案之前必須先把插件初始化 (比如說,設定 member variable 的初始值,初始化 gstreamer 的其他元件等等),當然,也要先初始化 libmad。初始化的動作一般來說,應該要放在 Null 轉到 Ready 的階段,或 Ready 轉到 Pause 的階段,絕對不可能是在 Pause 轉到 Playing 的階段,因為 Pause 和 Playing 兩個狀態是切換播放模式用的 (如:暫停、快進、Seeking) 。

到目前為止都很抽象,我們走進源碼來看就會好一點。

為了處理剛提到的狀態切換,我們要註冊一個 _change_state() 函式。

   1: static GstStateChangeReturn 
   2:     gst_mp3dec_change_state(GstElement* element, GstStateChange transition)
   3: {
   4:     GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
   5:     Gstmp3dec *dec;
   6:     dec = GST_MP3DEC(element);
   7:  
   8:     switch(transition)
   9:     {   
  10:         case GST_STATE_CHANGE_NULL_TO_READY:
  11:             mad_frame_init(&dec->frame);
  12:             mad_stream_init(&dec->stream);
  13:             mad_synth_init(&dec->synth);
  14:         break;
  15:         default:
  16:         break;
  17:     }   
  18:     
  19:     ret = parent_class->change_state(element, transition);
  20:     if(ret == GST_STATE_CHANGE_FAILURE)
  21:         return ret;
  22:  
  23:     switch(transition)
  24:     {   
  25:         case GST_STATE_CHANGE_READY_TO_NULL:
  26:             gst_mp3dec_reset(dec);
  27:         break;
  28:         default:
  29:         break;
  30:     }   
  31:     return ret;
  32: }
  33:  
  34: static void gst_mp3dec_clas_init()
  35: {    
  36:     ...
  37:     gstelement_class->change_state = gst_mp3dec_change_state;
  38:     ...
  39: }     

如剛所說,當狀態從 NULL 轉到 READY 時 (GST_STATE_CHANGE_NULL_TO_READY),插件要做初始化,配置記憶體等。反過來當狀態從READY轉到NULL時(GST_STATE_CHANGE_READY_TO_NULL),就要釋放資源。為了避免當主要的執行續(main thread)還在運作時,就因為收到「停止」的指令,從 PLAYING 切進 NULL ,把資源都給釋放掉,所以狀態轉換要分成兩個 switch-case 來處理。

我們可以試著討論一下 pipeline 如此處理狀態切換的理由是什麼。想像你手上有一個濾水器,一個水桶的污水和一個乾淨的水壺。當你要開始過濾污水的時候,你會不會先檢查水壺已經正確地接在濾水器的另一端了?要開始把污水往下倒時,會不會先把濾水器的開關打開,會吧?水壺和濾水器都「READY」了以後,才開始把污水往下倒。如果你使用濾水器的方法和我不同,請麻煩接受這個「由下而上READY」的想法,因為這是 gstreamer 在做開關控制的精神。

反過來看,如果要停止濾水,該是怎樣的順序?沒錯,把上面過濾的順序反過來。先停止倒污水,再關閉濾水器,最後才蓋上水壺。這樣的流程要怎麼用程式碼表達呢?

Gstreamer 只提供了一個函式來處理整個 pipeline 開始和結束的動作,在 mp3dec 這個例子中,就是我們註冊進去的 gst_mp3dec_change_state。只有一個函式的話,還要兼顧「開的時候下游先開,關的時候上游先關」的原則,最簡單的做法就是:播放初始時先替自己做初始化,準備好了以後通知上游。播放結束時先通知上游,再釋放自己的資源。所以,就會出現上面那段程式碼的寫法。

當 pipeline 的狀態被切換到 PLAYING 的時候,gstreamer 會開始做 preroll (提取影音資料進緩衝區),此時 _chain() 函式就會被觸發。主要的資料處理工作就是在 _chain() 裡完成,在「拉」模式的情況下,主要的資料處理工作則是在 _loop() 裡完成,以後會說明。因為 _chain() 裡面牽涉到 mpeg audio 解碼的程式,和 libmad 調用的部份、處理緩衝佇列等等比較複雜,將另開篇幅說明。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo