2011年6月22日 星期三

[regexp]實作遇到的問題

在單一state的實作裡,若想到辨別三位以上,尾巴是91的數字。
當寫出  [1-9]+91,卻是無法簡單對應實作出來。

image

遇到991的時候,我們會希望,當第一個9出現時,要移到state 9。
接下來就會辨別出來。
而9991的時候,第一個9出現時,不能移到state 9。
這個情況出現就是說明有模糊的地方出現,也就是state 1-9這裡,
兩個transition可以同時成立,而產生模糊。
把模糊消除的方法就是增加state,每個transition的成立條件是互斥。
 image

當場就複雜很多了。沒有模糊是單一state實作的重要前提。
但是,想從這個圖轉回去regexp,又寫不出來。
雖然意義相同,但是要轉換需要一番工夫。
看來,有了多state的實作,轉換工作可以少一點。
可是多state的實作,本身就難倒我了。

把實作與理論合起來看,單一state的實作,就是DFA (deterministic finite automaton),因為每一個state,在看到input進來的時候,
就必須要決定唯一一個的下一個state。
而NFA (nondeterministic finite automaton)則是可以有多個可能的下個state。
因此實作上得要記得所有的可能的state。並對那些state做input測試。

既然看到NFA是真的比較容易讓人腦了解,設計時也比較容易。
單一state的實作應該就到此結束,開始來做多state的實作吧。

2011年6月21日 星期二

[google]Google Web Font

我在今年的 Google io 2011,看到一件很開心的事。
他們居然要做字型這一塊!

字型這件事,在 2002 年附近我用 gentoo 的時候,遇到很多問題。
當時支援 unicode, UTF-8, big5 的中文字型大多是 windows 的字型。
要使用好看一點的中文只能去找 windows 的 ttf 來用。
這要合法使用,得要你有 windows 作業系統才行。
後來,有王漢宗教授的自由字型,真是很大的福音。
不能說華康做字型就讓他們餓肚子,但是沒有好看的中文字型,
要用 linux 印報告真的是很難看。
其中,令我最不能理解的是字型牽扯到的商業行為,
使用字型的部份我比較沒有意見,
但是誰可以做字型卻有得讓我不能理解。

假設說,我看著AA少女體,做一個BB少女體,說我侵權,侵犯AA公司的權利,
我可以接受。
要是我看著AA柳公權,做一個BB柳公權,也要說我侵權,我就不能接受。
而這一塊,當年是有爭議的。
我當時不能理解的是,柳公權的字,怎麼會被一家公司做成字型檔之後,
後面的人就不能再自行做成字體?又不是檔案直接copy!
當然當時我不是做字型的人,我無法理解,
但是我後來也可以自己解釋為字型這一塊難生存的原因就是如此。

現在 Google web font 的專案,說是所有字型都是自由使用,
也提供機制讓人可以隨喜捐!
對於製作字型的人來說,就好像畫家有一個免費的藝廊可以展示,
甚至獲得金錢上的幫助。
我建議王教授可以將字型給他們 hosting,中文字型現在他們還沒有,
我們自己用的中文字型怎能缺席呢?

[google]Accessibility

Google I_O 2011- Accessibility- Building Products that Everyone Can Use

  1. accessibility 指的是一種能力,讓別人方便使用的能力。
    一般舉例會用讓眼睛不好,也能使用你的產品,
    但更廣義的說,也包含沒滑鼠的情況,也能使用你的產品。
    所以更考量人機介面讓人好操作。
  2. 因為一般人不會覺得有什麼差別,所以 demo 的時候就是設定一個極端的情況。讓 chrome 可以讀出聲音,把字放很大,只用鍵盤控制。
  3. google介紹Chrome integration with screen readers,ChromeVox,ChromeShades
  4. 有關 android 的部份,則是介紹使用一個 reader,只使用 touch pad 來操作上一頁,下一頁,字放大,選擇,讀出聲音。
  5. 關於讓你的應用程式具有 accessibility 他們建議,使用標準 toolkit,讓所有的工作都可用鍵盤完成,注意tab順序及焦點,以及在 screen reader 上試一下效果如何。

2011年6月14日 星期二

[c][程式]處理2進位混合資訊

最近遇到有人把3個資訊編到一個變數裡。
他們是這樣做的:
0001 0000010 00100
上面是一個16個bit,分成3節。
第1節就當做是section,第2節當做變數id,第三節當做步驟順序。
因為這3節是各自獨立,因此是三個獨立軸,這16bit展開成一個空間。

當我們拿到這一個16bit的東西的時候,在程式裡是整數,
也就是看到的時候是 4164,我們要怎麼處理這種東西呢?

當然一個最直覺的做法是,轉成2進位!
是的,腦筋是可以轉成2進位,但是寫c語言,我們不知道怎麼寫2進位的表示法。
if (a == ‘00100’) //這東西我不知道怎麼寫出來。
那寫成16進位呢?2進位轉16進位是一次4bit,又遇到不是4bit的一組,
導致很難處理。

有人大嘆一句為什麼不是10進位?10進位就好做了!
為什麼10進位就好做?
因為上面的數字是10進位,
要找到section,就是數字除10的12次方,
要找到變數id,就是數字除10的5次方。

對,10進位會做,為什麼2進位不會做?
只是被進位系統搞暈了。
4164 除 2的12次方,也會等於section。
4164 除 2的 5次方,也會等於變數id。

用整數的加減乘除就可以把三個值分別找出來。
0001 0000010 00100 = 4164
section = 4164 / 4096 = 1 //只要整數部份,小數直接捨去
變數id = (4164 – 1 * 4096) / 32 = 2 //只要整數部份,小數直接捨去
步驟順序 = (4164 -  1 * 4096 – 2 *32) = 4 //只要整數部份,小數直接捨去

有常寫c語言的人,一定還會弄出一招,就是bitwise的operation,&還有>>。
想法切入點不一樣,結果會是一樣的。

2011年6月8日 星期三

[c][c++]AIX cpp, VC++ cpp, VC2005 cpp

雖然說,只用 ANSI lib 的同樣的程式 應該」都可以直接跑,
事實上,還是辦不到。

舉例:
AIX cpp 可以
#include <userinclude.cpp>
只要把 cpp 放在同一個目錄。
但是
在 VC++ 眼中犯了兩個錯誤,
(1)自己的 header 檔放在同一個目錄的,要用雙引號夾起來。
(2)include 要是 header 檔,不然會出現 link 失敗。
所以要改成
#include "userinclude.hpp"

舉例:
AIX cpp, VC++ cpp可以不宣告
using namespace std;
就使用 cout << "abc" << endl;
但是
VC2005 cpp 就說不行,
using namespace std;
一定要加上去!

舉例:
AIX cpp 的 字元 array 可以設到 9999999 (有7個9)
VC++ cpp,VC2005 cpp 卻會出現 stack overflow。(一進 main 就發生)
要特別把stack 放大,或是把該變數放到global,或是動態配置。
參考:http://legnaleurc.blogspot.com/2007/06/cstack-overflow.html
參考:http://tw.myblog.yahoo.com/josh-chang/article?mid=1340

舉例:
AIX cpp 可以對 NULL pointer 執行 strlen。
但是 VC++ cpp 卻會發生 access violation。
實在有很多要修的地方。
也就是說,原本大家想的程式碼搬過去就會動這檔事,
真的只是自我感覺良好。

[python]every one should touch python one day

很早以前就開始知道python,在跟ruby比較,我猶豫了很久。
在工作上,我發現python只要下載安裝檔,其他的部份安裝比ruby「方便」。
因為多是整個目錄放好就行了。

到了研究所,要寫作業或是論文的程式,我也想了很久。
如果沒有介面的東西,還是用python來做,因為不用擔心型態,
可以一邊探索一邊寫,不用擔心如果一開始的型態或是object沒有設計好,
一改就是一大堆。

但是python不是沒有缺點。他的缺點就是他的優點所帶來的。
這件事情告訴我們一句俗語「有一好沒有兩好」。

google有一群人使用python,也因此,他們所推出的api,或是工具常常會是python。
然而GWT使用java,原因之一是java的人比較好找。我個人認為string typing也是原因之一。

每個人都應該看完google io 2011的 Python@Google,然後考慮一下才對。

以下關鍵字,有空去查一下。有要確定用python再說。祝福你。

diveintopython.org
corepython.com
cp4k