Calibre小補強

是這樣的,我在公司的電腦安裝了Calibre,想利用send to kindle把電子書寄到指定的e-mail位址,這樣Kindle就會自動更新。但是公司的郵件伺服器不提供SMTP,而Calibre本身的郵件設定又只有跟SMTP相關的部份,因此只能作罷。

這幾天想了又想,本來已經放棄,想要開始hack Calibre源碼,自己作一個 plugin 來補強了。但是正好看到有Open With這個 plugin ,靈機一動,就想到有這個,不就可以自己寫一個 script 來搭配使用了嗎?於是就開始實驗。

  1. 先開始一個 sendmail.vbs 檔案,然後利用 WScript.Arguments 來取參數。這裡首先遇到的問題是 Calibre 直接呼叫 sendmail.vbs 時,會出現 Error 193 的錯誤。這是因為 python subprocess 模組(Calibre是用Python寫得)不認為 sendmail.vbs 可以被執行,所以要繞路一下,多寫一個 sendmail.cmd,裡面則是用 wscript sendmail.vbs 來呼叫,這樣就可以了。
  2. 取得的參數是帶有完整路徑的檔名,因為我不想郵件的主旨又臭又長,所以就用 Scripting.FileSystemObject 的 GetFileName ,這樣就可以只取得檔案名稱。
  3. 寄信,需要附件,我是參考這篇,利用 Outlook 來寄信。使用 Outlook 寄信會跳出一個安全警告,這個沒辦法避掉,要避掉就只能改用 CDO 或其他方式,暫時就這樣用吧。

 

django-navbar

django-navbar 簡單說就是提供 navigation 的解決方案,類同於 ASP.Net 裡的 sitemap。

使用方法不難,但也讓我摸索了一陣子,這邊記錄一下:

  1. INSTALLED_APPS 加入 navbar
  2. TEMPLATE_CONTEXT_PROCESSORS 要加入 “navbar.context_processors.crumbs”, “navbar.context_processors.navbar”, “navbar.context_processors.navtree”, “navbar.context_processors.navbars”,預設原來的 settings 裡並沒有 TEMPLATE_CONTEXT_PROCESSORS,所以要自己加。但不是只加入這4個就好,而是還要加入原來的幾個
  3. 要 syncdb ,這會加入兩個 table。
  4. admin 裡會多出 NavBarEntry 的項目設置,注意:在 admin 設置完成以後,要重新 runserver,這是因為 navbar 是把資料預先塞到 Context Processor 裡,只有一開始才會去資料庫撈資料。
  5. 樣板有好幾個用法,但都要先 {%load navbar%},這可以參考 navbar/templates/navbar/ 下的檔案來進行使用。
  6. 有提供 breadcrumbs (就類似 “首頁 / 大功能 / 小功能” 這樣),但是沒有提供樣板,你可以自己刻,變數是在 crumbs 裡,用 {{ crumbs }} 就可以看到。

電影流水帳(2012/6/15~2012/6/29)

6.1.12 - "Piranha 3DD"

  • Colombiana(IMDB, Wikipedia),中譯:黑蘭嬌。九歲小女孩的父親想要洗手不幹,老大不想,就把他全家滅了口。小女孩很幸運,靠著父親留下的證據跟快腳,得到美國庇護,逃出了哥倫比亞,到美國投靠叔叔。小女孩跟叔叔表示不想唸書,想要當殺手幫父母復仇,叔叔很清楚的告訴他,不管怎麼樣都要唸書,學校所教的是我沒辦法教你的。於是時光飛逝,小女孩長大成人成了一個獨當一面的女殺手。在殺了某個人之後,FBI決定公開連續殺人事件,於是她殺人的手法也曝光,她的叔叔很生氣,說這樣會害了整個家族。果然過了不久,叔叔的整個家族都死光了,凶手一樣是當初害死她父母的人,她非常後悔,也很生氣,就對 FBI 負責偵辦的人下手,逼迫他去找出當初害死她全家的人的地址。原來當初害死她父母的人也透過美國 CIA 的證人保護計畫而躲了起來,經過施壓與威嚇 CIA 負責該案件的人之後,終於取得地址,然後展開復仇。不難看的女性復仇電影,場面相當精彩。
  • 名探偵コナン 沈黙の15分(IMDB, Wikipedia),中譯:名偵探柯南-沈默的15分鐘。越來越不好看了,推理就是在中間理所當然地被推斷出來,少了很多懸疑點。凶手就是為了取出沈在水庫裡的鑽石,才寫信去威嚇都知事,之後,柯南想說就去水壩所在的村子進行調查。然後遇到村子裡的一伙人,很順利地推斷出去坐過牢的山尾就是主凶,而且還想把水壩炸掉以取得裡面的鑽石。這邊可以發覺到柯南已經快成了超人了,居然可以比破堤的大水還快,還可以引發雪崩去阻止大水,太神了。
  • Piranha 3DD(IMDB, Wikipedia),中譯:3D食人魚2:全面獵殺。很可惡也很噁爛的片,明明就知道導演在那個段子有埋梗,會嚇到人,可是偏偏還是被嚇到,導演就是有辦法在你鬆懈的一瞬間嚇到你。這片比上次有更多的裸露、更多的血腥,不過就故事情節來說,比上次弱。片尾有李麥克(David Hasselhoff)出來插花,相當逗趣,片尾好像為了湊時間,故意弄了一個假片尾,然後丟了一些拍片花絮上去,湊滿快90分鐘。片子裡有從人肚子跑出食人魚的情節,感覺上是有被咬到,就有可能會在身體裡產卵,後面沒有對這點多做解釋。結尾,教授的食人魚從魚缸裡逃出來,然後游泳池有魚在地上爬的畫面,莫非還會有第3集,拜託,不要了吧?!

 

django-grid

django 裡面怎麼好像沒有內建的 grid 產生器? 沒有在 admin app 裡找,後來是找到這個 django-grid ,看起來用法很簡單,就用了。一開始是照著用,然後還去改了他原來的 template,後來才想到應該在自己要用到 grid 的 template 裡用 {% include ‘grid/object_list.html’ %} 才對,這樣就可以不用更動到原來的 template。

grid 裡已經有處理分頁的部分,官方的文件沒提到的幾點:

  1. 自訂 column 的標題:如果你的 model 裡已經有加上去的話,它會自動去抓,但是如果是自訂的欄位,就要這樣用:columns = ( (‘field1’, ‘欄位1’), (‘field2’, ‘欄位2’), )
  2. 刪除:grid 有定義這個,在定義 columns 的時候,要使用 __delete__,例如: columns = ( (‘field1’, ‘欄位1’), (‘field2’, ‘欄位2’), (‘__delete__’, ‘刪除’), )
  3. 自行定義欄位:要額外增加 custom_columns,其形態是 dict,grid 在遇到裡面指定的元素時,會改用你定義的 template 去顯示,來達到自定義的效果:custom_columns={ ‘field1’: ‘app/custom_field1.html’ }
  4. l10n:grid 沒有做這部分,這就要自己去改 template 了。

總結範例:[python]from grid import Grid
class MyGrid(grid):
model = your_model
columns = ( (‘field1’, ‘欄位1’), (‘field2’, ‘欄位2’), )
sortable = (‘field1’,)
custom_columns={ ‘field1’: ‘app/custom_field1.html’ }
[/python]

用imagemagick合併圖片

今年年初時買了 Canon 的事務機,裡面有掃描的功能,所以就開始了掃描大公子作品的計畫。大公子都是畫在那種大大張的日曆紙上面(約為A3大小),掃描時,就需要折半來掃描(折半就是A4)。可是折半掃描為圖檔以後,到了電腦就要合成,之前都是利用繪圖軟體,像 paint.net 或 gimp,先把畫布尺寸擴大為兩倍,再把第2張圖貼上,這樣很花時間,調整起來也很麻煩。

處理了幾次之後,終於受不了了,想說應該有好用的工具可以一次搞定。之前知道有 imagemagick,就用 imagemagick cat image 丟下去找,看到 cat 了嗎? 會用 cat 是因為想到 linux 下有個好用的 cat 指令,一般可以用這個把兩個檔案串到一起,然後用 pipe 輸出到新檔案。但是 cat 就是貓啊!!! 所以找到了一堆跟貓照片有關的文章。@_@

找著找著,終於發現自己的錯誤,應該要用 merge 啊!!! 於是就找到了 montage 這個指令,這個其實就包在 imagemagick 套件裡,用法是這樣子的:montage 1.jpg 2.jpg -tile 1×2 -geometry +0+0 output.jpg ,這樣就可以把兩張圖接起來,一張在上面,一張在下面。如果要左右接,就把 -tile 拿掉即可。

電影流水帳(2012/6/2~2012/6/14)

Sherlock Holmes: A Game of Shadows

  • Sherlock Holmes – A game of shadows (IMDB, Wikipedia),中譯:福爾摩斯-詭影遊戲。很好看的片子,這一集缺少推理的橋段,就只有追著女主角的弟弟跑,想藉著他找出 Moriarty 的犯罪證據。找的幾個演員都很有梗,兩個男主角就不用說了,Holmes 的哥哥(全裸跟 Mrs. Watson 閒聊的那段真的很酷)、Mrs. Watson(就上面照片裡的女人,相當有魅力)、Moriarty 等等,都很能演,到最後兩人對話那段,真的讓我噴飯笑出來,Holmes 在腦海中模擬跟 Moriarty 對打,模擬完以後,Moriarty 的對白就說:「你會難道我就不會嗎?」然後也模擬了一次,真是太爆笑了,最後就是 Holmes 的經典收尾,兩人一起掉到瀑布下面。不知道那個瀑布的景是不是真的,如果是的話,真的是很壯觀,值得列為一定要去的地方!!
  • Age of Heroes(IMDB, Wikipedia),臺灣沒上片,網路上是翻譯為英雄時代。一開始是 Bob 因為戰爭失利,他的上司命令他帶著他的人試著逃離戰場,在戰場的邊緣被盟軍阻攔,他們想回去,卻被命令要重返戰場,於是 Bob 打了盟軍的上司,被捕,關到監獄裡去。過了不久,英軍有個任務說因為德軍似乎有更先進的無線電破譯技術可以破解盟軍的通訊,為此,他們決定組隊去進行破壞,並且如果有新的技術,就帶回來。Jones 是主要的負責人,負責組隊,因為是個機密任務,當然都是找他認識的人,在找其中一人時,遇到了 Bob,Bob 以脅迫的手段,讓 Jones 選擇了他。這當然是不好的手段,訓練的時間很短,只有三週的時間,本來 Jones 想藉著訓練讓 Bob 知難而退,但後來在 Bob 的表現與 Jones 佩服他的膽識,還是讓他加入了。很快地,他們就去北歐出任務。出任務算是相當幸運,雖然接頭的 Jenson 從男的變成女的,幫忙補給的村莊被滅掉 (真的很血腥),但他們順利的破壞了德軍的無線電基地。破壞末了,要逃出的時候,盟軍無法派出飛機,就只能請他們逃往瑞典,有一半的人負責掩護另一半的人脫逃,最後負責掩護的人都掛了,剩下的人把追擊的德軍滅了,順利脫逃的人只剩下三人,然後就到了瑞典。蠻平淡的片,但赤裸裸地展現了所謂的戰爭。

 

awk的split

朋友問我,有沒有可以把 fg_list_partial.png 轉成 fg.list_partial 的指令,我是隔天才收到訊息,而他已經用 echo filename | cut -d “.” -f 1 | sed ‘s/_/./1’ 來解決問題了。

我看到訊息時,立馬想到的是 basename/awk ,而不是 sed/cut,所以我用 echo `basename fg_list_partial.png .png ‘{printf(“%s.%s_%s\n”, $1, $2, $3);}’ 來解,可是仔細想想,其實有缺點,第一個是多花一個指令去把檔名的副檔名去掉,第二個是不適合做大量的批次處理。因此我再仔細找了一下,看 awk 有沒有支援 multiple field separator,找著找著,反而看到了 split,這個也可以喔。最後我用 echo “bg_list_full.png” | awk -F . ‘{split($1,a,”_”);printf(“%s.%s_%s\n”,a[1],a[2],a[3]);}’ 來解決,這個方法除了少了 basename 指令之外,也很適合做批次處理,例如 ls ??_list_*.png | awk -F . ‘{split($1,a,”_”);printf(“%s.%s_%s\n”,a[1],a[2],a[3]);}’ 。

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 差點掉下去,大家是異口同聲叫出來。