python threading


python 提供很方便開thread的方式,其中有兩個function

  1. Thread.join() 等待thread結束
  2. Thread.setDaemon() 設為背景的thread
先來看看下面這一段程式碼


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"

這一段程式幾乎是使用 threading.Thread 的標準 pattern 了,我主線程去開了一個另外的線程,如果把這個線程透過 setDaemon() 來設成背景線程的話,則只要主線程不等待子線程的結果 join() 則程式會直接印出 main finish 而結束,因為設為背景線程會隨著主線程結束而結束,因此在線程中開無窮迴圈是可以結束的,只是結束的狀態是沒辦法定義的。

在 python 文件中提到 The entire Python program exits when no alive non-daemon threads are left. 意思為這個行程 Process 只要沒有活著的線程(這個線程不是背景線程)就會結束,否則控制權會交到開出來的子線程上,主線程已結束,因此透過 Ctrl+C 會沒辦法送 interrupt 進去子線程中,因此在寫 threading 程式的時候建議都設為背景線程以確保當主線程結束後子線程會結束。

另外 join() 主要是等待開出的線程結束,如果等待的是一個無窮回圈的線程則主線程呼叫 join() 會無法返回,不過join()可以帶timeout參數,看是要等待多久,如果過久沒有反應就不理子線程而向下執行。通常如果確定子線程是無窮回圈的話都會不設定透過 join() 來等待結束。而主線程和子線程可以透過 Queue 來溝通非常的方便

ssh 免輸入密碼登入

常常登入ssh都需要輸入密碼有的時候多台機器需要常常登入就會覺得很煩,可以透過以下的流程簡化ssh登入過程。 假設你有兩台機器A,B而B要直接登入A不輸入密碼。

1. 在A機器上透過ssh-keygen -t rsa產生id_rsa,id_rsa.pub(在~/.ssh/)這裡注意任何密碼都不用輸入 2. 把A機器上的id_rsa.pub透過scp傳到B機器上的~/.ssh/
3. 在B機器上cat id_rsa.pub >> authorized_keys

簡單解說一下: 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) 做認證, 確認完成就可以直接登入, 不需輸入帳號密碼, 而且也比較安全。

project patch

diff 和patch是在opensource project常常用到的工具,這裡介紹一下流程和用法

* 建立project

myproject
-> config -> address.inc
-> main.c

* 修改project

> cp -rfv myproject myproject.orig
> cd myproject (開始進行修改)

* 建立差異檔 use diff

> cd .. (離開myproject目錄,此時可看到myproject 與myproject.orig兩目錄同時存在)

此時分辨一下 myproject 是修改完,所以是新的,而myproject.orig則是舊的

> diff -urN myproject.orig myproject > myproject.patch (注意,是從舊到新,不能寫反)
> cat myproject.patch 看一下內容
diff -urN myproject.orig/doc/README myproject/doc/README
--- myproject.orig/doc/README 1970-01-01 08:00:00.000000000 +0800
+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800
@@ -0,0 +1 @@
+this is a diff,patch test
diff -urN myproject.orig/main.c myproject/main.c
--- myproject.orig/main.c 2011-11-03 18:18:25.000000000 +0800
+++ myproject/main.c 2011-11-03 18:18:41.000000000 +0800
@@ -1,6 +1,8 @@
#include
+#include

int main()
{
puts("hello world");
+ return 0;
}


* 將myproject.patch分享給別人讓別人套用更新

當其實使用者拿到此patch檔的時候,他將要為他的myproject打上更新,因此在目錄下會存在
home
-> myproject/
-> myproject.patch

與我們建新patch時相同的目錄結構

* 打上myproject.patch更新

> patch -p0 < myproject.patch

* 注意

經過以上流程就已可以打上更新了,但是常常有人會失敗,可能的原因有目錄 錯誤或是-p?路徑不正確,建議使用者可以看一下myproject.patch檔案內容

+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800

我們要將舊的myproject更新成新的,因此若要使用-p0的話那myproject.patch目錄下也要存在有一個叫myproject目錄,如此可以正確的打上patch

send-pr log

send-pr -a epdfview.patch

To: FreeBSD-gnats-submit@freebsd.org
From: Anati Chang
Reply-To: Anati Chang
Cc:
X-send-pr-version: 3.113
X-GNATS-Notify:


>Submitter-Id: current-users
>Originator: User &
>Organization:
>Confidential: no
>Synopsis: [PATCH] graphics/epdfview: fix wrong color
>Severity: non-critical
>Priority: low
>Category: ports
>Class: update
>Release: FreeBSD 8.2-STABLE i386
>Environment:
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



>Description:
PDF document will get wrong color, when poppler-glib update to 0.18.0.
apply this thread http://trac.emma-soft.com/epdfview/changeset/367
>How-To-Repeat:
apply this patch
>Fix:

快速建立 FreeBSD 無線網路連線

Quick Wireless Setup On FreeBSD

Scripting Language 語法對照表

寫過多種程式的人,如果不常常使用,一定常常會把語法格式寫錯,今天找到一個很好的網站,它整理了各種常用的scripting language並將它語言特性做了整理,方便查詢

http://hyperpolyglot.org/scripting

update desktop cache

在偶然的過程中,發現freebsd會有軟體安裝先後順序的問題,可能會發生檔案無法由某特定軟體開啟,但明明已經安裝了,另外又有可能某軟體升級了,但是圖示卻出不來,這都是因為部份軟體為了求快,而gtk會將這些資料做成cache方便取用,然而每個ports的管理者也許會忘記更新系統內的圖示或軟體對應的快取,因此有些時候自己手動來比較快。

* 更新軟體對應快取(針對.desktop檔案)主要產生mimeinfo.cache

# update-desktop-database (預設路徑為 /usr/local/share/applications系統路徑)
> update-desktop-database ~/.local/share/applications (更新使用者自己的.desktop檔案快取)

* 更新軟體對應圖示快取(針對軟體的icons)主要產生icon-theme.cache

# gtk-update-icon-cache -f /usr/share/icons/hicolor