VBoxHeadless 與 3D acceleration

今天用 VBoxHeadless 開 VM 時,出現了這樣的錯誤:

VBoxManage: error: This VM was configured to use 3D acceleration. However, the 3D support of the host is not working properly and the VM cannot be started. To fix this problem, either fix the host 3D support (update the host graphics driver?) or disable 3D acceleration in the VM settings (VERR_NOT_AVAILABLE)

看起來就是要我關 3D 加速選項,查了一下,有找到這篇很有用的導引文,完全在 console 下進行建立、啟動 VM 的動作。在文章裡有看到使用 VBoxManage modifyvm 來變更 vm 選項,所以我就用 VBoxManage modifyvm –help 查了說明,接著就用 VBoxManage modifyvm –accelerate3d off 把 vm 的 3D 給關閉,然後就可以啟動了。這次有學到另外一個可以不用直接使用 VBoxHeadless 的方式,就是一樣用 VBoxManage startvm 來啟動,但加上 –type headless 這樣:VBoxManage startvm “Windows XP” –type headless ,這樣就跟使用 VBoxHeadless 一樣了。

ubuntu 12.04 ia32-libs 無法安裝

約莫半年前,我的桌機從 11.10 升級到 12.04 precise 以後,就沒辦法安裝 ia32-libs,這問題一直卡關,卡到現在才找到解。

安裝的時候,apt 會告訴你:

  • ia32-libs 相依於 ia32-libs-multiarch
  • ia32-libs-multiarch 相依於 bluez-alsa:i386
  • bluez-alsa:i386 相依於 bluez:i386
  • bluez:i386 相依於 python-dbus-dev:i386
  • 族繁不及備載…bala…bala…

有發現有人提報了這個問題,也有人貼到討論區上討論,但是都沒解。

其實主要問題是卡在 bluez 上面,後來用 bluez:i386 ia32-libs-multiarch 這幾個關鍵字去找,就找到:Solving ia32-libs installation problem in Ubuntu 12.04 precise pangolin ,然後就照著他的方法去做,順利解決了問題。

他的方法是這樣子的:

  1. 移除 ia32-libs 跟 bluez 等相關套件:sudo apt-get remove bluez ia32-libs
  2. 安裝 ia32-libs-multiarch:i386 :sudo apt-get install ia32-libs-multiarch:i386
  3. 安裝 ia32-libs :sudo apt-get install ia32-libs

是故,現在可以用 google earth,也可以編譯 Android 4.x 了。

 

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,這樣就可以跨平台了。