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

就暫時這樣用吧。

 

csv與StringIO

看了 python 網站上對 csv 的說明,就在想是不是一定只能藉著開檔才能使用呢?後來查了一下,然後看到 StringIO,藉著這個,就可以把字串以類似檔案的方式來操作了。

[python]
import csv
from StringIO import StringIO

def parse_to_get_record( csv_content ):
“””
According to csv to parse result.
“””
csv_lines = csv_content.splitlines()
# 還可以濾掉某些不要的行
csv_reader = csv.reader( StringIO( ‘\n’.join(csv_lines[2:-2]) ) )
result = []
for row in csv_reader:
print( row )
result.append( row )
return result

f = open(‘d:\\tmp\\aaa.csv’, ‘r’)
s = f.read()
print( parse_to_get_record(s) )
[/python]

電影流水帳(2012/3/30~2012/4/10)

Justin Timberlake y Amanda Seyfried en El Hormiguero
這張照片實在太有梗,我忍不住就挑了這一張照片。

  • In time(IMDB, Wikipedia),中譯:鐘點戰。這片最後的結局是鴛鴦大盜的誕生,所以其實這個故事沒有想要特別說什麼正氣凜然的道理。這片比較特別的世界設定是以時間代替了金錢,去工作,是為了賺時間,要買吃的、喝的、租房子等等的都要付時間,整個就是時間至上。男主角偶遇了一個大富翁,他不想一直這樣活下去,所以給了他一百年的時間,然後去自殺。而男主角拿到這一百年時間,拿了一些給好友,正打算為他媽媽慶生時,他媽媽卻因為沒時間而死在他的面前。他一整個看開豁出去了。於是他跑到高級區去賭,除了贏得上千年的時間外,也認識了女主角。然後開始被時間管理者追捕,女主角從本來被劫持,到變成一伙,就像是得了斯德哥爾摩症候群似的,總之,女主角因此得到新的人生體驗。兩人開始大搶特搶,並且把搶到的時間都分給窮人。片子的最後,他們搶了女主角父親所收藏的一百萬年時間,並且分出去。時間管理者在最後追捕的過程裡,因為沒補充時間而死了。男女主角則幸運地得到時間管理者的時間配給而活下來,從此,他們兩個變成鴛鴦大盜,繼續搶時間。
  • Money ball(IMDB, Wikipedia),中譯:魔球。專案管理老師真是佛心來著,讓我們看電影體驗什麼是所謂的專案管理。這是美國棒球聯盟的故事,在美國的棒球聯盟,會打球的明星就是招牌,所以球隊都以高薪來挖角球員,並以此帶來球隊的票房與勝利。Billy 看破了這一切,在某次去敵隊陣營,他認識了 Peter (Jonah Hill,我真的沒辦法從 IMDB 提供的照片認出他來,那張照片裡的他太瘦了!!),在聽了 Peter 的理論之後,Billy 決定採用他的理論,以數字決定一切,所以他開始根據統計數字去找能確實上一壘的打找,防禦率高的投手、壘手…等等。電影想說的就是這個,以統計數字去找出可能還沒大鳴大放的球員,然後加以任用,並以此打造出世界一流的球隊。可是我看到的不是這個,我看到的是他們在找到這些球員以後,確實地根據這些數字去強化球員的優點,修正球員的弱點,球員修正了,球隊也因此慢慢變強。最後他們創造了連續二十勝的記錄,平了以往的記錄,堪稱奇蹟。電影的最後,以紅襪隊準備以高薪挖角 Billy ,而 Billy 選擇繼續留在運動家隊而作終。片尾的字幕說,運動家隊後來還是沒有贏得聯盟冠軍,但是紅襪隊改採了 Billy 與 Peter 的策略而贏得冠軍。

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 上較多…