編譯 gcin (Ubuntu 14.04)

在 Ubuntu 14.04 編譯 gcin,需要安裝這些套件:

  • libgtk-3-dev
  • libgtk2.0-dev
  • libanthy-dev
  • libqt4-dev
  • libqt4-dev-bin
  • qtbase5-private-dev
  • libxtst-dev
  • libappindicator3-dev
  • libchewing3-dev (Optional)
  • qt5-default (Optional)
  • qtchooser (Optional)

gcin 的原始碼可以在這裡取得,在 2.8.2 裡,新酷音的支援被關掉,可以自己修改 configure 來打開設定。qt5-default 跟 qtchooser 是可以不用安裝的,這是 QT5 使用的標頭檔與工具。

docker 小記

最近試著寫 Dockerfile,遇到了一些問題,也順利解決了,所以紀錄在這裡:

  1. 使用 apt-get install 時,會因為某些套件的安裝設定而跳出對話方塊,這會導致安裝被阻塞住。這可以藉著 debconf 來避免:
    ENV DEBIAN_FRONTEND noninteractive
    ENV TERM linux
    RUN echo ‘debconf debconf/frontend select Noninteractive’ | debconf-set-selections
    其中那兩行設置環境變數似乎不起作用的樣子,主要還是第三行。
  2. 找不到 add-apt-repository 指令。這是因為基礎的 image 裡沒有的關係,得使用 apt-get install python-software-properties 來安裝,在 Trusty ,也就是 14.04 裡,得再多安裝 software-properties-common
  3. 用 14.04 時,無法安裝 ia32-libs 。到 13.10 以後,ia32-libs 被移除了,改以 multiarch-support 替代,同時,得用 dpkg 聲明要使用 i386 architecture 才能使用 :i386,例如:
    RUN dpkg –add-architecture i386
    RUN apt-get install multiarch-support gcc-multilib g++-multilib libncurses5-dev:i386
  4. webupd8 的 Java installer 實際上是個安裝的腳本,會詢問是否同意 Oracle 的 license,才開始下載並安裝。同樣,詢問時也會阻塞住,得用下列指令事先回答同意:
    RUN echo oracle-java6-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
    RUN apt-get install -y oracle-java6-installer
  5. apt-get install 時,都加上 -y 選項以避免詢問。
  6. 不要更動 sources.list,原因是我有試著更換為台灣的替換來源,但卻會出現無法下載某些套件的情況。
  7. 如果是要搭 Android 開發環境,下面是我在 14.04 裡試出來該要裝的套件:
    RUN apt-get install -y build-essential openjdk-7-jdk multiarch-support
    RUN apt-get install -y vim ctags cscope id-utils curl gnupg flex bison gperf zip curl libc6-dev libswitch-perl libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev gcc-multilib g++-multilib mingw32 tofrodos dialog python-markdown libxml2-utils xsltproc zlib1g-dev:i386 zlib1g-dev
  8. 清理 container 與 image 的步驟是先刪除 container,再刪除 image。用 docker ps -a -q 可以看 container id,然後用 docker rm 刪除 container,最後再用 docker rmi 去刪除 image,要砍光光,可以這樣用:
    docker ps -a -q | xargs docker rm
    docker images -q | xargs docker rmi
  9. Dockerfile 最後最好是來個 apt-get clean,可以減少 image 空間。
  10. 由於 docker 特性,image 是一層一層疊上去的,只要有指令更動,就會多一層,這有點像 git/svn repository 的概念。在用 docker build 做好 image 以後,你會想只要一個 image 就好,這時候你需要的關鍵字是 flatten 。使用的指令是 export 跟 improt:
    docker export red_panda | docker import – exampleimagelocal:new

關於 Docker push/pull

  1. 首先需要有 server,在安裝上非常簡單,你可以參考這篇 How to use your own Registry,但我發現不用那麼麻煩,有 python virtualenv 在手,可以很快裝好。
    virtualenv docker-registry-env
    cd docker-registry-env
    source bin/activate
    pip install docker-registry
    cp ./lib/python2.7/site-packages/config/config_sample.yml ./lib/python2.7/site-packages/config/config.yml
    打完上面指令就裝完了。啟動的話,接著打 docker-registry 就可以。上傳以後的 image/repository 會放在 /tmp/test ,使用的資料庫是 sqlite3 ,則是放在 /tmp/docker-registry.db。如果要調整位置,可以改 ./lib/python2.7/site-packages/config/config.yml 裡的 sqlalchemy_index_database 與 dev/test/prod 區段的 storage_path 。
  2. push 的方法,就我感覺是有點隱晦。要 push ,得先為 image 加上 tag,例如:
    docker tag 06a3d360b8e2 localhost:5000/myrepo
    docker push localhost:5000/myrepo
  3. pull 的話,就這樣用:
    docker pull localhost:5000/myrepo

資料來源:

fbterm

ArchLinux 裡安裝 fbterm 的方法很簡單,就 pacman -S fbterm 完以後,照說明做就行了。執行 fbterm 以後,中文卻沒正常顯示,猜想應該是沒指定字型的關係。所以我輸入 exit ,退出 fbterm,接著加裝了 wqy-microhei-lite :pacman -S wqy-microhei-lite ,接著看 man fbterm,參考裏面的說明,去修改 $HOME/.fbtermrc 裡的 font-names (.fbtermrc 在第一次執行 fbterm 時,會自動產生),將其改為 WenQuanYi Micro Hei Mono Light,並調整字體大小,然後重新執行一次 fbterm 就可以了。

在 pacman -Ss fbterm 時,有看到 fcitx-fbterm,所以 fbterm 也可以使用中文輸入法,目前只有這個。

Prolific pl2303 usb to serial In Virtualbox

原本以為,在 USB 那邊切過去就可以,但 Guest 裡的 Windows XP 在安裝驅動程式以後還是無法使用。

後來還是在 VirtualBox 裡設定,啟用 COM1,然後連接埠模式選”主機裝置”,連接埠設 Ubuntu Host 偵測到的 “/dev/ttyUSB0″。這樣應該是沒問題,再看看。

vboxdrv: Unknown symbol mcount

公司的桌機是用 Ubuntu 12.04 LTS,今天發現 virtualbox 不能執行了,就順道把 Kernel 升級到 trusty (linux-image-generic-lts-trusty),然後重新安裝 virtualbox,發現不行,Ubuntu 附的 virtualbox-ose 會說沒有適合現在 kernel 的 module,改用 oracle virtualbox-4.3 則會出現模組無法驗證的訊息。

模組無法驗證,上網 Google 了一下,發現應該是 Kernel 啟用了 CONFIG_MODULE_SIG 的緣故,參考 Signed kernel module support – Gentoo Wiki ,研判是需要 key 才能編譯出 sign 過的 module,但實在找不到 key,就放棄了。

退到 saucy 的 kernel (linux-image-generic-lts-saucy),一樣用 oracle virtualbox,這次在編譯時有警告 (這可以參考 /var/lib/dkms/vboxhost/ 目錄裡的 make.log ),insmod 時,出現 vboxdrv: Unknown symbol mcount (err 0) 的錯誤。Virtualbox issue tracker 有人回報過此問題:dkms unknow symbol mount (err0) ,結論是 gcc 版本過舊而導致。所以安裝 gcc-4.6 以後,再參考這篇 Choose gcc and g++ version ,把預設的 gcc 改為 gcc-4.6 之後就可以編譯出沒問題的模組了。(備註:文章裡是以 4.3 與 4.4 為例,相信你知道如何改動)

AWK 習作:關於 Android 的 mmssms.db

要把 mmssms.db 裡所有是 vCard 的記錄的檔案都下載到本地端。

主要會用到的資料表格是 part,會應用到的欄位是 ct 跟 _data,所以 SQL select 可以這樣寫:select _data from part where ct=’text/x-vcard’ COLLATE NOCASE

這裡為了不判斷大小寫,加上了 COLLATE NOCASE

為了在 terminal 下直接下指令,所以就變成 sqlite3 mmssms.db “select _data from part where ct=’text/x-vcard’ COLLATE NOCASE”

接著再應用 awk 與 adb:sqlite3 mmssms.db “select _data from part where ct=’text/x-vcard’ COLLATE NOCASE” | awk -F’\n’ ‘{system(“adb pull \”” $1 “\””);}’

這樣就大功告成了,-F’\n’ 是為了要把整行當作一個欄位,system() 函式是執行指令,awk 裡的字串串加,不需要特別加上 ‘+’ 或 ‘.’ ,直接寫,像這樣 “hello” $1 “world” 就可以了。

參考資料:

Grub symbol ‘grub_term_highlight_color’ not found

把筆電的 Ubuntu 13.10 升級到 14.04,想不到卻中了招,重開機時,出現 symbol ‘grub_term_highlight_color’ not found 的錯誤。

網路上一找,果然 launchpad 上已經有人回報了,網路上也有不少人分享解法。大致上有兩類解法:

  1. 設法用 livecd/liveusb 重新 chroot 進去,然後用 grub-install 重新安裝 grub
  2. 用 livecd/liveusb 開機,安裝 boot-repair ,利用 boot-repair 來解。

這兩類解法對我都無效,後來是在 launchpad 的那篇裡,看到 downgrade grub ,就想說來試試看。主要的步驟,還是 boot-repair,所以先用 Ubuntu 14.04 的 liveusb 開機,安裝 boot-repair,執行 boot-repair 。boot-repair 的過程裡,會有一些提示,以及需要手動下指令的部份,第一次會是要移除 grub 以及相關的套件;到了第二次時,會要你重新安裝 grub,這邊的指令要改變一下,先裝指定版本的 grub,再執行 boot-repair 提供的指令:sudo apt-get install grub-common=2.00-19ubuntu2 grub-efi-amd64=2.00-19ubuntu2 grub-efi-amd64-bin=2.00-19ubuntu2 grub-efi-amd64-signed=1.22+2.00-19ubuntu2 grub2-common=2.00-19ubuntu2

接著就是讓 boot-repair 做完就可以了。

備註:

  • 如果你不知道有哪些版本可以用,要找某 package 之前的版本,可以用 apt-cache show package | grep Version 來看。
  • 用 LiveCD/LiveUSB 開進去以後,自行掛載並 chroot 的方法,就是先用 sudo parted -l 或 sudo fdisk -l 確認分割區,接著做掛載的動作,大致是這樣 (分割區請自行替換,不要照抄):
    sudo mount /dev/sda5 /mnt
    sudo mount /dev/sda4 /mnt/boot
    sudo mount /dev/sda7 /mnt/home
    for i in /dev /dev/pts /sys /proc /run; do sudo mount $i /mnt$i; done
    sudo chroot /mnt
    hostname your_host
    export HOME=/root

用 mutt 閱讀 Thunderbird 郵件

上網找了不少資料,終於試出來方法:

  1. 安裝 mutt
  2. 將目前目錄切換到 $HOME/.thunderbird/xxxx.default/Mail 下
  3. 輸入 mutt -R -f Inbox 即可。如果你在 Thunderbird 裡有多個資料夾,你會發現在目前的目錄下就有對應的檔案或資料夾,將 Inbox 替換為你要閱讀的資料夾名稱即可。用 -f 是指定檔案;用 -R 是表示以唯讀開啟,如果不用 -R,像是刪除或修改什麼的,mutt 是會真的去處理的。

有附件時,按 v  會讓你選擇檔案,這時就可以選 s 另存新檔,或是按 enter 以 mailcap 來顯示。用 mailcap 的話,可以在 $HOME/.mailcap 裡定義 content type 與其對應的處理。但是在命令列模式下,mailcap 能做的有限就是。

PDF 的話,可以用 pdftotext/pdftohtml 來處理,如果轉成 html 的話,就可以再用 w3m 來顯示。老話一句,在命令列下,像這種很需要圖形介面的,能做的真的有限。

小試 LXC

開始試試看 LXC,LXC 是輕量級的虛擬環境,沒有摹擬硬體層,硬體層是跟 Host 共用,最大的好處就是建一個 container 的成本遠比用 VirtualBox/VMWare 建 VM 來的低。

Ubuntu 12.04 上預裝好的 LXC 是 0.75 版,現在已經是 1.0 了,要使用最新的版本,可以用這個 PPA:ppa:ubuntu-lxc/stable 。在 0.75 時,只要安裝 lxc 即可;到了 1.0 版,拆成兩包:lxc 跟 lxc-templates ,所以安裝時要用 sudo apt-get install lxc lxc-templates 。

主要的操作,ls /usr/bin/lxc-* 就可以看到,這裡講一下比較入門的指令 (其實是我現在也只有用到這些):

  • 建立 container :sudo lxc-create -n container_name ,加 -t 可以指定要使用的 template,template 可以想作是 distribution,前面提到的 lxc-templates 裡面就是放已經客製好的 template,也可以自己做。所以你可以建 archlinux 的 container 或是 opensuse 的 container 來練習。
  • 刪除 container :sudo lxc-destroy -n container_name
  • 啟動 container :sudo lxc-start -n container_name ,執行完,終端機會馬上被 container 接手,輸入預設的帳號跟密碼 ubuntu/ubuntu 就可以登入。如果不想被 container 接手,可以加上  -d 。
  • 停止 container :sudo lxc-stop -n container_name
  • 列出現有的 container: sudo lxc-ls -f
  • 連上已經啟動的 container :sudo lxc-console -n container_name
  • 連上已經啟動的 container 並執行指定指令:sudo lxc-attach -n container_name command

大致上就這樣,現在還有 docker ,其實它就根植在 LXC 上,主要是簡化自動化操作,大部分都用來測試,晚點再來看看怎麼用。

參考資料:

 

 

loopback device

要掛載一個 image,就得利用到 loopback device,一般來說只要在 mount 時,指定 -o loop 跟 image 檔名就可以了,例如:sudo mount -o loop your_image /mnt

但是,我遇到 image 檔案無法掛載的情況。用 file 指令去看,發現到 image 檔裡有多個 partition 。

precise-desktop.img: x86 boot sector; partition 1: ID=0xc, active, starthead 1, startsector 32, 147424 sectors; partition 2: ID=0x83, starthead 45, startsector 147456, 4864000 sectors, code offset 0x0

後來想起多年前看過的 losetup,就看了一下 losetup 的使用說明,裏面提到 -o 這個參數,這是用來指定 offset 的,也就是說,可以把 image 檔案裡從指定 offset 開始的地方指派到某個 loopback device 去。於是根據 file 的資訊,算出 offset 是 147456*512 = 75497472,然後用 sudo losetup -o 75497472 /dev/loop0 precise-desktop.img 去指定,這樣 /dev/loop0 就對應到 precise-desktop.img 檔案裡的第二個 partition ,最後就可以用 sudo mount /dev/loop0 /mnt 掛載了。

反過來,也可以對一個檔案做 fdisk。這時要先預先用 dd 幫檔案配置空間,例如要配置一個 512M 的檔案:dd if=/dev/zero of=my.img bs=1M count=512 。接著一樣用 losetup 把 image 檔指派到 loopback device:sudo losetup /dev/loop1 my.img ,最後就可以用 fdisk 來分割了。