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

OpenOffice/LibreOffice Calc Macros(5)

受不了,還是用「錄製巨集」的方式來寫,因為真的很多函數的用法都不容易找到,找到了,也需要測試測試再測試,太花時間。錄製出來的BASIC語法,基本上都是利用 Dispatcher 然後帶參數去告訴 calc 該做些什麼事情,所以像是在一個格子裡輸入文字,錄製出來的結果會是先 Goto 到指定的儲存格,然後再去填文字。
即便是如此,要轉換為 Python,也需要不少工夫。下面幾篇是我找到的資料,非常有參考價值,一般錄製出來的BASIC函式,這幾篇都有對應的 Python 可以用:

第一個取得 dispatcher 會遇到的 createUnoService ,實際上程式是這樣子的:
[python]
def createUnoService( cClass ):
“””A handy way to create a global objects within the running OOo.
“””
ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
obj = smgr.createInstance( cClass )
return obj
[/python]

第二個是建立 com.sun.star.beans.PropertyValue ,程式是這樣子的:
[python]
args1 = uno.createUnoStruct( “com.sun.star.beans.PropertyValue” )
args1.Name = “ToPoint”
args1.Value = “$A$2”
[/python]

然後是 dispatcher.executeDispatch(),在錄製出來的巨集裡,第一個參數是叫做 document,這個其實是XSCRIPTCONTEXT.getDocument().getCurrentController().getFrame() ,真的是很長;第二個參數是動作字串;第3個跟第4個參數都沿用錄製出來的參數;最後一個參數才是問題,這個要傳 tuple 進去,而且要多加一個空的元素在後面,例如 (arg0,)。

組合上面提到的,要在一個 sheet 裡的 A2 填字串,就是這樣子:
[python]
# 取得必要的變數
doc = XSCRIPTCONTEXT.getDocument()
controller = doc.getCurrentController()
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

# 到 A2
args1 = uno.createUnoStruct( “com.sun.star.beans.PropertyValue” )
args1.Name = “ToPoint”
args1.Value = “$A$2”
dispatcher.executeDispatch(controller.getFrame(), “.uno:GoToCell”, “”, 0,
(args1,))

# 填字串
args2 = uno.createUnoStruct( “com.sun.star.beans.PropertyValue” )
args2.Name = “StringName”
args2.Value = “2012/4/12”
dispatcher.executeDispatch(controller.getFrame(), “.uno:EnterString”, “”,
0, (args2,))
[/python]

找的時候,有找到一篇 oosheet,這個 module 把 calc sheet 的相關部分都包起來了,看起來很好用,晚點來研究看看。

OpenOffice/LibreOffice Calc Macros(4)

填日期的方法,參考這篇:Calc Examples跟這篇Les champs Date / Calendriers

簡單的說,日期要先丟 “d/m/y” 的值進去,或者是用設定公式的方式去設定日期,然後再去設定 format。

[python]
oDoc = XSCRIPTCONTEXT.getDocument()
oSheet = oDoc.Sheets.getByIndex(0)

oSheet.getCellByPosition( 0, 0 ).setFormula( “=DATE(2004;09;30)” )
oSheet.getCellByPosition( 0, 1 ).setFormula( “10/31/2004” )
oSheet.getCellRangeByName( “A3” ).setFormula( “12/31/2004” )

#—–
# Format the date cells as dates.
com_sun_star_util_NumberFormat_DATE = uno.getConstantByName( “com.sun.star.util.NumberFormat.DATE” )
oFormats = oDoc.getNumberFormats()
oLocale = uno.createUnoStruct( “com.sun.star.lang.Locale” )
nDateKey = oFormats.getStandardFormat( com_sun_star_util_NumberFormat_DATE, oLocale )
oCell = oSheet.getCellRangeByName( “A1:A3” )
oCell.NumberFormat = nDateKey
[/python]

至於要改格式為 YYYY/MM/DD 的方法,我還沒研究出來。

exvim

今天在這篇文章上看到exvim,研究一下之後,立馬就在Windows跟Linux都裝起來了。畢竟 vim 要去湊 plugin,然後又要 Windows/Linux 通用,真的是要花很多功夫。

Windows上比較簡單,下載安裝軟體以後,他會先查詢目前有無安裝Vim Windows版,有的話,會先移除,接著再安裝exvim。安裝完以後,沒有在右鍵選單上加上Edit with Vim,讓我覺得不是很順手。不過,exvim裝了很多東西,就不用自己去找plugin來兜,也不用找ctags、cscope之類的來安裝了。

一開始使用 exvim 時,參考官方文件來做,發現 leader key 會失效,把 _vimrc 改為 _gvimrc 才可以運作。仔細研究以後,才知道 exvim leader key 與自訂 _vimrc 的關係,沒有 $HOME/_vimrc時,會載入 $VIM/.vimrc,有 $HOME/_vimrc 時,只會載入 $HOME/_vimrc ,因此預設設定都會跑掉。所以 $HOME/_vimrc 第1行要先 source $VIM/.vimrc ,這是 exvim 預設的設定,然後再去加自己的設定。字型的話,我不想用預設的字型,想用Consolas 。guifont 的設定,要參考 $VIM/.vimrc 裡的方法,GUIEnter 事件被觸發以後再設,所以要補一個 SetMyGuiFont 的函數,在裏面設置,接著再用 au GUIEnter * call s:SetMyGuiFont() 去綁定說 GuiEnter 事件觸發以後再執行 SetMyGuiFont()

解決完設定問題,就參考 Quick Start 來使用看看,才明白不特別修改右鍵選單的關係。exvim 以 your_project.vimentry 為主,因此在專案開發的資料夾按滑鼠右鍵,選「新增」>「exvim vimentry 檔案」,然後輸入你要的名稱加上.vimentry,接著點兩下該檔案即可開始進行你專案的處理。在管理上很簡潔,以後就不需要特別先開 vim,然後切換目錄什麼的,就只要先切換到你專案開發資料夾,開啟 .vimentry 檔案,就可以開始開發。

Linux 下的話,官方文件的 Install 有說明,但是我覺得不夠清楚,我補充一下。

  1. 根據文件去安裝必要的套件,像 ctags, cscope 之類的。文件裡說要重新編譯 vim,我是沒有,就是用 ubuntu 提供的 vim-gtk。
  2. 下載網頁下載 full_package-unix 那包 zip 檔。
  3. 在你的 $HOME 建立 exdev,再把 1 下載到的 zip 解開在這裡。
  4. 切到 $HOME,用 ln -s $HOME/exdev/toolkit .toolkit 跟 ln -s $HOME/exdev/vimfiles .vim 建立兩個 symbolic link。
  5. 備份你原本的 .vimrc ,然後重新建一個 .vimrc,裏面放 source $HOME/exdev/.vimrc_ex
  6. 大功告成,跟 Windows 一樣也是到你專案開發的資料先 touch 一個 .vimentry 的檔案,再用 vim 編輯就可以。

這邊我遇到一個問題,就是按下 \R 時,會出現 ‘— 尚有 —‘ 的訊息,要我按任意鍵繼續,這個很麻煩。我查了好久,才明白為什麼。我追蹤到 exUtility#Browse ,這裡的第1行,就是印訊息的地方,印的方式是用 echon “processing: ” . a:dir . “\r” ,乍看之下沒問題,但是因為我專案開發目錄下的目錄很多,檔名有的很長, echo 會印到下一行,印到下一行以後,又 \r 回到行首,因此等於還是浪費了一行。這樣持續的 echo ,到超過畫面時,就會停住,要按任意鍵才能繼續。所以我參考 fnamemodify 函數的說明,把這行改為 echon “processing: ” . fnamemodify(a:dir,”:t”) . “\r” 只印檔名,就不會再有要按任意鍵的情況了。

就暫時這樣用吧。