以前用 wireshark 時,都是直接上 sudo,以 root 權限執行,沒注意提示訊息的說明。這次認真看了,原來是說可以不用以 root 權限執行,那麼該怎麼做呢?首先要使用 sudo dpkg-reconfigure wireshark-common 重新設定,這時候會跳出詢問視窗,問說是不是要在非 root 模式下使用,請選 yes,然後系統群組裡會多出一個 wireshark 群組。接著請把自己加入到 wireshark 群組裡,登出以後再登入,確定自己有在 wireshark 群組裡以後,就可以使用 wireshark ,而不需要有 root 權限了。
Ubuntu第二個螢幕的解析度只有640×480
家裡是用 Ubuntu 12.10,顯卡是用 nVidia GT630,主要螢幕是 ViewSonic 22″,第二個螢幕則是 Dell 17″。都接上去以後,第二個螢幕卻只有 640×480,當然還是可以用,但是就是礙眼,而且很多程式根本不適用於640×480了,操作會很麻煩。
打開 nVidia X Server Settings,想說去設定為高一點的解析度,可是能選的解析度就只能到 640×480。找了 GT630 的規格,原本以為是規格限制,但後來換算了一下,發現應該不是,而且 17″ 應該是要可以跑到 1024×768 才對,再者,以前都沒問題的。後來再用 nvidia gt630 “Virtual screen size” 去找,才在 nVidia 驅動程式的 README 裡找到 MetaModes 這關鍵字。參考了自己原來的 xorg.conf,裏面是這樣寫:Option “metamodes” “CRT-0: nvidia-auto-select +0+0, CRT-1: nvidia-auto-select +1680+0″,仔細研究了好一會兒,牙一咬,心一橫,想說應該是這個沒錯,就調整為 Option “metamodes” “CRT-0: nvidia-auto-select +0+0, CRT-1: 800×600 +1680+0” ,重新啟動就可以讓第二個螢幕到 800×600 了,這時候再打開 nVidia X Server Settings,赫然發現,第二個螢幕的解析度也可以調整了,於是就調整為 1024×768,打完收工。
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 ,然後就照著他的方法去做,順利解決了問題。
他的方法是這樣子的:
- 移除 ia32-libs 跟 bluez 等相關套件:sudo apt-get remove bluez ia32-libs
- 安裝 ia32-libs-multiarch:i386 :
sudo apt-get install ia32-libs-multiarch:i386 安裝 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 可以用:
- Convert documents in OpenOffice from python
- Translate from basic to python
- ootest.py
- Parameter passing to Python scripts in Scripting Framework
第一個取得 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 的相關部分都包起來了,看起來很好用,晚點來研究看看。