2014-09-12

DYLD_LIBRARY_PATH in mac osx

在Mac上執行Python程式時,有時候會import shared library,而這個shared library可能又link到另一個shared library。如果這三個都是自己build的,在執行上很可能會遇到一個錯誤:

ImportError: dlopen(...): Library not loaded: share2.so
  Referenced from: share1.so
  Reason: image not found

程式架構是這樣的:myPython.py -> share1.so -> share2.so。會出現這個錯誤的原因是,系統不知道去哪裡找share2.so。解決這個問題的方法就是告訴系統去哪裡找自己build出來的share library:

export DYLD_LIBRARY_PATH=/path/to/your/share/library

[1] https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html

Pattern rule in Makefile

最近看到一個Makefile的寫法如下:

.cpp.o: dummy
$(CXX) $(CFLAGS) -c $(SDLFLAGS) $(INCLUDE) $< -o $@

剛開始還找不到每個.cpp編譯的target,後來才發現應該是這個target。

在Makefile裡可以使用pattern rule,'%'代表的是nonempty substring,所以'%.cpp'代表的是所有結尾是'.cpp'的檔案。因此target可以寫成'%.o: %.cpp',這代表任一個'.o'的target,其dependency為同名的'.cpp',例如'abc.o: abc.cpp''test.o: test.cpp'

上面程式碼中的寫法'.cpp.o'等同'%.o: %.cpp',只是使用suffix rule來表示。因為'.cpp''.o'為Makefile認得的檔案,因此可以用suffix rule來表示。

至於'$<''$@'則為automatic variable。'$@'表示target的檔案名稱,而'$<'表示第一個dependency的檔案名稱。

如此一來這個target總算解析完成,Makefile真是博大精深。

Reference
[1] HowTo Write Generic Makefiles
[2] Defining and Redefining Pattern Rules
[3] Old-Fashioned Suffix Rules


2014-09-01

Sublime Text 3

Download site: http://www.sublimetext.com
Settings:
{
    "font_size": 14,
    "translate_tabs_to_spaces": true,
    "highlight_line": true,
    "draw_white_space": "all",
    "trim_trailing_white_space_on_save": true,
    "ensure_newline_at_eof_on_save": true,
    "highlight_modified_tabs": true,
    "bold_folder_labels": true,
    "word_wrap": true
}

Package Control: https://sublime.wbond.net
Packages:
SideBarEnhancemts
SublimeLinter
SublimeCodeIntel
BracketHighlighter
SublimeREPL
All Autocomplete

2014-05-08

Activity Lifecycle

在Android App當中,Activity是最核心的元件(Component),Activity就是App呈現在螢幕上的一個操作頁面,每個Activity都會 有一個Window,上面有GUI讓使用者操作該App,可以說Activity是App的進入點,因此對於Activity的Lifecycle必須有 深刻的了解,才能避免所開發的App在使用過程中,產生不可預期的行為。

首先,Activity總共有三個State,分別是Running、Paused、Stopped。
  • Running:使用者看得到並且可以操作該Activity
  • Paused: 這個State最容易讓人不解跟誤會,因為在這個狀態下,使用者看得到但是無法操作。例如操作該Activity的過程中,Android系統跳出電池電 量不足或是網路斷線的Dialog,這時Dialog沒有占據整個螢幕,而除了Dialog以外的部分為半透明的狀態,因此看得到該Activity,但 是在Dialog消失前,無法操作該Activity,這就是Paused State。當Activity進入這個State,Android系統有可能因為資源不足而砍掉該Activity。
  • Stopped: 當使用者開啟一個新的Activity,原來的Activity會進入Stopped State,這時原有的Activity使用者看不到也無法操作。同樣地,當Activity進入這個State,Android系統有可能因為資源不足 而砍掉該Activity。
了解Activity的狀態的意義後,接下來設計App時才能考慮Activity在不同State之間轉換時必須進行的處理。例如當Activity進入Paused的時候在OnPause()中儲存重要的資訊以便在OnResume()時回復,避免使用者必須重新輸入上次已經輸入過的內容。

上圖為Activity Lifecycle金字塔,圖中列出所有可能的State轉換,最上層又稱為Foreground lifetime,第二層以上為Visible lifetime,而第三層以上為Entire lifetime。

在Foreground lifetime的State會常常變換到其他的State,因此在設計上,OnResume()盡量不要處理太heavy的工作,以免使用者回復到這個App時需要等待較長的時間,而在OnPause()則記得馬上儲存Activity的暫態,以免資料遺失;Visible lifetime的State也是常常會變換,然而這個階段最重要的是管控使用者看得到的Resource,Activity一進入這個階段,就必須當作使用者看得到Activity,因此在OnStart()中要準備好所有要顯示給使用者的Resource,而在OnStop()釋放掉占用的Resource;最後在Activity進入Entire lifetime時,必須建立整個Activity的global state,通常會先在OnCreate()準備好使用者不會看到的Resource,而使用者看得到的Resource則在OnStart()才準備,最後在OnDestroy()釋放所有占用的Resource。

有一點值得注意,Android系統在砍掉Activity所占用的Resource時,會按照OnPause()-->OnStop()-->OnDestroy()的順序執行,因此只要在正確的地方撰寫釋放Resource的程式碼即可,不需要額外處理釋放順序不對造成的錯誤。唯一的例外是,在OnCreate()中呼叫Activity的finish(),這時Android系統會直接執行該Activity的OnDestroy()。通常會這樣做都是利用一個暫時的Activity1來啟動另一個Activity2,Activity1不需要額外的Resource來處理其他工作。

最後,出個小問題給大家想想,在某個Activity頁面中,按下Android的BACKHOME對該Activity會造成甚麼不一樣的現象?

[1] 圖一來自http://www.bignerdranch.com/we-write/android-programming
[2] 圖二來自https://developer.android.com/training/basics/activity-lifecycle/starting.html

2014-04-28

What is UltraViolet?


UltraViolet是DECE (Digital Entertainment Content Ecosystem)這個組織成員制定的Ecosystem,由命名來看似乎是要取代BD成為下一代的影音標準格式,但我認為應該把它想成是為了補足BD缺少的特色 -- Cloud

試 想唱片業從MP3出來後開始一蹶不振,慢慢地開始接受iTunes的數位授權商業模式,直到最近的Spotfiy及KKBox,有沒有發現音樂從實體的載 具演變成數位化格式,再進步到網路雲端的模式。Why?因為網路越來越發達,手持裝置也越來越普及,消費者希望能隨時隨地從不同的裝置享受這些服務。

反 觀電影業,實體載具對消費者帶來使用上的不便,必須盡早解開這層枷鎖,不能讓iTunes專美於前。因此除了Disney之外的Studio都加入 DECE,包含Fox、SONY、NBC-Universal、Paramount、Warner Bros.,希望藉由這個新的Ecosystem來擴張市場。
Cloud的特性在於
Share anytime, anywhere
UltraViolet的概念有三大主軸Account+Device+Content。

Account 顧名思義就是帳號,Account跟User很容易弄錯,Account存在的目的在於付費,一個Account就是一個付費的單位。在 UltraViolet中,一個Account可以擁有6個User,如果一家人共用同一個Account的話,家庭成員每個User都可以共享買過的 Content,如此一來,Share就簡單多了。

Device是播放Content的裝置,不分軟硬體,一個Account可以綁定12台Device,平均一個User可以綁定2台Device,Account中的任一台Device皆可以播放屬於該Account的所有Content,Anytime and anywhere

最 後來看看Content,UltraViolet定義一種新的Container -- CFF (Common File Format),副檔名為uvu、uvvu。CFF非常類似MP4,Video的編碼為AVC/H.264,Audio的編碼主要為AAC,其他還支援 Dolby及DTS,Subtitle的格式為TTML (Timed Text Markup Language)。雖然解析度最高支援到Full HD,但是畫質也比不上BD,也因此檔案的大小也小不少,畢竟UltraViolet主打的特色是Share anytime, anywhere

下次來談談UltraViolet這個Ecosystem中的各個角色。