Fork gedit-git-plugin

gedit-git-plugin 這個 plugin 不錯,就類似 vim-gitgutter 的功能,但是它用的是 libgit2-glib,這個還真麻煩,所以就 fork 出來改,看可不可以擺脫 libgit2-glib。

為此,我先讀了 vim-gitgutter 的程式,vim-gitgutter 主要是在 GitGutter 函式裡,這邊會先去 git diff,然後解析結果,再去作畫面的處理,gedit-git-plugin 也很類似。

程式主要是在 viewactivatable.py ,在啟用 plugin 的時候,會觸發 do_activate(),這時會去繫結相關的事件到程式裡。主要的處理在 update_location(),這裡就調用 libgit2-glib 函式庫去取得 git repository,然後再取得當前檔案的 blob ,最後再去呼叫 update();update() 是在做檔案比對,根據比對結果去顯示,這裡的比對用的是 python 內建的 difflib,而不是用 git diff 的結果。

分析完,大致知道要處理的部份就在 update_location(),只要這裡將使用 libgit2-glib 改為用 subprocess 呼叫 git 取得結果就可以了。第一個要做的事情是取得當前檔案的位置,這個只要套原來的程式,呼叫 self.location.get_path() 就可以。接著要去找 .git 資料夾,這邊我參考了 repo 裡找 .repo 的函式去找 .git 。基於以上兩者,可以取得相對於 .git 所在路徑的檔案路徑,也就是假設 .git 是在 /home/user/project1/.git ,編輯的是 /home/user/project1/dir1/readme,就可以得出 dir1/readme,接著只要用 git show HEAD:dir1/readme 就可以取得原始 blob 內容。依照原來程式的邏輯,把原始 blob 內容替換為 git show 程式的輸出之後,就可以擺脫 libgit2-glib 了!

最後,將 git.plugin 裡的 Loader=python3 改為 python ,再更新 README 並補上 setup.py 就收工了。現在就不用 libgit2-glib 啦~

我 fork 出來的專案放在 github 上。

gedit-git-plugin 二三事

同事都用 gedit ,只有我是用 vim。vim 有個 vim-gitgutter 的 plugin,可以直接顯示你目前的 code 跟 git repository 裡的 code 之間的差異點,用 ]h 或 [h 就可以快速搜尋,我想 gedit 應該也有。找了一下,就找到這個 gedit-git-plugin

安裝這個 plugin 相當簡單,依照說明去做,很快就可以裝好,但是安裝他背後所依賴的 library 就稍嫌麻煩了。他所需要的 library 有 libgit2, libgit2-glib。libgit2 有人已經包好在 ppa,只要 sudo add-apt-repository ppa:pressureman/ppa 再 sudo apt-get update && sudo apt-get install libgit2 即可。libgit2-glib 沒有人包,只能自己包,於是就又重練了一次打包 debian packages,真的太久沒包會忘記。大致列一下步驟,下次可以快速的回憶起來。

  1. 用 git 把 libgit2-glib clone 下來,輸入指令壓縮為 tarball:git archive –prefix=libgit2-glib-0.0.6/ –format=tar master | gzip > ../libgit2-glib-0.0.6.tar.gz
  2. 到上一層目錄之後,解壓縮,照理會解開到 libgit2-glib-0.0.6 ,接著切到該目錄下。
  3. 用 dh_make -f ../libgit2-glib-0.0.6.tar.gz 產生 debian 目錄。
  4. 修改 debian/control:這裡要修改的重點有 Depends、Homepage、Description、Package name
  5. 修改 debian/changelog:這邊就是加上變更的說明,調整名稱等等的,如果要上傳到 ppa,那個 unstable 要改為 ubuntu 欽定的名稱,像是 precise、raring 等等的。記得有 dch 指令可以做編修,用編輯器是比較快。
  6. 修改 debian/rules:內容出乎意料的簡單,在修改時,則是用 override_ prefix 去修你想調整的 target。例如:想改安裝地點,就用
    override_dh_install:
        $(MAKE) DESTDIR=$(PWD)/debian/tmp install

    想調整 configure,就用

    override_dh_auto_configure:
        dh_auto_configure -- --enable-python=yes

    想忽略自動測試,就用

    override_dh_auto_test-indep:

    這樣子,這也是手冊上建議的作法。

  7. 安裝相關的套件:python-gi-dev、python3.2-dev、libgirepository1.0-dev、libgio2.0-cil-dev、libgit2-dev、gobject-introspection。
  8. 好了就可以用 dpkg-buildpackages -b 來建立 debian package 了。

建立完之後,把該裝的都裝好,發現 gedit plugin 還是不能用,說找不到 python3。

結論是,這是一篇用來回憶打包 debian package 的文。

 

參考資料:

在 kernel module 裡參考 /proc/cmdline 裡的字串

基本上是不行,沒辦法取得。那在 u-boot 裡指定參數以後,又是誰收到?

所以我就參考 Documentation/kernel-parameters.txt,然後以 acpi_backlight 當例子去找。在 drivers/acpi/video_detect.c 的最後有看到宣告 static init __init acpi_backlight(char* str) {},這邊看起來是在處理字串,然後做處理;緊接其後則是 __setup(“acpi_backlight=”, acpi_backlight); ,而這行看起來就是 kernel 會有一個地方去 parse cmdline ,如果有符合 acpi_backlight,就把之後的字串丟給 acpi_backlight 函式去處理。

因此,就應該可以依樣畫葫蘆。在 u-boot 傳參數給 kernel,而 kernel 的 module 則用類似 acpi_backlight 的方式去處理,就可以解析到需要的字串。

CentOS 5 升級 MySQL 為 MariaDB

早上看完這篇毫無理由使用 MySQL:MariaDB、MySQL 創始者 Michael Widenius 的訪談,很衝動的就想來升級,找了文章,發現 MariaDB 早就提供 CentOS 5 的 yum repository 了,那就沒理由不衝了。

大致的步驟是參考這篇:How can I upgrade from MySQL to MariaDB? – AskMonty KnowledgeBase

我的步驟:

  1. 先去 mariadb 參考 repository 設定,然後新增:https://downloads.mariadb.org/mariadb/repositories/
  2. service stop httpd
  3. service stop mysql
  4. 備份 /var/lib/mysql 下的檔案
  5. yum remove mysql-server mysql-libs mysql-devel mysql*
  6. 因為我有用 remi repository,所以依照前文指示,要以特別的步驟安裝 compat-mysql: yum –enablerepo=remi-test –disablerepo=remi install compat-mysql55
  7. 安裝 MariaDB:yum install MariaDB-client MariaDB-common MariaDB-compat MariaDB-devel MariaDB-server MariaDB-shared  php-mysql
  8. 啟動 mariadb:service mysql start
  9. 啟動 httpd:service httpd start
  10. 收工

其實那個備份是多餘的,依照 MariaDB 的說法是完全相容,接下來就是是用一陣子看看囉。

取 CPU core 數目

純練功。

第一個單純的想法就是 cat /proc/cpuinfo ,然後算裏面以 processor 開頭的有幾行,所以可以很直白的寫下 cat /proc/cpuinfo | grep processor | wc -l

grep 可以帶檔案,這樣就可以省掉 cat:grep processor /proc/cpuinfo | wc -l

可以用 awk 一行搞定嗎?應該是可以喔~但有點小複雜,先用 regular expression 找出以 processor 開頭的行,然後累加變數,在 END 時再印出結果:awk ‘/^processor/{x+=1;}END{print x;}’ /proc/cpuinfo

預載 Windows 8 + Ubuntu 12.10 安裝經驗分享

我的環境:Toshiba Portege R930 + 預載的 Windows 8

身為自由軟體愛好者,當然是要裝上 Ubuntu 來試試看。這次安裝花了不少時間,才摸索出來。

原本打算用 wubi 的,但是看到這篇 AskUbuntu 上的問答 ,就發現用 wubi 是不可行的了。問答的二樓建議不要用 wubi,先在win8挪出分割區,到 BIOS 把secure boot 關掉,開機順序改由live cd/usb 開,然後裝上ubuntu 12.10,裝完開機選單找不到 win8 的話,用ppa:yannubuntu/boot-repair去修,這樣大概就沒啥問題。最後去電源選項改成不要快速關機。

基本上我照著步驟做了,但是重新開機時,還是 Windows 8 的 boot loader 起來,根本無從選 ubuntu,也沒得用 boot-repair。後來想說,可不可以像 XP 一樣,改 Windows boot loader 的開機選單就行,於是就下載了 EasyBCD 軟體來改,可是還是不行,之後又重新裝了幾次 Ubuntu 都不行。

直到今天早上,今天早上想說還沒有試過 boot-repair,就用 LiveUSB 開機進去,然後安裝 boot-repair 、執行。boot-repair 會偵測環境然後亮出介面,介面上有個 Advanced Options,點進去一看,這設定還真多,當下就又縮回去,不調整,依照原先介面上的建議進行 repair。基本上 repair 的動作是自動的,直到最後才要你開 terminal 打指令,就依樣打完,重開機,GRUB 的選單就出現了。試著開機到 Windows、Linux 都沒問題,大功告成。

詳細步驟:

  1. 進 Windows 8 的磁碟分割,壓縮原來的 C:\ 以取得空間給 Ubuntu 使用。
  2. 關機,按下關機前,先按下 shift,這樣可以確定是真正的關機。
  3. 開機,按 F2 進 BIOS,將 Secure boot 設為 disabled,修改開機順序,改為由 USB 或 CD 開機。
  4. 用 Ubuntu Live USB/CD 開機,開始安裝,我這邊是採取自行分配,不是交給 Ubuntu 幫我分配,我將在步驟 1 切出來的剩餘空間分為: /boot 256MB,/ 40GB,swap 8GB,然後剩下的都給 /home。
  5. 安裝完成,重新開機,會進 Windows 8。依照步驟 2 關機,然後再以 Live USB/CD 開機。
  6. 進入 Ubuntu 以後,安裝 boot-repair:開啟 terminal,輸入 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update && sudo apt-get install boot-repair -y
  7. 安裝完成以後,執行 boot-repair,我是直接按下上面那個按鈕,也就是依照 boot-repair 的建議進行修復。
  8. 重新開機,大功告成。

參考資料:

  • Ubuntu Document – UEFI

 

xdg-utils, nautilus 與 nemo

因為想知道怎麼把 nautilus 改為 nemo,就開始追代碼了。主要是先從 xdg-open 開始,因為 xdg-open ~ 就可以叫出檔案總管並把位置帶到家目錄。

我忘了是怎麼知道 xdg-open 這指令的了,這指令就相似於 Windows 的 start 指令,Windows 的 start 是這樣,只要打 start xxx.doc 或是 start http://www.google.com.tw 就可以自動打開相應的程式,像 xxx.doc 就會開 MS Word,網址就會開瀏覽器。xdg-open 也是一樣,輸入 xdg-open xxx.doc 就會用 Open Office 或 LibreOffice 開啟 xxx.doc,以此類推。

xdg-open 是由 xdg-utils 所提供,是用 perl 寫的,再看裏面,會發現程式會根據目前的桌面環境來自動決定要呼叫哪個桌面環境的 open 程式來開啟指定檔案或位置。GNOME 就是 gnome-open,KDE 就是 kde-open,XFCE 就是 exo-open,LXDE 就是 pcmanfm,不一樣的情況可能會改呼叫 gvfs-open, kfmclient 等等的。

所以在 GNOME 環境下打 xdg-open 或 gnome-open 是一樣的。那 gnome-open 又是怎麼做到的呢?gnome-open 是收錄在 libgnome 裡,source code 可以在這裡看到 git.gnome.org/browse/libgnome/tree/libgnome/gnome-open.c ,程式很短,就先判斷檔案的位置,然後就呼叫 glib gio 的 g_app_info_launch_default_for_uri 進行啟動。再更深入,就沒有細究了,總之是根據 GNOME 內建的 MIME 對應來得知該使用哪個程式的。

記得有可以編輯 MIME 的程式,就可以去改,但我忘了程式的名字,一時在系統設定裡也找不到。最後是用了 ubuntu-tweak 來做修改,就把 nautilus 改為 nemo 了。

Upgrade Subversion to 1.7 in CentOS5

也忘了是從什麼時候開始,在更新時,就一直遇到 subversion-perl 無法升級的問題,說需要 subversion 1.7,可是 CentOS 裡包的是 subversion 1.6,而這個 subversion-perl 是 rpmforge 提供的。

拖了好久,在更新時都以 –skip-broken 避開,可是日子久了,總是會覺得這樣很麻煩,決定還是設法把 subversion 升級到 1.7。當然自己編譯當然是可以,但上上策當然還是有人打包最好,所以上網搜索了一下,就發現有人問,而答案是利用 WANdisco 提供的 yum repository。WANdisco 比較麻煩的是,如果你要下載,網站會要求你輸入資料,然後才寄給你 .repo 檔案。收到 .repo 檔案,就放在 /etc/yum.repos.d ,接著執行 sudo yum update 就可以了。

wireshark

以前用 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,打完收工。