越熟悉的人事物,稱呼方式反而五花八門。對於一個普通朋友,你大概只會用固定的名字叫他。對家人或很熟的朋友,往往就會有千奇百怪的暱稱。稱呼也反映意識形態。人只要活著一天,呼吸一秒,就有意識形態。所以請不要將意識形態汙名化。

對於那個曾經叫秋海棠現在變老母雞的國度,我們台灣人(包含仍然自認為中國人的台灣人)幾十年來的叫法是中國大陸,簡稱大陸。現在有另一種叫法,叫做內地。所謂內地就是一種相對說法,表示自己處在外地、離島,而認同自己與內地同為一個國家,且內地在政治經濟文化上具有優勢。台灣在日本統治時代,稱呼日本為內地,當時的台灣與日本本土之間的海上交通,稱為內台航線。因此稱呼內地,表示自己是殖民地子民。現在台灣許多藝人,稱呼中國為內地,不知是否認為中國是殖民宗主國,而台灣還是中國殖民地?(實際上似乎就是這樣,我們的執政黨不就叫做中國國民黨?)

講政治容易踩到火線,所以改談旅遊好了。最近,去了「元內地」。對於做為台灣前一個宗主國的日本來說,稱呼元內地應該沒人會反對吧?用「元」而不用「原」是因為不忘本。沒人反對我使用蒙古異族統治全中國前使用的「元」吧?沒錯!只因為犯沖,漢人的文字也要乖乖迴避,所謂「元人出巡,漢字迴避」,就找了個不搭嘎的同音字「原」來充數囉!

這次是第二次到東京跟橫濱了。第一次去的時候,還在園區的W公司上班,去日本出差。住在新幹線新橫濱站旁邊的王子大飯店。因工作忙碌沒啥時間觀光,現在只記得去過皇居跟東京都廳。這次去,日本經驗多了一些(京都/大阪/札幌/小樽),同樣還是平凡中的感動。感動的是路人耐心聽我們的詢問,有的直接帶我們走過去,有的熱心拿出手機幫我們查路。感動的是人跟人之間起碼的禮貌。不熟裝熟是讓人最討厭的了,裝熟就會輕慢。日本人就算很假好了,也假得讓人覺得舒服。雖然被台灣人批評為「有禮無體」(u le bo the),但總比「無禮無體」(bo le bo the)好吧?

方便的交通,乾淨的市街。1300萬人每天在東京都活動,卻不嫌擁擠。回到台灣,一樣人多,卻不一樣擁擠。差別就在於路上的私家車跟摩托車的數量。台灣的公眾交通建設落後,高鐵完成之後更確定了「強幹弱枝」的態勢。逼得每個人非得靠私家車或摩托車代步。上下班時間,一輛比一輛還肥大的車子就開在路上,裡面大多只有駕駛人一個。這樣不會擠才怪。

Everything has a price. 在東京,你可以以合理的價格搭乘鐵路電車與公車,你不用擔心家裡停車位太少(以台灣人的標準至少一家要有兩三個停車位),你不用擔心公司沒停車位停放,你不用擔心買個早餐要臨停會違規,你就靠大眾運輸系統跟雙腳,完成所有任務。

Everything has a pirce. 在台灣(台北以外啦),沒有私人交通工具,就註定移動的困難。鐵路永遠慢分,公車永遠脫班,行人永遠在行進中的汽車摩托車、停在路邊的汽車摩托車、早餐攤、路障、招牌、鐵欄杆、變電箱等東西夾殺。的確,開車最大,因為官員都開車(或叫別人開),所以摩托車要讓汽車,所以行人要讓摩托車。搞到最後沒人想當路人甲,因為像過街老鼠。不想當路人甲,就買車囉。打不贏敵人,就加入他們。然後路上車更多,空氣更髒。是的,空氣也要錢了。有開車的,坐在空調的車內,開內部對流。沒開車的,就只好乖乖吸汽車廢氣囉。想不到到了二十一世紀的台灣,「呼吸權」是如此不受尊重。

至於小孩、年輕學生,或是老人。對不起!因為若不開車騎車,就只有等公車、走路、或讓別人載的分了。這些事情要付出的代價更高。

所以以交通建設來說,台灣是一個不公義的社會。如果我們改善交通的方式就是蓋更多的道路,把城市空間全讓給車子,最後人的空間就被壓縮。很可惜的是,台灣已經走到這個地步了,要改善也有限了。可以想像二十年後的台灣,摩托車跟私家車的車輛,應該還是遠多於其他國家。到時候,一個普通的公民,要付出什麼樣的代價才可以到他想到的地方呢?

hambao 發表在 痞客邦 留言(0) 人氣()

Python當中最重要的資料結構應該算是list跟dictionary了。要存取list內部的元素,傳統上都是使用index:假設有一個list叫做a,長度為10則它的所有元素為a[0], a[1], a[2], ..., a[8], a[9]。Python除了傳統的index外,又提供了一個像瑞士小刀一樣的東西叫slice,本篇稍微介紹一下slice的威力。

slice的語法是:a[m:n],代表從第m個元素開始取,取到第n-1個元素為止。不過slice的用途遠大於存取元素,它還可以存取「看不見的東西」,這樣講是有點毛毛的。不過,要真正了解slice的威力,或許不要從「元素」的角度來看,而是從「位置」的角度來看。如果我們將list當中,元素之間的空隙(最前面跟最後面也算)也標上數字,大概是這個樣子:P0, a[0], P1, a[1], P2, a[2], P3, ..., P8, a[8], P9, a[9], P10。則a[m:n]就代表從第m個位置開始取,取到第n個位置為止。m跟n可以都出現,可以只出現其一,也可以都不出現。a[m:]指的是第m個位置到最後面,a[:n]指的是最前面到第n個位置,a[:]指的是最前面到最後面,其實就等同於a本身,但注意到只是「值」的相等。

如果我們寫:

a=[0,1,2,3,4]

b=a

c=a[:]

則b跟a都指向同一個address,當a的內容改變,b的內容跟著變,但c是指向另一個address,因此當a的內容改變,c還是等於[0,1,2,3,4]。

有了這個觀念,接下來討論list的彈性,list可以取代/增加/刪除/排序(sort)/逆轉(reverse),此處我只針對取代/增加/刪除,因為排序跟逆轉剛好就有兩個同名的method可以用。

一、用slice來取代元素

我們先講index的取代。若a=[0,1,2,3,4],m=2,n=4:

元素被元素所取代:a[m]=p,取代之後a變成[0,1,p,3,4]

元素被list所取代:a[n]=(p,q),取代之後a變成[0,1,p,3,(p,q)]

注意到list可以容許不同資料型態做為它的元素,因此這裡的p,q可以是數字或字串,甚至是另一個list (p,q)。

用slice來做取代,寫法大同小異,但其功能更強大,且沒有規定取代者或是被取代者的長度,也就是說,取代完之後的list,長度可能不變(跟用index來做取代一樣),但也可能變長或變短。上述兩個例子,我們用slice來做:

a[m:m+1]=(p),取代之後a變成[0,1,p,3,4]

a[n:n+1]=(p,q),取代之後a變成[0,1,p,3,p,q]

我們發現,此時(p,q)成為a的兩個元素,而非一個做為a的元素的list,跟前面用index來做會得到不一樣的結果。a的長度變成6,增加了1。同樣地,若我們寫:

a[n:n+2]=(r),取代之後a變成[0,1,p,3,r],原本的(p,q)被(r)所取代。

二、用slice來增加元素

index有其限制:我們無法存取看不見的東西。slice的出現彌補了這個缺憾,用slice來處理取代更具有靈活性。list的增加刪減,都可以化約為取代。我們舉例如下:

如果a=[0,1,2,3,4]

則a[:0]=(p),取代之後a變成[p,0,1,2,3,4]

則a[len(a):]=(q),取代之後a變成[p,0,1,2,3,4,q]

其實前者就相當於insert(0,p),後者就相當於insert(len(a),q)或是append(q)。

由於slice必須視為一種sub-list,因此後面對應到的(p)跟(q)都必須以list的形式來表示。

聰明的你一定馬上知道,插入的值可以是好幾個元素,不妨試試看以下的assignment:

a[:0]=(p,q,r)

a[len(a):]=(s,t,u)

前者在Python中無對應的method,只能一次insert一個元素,後者就相當於extend((s,t,u))。

若要在特定位置插入一到多個元素,可以這樣寫:

a[m:m]=(p,q,r,...)

這個寫法比insert(m,x)來得強,因為insert一次只能插入一個元素,而用slice來寫,隨便你要插入幾個元素都沒問題。

這裡再補充一點,如果我們將list看做一個集合,則index只是取當中的一個元素,其地位就是一個元素。但slice是取零個到多個元素,其地位是一個集合,更明確來說,它是list的一個子集合(subset)。

三、用slice來刪除元素

要將一個到多個元素刪除,用slice來做很簡單:

a[m:n]=()

所以如果寫:

a=[0,1,2,3,4]

a[2:4]=()

我們會得到:

a=[0,1,4]

同樣地,Python內建了一個method,叫做pop(),但pop()每次只能刪除一個元素,好處是它會回傳該元素的值。若不需知道欲刪除元素的值,則使用slice比較方便。

總之,雖然Python已經內建了許多處理list的method,但功能都有限。若能熟悉slice的用法,則「吾道一以貫之」,可以用這把瑞士刀做許多事情。

 

 

hambao 發表在 痞客邦 留言(3) 人氣()

我的Python筆記,只是在執行任務的過程中將所用到的技巧寫下來,供以後參考。本次的任務是:

「根據某個中文字串,計算每個漢字的出現頻率以及此中文字串的bigram以及trigram的出現頻率」

這裡會用到兩個Python最重要的資料結構:list與dictionary,list就不用說了,幾乎所有的程式語言都有,dictionary則像是Perl中的hash。在這邊我從資料庫的角度,把list跟dictionary都視為欄位與欄位的對應,稱為key欄位與value欄位。key欄位就像資料表格中的主鍵值(primary key),必須是獨一無二。list跟dictionary的差別只在於:

  • list中的key欄位必須為零開始以及自然數(0,1,2,...),value欄位則可以是任何資料形態。list的樣子為(value0, value1, value2, ...)
  • dictionary中的key欄位可以是任何資料形態,value欄位也可以是任何資料形態。dictionary的樣子為{key0: value0, key1:value1, key2:value2, ...}

要存取內容(value欄位)的方法是利用主鍵值:list[key], dictionary[key]。

I. List Indexation

list除了直接指定key外,也可以指定範圍,list[m:n]表示第m個元素開始一直到第n-1個元素。所以如果series=(0,1,2,3,4),series[2:4]會等於(2,3)。m跟n可以省略其一,m省略代表從頭開始取,一直到第n-1個元素,n省略代表從第m開始取,一直到尾。當然囉,list[:]就等於list本身,不過是「值」等同,「身分」並不等同。

II. List Comprehension

List comprehension在許多程式語言都有,是個很簡潔的語法。我們根據一個原有的list,產生另外一個list,很像某種集合表示式。所以,假設我們想將series裡面每個元素平方,形成新元素,可以這樣寫:

series=(0,1,2,3,4)

sqr_series=[num**2 for num in series]
print(sqr_series)

就可以得到如下結果:

[0, 1, 4, 9, 16]

III. Dictionary method: get

傳統function在呼叫的時候是這樣寫的:

function(Data)

Python中有一種跟資料型態依存度很高的function,叫做method。我想這跟物件導向有些關係吧!總之就是不同的object有不同的method。method的寫法如下:(雖然Data改成Object可能更適當,但要跟上面對比,還是用Data)

Data.method()

這邊介紹一個叫做get的method,只適用於dictionary。

有時候,我們想設定或更改某個dictionary裡面的某個key的value,但卻不知道這個key是否已經存在了。若貿然去存取該key的內容,很有可能出錯。get的語法是:

get(key,value)

其中key是我們想要測試的key,value則是在萬一dictionary並沒有這個key的時候,我們要回傳的值。這個等一下我們會用實例來說明。

Task 1: Frequency Distribution of Characters

第一個任務,要先算出漢字的頻率分布。我們先定義一個function,input是個list,output是個dictionary:

def list2freqdict(mylist):
    mydict=dict()
    for ch in mylist:
        mydict[ch]=mydict.get(ch,0)+1
    return mydict

sentence='吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。'
chlist=[ch for ch in sentence]

print(chlist)
chfreqdict=list2freqdict(chlist)
print(chfreqdict)

要注意的是:只有Python 3.1 之後的版本可以直接處理Unicode而不需轉換。因此若你是用Python 2.6/2.7,上述程式碼會錯誤。不過若你非用nltk不可,建議還是在Python 2.6/2.7之下執行。

注意到我們在list2freqdict這個function中,要先用dict()這個function,說明mydict是一個 dictionary,然後就是一個for loop,去檢查每一個中文字串。後面的get若翻成白話文,就是:若該漢字已經在我的dictionary裡面,請將以該漢字為key的value加 1,若還沒有,則回傳0,因為後面還有加1,因此會將1設定給第一次出現在dictionary裡面的漢字key的value。

sentence是一個string,我們這邊先不談如何讀檔寫檔,而是先在程式碼中指定。接著,我們用list comprehension將sentence轉成一個叫做chlist的list。從印出來的結果可以看到chlist的長相,以及頻率分布的字典 chfreqdict。

執行結果如下:

['吃', '葡', '萄', '不', '吐', '葡', '萄', '皮', ',', '不', '吃', '葡', '萄', '倒', '吐', '葡', '萄', '皮', '。']

{'葡': 4, '吃': 2, '。': 1, '萄': 4, '不': 2, ',': 1, '皮': 2, '吐': 2, '倒': 1}

這個chfreqdict有點醜,原因是dictionary並沒有順序的概念,因此印出來的順序是隨機。而且有時候我們只對高頻字有興趣,或是漢字太多,這時應該要有排序,然後只印出次數大於m以上的漢字的次數,或根據次數,印出前n個漢字的次數。

由於我們要sort的標準是dictionary裡面的value,不是key,所以會有點麻煩。我們找到其他人已經造好的輪子拿來用:

from operator import itemgetter
chfreqsorted=sorted(chfreqdict.items(), key=itemgetter(1), reverse=True)
print(chfreqsorted)

得到結果如下:

[('葡', 4), ('萄', 4), ('吃', 2), ('不', 2), ('皮', 2), ('吐', 2), ('。', 1), (',', 1), ('倒', 1)]

若我們想限定只印出前幾個最高次數的漢字及其次數,可以用list indexation。若想只印出出現次數高於某個數字的漢字及其次數,則必須另起爐灶,這邊我們會用到一個list的method,叫做append,要記得由於我們的資料形態是list of lists,而append一次只能附加一個元素,因此要寫成append((ch,num))而不是append(ch,num):前者是說:附加一個叫做(ch,num)的元素,後者是說:附加兩個元素叫做ch與num。這邊我們只印出前5個結果,以及出現次數大於1的結果:

chfreqsorted2=chfreqsorted[:5]

chfreqsorted3=list()
for (ch,num) in chfreqsorted:
    if num > 1:
        chfreqsorted3.append((ch,num))    

print(chfreqsorted2)
print(chfreqsorted3)

得到結果如下:

[('葡', 4), ('萄', 4), ('吃', 2), ('不', 2), ('皮', 2)]

[('葡', 4), ('萄', 4), ('吃', 2), ('不', 2), ('皮', 2), ('吐', 2)]

Task 2: Frequency Distribution of Bigrams and Trigrams

N-gram是自然語言處理常用到的方法,一般是用來計算共現(collocation)。在英文中可以用來計算word與word之間的共現關係,中文則比較常用來計算字與字之見的共現關係,對於斷詞(segmentation)或是計算詞彙的孳生性(productivity)來說非常重要。

我們先定義兩個簡單的function,可以根據一個list產生bigram以及trigram:

def list2bigram(mylist):
    return [mylist[i:i+2] for i in range(0,len(mylist)-1)]

def list2trigram(mylist):
    return [mylist[i:i+3] for i in range(0,len(mylist)-2)]

chbigram=list2bigram(chlist)
chtrigram=list2trigram(chlist)
print(chbigram)
print(chtrigram)

得到結果如下:

[[' 吃', '葡'], ['葡', '萄'], ['萄', '不'], ['不', '吐'], ['吐', '葡'], ['葡', '萄'], ['萄', '皮'], ['皮', ','], [',', '不'], ['不', '吃'], ['吃', '葡'], ['葡', '萄'], ['萄', '倒'], ['倒', '吐'], ['吐', '葡'], ['葡', '萄'], ['萄', '皮'], ['皮', '。']]


[[' 吃', '葡', '萄'], ['葡', '萄', '不'], ['萄', '不', '吐'], ['不', '吐', '葡'], ['吐', '葡', '萄'], ['葡', '萄', '皮'], ['萄', '皮', ','], ['皮', ',', '不'], [',', '不', '吃'], ['不', '吃', '葡'], ['吃', '葡', '萄'], ['葡', '萄', '倒'], ['萄', '倒', '吐'], ['倒', '吐', '葡'], ['吐', '葡', '萄'], ['葡', '萄', '皮'], ['萄', '皮', '。']]

然後來計算頻率。原本我以為list2freqdict()這個function可以直接拿來用,後來發現它的input只能是簡單的list,不能是list of lists,所以又重複造了兩個輪子:

def bigram2freqdict(mybigram):
    mydict=dict()
    for (ch1,ch2) in mybigram:
        mydict[(ch1,ch2)]=mydict.get((ch1,ch2),0)+1
    return mydict

def trigram2freqdict(mytrigram):
    mydict=dict()
    for (ch1,ch2,ch3) in mytrigram:
        mydict[(ch1,ch2,ch3)]=mydict.get((ch1,ch2,ch3),0)+1
    return mydict

bigramfreqdict=bigram2freqdict(chbigram)
trigramfreqdict=trigram2freqdict(chtrigram)
print(bigramfreqdict)
print(trigramfreqdict)

結果如下:

{(' 不', '吃'): 1, (',', '不'): 1, ('皮', ','): 1, ('皮', '。'): 1, ('萄', '不'): 1, ('倒', '吐'): 1, ('萄', '倒'): 1, ('吃', '葡'): 2, ('萄', '皮'): 2, ('不', '吐'): 1, ('葡', '萄'): 4, ('吐', '葡'): 2}


{(' 萄', '倒', '吐'): 1, ('葡', '萄', '不'): 1, ('葡', '萄', '倒'): 1, ('倒', '吐', '葡'): 1, ('皮', ',', '不'): 1, ('不', '吃', '葡'): 1, ('萄', '皮', '。'): 1, ('萄', '不', '吐'): 1, (',', '不', '吃'): 1, ('不', '吐', '葡'): 1, ('葡', '萄', '皮'): 2, ('萄', '皮', ','): 1, ('吃', '葡', '萄'): 2, ('吐', '葡', '萄'): 2}

一樣排序,然後只取前5筆資料:

bigramfreqsorted=sorted(bigramfreqdict.items(), key=itemgetter(1), reverse=True)
trigramfreqsorted=sorted(trigramfreqdict.items(), key=itemgetter(1), reverse=True)
print(bigramfreqsorted[:5])
print(trigramfreqsorted[:5])

結果如下:

[(('葡', '萄'), 4), (('吃', '葡'), 2), (('萄', '皮'), 2), (('吐', '葡'), 2), (('不', '吃'), 1)]


[(('葡', '萄', '皮'), 2), (('吃', '葡', '萄'), 2), (('吐', '葡', '萄'), 2), (('萄', '倒', '吐'), 1), (('葡', '萄', '不'), 1)]

最後,我們寫一個簡單的列印function,將頻率統計弄得比較user-friendly:

def freq2report(freqlist):
    chs=str()
    print('Char(s)\tCount')
    print('=============')
    for (token,num) in freqlist:
        for ch in token:
            chs=chs+ch
        print(chs,'\t',num)
        chs=''
    return

freq2report(chfreqsorted)
freq2report(bigramfreqsorted)
freq2report(trigramfreqsorted)

結果如下:

Char(s)    Count
=============
葡      4
萄      4
吃      2
不      2
皮      2
吐      2
。      1
,      1
倒      1

Char(s)    Count
=============
葡萄      4
吃葡      2
萄皮      2
吐葡      2
不吃      1
,不      1
皮,      1
皮。      1
萄不      1
倒吐      1
萄倒      1
不吐      1

Char(s)    Count
=============
葡萄皮      2
吃葡萄      2
吐葡萄      2
萄倒吐      1
葡萄不      1
葡萄倒      1
倒吐葡      1
皮,不      1
不吃葡      1
萄皮。      1
萄不吐      1
,不吃      1
不吐葡      1
萄皮,      1

到這裡應該算是完美達成任務。如果語料再多一點,應該會看到更有趣的現象。

hambao 發表在 痞客邦 留言(3) 人氣()

今天是文學家吳濁流的逝世紀念日(1976年)。或許許多人對他很陌生,不過只要是新竹地區的人,應該都有到縣立文化中心旁的光明一路吃飯的經驗,特別是那家以數字街為名的餐廳,應該沒有人沒去過。走在光明一路上,相信你會不經意地看到一條跟它垂直的小路,叫做吳濁流路。這條路就是為了紀念這位跟新竹頗有淵源的文學家,吳濁流先生。

吳濁流是新竹新埔客家人,出生於日治時代1900年,台北師範學校畢業,後從事教職,由於眼見台灣人受到日本人歧視待遇,憤而辭職,前往中國南京發展,後返台擔任《臺灣日日新報》記者,是台灣戰後重要的文學家。

他最有名的作品,當屬《亞細亞的孤兒》(大家至少聽過羅大佑的同名歌曲吧?),講一個台灣人,在台灣被日本人歧視,無法成為真正的日本人,在中國被中國人當成日本間諜,無法當一個「堂堂正正的中國人」,身分認同錯亂,最後發瘋的故事。

這篇小說1945年完稿,在2010年,65年後的台灣,似乎還在上演。只是這次是「台灣人」跟「中國人」的拉鋸戰。

看似是兩種mutually exclusive的identity,其實差距並沒那麼大:

尋求「台灣人」認同的人,是尋求一種國家認同。(跟某些把「台灣人」類比「上海人」「北京人」的鄉土認同不同)

尋求「中國人」認同的人,是尋求一種文化認同。(大概等同於「華人」,但絕不是「中華人民共和國公民」)

從吳濁流的《亞細亞的孤兒》完稿到現在,台灣似乎還未脫離孤兒的宿命,似乎「台灣」是一個羞恥的名字,要避免使用,順位遠遠在「中華民國」、「中華台北」、「中國台北」、「台北」之後。就以台灣駐美外交非官方機構來說,從早期的不知所云的「北美事務協調委員會」到現在的「駐美國台北經濟文化代表處」,不知情的人還會以為是在美國推廣台北市經貿或文化相關事宜的單位。

反正就是全世界都叫你台灣了,就只有你自己不知道自己叫什麼。連遠在中歐的捷克布拉格機場的世界地圖,台灣都有自己的顏色跟文字,反倒回到台灣的X品跟XX堂書店,地球儀上面就是一個「中華人民共和國」,台灣跟它顏色一樣,名字小小的跟海南島一樣。自我矮化莫此為甚。你如果只認同中華民國,那請你有志氣一點把台灣用不同顏色標上中華民國,或更有志氣一點把對岸跟蒙古都統一,改叫中華民國。現在是怎樣?為了賺錢寧可不要自己的國家了,還是「誰管都一樣」的奴隸心態?

吳濁流的故事,小時候我並不知道,就跟小時候我不知道蔣渭水、八田與一、二二八事件一樣。我們小時候活在一個神話中,現在這個神話創造者的傳承人,決定要跟原先要打倒的萬惡XX和解,而這個萬惡XX披著開放改革的糖衣,一樣不容許言論自由跟民主改革。這叫我們這些跟隨著你們口號衝的人情何以堪?

自由並非免費,可惜當它看似免費的時候我們不在乎,等它要收費或是只針對特定人士開放入場的時候,我們真的會「欲哭無目屎」(beh khau bo bak-sai)!

hambao 發表在 痞客邦 留言(0) 人氣()

今天早上,到了學校,打開電腦,隨即電腦傳來刺耳的聲音,聽起來很像風扇卡卡。中午拿去HP維修中心,證實風扇異常。工程師把硬碟跟電池拆下來還我,電腦留下來處理。相信大家都有電腦壞掉的經驗,怕的不是電腦整個掛掉,而是重要檔案毀損,所謂硬體有價,資料無價。我當下想到的問題就是,如果整台電腦要重灌,我會損失多少重要資料?

對於需要在不同電腦中處理同樣文件的人來說,帶個隨身碟備份或許是一個常用的方法。不過,同步是一個大麻煩,要先從A電腦拷貝到隨身碟,再從隨身碟拷貝到B電腦,當然你也可以從頭到尾都把文件放在隨身碟,不拷貝到本地電腦硬碟,但人總是有疏忽的時候,有時急著出門,隨身碟忘了拔,到了目的地才在懊惱。這樣的問題,我也一直很困擾,直到Dropbox出現之後。

http://www.dropbox.com/

Dropbox是一個網路備份服務,用一個帳號控管。任何電腦裝了Dropbox之後,用同一個帳號登入,就會同步Dropbox目錄底下的任何東西。Dropbox是以本地硬碟目錄的形式出現,因此存取速度比隨身碟快,不用煩惱隨身碟帶了沒有,不用煩惱檔案新舊的問題,它都幫你處理好。

目前容量大約是2.5GB,沒記錯的話。將你每天工作都需要的檔案放在Dropbox當中,到哪裡都可以存取你的檔案。當然網路備份就會有隱私外洩的可能,這個就要自行取捨了。

回到電腦壞掉的問題,如果這次我的硬碟整個壞了,的確我會損失放在桌面還有我的文件底下的檔案,但是所有放在Dropbox底下的重要檔案,都安全無恙。因此在這裡推薦大家使用。

hambao 發表在 痞客邦 留言(3) 人氣()

今天去監理站換發新的汽車駕照,被搶了200元,原以為至少有像新身分證那樣的防偽機制,沒想到就跟N年前的一樣,一張黃黃的紙張,畫好整齊的欄位,第一欄「中華民國」字樣上面像狗皮藥膏似地印了一個圖章印,然後各欄位就用阿罵時代的點矩陣印表機,印出解析度超低、淺淺灰灰的字樣。四周有著像狗啃一樣的突起,最後用膠水把照片黏上去,前面弄個膠膜,然後護貝,最後蓋個不是很有誠意的鋼印,似乎要防偽卻又防得懶懶散散,跟監理站公務員的服務態度差不多,然後交還給我。

我想說就不附圖了,身在台灣的朋友們,至少都有一張機車或汽車駕照。忘記的話拿出來複習一下就知道我在講什麼了。我只是在想,今天我被政府搶了200元。我翻了一下另一張機車駕照,到期日是民國100年底,也就是說明年這個時候,我又要到監理站被搶一次,然後換一張同樣醜的駕照。

所以我不知道到有沒有人想過這個問題?為何我們的駕照那麼醜,數十年如一日?還有,到底為何我們需要兩張駕照,一張機車一張汽車?為何不能合併?或者,把身分證也拿進來討論,為何我們要有身分證這樣的東西?為何不能把駕照的地位,提升到身分證的層次?一個在台灣工作或唸書的成年人,身邊少不了兩張駕照、一張身分證,偶爾跑醫院還要健保卡,更不用說許多人都有公司行號服務證或學校學生證,提款卡、信用卡,加上一堆會員卡。真是卡卡走天下。

再看身分證,相信大家都有拿高解析度大頭照去戶政事務所辦新的身分證的經驗。辦事人員的動作,就是把高解析度的照片當場掃描變低解析度,然後印到新式身分證上。不可免俗地,「中華民國國民身分證」幾個字的中間,一定要弄個紅色印章的圖樣,似乎在宣告「僅此一家,別無分號」。然後接下去的三欄,第一欄寫著「姓名」,後面的三個字,一定都要分得開開的,看了就超不舒服。名字第一個字跟前面的「名」這個字,距離比名字第一個字跟名字的第二個字,還來得近。不用說啥美學啦!就從最基本的資訊呈現原則的角度來看,就已經不及格了!(訊息欄位跟訊息內容必須清楚可分別)。

第二欄叫「出生年月日」,這個欄位本身的「出生」兩個字出現在上,「年月日」三個字出現在下。按照某些人的邏輯,就是「出生」中間塞空格,使得它跟「年月日」可以左右都對齊。第三欄叫「發證日期」,因為是四個字水平排列,很擠呢,所以每個字都要瘦身。各位可以注意「發證日期」的「日」,明顯就是比「出生年月日」的「日」來得瘦。整個欄位設計,活像小學生剛學習Microsoft Word裡面調整字體水平比例縮放功能後,興奮地跟爸媽炫耀一樣。

好啦!第二欄跟第三欄從資料庫的角度來看,都是「日期」,那為何「出生年月日」不改成「出生日期」?至少跟第三欄字數一樣。至於第一欄的「姓名」,根本是廢話!誰會不知道那是姓名?如果不要堅持左右對齊,三個漢字之間空格取消(更不用說單名的人空更大),另外附上羅馬拼音,這不是更好嗎?特別是原住民或外籍人士(假設取得我國籍),若能加註羅馬拼音也可以降低漢字在華語中音節結構過於簡單而無法反映原文發音的缺憾。(註一)

接著看資訊內容,姓名欄漢字字體最大,出生年月日欄字體變小,到發證日期字體更小,簡直亂七八糟。如果各位有認真看,你也會發現,欄位名稱字體為楷體,欄位內容的部份又變成明體了。這是怎樣?告訴大家你的電腦字體很多嗎?

然後翻到背面,我已經不想講了,但所有我剛才講過的缺失,這邊一個不少。

一個國家的身分證的設計,是何等重要的事,而我們得到的,卻比小學生的設計好一些(各位小學生不要生氣,事實上你們設計出來的可能會更好)。難道中間決策過程都沒有人看到嗎?這需要多少美學素養才能挑剔?根本不用!連那麼沒有美學素養的本人都發現一堆問題,我們的高級公務員難道沒有人發現嗎?或許有,但「多一事不如少一事」、「不在其位,不謀其政」,我們的高級公務員都飽讀詩書,這些做人的道理都很懂的。也因此,今天各位手上,才會有這張可以讓我寫那麼長文章來罵的身分證。

講了一堆,總要拿個對照組出來吧?不然一定又會有人嗆聲說:「那你來設計啊!」我不會設計,但我會欣賞設計。這邊有一張德州駕照,大家參考看看:

 IMG_5275b.JPG

要拿到這張駕照,少不了筆試跟路考,然後要現場拍照存檔,等兩三個禮拜之後,才會寄到你的通訊地址。駕照背景是德州州議會大樓,整個駕照的配色不能算美,但簡單明瞭。不用現場給照,就不用現場護貝,就不會有粗製濫造、很cheap的感覺。上面這張張駕照就像一張信用卡的觸感:一樣是塑膠卡,但較薄。(上圖剪掉了個人資料,畫面有點醜請多包涵)

所謂見微知著,一張身分證,看似小事,但卻反映了背後整個行政系統的問題。台灣都會區的市容普遍來說雜亂難看,街道建築歪七扭八,汽機車不管行進中或停在路旁的,把行人的空間吞蝕了,或許這些都有歷史包袱,或無法立刻改善。但設計一張稍微能看的身分證或駕照,會有那麼難嗎?

註一:華語(台灣通稱國語,中國通稱普通話)的音節數量,若不算調的話約為400個,加上四個調之後也才約1100個。

hambao 發表在 痞客邦 留言(3) 人氣()

最近開始尋找東京/橫濱旅遊資訊,除了必讀的網站:

http://kunghc.pixnet.net/blog

之外,還找到幾個幫你尋找交通時刻以及路線的網站。先放在這裡給大家參考(其時也是給自己參考)。

http://www.jorudan.co.jp/index.html

http://www.ekikara.jp/top.htm

http://transit.map.yahoo.co.jp/

由於中文漢字與日文漢字多少還是有點差異,建議還是安裝日文輸入法來搜尋。

 

 

 

 

hambao 發表在 痞客邦 留言(0) 人氣()

2010年9月9日,當天要離開布拉格,中午之前要checkout。想到有一個私房景點,是一個台灣留學生推薦的,而且這個景點就在旅館附近,不去說不過去。

這個精緻的洗手台(造型有點說不上來的怪)就在旅館旁邊,通往私房景點的步道就在照片右邊。

IMG_5155.JPG

途中經過的一般民宅,很幽靜。真想買一棟!

IMG_5156.JPG  

來到了一個公園,這果然是私房景點!跨越Vltava河的五座橋一次送給你!從近到遠的第二座就是Charles Bridge。

IMG_5165.JPG

工商服務時間。就有人以Vltava河為背景,拍起婚紗了!攝影師很辛苦地蹲在地上。

DSC_3594.JPG

真是一個幽靜的公園,令人神清氣爽。有一對情侶要我幫他們拍照。照完之後跟我說聲Merci,害我有種時空錯亂之感。後來就在椅子上親熱起來了。真是幸福的一對,怎可放過你們?

DSC_3675.JPG

很開心在離開這個美麗的城市前,還能在這個公園逛逛。連蜜蜂都顯得可愛。

DSC_3674.JPG

這是松果吧?但完全沒有松鼠(是真的沒有,一隻都沒有)。這邊該不會有松鼠烹飪吧?

DSC_3682.JPG

雖然坐飛機坐到抓狂,但布拉格真的是一輩子要來一次的景點。

hambao 發表在 痞客邦 留言(0) 人氣()

我們住的旅館Hotel Hoffmeister在評等上是五星,雖然我們都不覺得真的有到五星級服務,雖然早餐還不錯。後來,我想了一下,或許位於小城區菁華地區Malostranska地鐵站附近,而且走沒幾步路就可以到通往布拉格城堡的階梯步道,或許這就是五星級的Location吧!買屋大家都說Location, Location, Location! 那住旅館也無不可。

2010年9月8日,是在布拉格的最後一晚,想到自己辛辛苦苦帶過來的I牌腳架,還靜靜躺在行李箱中。因此,帶著一天的腳痠,我跟Jody還是帶著腳架輕裝出征,誰叫階梯步道就在旅館旁邊?不去爬一下對不起自己。

時間應該是晚上八九點了,步道沒什麼人,有也是下山的人,我們這樣上山的成了異數。走著走著遠方傳來悠揚的吉他聲以及低沉的女聲,是披頭四的Yesterday。我們就坐在階梯上聽她唱完這首,下一首唱Tears in Heaven,還可以,但還是Yesterday比較有感覺,有一種滄桑的味道。

IMG_5077.JPG

終於回到布拉格城堡,途中在玩具博物館附近竟然有演唱會,還蠻熱鬧的。本來擔心晚上治安,但晚上也有不少警衛,稍減焦慮。回到聖維特教堂,終於一償心願拍了夜景。這是教堂的背面:

DSC_3499.JPG

正面實在退無可退,改成高仰角攝影。(叫你要敗廣角鏡你不聽)

DSC_3525.JPG

拍完照,很滿足地回到五星級旅館。

hambao 發表在 痞客邦 留言(0) 人氣()

由於耳不聰,目不明,很早我就立志不走「鼻屎」(P-side)這條路。(註一) 但是,你越怕什麼,就越容易遇到什麼。這學期,因緣際會開了一門發音訓練的課,雖然非常praaticalpractical,不需講啥理論。但也逼得我必須重新複習一下生疏的東西。

為了方便錄音,我找到了一個聲音處理軟體叫做Audacity,這個軟體很早以前有玩過,還記得是某次灌好Linux後,自己跑出來的軟體。所以它是一個跨平台的免費軟體,符合我的原則。Audacity除了錄音之外還可以做一些簡單的處理與分析,如change pitch/tempo/speed等等。

我唸了一個句子:On the weekend, the women go swimming in the swift, deep river.

  

Audacity的畫面如下:

on_the_weekend 2010928 下午 022006.jpg

Audacity當然還有很多功能,但畢竟不是專門處理語音,因此我只把它當作錄音軟體。

要處理語音,不用說,大家都知道有一個軟體叫做Praat。

Praat基本上是「鼻屎」語言學家必學的軟體,連非鼻屎派的也都知道。我把上面的那個錄音檔,匯入到Praat,得到以下的畫面:

1. Sound on_the_weekend 2010928 下午 022212.jpg

上面的是波形,下面的頻譜圖(spectrogram),Praat可以把一些重要的參數畫出來,像藍色的線是音高。我的這段錄音,音高約在90~170Hz之間變化。

紅色的部分是formants,也就是能量集中帶。Formants決定vowel quality。以下列出幾個時間點的formants:

wEEkend
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
0.512218   327.671498   2163.634744   2497.146275   3364.106964

wOmen
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
1.354822   391.330121   1418.933525   2526.755759   3203.807963

swIm
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
2.099258   377.002864   1953.664496   2540.734118   3290.762233

In
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
2.475566   371.524212   2067.427939   2780.121056   3259.077666

swIft
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
2.954133   511.865369   1338.213079   2627.497484   3463.958248

dEEp
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
3.342712   319.967800   2096.235492   2894.332831   3368.986163

rIver
Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz
3.678117   445.844917   1794.250034   2717.489189   3487.130861

我們發現,出現在wEEkend與dEEp中的長音[iy],有相近的F1,F2,取其平均約為320Hz/2100Hz。出現在swIft與rIver的短音[I],也有相近的F1,F2,約為480Hz/1600Hz。wOmen離短音[I]有點遠,swIm離更遠,In則離最遠,反而更像[iy]。因此我本次的錄音,In/swIm/wOmen這幾個字念得太像長音[iy]。不過事實上,這些參數都還是時間的函數,我們每個母音都只取一點,其實是太過於簡化。不過做為展示用,這樣應該是夠的。

這樣量化的數據,相信比純粹用聽力,來得有說服力。不過語言不愧是人類心靈的產物,perception跟production有時並非homomorpheous。這就不是我的重點了。

註一:P-side指的是語言學中的語音學(phonetics)與音韻學(phonology)兩個部門。

hambao 發表在 痞客邦 留言(1) 人氣()

«12 3