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 的文。

 

參考資料:

activemq 的 persistent

因為希望 ActiveMQ Queue 裡的東西在重新啟動後還能存在,就特別做了實驗,結果真的 Queue 裡的東西會消失。

查了很多的文件,也試了不少設定,像是在 broker 裡設 persistent=”true” (預設本來就是 persistent) 或是加了 jdbcPersistentAdapter 等,都不行,後來才發現是 stompest.async 這邊在送的時候,得特別在 headers 裡加上 {‘persistent’: ‘true’} 才可以讓訊息保存在 Queue 裡。

程式一樣是用官方的範例,主要修改的地方在 producer.py:[python] yield client.send(self.QUEUE, json.dumps(
{‘count’: j}), headers={‘persistent’: ‘true’},
receipt=’message-%d’ % j)
[/python]

這次找資料也找到不少解說 ActiveMQ 的文件:

activemq 與 python stompest.async 的安裝

簡單的進行幾個 MQ 的比較之後,決定用 ActiveMQ,原因是因為它使用 Java 編寫,在佈署上顯的比較簡單,只要下載下來,有 JDK 就沒問題了。

要搭配 STOMP 的話,得修改 conf/activemq.xml ,找到 transportConnectors 節段,加入:
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/>

以前景模式啟動的話,是輸入 bin/activemq console,當作 daemon 啟動的話,是輸入 bin/activemq start 。
用 STOMP 的話,依照 Apache ActiveMQ 網站上的說法,會比較缺少安全性,所以會建議搭配 SSL 或 NIO [2]。

Python 的部份,我是直接使用 stompest.async,它是建構在 twisted 之上,這個用 pip 安裝就可以。範例我是參考 stompest.async examples

範例沒什麼問題,接下來就是要熟悉跟了解如何使用了。

參考資料:

  1. STOMP protocol
  2. activemq Unknown data type: 69

電影流水帳(2013/9/7~2013/9/13)

Lily Collins這是 Mirror mirror 的女主角 Lily Collins,是那個很會唱歌的 Phillip Collins 的女兒,真的很漂亮! 有演過「攻其不備」,不過戲份不多,並不是那麼的亮眼。

  • Hotel Transylvania (IMDB, Wikipedia),中譯:尖叫旅社。這不是恐怖片,是動畫片。劇情蠻流暢的,也挺有意思。大意是一個保護女兒的吸血鬼在深山裡搭建了專屬於怪物居住的飯店,每年會定期找全世界的鬼怪朋友們來一次。他基於保護女兒,處心積慮地讓女兒不要出去外面,這一次是女兒 118 歲生日,怎麼樣也擋不住了,就找了飯店裡的員工假扮成人類,來嚇女兒。這次的行動很成功,讓女兒打消了出去闖蕩的心,但行動裡使用了火,卻引來了一個年輕的背包客前來。伯爵嚇壞了,一開始想把這背包客藏起來,再偷運出去,被發現之後,反倒讓他假扮為科學怪人的表弟,劇情就在陰錯陽差的情況下出現許多笑點,同時也打開人類與鬼怪的結。最後就是伯爵追回背包客,讓他可以帶女兒出去多認識外面的世界。
  • Mirror mirror (IMDB, Wikipedia),中譯:魔鏡魔鏡。基本上就是白雪公主的故事,稍稍有改動的部份,第一個是國王被王后變成怪物;第二個是小矮人職業不是挖礦,而是強盜;第三個是王子,王子的個性相當有趣,跟原本故事裡的白馬王子不一樣;第四個是吃蘋果的部份,讓王后認輸而自己吃了下去。總之,翻拍的還蠻不錯的,女主角 Lily Collins 真的是拍的太漂亮,我特愛她後來跟小矮人成為強盜以後的那套裝扮,很帥氣。

將 python package 快速打包為 debian package – stdeb

這兩天看到 clonedigger,這是一個可以找尋程式裡是否有相似重複片段的工具,在找到重複的片段以後,就可以加以重整。老樣子去 ubuntu ppa 找了一下,發現沒有人打包,那麼就只能透過 east_install/pip 來安裝或是自己打包了。

這次就試著自己打包看看。

一般 python package 都會提供 setup.py ,這是使用 python 內建的 module:distutils 來建立的,在官方 distutils 的文件有提到使用方法。裏面就已經提供了打包為 RPM package 的選項,但是就沒有 debian packages。上網找了一下,這篇 Python distutils – does anyone know how to use it? 提供了不少可以參考的文件,循線找到這篇 Standard way to create debian packages for distributing python programs? ,裏面提到了 stdebstdeb 可以透過 easy_install/pip 來安裝,很幸運的是我的 Ubuntu 12.04 剛好有打包這個進去,所以只要用 apt-get 安裝 python-stdeb 就可以了。

接著,就可以參考 stdeb 文件,用 python setup.py –command-packages=stdeb.command bdist_deb 建立 debian package 了,打包好的 debian package 可以在當前目錄的 deb_dist 下找到。

電影流水帳(2013/8/30~2013/9/6)

IMG_5367圖片裡的女人是高圓圓,在盲探裡飾演莊士敦暗戀的對象,不過我覺得跟盲探裡樣子不太像,或許是我圖片找錯了也不一定。

  • 盲探 (IMDB, Wikipedia)。稍微看過一些影評,說應該歸類為愛情喜劇片,看完以後,真的有認同到。何家彤對於辦案不在行,卻為了心中一個結而進了警隊。一開始就遇到盲探莊士敦,在解決潑硫酸案件後,就找了莊士敦解開心中的結,幫忙找小敏。接下來就是莊士敦的小自私、貪吃跟兩人的查案過程。中間有穿插不少事情,讓劇情不至於落到都是查案。我認為鄭秀文飾演的何家彤有點傻、有點癡,都乖乖的聽莊士敦的話,但很可愛,很讓人憐愛。最後的結局蠻讓人驚訝的,維基百科上寫的超詳盡,這裡就不多說,總之,小敏這樣的小女生未免也太厲害。
  • Halo 4: Forward Unto Dawn(IMDB, Wikipedia),中譯:最後一戰4-航向黎明。科幻片,IMDB 上說是電視影集,拍成像電影這樣。我沒玩過 Halo 的遊戲,所以不知道電影劇情是否跟遊戲相仿,整個拍起來感覺是還可以。故事是講有個小組在學校裡訓練,一開始拉斯基跟其他成員有些小爭執,後來在正式測驗的時候,拉斯基自告奮勇擔任隊長,依照他的策略,結果成功的擊敗對手,但是在最後的關鍵時,拉斯基卻倒下去。經過緊急送醫之後,才知道拉斯基有嚴重的過敏。緊接著學校就被外星人襲擊了,然後有人來救他們,經過一番逃難之後,僅僅剩下三人順利逃出。