tag:blogger.com,1999:blog-31850603819518262362024-03-13T14:31:55.445-07:00Hsian StudioUnknownnoreply@blogger.comBlogger141125tag:blogger.com,1999:blog-3185060381951826236.post-31472800148556920562012-07-12T01:16:00.000-07:002012-07-12T01:26:48.280-07:00python threading<br />
python 提供很方便開thread的方式,其中有兩個function<br />
<br />
<ol>
<li>Thread.join() 等待thread結束</li>
<li>Thread.setDaemon() 設為背景的thread</li>
</ol>
<div>
先來看看下面這一段程式碼<br />
<br /></div>
<pre><code>
import threading
import time
class MyThread(threading.Thread):
def __init__(self, init_counter_value):
threading.Thread.__init__(self)
#self.daemon = True
self.counter = init_counter_value
def run(self):
while True:
print self.counter
self.count()
time.sleep(1)
def count(self):
self.counter += 1
if __name__ == "__main__":
t = MyThread(10)
print t.isDaemon()
t.start()
#t.join()
print "main finish"</code></pre>
<br />
這一段程式幾乎是使用 threading.Thread 的標準 pattern 了,我主線程去開了一個另外的線程,如果把這個線程透過 setDaemon() 來設成背景線程的話,則只要主線程不等待子線程的結果 join() 則程式會直接印出 main finish 而結束,因為設為背景線程會隨著主線程結束而結束,因此在線程中開無窮迴圈是可以結束的,只是結束的狀態是沒辦法定義的。<br />
<br />
在 python 文件中提到 The entire Python program exits when no alive non-daemon threads are left. 意思為這個行程 Process 只要沒有活著的線程(這個線程不是背景線程)就會結束,否則控制權會交到開出來的子線程上,主線程已結束,因此透過 Ctrl+C 會沒辦法送 interrupt 進去子線程中,因此在寫 threading 程式的時候建議都設為背景線程以確保當主線程結束後子線程會結束。<br />
<br />
另外 join() 主要是等待開出的線程結束,如果等待的是一個無窮回圈的線程則主線程呼叫 join() 會無法返回,不過join()可以帶timeout參數,看是要等待多久,如果過久沒有反應就不理子線程而向下執行。通常如果確定子線程是無窮回圈的話都會不設定透過 join() 來等待結束。而主線程和子線程可以透過 Queue 來溝通非常的方便Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-7613796477514555612012-06-20T19:31:00.002-07:002012-06-20T19:41:26.792-07:00ssh 免輸入密碼登入常常登入ssh都需要輸入密碼有的時候多台機器需要常常登入就會覺得很煩,可以透過以下的流程簡化ssh登入過程。
假設你有兩台機器A,B而B要直接登入A不輸入密碼。<br />
<br />
1. 在A機器上透過ssh-keygen -t rsa產生id_rsa,id_rsa.pub(在~/.ssh/)這裡注意任何密碼都不用輸入
2. 把A機器上的id_rsa.pub透過scp傳到B機器上的~/.ssh/<br />
3. 在B機器上cat id_rsa.pub >> authorized_keys<br />
<br />
簡單解說一下:
id_rsa: private key
id_rsa.pub: public key
將 public key(id_rsa.pub) 拷貝到遠端的電腦後, 加到那 user 的 .ssh/authorized_keys 中.
之後連線時, 就會用本機的 private key(id_rsa) 與遠端電腦的 public key(authorized_keys) 做認證, 確認完成就可以直接登入, 不需輸入帳號密碼, 而且也比較安全。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-54297702808698992412011-11-03T03:09:00.000-07:002011-11-03T03:29:05.668-07:00project patchdiff 和patch是在opensource project常常用到的工具,這裡介紹一下流程和用法<br /><br />* 建立project<br /><br />myproject<br />-> config -> address.inc<br />-> main.c<br /><br />* 修改project<br /><br />> cp -rfv myproject myproject.orig<br />> cd myproject (開始進行修改)<br /><br />* 建立差異檔 use diff<br /><br />> cd .. (離開myproject目錄,此時可看到myproject 與myproject.orig兩目錄同時存在)<br /><br />此時分辨一下 myproject 是修改完,所以是新的,而myproject.orig則是舊的<br /><br />> diff -urN myproject.orig myproject > myproject.patch (注意,是從舊到新,不能寫反)<br />> cat myproject.patch 看一下內容<br /><pre><code>diff -urN myproject.orig/doc/README myproject/doc/README<br />--- myproject.orig/doc/README 1970-01-01 08:00:00.000000000 +0800<br />+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800<br />@@ -0,0 +1 @@<br />+this is a diff,patch test<br />diff -urN myproject.orig/main.c myproject/main.c<br />--- myproject.orig/main.c 2011-11-03 18:18:25.000000000 +0800<br />+++ myproject/main.c 2011-11-03 18:18:41.000000000 +0800<br />@@ -1,6 +1,8 @@<br /> #include <stdio.h><br />+#include <string.h><br /> <br /> int main()<br /> {<br /> puts("hello world");<br />+ return 0;<br /> }</code></pre><br /><br />* 將myproject.patch分享給別人讓別人套用更新<br /><br />當其實使用者拿到此patch檔的時候,他將要為他的myproject打上更新,因此在目錄下會存在<br />home <br />-> myproject/<br />-> myproject.patch<br /><br />與我們建新patch時相同的目錄結構<br /><br />* 打上myproject.patch更新<br /><br />> patch -p0 < myproject.patch <br /><br />* 注意<br /><br />經過以上流程就已可以打上更新了,但是常常有人會失敗,可能的原因有目錄 錯誤或是-p?路徑不正確,建議使用者可以看一下myproject.patch檔案內容<br /><br />+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800<br /><br />我們要將舊的myproject更新成新的,因此若要使用-p0的話那myproject.patch目錄下也要存在有一個叫myproject目錄,如此可以正確的打上patchUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-50721562928242611112011-11-03T00:34:00.000-07:002011-11-03T00:35:25.026-07:00send-pr logsend-pr -a epdfview.patch<br /><br />To: FreeBSD-gnats-submit@freebsd.org<br />From: Anati Chang <femc7488@gmail.com><br />Reply-To: Anati Chang <femc7488@gmail.com><br />Cc:<br />X-send-pr-version: 3.113<br />X-GNATS-Notify:<br /><br /><br />>Submitter-Id: current-users<br />>Originator: User &<br />>Organization: <organization of PR author (multiple lines)><br />>Confidential: no <FreeBSD PRs are public data><br />>Synopsis: [PATCH] graphics/epdfview: fix wrong color<br />>Severity: non-critical<br />>Priority: low<br />>Category: ports<br />>Class: update<br />>Release: FreeBSD 8.2-STABLE i386<br />>Environment:<br />System: FreeBSD cse.tw 8.2-STABLE FreeBSD 8.2-STABLE #6: Wed Oct 5 11:51:25 CST 2011 gaod@cse.tw:/usr/obj/usr/src/sys/GENERIC i386<br /><br /><br /> <machine, os, target, libraries (multiple lines)><br />>Description:<br /> PDF document will get wrong color, when poppler-glib update to 0.18.0.<br /> apply this thread http://trac.emma-soft.com/epdfview/changeset/367<br />>How-To-Repeat:<br /> apply this patch<br />>Fix:<br /><br /> <how to correct or work around the problem, if known (multiple lines)>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-84589882990345834812011-09-02T01:32:00.000-07:002011-09-02T01:33:54.575-07:00快速建立 FreeBSD 無線網路連線<a href="http://www.wonkity.com/~wblock/docs/html/wireless.html">Quick Wireless Setup On FreeBSD</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-74149557563681524082011-08-18T21:44:00.000-07:002011-08-18T21:47:08.175-07:00Scripting Language 語法對照表寫過多種程式的人,如果不常常使用,一定常常會把語法格式寫錯,今天找到一個很好的網站,它整理了各種常用的scripting language並將它語言特性做了整理,方便查詢
<br />
<br />http://hyperpolyglot.org/scriptingUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-23845781810366646632011-06-13T09:40:00.000-07:002011-06-13T09:55:14.216-07:00update desktop cache在偶然的過程中,發現freebsd會有軟體安裝先後順序的問題,可能會發生檔案無法由某特定軟體開啟,但明明已經安裝了,另外又有可能某軟體升級了,但是圖示卻出不來,這都是因為部份軟體為了求快,而gtk會將這些資料做成cache方便取用,然而每個ports的管理者也許會忘記更新系統內的圖示或軟體對應的快取,因此有些時候自己手動來比較快。<br /><br />* 更新軟體對應快取(針對.desktop檔案)主要產生mimeinfo.cache<br /><br /># update-desktop-database (預設路徑為 /usr/local/share/applications系統路徑)<br />> update-desktop-database ~/.local/share/applications (更新使用者自己的.desktop檔案快取)<br /><br />* 更新軟體對應圖示快取(針對軟體的icons)主要產生icon-theme.cache<br /><br /># gtk-update-icon-cache -f /usr/share/icons/hicolorUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-19144083918196428572011-05-20T03:36:00.000-07:002011-05-20T04:09:13.968-07:00Bind9 dns server在bsd中如果要架設dns server是非常方便的事情,因為內建就有bind9,因此險只要經過一些動作就可以輕鬆架設dns,不過這裡不解釋dns的架構與學理的討論<br /><br />通常dns最少都會有兩台為了防止查不到的情況,因此這裡以master/slave架構來介紹這兩台機器如何共同運作,假設機器有140.114.3.83與140.114.6.93兩台來說<br /><br />* 140.114.3.83 master 設定bind9<br /><br /># cd /etc/namedb/<br /># cp named.conf named.conf.back (先備份起來,免得改壞了)<br /># vim named.conf<br /><code><br />// listen-on {127.0.0.1;}; (要註解掉,因為預設只允許本機查詢)<br />include "named.conf.my_config" (將自己做出來的設定檔用include方法加入)<br /></code><br /># cd /etc/namedb/working/<br /># vim named.conf.my_config (因為在named.conf裡面有指定directory的關系所以要放在working目錄下才讀的到)<br /><code><pre><br />zone "arkbsd.org" {<br /> type master;<br /> file "master.arkbsd.org";<br /> allow-transfer {<br /> 140.114.6.93; (允許的slave機器)<br /> }; <br />};<br /></pre></code><br /># cd /etc/namedb/working/<br /># vim master.arkbsd.org (開始要寫zone檔了)<br /><code><pre><br />$TTL 86400<br />@ IN SOA dns1.arkbsd.org. femc7488.gmail.com. (<br /> 2011052001 ; serial<br /> 8H ; refresh (8 hours)<br /> 2H ; retry (2 hours)<br /> 1W ; expire (1 week)<br /> 1D ; negative cache (1 day)<br /> ) <br /> IN A 140.114.3.83 ; arkbsd.org 正解ip<br /> IN NS dns1.arkbsd.org. ; master dns1<br /> IN NS dns2.arkbsd.org. ; slave dns2<br />dns1 IN A 140.114.3.83 ; dns1.arkbsd.org 正解ip<br />dns2 IN A 140.114.6.93<br />www IN CNAME arkbsd.org. ; www.arkbsd.org為arkbsd.org的alias<br />ftp IN CNAME arkbsd.org.<br />aria IN A 220.134.30.214<br />tifa IN A 140.114.6.93<br />movie IN A 114.34.131.23<br />locker IN A 140.114.6.114<br /></pre></code><br /><br /># echo 'named_enable="YES"' >> /etc/rc.conf<br /># /etc/rc.d/named start (之後可以看一下在/var/log/message中有沒有錯誤)<br /><br />* 140.114.6.93 slave 設定bind9<br /><br /># cd /etc/named/<br /># cp named.conf named.conf.back (一樣先備份)<br /># vim named.conf<br /><code><br />// listen-on {127.0.0.1;}; (要註解掉,因為預設只允許本機查詢)<br />include "named.conf.my_config" (將自己做出來的設定檔用include方法加入)<br /></code><br /># cd /etc/namedb/working/<br /># vim named.conf.my_config (因為在named.conf裡面有指定directory的關系所以要放在working目錄下才讀的到)<br /><code><pre><br />zone "arkbsd.org" {<br /> type slave;<br /> file "slave.arkbsd.org";<br /> masters {<br /> 140.114.3.83;<br /> };<br />};<br /></pre></code><br />在slave機器中不需要編輯slave.arkbsd.org的zone檔,因為它會由master來提供<br /><br /># echo 'named_enable="YES"' >> /etc/rc.conf<br /># /etc/rc.d/named start (之後可以看一下在/var/log/message中有沒有錯誤)<br /><br />* 設定完後的工作<br /><br />當設定完當然要看看有沒有正常運作,我們可以透過dig這個命令來查看看是不是可以查的到<br /># dig arkbsd.org @127.0.0.1<br /># dig www.arkbsd.org @127.0.0.1<br /># dig -t ns arkbsd.org @127.0.0.1<br /># dig dns1.arkbsd.org @127.0.0.1<br /># dig dns2.arkbsd.org @127.0.0.1<br /><br />另外如果正常運作的話 slave中的zone檔會自動透過同步路產生,也可以檢查一下是否存在<br /># cd /etc/named/working/ (看看在6.93那台上有沒有存在slave.arkbsd.org)<br /><br />如果一切都正常的話,就可以將dns代管那邊改為自管,並將dns指向dns1, dns2<br />之後過一段時間我們可以使用<br /># dig arkbsd.org @168.95.1.1<br />查詢結果如果有正確指向我們要的機器的ip的話就代表成功了,如果簡單的dns只需要正解的功能,而反解的話需要上層的設定,除非自己有一個網段下的ip否則可以不用設Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-21494102446286741092011-04-28T12:22:00.000-07:002011-04-28T12:23:43.283-07:00找出目錄下所有壞掉的symblic link找出壞掉的s-link<br /><br />find . -type l | perl -lne 'print if ! -e'<br /><br />配合xargs 做刪除動作<br /><br />find . -type l | perl -lne 'print if ! -e' | xargs rm -rfUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-43962427112341200452011-04-26T17:43:00.000-07:002011-04-26T17:46:04.988-07:00geany 基本設定一般<br />->startup->project files 刪掉<br />介面<br />->show sidebar 不勾<br />->顯示符號列表 不勾<br />->show documents list 不勾<br />->字型Editor: Bistream Vera Sans Mono Roman 10<br />工具例<br />->Icon Style-> Images Only<br />->Icon Size->Very Small icons<br />編輯器<br />->Indentation->Type->Spaces<br />->Auto-indent mode->basic<br />->Display->Long line marker->Enabled 不勾<br />keybindings<br />->自動補完文字 刪除<br />->開啟訊息視窗 F12Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-68492876707658401972011-04-20T12:53:00.000-07:002011-04-20T12:58:43.036-07:00jpg to pdf在unix下有一個很好用的工具叫ImageMagick它能處理各種格式的轉換,而如果想要將許多的照片壓成一本相本給人家看的話,那輸一出PDF格式在試合不過了,而這個工具就可以讓你簡單的就做到這個工作。<br /><br />$ convert *.jpg ok.pdfUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-51667580381283187832011-04-19T23:14:00.000-07:002011-04-19T23:30:31.893-07:00xrandr dual monitor一般來說要設定雙螢幕的話要透過xorg.conf,在/usr/local/etc/X11/下的一個設定檔,簡單以nvidia原生的軀動和xf86的nv來比較好了,對於nvidia原生的軀動可以透過nvidia-driver來安裝,之後再load kernel module就好了,之後就是需要透過nvidia-settings這個工具來幫我們編輯設定我們的xorg.conf,這樣可以完成設定,另外的話可以由xrandr來動態的設定,但目前就我知道,好像nv才行原生的軀動的話不行。<br /><br />* 先列出目前有多少個輸出裝置<br /><br />$ xrandr -q<br />如果沒意外的話應該會看到有DVI0 VGA1 VGA2這樣的裝置代號<br /><br />* 設定雙螢幕<br /><br />$ xrandr --output VGA1 --mode 1024x768 --output VGA2 --mode 1024x768 --right-of VGA1<br />以我的電腦來說我接了兩個VGA的螢幕所以我有VGA1 VGA2我將兩個大小都設成1024x768之後在指定VGA2在VGA1的右邊<br /><br />--output 輸出裝置如VGA1 DVI0<br />--mode 輸出的解析度如1024x768<br />--right-of 輸出裝置如VGA1<br /><br />* 設定虛擬桌面大小<br /><br />如果沒意外的話,應該會出現一個錯誤讓你無法設定,那就是虛擬桌面的大小沒有支援到超過單一個螢幕大小,但是這是可以修改的,重新打開xorg.conf之後找到SubSection "Display"之後改成<br /><br /><code><pre> Section "Screen"<br /> Identifier "Default Screen"<br /> Monitor "Configured Monitor"<br /> Device "Configured Video Device"<br /> SubSection "Display"<br /> Virtual 2048 768<br /> EndSubSection<br /> EndSection</pre></code><br />這樣就可以正確的透過xrandr來設定了,xrandr還可以動態的改成許多不同的顯示方式如mirror就是一種。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-76598229429262721682011-04-14T11:26:00.000-07:002011-04-14T11:36:25.430-07:00xcompmgr在X環境中最如果要達成視窗有的透明卡,看起來會比較炫,但沒什麼用的時候,這個軟體xcompmgr很好用,以下是它的一些使用參數<br /><br />-r 由client端模糊的半徑值,預設為12。<br />-o 由client端的半透明值,預設為75。<br />-l 左邊陰影的偏移量,預設為-15。<br />-t 上面陰影的偏移量,預設為-15。<br />-I 淡入的時間,預設為0.028。<br />-O 淡出的時間,預設為0.03。<br />-D 淡入淡出的delta效果的時間,預設為10。<br />-c 由client端描繪出模糊的邊框。<br />-C 避免陰影繪到dock、panel windows。<br />-f 淡入淡出、退出和打開效果。<br />-F 淡入淡出的半透明效果。<br />-n 由普通的client支持透明。<br />-s 由server開始繪製。<br /><br />如果有興趣的人可以玩看看我,貼上我使用的參數<br /><br /><code>xcompmgr -c -o.5 -r4 -l-5 -t-5</code>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-49351765516414611592011-04-13T02:13:00.000-07:002011-04-13T04:16:35.952-07:00portmaster upgrade by packages如果有一天你有很多台機器,雖然其中一台常常在升級,但是其它台都很少在管理,如果要快速升級的話,最快的就是透過package來升級,不然每台都做編譯的動作非常浪費時間。因此這裡提供一些動作當參考,可以加速ports的升級。<br /><br />1. 選一台source機,以後都專門做package的機器,並將所有的ports升到最新<br /><br /># cd /usr/ports && make update fetchindex<br /># portmaster -a<br /><br />2. 將機器上所有的ports都做成package<br /><br /># setenv PACKAGES /tmp/ports_package (將所有的ports做出來的package放在/tmp/ports_package中)<br /># portmaster -t -y --clean-distfiles (把所有舊有的distfile都清掉)<br /># portmaster --check-port-dbdir (把沒安裝但留在系統中沒用的所有舊的port config目錄清掉)<br /># portmaster -afF (指定所有ports且先將所有的distfiles抓完、強制執行)<br /># portmaster -afg (強制重編所有的ports並且建立package,千萬要記得-g不然都白做了,根據ports的流程,若要建立package的話編譯是必須的,沒辦法由系統直接打包)<br /><br />之後portmaster就會開紿跑相依性並將所有的ports全都重編且重新安裝,同時會做成package放到之前我們定義的目錄/tmp/ports_package中,不過這過程就要看系統安裝多少ports的複雜度來決定時間,如果你使用的是xterm的話在title bar中會顯示已經完成了多少ports,另外如果不幸中斷的話,可以重新執行最後一行指令,並加上-R讓它將接著下去,而不是全部重做<br /><br />3. 建立ports index並放入/tmp/ports_package<br /><br />因為軟體都有使用到portconf做客製化,因此相依性的部份和用fetchindex抓下來的INDEX-8會有些差異,如果要由package來升級的話,portmaster必須要參考此檔來決定那些要升級,因此我們要由目前ports狀態下做出目前的port index<br /><br /># cd /usr/ports && make index (建立port index INDEX-8)<br /># mv /usr/ports/INDEX-8 /tmp/ports_package<br /># cd /tmp/ports_package && bzip2 -z INDEX-8<br /><br />這個時候ports_package目錄應該為<br /><br />-INDEX-8.bz2<br />+ALL<br />+Latest<br />+....<br />+....<br /><br />4. 將ports_package目錄做成web目錄<br /><br />總之就是建立一個http,並將目錄指向ports_package。比如我開了一個帳號叫srvupgrade,並將所有的ports_package資料都放在public_html之中,架構為<br />/home/srvupgrade/public_html/INDEX-8, ALL, Latest而且對外必須要能存取如http://140.xx.3.xx/~srvupgrade/INDEX-8可以取的到index,而http://140.xx.3.xx/~srvupgrade/ALL可以看的到所有的套件的符號連結<br /><br />5. 在要升級的client端先修改一些參數將package升級導向我們的伺服器<br /><br /># mkdir /tmp/upgrade_package && setenv PACKAGES /tmp/upgrade_package (將package指定到其它地方不要和系統的目錄搞在一起)<br /># setenv MASTER_SITE_INDEX http://140.xx.3.xx/~srvupgrade/ (自己做出來的INDEX-8的網址)<br /># setenv INDEXDIR /tmp/upgrade_package (下載index之後放在/tmp/upgrade_package中)<br /># setenv PACKAGESITE http://140.xx.3.xx/~srvupgrade/Latest/ (指定package要去我們的server上抓)<br /><br />如果不希望每次都設定的話,就寫入.cshrc吧!<br /><br />6. client端開始只使用package升級,而不用到ports<br /><br /># portmaster --index-only --packages-only --delete-packages -a <br /><br />會先下載INDEX-8並存在/tmp/upgrade_package中之後檢查那些軟體需要升級,之後會透過我們指定的PACKAGESITE去我們自己的server上下載回來放在/tmp/upgrade_package,最後升級完成後順便將下載回來已經升級完的package刪除。<br /><br />如果每台機器所裝的軟體都一樣的話,那上面這種方式非常的方便,但是如果這台client還裝了其它的軟體的話,因為server上沒有編,而所做出來的INDEX-8會記錄這些其它軟體也需要升級,所以在升級的過程中我們不能只使用--packages-only,因為一定會有軟體在server上沒有編,所以這些不大的軟體,我們可以由client自己編譯升級,一樣會大幅的減少升級時間<br /><br /># cd /usr/ports && make update fetchindex (先更新整個ports)<br /># portmaster --packages --delete-packages -a (以ports為基礎,如果沒有package版本一樣的話,就由client自己編譯)<br /><br />7. client最後將一些不需要的資料清掉<br /><br /># portmaster --clean-distfiles (將系統沒安裝或是用不到的distfiles清掉)<br /># portmaster --clean-packages (將系統沒安裝或是用不到的package清掉)<br /># portmaster --check-depends (整理所有ports的相依性看有沒有任何的錯誤)<br /><br />* 結論<br /><br />當然做出來的package不但能用來升級,如果有新機器要快速建立的話,直都都透過pkg_add來裝就非常的快<br />透過這種方式升級會更方便且快速,但是做成package來裝的穩定性和相依性比不上由ports來要好,所以除非希望方便升級或是希望要非常快就可以安裝或升級,再用此方法會更好。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-32515950906871288842011-04-01T00:54:00.000-07:002011-04-01T03:41:57.448-07:00portmaster在Freebsd上常用的兩套套件管理程式,大概就是portupgrade和portmaster但是portupgrade是透過ruby寫成的,而且需要額外的資料支援來記錄目前所有的ports內容,所以變成當ports有變動的話同時也要將pkgdb做更新的動作,雖然portupgrade所提供更多工具的支援但是速度就是比較慢,最近已經轉換為portmaster+portconf,因為portmaster沒有辦法單獨的設定一個套件需要的額外參數,所以透過portconf的支援,將不同的軟體需要的編譯參數都寫進去就可以做一個全域的管理了,這裡說明一下portmaster+portconf如何合作並使用。<br /><br />* 架構說明<br />portconf -> 設定不同軟體編譯參數<br />make.conf -> 讀取portconf處理完的編譯參數,之後直接設定整個ports編譯過程follow這些參數<br />ports install (make install clean) -> 已follow所有make.conf各軟體所指定的編譯參數<br />portmaster -> 直接使用底層的ports升級或新增安裝,因此也會同時follow各軟體指定的編譯參數<br /><br />* install portconf<br /># /usr/ports/ports-mgmt/portconf && make install clean<br /># vim /usr/local/etc/ports.conf (portconf的設定參數)<br /><code>*: BATCH=yes | WITHOUT_HAL=yes | WITHOUT_DEBUG=yes | WITHOUT_GNOME=yes | WITHOUT_GCONF=yes | WITHOUT_KDE=yes | WITH_NLS=yes<br />editors/vim*: WITH_X11_ONLY=yes<br />x11/xterm: WITH_256_COLOR=yes<br /></code><br />由此範例可以看出設定的方式很簡單,只要將你想要設定的ports name以path的方式表示,之後如果有多個版本像是vim有6, 7等等的版本,可以直接使用「*」來指定,之後就是加上一個「;」後面就是在ports的Makefile裡面的參數了,以vim來說,我要指定所有的vim版本都使用WITH_X11_ONLY這個參數,而如果有多個參數的話使用「|」來加入更多的設定就行了。<br />而在我第一行的設定中*: BATCH=yes | .... |.... 它的意思表示,所有的ports的編譯安裝都要符合這個全域的設用,所以我不指定路徑,而是直接使用「*:」來指定。<br /><br />* install portmaster<br /># cd /usr/ports/ports-mgmt/portmaster && make install clean<br /><br />那portmaster就是我用來取代portupgrade的ports管理器,它有非常多的參數可以設定,而也有設定檔可以指定常用的編譯參數。<br /><br />* portmaster options<br /><br />-C 防止每次升級或安裝新的ports時都先make clean<br /><br />-G 防止每次升級或安裝新的ports時都要make config跳出選擇視窗<br /><br />-H 不顯示編譯過程<br /><br />-K 防止每次升級或安裝新的ports之後都做make clean<br /><br />-B 防止升級時,將舊的套件備份起來(在portmaster升級流程中,會先將原套件備份起來以免新套件未成功安裝,但是裝完的時候就會將備份移除,備份檔會放在/usr/ports/packages/裡面)<br /><br />-b 升級時,將舊的套件備份起來而不移除<br /><br />-g 升級或是安裝新的套件時順便建立packages(一樣放在/usr/ports/packages/裡面)<br /><br />-n 將所有的行程模擬跑過一次,但是不會真的編譯升級 (其實可以不用,因為最後都會問是否確認要升級)<br /><br />-v 顯示更大量的資訊<br /><br />-w 升級時,將舊的套件的share library備份起來放在/usr/local/lib/compat/pkg中,這個極為<br />重要,因為升級的時候,如果是share library bump跳版次的話,會造成系統中所有用到此函式庫的程式需要重新,若沒有重編會因ld連不到存在的函式庫而造成不能執行,先保留起來在打算是必要的<br /><br />-f 強制執行編譯升級ports<br /><br />-i 互動模式詢問,當升級套件很多的時候,會一個一個的詢問是否要升級安裝<br /><br />-D 升級或移除ports的時候不要將用不到的distfiles砍掉<br /><br />-d 升級或移除ports的時候自動將用不到的distfiles砍掉<br /><br />-m 可以直接下參數給升級ports的時候編譯參數,但我們有portconf所以大概用不到了<br /><br />-x 避免某個套件升級,當將ports全部都升級,但只有某幾個不想升的話,這個參數就用的到了<br /><br />--no-confirm 默認執行,不要跳出任何需要管理者同意的資訊,建議不要開,會有點危險<br /><br />--no-term-title 將你的termainal的title bar顯示為目前進行的進度關掉,預設是開啟的<br /><br />-P 若網路上有可用的package版本的話,直接使用來加速安裝,若沒有的話則執行編譯<br /><br />--packages-build 當升級或安裝軟體的時候,會有build dependency,所以會需要安裝automake或make這樣的ports來當成工具編譯需要的套件,但是往往都會浪費時間,所以提供了使用套件來將這些建立工具直接用package來安裝,可增加效能,同常會搭配--delete-build-only來用<br /><br />--delete-build-only 將build dependency的套件建立完主要的ports之後就將這些工具移除了,同常搭配--packages-build來使用<br /><br />--packages-if-newer 用packages來升或安裝,假設版本沒有跟上ports tree版本號的話也沒關系,一樣用舊一點的packages,但是仍然會比系統中已安裝的ports還要新<br /><br />--always-fetch 不論是否有這個distfiles存在總是重抓一次<br /><br />--packages-local 如果今天已取得所有需要安裝的ports且已經做成packages的話,可直接指定用這些package來裝,而不在上網去下載可用版本<br /><br />--local-packagedir=<path> 配合--packages-local一起使用,若不想和系統的packages放在一起搞混的話,可以將人做整個系統做好的package下載到一個你喜歡的目錄,假設為/tmp/mypkg則可以指定這個路徑,之後使用--packages-local參數來升級,就會以/tmp/mypkg的目錄,將所有的ports以packages的方式全部升級<br /><br />-a 確認所有的ports有沒有必要升級,通常都要先做完ports tree cvs update<br /><br />--show-work 來顯示某個ports它的相依性,還有那些沒有安裝,那些已經安裝<br /><br />-o 將目前的某ports取代成另某ports,比如版本的轉換,將firefox換成firefox36<br /><br />[R-] -r 重編所有相依到某套件上一層所有ports,通常ports version bump的時候就會這樣做了<br /><br />-R表示若因某原因中斷,而加上此參數可以接續上次處理一次的流程接著處理完,而不重新執行<br /><br />-l 列出所有目前安裝的ports並分類好<br /><br />-L 列出所有目前安裝的ports分類好,且同時檢查是否要升級<br /><br />--list-origins 列出目前所有上層ports在ports tree的原名<br /><br />-F 只抓取新的distfiles而不做任何動作<br /><br />-y 對所有執行的動作都回答yes<br /><br />-e 移除某個ports且會自動運行-s將不在需要的ports一併移除<br /><br />-s 移除不在需要相依的ports<br /><br />--clean-distfiles 移除不在需要的distfiles,若有指定-d的話會自動移除<br /><br />--clean-packages 移除不在需要的packages<br /><br />--check-depends 確認目前所有的ports相依性,若有缺當的相依性的話,會顯示出來<br /><br />--check-port-dbdir 確認目前在/var/db/ports下每個ports的設定,是否有過舊,或ports已移除而將不必要的port config也移除<br /><br />* portmaster config<br />如果要將上面的設定都記得的話是件很麻煩的事,所以portmaster有提供一個設定檔在/usr/local/etc/portmaster.rc 可以從portmaster.rc.sample cp一份過來,以下是我常用的設定<br /><br /><code>NO_BACKUP=Bopt (不要保留已移除ports的備份檔)<br />ALWAYS_SCRUB_DISTFILES=dopt (不要保留舊有的distfiles)<br />PM_NO_MAKE_CONFIG=Gopt (升級或安裝時不要做make config)<br />PM_VERBOSE=vopt (每個portmaster顯示行為和過程)<br />SAVE_SHARED=wopt (保留已經移除ports的share library避免port version bump)</code><br /><br />* portmaster Example<br /><br />若不直接使用ports tree來安裝新軟體,也可以直接透過portmaster來安裝新的ports<br /># portmaster editors/vim (若vim軟體已存在的話會自動重裝蓋過,若有新版本的話會自動升級)<br /><br />用portmaster來移除ports和不在被相依的ports<br /># portmaster -e portupgrade [-n|-y] (-e會自動呼叫-s做清除無用的ports,且會詢問是否執行)<br /><br />用portmaster來升級所有的ports<br /># cd /usr/ports && make update fetchindex (更新ports tree)<br /># portmaster -a [-n|-y]<br /><br />用portmaster來安裝或升級軟體,並同時建立package<br /># portmaster -g editors/vim<br /><br />用portmaster來轉換其它版本的ports<br /># portmaster -o www/firefox36 firefox-4.0_1,1<br /><br />用portmaster來清除無用的distfiles<br /># portmaster --clean-distfiles [-n|-y]<br /><br />用portmaster列出目前所有套件並分類<br /># portmaster -l<br /><br />用portmaster列出目前所有套件並以ports name來顯示<br /># portmaster --list-origins<br /><br />用portmaster來檢查所有ports的相依性問題<br /># portmaster --check-depends<br /><br />用portmaster來檢查並刪除舊有的port config<br /># portmaster --check-port-dbdir [-n|-y]<br /><br />用portmaster來檢查並刪除舊有的packages<br /># portmaster --chean-packages [-n|-y]<br /><br />用portmaster來安裝新ports,但避免時間的浪費,所以將build dependency用packages來裝,且之後這些build dependency的packages要刪除不要佔空間<br /># portmaster --packages-build --delete-build-only ports-mgmt/portupgrade<br /><br />用portmaster來檢查新安裝一個ports還需欠有那些相依性要先裝<br /># portmaster --show-work ports-mgmt/portupgrade<br /><br />用portmaster來安裝新的ports並看看有沒有packages可以用免得自己編譯浪費時間<br /># portmaster -P ports-mgmt/portupgrade (注意:這和 PACKAGESITE環境變數有關,不然會抓到的是和光碟版一同釋出的ports版本)<br /><br />用portmaster全部升級所有ports,但是只有firefox和vim不升級<br /># portmaster -x firefox -x vim -a<br /><br />如果某個ports發生ports version bump的話,需要重編所有相依到此ports的上層ports<br /># portmaster -r graphics/png<br /><br />如果整個系統做跳版次的升級7.3r -> 8.2r 那麼必須將所有的ports全部重編<br /># portmaster -fa<br /><br />* 結論<br />用了portupgrade差不多一年多了,轉換到portmaster之後覺整個升級流程速度快上很多,雖然portupgrade還是穩定一些,而且選擇更多,但是相對的portmaster比較簡單而且不需要額外的資料庫支援,因為後來發現portconf這個好物之後就直接換到portmaster了,原本只有在portupgrade裡面所用到的pkgtool.conf,而在portconf也可以做的到了。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-83792362443135987032011-03-25T03:13:00.000-07:002011-05-23T05:07:25.457-07:00Virtualbox 安裝過程* 從ports來安裝<br /><br /># cd /usr/ports/emulators/virtualbox-ose<br /># make install clean<br /><br />* 裝完設定<br /><br /># echo 'vboxdrv_load="YES"' >> /boot/loader.conf<br /># ceho 'vboxnet_enable="YES"' >> /etc/rc.conf<br /># pw groupmod vboxusers -m who_want_to_use_virtual_box<br /><br />* usb支援設定<br /><br /># pw groupmod operator -m who_want_to_use_virtual_box<br /># vim /etc/devfs.rules 加入以下設定<br /><code>[localrules=10]<br />add path 'usb/*' mode 0660</code>表示將usb的device node設為operator群組都可以讀寫<br /># echo 'devfs_system_ruleset="localrules"' >> /etc/rc.conf<br /><br />如果完成以上動作,只要建立vm的時候將usb controller開啟,那麼winxp啟動的環境下位於virtualbox視窗右下方有一個usb圖案,如果你有連結usb裝置的話,點選就會列出有那些usb裝置可以使用,只要點選了winxp就會偵測到有新裝置插入了<br /><br />* 共用資料夾設定<br /><br />當設好共用資料夾之後,要透過windows把這個共用資料夾當成網路磁碟來使用,因此我們要為此共用資料夾新增一個網路磁碟<br /><br />start -> run -> cmd<br />C:\> net use z: \\vboxsvr\which_folder_want_to_share<br /><br />* 直接啟動已建立的vm以xp為例<br /><br />$ VBoxManage startvm winxpUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-54026179233061087022011-02-10T02:48:00.000-08:002011-02-10T02:51:23.981-08:00ports downgrade當ports軟體不穩定,或是有bug時我們都很期待開源工作者釋出修正,不過有時候為了急著用,所以可以用下面的方法把版本降回以前的版本先擋著使用<br /><br />cd /usr/ports/sysutils/portdowngrade<br />make install clean<br />rehash<br />portdowngrade -o -s \\<br />:pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs lang/php4Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-84404254558161332022011-02-09T10:50:00.000-08:002011-02-09T10:53:04.400-08:00Freebsd building package如果需要讓別人安裝和自己系統一樣的軟體版本或是自己客制過的軟體的話,可以用以下的指令來建立一個套件庫<br /><br />cd /var/db/pkg/ && find . -name '+CONTENTS' | xargs grep " ORIGIN:" | awk ' { match($1, "ORIGIN:"); print "portupgrade -fp -m \"BATCH=yes\" \"" substr($2,8) "\""; } ' > /tmp/all_pkg.shUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-3818373343292390212010-11-16T12:08:00.000-08:002010-11-16T12:34:33.359-08:00ibus add boshiamy input method在ibus中安裝嘸蝦米輸入法網路上已經有非常多的解決方法,經過一些參考之後自己也整理了一份,若有需要的朋友可以直接下載<br /><br />http://moon.cse.yzu.edu.tw/~s932361/bsd/ibus_boshiamy.tgz<br /><br />※包含以下內容<br /><br />liu.txt 所有字根拆碼表<br />liu.db 己產生可以給ibus用的字根表 <br />liu.png 給ibus用的圖示<br /><br />※安裝方法<br /><br /># cp liu.db /usr/local/share/ibus-table/tables/<br /># cp liu.png /usr/local/share/ibus-table/icons/<br />重啟動ibus就完成了<br /><br />※自己手動製作字根表<br /><br />請參考 http://cmchao.pixnet.net/blog/post/26079454<br />備用載點 http://moon.cse.yzu.edu.tw/~s932361/bsd/ibus_liu_gen.tbz<br /><br />而它所需要的table請從有安裝嘸蝦米的windows中將liu-uni2.tab liu-uni3.tab liu-uni4.tab liu-uni.tab找出來後並複製到ibus_liu_gen的目錄中,之後直接執行uni2txt.sh就可以一次完全轉完產生出liu.txt字根表,在透過以下指令產生出ibus可使用的字根表格式,就可以使用了<br /><br /># ibus-table-createdb -s liu.txt -n liu.dbUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-86541936612165055412010-11-11T08:39:00.000-08:002010-11-11T09:22:18.328-08:00freebsd pkg_infopkg_info是freebsd一個非常重要的指令,拿來查詢目前安裝的軟體,雖然man文件寫的很清楚,不過常用的幾個功能記錄一下<br /><br />1. 查詢某一套件<br />> pkg_info -Ex gtk<br /><br />2. 查詢套件相依<br />> pkg_info -rx py26-gtk<br /><br />3. 查詢套件被相依<br />> pkg_info -rx py26-gtk<br /><br />4. 查詢套件安裝資訊<br />> pkg_info -Dx virtualbox-ose<br /><br />5. 查詢套件包含的檔案<br />> pkg_info -Lx virtualbox-ose<br /><br />6. 查詢套件的說明<br />> pkg_info -dx pkg_tree<br /><br />7. 查詢套件屬於那個ports<br />> pkg_info -ox virtual<br /><br />8. 查詢某檔案屬於那個套件<br />> pkg_info -W libglx.so<br /><br />9. 查詢某個ports安裝後為那個套件<br />> pkg_info -O ports-mgmt/pkg_tree<br /><br />當然光有pkg_info工具不夠,所以通常大概會裝幾個關於管理的工具如<br />1. pkg_tree 了解套件之間相依性<br />2. portupgrade 裡面的集合的工具如pkg_deinstall pkgdb ....<br />3. bsdadminscripts 裡面集合的pkg_libchk ...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-45220516456470177682010-10-20T12:06:00.000-07:002010-10-20T12:25:05.399-07:00fontconfig command介紹幾個X11上面對於fontconfig好用的指令<br /><br />$ fc-cache -fv 更新目前字型資料庫,通常會先把xx.ttf搬到 ~/.fonts/下再執行<br />$ fc-list 顯示目前安裝的字體有多少個<br />$ fc-list :lang=zh 顯示目前安裝的字體屬於中文的有多少個<br />$ fc-match 查詢目前fontconfig幫你選到的字型是那個<br />$ fc-match -s 列出除了選到的字型外,其它後補字型的排序<br />$ fc-match -s sans-serif 列出選到無襯線字體的字型排序<br />$ fc-match -s serif 列出選到襯線字體的字型排序<br />$ fc-match -s monospace 列出選到等寬字體的字型排序<br /><br />大約這幾個就夠用了,以下補充一下,在X11下因為中英文混雜,也許使用的中文字型內含的英文字太難看,或是根本沒有英文字型,所以會造成讓fontconfig選字上的困難,預設fontconfig會先看locale所以讀到若是utf8的話,會讓中文字型優先,因此會使用中文字型內含的英文字,因此如果要使用其它的英文字型的話,必須要讓英文優先順序先選,選完一定沒有中文字型,之後在來選中文字型,就可以讓好看的英文字母來配需要中文顯示的中文字型<br /><br />$ vim ~/.fonts.conf<br /><pre><code><?xml version="1.0"?><br /><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><br /><fontconfig><br /><alias binding="strong"><br /> <family>sans-serif</family><br /> <prefer><br /> <family>Bitstream Vera Sans</family><br /> <family>AR PL New Sung</family><br /> </prefer><br /></alias><br /><alias binding="strong"><br /> <family>serif</family><br /> <prefer><br /> <family>Bitstream Vera Serif</family><br /> <family>AR PL New Sung</family><br /> </prefer><br /></alias><br /><alias binding="strong"><br /> <family>monospace</family><br /> <prefer><br /> <family>Bitstream Vera Sans Mono</family><br /> <family>AR PL New Sung</family><br /> </prefer><br /></alias><br /></fontconfig><br /></code></pre><br />以上有看到使用到「 binding="strong" 」主要目的是讓fontconfig強制選字排序,忽略locale中要先選utf8的字型。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-53351873623120997182010-10-07T21:45:00.000-07:002010-10-07T22:08:26.898-07:00synergy usage有一個很好用的軟體可以透過網路來模擬KVM,讓兩台不同的電腦連在一起,然後用同一組鍵盤和滑鼠就可以控制了,但是對於螢幕當然是沒有辦法一定要各自有自己的螢幕,但是可以省掉一組鍵盤滑鼠,還算不錯用<br /><br />以下內容是將兩台電腦(一台 winxp,另一台freebsd)連結在一起<br /><br />step1) 安裝軟體<br /><br />winxp 的部份先去下載 <a href="http://synergy-foss.org/pm/projects/synergy/tabs/download">http://synergy-foss.org/pm/projects/synergy/tabs/download</a><br />然而在freebsd的部份用ports來安裝<br /># cd /usr/ports/sysutils/synergy<br /># make install clean<br /><br />step2) 軟體設定<br /><br />在winxp方面只要設定好電腦的名稱就行了,它的名字必須對映到設定檔裡面的screen name,所以將winxp的synergy名稱設為winxp-desktop<br />而freebsd方面我們要當成主控端,因此要寫一個.synergy.conf的設定檔放在家目錄下面<br />$ cd ~<br />$ vim .synergy.conf<br /><pre><code><br />section: screens<br /> Enya.arkbsd.org:<br /> winxp-desktop:<br />end<br /><br />section: links<br /> winxp-desktop:<br /> right = Enya.arkbsd.org<br /> Enya.arkbsd.org:<br /> left = winxp-desktop<br />end<br /></code></pre><br />注意在screens那邊第一行和第二行順序沒有差異,但是必須要對映到正確的電腦名稱<br />Enya.arkbsd.org 對應到我freebsd hostname 如果不知道的話,用uname -n來查詢<br />winxp-desktop 對應到windows的電腦名稱,也就是剛剛設過的名稱<br /><br />在links那邊是要設定當滑鼠移到螢幕邊界的時候要到那一台電腦<br />winxp-desktop在Enya.arkbsd.org的左邊<br />反過來說Enya.arkbsd.org在winxp-desktop的右邊<br />以像上面範例的格式填好之後,設定檔就完成了<br /><br />step3) 執行軟體<br /><br />必須先執行server端的程式這樣client才可以連結的到,我們主控端是在freebsd而被控端是winxp的電腦<br />$ synergys<br />完成freebsd 主控端的啟動<br />接著在啟動winxp上的被控端,輸入主控端的ip之後就可以完成聯結了,可以使用滑鼠移出螢幕來確認看看Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-72524991956669707352010-10-07T19:20:00.000-07:002010-10-07T19:24:54.024-07:00youtube-dl如果要下載youtube的影片的話,可以使用這個由python所寫成的簡單下載程式,而且還支援續傳,雖然是文字介面,但用起來還算方法<br /><br />step 1)<br /><br /># cd /usr/ports/www/youtube_dl<br /># make install clean<br /><br />step 2)<br />$ youtube-dl -b -o Linux_WM_show.flv "http://www.youtube.com/watch?v=0ABzP9X0zwI"<br /><br />參數<br />-b best rate<br />-o output file name<br />"URL"Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-86978737448165512342010-10-07T19:18:00.000-07:002010-10-21T00:52:11.460-07:00irssi config commandirssi 註冊nick使用者<br /><br /><code>/set nick NAME<br />/msg -OFTC nickserv info 查看nick有沒有人註冊<br />/msg -OFTC nickserv help 查看註冊說明<br />/msg -OFTC nickserv register your_password your_email<br />之後去收信,會有一封確認信,在將信內容的指令貼到irssi中就完成了<br />若這個nick己經有人使用的話,重新使用/set nick NAME設定其它的nick<br /></code><br /><br />irssi 刪除己註冊過的nick使用者<br /><br /><code>/msg -Freenode nickserv drop your_nickname your_password<br />/msg -Freenode nickserv info your_nickname 查看相關資訊<br /></code><br /><br />irssi 己註冊使用者開始連線各伺服器和頻道<br /><br /><code>/set nick NAME<br />/set theme red<br />/network add -autosendcmd "/^msg nickserv identify your_password;wait 2000" Freenode<br />/network add -autosendcmd "/^msg nickserv identify your_password;wait 2000" OFTC<br />/server add -auto -network Freenode irc.freenode.net 6667<br />/server add -auto -network OFTC irc.oftc.net 6667<br />/channel add -auto #yzugeek OFTC<br />/channel add -auto #yzugossiping OFTC channel_password<br />/channel add -auto #awesome OFTC<br />/channel add -auto ##freebsd Freenode<br />/channel add -auto #python.tw Freenode<br />/channel add -auto #ubuntu-tw Freenode<br /></code>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3185060381951826236.post-27923263459823863572010-10-07T19:08:00.000-07:002010-10-07T19:17:01.044-07:00Modify ibus engine color若使用的gtk顏色為深色系的話,那有的時候在輸入文字要選字的時候幾乎是看不到的,因為預設ibus-table輸入選字欄位是黑色字,因此可以透過以下的方法來修改成白色,比較容易看的清楚<br /><br />$ sudo vim /usr/local/share/ibus-table/engine/table.py<br /><code><br /> 463 attrs.append ( ibus.AttributeForeground (0x7700c3, 0, len(_phrase)) )<br /> 464 elif candi[-1] > 0:<br /> 465 # this is a sys phrase used by user:<br /> 466 attrs.append ( ibus.AttributeForeground (0x000000, 0, len(_phrase)) )<br /> 467 else:<br /> 468 # this is a system phrase haven't been used:<br /> 469 attrs.append ( ibus.AttributeForeground (0x000000, 0, len(_phrase)) )<br /> 470 self._lookup_table.append_candidate ( ibus.Text(_phrase + _tbks, attrs) )<br /> 471 self._lookup_table.show_cursor (False)<br /></code><br />在 ibus.AttributeForeground的0x000000可以改成自己喜歡的色碼,範例如下:<br /><code><br /> 463 attrs.append ( ibus.AttributeForeground (0x7700c3, 0, len(_phrase)) )<br /> 464 elif candi[-1] > 0:<br /> 465 # this is a sys phrase used by user:<br /> 466 attrs.append ( ibus.AttributeForeground (0xeeeeee, 0, len(_phrase)) )<br /> 467 else:<br /> 468 # this is a system phrase haven't been used:<br /> 469 attrs.append ( ibus.AttributeForeground (0xeeeeee, 0, len(_phrase)) )<br /> 470 self._lookup_table.append_candidate ( ibus.Text(_phrase + _tbks, attrs) )<br /> 471 self._lookup_table.show_cursor (False)<br /></code><br />完成之後重新啟動一下ibus就行了Unknownnoreply@blogger.com0