Android multithread 的訊息傳遞: ViewRoot$CalledFromWrongThreadException

08:58上午 六月 06, 2009 in category General by yaocl

在Activity中產生一個thread處理資料的時候,當遇到這個資料要回去更新Activity畫面上的UI元件時,會發生 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 這樣的錯誤。

這個問題弄了好久,試了幾個方法都不能處理掉,還email給"Android開發範例大全"的作者(昨天寄的,現在還沒有得到回應),結果其實很簡單,是要用android.os.Handler配合android.os.Message來處理。但也許這在android開發是一般常識,不過因為我們學習的方法,並沒有從基本原理學起,而是直接看許多範例程式,才會不知道要怎麼讓Model跟View互動。

在Activity中自訂一個Handler: myViewUpdateHandler

Handler myViewUpdateHandler = new Handler() {
 public void handleMessage(Message msg) {
  switch (msg.what) {
   case Main.GUIUPDATEIDENTIFIER:
    // Do some GUI Stuff here
    String serverCommand = (String) msg.obj;
    processServerCommand(serverCommand);
    break;
  }
  super.handleMessage(msg);
 }
};

在onCreate時產生的thread裡面,就可以用android.os.Message來將訊息傳遞給Activity來更新顯示元件
 Message m = new Message();
 m.what = Main.GUIUPDATEIDENTIFIER;
 m.obj = line;

神奇的 Runtime.exec 遇到保留字元的處理方法

12:28上午 三月 22, 2009 in category General by yaocl

要產生Process執行command line程式,在java裡面是使用Runtime.exec,在JDK 1.5之後出現了另一個 ProcessBuilder,ProcessBuilder多了管理環境變數的方法,也能切換工作目錄。一般使用Runtime Process會先遇到IO Blocking的問題,這個可以參考這些文章:When Runtime.exec() won'tjava中呼叫.bat 卻沒有反應.... StreamGobbler的詳細解釋,使用 StreamGobbler 解決。但另外遇到 shell command 裡面的保留字元時,就會產生了一些奇怪的問題。

最常見的就是空白字元,例如在命令的執行路徑上,出現了空白字元,以 windows 來說,如果直接在"命令提示字元"中,打上 c:\Program Files\xxx\xxx.exe,就會出現路徑的錯誤,因為shell沒辦法處理有空白字元的路徑,所以要執行的時候,就得加上 雙引號 變成 "c:\Program Files\xxx\xxx.exe",這樣就可以執行了。

在Linux環境也是一樣的,遇到空白字元,就會發生問題,除了用 雙引號的方法之外,單引號也可以,或是加上escape char \,例如 /home/root/bin/xx x.sh ,可以改成 "/home/root/bin/xx x.sh" 或是 '/home/root/bin/xx x.sh' 或是在空白前面加上escape char /home/root/bin/xx\ x.sh 就可以執行了。

事實上除了空白字元之外,還有可能會遇到 ( ) " ' 這些字元,都是shell上的保留字元。為了求得一個能同時在 linux 與 windows 都能運作的執行方法,用雙引號似乎就能同時解決這樣的問題,但是事實上,放到 Runtim.exec 裡面執行時,又不是這麼一回事。為了執行一個程式,現在有幾種寫法可以用,(1) 將命令含參數,弄成一個字串,然後放到 runtime.exec 執行 (2) 將命令含參數,弄成一個字串,然後前面加上 shell ,例如windows 平台就寫 cmd /c、而linux 平台就寫 /bin/sh -c,然後放到 runtime.exec 執行 (3) 將命令與參數作成 List shellcmd,然後用 new ProcessBuilder(shellcmd).start() 執行 (4) 將命令與參數作成 List shellcmd ,前面加上 shell,cmd /c 或是 /bin/sh -c,然後用 new ProcessBuilder(shellcmd).start() 執行。

測試許久,最後還是沒有辦法找到一種方式,同時適用於 windows 與 linux,結果以 ffmpeg bin\ffmpeg.exe 與 ffmpeg bin\ffmpeg 兩個執行檔為例,假設我要執行 ffmpeg -i test.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 test.flv,在 windows平台,我得寫

List cmdlist=new ArrayList();
cmdlist.add("\"ffmpeg bin\ffmpeg\"");
cmdlist.add("-i");
cmdlist.add("\"test.wmv\""); // 因為檔案路徑有可能會含有空白字元,就幫他加上雙引號
cmdlist.add("-ab");
cmdlist.add("56");
cmdlist.add("-ar");
cmdlist.add("22050");
cmdlist.add("-b");
cmdlist.add("500");
cmdlist.add("-r");
cmdlist.add("15");
cmdlist.add("-s");
cmdlist.add("320x240");
cmdlist.add("\"test.flv\""); // 因為檔案路徑有可能會含有空白字元,就幫他加上雙引號
new ProcessBuilder(cmdlist).start();

而在 linux平台,我得寫

List cmdlist=new ArrayList();
cmdlist.add("/bin/sh");
cmdlist.add("-c");
cmdlist.add("\"ffmpeg bin\ffmpeg\" -i \"test.wmv\" -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 \"test.flv\"
"); // 因為檔案路徑有可能會含有空白字元,就幫他加上雙引號
new ProcessBuilder(cmdlist).start();

幫jar檔瘦身 Remove Unused Classes

05:30下午 三月 12, 2009 in category General by yaocl

寫程式的時候,通常會使用很多 library ,但是一旦遇到要把程式以 JNLP 的方式,送到client端的時候,產生jar的大小就很重要了,以LGPL license來看,我們的程式可以連結到LGPL license的library,我們不一定要以一個一個獨立的jar來散佈library,我們可以把所有classes集合在一個jar檔裡面,只要我們沒有修改到原始程式,就應該符合license的規定。

所以我們可以把程式沒有使用到的 binary classes 都去掉,Open Source 授權的關係,我們不修改 library 原始程式,不使用obfuscator,但也能達到縮小 jar 的目的。

首先要準備一個 使用到的 classlist 檔案,在執行程式的時候,加上 -verbose:class 參數,ex: java -verbose: Test ,把結果輸出到一個 classlist.txt 檔案檔案裡面會有類似這樣的資料,這就表示JVM從commons-logging-1.1.1.jar裡面載入了一個 class org.apache.commons.logging.LogConfigurationException。
[Loaded org.apache.commons.logging.LogConfigurationException from file:/D:/testproject/lib/commons-logging-1.1.1.jar]

1. 把所有 library 的 jar 用 org.apache.tools.zip.ZipFile 解開到某個 release 的目錄
2. 把編譯的 class 程式,也複製到 release 目錄
3. 從剛剛的 classlist.txt 裡面,把使用到的 classes 名稱,收集在一個 hash 裡面
4. 用 org.apache.commons.io.FileUtils.iterateFiles 把 release 目錄裡面所有的 .class 都集合起來
5. 一個一個比對 是不是有在 classlist.txt 的 hash 裡面
6. 如果不存在就把這個 class 刪掉
7. 最後 再用 jar cvf ..\proejct.jar . 就可以產生一個去掉沒有使用到的 classes 的 jar

Cairngform vs. Puremvc

10:33下午 十二月 03, 2008 in category General by yaocl

Cairngorm

Cairngorm是Adobe官方提供的一個MVC Framework,要瞭解它,可以直接閱讀Adobe Developer Center裡面,收錄的Develop Flex RIAs with Cairngorm microarchitecture六篇文章,在閱讀時,要配合第一篇文章提供的範例程式Cairngorm Store對照來看,會比較清楚,我是使用Cairngorm Store (non J2EE Container version)。只要讀者有J2EE Patterns的基礎,就能夠瞭解Cairngorm,因為Cairngorm的設計沿襲了部份的J2EE Patterns,再加上它自己的一些設計。

雖然我看過J2EE Patterns,但是閱讀這六篇文章還是花了不少力氣,原因在於RIA介面的複雜性。在Web-Based的J2EE裡面,網頁的元件跟後端程式的互動,都是靠Front Controller來處理,所以後端只要用一個Servlet就可以作為前端發送到後端命令與參數的入口(可再配合Command來將互動的指令分類處理),單一的入口簡化了前後端的互動,資料傳送到前端後,整個畫面都是重新產生的,資料流很單純地只有一條路徑。

到了Flex就不一樣了,因為都是產畫面上的元件後,再將資料餵進去的,所以一個地方的元件資料異動,可能會同時影響到其他地方的資料(像是AJAX的網頁也有類似的問題),所以在後端傳送資料回去到前端時,元件互動的處理就非常麻煩了,所以Flex才有了Bindable這種東西。

Cairngorm已經存在了兩年了,又是官方的產品,很多專案都是使用這個framework,但它的複雜,也讓開發人員誤認為,flex actionscript是很難以親近的一種語言,雖然Cairngorm身為MVC框架的正規軍,部份設計理念也來自於J2EE,但它也繼承了J2EE複雜。

Puremvc

另一個MVC Framework: Puremvc,它定位自己為一個純粹地,與語言無關的輕量級MVC Framework,很多人都推崇這樣一個設計單純的框架,但是在官方網站上能找到的文件,除了一個看起來像天書的Best Practice,一個Conceptual Diagram與一個UML設計圖,就沒有了,找不到很簡單的tutorial或是step by step的說明。

在瀏覽過文件跟一些blog的說明後,我發現,我得用另一種更有效率的方法來瞭解Puremvc,就是從PureMVC Standard for AS3的Demos,直接從程式碼來了解應該怎麼使用它。

在trace過AppSkeleton、CafeTownsend、Slacker、EmployeeAdmin、StartupAsOrdered之後,我才算是比較瞭解Puremvc了,例如:(1) 畫面切割後,以ViewStack來切換 (2) 畫面上的動作,先產生flash.event.Event之後,在初始化Mediator的時候addEventListener,處理完該動作後,就sendNotification (3) 每一個ViewComponent都對應了一個Mediator專責處理 (4) ApplicationFacade裡面要 initializeController,並在裡面registercommand,StartupCommand裡面要 registerProxy 與 registerMediator (5) Notification sender有 Command、Mediator、Proxy,receiver有 Command與Mediator

除了標準版外,還有Multicore版本,差別在於,Multicore的Facade裡面有一個HashMap,所以必須要以key為參數,取得Facade,也就是return instanceMap[key] as ApplicationFacade。目前並不是非常瞭解Multicore版本要用在哪裡,但網站裡提供了Pipes、Startup Manager與State Machine這幾個Utilities,Startup Manager是用來處理動態載入資源的過程,透過它可以取得載入的狀態與進度,Pipes看起來像是處理模組之間的訊息,但實際上的用途,我還沒看懂。

Cairngorm vs. Puremvc

Why I think you shouldn't use Cairngorm提出了五點說明,希望大家審慎評估要不要使用Cairngorm。我在看過之後,真的是覺得Cairngorm非常的複雜,但是已經存在了兩年了,又是官方的產品,如果要進入這個世界,對整個team來說,負擔很大,並不是每一個人都能讀懂J2EE Patterns之後,再讀懂Cairngorm。

結果當然是採用Puremvc,跟Cairngorm比較起來,package跟class都變少了,只要有按照固定的邏輯撰寫程式,程式變得比較容易讀了。一個簡潔的框架,才能適當地幫助Programmer減輕負擔,而不是一個龐大的框架,成堆的專有名詞,讓人沒辦法很快地進入狀況。

用了一陣子之後,發現了2個問題,第一個是我們發現很少用到Command,大都是Facade、Mediator、Proxy跟Notification就可以把整個AP做完,至於Command到底應該用在哪裡比較恰當,這個我還在思考中。另外還有個問題是,Constants並沒有固定的位置,範例大都是寫在ApplicationFacade裡面,但似乎切割獨立成一個單獨的class會比較恰當,或者應該把Naming convention的規則記錄下來,這樣對於專案來說或許會比較健康一些。


thoughts about Cairngorm (again…)

想飛 by 游錢桂

12:12下午 十二月 03, 2008 in category General by yaocl

這是幼稚園懇親座談會送給家長的書,書本的內容部份篇幅,以實例告訴大家,錯誤的教育方法造成的後果,描述最多的,是分數主義及過大的壓力,造就一個無法生產回饋社會的人,或者影響一個人,養成一些特殊的生活習慣,甚至是輕生自殺。另外一部分,則是作者自己跟孩子的相處經驗。教育該作到的,是幫助每一個孩子,找到他最適當的位置,在社會中佔有一席之地,因為每一個人脫離家庭與學校教育後,最終都得要進入社會,20多年的教育,換來的是一個人在社會上立足50年的時間。

該用什麼方式對待孩子?

回想自己的小時候,到現在一直無法忘記的,就是媽媽要我們去國語日報補習作文,這件事,我還記得當時一直說不想去,因為自己覺得一點用處都沒有,但是媽媽聽從朋友的建議,覺得補習並沒有什麼壞處,我得自己搭公車到台北,寫篇作文然後回家。後來發生了一些事,她才沒讓我繼續補習下去。

其實後來上了大學後,也常常跟媽媽提起這件事,總是告訴她不應該一直要我去補習,應該讓我們多閱讀才對。但現在我已經不會這樣想了,其實媽媽也是聽了別人的建議,希望自己的孩子能夠多學點東西,到時候聯考的作文會好一些。只唸到國中的媽媽,如果真的那麼瞭解讀書,那麼她應該不會隨便地聽從朋友的意見,她的出發點是善意的,只是她不知道該用什麼方法。

現在已經當爸爸了,雖然我盡力地買繪本,唸書給他聽,陪他玩遊戲,但是有時候也常常想知道,唸書的時候一直問東問西的,問他懂不懂,他會不會覺得我很煩。到底該用什麼樣的方式對待他,才是最好的?如果沒有稍微地施加一點壓力,讓他聽故事的時候能專心一些,他能不能聽得懂故事的內容?對待孩子,教育孩子的時候,該用什麼樣的態度才是最恰當的,老實說,我根本不敢肯定。

該處罰嗎?

在他3~4歲的時候,他會因為說謊,或吃飯吃得太慢(超過一個小時),或作了一些我們反覆告訴他不該做的事,而被要求面牆罰站,雖然現在6歲了,我們已經不再用這樣的方式處罰他了,但是他卻養成了一個習慣,常常會問我們,他可不可以怎麼樣,能不能做什麼,雖然這樣子做,多少保護了他不會受傷,但相反地,他卻失去了「犯規」的權利,創造的能力。

因此現在我就修改成,當他問我的時候,反過來告訴他,請你自己決定該不該做,請你自己決定要怎麼辦,當然不是每一次都這樣處理,而是我認為他能夠自己判斷的事情才這樣做。

有時候會覺得,就算是同一種教育方法,也會教出不一樣的人,人是一種複雜的動物,同樣的一種方式,卻可能得到完全不一樣的結果。那麼我不應該那麼在意,到底要用什麼樣的教育方法,應該要用什麼方式對待他呢?我想這就跟媽媽那時候的心情一樣,希望孩子能夠得到一些幫助,但又不曉得什麼樣的方式比較恰當。

生活上的確有很多時候,會有發生意外的潛在可能,例如在沙發上跳來跳去,在家裡亂衝,吃到好吃的東西一直吃,看電視的坐姿不佳,也有一些屬於品格的養成,例如打破東西、打翻水卻不承認,在孩子剛懂事那時候,如果沒有用比較激烈的方式,讓他瞭解這些是錯誤的,那麼是不是放任他可以犯錯?該用什麼樣的處罰才是恰當的,老實說,我不知道。

有些時候,我會問他,你覺得沒有作到的話,應該要怎麼辦,要他自己想個處罰的方式,這樣的作法或許比直接叫他罰站要好得多。

該怎麼教?

買書、念故事書給孩子聽,這是我的工作。中文的故事書,他應該都能瞭解,但是英文的就不一定了,幾天前拿出一本4歲時唸過的A Kiss For Litter Bear,我才發現,故事書裡面的動詞時態,他根本完全都搞不清楚,為甚麼run是跑步,ran也是跑步,come in是進來,came in也是。

語言教學,是個難題,不管是英語或是台語,因為平常比較少用,對小朋友來說,學習這樣的語言要怎麼轉化到日常生活上?但就算有那樣的環境,也不一定能保證有用,例如阿公阿媽都是講台語的,但是小朋友也是跟他們講國語,因為他們可以聽得懂國語。

有人說先把母語學好比學第二或第三外國語重要,也有人說,3~6歲是語言發展的黃金時期,要好好把握這個時間,究竟哪一種方式比較好,我沒有答案。現在只有唯一一種作法,就是孩子能接受的方式就做,他想聽故事我就講,不想聽我也不強求,其他的就靠他自己,聽天由命了。

要怎麼認識孩子?

興趣跟天份對於一個人來說,是非常重要的,認識自己更是關鍵,一個人要能夠認識自己的長處,才能知道怎麼發揮自己的優勢。但是我問我自己,我認識自己嗎?其實沒有,在還沒有嘗試過之前,誰知道自己有沒有興趣,有沒有能力做好。

既然我自己都不認識了,我要怎麼認識孩子呢?這個問題我也沒有解答,現在除了幼稚園的課程以外,另外還讓他上了一堂一個小時的畫畫課,我們也沒有期待他會有興趣,或有什麼成就,就單純要讓他去玩而已。

尊重

他常常會大聲講話,動作太大揮到我們,這時候,我們通常說請他尊重我們,要說對不起,或是坐好不要亂動。結果現在有時我們不小心撞到他,他也會跟我們說,「請你說對不起!」我們也該謹守尊重的原則,以同等的方式對待他。希望未來能夠在這樣的原則下,繼續相處下去。

歷史 + 科學 + 推理 + 記憶 + 搜尋 + 整合 + 耐心 = 艾西莫夫 Issac Asimov

12:32上午 九月 20, 2008 in category General by yaocl

艾西莫夫科普教室(上:The Roving Mind 跟隨大師遨遊知識殿堂、中:The Tyrannosaurus Prescription 暴龍處方、下:Past, Present And Future 過去、現在與未來)共三本,我現在看了兩本,我對艾西莫夫的印象,就如同葉李華在第三本的封面底部寫上的註腳:後世子孫將很難相信,在「前網路時代」的地球上,曾經出現過這麼一位血肉之軀的百科全書。

雖然艾西莫夫以科幻故事與科普文學聞名,這樣的成就,我認為是 歷史 + 科學 + 推理 + 記憶 + 搜尋 + 整合 + 耐心 的知識與能力交織出來的成就,要能寫出通俗的科普文章,而不是專業生硬的科學介紹,必須要有鑑往知來的基本能力,艾西莫夫對科學與人類發展的歷史,非常有研究,也能根據這些存放在他大腦記憶體的知識,動態地搜尋與整合出他所想要表達的意思,再加上「合乎常理」的推理能力,才能「有所本」地預測未來。

這樣全面的知識能力,就像他在第一本page 183頁「藝術與科學」這篇文章所說的:知識是不可分割的事物,一個人如果在某個方面變得更聰明,他們必然可以更容易在其他方面也變得更聰明,反過來說,當他們將知識分割,只專注於他們自己的領域,並蔑視或忽略他領域,他們便會變得較不聰明。真正的藝術家除了具有想像力外,還都相當理性,真正的科學家除了具有理性之外,還都相當具有想像力。我想以上這些理念,都是以他自己為例,推理出來的結論,真正的聰明是全方面的聰明(多元智能)。

正因為艾西莫夫是個古人,所以在他的年代,他能以他自己的推論,寫出許多對未來的預測文章,身在現代的我們,就能以逸待勞地檢視這些預測,也因為艾西莫夫的預言已經有很多都成真了,他作為一代大師當之無愧。已經成真的預測舉例如下:以磁浮的方式達到高速行進的運輸列車、垂直起降的飛機、全球化的公司、全盤索引編目的中央圖書館、更深層的電腦化、死亡率降低與出生率下降造成人口結構的老化、電子郵件與線上消費、個人化的資訊與廣告、無性繁殖、DNA重組工程、個人飛行器、高速通訊與視訊會議。尚未實現的例如:核融合取代污染的化石燃料作為下一代替代能源、互補的人腦與電腦、太空殖民地、月球旅行,我們就當作指引的方向,並期待未來的某一天真的會實現。

艾西莫夫雖然有沒有界線的想像力,但是他非常不喜歡搭乘飛機,也不常旅行,一個兩個小時車程的旅行,他自己就能當作是一次冒險,更特別的是,他自己說他從來不曾根據任何有關電腦的實際知識來進行論述,他對於機器一竅不通,甚至是一台新的文字處理機,就讓他掙紮好久,才讓他放棄最常使用的打字機。這些對他自己的描述文字,讓我們知道他的日常生活跟一般人沒有兩樣,他也是正常人過著一般的生活,也讓人更佩服這樣的狀態下,還能提出許多正確的預言。或許「從來不曾根據任何有關電腦的實際知識來進行論述」這句重要的註腳,正是他能跨越時代限制的主要原因。

另外有一篇說明科學與技術的文章,一般是以二分法區分科學與技術,科學是「基礎、純粹、理智、完美」,而技術是「應用、衍生、商用、拙劣」,但是他以歷史來說明科學與技術的共生關係,例如伽利略以許多不同長度單擺,檢驗了單擺定律,而惠更斯利用單擺定律,發明了第一座現代化時鍾,有了製作時鍾的技術,改進了天文學的研究,可以容易地為天體運行計時。科學與技術是相輔相成的,不應該視為兩種不同的東西。

特地說明這個概念,是要比對我們現今的教育體系,就是以科學與技術分類,來區分一般學院的理論教學,與技職體系的技術教學兩種教育體系,事實上我們知道,做研究必須要有實驗的技術能力,才能為理論做驗證,深耕技術也要有相當的理論認知,才能瞭解自己的技術瓶頸在哪裡。會說也要會做,才是真正的科技人。

秋葉原@DEEP by 石田衣良

12:53上午 八月 31, 2008 in category General by yaocl

秋葉原,是類似光華商場的一個地方,但又比光華商場涵蓋的範圍更廣,它整合了所有的電器、零件、資訊與軟體,在這個地方生活的人,有很多都是些御宅族,這個故事的主角,個個都是怪人,但似乎也只有怪人,才有辦法創造出擁有人工智慧的搜尋引擎crook酷克。嚴格說來,這本小說並不是很好的作品,因為某些故事內容的銜接過程,有一點牽強,但我也能感受到作者所提供的一些巧思。

阿頁會口吃只能用電腦交談,但卻是這群人的首腦,阿欄是平面設計專家,但有潔癖,太鼓是音樂天才,但有個宿疾,就是可能在任何地方任何時間點,遇到週期性的光線或聲響時,突然當機去了另一個只有他的音樂的個人星球,小光是個格鬥專家,達摩是法律專家,泉蟲是個駭客,除了小光之外,其他人都是御宅族的成員。

也就是這些人創造了酷克,酷克的前身,就是當初將他們連結在一起的結衣大姐的分身,也就是泉蟲製作的人工智慧程式,但是遇到了數位資訊的中込威,由於他企業家的個性,原本希望吸納酷克為數資的版圖,但是遇上了開放搜尋的精神,吃了閉門羹,後來就直接用搶奪的方式,把所有成員的電腦跟數位資料在一次設計好的偷竊中全數偷走。

這六個夥伴,為了釋放酷克也就是結衣,設計了耶誕節的一次解放行動,成功地將結衣大姐連接上網際網路,讓他自由沉潛在網海之中。

為了提供小光的偶像網站一些特殊的工具,而製作出一個搜尋引擎,這個人工智慧搜尋引擎,一開始有四種人格,根據不同的人格就有不同的搜尋結果,這些人格就是要將酷克使用者的人格拼湊起來,以便達成最精確的搜尋結果,所以每一個人的搜尋都是個人化的,設計出人類的各種性格,才以這些性格為素材組合出使用者的個人化性格,這個想法很好。故事最後讓酷克跟結衣大姐結合起來,擁有了個人的意識,重回網海這個結局,還算不錯。

半澤老教授只在故事中途跟最後面有出現,這個角色似乎是太薄弱了,以他們一天的認識,就能讓教授在數資7樓幫助他們,我覺得很奇怪。小光的角色也似乎是為了最後一場數資大樓的侵入戰,才刻意設計出來的,因為她的格鬥技巧,讓侵入大樓的行動能順利地完成。達摩的法律專長,在整個故事裡面完全沒有派上用場。

搜尋引擎本身就是在搜尋網海中的資訊,他本來就應該跟網路有管道互相連結的,搜尋引擎也要跟使用者連結起來才有作用,因為他必須要刻劃出使用者的人格,所以他必須要有網路連結,並跟使用者有直接的接觸,但是解放行動的目的,卻是要解放酷克進入網海,這似乎有點說不通,其實只要等到數資的SCOPE(源自酷克)正式對外開放,酷克就自然能夠進行那一段幾分鍾的人工智慧進化,根本不需要這個解放行動。

中央集權

01:36下午 八月 11, 2008 in category General by yaocl

北京奧運的開幕式,實實在在地讓人體驗到泱泱大國的態勢,節目項目以中華民族的千年歷史支撐,使用的表演人員數量非常地多,整齊的動作讓人想知道,究竟花了多少時間完成這些設計與排演,用了這麼多人力,讓人想知道,究竟每一個環節花了多少金錢,個人得到多少回饋,還是只有京奧的光榮,民族的光榮,個人的光榮?

中央集權的組織,上令下達的速度與執行力絕對是毋庸置疑的,只要主事者能正確地接收資訊,下達正確的指令,就因為中央集權,所以不需要太多討論與質疑,就能在短時間內,執行這些指令,完成工作。但每一個人都不能保證自己不會做出錯誤的判斷,每一個組織也不行,一旦發生錯誤,就因為中央集權,主事者也要有擔當地承受錯誤的後果,甚至是道歉。若要一意孤行,若反而造成了民意反噬,擋不過的也只有下台了事。

軟體其實也會見到中央集權的設計,最有名的MVC,View的面向與Model的資料多樣化,而最重要的Controller就可以作成中央集權的,單一的Front Controller,可以讓伺服器端以單一入口接收Client端的所有指令,再藉由分配處理的Command,派送執行細節與命令,讓負責某個特定項目的後端程式完成工作,在這樣的狀況下,controller當然得保證,自己不會有錯誤判斷,下達錯誤的指令的狀況,不然就得承受出錯的後果。

身在組織當中,每一個組織難免都有中央集權的影子在,這就是管理階層的存在與價值,管理階層得負責帶領整個團隊,朝向最有利的目標前進,就公司來說,當然是以營利為目的,管理階層就是要讓公司賺錢,再回饋給股東、員工(maybe)與自己,能有很多回饋的,就不需要談理想,因為大家賺錢都賺得很高興,沒能轉錢的,就只能談未來,要讓大家知道,在不久的將來,有可能會成功,這些努力,都是為了讓大家對工作有凝聚力與專注力,不會隨意的移動。

不管是怎麼樣的組織,管理就是在處理人的問題,處理政治的問題,體貼與尊重,能讓人與人之間的關係,在利益衝突之間,還能維持鏈結的關係不會破裂,再來是要上下一同凝聚出共識,就能發揮力量,突破難關。

燦爛登場 體現中國4大發明
張藝謀:開幕團隊演出100分
既悶又失望 大陸網友一片罵聲
開幕式
鳥巢設計師拒出席:中國太極權
鳥巢設計師的憤怒宣言
開幕表演 評價兩極

京奧/原住民歌舞表演驚豔 央視特別專訪高金素梅

Alaways Think about Your Customers/Clients

12:32上午 五月 13, 2008 in category General by yaocl

最近上了一次有關「客戶服務」的課程,再加上又看了How To Design A Good API and Why it MattersKeynote)這一段教學,其實這都是在說明一件事情,就是不管發生什麼事情,都該要讓你的客戶高興。

身為軟體工程師,在設計與製作API的時候,就要一直思考一件事,因為API就是要讓其他的developer使用的,當然得致力於要讓API簡單、好用、不容易誤用、容易維護,而且一旦產出了錯誤的API,又已經交給客戶使用了,這個錯誤可能會影響好一陣子。但即使看過這個影片,要能身體力行也是很難,也痛苦的,回想去年曾經花了很久製作的ACL API,雖然這個API運作得不錯,也適當地簡化了ACL的開發,一直用到現在沒出問題,但其實這個API是很容易被誤用的,但短時間內就只能以code review的方式,盡量能在開發期間就發現錯誤。

在專案上,就是要面對所有stakeholders,這包含了sponsers, project team memebers與end users,在專案上的努力,最終都得要面對並滿足所有stakeholder的需求與期待,讓大家都高興。講很容易,但做起來就很難了,並不是有了技術一切都能解決的。

「客戶服務」那堂課給我最重要的概念,就是要以「利他」的方式,跟客戶/主管或是其他人溝通,也就是說,講話的時候與說明的角度,假裝自己就是客戶,提出的建議,以客戶的客戶為依歸,這樣客戶就比較容易接受你的建議與意見。例如這樣的說明:如果要修改這項功能,因為這個修改,我們必須同步檢查並修改其他五個地方,這個修改要花上一點時間,可能會影響到你的使用者上線測試的進度。或許我們先以另外一種比較快速能解決問題的方式處理,這樣專案比較能符合上線的時程。

上課很輕鬆,聽課很容易,看看教學影片也不難,但實際接到客戶抱怨電話的時候,如果遇到了蠻不講理的客戶,就會非常容易因為情緒的影響,而擦出火花,失去冷靜判斷的態度。這樣的錯誤即使是事後的道歉,可能都會造成了某一部份永不磨滅的嫌隙,引以為戒。

MDM (Master Data Management) 主資料管理 的概念

01:25下午 五月 02, 2008 in category General by yaocl

Master Data (主檔資料) 是企業內部最主要的資料檔,例如客戶資料、產品資料、員工資料等等,為了改善資料品質與一致性需求,提昇Master Data被運用與維護的效率,所以需要一個MDM的total solution。以一個小企業來說,一開始導入系統,應該是視情況與當時的需要,購入某些特定功能,跟主要業務有關的資訊系統,接下來企業慢慢地成長,資訊系統增加,這些資訊系統之間的資料轉換與溝通問題,就會慢慢地浮現。

對所有的資訊系統來說,一開始要面對的就是帳號跟權限,所以員工帳號應該是符合Master Data條件又最常見的一種資料,MIS遇到越多系統就有越多帳號得要整合,要整合帳號,就會想到帳號同步與SSO的產品,但如果公司的規模不夠大,或是業主無視於帳號同步的需求與重要性,SSO會是非常難推行的一種產品。

MDM所要面對的資料,是企業內部跟業務有關的核心資料,雖然用起來可能會跟帳號同步的概念很像,但得要更一般化地將所有可能的狀況,都規劃到產品的功能上,然而產品的規模越大,能夠運用的企業就越少,因為他們並沒有足夠的資訊人員能量可以撐住整個MDM的solution維護。

SUN的Mural將 MDM 解釋成,Master Index Studio (index -> search)、Data Integrator (資料整合與收集) 、Data Quality、Data Mashup (展示與使用)、Data Migrator (轉移)這五個子專案。Microsoft的roadmap中,則是將MDM product codename稱為 Bulldog,但還沒看到整體的產品線,如何整合出一個完整的MDM solution,目前只有在Roadmap中舉例,他會以PerformancePoint, Dynamics, MS Office Excel, Office SharePoint Server整合出整套solution。

資訊產品如何能夠將產品的進入門檻降低,又能解決企業主關鍵的業務問題,就是成功的唯一要件。雖然SUN以開放程式碼的系統,作為產品的行銷策略,但對企業主來說,如果真的有這樣的需求,有個方便又好用的產品,又能讓資訊人員快速上手,才是重點。這個部份,相信未來最會包裝產品的微軟,會提出最厲害又簡便的軟體工具。

Master_Data_Management in wikipedia
The What, Why, and How of Master Data Management November 2006
微軟將進入主檔資料管理領域 2007/7/20
嶄新Teradata MDM 2.0方案問世,隨即贏獲首張客戶訂單 2008-03-26
美商甲骨文宣佈推出資料整合套裝軟體 三月 26, 2008
Sun Microsystems Announces Mural: Open Master Data Management
Mural - Open Data Management Community
MDM (CDI, Data Governance) Vendor Products
Master Data Management - Microsoft

cursor bug in FF

11:42下午 四月 29, 2008 in category General by yaocl

當我們在使用yui的dialog的時候,卻意外發現一個奇怪的問題,只有在Firefox才會發生,就是dialog裡面的input的cursor,在dialog放在一個iframe網頁上面的時候,即時用滑鼠點了一下input,但是cursor還是不會出現,經google後發現,這是firefox的一個bug,而且沒有一個適當的解決辦法。

Cursor disappears in Firefox這篇文章建議以調整 overflow 的style解決,我試過了沒有用。Infamous Firefox cursor bug - Info and possible workaroundsCursor (caret) sometimes fails to appear in input text fields這邊有人建議以 position:fixed 還有 overflow:auto; position:absolute的方式解決,但是dialog的位置就沒辦法任意地拖動了,目前的結論還是無解。

Tomcat 5.5.26 6.x的 cookie problem

03:25下午 四月 29, 2008 in category General by yaocl

最近原本程式在Tomcat 5.5.25可以運作正常的Cookie,最近在Tomcat 5.5.26上測試卻發現出了問題,原因在我們在Cookie的數值上,是以Base64編碼,然而base64的編碼結果會在最後面產生多個 = 字元,這個等號,在Tomcat 5.5.26取得cookie value時,被視為cookie規格中的等號。

舉例來說 cookie1=value= ,應該取到有個cookie1,數值為value=,但在Tomcat5.5.26上卻是,有個cookie1,數值為value。在Cookie V0的規格中,他告訴我們cookie裡面的資料必須要自己用URL style %XX 的方式編碼。

我懶得再用java.net.URLEncoder去轉換,直接replace所有的 = 為 $,取到cookie資料時再把 $ replace 成 = 就可以解決了。

至於 V1 的cookie,應該是不要用,相容性可能會有點問題。

New: Tomcat 5.5. 26 - cookie with colon in name is parsed incorrectly
Cookies behave differently between Tomcat 5.5.25 and Tomcat 5.5.26
Cookies are broken in 6.0.16?

用支援UTF-8 BOM的Reader解決proxool設定檔UTF-8 with BOM的問題

08:54上午 四月 22, 2008 in category General by yaocl

在使用 proxool 的時候,如果用JAXPConfigurator來啟動proxool,通常會用 JAXPConfigurator.configure(new InputStreamReader(proxoolInputStream), false); 這種寫法,但是java.io.InputStreamReader在遇到UTF-8 with BOM的檔案編碼格式的設定檔時,就會產生問題。

在遇到BOM(byte-order mark)的時候,通常都是找個支援修改檔案編碼的Editor來處理,例如我們常用的Emeditor或是EditPlus(參考網站 BOM (Byte Order Mark) 的問題BOM BOM BOMUTF-8),我們的作法,原本就是採Emeditor來使用,但是程式交出去的時候,就常常會遇到客戶直接使用Windows預設的文字編輯器notepad來編輯proxool.xml設定檔的狀況,導致程式在啟動DB Connection Pool就會出問題。

ROME實作了com.sun.syndication.io.XmlReader這個類別,在文件一開始就提到,"It looks for the UTF-8 BOM first.",另外這個類別又是extend java.io.Reader,這就省事多了,因為JAXPConfigurator.configure正好是需要一個java.io.Reader,所以只要把 JAXPConfigurator.configure(new java.io.InputStreamReader(proxoolInputStream), false); 這種寫法,改為 JAXPConfigurator.configure(new com.sun.syndication.io.XmlReader(proxoolInputStream), false); 就可以讓proxool設定檔也相容於惱人的BOM問題。

不想使用ROME的話,也可以使用UnicodeReader and UnicodeInputStream提供的程式。

RequestDispatcher 在 weblogic 9.2 的問題

12:10上午 三月 25, 2008 in category General by yaocl

因為用了filter寫cookie登入,又因為用了RequestDispatcher作轉頁,又因為用了weblogic,從首頁進來的request,因為cookie登入,但cookie的資料因為別的原因錯誤了,本來寫清除cookie後,再用RequestDispatcher轉到首頁,出問題了,成了無窮迴圈。

這種寫法在Tomcat運作正常,Tomcat在我寫RequestDispatcher之後,並沒有再apply一次Cookie登入的filter,所以可以傳回首頁的網頁跟清除cookie的response,但是神奇的weblogic,在我forward到首頁時,又apply了一次cookie登入,哇,無窮迴圈出來了。

weblogic真的是神奇的ap server跟免費的就是不一樣,只好改用sendRedirect,強制把response送回到瀏覽器,這樣就能把cookie清掉,再讓瀏覽器取一次首頁,這就正常了。

經過這樣的事件,不知道還有沒有信心......

miroko網路硬碟

03:13下午 三月 14, 2008 in category General by yaocl

同學當PM做的網路硬碟miroko,這種消耗頻寬的東西,還真是普通公司沒有辦法做的,現在他們正在舉辦50G抽獎活動,有興趣的人可以參加。

安裝client端軟體後,就能提供一些功能,例如檢視本機硬碟的資料,同步等幾個功能,功能列表在這裡。朋友之間可以互相分享網路硬碟資料,這個功能很方便,相信未來開放BT下載後,會成為消費頻寬最大的網站。

測試的過程中出現一些問題:
1. 加入好友的連結放在留言頁籤裡面,而且藏在右邊,這有點奇怪,應該預設把好友的目錄打開才對
2. 我的預設瀏覽器設定為IE,安裝了client端的軟體,用IE打開miroko時,可以偵測到軟體,但用FF打開miroko時,就測不到了
3. 我的IE一直開著在下載檔案,同時開FF上傳檔案,速度就有點奇怪,上傳的地方,有時會一直是0%,畫面一直開著,等一下才能上傳上去
4. 相簿的地方有點奇怪,產生相簿後,得點選開啟相簿,才能看到,右邊的相片預覽似乎是沒有作用

在公司的下載速度還蠻快的,一個700MB檔案,流量為170KB~200KB,不過這可能是因為使用者還不多的關係,相信以後頻寬與速度配合上BT,會是這個服務最大的賣點,也是最重要的議題。