avant-window-navigator 設定檔位置

Ubuntu 12.04 用的是 0.4.x ,設定檔主要是放在 HOME 目錄下,有兩個地方:

  • ~/.config/desktop-agnostic ,這邊主要是 .ini,各個 applet 的設定都在這裡。
  • ~/.config/awn ,這邊主要是 launcher (*.desktop)、themes..等等的。

原本以為改改 .ini ,就可以順利回復到上次的設定,豈料不行,所以還是乖乖手動自己加 task launcher…囧。

用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 拿掉即可。

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]);}’ 。

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}’ ,兩個指令就收工了。

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 的相關部分都包起來了,看起來很好用,晚點來研究看看。

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” 只印檔名,就不會再有要按任意鍵的情況了。

就暫時這樣用吧。

 

OpenOffice/LibreOffice Calc Macros(3)

這篇文章是從 LibreOffice 的輔助說明裡挖出來的,列出了所有可用的服務、控制項以及控制項裡的屬性,相當的實用,給我很大的幫助。再搭配這篇教你如何建立對話盒文章裡的範例-dynamicDialog.py,就可以打造出自己的對話盒,並且顯示出來。

在試驗 DateModel (就日期控制項)時,發現了幾個有趣的事情:

  • Date 屬性的指定,必須是 20120408 這樣子的數字,所以以 python 來說就是 int( datetime.now().strftime(“%Y%m%d”) )
  • 指定 Dropdown 屬性為 True 以後,才會出現可以下拉的小按鈕,讓使用者可以簡易的選擇日期,不必手動輸入。

在翻找 LibreOffice 安裝目錄時,發現裡面就把 Python 2.6.1 包進去了,所以不需要額外安裝 Python,就可以使用 Python,這樣就可以跨平台了。

 

OpenOffice/LibreOffice Calc Macros(2)

為了想用內建的 BASIC 語法來抓網站內容,找了好一陣子,找到 OpenOffice 文件正體中文化網站OOo中文手冊網站 也利用Google爬了一些文,然後也看了 LibreOffice 的輔助說明,發現似乎沒有很方便的函數來做這件事情。

然後,又回頭試了 Python,這次是在 Windows 上試,要寫 script 的話,要把 script 放在 %USERPROFILE%\Application Data\LibreOffice\3\user\Scripts\python 下,這樣就可以執行了。當使用 [工具][巨集][執行巨集] 打開「巨集選擇器」以後,就可以在對話盒左邊的「我的巨集」項目裡找到你程式裡的函式,然後就可以選擇要執行哪一個了。

[python]
def main():
# 取得當前文件
doc = XSCRIPTCONTEXT.getDocument()
# 取得第一張工作表
sheet = doc.Sheets.getByIndex(0)

# 填字串,一般字串跟 unicode 字串都可以
sheet.getCellRangeByName(“A4”).String = sys.version
sheet.getCellRangeByName(“A5”).String = “Hello World”
sheet.getCellRangeByName(“A6″).String = u”Hello world2”
[/python]

使用 python 的話,要抓檔案或是要做什麼複雜處理的,就很方便了,需要什麼函式庫,就自己裝上去就行。但是缺點就是失去了部分的可攜性,在沒有 python 的環境下,無法執行。

OpenOffice/LibreOffice Calc Macros(1)

以下都在 Ubuntu 下進行。

目標是想做股市資料的蒐集跟分析。

首先想到,看可不可以做到像 Excel 一樣做 Web 查詢,Calc 的確有類似功能,Insert > Link to External Data 就是,輸入網址以後,速度相當慢,首先會問你語系,選 Automatic,然後過一段時間以後,會把該網頁裡的所有 table tag 都列出來,有 id 屬性的會顯示 id,沒有的,會用流水號代替,所以你不知道要匯入哪一個 table。Excel 在這裡會顯示一個預覽的視窗,並且將可以匯入的部份框起來,左上角有小圖示,按了以後就可以匯入,相較之下,Calc 一整個弱掉。

那就只能寫 Scripts 了,我花了一個小時在找 macro 存放的位置,大概是我裝過太多版本,所以家目錄下有 .openoffice 跟 .libreoffice 這兩個目錄,可是我存了 macro,這兩個目錄下都沒有,LibreOffice 的 wiki 上說是在 .libreoffice 下,我找了又找,就是沒有。本有想用 find 找,可是我家目錄下好多東西,想說不要花那個時間,但最後我還是用了。就目前 LibreOffice 3.5.1 來說,位置是放在 .config/libreoffice/3/user/basic 下。

我發現這方面的入門文相當相當的混亂而且少,目前看到還是 Wiki 上較多…