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 或其他方式,暫時就這樣用吧。

 

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 ,去年有聽說有加入這功能。

 

 

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 了。

續借學校圖書2

學校圖書館換新系統了,所以,又懶得打勾。這次修正兩個網頁,一個是強制一次顯示出30筆資料,要不然一次只有10筆,還要翻頁才能繼續。另外一個就根據原來的稍稍調整名字,碰到問題的是,上下有兩個「續借」,想要在兩個的旁邊都加上”Check all”跟”Uncheck all”,可是卻只能加上一個。後來追蹤以後才發現,當我加了第一次”Check all”與”Uncheck all”以後,getElementsByTagName()傳回的陣列(elements)居然自動也跟著變大了,所以後面的「續借」按鈕就沒找到。我的解法就先用 list 把這兩個「續借」按鈕都紀錄起來,後續再用另外一個迴圈去一次處理。

看原始碼的利器-gj

好像是在看推還看噗的時候看到的,fcamel 大自己刻的工具gj,今天才在試,發現很方便,找關鍵字很快。使用方法很簡單,先安裝 id-utils (sudo apt-get install id-utils),然後在你要看原始碼的目錄下,輸入 mkid 先建立資料庫,之後就可以用gj keyword 列出有keyword的檔案並讓你選擇要看哪個檔案。如果你用 gj keyword keyword2 就表示要在有 keyword 的檔案裡再去找看有沒有 keyword2,依此類推。

預設是用 vi 去編輯檔案,要改的話,就稍微改一下 gj 即可,gj 是用python寫的喔~

 

Harbour Project – Hello world

The Harbour Project is a Free Open Source Software effort to build a multiplatform Clipper language compiler. Harbour consists of the xBase language compiler and the runtime libraries with different terminal plugins and different databases (not just DBF).

Harbour is a cross-platform compiler and is known to compile and run on MS-DOS, Windows (32 & 64), Windows CE, Pocket PC, OS/2, GNU/Linux and Mac OS X.

簡單的說,Harbour是Clipper的替代品,目前可以運行在很多平台上,雖然說跟Clipper/VFP同是xBase類的語言,但是還是有很大的差異,這些差異可以從文件裡看出來。不過Harbour有相當大的優勢,就是速度跟平台,它會先把 prg 轉譯為 C 語言,再編譯出執行檔,再者,它可以裝到很多平台上。對被拋棄的xBase語言的開發者來說,是可以考慮看看的。

Linux 上的安裝很簡單,就去Harbour下載網頁找到你的Linux版本,點進去,找到檔案下載即可,我是用Ubuntu,就到binaries-linux-ubuntu下,下載 .deb 檔案。下載以後,執行sudo dpkg -i harbour_3.0.0-1_i386_ubu_10.04-2.deb 就安裝好了。

接下來就寫程式,副檔名是.prg,就建立一個hello.prg,內容就像這樣

&& Output "hello world"
? "Hello world"

&& Create table,沒有VFP的create table,還真的有痛苦到。
local aDbf := {}
AADD(aDbf, { "Fld1", "N", 3, 0 })
AADD(aDbf, { "Fld2", "C", 4, 0 })
AADD(aDbf, { "Fld3", "C", 20, 0 })
DBCREATE("table1",aDbf)

use table1
browse()  && browse 不再是指令,而變成函式了。
close all

執行 hbrun hello.prg 就可以直接執行,看到結果。使用 hbmk2 hello.prg 就可以編譯出執行檔 hello,輸入 ./hello 就可以執行。

[ExcelVBA]刪掉所有sheet,只留下指定的sheet

上星期的某天花了一個小時在寫這個Script來幫我刪sheet,程式邏輯很簡單,很快就搞定了,只是另存新檔,打開以後,卻什麼東西都沒看到。存為 .csv 的話,的確是有資料,那就奇怪了,百思不得其解。一放就又放了一個星期,這次終於解開秘密了。另存新檔以後,不知道為什麼,打開以後視窗會被隱藏,所以什麼都看不到。只要取消隱藏視窗就可以看到了。程式的話,就是要這樣寫: Application.Windows(1).Visible=True,下面就是整個程式:

skydrive+FUSE的read

這幾天弄skydrive+fuse的時候,一直在想,這到底適不適合用FUSE來實作?

  1. 以網路程式來說,讀取的時候,要可以告訴伺服器端,客戶端要下載那一段,要下載多少,以HTTP來說,這可以用Range這個header來達成,只要在發request的時候,加上Range header就可以指定。那麼skydrive伺服器端有支援續傳嗎?這個我還沒去確定。
  2. 那麼FUSE的read裡可以使用續傳嗎?在read裡會指定要讀取多少,從哪裡開始讀取,看來是可以使用續傳,可是使用續傳的話,就要考慮一下客戶端的情況,一般在做這種read的時候,是使用一個回圈,然後一次只讀取一部份到緩衝區裡,並不是一次讀完,因此,只讀取一部份的結果,等於會送出許多次的request給伺服器端。
  3. 可以不要送出許多次的request嗎?這樣網路會折返很多次。一次下載完,先放到硬碟的話,就要面對同步的問題。首先第一次read時,就要可以傳回一部份值,並且要把這個下載的動作放到thread去執行,繼續下載,並放到某個暫存的地方,直到下載完成。那接下來第二次要read時,再去讀取已經下載的部份並傳回。這樣會少掉比較多的request,效率也會比較高一點。可是thread在寫的時候,另外一個thread可以去讀取正在寫入的檔案嗎?會不會有什麼奇怪的事情發生呢?這個是需要實驗的地方。
  4. 延續前面的討論,現在已經放到暫存的地方,存取會快很多,可是該怎麼知道伺服器端的檔案被更改了?這應該可以在一開始要read的時候,去判斷檔案大小跟屬性來判斷是不是要重新下載。另外也要考慮到伺服器端檔案被頻繁更動的情況。
  5. 既然會放到暫存的地方的話,是不是乾脆像dropbox那樣用sync的方式來做會比較好?

 

LiveConnect OAuth2

講的比較仔細的是這幾篇:Mobile and Windows desktop appsOAuth 2.0 (Live Connect)Server-side scenarios (Live Connect)Developers – Learn how to bring data from Hotmail, Messenger, and SkyDrive to your mobile apps,第1篇比較粗略,但夠簡單。第2篇是有仔細講解參數以及流程(含圖),可以在遇到問題時做參考。看過以後,發現步驟的確是OAuth2,但就是沒辦法用 python oauth2 去套,就只能照步驟來硬刻了。

有試過httplib2,看能不能parse HTML再去摹擬POST登入,結果會回一個400的錯誤,拿到錯的頁面。python內建的webbrowser,只會用browser開出畫面,但沒有提供方法可以取回在網址列的網址。看來在拿 access token/authorization code 的部份,就只能先組出sign in的url,把瀏覽器開出來,讓使用者先去登入,然後允許以後,再請使用者把網址複製下來,貼到程式的輸入,讓程式去擷取 access token/authorization code,再保存下來。就先這樣子做吧,以後有更好的方法再來修正。

pyskydrive/skydrive .net api client

靈機一動用python+skydrive去找,有找到pyskydrive這個project,試用結果,是不行。專案是去年釋出的,追蹤了一下,發現是因為Skydrive頁面HTML一整個改掉,已經不能用原來的方法去parse了。

改看SkyDrive.Net API Client的source code,看能不能fork出來改。可是看跟試驗的結果,發現也不行使用。他使用的方法也不是正規作法,因此認証那關都過不了。

看來只能自己刻了。在LiveAPI的網站上有看到是使用 OAuth 2,就先安裝了 python oauth2 的library,可是參考範例以後,發現怎麼樣也套不上微軟的LiveAPI OAuth。於是就只能看官方的介紹跟文章來實驗與重刻了。