quilt

今天終於試用了 quilt,這是一個可以管理 patch 的工具,最早由 Andrew Morton 的一些 script 而來。
專案本來就有寫一些 script 來作 apply 的工作,只是,在想要倒回去或向前的時候,會變得非常麻煩!用 quilt 的話,可以方便的向前或向後。
因為已經有 patch 了,所以施作的方法很簡單,先 import,再 push。

quilt import patch01
quilt push
quilt import patch02
quilt push

之後就可以用 pop 往回推,或用 push 繼續往前了。
小記:坦白說,本來想放棄直接用 git 來作的…因為剛好在看 ProGit,覺得 git 或許會更適用也不一定,不過只是想簡單地往前或往後測試 patch,用 quilt 應該就夠了。
參考資料:

jquery 與 iframe

假設 iframe 的 id 是 f,裡面有個按鈕 id 是 btn,那麼要存取 iframe 裡的元素,可以這樣寫:
[javascript]
// http://simple.procoding.net/2008/03/21/how-to-access-iframe-in-jquery/
alert( $(‘#f’).contents().find(‘#btn’).html() );
[/javascript]
再假設父頁面裡有個 id 是 ta 的 text,iframe 裡要存取父頁面裡的元素,有兩種寫法:
[javascript]
// 方法一 (http://webdevel.blogspot.com/2007/03/iframes-and-jquery-working-with-iframes.html)
alert( parent.$(“#ta”).val() );
// 方法二 (http://groups.google.com/group/jquery-en/browse_thread/thread/5997ef4a60a123af?pli=1)
alert( $(“#ta”, parent.document.body).val() );
[/javascript]
不過,在碰到 cross domain 的情況時,就會行不通了。拜 Google 大神 的時候,大神有提到一些,但我嫌麻煩就沒再去試了…

參考資料:

buildbot

Ubuntu上安裝Buildbot是很簡單的事情:sudo apt-get install buildbot。

比較麻煩的是設定,大致瀏覽了一下 Manual,還是不知道怎麼設定,轉而找 Google 大神,Mousebender 的這篇Installing buildbot,就很簡單易懂。但由於這篇提供的設定是 2006 年的,現在的設定稍稍有改變,c[‘bots’] 必須修正為 c[‘slaves’],後面會提到。

依據 ArchitectureBuildbot必須要有 master 跟 slave,master 負責提供 web 介面跟叫 slave 做事,而 slave 就只聽命令做事,所以設定的時候就要分別設定 master 跟 slave。

master 的設定,得先使用 buildbot create-master [目錄名] 來建立,這會幫你建立一個目錄,並提供你設定檔的範本(master.cfg.sample)。第一步就是要把 master.cfg.sample 改為 master.cfg,然後修改 master.cfg。要調整的基本上有這幾個:

  • c[‘schedulers’],要排程的時間。
  • f1.addStep(),這決定怎麼編譯。
  • c[‘slaves’]、c[‘slavePortnum’],slave的名稱、密碼以及要 listen 的 port,待會建立 slave 時會用到。
  • c[‘projectName’],你專案的名稱。
  • c[‘projectURL’],你專案的網址。

接著要建立 slave,這邊用 master.cfg.sample 來舉例,也就是假設你剛剛沒改 c[‘slaves’]、c[‘slavePortnum’] 的內容,所以這邊用 buildbot create-slave [目錄名] localhost:9989 bot1name bot1passwd 來建立 slave,接著把 slave 目錄下的 Makefile.sample 改為 Makefile 即可。

啟動的時候,要先啟動 slave 再啟動 master,啟動的指令都是 buildbot start [目錄名],例如 buildbot start myproject-master、buildbot start myproject-slave。

這樣就大功告成,你可以打開 http://localhost:8010 來看 build 的進度了。

下面是我的設定檔:

# -*- python -*-
c = BuildmasterConfig = {}
####### BUILDSLAVES
from buildbot.buildslave import BuildSlave
c['slaves'] = [BuildSlave("myproject-slave", "password", max_builds=1)]
c['slavePortnum'] = 9989
####### CHANGESOURCES
from buildbot.changes.pb import PBChangeSource
c['change_source'] = PBChangeSource()
####### SCHEDULERS
from buildbot.scheduler import Scheduler, Periodic
c['schedulers'] = [
Periodic("every_12_hours", ["buildbot-full"], 12*60*60 )
]
####### BUILDERS
from buildbot.process import factory
from buildbot.steps.source import CVS
from buildbot.steps.shell import Compile, ShellCommand
from buildbot.steps.python_twisted import Trial
f1 = factory.BuildFactory()
f1.addStep(ShellCommand(command=["/home/user1/build/build.sh"]))
f1.addStep(Compile())
b1 = {'name': "buildbot-full",
'slavename': 'myproject-slave',
'builddir': "full",
'factory': f1,
}
c['builders'] = [b1]
####### STATUS TARGETS
c['status'] = []
from buildbot.status import html
c['status'].append(html.WebStatus(http_port=8010))
####### PROJECT IDENTITY
c['projectName'] = "myproject"
c['projectURL'] = "http://myproject-server"
c['buildbotURL'] = "http://localhost:8010/"

無法移除的 Powershell v1.0

如果你也跟我一樣,因為要安裝 Powershell v2.0 而無法移除 Powershell v1.0 的話,可以研讀 Powershell team 貼的這篇:Windows PowerShell Blog : Behind PowerShell Installer (for Windows XP / Windows Server 2003):,了解一下 Powershell 安裝程式做了什麼。不過這篇字太多了,我其實是參考這篇:BUGBUG: poor title » Blog Archive » How to uninstall Powershell v1.0 from Windows Server 2003 R2 來移除的,除了 pwrshsip.dll 無法刪掉之外,基本上不刪掉也沒關係。接著就可以上 Powershell v2.0 CTP3 了。
為什麼要上 Powershell v2.0 CTP3 呢?這是因為 SQL Server 2008 Management Studio Express 的緣故。真是太機車了…

Ubiquity 0.5 + findbook

Ubiquity 升級到 0.5 了,Parser API 也升級到了 2,語法有改變,所以參考轉換指南修正了一下之前的 findbook:

CmdUtils.CreateCommand({
names: ["findbook"],
contributors: ["elleryq"],
license: "MPL",
description: "讓買書變成更簡單的決定!",
arguments: [ {role: 'object', nountype: noun_arb_text, label: '書名關鍵字'} ],
icon: "http://findbook.tw/favicon.ico",
execute: function(args) {
Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + encodeURIComponent(args.object.text) );
}
});

如果你想入門的話,這份文件可以作為參考:Labs/Ubiquity/Ubiquity Source Tip Author Tutorial
另外,在Ubiquity Command Editor頁面裡也有 command APIs,告訴你有哪些 API 可用。

cvs diff with meld

公司還在用 CVS,Windows 下有 wincvs 這個方便的軟體,Linux 下,我還是習慣用 console 介面,console 介面下,很多事情就要自己來了。

wincvs 可以選用自訂的軟體來比對。但在 console 下,只能用 cvs diff,cvs diff 的話,只會列出 diff 的結果,沒辦法以視覺化的方式呈現比對結果。

所以只好刻一個,簡單的說就是利用 cvs update -p -r(revision) 將結果輸出到暫存檔,再用 meld 來比對這暫存檔與目前檔案:

#!/bin/bash
# author: elleryq
# version: 0.1
# distro: ubuntu
# dependency: cvsnt
if [ ! -e $1 ]; then
echo "$1 is not existed, run 'cvs update $1' first!"
exit -1
fi
[ -z $DIFF ] && DIFF=meld
function usage() {
prog=`basename $0`
echo "Usage:"
echo "    $prog filename revision"
exit 0
}
[ -z $1 ] && usage
if [ -z $2 ]; then
revision=`cvs log $1 | grep head | awk '{print $2;}'`
else
revision=$2
fi
tmpfile=/tmp/$1.$revision
cvs update -r $revision -p $1 > $tmpfile
$DIFF $tmpfile $1
rm -f $tmpfile
exit 0

你可以自訂 diff 軟體,只要設置好 DIFF 這個環境變數即可,預設是 meld

Firefox 附加元件收藏集

最近 Mozilla 推的 Firefox 附加元件收藏集 真的是好東西。
年初趁重裝 Firefox 3.1 的時候,很有心地用 Google docs 整理了一份附加元件的清單,只是後來又安裝/移除了一些元件以後,就忘了再去維護。現在有了 Firefox 附加元件收藏集 就可以方便地管理自己的附加元件了。另外,也可以訂閱別人的收藏集,來找到適合自己的附加元件,這個收藏集的功能實在是很感心啦~
這是目前我的收藏集:elleryq’s collection,也就是我公司 Firefox 有裝的附加元件,居然也不知不覺地裝了 35 個…XD…

gdb 連到遠端 gdbserver 的指令

遠端先把 gdbserver 啟動,並指定 ip:port,例如:gdbserver 192.168.11.1:10000 hello
那麼本地端在啟動 gdb 以後,就可以用以下指令連到遠端:target remote 192.168.11.1:10000
再以 symbol-file 載入有除錯資訊的檔案,就可以進行 debug 了。

Seed(4) – Database

Seed 也支援對資料庫的存取,目前只支援 SQLite。
用法也超級簡單…
基本上只有 constructor 跟用來執行 SQL 的 exec()。以下代碼來自源碼裡 (modules/sqlite/example.js):
[javascript]
#!/usr/local/bin/seed
Seed.import_namespace(“sqlite”);
d = new sqlite.Database(Seed.argv[2]);
d.exec(“create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);”);
d.exec(“insert into t1 (data,num) values (‘This is sample data’,3);”);
d.exec(“insert into t1 (data,num) values (‘More sample data’,6);”);
d.exec(“insert into t1 (data,num) values (‘And a little more’,9);”);
d.exec(“select * from t1”, function(results){Seed.print(JSON.stringify(results))});
[/javascript]
取出資料的作法則是將 callback 傳入,以處理一筆 record。上面是用 JSON 輸出整筆 record 內容,其實你也可以將欄位名稱代入 indexer 來取得該欄內容:
[javascript]
d.exec(“select * from t1”, function(results){Seed.print(results[“data”])});
[/javascript]

Run Android on VirtualBox/VMWare

有人問了,所以這裡大致整理一下,也算是留下一個記憶(之後沒有要繼續…Orz…)。
事實上,網路上可以找到許多人的文章,根據歸納之後,我發現大多都是從 android-porting 裡的這篇:Howto build Android full source for X86 Architecture like EeePC(ASUS)轉貼來的,所以只要耐心爬完這篇,大致上都沒問題。

  1. 第一步當然是要把 source 拉下來,這個步驟,官方描述得很清楚:Get source (Android Open Source Project),這裡不多作描述。如果你用的是 Ubuntu 8.10,會踩到雷的只有 libreadline5-dev,因為並沒有該頁面描述的 lib32readline5-dev。這裡我假設你跟官方教學步驟一樣,建了 mydroid 目錄。
  2. sync 整份 source code 以後,還需要 eee 701 的部份,所以要在 .repo 下新增一個檔案,並命名為 local_manifest.xml:
    <manifest>
    <project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/>
    </manifest>

    ,然後再 sync 一次。

  3. 這次的 sync 會很快,結束以後,要先 build kernel。切到 mydroid/kernel 目錄下,複製 mydroid/vendor/asus/eee_701/kernel.config 為 mydroid/kernel/.config,接著執行 make menuconfig,進入 kernel configuration 選單以後,把這幾個 driver 選為 built-in:
    • Device drivers / Network device support / Ethernet (10 or 100Mbit) / EISA, VLB, PCI and on board controllers / AMD PCnet32 PCI support
    • Device drivers / Graphics support / Support for frame buffer devices / VESA VGA graphics support
    • Device drivers / Graphics support / Console display driver support / Framebuffer Console support
    • Device drivers / Graphics support / Console display driver support / Select Compiled-in fonts (VGA 8×8 font, VGA 8×16 font)

    ,再把這些取消:

    • Device drivers / Real Time Clock / Android alarm driver
    • Device drivers / Misc devices / Android pmem allocator

    ,然後重新建置 kernel:make bzImage。

  4. 編譯好之後,把 arch/x86/boot/bzImage 複製為 mydroid/vendor/asus/eee_701/kernel。
  5. 我稍稍更動了一些設定,這樣我後面就省打一些東西:
    • vendor/asus/eee_701/BoardConfig.mk:在 BOARD_KERNEL_CMDLINE 加上 vga=788
    • vendor/asus/eee_701/init.eee_701.sh:把 netcfg eth0 dhcp 改為 dhcpcd eth0
  6. 接著就是建置 image 了,這裡是我用的 script,把以下內容存為 build.sh,並放在 mydroid 下:
    #!/bin/bash
    cp kernel/arch/x86/boot/bzImage vendor/asus/eee_701/kernel
    mkdir -p out/target/product/eee_701/data/
    cp kernel/arch/x86/boot/bzImage out/target/product/eee_701/kernel
    TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make -j2 installer_img
    

    ,執行前別忘了 chmod +x 。

  7. 建置完以後,你會在 out/target/product/eee_701 下找到 installer.img。
  8. 把 installer.img 轉為 VirtualBox/VMWare 可用的 disk image,這邊要利用 VirtualBox 的 vboxmanage 來轉:vboxmanage convertfromraw -format vdi installer.img installer.vdi,如果你用 VMWare,則是:vboxmanage convertfromraw -format vmdk installer.img installer.vmdk
  9. 建置新的 VM,設置為 Linux kernel 2.6,256M 的 RAM,以及一個超過 2G 的硬碟。然後把上個步驟轉好的 disk image 加為第二個儲存裝置。
  10. 接下來,我只以 VirtualBox 為例,因為我沒試過 VMWare,不過原理一樣。將這個 VM 開機,一開機馬上按 F12,選擇從第二個儲存裝置開機。一開機,你會看到 grub 的開機選單,趕緊按下任意鍵,因為這邊要修改一下,預設 Loader 的開機磁碟是 hd(0,0),你要按 e 進行修改,把 hd(0,0) 改為 hd(1,0),再按 b 繼續開機(如果你不熟 grub,麻煩熟悉,這邊我不多說)。開機以後,就會開始進行安裝的動作,Android 會安裝到第一個磁碟上去,這個步驟要等一陣子,如果有錯誤,再重複一次即可,根據我的經驗,有時候會因為切割磁碟失敗而停止安裝,但再從第二個磁碟開機安裝一次,通常即可解決。安裝完成不會有什麼訊息,但看一下畫面上訊息,你應該可以知道已經完成,輸入 reboot 重新開機。
  11. 最後就大功告成啦~接著你可以移除第二個磁碟,因為再也用不到啦~

最後的最後,希望我沒有遺漏~
android