2007/05/31

Palm Foleo 上有 Terminal!

今天 Palm 宣佈了新的產品 Foleo,目前看起來像是輕量級、十吋的筆記型電腦,可以跟 Tero 作些同步的動作。不過我好奇的是另外一個東西,在 Palm 的展示影片當中,竟然出現了 Terminal 這個東西。不知道裡面的系統到底是什麼呢…是 Unix-like 抑或 Palm 自行開發的新系統,或者是 Linux 呢?

palm-foleo-screenshot

[update]
剛剛看了 CNET Taiwan, 裡面的作業系統是 Linux。

2007/05/27

Python 初體驗 (2) - BATON 演算法撰寫

之前的文章提到了用 Python 與 Gnuplot 解決作業之後,我就大量的使用 Python 來解決各項課業上的問題。

最近正在實作 BATON 的演算法,當仁不讓的還是使用 Python 來解決這個問題。以下是我要實作演算法的虛擬碼:
Algorithm: join(node n)
If (Full(LeftRoutingTable(n)) and
Full(RightRoutingTable(n)) and
((LeftChild(n)==null) or (RightChild(n)==null))
Accept new node as child of n
Else
If ((Not Full(LeftRoutingTable(n))) or
(Not Full(RightRoutingTable(n))))
Forward the JOIN request to parent(n)
Else
m=SomeNodesNotHavingEnoughChildrenIn
(LeftRoutingTable(n), RightRoutingTable(n))
If (there exists such an m)
Forward the JOIN request to m
Else
Forward the JOIN request to one of its
adjacent nodes
End If
End If
End If
而下面的則是 Python 實作的程式碼:
def join(child, n):
if Full(n['LeftRoutingTable']) and \
Full(n['RightRoutingTable']) and \
((n['LeftChild'] == None) or (n['RightChild'] == None)):
print ' ' + str(n['Name']) + ' -- ' + str(child['Name']) + ';'
accept(child, n)
else:
if not Full(n['LeftRoutingTable']) or not Full(n['RightRoutingTable']):
join(child, n['Parent'])
else:
m = NodesNotEnoughChildren(n['LeftRoutingTable'], n['RightRoutingTable'])
if(m != None):
join(child, m)
else:
# Forward the JOIN request to one ofits adjacent nodes
if n['LeftAdjacent'] != None:
join(child, n['LeftAdjacent'])
else:
join(child, n['RightAdjacent'])

是不是與虛擬碼非常相似呢?撰寫完演算法後,還有一個工作就是要視覺化的表達樹的結構。正巧這幾個禮拜在紅塵一隅間拾得文章裡面提到了 graphviz 這個非常好用的工具,可以用來產生各種有向、無向圖形。所以就利用這個工具來產生圖形,而 Python 呼叫外部程式當然也是很簡單:
def node(name):
return {
'Parent' : None,
'LeftChild' : None,
'RightChild' : None,
'LeftRoutingTable' : list(),
'RightRoutingTable' : list(),
'LeftAdjacent' : None,
'RightAdjacent' : None,
'Name' : name,
'Level' : 0
}

def travel(node, tstr):
if node['LeftChild'] != None:
tstr += ' ' + str(node['Name']) + ' -- ' + str(node['LeftChild']['Name']) + ';\n'
tstr = travel(node['LeftChild'], tstr)
if node['RightChild'] != None:
tstr += ' ' + str(node['Name']) + ' -- ' + str(node['RightChild']['Name']) + ';\n'
tstr = travel(node['RightChild'], tstr)
return tstr

root = node('root')
child = node('child')
join(child, root)

for i in range(0, int(sys.argv[1])):
c = node(i)
join(c, root)
print 'Finish\n'

tstr = travel(root, '')

temp = Template('graph G{\n$info\n}\n')
s = temp.substitute(info=tstr)

file = open('temp.dot', 'w')
file.write(s)
file.close()

os.system('dot -Tsvg -o temp.svg temp.dot')
os.system('eog temp.svg')
執行完程式後 Eye of GNOME 就開啟了這張繪製好的 SVG 圖檔。

Screenshot-temp.svg

Python 是個好東西阿!

2007/05/18

Picasa 新功能 - Embed Slideshow

終於來了!這也是相簿必備的功能吧 :)



這個功能就放在剛進相簿左邊側欄的 Embed Slideshow

picasa_embed_slideshow

2007/05/16

Taiwan Open Source 活動行事曆

我在 Google Calendar 上開了一個行事曆:『Taiwan Open Source Resource』,用來蒐集臺灣近期 Open Source 的聚會、演講、研討會等活動。目前放置於 Yuren's Info Area 的右邊側欄。按以下的按鈕加入您的 Google Calendar。

2007/05/14

Linux 的筆記型電腦電力都耗費到哪去了?

PowerTop - Linux 底下的電力檢測程式。如果您使用 Intel CPU 的筆記型電腦,可以用 PowerTop 這隻程式來檢測目前應用程式所耗費的電量。

以下是官方網站提供的畫面:
Screenshot

其實我自己也裝了,不過 PowerTop 執行時,他跟我說有些 kernel 的選項如 CONFIG_TIMER_STATS 要打開。已經從人類退化到猴子的我就沒有再去調那些選項。

就算不能用,這東西聽起來還是挺讚的,可以利用這程式來檢視到底哪些程式在消耗電力。在 Tips & Tricks 裡面也提到目前他們檢測出來特別消耗電力的程式,像是 gnome-power-manager, Firefox, Gaim (Pidgin), ibm_acpi, Evolution, ipw2100 等。這也太糟糕了吧,上面這些程式我都有跑!不過 Intel 也很好心的提供了各種 Patch 檔來改善電力耗費,希望 Ubuntu 下的應用程式可以趕快收錄這些 Patch 囉。

延伸閱讀:Kanru’s 探險日誌 - Intel 新玩具 — PowerTop!


2007/05/11

Ubuntu Studio 7.04 釋出兼爆炸

ubuntu_studio_

剛剛看到了 digg 的新聞,Ubuntu Studio 7.04 釋出了!趕緊到官方網站上看,沒想到現在是爆炸的狀況,大概是被 digg 到爆了吧。

Ubuntu Studio 是一個針對多媒體編輯使用者所制定的 Ubuntu 版本,在這個爆炸的時刻,您可以先去 Ubuntu wiki: UbuntuStudio,或者是先閱讀一下 Metamuse介紹

延伸閱讀:Installing Ubuntu Studio 7.04 - Linux For The Creative

如何上 IRC 聊天室

之前的文章介紹了台灣開放源碼的 IRC 頻道,而我自己第一次使用 IRC 軟體的時候其實也有很多不懂的地方,其實很簡單,只需要一篇簡單的教學就可以快速入門了 :)

我們以 Ubuntu 內建的 XChat 來說明。

Windows 的使用者請先到 XChat 的官方網站下載 XChat

XChat 下載

接著安裝步驟就很簡單了,一直按下一步就行了。接下來打開 XChat,Ubuntu 使用者可以在應用程式→網際網路→網路清談(或者 XChat)找到。第一次打開畫面如下:

XChat 選擇伺服器

目前我知道的 IRC 頻道絕大多數都在 Freenode,新手可以先選取 Freenode 伺服器,按下 Connect 後會出現以下畫面:

XChat 選擇頻道

請選擇第二個選項『Join this channel』,並且輸入您想加入的頻道,這個例子裡面我們先加入了 Tossug, Kalug 這兩個頻道,所以鍵入『#tossug,#kalug』,這樣就可以加入聊天室了:

XChat 進入聊天室

開始聊天吧 :D

不過在這邊要提醒大家一點,其實大家都很忙,所以很多人都只是掛在上面,手邊可能正在處理別的事情,如果剛進去的時候沒人搭理你別感到奇怪,掛段時間就會有人講話囉。

2007/05/10

[筆記] irssi 關閉跟特定使用者的對話

頻道可以用 /part 離開,不過用 /msg 跟特定使用者對話我一直都不知道怎麼關…。今天 Google 了一下才發現是 /wc (Window Close 的意思),筆記筆記…。

IRC 頻道

台灣有許多開放源碼的社團,有些是有實體聚會的,而有些是僅在網路上交流的社團,本篇文章蒐集了這些相關的開放源碼 IRC 頻道,讓各位朋友們能夠上去跟我們一起聊聊天。

IRC 簡單的來說是一種聊天室,您可以在 PCMan 的網站上找到教學,或者是看下一篇的《如何上 IRC 聊天室

  • Tossug
    • 台北開放原始碼軟體使用者社群,Taipei Open Source Software User Group,又稱土虱
    • 伺服器:irc.freenode.net
    • 頻道:#tossug
  • KaLUG
    • 大高雄 Linux 使用者協會,Kaohsiung Linux User Group
    • 伺服器:irc.freenode.net
    • 頻道:#kalug
  • Debian Taiwan
    • 伺服器:irc.debian.org
    • 頻道:#dot
  • Ubuntu Taiwan
    • Ubuntu 正體中文站
    • 伺服器:irc.freenode.net
    • 頻道:#ubuntu-tw
  • Gentoo Taiwan
    • Gentoo Linux Taiwan
    • 伺服器:irc.freenode.net
    • 頻道:#gentoo-tw
  • PyTUG
    • Python 台灣使用者群組,Python Taiwan User Group
    • 伺服器:irc.freenode.net
    • 頻道:#python.tw
  • OrzLab
    • Open RazzmatazZ Laboratory
    • 伺服器:irc.freenode.net
    • 頻道:#orzlab
如果有朋友想要推廣一下你們的頻道,可以在這篇留言給我 :)

OSDC.TW 2007 簡報錄影

剛閱讀了 Zonble 的《上個月在 OSDC.tw 2007 講 Vanilla Journal 的錄影》連上 Google Video,發現上面已經有蠻多 OSDC.TW 2007 的簡報錄影,有很多場次沒有辦法一次跑到的,終於有機會補完了 :-)

Google Video - OSDC.TW 2007

2007/05/09

Google Analytics 升級

Google Analytics 升級了!詳細的內容可以看 Google Analytics Blog,看起來又多用了許多 Ajax 的技術讓 Google Analytics 更方便使用。今天進去 Google Analytics 的時候,就看到目前正在升級的消息。

趕快升級我的帳號吧…。

2007/05/05

Pidgin (gaim) 2.0 終於釋出了

等了好久好久,終於釋出了。今天剛去 Pidgin 網站的時候嚇了一跳,整個版面、內容跟之前完全不一樣,看來 2.0 釋出是個很重大的改變阿。

pidgin

不過網站上還看不到 Pidgin 2.0 的新功能介紹,不過一直持續用著 gaim 2.0 beta 系列的我,大概就只覺得名字換了、介面變漂亮了這兩點吧。真希望 MSN 傳檔能夠快一點…。

2007/05/03

Python 初體驗 - 好吃不黏牙!

這幾天上課的老師出了幾個需要畫圖的習題,大致上是要用常態分佈取樣幾個點,X 軸跟 Y 軸給不同的 mean 跟 standard deviation 繪製圖形。另外一個作業是繪出高斯分佈取樣的點的 probability density function。 剛開始還考慮用 perl 來解題,後來想說順便學一下 python,就試著用它來寫寫看。

TimChen 要了些初學者用的網站,就開始看著 咬一口 python 程式語言這本線上書籍學 Python。看完幾頁之後,就發現 python 比想像中的好上手,程式碼也很簡潔。接下來就開始思考要如何解題。

第一個,我需要有高斯分佈的取樣點,馬上查了 "python gaussian distribution",有內建函式!很好很好,馬上就先解決取樣的問題。取樣完後需要 gnuplot 來畫圖。剛開始我打算先輸入到檔案裡面,再用 os module 來呼叫 gnuplot。在這個時候我又查了 "python gnuplot",沒想到又有!原來 python 有提供 gnuplot 的橋接,只要安裝 python-gnuplot 就可以使用了。所以這個問題就解決了,大約花了 30 行左右:

#!/usr/bin/env python

import random, os, Gnuplot

mean = 3
strdev = 10
ns = [10, 100, 1000, 10000]
g = Gnuplot.Gnuplot()
g('set multiplot')
g('set size 0.5,0.5')

for i in range(0, 4):
gauss = list()
for j in range(0, ns[i]):
gauss.append(list())
gauss[j].append(random.gauss(mean, strdev))
gauss[j].append(random.gauss(mean, strdev))

if i == 0:
g('set origin 0,0.5')
elif i == 1:
g('set origin 0.5,0.5')
elif i == 2:
g('set origin 0,0')
else:
g('set origin 0.5,0')

g.plot(gauss)

g('unset multiplot')
raw_input('Please press return to continue...\n')


Screenshot-Gnuplot

Cool, 很好用。第二題要畫高斯分佈的 PDF,算這東西真的還蠻花時間的,後天就要交作業還是抱一下佛腳好了…。搜尋一下發現這東西,可以直接算出 PDF,當然又是直接拿來用…。

#!/usr/bin/env python

import statistics, random, Gnuplot

gauss = list()
gauss2 = list()
gpdf = list()
gpdf2 = list()
g = Gnuplot.Gnuplot()

for i in range(0, 1000):
gauss.append(random.gauss(-2, 1))
gauss2.append(random.gauss(2, 2))
#gauss.append(random.gauss(2, 1))
#gauss2.append(random.gauss(-2, 1))

y, x = statistics.pdf(gauss, kernel = 'Gaussian')
w, z = statistics.pdf(gauss2, kernel = 'Gaussian')

for i in range(0, len(x)):
gpdf.append(list())
gpdf[i].append(x[i])
gpdf[i].append(y[i])

for i in range(0, len(w)):
gpdf2.append(list())
gpdf2[i].append(z[i])
gpdf2[i].append(w[i])

g.plot(gpdf, gpdf2)
raw_input('Please press return to continue...\n')


Screenshot-Gnuplot-1 Screenshot-Gnuplot-2

作業完成!

結論,Python 真的是好物阿!如果有寫其他程式語言的經驗,Python 是相當好學的東西!