Android sdk_addon 補充

上次雖然是可以順利 build 出 addon zip 檔案,可是要包進去的 java library 大小卻為 0,真是讓人錯愕。

有人有問跟我一樣的問題,可是沒人回。我接著回,然後問他解了沒。但我的回文一直沒真的上去,真怪。

這篇是說自己加了 <used-library ndroid:name=”com.example.android.platform_library”/> 就可以用,build 的方法就是一樣。

接著找到幾篇有用的文章,解析 Android build system 的文章:

之後是埋頭自己在看,看到了奇妙的用法,長見識了。Makefile 裡 target 的 dependencies 可以寫這樣:aa: bb | cc ,make 執行時,會先試著執行 bb target,如果 bb target 有確實產生檔案出來,就不執行 cc target;若 bb target 沒產生檔案出來,就執行 cc target 。

Android.mk 裡則是可以用 $(info message) 來顯示你想看到的訊息,如果是在 target 之下的指令,則可以善用 echo、$^、$@。

最後是讀了這篇,前面看起來是跟我一樣的錯誤,然後認為是 mkstubs 的問題,所以他們進行實驗,加 PRODUCT_SDK_ADDON_STUB_DEFS 之後就可以了!!

所以,在 sample_addon.mk 加上 PRODUCT_SDK_ADDON_STUB_DEFS := device/sample/products/xyz.defs,而 xyz.defs 裡面則是: +com.example.android.platform_library.* ,打完收工!!

Android sdk_addon

接到任務,說要做 sdk_addon.zip 給客戶使用,客戶有提供一些資訊,基本上就是要參考 device/sample 下的檔案來做,我把 frameworks 跟 products 都依樣建立了,這兩個資料夾下的必要檔案(frameworks/Android.mk跟products/*.ini)也都做了修改,可是怎麼試都失敗。

上網 Google 了一下,找到這篇:Android SDK Add-on Configure, Compile and Release ,一樣也是提到 device/sample ,基本上算是相當清楚,但是在我的環境下仍然失敗。

後來靜下心來看,相對照 sample 以後,發現其實 device/myproduct/Android.mk 裏面已經有去 include 其下所有 Android.mk,這點跟 device/sample/Android.mk 裏面一樣。device/sample 下沒有 AndroidProduct.mk,而是在 device/sample/products 下,裏面則是去 include device/sample/products/sample_addon.mk 。那我的 device/myproduct 下已經有 AndroidProduct.mk 而且寫了好多東西,因此,我就參考 device/sample/products/sample_addon.mk 增加了 PRODUCT_SDK_ADDON_* 相關的變數,然後把 PRODUCT_PACKAGES 從 := 改為 += 。又因為公司合作的開發SDK比較機車,有些 library 都是用複製,而非 build 的,所以再參考之前的 build script ,稍稍修改了一下,這樣就可以 build 出 SDK addon 了,產出的檔案是放在 out/host/linux-x86/sdk_addon 下。

補充:後來編譯 mydroid 時出問題了,發現要在 PRODUCT_SDK_ADDON_* 的前後加上 ifneq ($(filter sdk_addon,$(MAKECMDGOALS)),) 跟 endif 才可以避免無法編譯 mydroid 的窘境。

 

電影流水帳(2012/5/17~2012/6/1)

Sucker Punch - Cosplay Epitanime 2011

  • Sucker Punch(IMDB, Wikipedia),中譯:殺客同萌。我個人認為這部電影的藝術性大於他的故事性,在 Babydoll 跳舞進入幻境時,裡面的場景跟配樂都非常的棒,令人讚嘆不已,但是坦白說,故事真的就看的不是很懂了。片尾有演女醫師與舞廳主人合唱的歌舞,相當讚,很值得一看。Babydoll 跟她的妹妹在母親死掉以後,父親(不知道是繼父還是親生的父親)企圖侵犯 Babydoll 的妹妹,Babydoll 為了保護妹妹,開槍打父親,卻因此害死妹妹。父親利用金錢的力量把 Babydoll 送進精神病院,想就此得到遺產。Babydoll 進去精神病院以後,場景跟風格一轉,監獄變成舞廳,裡面的病人變成 Dancer,於是就展開 Babydoll 的大冒險。為了要逃出去,他們必須取得鑰匙、刀子、地圖、打火機…等物品,每次取得物品,都是一次跳舞跟炫麗的冒險場景,他們就這樣取得了物品,並且順利讓 Sweet Pea 逃出。對,最後不是讓 Babydoll 逃出,而是 Sweet Pea,很妙的安排,而 Babydoll 在協助 Sweet Pea 逃出之後,變成了沒有感覺的病人。
  • Mission: Impossible – Ghost Protocol (IMDB, Wikipedia),中譯:不可能的任務4-鬼影行動。前面一大半是跟班上同學在專案管理課的時候看的,老師要我們看看人家怎麼做專案管理 (這當然是鬼扯蛋,哈)。Hunter 被關在監獄裡,然後被救出來,接著就執行任務,去克里姆林宮拿發射裝置,結果失敗,克里姆林宮發生大爆炸。這個結果導致美國白宮將他的組織解散,可是他們仍然要在沒有資源的情況下阻止敵人毀滅世界。接著他們就去杜拜,安排了一次巧妙的會面把發射裝置跟密碼都拿到手,但敵人同樣也都拿到手,在杜拜的行動,算是失敗。最後就只能去印度阻止敵人發射核彈,當然是有個皆大歡喜的結局。最精彩的段落,當是在杜拜第1高樓的那段,班上一起在看的時候,看到 Hunter 差點掉下去,大家是異口同聲叫出來。

 

gedit plugin

因為想把一些文字處理動作集中一次用 python 來處理,然後處理完還要可以手動編輯,就想到 gedit 可以自訂 plugin,之前也沒試過,就試試看。

一開始我是找到 gedit 3 的 plugin howto ,看到一半發現 plugin 路徑怪怪的,跟我現在環境裡的路徑不一樣,才發現是 3.0 的。回頭翻到文章開頭,才看到 gedit 2 的 plugin howto ,就依法施為,大致上沒什麼問題。這邊分享幾個心得:

  1. 除錯可以用 print,但執行 gedit 時,要在 terminal 下,這樣才會看的到這些印出的訊息。
  2. 基本上 plugin howto 裡寫的相當清楚,但你需要搭配 pygtk2 references 來看,例如 howto 裡提到 gedit.Window.get_active_document 會傳回 gedit.Document,再去看 gedit.Document 一節裏面,裏面說 gedit.Document 就是根植於 gtksourcebuffer,再去找到 gtksourcebuffer (在 gtksourceview 網站),裏面又提到是繼承自 gtktextbuffer,再去翻 gtktextbuffer ,就知道有哪些函式可用。
  3. 對 gtk 的處理要有一定的了解。

 

PDF 操作個人經驗談

整理一下使用 PDF 的經驗談,作為日後參考。

閱讀 PDF:Windows 上主要是用 Foxit Reader ,偶爾會用 Nitro PDF reader 。用 Foxit Reader 是求快,用 Nitro PDF reader 的好處是可以匯出 PDF 裡的圖片。Linux 上我也是用 Foxit Reader ,然後以預設的 GNOME evince 為輔。在 PDF 檔上下標記? 我沒這個需求,所以沒用過,不知道這幾套對這功能的支援如何。

產出 PDF:我有用過的幾套免費軟體,都是以虛擬印表機的形式存在,所以只要選定指定的印表機進行列印,就可以產出 PDF。在 Windows 下,我使用過的軟體有 PDF CreatordoPDF Nitro PDF Creator (好像是裝 Nitro PDF reader時裝上的),都不錯用,會用三套,是因為有時候會有字出不來的情況。在 Linux 上就最方便了,不必另外安裝,一樣也是列印時,指定列印到檔案即可。另外值得一提的是 Open/Libre Office ,裡面有提供獨立的選項,可以直接匯出 PDF。

合併與分割:如果只是簡單的合併跟分割,我是用 PDFSam ,這個可愛的工具是用 Java 寫的,Linux / Windows 上都通用。如果需要一次裁出好幾頁或是編排順序的話,Linux 上我是用 PDFMod ,Windows 上則是用從疑似從 PDFMod 分支出來的 Junko 。

編輯:我沒用到過,也就是說我到目前為止還沒有這個需求,等以後有遇到再說吧。我第一個會試試看的可能是 Open/Libre Office ,去年有聽說有加入這功能。

 

 

電影流水帳(2012/4/11~2012/5/16)

隔了一個多月沒看電影,主要是為了期中考,利用中午時間唸書,所以就停了好一陣子。
DSC_8986

  • 燃燒吧!歐吉桑(IMDB, Wikipedia)。本來預期會很好看的片,看了之後,覺得故事本身並不是很強,所以整個感覺上就很片段,缺少了連續性。故事是圍繞在一個即將被拆除的眷村-光榮新村,有一個生存遊戲的團隊利用這個眷村練習生存遊戲,結果造成原本還留在村子裡的老榮民困擾。老榮民們很生氣,就決定起來對抗他們。故事裡的第一個衝突點,是李伯跟他的孫子,因為孫子小伍遲遲找不到工作,讓求好心切的李伯用話刺激,刺激的結果就是關係惡化。第二個衝突點,是在村子裡賣麵老闆娘的醫生兒子,與生存遊戲團隊的新隊長周莉雅是情侶,因為以為瞭解彼此,卻發現彼此都有事情瞞著對方。第3個衝突點是生存遊戲團隊原來的隊長駭客被換掉,成為副隊長,而新的隊長周莉雅是空降的ABC。第4個衝突點是村子裡孔伯反對對抗生存團隊,而大部分老伯伯決定起來對抗。在接近結尾的時候,因為生存遊戲中,姜伯差點心肌梗塞而過逝,導致了新的變化。小伍與李伯復合,孔伯跟李伯也復合,隨著周莉雅的解職,莉雅與醫生也解開了誤會,這一方團結起來,決定再跟駭客帶領的生存遊戲團隊比賽一次。這邊蠻突兀的,也很莫名其妙,總之,就比賽了。比賽到了最後,剩下李伯跟駭客比拼,想不到駭客卡彈,就輸了這場比賽。後來,光榮新村拆了,生存遊戲團隊出國比賽,得到很好的名次,然後有人來挑戰這些榮民。
  • Tower Heist(IMDB, Wikipedia),中譯:神偷軍團。原本以為可能不好看的片,看完以後,覺得還不錯,導演對於氣氛跟情結的掌握都很不錯,沒有冷場。Josh 是管理大樓的經理,而Shaw則是大樓的所有者。Shaw因為被控告詐欺,所以財產被查辦、扣押,大樓員工的錢之前有委請Shaw代為管理,結果這下也沒了。看門員因此跑去自殺,Josh很生氣,跑去找Shaw理論,結果被炒了。透過FBI特工的消息,知道Shaw還藏有錢在樓上,於是Josh決定找人一起去偷。人找齊了,也找了家隔壁的Slide來教跟計畫,終於他們選定在感恩節下手,除了Slide背叛跟Charlie回任為大樓經理之外,事情還算順利,他們順利到了樓上,找到也打開了保險櫃,但是裡面是空的。Slide跟Josh吵了起來,不小心的流彈打到了Shaw珍藏的車子,於是他們發現車子是用純金打造的,難怪Shaw貴而重之。計畫改變了,變成偷車子,偷車子的過程裡,因為車子很大,所以很驚險。不過他們還是順利的藏起了車子,幾個成員都分散逃走,但最後還是被趕回來的FBI特務逮到。經過利益的交換,FBI取得Shaw想藏起來的帳冊,成員都被釋放,Josh被判兩年刑期,Shaw罪證確鑿入獄,而車子呢?就在樓頂的游泳池裡,他們把車子解體,分寄給大樓的員工,算是皆大歡喜。

mono xsp and phalanger

修正策略以後,就決定先在 Windows 上安裝 mono。很快地,我安裝好 2.11 ,想不到這卻是卡關的開始,這一版的 xsp 很奇怪,老是會丟出 System.IO.FileNotFoundException ,甚至連正常的 aspx 都無法處理,所以最後就乾脆放棄了。在這段過程裡,稍微參考了以前加 boo 支援的 web.config 。

今天早上就立馬移除了 mono 2.11,改安裝 2.10.8 ,這是比較穩定的一版,為了怕跟昨天一樣卡關,就先試了 aspx,這次就可以了。然後拿之前加 boo 支援的 web.config ,參考 phalanger configuration 來修改。昨天是走馬看花,今天比較仔細看過之後,發現這網頁上提供的設定其實有些問題。我個人是這樣改的:

  1. 首先複製最下面的 local app.config/web.config 一節的設定,先存為 web.config。
  2. 修改 paths ,把裡面都註解掉,只留下 DynamicWrappers 與 Libraries,接著把 “{PATH}\” 移掉,所以 DynamicWrappers 的內容就是 dynamic,Libraries 內容就是 bin 。
  3. 修改 classLibrary ,這邊可以大刀闊斧砍光光,然後參考上面 global machine.config 裡的第3段設定,就加 PhpNetClassLibrary 跟 PhpNetXmlDom 這兩個 assembly 就可以。
  4. 把 global machine.config 裡的第1段設定跟第2段設定加到 web.config 裡,這兩段,都是在 configuration 裡。
  5. 把 global web.config 裡的設定,就是把 httpHandlers 加到 system.web 裡。
  6. 尋找 globalization ,把 value 改為 utf-8。
  7. 大功告成。

接下來,把 phalanger binaries 裡的 .dll 都放到 bin 目錄下,然後建立 dynamic 目錄,就可以開始寫你的 .php 了。

寫好以後,就打開 mono command prompt ,切換到開發目錄下,執行 xsp4 –port 8080 –root . ,以啟動 web server。再打開你的瀏覽器,在網址列輸入 http://localhost:8080/index.php 就可以了。

phalanger 會進行即時編譯,編譯好的 .dll 會放在 dynamic 目錄下。

最後放上我的 web.config:

svn篩選更動的部份並提交

人懶得打字,就要寫個script來輔助篩選…

一般來說都是先用 svn status 看改了些什麼,然後才下 svn commit 提交。可是如果檔案很多,大概就看不完也打不完,下面這個 script 就是先利用 awk 篩掉 ? 的部份,這些是未納入版本控制的檔案,就不顯示,有需要,要記得要先用 svn add 加入。然後篩選完,就順便組出 dialog 指令需要的格式,最後再用 dialog 來顯示出可勾選的對話視窗。

[bash]
#!/bin/bash

FILES=$(svn status | awk ‘$1 !~ /^?/{printf(“%s %s off “, $2, $1);}’)
CMD=”dialog –separate-output –stdout –checklist Modified/Add/Delete 24 80 20 \
$FILES”
SELECTED=$($CMD)

if [ “$SELECTED” == “” ]; then
echo “Select nothing.”
else
echo “svn commit $SELECTED”
fi
[/bash]

ifconfig, awk and MAC

朋友丟給我一個指令,他說想把取得的 MAC Address 裡的 ‘:’ 拿掉,第一個指令是這樣子的 ifconfig | grep HWaddr | awk ‘{print $5}’

我先給他第一個版本:ifconfig | grep HWaddr | awk ‘{print $5}’ | awk -F ‘:’ ‘{printf(“%s%s%s%s%s%s\n”, $1,$2,$3,$4,$5,$6);}’ ,這是把輸出結果丟給 awk ,然後利用 printf 印出。

接著,我想到 sed,所以我就用 ifconfig | grep HWaddr | awk ‘{print $5}’ | sed ‘s/://g’ 把 ‘:’ 替換掉。

然後我不死心,之前有試過 awk 的 sub,想要一次在 awk 裡完成,試了一會,發現我應該使用 gsub,所以就是 ifconfig | grep HWaddr | awk ‘{gsub(/\:/,””,$5);print $5}’

最後想到之前在某網站被指點說,awk 裡也可以做 grep,不用再串一個 grep,這樣可以少掉一個指令,會比較快。於是最後的結果就是 ifconfig | awk ‘/HWaddr/{gsub(/\:/,””,$5);print $5}’ ,兩個指令就收工了。

git-svn無法dcommit

之前都忘記要 git svn dcommit,今天才想到要提交到伺服器,打指令時就出現 “File or directory ‘xxx’ is out of date;” 的錯誤訊息,試著先 git svn fetch 再 git svn rebase,git svn rebase 也是告訴我錯誤,但他多了一個提示,說可以試著刪掉 .git/rebase-apply 目錄,再 rebase 一次。為了以防萬一,我先把 .git/rebase-apply 備份起來,刪掉,再做 rebase,這次告訴我說有衝突,於是我解決掉該檔案的衝突,用 git add 加回去之後,再用 git rebase –continue 繼續合併的作業,最後就可以用 git svn dcommit 了。