puddletag 的編碼轉換

puddletag 跟 Windows 上的 mp3tag 軟體一樣都是編輯 MP3 id3 資訊的工具,Linux 上同類的軟體有 easytag。這套軟體的介面基本上就是向 mp3tag 看齊,有使用過 mp3tag 的話,使用上應該不太有困難。

除了介面與 mp3tag 相似以外,我覺得 puddletag 最大的特色是 action/function 這功能,你可以用 action 跟 function 組合出各式各項快捷的新組合,讓你在編輯上能更方便,例如可以對歌曲重新編 track 並且填入 album 。

我在使用時,遇到有亂碼的問題,我大概知道是編碼的問題,之前是使用 big5 填 id3 tag v1,所以如果沒 id3 tag v2 的欄位時,會拿 id3 tag v1 的欄位來用,這時候因為不知道要從何種編碼轉為 unicode ,就會有亂碼的發生。本來我已經捲起袖子要寫 Plugin 來解決問題了,後來看了 puddletag 本身提供的 function,發現已經有 “Convert from non-standard encoding” 這個 function,只是裏面的選項沒有 big5 可以選。

追蹤 puddletag 的原始碼,這個 function 是定義在 /usr/share/pyshared/puddlestuff/functions.py 裡,內容大致是這樣:

因此,只要在 “&Encoding, combo,” 後加上 “big5,” 就可以多出 big5 的選項,日文就是 shiftjis,簡體中文就是 gb2312。有了這選項,編碼轉換的功能也可以順利運作了。為了避免更動原始碼,就寫了一個 plugin function,其實只是增加多的編碼,網址在 https://github.com/elleryq/puddletag_pluginfunction_extended_enconvert

CentOS OpenSSL

今天看到這篇 Secure Web API ,提到可以用 SSL Server Test 這個網站服務來檢查 SSL 憑證的安全性,所以就來試試看。

我的機器用的是 CentOS 5,因為是從很早以前的版本升級來的,設定幾乎都是照舊,今天重新整理,對照設定檔跟新設定檔以後,才發現 certification 位置已經更換了。

CentOS 5 的 SSL certification 改放在  /etc/pki/tls/certs ,所以要到該目錄下輸入 make your.crt ,依照步驟回答問題後,就可以製作出 your.crt 跟 your.key ,接著把 your.key 複製到 /etc/pki/tls/private 。然後去調整 /etc/httpd/conf.d/ssl.conf ,並且參考 Configuring Apache, Nginx, and OpenSSL for Forward Secrecy 去修改設定檔案,但不要加入這行 SSLCipherSuite 。不加入的原因是因為 CentOS 的 OpenSSL 並沒有加入 EC support ,如果要加入的話,目前看來是要重新編譯 OpenSSL 套件 (Bounty : OpenSSL with EC for Fedora/RH/CentOS : 3.6 BTC),裡面提到的步驟是下載 source RPM,修改 .spec 裡的 configure 該行,改為 enable-cms enable-md2 no-idea no-mdc2 no-rc5 enable-ec enable-ecdh enable-ecdsa 。

最後再重新啟動 Apache 。

ArchLinux 裡的 locale 設定

ArchLinux 的全域 locale 設定 (LANG)是在 /etc/locale.conf ,如果個別使用者想要設定自己的 locale 怎麼辦呢?

在登入,執行 bash 以後,bash 會先去載入 /etc/profile ,通常 /etc/profile 會去載入並執行 /etc/profile.d 下的所有 .sh 的檔案,這裡有個 locale.sh ,這邊就註明了會去哪裡載入。

首先會看是否有 $XDG_CONFIG_HOME/locale.conf ,有就載入;然後再看 $HOME/.config/locale.conf ,有就載入;再來才是看前面提到的 /etc/locale.conf ;最後才是參考 rc.conf。

所以只要在 $HOME/.config/locale.conf 裡寫 LANG=zh_TW.UTF-8 就可以囉。

同場加映,ArchLinux 已經不再使用 sysv ,這表示再也沒有 /etc/init.d 這類的目錄,ArchLinux 已經改用 systemd 了。

ArchLinux Yaourt/Pacaur

今天再次把 ArchLinux 開來玩。裝了 Razor-QT 以後,發現 Razor 設定中心裡的圖示都沒有出現,以為是安裝的問題,就想說用 yaourt 重新裝一次。

yaourt 是一個輔助 pacman 的工具,除了可以當作 pacman 來用之外,它還會自動從 AUR 取得軟體並進行編譯跟安裝。詳細的說明可以參考 ArchLinux Wiki 上的說明。依照指示設定以後,安裝失敗,我遇到是 GPG 驗證失敗的訊息,用 sudo pacman-key –init 無效,後來是在 /etc/pacman.conf 裡 [archlinuxfr] 的地方增加 SigLevel = Optional TrustAll ,然後重新執行 sudo pacman -Syu yaourt 才裝好。

執行 yaourt razor-qt 重新編譯安裝以後,圖示仍然沒有出現,再請 Google 大神幫忙以後,才知道是沒裝圖示套件的緣故,就用 sudo pacman -Ss oxygen-icons 就順利解決了。

另外在噗浪的回應裡看到說,除了 Yaourt 之外,還有一個 pacaur ,同樣也是類似 Yaourt 的工具,所以就順便裝上來試試看。但 pacaur 不在官方套件庫裡,只能用 yaourt 來裝,執行 yaourt -S pacaur 就可以了。

 

ArchLinux 初體驗

在 VirtualBox VM 裡裝的。

我是下載 CD image 來安裝,光碟是 LiveCD,只是沒圖形介面,所以拿光碟開完機就是 console,讓我小錯愕一下,還特別重新開機再確認一次。詳細安裝可以參考 Beginners’ Guide ,我是照這篇來安裝的。步驟很詳細,我覺得缺點是初學者可能會不知道要選哪一個。每個章節裡是一個大項目,然後裏面才會提到選擇,例如 bootloader 你可以選 syslinux, grub … 或是磁碟配置你可能要依照情況使用 cgdisk 或 fdisk 等工具。做完,一個乾淨的系統就安裝完成了,開完機會進 Console 模式。

由於是在 VirtualBox 裡,VirtualBox guest utility 必裝:Arch Linux as a guest in a Virtual Machine

pacman 是必學的指令,詳細的說明可以閱讀 ArchLinux Wiki,這邊只提幾個常用的:

  • pacman -Syy :類似 apt-get update
  • pacman -Syu :類似 apt-get upgrade
  • pacman -S :類似 apt-get install
  • pacman -R :類似 apt-get remove
  • pacman -Q :類似 dpkg -l
  • pacman -Ss :類似 apt-ache search

接著是安裝一些必裝的:

  • sudo :總不能一直都用 root 登入,裝這個以後,先新增使用者,設置群組,將使用者加到 wheel 群組裡,然後在 /etc/sudoers 裡取消 wheel 該行的註解。
  • vim :我用 vim …
  • base-devel :為了要編譯 razor-qt 用,這邊我是參考 AUR ,AUR 有點像是寫好的 script,下載 AUR 裡套件的 PKGBUILD 以後,就可以用 makepkg 來包出所需的 package。
  • slim 與 xorg :就為了圖形介面,不過 xorg 連結裡提到的 hal,我沒辦法安裝。有人說是新版已經不需要了。
  • gcin :好用的輸入法
  • firefox :好用的瀏覽器
  • terminator :好用的終端機
  • openbox :搭配 razor-qt 用的,LXDE 也用這個。

桌面環境,我是用 razor-qt,用 pacman -Ss 找不到,所以自己去 AUR 找 PKGBUILD,然後 build,再安裝。接著依照 Wiki 上的說明去設置 .xinitrc。

最後就大功告成了。裝完以後的感想是,對終端機的操作有點基礎會比較適合使用這個 distro。

參考資料:

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