Miracast in Android 小整理

大家都知道 Android 4.2 版支持了以前叫做 WIFI Display 的 Miracast. 看了同事轉寄的網路文章 [1], 才知道 Android 連架構都配合 Miracast 做了修改.

首先考量的是, 使用者需要把手機上的畫面輸出到電視上分享給大家, 卻不能讓大家都看見他/她怎麼在鍵盤上按密碼. 所以 surfaceflinger 就不能把虛擬鍵盤或是密碼框的這一層投射出去. 換言之, 把整個 display planes  (什麼 V1, V2, OSD1, OSD2, SUB1, SUB2) 都 mix 後才輸出的那張圖, 反而不是可以公開的.

因此, surfaceflinger 裡面就多了個 display device 的抽象層.

DISPLAY_PRIMARY:  Android 手機的螢幕

DISPLAY_RXTERNAL: HDMI 設備, 如 TV

DISPLAY_VIRTUAL: WIFI Display, 即 Miracast.

1357478805_4074

對於 virtual 的裝置, Android 並不準備它的 frame buffer.從下面這段 code 中可以看出, 每一個 Display Device 在產生的時候, 都會參考 state.isVirtualDisplay 是否為真? 進而決定 hw 這個 class 的內容. Miracast 顯然就和 HDMI, 和 local 螢幕不同類. 可見得在 HDMI 以 MHL (Mobile High-Definition Link) 接電視的情況下是允許看到輸入密碼視窗的, 但 Miracast 以 WIFI 無線時不可以顯示.

1357478788_3356

其中 static_cast< sp<ISurfaceTexture>> 表示指定型別為 sp<ISurfaceTexture>, 也就是 ISurfaceTexture 的 smart pointer. Smart pointer 也是個 pointer, 它有助於在不同的地方 create 和 destroy, 因此可以靈活地運用並減少記憶體丟失 (或曰"洩漏").它的原文是:

Smart pointers ensure we properly destroy an object even if its creation and destruction are widely separated. They make functions simpler and safer by ensuring that no matter how many different exit paths exist, local objects are always cleaned up correctly. They help enforce that exactly one object owns another object at any given time, preventing both leaks and double-frees.[2]

最後 Android 做 composer 的時候, 會對每一種顯示設備 (共 mDisplays.size 種) 檢查是否 dirty (需要更新)? 並且用 hw->canDraw() 判斷能不能畫? 如果不能畫, 連 dirty 也不畫.在 2011 年的時候, 就有人抱怨過 hw->flip 為什麼在 hw->canDraw() 的前面執行 [3]? 導致 Android suspend 的時候都還在 flip. 看來 Android 是從善如流, 改為優先判斷 canDraw() 了.

1357478824_6904

[REF]

1.Android Wi-Fi Display 介紹

2.Smart Pointer Guidelines

3.Android的Suspend​

HDMI CEC 的一點補充

自從遇見 HDMI (High Definition Multimedia Interface) 的 CEC (Consumer Electronics Control ) 之後, 就被這個又方便又容易出問題的功能發了很多 bug.

有時候它可以用 device (例如 DVD Player, BD Player, Digital Media Player…等等, 簡稱 box 好了) 的搖控器控制電視, 有時候又反過來是用電視的搖控器控制 box. 雖然它們的目的都是減少使用者拿兩支以上搖控器的不便, 但實作起來卻有很大的差異.

有個規格 (protocol) 叫作 RC pass through. RC (remote pass through) 就是搖控器, pass through 就是控制到另外一台裝置. 例如用電視遙控器去播 box. 規格上並沒有說不能用盒子的遙控器去控制電視, 所以兩個方向都有可能. This feature is used to pass remote control commands received by one device (typically the TV) through to another device in the network.

首先我們把 TV 切到 box 所在的 HDMI port, 然後拿電視的遙控器來控制 box 就可以了. 前提是兩台裝置都支援 RC pass through. 當然, 規格不能保證所有的搖控器鍵值都可以傳給別台裝置. 合法的功能寫在 HDMI 1.4 規格的 table 30.

CEC-1.4-Table-30-620x200

其實 HDMI 1.3 講得比較簡單易懂. HDMI 1.4 裡面引進了 <feature abort> 的觀念, 遇到某些不支援的 protocol 或是 command 時, 產生的結果也會不一樣.  因此 HDMI 1.4 還要參考的表格是 table 20, 27 和 27 三張.  HDMI 1.3 裡面只有一個 table 23 則對應到 HDMI 1.4 的 table 30 而已. HDMI 1.4 又定義了久按TV 遙控器按件不放時, 則每隔 450ms (建議值, 可以定在 200~500 ms) 要重送一次鍵值到 box (反向亦然).

雖然 table 30 裡面功能鍵眾多, 其中只有一部分 (0x60~0x6D) 是 deterministic (決定性的) UI function. 這些按鍵的功能不受到其它條件的影響, 按了就要有正確的反應, 例如 power on, power off 時, 毋須考慮什麼事情正做到一半.

另外一個類似的 protocol 是 device menual control. 同樣地, 看了 HDMI 1.3 的規格就會覺得自己很快懂了. 但是看了 HDMI 1.4 就會覺得好複雜. 它的主要功能就是讓 TV 把 box 的控制面板 (control menu) 叫出來, 這樣就可以真正地操作 box. 否則若是 box 上有什麼特異功能, 光靠 TV 的遙控器也無法做到!

舉個誇張一點的例子, 如果搖控器按"上上下下左左右右","next","previous" 可以叫出某個破解功能, 只用 RC pass through 就很難保證哪些 key 按了 400 ms, 哪些是 600 ms. 在 device menu control 假設可以看到畫面上每個鍵被按到後的反白, 應該就能確定自己按對了. 假如 box 支援虛擬小鍵盤, 也是只有 device menu control 可以輕易使用此功能.

另外, 按照規格上的說法, 它只能單向地由 TV 叫出 box 的 control menu.

HDMI-2-CEC-Case

我讀 «在巷口遇見經濟學大師»

我記得以前就常在週刊上看到類似這個 “以輕鬆易懂文字剖析常見的生活經濟學" 的專欄. 當時沒有特別留意到作者是誰? 甚至還以為這是翻譯自國外某個大師的單元. 想不到前幾天看到它變成一本書了, 於此就買了回來看.

作者趙建勇先生其實是財經記者, 寫專欄也是他的本業. 由於趙先生有大眾傳播的學士和經濟學的碩士, 也難怪能夠把經濟學的原理寫得那麼生動. 大家可以由本書的目錄就理解到, 它就是很單純的講小故事, 畫插畫和舉例子; 偶爾做一些相互的比對.

比方說, 暢銷書往往可以打折, 但暢銷電影的票價反而賣更貴! (目錄中我標成藍色字) 為什麼? 因為書賣掉後的空位可以擺另一本書, 使得現金流愈來愈大. 但是電影院的總座位數是有限的, 便宜賣票給大家, 並不能帶來更大的銷售量, 只會使收入減少. 這點如果想通了, 大家應該也會回答這兩問了嗎!?

4.為什麼預訂機票可以打折,現買機票價格卻很高,而某些劇場的演出,門票的現買價卻會降低?

10.為什麼當顧客臨時取消預約的時候,飯店以及航空公司要收取高額的手續費,而租車公司卻不收呢?

呵呵! 還是有不一樣的地方喔. 要是什麼都那麼簡單, 恐怕也就不能出書了. 雖然機票和劇場的座位都是有限的, 但是他們面對的客層不同. 搭飛機的人目的非常明確, 故捨得花大錢只求上得了飛機. 應該沒有人臨時因為機票便宜而決定出國的. 如果臨時要買票, 就算是到每家航空公司都比價看看, 也不會有好價錢.

而劇場若是夠紅, 門票可能已經早就秒殺了. 若是還有空位, 當然能賣多少就算多少. 特別是賣職棒門票的黃牛應該對此很有心得. 熱門的幾場要提早一個月買票, 冷門的時候, 黃牛只求不虧錢…

當然我是很喜歡這本書的, 開卷之後頭腦也變靈活了點. 大家看到下面的目錄, 若是發現那個標題想不通, 就去翻翻書吧!

[本書目錄]

繼續閱讀「我讀 «在巷口遇見經濟學大師»」

我讀 «存好股, 我穩穩賺!»

這本書是上次去巨城時,為了抵停車費順便買的書 (結果花更多???).買它主要的原因是要參考價值型股票如果上漲了怎麼辦? 像是永記、中華食品…等等.

其實溫國信先生的這本書是寫給新手, 它詳細地說了怎麼看財務報表的重點, 連怎麼什麼是 EPS, ETF…都有解釋. 這些部分快快翻過即可, 值得畫重點的是下面幾項:

1. 不只是國外所得可以分離課稅 10%, 買台灣的 REITs (不動產投資信託)也可以分離課稅.[ref 1]

台灣一共只有出過 8 支, 卻有已經有 2 支清算下市下櫃, 經營地不太好. 存活下來的 6 支 REITs 每天成交量約 100~200 張, 只有 01002T 最熱門, 但上週五 (4/19) 也成交不到 500 張, 具有流動性風險. 想買的人容易買貴, 想賣的人容易賣低. 假如搶進最近漲不少的 01002T (17.28 –> 19.86 NTD), 殖利率大概只有 2% 多一點 (假如還是配 0.45 元左右).

2. 不要擔心健保補充費

這個大家應該都知道, 其實它影響不是很大. 只是非常不合理.

3. 假設股票的殖利率在 16 倍以下為便宜價, 20 倍為合理價, 32 倍以上為昂貴價.便宜的時候可以買進, 昂貴的時候可以賣出一點. 要存好股就要逢低買進. 所謂的低就是乏人問津, 線型如字型.買在殖利率 16 倍以下, 可以獲得 6.25% 的殖利率. 要是股價突然飆高, 可以獲得 80% 的獲利 – 假如原本買在 16 倍殖利率, 就相當於 2.88 倍殖利率賣出. 這三個關鍵字就叫做 168 曲線.

以前看過一個數據是美國例年來的本益比是 14 倍. 不過最近美股幾近歷史高點, 獲利卻沒有增加 – 據說是庫藏股暴增, 歷史本益比應該也上升了. 總之本益比不要超過 20 倍應該沒問題. 作者用的數字是殖利率而不是本益比, 其中的差別就在於公司賺錢之後, 不一定會用現金股利把所賺的錢都分出來, 必然會保留一部分. 所以殖利率一般會小於本益比.從資本公積發股利則是例外.

從財報上來看, 帳面上的獲利也未必是真正的獲利 – 例如應收帳款很多, 準備金未提撥等等, 所以發得出現金的部分, 作者才把它當作獲利. 這導致本書的精神都放在殖利率, 而不是本益比.

至於價值型的股票漲高之後, 作者比較偏好在昂貴價以上賣掉 (詳見本書 p197, 問題 12 的解答), 特別是在一次性利多曝光 (如處分土地) 導致股價大漲時. 我個人現在的結論是: 要關注本業的業績是否也在成長? 由於現在 IFRS 規範只需要出半年報和年報; 我們很容易知道公司的營收增加, 但比較難得知公司是否獲利也增加? 因此需要更高的判斷力, 搶先估計出未來的 EPS 才能做出正確的判斷. 儒鴻是一支讓我賺了倍數的股票, 不過事後還是覺得賣得早了. 戰術可能要這樣設計:

(1) 一次性利多出現 –> 賣在昂貴價以上

(2) 營收持續成長 –> 重新估計本益比, 考慮股東會行情、或是為了棄權而先做技術性拉抬

4. 景氣循環股不宜列入長期投資的標的

就算是非景氣循環股, 也要剔除 5 年內過高的一次配息, 以免拉高了計算的基礎.

另外我想到台灣公司有一招是既發現金股利, 又現金增資. 增資一次可以發好幾年現金股利, 這實在是令人無言了.

以上大概就是本書對我有貢獻的部份了. 因為我們平常很容易受人家的影響 (特別是理專, 哈!) 所以還是要求一些平安符來讓自己定下心來. 本書就算是一種平安符了! 這本書淺顯易懂, 很適合新手去讀. 唯一有個筆誤是 p188, “它美股淨值 (EPS) 高達 23 元..", 應該是 “每股盈餘 (EPS) 高達 23 元" , 宸鴻被罵翻天時, EPS 是 23 元, 如果淨值 23 元, 比咱們海產店 – 螃蟹公司的 36 元還低呢.

[Ref]

1. 臺灣不動產投資信託

2. 基本市況報導網站

 

Samba 再舞

原本以為 Samba 的設定對我已經不是問題了, 不過這天拿到一台全新的 server 測試時, 真讓我傷了不少腦筋.

首先不就是去安裝一套 samba 嗎?然後改改 smb.conf, /etc/init.d/smb restart, 從 PC 連過去不就結了?我原本就是這樣想的, 不過 PC 始終連不上這台新 server. 由於別台 server 的 samba 我都能連得上, 所以 PC 的防火牆顯然沒有問題. 還是來關心 smb.conf 吧!

把 passdb backend =tdbsam ? 改到 tdbsam 時,也看到註解上直接說 smbpasswd 那套都過時了, 現在不是 tdbsam 就是 ldapsam. SAM 大概就是指 Samba 了? LDAP 是 Light Directory Access Protocol,設定 ldapsam 帳號密碼會去問 LDAP server,適用於大量的使用者.而 tdbsam (Trivial DataBase)可以直接支援這台 server 上的用戶, 適用於 250 個以下的使用者 [ref 1]. 不過連 security=share 都不靈, 顯然和帳號密碼都無關.

接著很自然就會想到, Google 一下 “Samba 連不上" 這個關鍵字. 呵呵, Google 果然給我們很多建議, 首先就是目錄的權限要設對. 這個容易, 把它們的 mode 都設成 777 就結了, 但這個也不是原因. 其他人遇到和我類似的狀況時, 往往都是孤兒文 – 有人問沒人答.

沒辦法, 我只好去看 log 了 – Windows 的 “診斷". 其實 Windows 的 “疑難排解" 很難用, 這次真的是不得已才去研究它.

原來是 port 445 沒回應. 那麼怎麼把 server 的 port 445 打開呢?首先要去改 iptables [ref 2].

vi ./etc/sysconfig/iptables

加入兩行規則, 把 port 445 的 TCP 和 UDP 都改為接受.

-A INPUT -m state — state NEW -m tcp -p tcp -s 172.26.0.0/16 –dport 445 -J ACCEPT

-A INPUT -m state — state NEW -m udp -p udp -s 172.26.0.0/16 –dport 445 -J ACCEPT

其中, 192.168.0.0/16 的 代表 mask  255:255:0:0, 所以公司裡面不同網段的 IP 都可以連得上. 關於 32~0 各自代表 mask 值多少, 請參照 [ref 3].數字愈小代表接受 IP 的範圍愈大. 
然後重啟防火牆, 
service iptables restart

果然, 現在新增一個網路連線磁碟機的時候, 所有 smb.conf 裡面設定的目錄都自動跑出來讓我選了.

[ref]

1. Howto setup Samba Server (File Server) With tdbsam Backend 

2. 邁向 RHCE 之路 (Day29) – Samba 檔案分享伺服器

3. Classless Inter-Domain Routing