我的雲端生活網 - Life+

Wednesday, December 30, 2009

我要公開感謝你們,你們才是最棒的~~

Dear ALL:

這話其實很八股,但;如果沒有各位的努力微程式無法躲過客戶
無情的砲火,無法打好在商業場上的戰爭,而我沒辦法在各主管
面前臉上有光,這一切只因為你們努力而有所收穫,你們犧牲自
己無價的光陰 聰慧的大腦...成就團體的榮耀,我為大家這一年
的辛勞,感謝大家

我們在未來的一年,會有新的挑戰等著試煉各位灼熱的熱情,
體部在新的一年來臨會有一些改變,我希望有機會協助各位打
造更好的工作環境而努力,記得~~別忘了留一點(呼)呼聲給我,
不管是掌聲或噓聲我都樂於接受,也預祝新年佳節愉快,衷心真
誠的感激各位...這裡當然也包含了imoo團隊裡的夥伴與摯友

Luke.

???我有好多疑問???是思考?還是想太多 ?

最近在讀Peopleware 腦力密集產業的人才管理之道;這本書籍,裡面有蠻
多有趣觀點,值得一讀;不過總是會思考文中提到的一些問題有些疑惑

文中提到 一些粗略的數據,<簡單的描述我的疑問>---文章有一章節(在空
間上省錢) 他們證明表現好的員工通常有較大的工作空間,透過競賽(可能
是不同公司),之後蒐集每個人的相關環境數據(使用空間 環境噪音 電話的
因素...) , 最後得到的結論是 表現最好的前1/4 通常有比較大的使用空間,
工作的干擾因素通常也是最低的...

這樣的結論有點怪; 因為我們可以反過來思考; 有沒有可能因為這些工作
者因為特別努力,所以通常會得到公司比較多的資源與自主(有獨立的辦事
室 可以選擇隱蔽的空間...)? 通常表現較優的工作者,對於工作的投入也比
較熱情專注,所以;對於那些干擾因素的容忍度比較高? 而且這個結果本身
有點自相矛盾,如果這個結論是對的,所有優秀前1/4 的員工會集中再某個
特定的公司,因為給員工較大的空間如果是統一的公司政策,那麼同一公司
參賽的人工作空間一定都很大,所以結果一定不會是表現好的前1/4分散在
不同的公司,不是嗎?

我不知道是不是學科學的人都對 不同觀點得到不同的結論,這樣的結果覺
得科學?簡單的說一直不太懂管理這們學問 科學嗎? 量化? 量化的意義是
什麼? 如果量化無法反應抽離 不同觀點 所造成 的不同結果,量化的意義是
什麼?


Monday, December 28, 2009

預祝各位在即將到來的2010年新年快樂

這一年大家辛苦囉~
預祝各位在即將到來的2010年新年快樂!
 
 

Erlang 叫用外部程式很簡單

多行程程式是 Erlang 語言的一項重要特色。而許多時候需要叫用外部程式, Erlang 的程式寫法也表現得很優秀。

由於標榜 Concurrency-Oriented Programming , Erlang 讓開發者將每一個函數視為行程。行程要與其他行程溝通,必須藉由拋接訊息來表示請求或回應。 Erlang 程式的訊息介面與 ! (send) 和 receive 兩個關鍵字有關。而外部程式的訊息介面,則稱為 port 。 Erlang 對 port 送訊息給外部程式,也從 port 接收外部程式來的訊息。 Erlang 的 open_port/2 提供了外部程式叫用的功能,並且提供了外部程式的 port 設定方式。例如:

Port1 = open_port( {spawn, simple_work}, [in, out, use_stdio] )

以上 port 的選項, in 容許 simple_work 外部程式可以從 port 接受輸入訊息, out 容許外部程式可以從 port 輸出訊息, use_stdio 指定外部程式的標準輸入和輸出分別對應為 port 輸入和 port 輸出。 simple_work 可能是以下 perl 程式:

#!/usr/bin/perl -w
# simple_work program
my $buffer;
$buffer = readline STDIN;
print $buffer

Erlang port_command/2 可以指定 port 並送訊息。例如:

port_command(Port1, "hello!\n")

simple_work 送出 port 的訊息, Erlang 程式要用 receive 接受訊息,收到的訊息格式依 open_port/2 的選項決定。

參考資料

Sunday, December 27, 2009

劍客其實不擅長刀法

在這個 blog 應該是不太適合談msn機器人以外的事務 ,不過這幾天我
有感而發,突然想講一個故事 ,不管你認不認識我 ,不管你是不是跟我一
起努力打拼的夥伴 ,不管你喜不喜歡我說故事風格,不管你是不是想給我
一些噓聲或掌聲 ,也許你會嗤之以鼻 ,也許你會會心一笑 ,總之不管如
何 ,這個故事正要開始

以前一個朋友問我一個問題,他問,你喜歡刀還是劍? 這問題讓我思考了很
久 ,我在想; 刀與劍哪裡不同? 想了很久沒有答案(你可以上網找到類似
這類的圖片http://blog.sina.com.cn/s/blog_4a1b8858010005i8.html)
,這讓我想起了另一個故事 ,一群劍客裡有一個劍法精湛的劍客 ,在相同
資歷的劍客裡他總是能輕易的擊敗對手 ,很多高手名流遇到他總是甘拜下風
,但這個劍客有一個習慣,他總是喜歡跟其他的劍客聊到刀客的刀法 ,說那
個刀客的刀法過慢 說這個刀客遇事只攻不守 ,成不了大氣,尤其是他喜歡
問他的劍客友人 ,某個刀客對他的評論是不是公平...,一天 ;他與自己劍
友聊到類似的事情 ,這個同好恰好有事無法久留,但 ;給了一個建議 ,約好
明天一早上山與某位高僧一起繼續這個話題

第二天 ;劍客依約上山找了老和尚 ,老和尚第一句話就說; 久聞施主是一
個毫無自信之人 ,劍客大驚 ;連忙詢問 ,何以見得? 老和尚端坐一旁不急
不徐的說; 眾知施主的劍藝高超, 但卻常評斷刀客刀法拙劣, 正是尋求外
援以解自我空虛之徵 ,探尋其他刀客對自己的評論是否公平 ,正是自信不
足之兆;劍客下山後從此不再向外尋求解答 ;勤鍊刀法 ,往後10年成為一
代宗師

這故事應該有一些啟示 ;顯而易見的是;他思考過這個老和尚說話的意思 ,
而不執著於刀與劍的關係,因為如果下山後再去問朋友自己是不是常常在意
外人對自己的評論? 恰好正中下懷 ,所以及時反求諸己 ,然而真實的世界
裡 ,我們很少思考一件事的全貌 ,劍客應該勤鍊劍法 ,刀法的優劣與劍客
無關 ,但如果要向另一個層次突圍 ,需要熟悉刀法的優點勤練刀法 ,如此
才能融合多方優點成為一代宗師 ,能夠把別人的武器運用自如 ,劍客就會
變成刀客最後變成宗師 ,不管是故事裡故事外道理都是相通的 ;這故事本
身也許是一種武器 ,但要看拿在誰的手裡 ,巧妙各不同 ;而說故事總要有
一些啟發作用 ,至於是不是有啟發的效果 ,可能還需要多一點思考的空間
與慧根了

Sunday, December 13, 2009

WebGL規格草稿釋出

很久以前網頁上做3D就是VRML了。最近有WebGL釋出,是OpenGL管理社群與瀏覽器開發組織的協議產物。WebGL規格書(https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/WebGL-spec.html) 可見到一些程式介面。WebGL容許開發者用JavaScript在網頁上畫圖了嗎?

我的第一個疑問是,用JavaScript在網頁上畫圖,是否會讓一些繪圖程式無法不公開?或者,為了讓繪圖程式不公開,要做更多程式混亂工程(code obscurity)?不過通常不要太依賴弄亂程式碼來確保一些安全比較好,這種安全是不穩定的,可見相關討論: http://www.owasp.org/index.php/Avoid_security_by_obscurity

Monday, December 7, 2009

自然語言處理

資料統計方式的文件翻譯

2009年三月 Google 的 Alon Halevy 等人放出一篇通俗的文章,題名為 The Unreasonable Effectiveness of Data ,說明了用資料統計方法處理文章翻譯的好處。

他們提到,即使 Eugene 撰文 The Unreasonable Effectiveness of Mathematics in the Natural Sciences 說明物理學學者怎麼都愛用數學式做優雅的表達,但是碰到英文翻譯就不一定都有好處,好比經濟學家用數學也不好處理人文社會的情況。 Google 處理大量的網頁資料,他們的資料庫 (corpus) 特別沒有規矩,存在許多拼字錯誤、用法錯誤、甚至有造假文字。但是他們能用統計方法,處理這些網頁資料,得到他們要的翻譯。

所謂翻譯,是指處理文件及資料。翻譯是自然語言處理的其中一種應用,其他有語源分析、資訊萃取等等。翻譯文件是人們大量使用的應用方式,所以在網路上有各種文件的各種語言版本,不需要多少人力處理。而專用於傳統語言處理的語料庫 (corpus) 則需要相當大量的人力,做語法、語意的定義工作。所以,傳統自然語言處理方法的語料整理工夫已消耗太多人力。然而,考慮到文件翻譯,網路上已經存在許多可用的語料庫了,應絯善用這些網路資料。

在網路文件的錯誤方面,雖然在百萬級 (million) 資料量中,文件中存在的錯誤可能有影響,但是當語料庫數量達到十億級 (billion) 甚至兆級 (trillion) 數量,文件錯誤佔了相對更少的比例。使用統計式的自然語言處理可以收到自然的正確結果。 MapReduce 恰好非常適用於統計式翻譯。

統計式翻譯方法的缺點是,無法糾正來源的語料庫存在的錯誤,也不容易對抗一些造假的事實。不過,翻譯工作只需要把一個文件變成另一種語言版本,而不是要做推理。

語言的組合性

在語言學中,自然語意的解釋,是指有用一種後設語言 (meta-language) 處理某一種目標語言 (object-language) 的句子意思。例如,用英文解釋波蘭文句子的意思,波蘭文是目標語言,英文則是後設語言。按照這種思維,電腦程式語言是哪個層次的語言呢?

回到語言理論,Allan Keith的書 Natural Language Semantics 提到傳統語言處理。語言是由許多單字組成,而單字的意義是可以組合的。句子或片語的意思可以由所構成單字的意思組成。 Allan James 的書 Natural language understanding 也提到,語言處理在應用上可分為幾個類型,其中一種是將語言應用系統做為問答系統,另一種是將語言系統做為用語言發送指令。我想,採用複雜事件處理的概念,或許可以將一個句子的每個單字當做是各別到達的事件,我們對句子做複雜事件的偵測,把一些關鍵詞的意思抓出來,根據每個關鍵詞的前後順序決定這個句子對應成什麼意思、代表什麼指令,然後對系統發出指令。

自然語言句子做為指令的系統,實作上的基本優勢是:雖然自然語言理論上有無窮數量的語料庫,但電腦系統接受的指令是有限的,所以自然語言對應到電腦的句子語料庫少了很多。至少這是可慶幸的。

Thursday, December 3, 2009

程式風格與系統實作

有個著名的99題程式問題集中有二件基本問題:
  1. 反轉一列資料。
  2. 檢查一列資料是不是回文。
用 Erlang 寫,程式如下:

reverse( [ ] ) -> [ ] ;
reverse( [ X | Y ] ) -> reverse( Y ) ++ [ X ] .

palindrome( Xs ) -> reverse( Xs ) == Xs.

這些問題主要是在考邏輯程式語言或函數程式語言解決問題的方法,用 Erlang 寫非常自然。至於考慮到用指令式程式語言,程式會怎麼寫呢?先想想 C 程式。
void reverse(char *x, int xn, char *y, int yn) {
    int i;
    yn = xn;
    for(i=0; i<xn/2+1; i++) {
        y[i] = x[xn-1-i];
        y[yn-1-i] = x[i];
    }
}

main() {
    char a[] = {'a', 'b', 'c', 'd', 'e'};
    char b[] = {'1', '1', '1', '1', '1'};
    reverse(a, 5, b, 5);
}
以上程式是反轉一列資料。至於檢查是不是回文,與反轉一列資料有相當的程式結構。所以,照著反轉程式結構可以改出檢查回文的程式。

/* void reverse */ int is_palindrome(char *x, int xn /* , char *y, int yn */ ) {
    int i;
    // yn = xn;
    int result = TRUE;
    for(i=0; i<xn/2+1; i++) {
        // y[i] = x[xn-1-i];
        result &= (x[i] == x[xn-1-i]);
        // y[yn-1-i] = x[i];
    }
    return result;
}

Erlang 程式和 C 程式各自從掌握的不同邏輯意思解決問題。對 Erlang 程式來說,一列資料是回文隱含了將這一列資料反轉會和原資料相同。對 C 程式來說,是考慮到一列資料若是回文,資料每一項在前半段位置的,會和在後半段鏡射位置的資料相同。所以,用 C 寫以上程式,一定要把以上二個程式寫成一樣的結構,因為它們的順序邏輯一樣。但是用 Erlang 寫程式,則可以說是反轉資料問題是檢查回文問題的子問題。不同的語言有各自解決問題的能力。用 C 的程式風格思考, Erlang 真不好寫;並且用 Erlang 的程式風格思考, C 也不好寫。不過,只要用 Erlang 的方式寫 Erlang 程式,用 C 的方式寫 C 程式,都是做對事情了。

所以,本篇文題回到系統實作方面:本來我有個系統是用 Perl 規則持續讀檔案,用檔案時間判斷是否有新的 RFID reader 讀數出現。系統中存在大量這種類型的 Perl 規則,並且反覆判讀檔案消耗大量時間。我可以用 MapReduce 來節省工作時間嗎? MapReduce 本身就是前車之鑑。

在有大量資料需要處理的分散系統上,要直接寫程式,不管是什麼檔案鎖定、程序鎖定、或是信號的控制機制,最後都是普通的程式處理方式:把大量資料塞進一個迴圈裏。 MapReduce 是個漂亮的程式作法,它的思考方向是程式有多少等級的數量,程式也產生出多少等級數量的程序,讓每個程序分配到相當少量的工作,許多程序一起做!所以,前後二種處理方法,在程式的寫法上相當不同。直接的程式,想法依然直接。但是,實作 MapReduce 是先做一個計算框架,框架中有二種空位存放 map 和 reduce 二種類型的程式;而中樞設計不要思考 map 和 reduce 程式可能怎麼寫,而是只思考把一些程序分配去執行 map 程式、另一些程序分配去執行 reduce 程式,並且這些程序如果中斷但沒做完工作,就再分配一次同樣的工作。於是,剩下的工作是 map 和 reduce 程式都比較好寫,而且寫完並套進 MapReduce 架構之後,就可以處理大量的資料。同樣的問題處理,可以用不同的程式方法解決問題。

依我看,現有系統的規則,只有檢查新 reader 讀數的規則可以保留,直接寫成 map 程式。

rfid_read ( File, Reads ) :
    for each (Tag_ID, Reader_ID, Time) in Recent(Reads)
        emit( (observation, (Tag_ID, Reader_ID, Time)) )

然後交給其他的 reduce 程式處理。至於其他類型的規則,則要按照 MapReduce 的思維改寫成適當的 map 程式或 reduce 程式比較好。

Wednesday, November 25, 2009

嘉南藥理科技大學開發校內專屬msn機器人

資管系公告

即時通訊在校園生活裡日趨頻繁,為了提供師生更佳的資訊服務,感謝
微程式資訊(股)公司提供msnSDK訊息控制開發套件測試即日起將進行
校內系統開發整合等測試,期能完成校內專屬msn機器人,成為師生訊
息傳播另一重要管道

http://mis.chna.edu.tw/data3/average_show.asp?average_id=814

Sunday, November 22, 2009

答覆客戶問題: 你們與其他msn機器人最大的不同是什麼?

我們與其他發展msn機器人的團隊最大的不同是

1.我們不是只發展msn機器人,我們是以整體im為發展方向,所以yahoo即時通 gtalk google-wave機器人 plurk機器人 facebook機器人...都會是我們的產品重點
2.我們是唯一提供完整api 讓使用者可以在msn機器人上自行應用發展的產品,當然我們本身也提供客製化的服務
3.我們的投資團隊包含經營電子商務相關產業與訊息平台開發商...,所以我們自己也在使用這些行銷工具或是相關系統整合
4.我們應用的領域比較廣泛,有很多實例可供參考 http://www.imoo.tw/blog/?p=84
5.我們是目前是市場上客戶最多的IM機器人團隊

Monday, November 16, 2009

微程式資訊新聞中心相關報導

◎微程式新聞中心
http://www.program.com.tw/app/geturl.pl?id=5&url=../xml/news/case_page1.xml&sid=1&cid=
【2009/10/30 成交案例】感謝蓋德科技 選購「RFID門禁設備(MT180)一批」交貨完成。
【2009/10/21 成交案例】感謝高苑科大 選購「RFID讀卡機(MP-508U)一批」交貨完成。
【2009/10/13 成交案例】感謝狀態廣告 選購「MSN SDK」。
【2009/10/12 成交案例】感謝嘉義大學 購買「RFID讀卡機(MP-501SSRN)、控制器(MP-511RRW-N)一批」交貨完成。
【2009/10/05 成交案例】感謝蓋德科技 選購「RFID開發套件(Demo Kit-T&A)」交貨完成。
【2009/10/01 成交案例】感謝台灣互動 訂製「RFID 讀卡機模組(MP-507)一批」交貨完成。

◎微程式情報局 http://microprogram.blogspot.com/
【2009/10/30】TASHI 智慧生活從開門那一刻開始...
【2009/10/30】微程式「MSN機器人」成為校園安全守門員

◎lazy Guy http://rd-program.blogspot.com/
【2009/10/27】微程式「MSN機器人」成為校園安全守門員
【2009/10/14】他們都在做--msn機器人與校務/圖書館系統的整合


Thursday, November 12, 2009

使用shell script 操作 msn機器人

這一篇文章是使用免費imoo msn機器人套件的使用者提供,msn機器人本
身可以在 linux/win32 下運作,可廣泛支援大多數語言 (asp/asp.net/c#/java/perl/ruby/python/php/vb6/vb.net...)當然也
能使用shell script配合wget 或curl 來撰寫相關應用

以下原文出自 http://dominic16y.world.edoors.com/CGNWR3kC9euM

使用者將imoo msn機器人,應用於系統監控的實例

---

為了便於監控 Server 的狀態,我需要 Server 在更換IP時,能自動透過 msn 發個訊息給我 server 的當前IP。 msn 機器人已經有人寫好了,可在這裡免費申請使用,現在需要的就是我寫一個小程式來呼叫 msn 機器人來幫我發送訊息。

首先參照這個頁面,是 msn 機器人的運作流程,簡單提一下
0.當你申請過後,他會寄給你一個你專屬的 msn 機器人 (就是一個網址啦),和操作這個機器人的帳號密碼。
1.取得 SPID 值,也就是 session ,有效期為六小時。
2.加聯絡人,你和機器人必需互加為聯絡人,才能發訊。
3.發送訊息,發訊時要帶有效的 spid 值才能發送。

以上幾點呢,都還不需要寫程式,但你必需得先用網頁的方式測試ok了,能正常收發訊息時,才接著下一步。也就是說把瀏覽器打開,貼上正確的網址,就能測試了。

開始寫 shell script

以下所寫的程式適用於 debian 4.0 和 5.0 的環境

vim /home/backup/msn_send.sh

#!/bin/bash
# msn 機器人發訊

#1.取得 SPID 值
wget -q -O /tmp/session.txt -q 'http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=帳號&PASSWD=密碼'

#2.設定 session 變數,此變數的有效期為六小時
session=`cat /tmp/session.txt|awk '{printf $2 "\n"}'`

#3.設定date與IP 變數
IP1=`/sbin/ifconfig ppp0 | grep "inet" | cut -c 21-38 |awk '{ print $1 }'`
date1=`date +%Y/%m/%d,%T`

#4.送訊息
wget -q "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?UIDS=你的MSN帳號&MSG=$date1 IP更換:$IP1&flags=0&FUNC=SENDMSG&ENCODING=UTF-8&SESSION=$session"


以上的程式內容,需註意紅字的部份修改成你的帳密
再執行以下指令安裝
chmod 755 /home/backup/msn_send.sh
ln -s /home/backup/msn_send.sh /etc/ppp/ip-up.d/msn-send

這樣,一但 server 換IP了,它就會自動的透過 msn 來通知你。

Wednesday, November 11, 2009

準備要Go?讓我們Go

昨天11月10日,Google 發表了新語言 Go ,是簡單、快速、支援 Unicode 、多緒、垃圾回收機制、物件導向的語言寫法、和彈性並安全的資料型態的動態語言。相當像 C 語言。( http://golang.org/ , http://google-opensource.blogspot.com/2009/11/hey-ho-lets-go.html ) 支援 Linux 和 Mac ,不支援 Windows。

Concurrence 方面, Go 提出 Goroutine 一詞:一個 goroutine 是在同一記憶體位置上和其他 goroutine 同時執行的 Go 函數。Goroutine 不是像 coroutine 、 process 或 thread 的東西。一份程式由許多個 goroutines 組成。 Goroutine 是不會被 block 的單元。

語法方面很簡單,記憶體空間配合常值表達配置 (需要一個 byte 的整數就不會硬配四個 bytes ) ,陣列使用空間的代價很少,使用 Goroutine 代價也很少。此外,有特定的語法定義 channel ,方便寫通訊程式。在 channel 語法上定義同步或非同步傳輸。

參考資料

Saturday, November 7, 2009

Oracle-Sun 全新資料庫發表

今年11月4日於台北國際會議中心,昇陽公司發表 Oracle 和昇陽合力發展的資料庫平台 Exadata 。 Exadata 沿襲並整合了昇陽過去十大創新技術,提供高速、平行的大量資料處理功能。

以往的在線交易處理 (OLTP) 可能在硬體或儲存體方面遭遇瓶頸。昇陽公司運用 Chip Multi-Thread 特製晶片減少 Exadata 平台所需的處理器數量,並達到省電需求。在資料儲存方面,使用運行資料壓縮和智慧快取二項技術,解決輸入與輸出的瓶頸。

Exadata 是 Sun SPARC (硬體) 、Sun Solaris (作業系統) 、Java (虛擬機) 、及 Oracle (資料庫) 的完美組合,並且提供多種層次的虛擬化平台,能夠建立虛擬的分散系統。基準測試 (benchmark) 結果,昇陽使用9個機架的 Exadata 系統做到一個TPC-C,而 IBM 需要使用56個機架才做到一個TPC-C。 Exadata 的效能顯得較高,並且耗電率顯得較少。不過,昇陽公司大中華區系統產品事業部高級技術總監潘榆奇先生指出,每一家公司根據基準測試選購產品或方案時,應該先針對自己的專案需求選擇要使用哪些基準測試,才能做有效的決定。

據言 Oracle 即將併購 Sun 公司。而目前發表 Exadata 時,二家還是各自獨立的公司。未來發展如何,「桃李不言,下自成蹊,」可待結果自明。

以上說明及描述僅根據2009年11月4日本人參與昇陽公司舉辦的產品說明會之聽講摘要。

Friday, November 6, 2009

邏輯程式設計 Prolog

最近花不少時間重新看 Prolog 和 Erlang 的程式寫法,感想是,邏輯程式工具的威力真強。

Prolog 是一種老派的邏輯式程式語言,它的目標是執行邏輯系統。邏輯系統是一些事實和一些規則組成的一組「資料庫」,在系統定義範圍內,可以找到有一些情況被滿足。例如最簡單的三段論法說:

morale(X) :- man(X).
man(socrates).

?- man(socrates).
yes
?- man(me).
no

以上程式中,大寫符號是變數,小寫符號是常在詞彙。句子呈現 X :- Y 是規則,讀做 X if Y ,在邏輯表達式是寫成 X <- Y 。另一種普通的句子是事實。而末尾有 ?- 開頭的,是查詢句。根據以上程式,有些對邏輯一知半解的會大叫:「喔!原來我不道德!」但只是因為以上的三段論與現實的認知稍有差別:邏輯句子表達的是語意的最基本部份,但是日常用語的語意結構非常複雜。

Prolog 程式只要定義幾個句子,執行器就會找出一些滿足這些句子的情況。邏輯推論也是如此。設想有個句子定義可以從一列資料的某個位置取出一項資料:

element_at([X|_], 1, X).
element_at([_|Y], N, Z) :- element_at(Y, N1, Z), N is N1 + 1.

第一句說,對開頭為X的一列資料取第一項,答案是X。第二句則使用了遞迴定義。 (第二句讀作:(右邊) 如果 Y 的第 N1 位置是 Z ,則 (左邊) Y 前面多一項資料,這一列的第 N 位置是 Z 。) 以這樣的寫法,除了可以從一列裏指定位置取得資料之外:

?- element_at([a,b,c,d,e], 2, X).
X = b

還可以查詢在什麼位置可以找到指定的資料:

?- element_at([a,b,b,c], N, b).
N = 2;
N = 3

程式的評估,基本上是反覆檢查可以成立的句子,於是可以將所有的情況一筆一筆找出來。所以,寫一些列出各種情況的程式就變得很簡單。例如,寫個組合程式:

combination(0, _, []).
combination(_, [], []).
combination(1, X, [Z]) :- element_at(X, _, Z).
combination(N, [X|Y], [X|Z]) :- N > 1, N1 is N - 1, combination(N1, Y, Z).
combination(N, [_|Y], Z) :- N > 1, combination(N, Y, Z), length(Z, N).

第四句只考慮一列的第一個元素X參與在答案中的情況,而第五句純粹考慮第一個元素不參與在答案中的情況。 (第四句讀作: (右邊) 如果對 Y 取 N1 個元素的一種組合是 Z ,則 (左邊) 對 Y 前面加了一項 X ,取 N 個元素的一種組合,就是 Z 前面也加 X 。因果關係!) 寫程式時,考慮答案只考慮各種情況的其中一種,但程式執行時, Prolog 就像內建迴圈機能一樣,反複將各種情況一樣接著一樣列出來:

?- combination(3, [a,b,c,d,e], X).
X = [a,b,c];
X = [a,b,d];
X = [a,b,e];
X = [a,c,d];
X = [a,c,e];
......

跟 Erlang 比較, Erlang 程式沒有反覆測試每一條句子的執行方式,因為 Erlang 是函數式語言,函數的特性是從多個輸入也必須只對應到一個值。不過, Erlang 也是經由長期用 Prolog 慢慢開發完成的。這是我拿 Prolog 和 Erlang 對照檢視的原因。

Erlang 的組合程式:

combination(0, _) -> [[]];
combination(_, []) -> [[]];
combination(1, X) -> [ [Z] || Z <- X ];
combination(N, [X|Y]) -> [ [X|Z] || Z <- combination(N-1, Y) ] ++
[ Z || Z <-combination(N, Y), length(Z) == N ].

(第四句讀作: (左邊) 想求得 Y 列前面有個 X 的資料取 N 個元素的各種組合情況,先求 (右邊) 可能是對 Y 求 N-1 個元素的各種組合情況,再將 X 套到每個組合情況之前,或者是直接求 Y 中取 N 個元素的各種組合情況。至於末尾檢查 length(Z) == N ,是要克服後半程式結果的不一致情形。)

執行結果:

> test:combination(3, [a,b,c,d,e]).
[[a,b,c],
[a,b,d],
[a,b,e],
[a,c,d],
[a,c,e],
[a,d,e],
[b,c,d],
[b,c,e],
[b,d,e],
[c,d,e]]

Erlang 缺乏逐步列出各種情況的機能,所以要列出全部的組合情況,用 Erlang 必須把各種答案都算出來,並收集成一列。寫 Erlang 程式顯然比寫 Prolog 程式更辛苦一點點,不過, Erlang 提供 List Comprehension 表達法,使這個組合程式也變得稍微簡單一點點。

Tuesday, November 3, 2009

用Erlang做個文書編輯器

11月1日在Erlang Programming論壇發起一陣討論,談到用Erlang寫文字編輯器的疑問(見1.) 。Ted問到,據說Erlang是分散處理及容錯都很好的語言,那麼如果寫文字編輯器,有什麼並行方面的好處?Mats說,如果有分散處理能力,很好,他常在寫東西到一半必須把半成品備份,這樣可以保留他許多編輯的狀態。

Jayson回答,Erlang雖然不錯,但是講到字串處理真是麻煩透了。倒不如使用JRuby或Clojure之類,建立在Java基礎上的語言。接著,Erlang的發明人Joe答覆了,他指出Erlang做列式的資料處理真是超快的。文字編輯器所需要的文字處理,那些在C++看成string的東西,在Erlang只要把它看成list就做得很棒了。他還說,用C寫文字編輯器才是痛苦的事。最麻煩的undo功能,C語言寫起來要擔心stack中儲存的狀態有沒有改掉,而用Erlang做起來很簡單,因為語言特性比較少有狀態改變。

另外,對於載入及搜尋大檔案方面,Joe指出如果你不會寫大檔案處理的功能,這不是語言方面有問題,而是你缺少演算法的知識。他曾經需要處理gigabytes的檔案,讀過 "Managing Gigabytes" 一書之後,實作了gamma encoding就解決了問題。

Luke Gorrie有個用Erlang寫的仿Emacs。(見2.)

1. Erlang for Programming a Text Editor, discussions from Erlang Programming group at Google groups, url: http://groups.google.com/group/erlang-programming/browse_thread/thread/a6c93367b439a284?hl=en .
2. Luke Gorrie, Ermacs (software), http://fresh.homeunix.net/~luke/ermacs/ .

Monday, November 2, 2009

用 MapReduce 處理大量工作

MapReduce是一種簡單的程式模型,只要知道map和reduce程式,系統會幫忙將map用在原始資料上,整理岀中繼資料,然後用reduce程式收斂這些中繼資料。

程式結構

Map是一個從 (key, list(value)) 對應到 list(key', value') 的函數。簡單說,對map輸入一列資料,map會將資料做一些前處理,然後把一個 key 跟每一筆資料配對。Map是使用者自己寫的程式。

Reduce是一個從 list(key', value') 對應到 list(value'') 的函數。簡單說,reduce是彙總函數,將許多 value' 收合為一個value'' 。 Key' 的存在,可能是用於樣式比對或額外附加資訊的需要。最後的結果仍是 list(value'') 是方便與其他 reduce 程式的輸出再做合併。

系統組成

系統使用相當多的工作單元分別消化map和reduce工作。工作單元可以分佈在許多台電腦中,並且工作單元彼此不共享記憶體資料。Map或reduce做完之後,將資料儲存在檔案系統中。只有一種特殊的工作單元稱為master,負責監看所有map和reduce工作單元的活動情況,並負責派遣map或reduce工作。

分散處理:Map和reduce工作單元各別處理自己的一段資料,做完時,將資料儲存在自己所在電腦的檔案系統,並將完成訊息和檔案位置資訊傳給master工作單元。Master工作單元可以再將中繼檔案或結果檔案的位置資訊傳給下一個map或reduce工作單元,指派下一階段的工作。

檔案儲存:檔案從來不整合成一個大檔案,而是以許多小檔案的形式存在許多台電腦中。電腦彼此之間不交換檔案流,節省網路頻寬。

容錯處理:如果有一些工作單元或電腦不活動並且沒有回應,master工作單元將已經指派去那些電腦的工作重新指派給其他工作單元。要重做工作的原因是,不回應的工作單元造成它所在的電腦檔案無法讀取。重做無效的工作最有容錯的保障。

實作案例

Google MapReduce是C/C++寫的。Hadoop是用Java實作的MapReduce平台,從其中擴充出HadoopDB和Hive等資料庫系統。CouchDB是用到MapReduce方法處理索引的文件式資料庫,用Erlang實作。Disco是Nokia開發的開源MapReduce平台,用Erlang實作,使用者必須用Python寫程式。

1. MapReduce, Wikipedia, http://en.wikipedia.org/wiki/MapReduce.
2. Jeffrey Dean and Sanjay Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, Proceedings of 6th Symposium on Operating Systems Design and Implementation, 2004.

Sunday, November 1, 2009

msn機器人應用實例與相關整合應用

社群合作/軟體開發商/廣告行銷公司/學術探討...各行各業需整合/合作,

或是業務搭配...歡迎與我聯繫(sonet.all@gmail.com)



---

我們已有超過100個以上的企業/團體/活動使用 應用實例

---

<<系統整合與應用>>

新竹大學 (校務系統整合)

世新大學 (圖書館系統整合)

元智大學 (圖書館系統整合)

嘉南藥理科技大學 (資管系整合應用)

國立高雄海洋科技大學-電訊工程系 (RFID貴重儀器管理)

高盛理財資訊有限公司 (理財資訊傳遞與管理,與CRM系統結合)

雲林縣消防局 (系統log警示通知系統)

台南縣消防局 (系統log警示通知系統)

花蓮縣消防局 (系統log警示通知系統)

新竹縣消防局 (系統log警示通知系統)

屏東縣消防局 (系統log警示通知系統)

高雄加工出口區管理處 (系統log警示通知系統)





<<行銷與社群合作>>





數位時代

http://bnext.imoo.tw/  

癮科技

http://cool3c.imoo.tw/

我的貼身e管家

http://join.imoo.tw/gov/

瘋狂賣客機器人

http://crazymike.imoo.tw/

2010台灣茗茶、咖啡暨美酒展-展昭國際

http://join.imoo.tw/chanchao/

電丸公仔機器人

http://tgs.imoo.tw/index.php

熊貓機器人

http://panda.imoo.tw/

3BEST的3寶機器人

http://blog.imoo.tw/?p=1262

重灌狂人MSN機器人

http://briian.imoo.tw/

極品專賣MSN機器人

http://join.imoo.tw/expro/

MSN天氣達人

http://www.tenki.tw/itenki/download/other.php

遊戲基地 MSN機器人

http://www.gamebase.com.tw/event/event_20100607_MSN/index.php

ezfly 行銷合作案

http://ezfly.imoo.tw

麗星郵輪 行銷合作案

http://starcruises.imoo.tw/page03.html

華納威秀MSN機器人

http://vieshow.imoo.tw/

狀態廣告

http://statusad.tw





---

msn機器人本身可以在 linux/win32 下運作,可廣泛支援大多數語言

(asp/asp.net/c#/java/perl/ruby/python/php/vb6/vb.net

...),本身提供soap/cgi/ado 介面操外部系統連接,互動選單可直接

支援一般web 程式

RFID 採用情況調查 (2009年度發表)

澳洲 Wollongong 大學研究人員在2009年下半發表了一篇調查報告,指出 RFID 方案採用及投資群的偏好項目。(見1.) 他們就 130 份 RFID 期刊的讀者做調查,客群包括批發商、零售商、通信、服務、通訊、製造、財務保險、採礦、行政與國防。有 39% 小企業 (20人以下) 、21% 中型企業 (20人到200人) 和 40% 大企業 (200人以上) 。從調查的 21 項目中,最廣為據以投資的項目是:
  1. RFID的採用改善資料品質、可信度和及時性。
  2. 高層管理者的贊助,提供投資的可能。
  3. 改善供需的結盟。
較不影響RFID採用決策的是:
  1. 威脅隱私。
  2. 威脅到安全方面。
  3. 工程標準模糊不定。
調查結果顯示,對方案採納人來說,主要的認知是採納RFID方案獲得策略優勢。而對於未採納者,主要的認知是採用成本及連帶成本過高。

1. SF Wamba, B Keating, T Coltman, K Michael, RFID Adoption Issues: Analysis of Organizational Benefits and Risks, working paper series.

最早的對話系統 Eliza

Eliza 是人工智慧領域很有名並很出色的對話程式,模擬心理醫生與人對話。對話的例子像這樣(http://tadhg.com/wp/1997/12/31/a-dialogue-with-eliza/)或那樣(http://osiris.sunderland.ac.uk/cbowww/AI/AI/eliza.html)。Eliza 被一般自然語言處理的教科書當做最基本的例子,因為它沒有建立完整的句子結構、也沒有資料庫更新、更沒有機器學習,卻能夠處理與人對話的工作。它怎麼做到呢?

Natural Language Understanding (見1.) 1.3 節 (第7頁) 指出,Eliza 內建關鍵詞資料庫,每一筆記錄以 keyword, rank, pattern, outputs 等欄位分別表示:輸入句中存在哪個關鍵詞,順序等級,句子符合的樣式,以及應該輸出的對話。例如: (alike, 10, ?X, In what way?), (alike, 10, ?X, What resemblance do you see?), (are, 3, ?X are you ?Y, Would you prefer it if I weren't ?Y?), (are, 3, ?X are ?Y, What if they were not ?Y) ...... 問號開頭的符號 ?X 和 ?Y 是變數。

對話處理方式是先比較輸入的句子符合資料庫哪些筆記錄的樣式,找到相對的關鍵詞。如果關鍵詞很多,就挑選一個順序等級最大的。以挑選的記錄,使用它指定的輸出句子當做回答句。接著,處理下一輸入句。

Eliza 系統成功的意義,或許是,電腦系統可以不懂人輸入的句子是什麼意思、也可以不關心人輸入句子表達的重點,卻只要在人輸入句子時即時運用自己現有的對話知識,用另一個句子回答人。而回答的句子恰好能引發人的對話思考。人類也像 Eliza 一樣,自己懂得什麼,才能夠答什麼。Eliza 系統的優點是很容易實作,人們不必充份懂語言學,就能建立一套聰明的對話系統。

1. James Allen, Natural Language Understanding, The Benjamin/Cummings, 1995.

Monday, October 26, 2009

微程式「MSN機器人」成為校園安全守門員

全球安防科技網報導:微程式「MSN機器人」成為校園安全守門員


微程式資訊提供國立新竹教育大學「MSN機器人」系統,協助校園安全維護。
國立新竹教育大學在「98年校務資訊系統經驗交流研討會」中,展示校務資訊系統與MSN機器人的整合成果,運用最普遍的即時互動工具MSN,主動發佈學生個人或校務相關資訊,讓校園大小資訊情報不漏接,達到即時的校園安全防護。

學生可透過MSN即時查詢各項教學或校務相關資訊,包括選課、就學貸款、社團公告。
教職員可透過MSN即時查詢、傳送、接收各項公告資訊,以及校務資訊系統異常通知。
學校可整合RFID門禁應用、貴重儀器等資訊系統,透過MSN達成即時資訊的雙向傳遞。

Sunday, October 11, 2009

易飛網與imoo msn機器人行銷合作

10/12-10/16,ezfly易飛網歡慶十週年!百萬旅遊商品,天天10元瘋狂賣唷
;只要在活動期間,跟著小咩妹改MSN暱稱,持續三天者,就有機會抽中
『花蓮。理想大地 豪華雙人房住宿券唷』http://ezfly.imoo.tw

Wednesday, October 7, 2009

麗星郵輪與imoo msn機器人合作

麗星郵輪與imoo msn機器人合作
http://starcruises.imoo.tw/page03.html

MSN機器人應用實例

msn機器人的應用例子;供各位參考,目前imoo msn機器人應用的層面廣泛,在校園/企業/行銷廣告...領域都已有應用實例,如有需求可洽 (sonet.all@gmail.com)


<<2010台中/高雄 春季電腦展>>
http://c5.tca.org.tw/index.php?doc=msn
<<大老巷護康科技合作案>>
http://www.b-o-lane.com/new/index.php
<<三立電視超級偶像合作案>>
http://beta.iset.com.tw/event/superidol4MSN
<<台北國際電玩展合作案>>
http://tgs.tca.org.tw/news1.php?lang=t&id=504
<<雷爵網路科技股份有限公司-萬王之王 合作案>>
http://kok3.lager.com.tw/event/msn0912_kokpage
<<ezfly 行銷合作案>>
http://ezfly.imoo.tw
<<麗星郵輪 行銷合作案>>
http://starcruises.imoo.tw/page03.html
<<三立電視行銷合作>>
http://beta.iset.com.tw/event/ricecooker/index.html
<<北藝大關渡藝術節行銷合作>>
http://kdarts.tnua.edu.tw/festival/about.html
<<新竹大學與校務系統整合>>
http://microprogram.blogspot.com/2009/09/98_25.html
<<巴布微網誌>>
http://buboo.tw
<<狀態廣告>>
http://statusad.tw
http://www.nownews.com:80/2009/01/06/339-2390950.htm
http://tgs.tca.org.tw/msn.htm
http://tw.news.yahoo.com/article/url/d/a/081007/35/178r1.html
http://yblog.org/archive/index.php/9296
...

msn機器人可以應用的情境如下
---------------------------------------------------------------------
1.資訊服務業:
資訊設備狀態通知 透過MSN機器人提供客戶各項資訊查詢服務 提供系統故障通知 簡易故障排除 查詢/訂閱設備狀態 門禁系統整合 ERP/CRM...等等。
2.金融業:
透過MSN機器人提供客戶查詢 成交回報、最新盈虧狀況、股票庫存狀況、持股股東會通知、持股除權除息狀況、最新優惠活動訊息、公告訊息、線上客服、市調與服務滿意度調查……….等等。
3.餐旅業:
透過MSN機器人提供客戶 總分店查詢、查詢餐飲目錄、線上訂餐、最新優惠活動訊息公告訊息、線上客服、市調與服務滿意度調查……….等等。
4.文化事業:
透過MSN機器人提供客戶 雜誌/書目查詢、書簡介、熱門書排行、線上購書、購書寄送流程查詢、最新優惠活動訊息、公告訊息、市調與服務滿意度調查……….等等。
5.校園內應用
資訊設備狀態通知 圖書館借還書新書通知 學生/教職員出缺勤通知 學校公告資訊 選課通知 mail來信通知 臨時停課通知 利用msn/yahoo即時通查詢 缺曠課記錄 選課資訊 成績單查詢 電子報綱要
...

Tuesday, October 6, 2009

檔案保安方法

Lee T.Y.副教授在2009年發表一篇文章稱為 Processing Secret File in Computer Systems ,即將發表於當年度的全國計算機會議。他鑑於至今的資訊安全方法全數仰賴於雜湊算數和密鑰系統的能力,認為太薄弱,因此發表一種獨到的方法。簡述如下。

拿到一個檔案,要將檔案透過一些處理方法,儲存在電腦中。經由這些處理,希望使檔案的儲存帶有保祕性和資料的完整性。儲存檔案的處理步驟依序為:

  1. 根據一個數LC,將每個位數數字加總得到另一個數字NC,將檔案分割為為NC份,檔案長度不足NC倍數則在尾端填塞一些虛資料。對這NC份檔案分塊,每一塊尾端都填塞固定長度的虛資料。如此,結果得到一份實、虛交錯的檔案。
  2. 根據一個數NB,將前一步的結果分為NB份檔案分塊。再根據另外二個數LRB和RRB,將每個檔案分塊依序左旋LRB個bytes或右旋RRB個bytes。如此,結果得到一份實、虛交錯又區塊位元組旋轉的檔案。
  3. 根據一串數列LST (數列長為LLST) ,將前一步的結果依序將每個bytes按照LST的數字左旋幾個bits。當LST數字用完時,再從LST的第一個數字開始使用。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits的檔案。
  4. 根據一個數FC,以FC為代碼,不同的代碼對應不同NB, LRB, RRB和LST數列的順序。然後將FC, LLST和{NB, LRB, RRB, LST}等等資料排列成一個表,準備塞進最後的檔案。這個表格稱為EDT。
  5. 根據FC,如果FC是複數,則將前前一步的結果檔案逆向排列。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits,並且可能又逆向排列的檔案。
  6. 令前一步的結果檔案長度稱為LF。根據LF和LC,求檔案中一個可插入表格EDT的位置點,稱為LP。LP的計算式約略是LC對LF取模數 (LC mod LF)。然後,將EDT插入LP位置。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits,並且可能又逆向排列,之後插入了所有編碼參數的檔案。

經過以上複雜到極點的步驟,得到的檔案是一個經過編碼、並且本身攜帶著重要參數的檔案。據說,如此經過三個層次以上簡單檔案命令操作的這麼一個檔案,能保障相當好的檔案安全。而LC數字是編碼和解碼過程都要知道的一個參數,另外提交給資料庫,由帳號密碼權限控管。

解碼的步驟,是將以上編碼步驟依反序一一撰寫反函數程式。

這樣的方法顯然有二大問題:

  1. 本方法顯露一項矛盾是:計算LP值是用LC對未插入EDT表的檔案長度LF取模數。令EDT表的長度為LE,最後的檔案長度已經改變為LF+LE了。解碼程式只知道LC和LF+LE,卻不知道LF和LE分別是多少。因此,求LP值的公式缺乏了足夠的資訊。對於精通協定設計的專家們,設計這種根據某些參數計算正確LP值的公式並不困難。然而,目前本方法的發表人並沒有在此細節上詳細說明太多。
  2. 本方法固然是個好概念,然而,在資訊安全領域所講的保安方法通常是藉由隱藏關鍵數字 (key) 來達到保障的效果,而不是藉由複雜的程式過程。




我撰寫本文、提出這個方法的目的,是希望展示出在學術界,非深入此領域的人可能會將問題看得太簡單,因此也將解決辦法的設計太簡單或是有錯。而雖然這個方法可能在學術領域講得很簡單、並且在產業界也可能偷偷使用這種比較普通的方式做資訊安全,但其實做出來的結果卻不夠好 (方法複雜卻容易破解,並且協定的關鍵數值沒有設計好) ---雖然很多人只求足夠的結果即可。

Monday, September 28, 2009

未經證實的小道消息--imoo msn機器人與plurk機器人 進行策略聯盟

imoo msn機器人與某知名plurk 機器人正在洽談策略聯盟細節,未來imoo團隊;除了msn機器人行銷 msn機器套件 的業務以外會跨足plurk 網路行銷的市場,不過;現階段在未得到對方授權公佈合作細節前 無法透漏太多的資訊,但可以肯定的是,這讓imoo 的觸角變得更為寬廣,我們將是市場上首次結合 msn gtalk plurk facebook...相關工具的團隊,同時也歡迎相關領域的技術團隊與我們直接洽談合作事宜 (service@imoo.tw)

近期會有針對plurk 機器人相關應用的簡介給大家參考,請拭目以待

Thursday, September 24, 2009

連繫真實與虛擬世界的RFID應用

德國ETH Zurich技術大學有一組人設計了稱為Deja vu的系統,做RFID複雜事件處理的中介平台,並借用三維模型虛擬世界Second Life環境做使用者介面,展示出連繫真實與虛擬世界的應用範例。

Deja vu系統強調能處理即時訊息的能力,於是以查詢基礎架構──如下圖──為中心,著重查詢語言的樣式比對能力,偵測特定的事件組合。以MySQL為基本平台,將查詢處理程式擴充,使能對表格的資料列做樣式比對。

他們又在Second Life建立了客製模組,在獨立的小島上的SmartRF Lib,是虛擬的RFID系統環境。其中定義了圖書館RFID環境,在每一本書上貼了標籤,並在重要地點如書架、流通櫃台、出口等等,設置了讀寫機。Second Life的SmartRF Lib圖書館環境對應到真實圖書館環境,在真正圖書館出入的人,在Second Life有替身人物做代表。圖書館發生書籍取出、借出、或是竊取的行為,都反應在Second Life虛擬環境中。如果有一本書由書架取出、並離開圖書館出口,卻沒有在流通櫃台登記,在出口位置會顯示紅色亮點訊號代表竊取事件。從真正圖書館取得的RFID資料,透過Deja Vu查詢,反應到Second Life虛擬環境。

相關文獻
[1] Nihal Dindar at el., Event Processing Support for Cross-Reality Environments, Pervasive Computing, vol. 8, issue 3, pp.34-41, 2009.
[2] ____________, Deja Vu: Declarative Pattern Matching over Live and Archived Streams of Events, Proceedings of the 35th ACM SIGMOD Conference, pp. 1023-1026, 2009.

Sunday, September 20, 2009

MSN機器人在校園e化整合的應用展示

文化大學所舉辦的"校務資訊系統經驗交流"研討會,新竹教育大學將展示校務系統與msn機器人的整合,有興趣可前往參與


承辦單位:中國文化大學
會議日期:2009年9月24日(星期四)、2009年9月25日(星期五)
會議地點:中國文化大學體育館8樓柏英廳〈臺北市11114陽明山華岡路55號體育館〉

詳細相關資訊請參考會議議程網頁。
http://eshare.moe.edu.tw

Wednesday, September 9, 2009

Monday, August 31, 2009

Adwords 上的 MSN機器人 廣告

如果您是從google的廣告注意我們,進而連接到此;您可以再連接到 http://www.imoo.tw 那裡有更多關於msn機器人的應用案例,如果您對技術感興趣;這裡提供技術相關諮詢以及相關文章

各程式語言使用msnsdk範例請自行參考相關文章, 計有 c# java jsp vb asp php perl ...相關範例可供參考


MSN機器人行銷服務說明
平台測試申請流程
MSNSDK文件下載

ps.如欲 為文 介紹msn機器人程式撰寫相關...事宜,可洽 sonet.all@gmail.com , 我們會開免費的測試帳號供您使用

Thursday, August 13, 2009

謠言中的謠言--MSN掛上小太陽


快用掉小太陽 那是駭客發布的假消息
http://www.babyhome.com.tw/mboard.php?op=d&sID=2587611&bid=885&r=0&page=1

是這樣嗎?

我們家的MSN機器人一直以來都是掛小太陽阿~~會被HACKER攻擊嗎? 那我 更想試看看是怎麼被攻擊法?


當JSP遇到imoo msn機器人


<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>

其他語言(asp/vb/c#/php/java/perl)請參考站內其他文章,完整開發文件下載(msnSDK訊息控制開發套件)


<%@ page language="java" contentType="text/html;charset=Big5" %>

<%
String UserName = "msnsdkt0";
String Password = "msnsdkt0";
//取得SPID
String strRet = GETSPID(UserName,Password);
String[]tmp = strRet.split("1\t");
String strValue = tmp[1].replace('\n',' ').trim();

String SPID =strValue;
out.println("SPID:" + SPID +"
" );
//註冊聯絡人
String Email = "sonet.all@gmail.com"; //填入msn/yahoo聯絡人,勿使用這個預設值
String ret = Register(Email,SPID);
out.println("註冊聯絡人:" + ret + "
");
//發訊息
String strMsg = "Hello_World!"; //輸入訊息 (未做 Url EnCoded)
String MsgRet = SendMsg(Email,strMsg,SPID);
out.println("傳送訊息:" + MsgRet + "
");
%>


<%!
//取得SPID
public static String GETSPID(String UserName,String Password) throws Exception {
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=GETSPID&USERID=" + UserName + "&PASSWD=" + Password;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}

//註冊
public static String Register(String UIDS,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue = "?FUNC=REGISTER&UIDS=" + UIDS + "&SESSION="+ SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;

}

//傳送MSN 訊息
public static String SendMsg(String UIDS,String MSG,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=SENDMSG&UIDS=" + UIDS + "&MSG=" + MSG +"&Encoding=BIG5&flag=0&Session=" + SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);

String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}
%>

Tuesday, August 11, 2009

即時通訊機器人 最立即有效的行銷工具

http://www.bnext.com.tw/LocalityView_8293

推活動、養社群,比企業官網更靠近消費者
你的電腦開機上網時,第一個開啟的應用程式是哪一個?它可能是比瀏覽器還要早開啟、設定為自動登入的即時通訊軟體,高人氣與高黏性,成為潛力十足的行銷平台。其中不用睡覺、永遠在線的「機器人」,更是企業的最佳行銷專員。

即時通訊(instant messaging)在台灣到底有多普及?根據ARO創市際市場研究指出,台灣使用微軟Windows Live Messenger(俗稱MSN)的交談人數,約在五百五十萬至七百萬之間,使用雅虎即時通的交談人數,則在三百五十萬至四百五十萬之間。兩大平台的使用者,每月平均通訊時間都超過四百分鐘。如此高人氣、高黏性的平台,已被諸多腦筋動得快的企業選中,成為新興的行銷管道。

企業行銷若是將行銷人員移駕到即時通訊平台,人力成本似乎不小,但若它是一個會自動回覆訊息的機器人呢?它將可以幫助企業二十四小時在線回應網友、推廣活動、發布動員令。因此今年起,多個企業機器人如雨後春筍般現身,如統一超商Open小將、威秀影城、IPSA美肌小茵、華研音樂等十多家企業開始應用,搶占網友的連絡人清單。 即時通訊機器人行銷,說穿了就是一種社群行銷,最重要的關鍵在「用什麼凝聚社群」,社群養成之後,才能提供變現或是口碑宣傳的可能。

目前各家機器人用以凝聚社群的方法,可分成三大類:宣傳型、功能型、聊天型。其中最常見的是宣傳型,機器人主動傳送促銷資訊,帶動人氣與話題。 例如三月底遊戲橘子首度將機器人導入新遊戲《王者世界》的宣傳,上線以來,每周都有活動保持社群熱度。遊戲橘子行銷部經理胡民雄指出:「機器人所帶動的改暱稱活動,確實在遊戲上市初期將知名度打開。」目前已有三成遊戲玩家,將機器人加入即時通訊名單。

至於功能型機器人,主要是用「提供查詢」來吸引網友加入,適合提供大眾服務的企業使用,例如火車時刻、電影場次、貨運進度、即時股價等。協助開發威秀影城機器人軟體的imoo創辦人楊志遠表示,因為消費者對企業服務的需求是穩定的,所以功能查詢將吸引網友持續使用,培養出依賴性與忠誠度。 最複雜的聊天型機器人,目前僅統一超商的Open小將使用。別小看這隻會喊「Open,你好呀」的宇宙犬,機器人上線六個月就已突破十萬個朋友!負擔起統一超商企業形象的Open小將,目前並不會發送門市促銷資訊。它是以Open小將設定的可愛性格,吸引網友與它聊天,讓虛構角色的好感度加分,並且更加真實。
行銷鎖定核心愛好者

統一超商目前將機器人定位為Open小將與消費者聯繫的頻道,定期與粉絲溝通,如祝賀母親節快樂,或是推出與商品無關的小遊戲、小故事。統一超商整合行銷部經理陳飛龍指出:「不要在促銷或是賣東西的時候才出現,平常就要溝通,社群才會穩固。而聊天機器人最難的是,幫它設定講話個性。」

以目標族群來看,統一超商、遊戲橘子都表示,機器人主要經營的是「核心愛好者」。這類忠誠度很高的消費族群,對行銷活動的反應多半是正面且積極的,透過即時通訊溝通,其方便性將能加速散播。而且他們傳遞的對象將是自己的朋友,口碑傳播威力一向有加乘效果。由最紮實、最核心的族群出發,將會引爆最大範圍的潛在客群。

每個管道的行銷關鍵,永遠是擊中目標客群與新鮮感,因此企業經營機器人最大的挑戰,仍是必須發想推陳出新的活動點子,經由機器人傳遞給網友,否則機器人的壽命將會非常短暫,那就可惜了這隻機器人,每天二十四小時辛勤工作,所找到的核心愛好者了。


更多精采文章請見8月1日出刊《數位時代》,全省書店及便利超商熱賣中!


http://www.imoo.tw

Monday, August 10, 2009

MSN機器人獻身公益

即時通訊機器人響應公益! imoo 即日起提供公益團體免費申請服務

互動優勢有限公司跨足IM(Instant Messaging)網路服務及廣告市場,於今年推出『imoo』,提供IM 機器人網路服務,結合眾多IM平台服務(如:MSN、Yahoo即時通及Google Talk),即日起免費提供各界公益團體及非營利性組織申請使用,用IM達到公益活動通知、募款宣傳、社群經營的IM整合行銷服務。

簡單、好用、互動式操作介面

IM 為目前市面上使用率最高的電腦應用程式,imoo團隊所開發的IM 機器人將利用其快速傳遞訊息、會員人氣及黏度極高的特性,提供廣告、行銷活動訊息或產品訊息傳遞、曝光服務。

透過簡單便利的申請及設定,就能即時上線提供客製化服務,讓公益團體及非營利性組織的會員收到最新消息後,立即觀看IM所傳遞的文字、圖片訊息及點閱網址瀏覽更多活動情報。此外也能搭配更換IM的顯示大頭貼圖示、表情小圖、暱稱及狀態列,達到活動宣傳之綜效。即使沒有專業的網路工程師,透過簡單的表單申請、審核流程,一樣可建立起專屬的IM 機器人

另外,如果公益團體及非營利性組織擁有會員名單,也可透過服務平台,邀請會員將機器人加入為聯絡人,就能定期、即時接收到最新的訊息。

IM機器人服務應用廣泛 以人拉人最吸睛
imoo 的IM機器人服務,提供完整API串接介面,能快速整合會員資訊系統,發送訊息、雙向互動。此外,imoo 也提供後台查詢介面,能記錄分析機器人的用戶數、使用人次、互動時間、互動內容、使用頻率、內容曝光量、點擊率等等數據以利評估成效、後續Data Minig(資料探勘)、分析網友使用行為,進而調整、優化自身服務並迅速回饋市場。

由於IM 服務廣泛被網友們使用,若能搭配行銷活動的舉辦,必能達到快速大量口碑宣傳之效益。舉凡最新活動訊息傳遞及查詢、更改暱稱進行響應活動大串聯、會員專屬聊天室、市場調查、互動遊戲、機器人客服、查詢會員資料(如:紅利積點)、會員留言、優惠活動查詢、線上訂購、發佈動員令皆能透過IM機器人提供專屬客製化服務,24小時不間斷,全天候服務會員,提供貼心線上服務。







毋須廣告費立即申請,立即提升活動宣傳效益
目前企業普遍藉由發送電子報/EDM或手機簡訊傳遞活動訊息,但因電子報/EDM近年來過於氾濫發送,導致閱讀意願、開信率、點擊率不高;而發送簡訊又礙於行銷成本考量,故提高行銷活動參與度一直是相當大的挑戰。網路業者已經開始重視且投入IM服務及廣告市場,提供企業專屬IM機器人服務,然而企業等級的服務收費以及行銷、技術人力需求,對於公益團體及非營利性組織來說往往門檻太高,無法享受IM機器人服務所帶來的便利性。

imoo 的IM機器人服務平台樂於推廣IM機器人給廣泛大眾使用,即時起推出免費體驗活動,僅提供公益團體及非營利性組織申請,歡迎各界公益團體及非營利性組織,至imoo官網(http://www.imoo.tw/)申請體驗。(名額有限,欲申請從速!)

# # # # # #
如有進一步廣告與專案需求,請來信洽詢:
Email : service@imoo.tw

Sunday, August 9, 2009

明天要上架的imoo msn機器人 AdWords廣告詞

您所提供的服務無懈可擊
---
只是使用簡訊/Mail通知客戶,無法精確
即時傳遞資訊,這時您需要MSN機器人

明天下午2:30的網路特賣會
---
手機簡訊與網路的距離太遠無法準確
達成行銷目的時,您更需要MSN機器人
明天下午2:30的網路特賣會
---
當電子郵件通知無法掌握客戶即時得到
資訊狀況時,您更需要MSN機器人的協助
MSN機器人在校園的應用
---
借還書通知 / 出缺勤通知 / 聯繫校友
查詢選課資訊 / 成績資訊 / 招生宣傳
別讓行銷成為一種騷擾
---
MSN狀態廣告,創造一個不經意的邂逅
MSN機器人從互動中,緊抓住你的客戶
別"再"行銷過程中留下遺憾
---
MSN機器人從互動中,創造一個不經意的
邂逅,緊緊抓住客戶,不留下垃圾與困擾


Thursday, July 9, 2009

分散式系統的複雜事件處理

David C. Luckham 和 Brian Frasca 在 1998 年 Complex Event Processing in Distributed Systems 文章中提出在分散式系統處理複雜事件的方法。分散式系統意味了在許多機器之間有大量的訊息交換。而複雜事件意味了在許多基礎事件之上,要藉由許多額外的知識才能取得的高層次事件,或是抽象事件。

基本層次的訊息、事件系統存在著一些問題。第一是要由網路上許多線路來偵測事件的發生;第二是代表事件發生的訊息量非常大;第三是為了製作事件的產生與偵測,通常在建立系統時將事件模型固定在系統中,使事件的偵測與使用變得比較不彈性。而系統中許多事件的發生可能造成系統的卡死或「當機」;無法準確判斷系統事件的類型,是大問題。為了處理這些問題,他們使用多層次事件觀點來處理事件的抽象化。基本上是將系統的活動分解再分解。

系統事件的層次分解,以生產線為例,可分為下層是通訊層、以及上層是工作流層。通訊層處理基本的通訊工作,包括廣播訊息、分派訊息、接收訊息、控制訊息等等。而生產線工作流層次,則需要若干事件有:產生大量訊息、載入大量訊息、消化大量訊息等等。「載入大量訊息」是一項虛擬事件,是由廣播訊息、分派訊息、接收訊息、和接受訊息等基礎事件組合成的。

在以訊息為本的分散式系統中,對於大量訊息,需要有過濾和映射的功能。過濾是指從儲存的事件中找到符合某個複雜事件組合樣式的一組事件。映射是指把一組事件當做輸入而產生另一些事件當做結果。於是,系統的抽象事件階層由下往上有下列構成:
  1. 分散式系統軟硬體裝置。
  2. 基本事件層。
  3. 過濾事件層:從基本事件層或過濾事件層,取出符合複雜事件樣式的抽象事件。
  4. 映射事件層:從過濾事件層取出符合複雜事件樣式的抽象事件。
實作上需要處理一些項目:
  1. 因果事件。
  2. 事件過濾和映射的演算法。
  3. 由抽象層反推,解決基本層發生的錯誤。
他們的實作,用有向圖表達事件的因果網路,以各種事件為節點、而因果關係為箭頭線。我個人感覺,本文談當事件的過濾和映射處理方面,相當有 partial evaluation 的概念,或許相當適合以函數式語言實作。

Tuesday, July 7, 2009

用 RFID 建立物際網路

曾有物品放在某處忘了帶走的經驗嗎?如果在物品和你身上貼了 RFID 標籤,在你離開大樓時, RFID 網路會傳送 SMS 訊息提醒你有物品忘了帶走。 Evan Welbourne 等人 2009 年在 Building the Internet of Things Using RFID: The RFID Ecosystem Experience 文章,介紹他們已經在校園實作的 RFID 環境和根據 RFID 事件為基礎的應用服務。

環境

在華盛頓大學電機學院建物區域中,他們在門和走廊安裝了 44 個讀寫機。並提供 RFID kiosk 服務站,徵請自願者自行取用 RFID 標籤,貼在他們的物件上;而且讓這些自願者在穿著上貼了 RFID 標籤。

他們的系統著重在,將讀寫機讀取的低層次訊息轉換為高層次有意義的資訊。讀寫機直接讀到的訊息不外乎 (tag ID, antenna ID, time) 這一組資料。但人們需要的資訊是,哪一批低層次的資料可以有個合理及有意義的解釋。他們開發了三種工具來協助轉換低層次資料。 Tag Manager 提供使用者將標籤和貼附標籤的物件的對應關係編寫到系統中。 Place Manager 提供使用者為每一支天線命名,指派為有意義的地名。 Scenic Event Editor 提供使用者指定要從低層次資料抽取出的高層次資訊;使用到一種劇本式圖型語言。

他們又開發了 Physical Access Control ,讓使用者能調整標籤讀取的方針,藉以供安全和隱私的控制。

應用服務

由以上的環境架構,他們能夠實作多種 RFID-based 應用程式。 Search Engine for Things 藉由查詢一件物品最近的讀取記錄,找到物品的位置。 Rfidder 提供社交應用程式的功能,將即時更新的人地資訊加到社交網路中,並與 Twitter 連繫。 Personal Trends 提供使用者瀏覽他的物品使用趨勢:例如,哪些時候多帶著安全帽進辦公室,表示他騎車上班的次數多瀕繁。 Event-Based Desktop Search 是在 Google Desktop Search 中做的外掛程式,根據 RFID 事件紀錄查尋物品或地點:例如,可查詢上次和某一位人士會面的地點。

未處理問題

建立物際網路,意味了會大量讀取許多 RFID 事件,對系統承載力有所負擔。接下來面臨的問題是,要如何解決事件讀取的密度。另一個問題是要解決 RFID 事件的低讀取率。

相關文章

Cascadia: A System for Specifying, Detecting, and Managing RFID Events

Monday, July 6, 2009

如何在一台機器同時開啟兩個以上的msnv9.0

修改Windows的登錄碼
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Live\Messenger
如果沒有 MultipleInstances,可自行新增一個,MultipleInstances 將 數值資料(DWORD 32-位元)改為1

Friday, July 3, 2009

事件處理詞表

David C. Luckham 在 Complex Event Processing 社群網站發佈一份按照邏輯順序編排的事件處理詞表。許多有關 event processing 的研究,例如, Hu等人於 2008 年 Complex Event Processing in RFID Middleware: A Three Layer Perspective 文章,用語大都參考這一份詞表。

摘錄

事件:任何已發生或打算要發生的事。

事件物件:用來表達事件的結構:例如訂單是事件物件,用來表達訂購事件。

虛擬事件:未實際發生,但需要用來象徵實際事件的事件;多半來自想像或模擬。

事件類型:事件物件的種類。

事件時間:屬於事件的時間值。

時間間隔:由二個事件時間所限定的一段時間;二個事件時間是指時間間隔的開始時間和結束時間。

即時事件:事件的時間間隔小於單位時間;也就是說,事件的開始時間和結束時間是同一個。

抽象事件:用來為一組事件做摘要、做註解的事件。

複雜事件:是一個抽象事件,所摘要、解釋的事件對象是它的成員。

衍生事件:被產生而做為一項結果,要再對其他事件做處理,的事件。

複合事件:是複雜事件,也是衍生事件,是用到如事件的分離、結合、順序等等運算方法將基本事件結合而成的事件。複合事件自然包含了從所衍生的基本事件。

Thursday, July 2, 2009

RFID中介軟體如何處理複雜的事件?

Hu等人於 2008 年 Complex Event Processing in RFID Middleware: A Three Layer Perspective 文章裏提到:現在已經有一些中介軟體處理 RFID 事件的過濾和匯總等功能,例如有 BEA 、 Sun 、 Singularity 和 Logicalloy 等公司的產品;不過,作者們注意到 EPCglobal Network 的架構,在 Application Level Events 和 EPC Information Service 之間有一個叫做 EPC Capture Application 的層次。他們說,在 EPC Capture Application 層次, RFID 中介軟體應該運作一些複雜的功能,為了處理特定的商務流程而處理較複雜的 RFID 事件。

架構分為三個層次,由下層到上層依序為:
  1. 邏輯結構: RFID 事件源自讀寫機探測到的基本事件,而複雜的事件是由一些基本事件組成,或者,複雜事件也可以由另外一些複雜事件組成。
  2. 時間限制:在複雜事件結構中,可以加上時間限制的屬性。
  3. 事件偵測:應用前二層的產物,藉由複雜事件分析,向上回報究竟發生了哪些事件類型。

這篇文章對事件結構做了初步的正規描述,並使用 Petri Net 為處理工具。對第一層,邏輯結構方面,使用 Petri Net 延伸的模型 Composite Event Structure-layer Net 。對時間限制層面,使用 structured token and transition mark 處理。對事件偵測層面,使用 Petri Net 著色方法處理;但是本文尚未討論到 Petri Net 著色方法的細節。

邏輯結構

每一個基本事件,按照 EPCglobal 的說法,是讀寫機探測並回報在什麼時候「看見」了哪個 tag 。用大寫字母 A, B, ... 表示每一個基本事件的類型。於是,用到以下六項運算,可以處理許多基本事件之間的各種基本邏輯關係:
  1. 彙總: (A, n) 表示進來 n 個 A 事件。
  2. 分離: (A | B) 表示進來的事件是 A 或 B 。
  3. 結合: (A & B) 表示 A 和 B 二事件都進來。
  4. 否定: (~ A) 表示 A 事件沒有進來。
  5. 順序: (A; B, t) 表示依序有 A 和 B 二事件,而且二事件的間距在 t 時間區段之內。
  6. 內在: Within(A, t) 表示 A 事件在 t 時間區間之內進來。

事件的間距定義是,對事件 e 有一對參數 [Start e, End e] ,表示事件發生的時間和結束的時間。事件 e 自己發生的時間長度是 (Start e - End e) 。二事件 A, B 有 (A; B, t) 順序,代表:
(A & B) [0 < Start A - End B < t]
即為 A, B 二事件除了同時發生之外,加上 A, B 的時間有些差距。

而事件 A 在 t 時間之內發生, Within(A, t) ,可以改寫成:
(A, 1)[Start A - End A > t]
(註:以上二式都是文章中的原文照列,不過看起來有一些矛盾的疑問。)
即為發生了一件 A 事件,並且此事件持續了有 t 時間區段那麼久。

所以,事件的順序關係是結合關係的特例,而內在關係是彙總關係的特例。

以上所指六項運算符號,扣除二項特例,可以有四種 Petri Net 圖型表達彙總、分離、結合、以及否定等關係。

時間限制

對一個事件 e ,將它對應事件類型的集合表示為 S e 。則加上時間限制的結構是一個三元詞組 (Start e, End e, S e) :例如,進來一個事件 (epc, r, t) ,則做出一個 token 為 (t, t, {(epc, r, t)}) 。
(註:此例中 (epc, r, t) 也有些疑問,在此也暫以原文照列。)
做成這樣的 token 是為了使 Petri Net 中 Guard 位置計算比較方便。

其他人的相關作品

Siemens RFID 中介軟體使用宣告式的語言,可撰寫規則,用到邏輯和時間限制的運算語法。事件偵測以圖論為基礎。

SAMOS 以 Colored Petri Net 做事件偵測的機制。

Esper 是一件開源軟體,處理複雜事件和事件串流的架構。用到類似 SQL 的語言表達複雜事件,並使用自動狀態機做事件偵測。

Wednesday, July 1, 2009

ALE 相容資料處理

為了跟隨 EPCglobal 組織制定的 Application Level Event 標準, Byun 等人在 Data Stream Processing Based on ALE-Compliant RFID Middleware 文章裏提出一項有效的資料處理法。由於每一台讀寫機有不同的製造商及協定,他們將讀寫器歸類、整理在一些 master node 下,先由讀寫器讀到資料並送給 master node ,再讓 master node 將原資料轉換成 EPC 和 URN 。這樣的處理有幾項好處:適合 ALE 的規定,整合各種不同類型的讀寫器,並且不只適用於 RFID 讀寫器、也適用於其他 sensor network 。

例如,感應器分四種類型:
  1. 水量感應器: A 廠製造,感應電導率、水溫、氯含量、酸度和渾度。
  2. 水位感應器: B 廠製造,感應水位。
  3. 水質感應器: C 廠製造,感應瞬時水質、累積水質、瞬間水速、累積時間。
  4. 雷擊感應器: D 廠製造,感應雷擊並產生警訊。

不同的感應器有不同的協定,以水位感應器來說,只有一個水位值;而水質感應器必須提供四個值。對於不同數目的資料,本文以下列資料格式表達資料部份:
開頭記號、全長、 master node 代碼、 sensor 代碼、命令、資料、檢查碼、尾端記號。
假設 master node 代碼是 0x0B , sensor 代碼是 0x02 ,命令是 "send" 、代碼是 43 ,而資料是 10 02 83 84 01 00 01 01 00 00 00 58 6F BD 3F F9 02 15 D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE 8B 10 ,檢查碼是 03 6B ,資料開頭記號是 02 ,尾端記號是 03 ,則合起來的資料為:

02 29 0B 02 43 10 02 83 84 01 00 01 01 00 00 00 58 6F BD 3F F9 02 15 D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE 8B 10 03 6B 03

以上資料是感測器送到 master node 的資料。

Master node 要將由原資料加上標頭,並轉換為 EPC 和 URN ,符合 EPCglobal 的規定。 EPC 標頭欄位基本上是對應於感應器的製造商和機器類型等資訊的數字,假設水位感應器標頭是 36000002 ,水質感應器標頭是 36000003 。 EPC 的資料欄位是從原資料取出資料欄位,例如對水位資料,取出水位欄的值;對水質資料,取出四個欄位的值。

由前例,從水位感應器送來資料為 02 29 0B 02 43 10 02 83 84 01 00 01 01 00 00 00 58 6F BD 3F F9 02 15 D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE 8B 10 03 6B 03 ,加上標頭成為 EPC 是 36 00 00 02 10 02 83 84 01 00 01 01 00 00 00 58 6F BD 3F F9 02 15 D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE 8B 10 。

再使用前例,假設是從水質感應器送來的資料,並且 master node 想要傳送有關第三欄位的資訊。假設第三欄位值是 58 6F BD 3F F9 02 15 D0 ,則應取出第三欄位的值,加上標頭,得 EPC 是 36 00 00 03 58 6F BD 3F F9 02 15 D0 。

水位感應器的 URN 格式為:
urn:sensor:com:waterlevel:[值]
欄位 "com" 是製造商公司。

水質感應器有四個欄位, URN 格式為:
urn:sensor:com:waterflux:[值 1].[值 2].[值 3].[值 4]
用 "." 做間隔,區分各欄位值。

按照前二例,水量感應的 EPC 是 36 00 00 02 10 02 83 84 01 00 01 01 00 00 00 58 6F BD 3F F9 02 15 D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE 8B 10 , URN 是 urn:sensor:b:waterlevel:586FBD3FF90215D0。假設水質感應的 EPC 是 36 00 00 03 20 20 20 20 30 2E 30 20 6D 33 2F 68 20 20 31 34 39 37 35 37 2E 35 32 20 6D 33 20 20 30 2E 30 30 30 20 6D 2F 73 20 37 35 39 33 3A 33 30 00 0 , URN 是 urn:sensor:c:waterflux:20202020302E30206D332F68.20203134393735372E3532206D33.2020302E303030206D2F73.20373539333A3330000 。

Thursday, June 25, 2009

Monday, June 15, 2009

imoo msn機器人測試平台公告

為了提供更即時的測試諮詢服務,imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,改由申請制的方式辦理測試,相關測試申請可直接發信至service@imoo.tw 洽詢

Thursday, June 11, 2009

(翻譯) Erlang 程式設計第七章:並行風格

Joe Armstrong 在 Erlang Programming 書中有一段提到「平行程式設計」 (Concurrent-oriented programming, COP) 的概念。以下翻譯那一段文章,提供許多人即使在用非平行程式設計方式開發平行系統架構時,也可以引用這些概念。



並行風格

人都知道何謂並行 對並行的深入認知,直接連通到我們腦內。我們能極速地對刺激做反射動作,是用到腦的一部份,稱為杏仁體。若少了這樣的反應,我們可能會死。有意識的思考動作太慢。而用到思考「快拉煞車桿」耗掉的時間,我們早就做了那個動作了。

行駛在幹道上的時候,我們心裡會打量十幾輛或百來輛車。這不經過意識思考。如果我們沒本事做到這種事,可能就會死。

世界是平行的 假如我們要寫一些程式,表現如同在真正世界中表現著的其他物件,這些程式會有個並行的組織方式。這是何以我們該用「並行程式語言」來寫程式。

然而我們很常用「循序程式語言」寫真實世界的程式。真是多餘的難。

用我們設計來寫並行應用程式的語言吧!並行程式開發會變得超容易。

Erlang 程式建構我們思考及感興趣的模型 我們不共用記憶。我有我的記憶,你有你的記憶。咱們是兩個腦袋,一人一個。兩個腦袋不會融合成一個。要改變你的記憶,我要對你送訊息,或者說,我要揮揮手。你聽到了,或瞧見了,你的記憶就會改變。不過,如果沒問你問題並看看你的反應,我不知道你有沒有收到我的訊息。

這是有 Erlang 程序的情況該是的樣子。 Erlang 程序沒有共用記憶體,每個程序有自己的記憶體。要改變其他程序的記憶體,你必須送個訊息,期望對方收到並了解訊息。要確定別的程序已經收到你的訊息,並且改變他的記憶體了,你必須問問他 (也送個訊息) 。這完全是我們都怎麼互動的模式。

煦:嗨,比爾,我的電話號碼是 45-67-89-12 。
煦:你聽到了嗎?
比爾:有,你的號碼是 45-67-89-12 。

這些互動模式是我們如此熟悉,從小到大我們都和這世界這樣互動,觀察它,對它送送訊息,然後看看反應。

人們發揮功用,如獨立個體般送訊息做溝通 這是 Erlang 程式做事的辦法,也是人們做事的辦法。所以,很容易學懂一份 Erlang 程式。

一份 Erlang 程式用許多成千或上百千的小程序構成。這些小程序獨立運作。它們彼此送訊息溝通。每個程序有自己的記憶體。它們表現得像一大房間的人群彼此在饒舌交談。

這讓 Erlang 天生就是簡單,容易維護並擴充。假定我們有十個人 (或程序) ,他們要做太多工作。可以怎麼做呢?找更多人來。而我們怎麼管理這些人呢?很簡單,就對他們喊口令 (或叫廣播) 。

Erlang 程序沒有共用記憶體,所以記憶體使用時不需要鎖定。有鎖的地方就有會有鑰匙,而有鑰匙就可能會遺失鑰匙。當你鑰匙掉了會怎麼樣呢?你會驚慌得不知道怎麼辦。在軟體發生的,則是當你丟掉了鑰匙,鎖定就造成錯誤。分散式軟體系統如果有鑰匙和鎖,都會出錯。

而 Erlang 可沒有鎖和鑰匙。

有人死掉,其他人一定會注意到 假如我在一個房間裏突然傾覆而死,有人可能會注意到。 Erlang 程序就像人們,他們有時可能死掉。但不像人們的是,人們死掉會用盡力氣叫出聲,而叫聲與他們的死因有關。

想想滿滿一整房間的人,有人突然倒斃了。像他們死的時候,會叫說「我的心臟──我要死了」或是「我的胃抽搐」。這就是 Erlang 程序所做的。一條程序可能死前說:「我死於除以零。」另一條程序可能說:「我死於向空串列要最後一項串列資料。」

現在在我們滿是人的房間裏,假想有位特定的仁兄,他的任務是清除遺體。假定有珍和尚二人,如果珍死掉,尚會修正對珍的死亡所有的錯誤。如果尚死亡,珍會修定那些錯誤。珍和尚是被無形的契約連成一體,約定若有一方死亡,另一方會修正所有造成其死亡的錯誤。

這就是 Erlang 怎麼處理錯誤偵測的方法。程序可以連成一體。如果一條程序死掉,另一條程序獲得一則錯誤訊息,指出前一條程序為什麼死掉。

基本是這樣。 Erlang 怎麼做事如以上所述。

現在我們學到的東西有:
  1. Erlang 程式由一大堆程序構成。這些程序可以彼此送訊息。
  2. 這些程序可能會接收訊息並瞭解訊息,也可能不會。如果你要知道訊息有沒有收到並解讀,你必須向程序送訊息,並等它回應。
  3. 成對的程序可以被連成一體。如果其中之一死掉,錯誤訊息會送給另一個程序,訊息中包含前一程序為什麼死掉的理由。
這種簡單的程式設計模型,是我稱為「並行程式設計」 (COP, Concurrency-Oriented Programming) 的模型一部份。

下一章我們開始寫並行程式。我們需要學三種基本項: spawnsend (這用到 ! 運算子) 和 receive 。然後寫一點簡單的並行程式。

當程序死掉的時候,如果有其他程序跟它連成一體,其他程序就會注意到。這是第九章的主題,「並行程式的錯誤」。

在你讀下兩章的時候,想著房間裏有一群人。人們是程序。在房間裏的人們有自己私有記憶,這記憶就是程序的狀態。要改變你的記憶,我就跟你講話,而你就聽,這是送訊息和收訊息。我們會有兒女,這是 spawn (生產) 。我們死掉,就是一條程序結束了。

Wednesday, June 10, 2009

ithome blog 與微軟bing搜尋 不合

使用bing 查詢 關鍵字msn機器人時,會出現這些訊息

This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.



Wednesday, June 3, 2009

imoo msn機器人 行銷服務


imoo msn 機器人 行銷服務說明: http://www.imoo.tw/v01.html












imoo 提供2種創新的行銷服務模式



  • imoo提供網站主「msn 機器人」行銷服務: 如果您是網站主人,用心經營網站與會員,一定希望與會員溝通互動更即時更方便,用email?常寄丟、進垃圾信、信太多沒看到!用簡訊? 量大成本高不划算!使用imoo客製msn 機器人,能讓您的會員在每天使用msn的時間就可以用msn與您的網站進行互動;不僅24小時服務不中斷又能有效運用行銷預算;達到精準行銷的效果。另外,imoo也持續開發適用於各種程式語言架站平台的工具套件,方便網站工程師快速導入開發。若您沒有配合的網站工程師,imoo msn 機器人的開放服務套件亦能簡單地應用在大多數的網站。

  • imoo提供廣告主廣告宣傳服務: 人人都有廣告需求,有廣告需求就是「廣告主」,無論是個人型態分類廣告、小本經營買賣生意還是大企業品牌廣告,imoo可以利用目前台灣使用人口約800萬人的msn messenger人際傳播網絡來滿足「廣告主」的各種廣宣需求。

請問有範例可以參考嗎?



  • 當然,為了讓您更加了解如何與imoo產生互動;我們將與您分享以下客戶案例

imoo msn 機器人應用概念圖


Monday, June 1, 2009

imoo msn機器人試用申請

imoo msn機器人試用申請

http://www.imoo.tw/service/register.php

排列函數

排列和組合是很容易處理的問題。但不知道為什麼,在資訊科系學寫程式之後,排列卻變成相當難的問題。難的地方是在像 C 語言的程式步驟和資料型態上,要考慮很多額外的東西,也遇到很多小麻煩。因此,「取一列資料的全部排列情況」變成一項我一直不會寫程式解決的問題。

而使用像 Haskell 這樣的函數程式語言,將過去所學的知識加以翻覆、折疊,重新整理出一條順暢的思考路線。我最近寫出的排列函數如下;再下去,讓我解釋一下函數構成的想法。

allPermu :: (Eq a) => [a] -> [[a]]
allPermu xs = compact rs
where rs = map (map (\x -> xs!!x)) (allPermu' [0..((length xs)-1)])

allPermu' :: (Eq a) => [a] -> [[a]]
allPermu' [] = [[]]
allPermu' xs = concat (map f xs)
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))

compact :: (Eq a) => [a] -> [a]
compact [] = []
compact (x:xs) = if any (x==) xs then compact xs
else x : compact xs


解析

1. allPermu' 函數:取一列資料的全部排列情況

首先,我覺得取一列資料,如 [4, 3, 4, 5] 的全部排列情況,就是先考慮 4, 3, 4, 5 各數字,將原列資料的這個數字拿掉,求剩下的一列資料的全部排列情況,然後將這個數字都擺在全部排列情況的每一項前面。就這個例子來說, 4, 3, 4, 5 分別要做一次這樣的動作。只考慮 3 , 3 要和剩下的 [4, 4, 5] 的全部排列組成。 [4, 4, 5] 的全部排列有 [4, 4, 5], [4, 5, 4], [5, 4, 4] ,讓 3 擺在每一項的前面就產生 [3, 4, 4, 5], [3, 4, 5, 4], [3, 5, 4, 4] 這些。

我先要有一個函數是 f = \x -> map (x:) (allPermu' (filter (x/=) [4, 3, 4, 5]) ,是一個函數名為 f ,接到一個參數叫 x ,就把 [4, 3, 4, 5] 中不等於 x 值的項目取出成一列,用一個取全部排列的函數名叫 allPermu' 求少了 x 的全部排列情況。 (只是 allPermu' 在此還沒講它怎麼寫。) 然後,用 map 函數將 (x:) 套到少了 x 的全部排列的每一項前面。這種想法很簡單,對一列資料的每一項,都先把少了那一項的其他資料做排列,所得到的全部排列情況再把少掉的那一項套在前面。

於是,可以說 allPermu' [1, 2] = map f [1, 2] ,再解開就是

map f [1, 2] = [f 1, f 2] = [map (1:) (allPermu' (filter (1/=) [1, 2])),
map (2:) (allPermu' (filter (2/=) [1, 2]))]
filter (1/=) [1, 2] = [2]
filter (2/=) [1, 2] = [1]
allPermu' (filter (1/=) [1,2]) = allPermu' [2] --這裡細節省略,我們知道 [2] 全部排列就是 [[2]]
allPermu' (filter (2/=) [1,2]) = allPermu' [1] = [[1]]
map f [1, 2] = [ map (1:) [[2]] , map (2:) [[1]] ]
= [ [[1, 2]] , [[2, 1]]]

最候出現答案了,但是資料結構的深度加一層。如果把 allPermu' 函數寫成以下這樣......

allPermu' xs = map f xs
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))

這是有麻煩的程式。因為當 allPermu' 處理 xs 一次,展開成右邊算式 map f xs 得到的答案會讓資料結構加一層。本來對 [1, 2] 我們想求的答案是 [[1, 2], [2, 1]] ,但是按照前面的計算結果,答案卻是 [[[1, 2]], [[2, 1]]] 。雖然算得出答案,但是表達一列資料的層次越來越深。這時我們需要一個函數讓 [[[1, 2]], [[2, 1]]] 變成 [[1, 2], [2, 1]] ,把資料結構層次降低一層。有一個預設的函數叫 concat 可以做這件事情,如果有一列資料是 [a, b, c, ...] 而 a, b, c, ... 是另外幾列資料, concat [a, b, c, ...] 是把 a, b, c, ... 這幾列資料銜接在一起,於是資料結構的層次減低一層。所以,使用 concat 把 allPermu' 寫得好的程式如下:

allPermu' xs = concat (map f xs)
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))

上面這個 allPermu' 是遞迴的情況。而遞迴程式應該要包含遞迴部份和基底部份。把基底和 allPermu' 函數的型態加進去,完整的 allPermu' 函數就是:

allPermu' :: (Eq a) => [a] -> [[a]]
allPermu' [] = [[]]
allPermu' xs = concat (map f xs)
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))

然而, allPermu' 有個問題是,如果處理的資料列中有重覆資料,因為 filter (x/=) xs 比對 x 值是否相同的作用,會讓 allPermu' [4, 4, 5] 求出不對的答案。即使如此,至少 allPermu' 函數處理一列每個項目都彼此不同的資料是做得對的。後來我想,任何一列可能有重複項目的資料背後都藏了另一列項目彼此不同的資料,就是由原列每一個項目存在的位置編號。例如, [4, 4, 5] 對應到它們的位置編號 [0, 1, 2] 。以下的 allPermu 函數,在處理任何一列資料時,先取出該列資料的一列位置編號,用 allPermu' 函數產生位置編號的全部排列,再將這些排列轉換為原資料。

2. allPermu 函數:產生任何一列資料的全部排列情況

在 Haskell 寫 [0..9] 可以得到 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ,是取得等差遞增序列的特殊語法。對任何一列資料,例如 [4, 3, 4, 5] ,可以寫 [ 0 .. ((length [4, 3, 4, 5]) - 1) ] 產生從 0 開始的遞增序列,也就是 [4, 3, 4, 5] 的位置編號 [0, 1, 2, 3] 。

於是, allPermu' [0..((length [1, 2])-1)] 是 [1, 2] 位置編號的全部排列情況, [[0, 1], [1, 0]] 。接著要將 [[0, 1], [1, 0]] 轉換成 [[1, 2], [2, 1]] 。用 map (\x -> [1,2]!!x) [0, 1] 可以做到這件事情。給一個數字 x , [1, 2] !! x 就是在 [1, 2] 列中取第 x 個位置的項目。所以,以下的程式可以將 [[0, 1], [1, 0]] 轉換成 [[1, 2], [2, 1]] :

map (map (\x -> [1, 2]!!x)) [[0, 1], [1, 0]]

第一個 map 將第二個 map 伴隨其參數的段落,即 map (\x -> [1, 2]!!x) ,套到 [[0, 1], [1, 0]] 的每一個項目。接著對 map (\x -> [1, 2]!!x) [0, 1] 來說,是將函數 \x -> [1, 2]!!x 套到 [0, 1] 的每一個項目。所以基本上, allPermu 函數可以寫成:

allPermu xs = rs
where rs = map (map (\x -> xs!!x)) (allPermu' [0..((length xs)-1)])

但是,考慮 allPermu [4, 3, 4, 5] 會發現出現一些重複的項目,例如,雖然 [0, 1, 2, 3] 和 [2, 1, 0, 3] 的確是兩種不同的排列情況,卻都轉換成 [4, 3, 4, 5] 。於是第三個函數 compact 是將多個重複項目刪掉。 compact 函數在 Haskell 是很普遍的程式處理方式,在此省略其介紹。

3. 結論

本篇由一件以 Haskell 撰寫的全部排列函數,解析一般的處理排列問題的遞迴解題方式。求一列資料的全部排列,是對資料列中的每一項,先求其他項目的全部排列,再將這一項分配結合到其他項目全部排列的每一項之前。透過函數程式語言的寫作方式,可以讓我們重新抓到人們解決問題的直覺能力,使我們從以往局限在程式執行步驟數量的思考方式中得到解脫。

Monday, May 25, 2009

什麼是情境感知

以下翻譯 Jakob E. Bardram 在一篇文章 The Java Context Awareness Framework (JCAF) - A Service Infrastructure and Programming Framework for Context-Aware Applications 中,對「情境感知」所下的解釋。

JCAF 是在 2005 年發表這篇文章所介紹的情境感知基礎架構,用 Java 語言做開發及支援。本文介紹 JCAF 的設計原理、執行架構、程式介面。 API 包含了服務環境的組織、情境和情境集合的模型、情境事件的定義、以及情境的起動、監看、和轉換等等課題。 JCAF 已經應用於好幾種專案中。

以下翻譯的文章段落是
引用文獻



(自訂標題) 情境感知的定義

「情境感知式電腦運算」的概念是早先一些在「普遍運算」研究方面引介的概念之一。 (參考 20, 19, 及 8 號文獻) 並這些概念從那時就受限於既存在的其他研究。「情境」是談到電腦運算裝置所嵌入的實體或社會的處境。情境感知運算是要取得和運用與一架機器有關的這種情境,以提供適合特定環境的服務。例如,如果手機可以擁有關於它自己存在的位置、和參與活動方面的知識,當出席在音樂會裡,手機都會採震動方式。 (參考 16 號文獻)

Saturday, May 23, 2009

(翻譯) 寫程式:從「如何」到「什麼」

本文翻譯 C. J. Date 的 What Not How: The Business Rules Approach to Application Development 第一章,從 5 到 7 頁。原文參見: Google Book 條目

讀到本書這一段時,感覺非常特別:一方面是這個「搞資料庫的」作者在本書中好多地方,用特別的講法切中程式設計的中心概念,相當引人反思:例如,他說:「如果用 C 和 Java 這種 procedural 語言寫程式,是叫使用者幫忙把事情做好,而 declarative 語言則是叫系統幫自己做事情 (SQL 也算是 declarative 語言,但這一般是指像 Prolog 的邏輯風格的語言,或是像 LISP 和 CLIPS 這種函數風格的語言) 。程序就是安排使用者去走哪些他們該走的流程。宣告式語言則是只把自己的函數寫好並擺著,等使用者他們需要的時候過來呼叫,系統就會動起來。另一方面,這本在 2000 年出版的書籍,主題是 Business Rule ,內容卻提到要將過去寫程式的思考方式做一層翻新。書中又隱約透露出,在電腦程式設計中, declarative 風格的語言向來不佔一席之地,而許多數學家和電腦理論家都努力推動這種程式語言,以及推動它們的實務工作。


(自訂標題) 寫程式:從「如何」到「什麼」

於是,一以貫之,歷史的走向全然遠離程序式、而趨於宣告式,也就是從「如何」到「什麼」。「如何」就是逐步說明該如何做工作;「什麼」就是說明該做什麼工作。那麼,為什麼這種趨勢是個大好消息?答案是:宣告式 (什麼) 意思就是要系統做事;程序式 (如何) 意思則是要使用者進行工作。用一句話解釋,就是:

宣告式比程序式更好!

所以,如果我們能把全部我們的程式工作都用程序式的,不是很好嗎?這樣的需求已經很多很多年前就是大家的目標了。 (如果時間沒更早,大家已經遠從 1970 年開始談論關於「完全可編譯並可執行的規範書」了。) 換句話說,如果我們能簡單地明確規定我們的程式,並讓系統把這些規格編譯成可執行碼呢,不是很棒嗎?

好,我們往下走,如以下所見。

那好處非常明顯:當然是生產力。工作更容易也更簡單地完成了。而且跟著有許多附帶的利益,特別包含了各種的獨立性。有一種令人熟悉的獨立性是「資料獨立性」,它使我們改變 (舉例是為了效率因素而改變) 資料實際儲存在磁碟的方式,而不必做哪些對應的動作,改變用到這些資料的程式。也有許多其他種類的獨立性,其中有些,在本書後段還會看到。所有獨立性的好處是,那使程式對某種改變免疫,特別是對某種商務上的改變更是這樣。這是好事,因為,如果們所知:生命中惟有一件恆定的事,就是改變。

但是,程式到底是什麼?很顯然,程式是某件商務功能的實現:例如,「添入一項訂購物品資料」、「刪除一項訂購物品資料」、「修改某項料件的庫存數目」。一般是程式都牽涉到三種元件:
  1. 展現方面的元件
  2. 資料庫方面的元件
  3. 由商務功能本身定義出來的元件
展現方面的元件是必須處理終端使用者介面的元件,包括工作有幫使用者顯示表單、從使用者接收所填的資料、顯示錯誤訊息、產生列印的輸出等等。資料庫方面的元件應該做粹取和更新資料庫的資料,以因應使用者的請求,以及因應使用者在表單的填入資料 (那些表單是與資料庫 server 互動的部份,又稱為 DBMS 、資料庫管理系統) 。最後,稱為「由商務功能本身定義出來的元件」可能要想成是專屬於應用程式的;那些是指定做真正處理的程式,被做出來要實現商務函數,或是,換句話說是有效地實作商務策略和實行的程式。

現在,這三項之中,前二項已經在某些重要時刻大量地自動化了。程式開發人員不再寫細微的程式碼來處理螢幕繪圖,或找到螢幕上的表單修改之處──只是呼叫內建的展現服務來搞定那些工作。同樣地,他們也不必寫細瑣的程式碼來管理磁碟裡的資料。他們只是呼叫某些資料庫服務來做好那些工作。但是第三個元件呢,由商務功能本身定義出來的元件,那些東西還是大部份用手工做到,意味了有人還是照樣寫一大堆程序式的程式。而且,當然啦,那就是個毛病了 ...... 是把第三元件自動化的時刻了!而那真的就是全部與「商務規則」相關的事:把商務處理工作自動化。

接下來的做個像在信封背面做分析那樣的粗略計算,可能對提供我們所談論的重點的一些想法有所幫助。典型的資料表可能需要五頁相關的程序式程式;標準資料庫 (不大的資料庫) 可能包含 100 張資料表;好的程式刻工手可能每天可以產生一頁程式碼。淨額是: 500 人日 (譯註:人日是單位詞。《人月神話》也提到這樣的單位,將人力數目和工作時間的乘積當做計量單位。) 造就一套手工系統。相反地,簡單地規範定義同樣的系統,是五到六週的工作;而如果這些規範都可以執行,我們就有效地把開發時間減少一個級數 (譯註:級數, order of magnitude ,簡單說,是二個指數乘冪數值的差距:例如, 1000 比 100 多一個級數,因為 1000 是 10 自乘三次,而 100 是 10 自乘二次。)  。

Tuesday, May 19, 2009

imoo msn機器人即將支援 傳遞客製化表情符號

imoo msn機器人傳遞客製化msn表情符號測試是成功了,不過;真的要做進產品,也許;還需要考慮其他的部份 比如:怎麼做可以方便機器人的發送… 畢竟測試的版本要進產品還需要一些時間,但這星期確定會釋出這個功能

Thursday, May 14, 2009

在企業組織裡設計的挑戰

本文翻譯 Contextual Design 一書 (Amazon 記錄) 第 10 頁到第 16 頁 (Google Books 預覽): The Challenge For Design in Organizations 。

在書中,「設計」一詞幾乎都是指「開發資訊系統」。

標色文字是我的註解。


在企業組織裡設計的挑戰

誰能說一套系統將能做什麼?真是行銷部門或系統分析師說:「搞出這個」,就能教開發團隊只跟隨規格做事嗎?或者,行銷人員或分析師真的只要說:「弄出『這一類的』東西」,開發團隊其實決定做他們想要做的以及決定系統該是哪個樣子?事實上,兩方人馬都要擔任說明新系統是什麼長相的角色──在企業組織裡,建立一套系統是他們這些人合作的結果?

下層的問題無可逃避。今日的系統太大,很難教一個人做完。所以企業組織把規定和建立系統的流程分為幾個部份,把每個部份指派給一小群人。每群人又特定他們負責的部份,與其他處理其餘部份的人失去聯係。在開發系統的事情上,有四個問題該答,這些問題傾向於將開發流程自然分割。所以很容易指定一群人回答一個問題。問題有這些:「工作中有哪些事項」──該認定工作的哪幾個方面;「該如何應對」──團隊該用什麼系統做應對;「系統該如何架構」──到底有什麼功能、功能的規劃、以及系統架構,能適合工作的需要;以及「我們做得怎麼樣」──所設計的系統真的能為客戶服務嗎?

(「工作中有哪些事項」──該認定工作的哪幾個方面 )

頭一個問題 (「有哪些?」) 是問,有哪些客戶的工作活動是新系統該認定的,有哪些提議或問題該克服、有哪些角色和工作項目有必要支援。指定回答這個問題的那群人是行銷人員或商務分析人員。在管理工作會改變企業組織的時候,他們常下指令定義企業資訊系統有哪些是要項。他們說:「採購的費用太多了。給每個部門一張信用卡,只有授權才准使用」、或說「咱們的化學資料庫是咱們的命脈。把所有資料庫跟公司綁在一起。」或者,行銷部們可能會告誡工程團隊說:「設計一項產品支援公司的計劃。」或「讓產品放到網路上。」這些指令說了好多高層次的工作方面的事項,要系統能夠幫忙,卻沒有實際定義系統。把產品放到網路上,影響工作的哪方面呢?把資料庫都綁在一起,意思是一個資料庫呢、重複的資料庫呢、還是一種搜索許多資料庫的方法?在那些設定方向的觀點上,上述問題則是細節,他們不必回答這些小問題。

(「該如何應對」──團隊該用什麼系統做應對 )

回答這些小問題,意味要說要應付些什麼:公司將要如何回應這些有關系統設計、流程、服務、以及發行策略的議題。行銷人員可能是定義回應方式的參與者,但除了公司都是技術導向之外。需求分析人員可能也是參與者,但除了這些人真的太不懂技術了,就要是開發人員來做了之外。客戶自己應該要涉入內部系統,因為系統定義了他們要怎麼工作。行銷人員和分析人員可能要得到正式許可「發展系統規格」,但是依照經驗,他們不在必須寫程式的層面中定義系統的行為。「他們丟了一份規格給我,」開發人員都這樣對我們說。接著,「但是老是有太多我們要決定的事情,而他們通常只問我們那些不夠實際的事情。所以這個叫做交換意見。」

(「系統該如何架構」──到底有什麼功能、功能的規劃、以及系統架構,能適合工作的需要 )

決定要怎麼架構系統,意味要具體決定要納入什麼功能,具體上系統怎麼動,還有系統會怎麼顯現視窗、選單或畫面。這幾乎都是開發人員做的事,也表示他們要了解使用系統的工作環境。要不然他們不能做什麼對客戶好的決定。開發團隊無法從行銷人員或分析師手中拿到客戶資料。做出詳細的系統架構仰賴於額外一層的客戶資料,開發人員要自己拿到──或者是,自己做出感覺對的系統。有些公司又走得很遠,把開發團隊擺在與他們客戶和分析師有差別的地位,創造了一群專精在他們設計工作中的人力。但那只是弄得需要更多溝通,而且如果缺少車馬費,就造成更嚴重的孤立。

(「我們做得怎麼樣」──所設計的系統真的能為客戶服務嗎 )

最後一個設計的問題,說,「我們做得怎麼樣?」這個問題是和客戶核對系統的進度,確認它還是個對的系統,而且在細節層次改動程式不會讓系統變得不能用。這個問題經常分割出去給一組可用度研究團隊或品質保障團隊做測試。回答這個問題,是檢查系統本身 (看看 bug 和是否符合規格) 以及跟使用者一起測試系統。但無論哪方面,處理檢查結果都是開發者的工作。所以,他們必須接收回報訊息,還要了解它並相信它──那表示他們要買進取得回報訊息的程序,並且信任收集回報訊息的人。並且經常是,到目前為止都沒有真的取得實際資料做設計,在這個時候發現的缺陷都是很基本,他們在開發階段很難確實找到的。

這些定義系統該如何的不同部份,若系統設計程序要啟動,就要一起做。界定應對方案的人要能答覆真實的問題;建立系統的人要建構他們認同的應對方案。但是,要保持每個問題都分別由指定的人來處理,會造就組織之間的溝通難題。開發的正式文件掌握擬定的設計方案,也要盡力控制各群人馬之間的溝通和歧見。「你們簽了協議。表示你們承諾了。」「是,不過我們已經了解並且真的不需要。」或「是的,但是我們與這位重要客戶談過,若我們沒有碰上需要,就沒有必要出貨。」或「是,但是依現有的技術我們真的沒能力實作。」

組織裡的設計,與在各群人之間發展同一凝聚的方向有關:符合他們打算交付的公司應對方式。並不是永不改變,而是在改變時,整個企業組織在各種功能上可以適當地回應,而不是將改變轉換為兩方人馬的叫囂。反過來說,同一凝聚的願景仰賴於在公司應對方向的發展之間多加考慮不同的觀點。行銷和分析人員需要科技方面的展望,看見新系統種類的契機。開發人員需要行銷觀點來看清為什麼有些走向造就好產品,有些卻不能。又需要分析師的看法,看到他們要處理的工作要點。資訊科技團隊需要客戶的看法,確定自己提議的工作流程變更很合理而且可採用。在他們發展出公司的應對方式之後,他們可以同時有效地做事,並且不會迷失方向。但是,在突出的設計上,跨功能團隊做得最好。

實際環境中的工作團隊

建立跨功能團隊來做一同的設計會執行出真實企業組織裡某些意外的問題。想想一個基本問題:這樣的團隊要符合什麼期待?快速檢視大部份組織的實際結構,就發現他們都做到讓人們分開。最常見的開發工作環境是小方塊,是一塊夠大的一人空間,可以舒服地做事,有電腦和桌子。但是那個區域沒有大到可以讓幾個人一起舒服地工作,也沒有一塊大的隔牆空間讓一支團隊工作。當然另外有會議室,但會議室的特色就是只能預約並共用幾個小時。因為預約時間有限,能提供的工作只是短時間完成的事情,不超過半天。以超過標準的方式預約這個房間,同事的樣子會讓你擺臭臉。畢竟是在浪費一塊公用空間。不但如此,因為房間是共用的,你不能擺太多東西。每次對談要從頭開始,每次會議要重新攤開設計圖。

所以會議室支援的工作是在能短時間做好,而不需要實體支援的類型──不要硬體、不要圖表,沒有你不能捲起來帶著走的東西。也許有網路線,但要接上哪個區域網路呢?網路品質還不錯吧?接上筆記型電腦怎麼樣呢?有這些限制,會不會有開發人員和工程師覺得開會浪費時間呢?有標準規模的公司的實體架構明白地說,真正的工程都在小方塊裡做成的,而人都來到會議室則是他們沒有真在做事。企業的普通結構,沒有可以支援面對面溝通而能啟動系統設計的。

管理面對面的設計

一同有效地工作,意思是擁有在其中能真正工作的場所,讓許多人面對面地完成工作。也意味了賦與人們人際能力和流程,使他們的聚集比較有效。有一位部門主管指出一件棘手的問題,是在當地旅店訂房間讓五位資深架構師待著,並告訴他們,如果不在一週內提出解決方案,就要辭退他們。他得到結果,而我們發現如果人們有合理的工作過程,通常會比較快樂、有創造力,並且更快產生結果。對程序的典型回應是「感謝你,我現在終於知道該做什麼。」即使痛恨程序的人也會這麼說。

一起工作是一種新技能。是學校沒教的事,也是工作很少教的事。一起有效地工作,意味要懂得怎麼時常維持設計方面的對話,要怎麼用心到工作要項而不是其他事情上,要怎麼掌控每個人的特質,還有要怎麼發現並指出歧見的根本原因。如果團隊不這樣做,他們的工作就會因為人們處理歧見的模式與保持他們愉快的工作凝聚力之間的取決,而遭受損失。

人們處理歧見的一種主要的模式是政治交易:「我覺得你弄錯了。但是,如果你給我一些對我來說比較重要的東西,我就容得了你。」政治交易帶出一套以拼湊為主的系統,缺少具備向心力的主題。而且政治交易讓團隊的每個人都減少對設計工作投注心力,因為每一位都至少要認同一個人的決定,而他認為那個決定是錯的。

也有其他處理歧見的方法,但是大都不夠好。有一種方法是妥協,說:「你說我們要把什麼都做成對話方塊,但我覺得應該要做成按鈕才對。所以,兩種都做,我們誰都高興了。」誰都高興了,不過使用者不高興。他們有一打達到功能的辦法,但是沒有好的理由說明哪個辦法比較好。或者,會有教師式的歧見處理方式,說:「大師最聰明,而且什麼都懂。我們要跟著做大師所說的。」這很好,但除了在科技環境、圖形使用者介面設計、使用者實際工作、行銷、專案規劃、以及其他能力方面,這些絕對不錯的大師們所佔的人口數少到幾乎沒有。

情境設計 (Contextual Design) 規定一種發展系統的過程,可以帶出人際技能的價值。規定了根據資料來取捨各種開發選項,所參考的資料不包括爭議和政治交易。情境設計規定了人該扮演的角色,能在設計的過程中一直保持討論。不但要讓設計的過程比較有效率,還要因為人們爭議並沒有進展而將系統暫時擱到一邊。

前端系統設計讓我們著眼於人際的課題,因為設計程序的這一部份會帶來由面對面影響得很深的不一樣的功能。傳統的設計較不帶出著重在一起工作的技能。致力於保持客戶工作的凝聚力,而排除團隊中不同的看法和不同的能力,會使認知到如何一起工作變得很重要。我們發現,在人們該進行明確的流程、扮演明確的角色時,那時他們會對個人風格很敏感,使他們在房間裡起衝突。而當他們有具體的資料可以根據以設定決策,就會跨過隔籬,一起有效地工作。

這就是以客戶為中心的意義:不只做到客戶導向的設計,還要讓設計流程將系統帶往能讓客戶的工作──從開始到實作──能凝聚在系統中。對情境設計的挑戰是內建在方法中,要瞭解一同工作的要點,還要提供有效工作的辦法。

Wednesday, May 13, 2009

MSN換暱稱 相關行銷活動資訊

<AION封測。與你相約>將您的 MSN 暱稱更改為 "是我唯一的選擇!", 就有機會得到 CB 帳號哦!!
http://buboo.tw/msg/00a05b01a85d24c.html

王品msn步步大串連活動
http://www.wangsteak.com.tw/event/09_walk/fight_2_MSNatt.aspx

msn友達大募集
http://www.9inthebox.com.tw/campaign/event/200904/mem/index.php

設計的挑戰──在與客戶保持聯係方面

本文翻譯 Contextual Design 一書 (Amazon 記錄) 第 9 頁 (Google Books 預覽): The Challenge For Design - Keeping in Touch with the Customer 。

文中有下列角色:
設計團隊: design team ,就是開發人員。
開發人員: developers ,就是設計團隊或設計者。
企業: business ,就是客戶、提出需求和出資的公司。
資訊科技部門: IT department ,就是今日名上有「資訊」、「科技」等字眼的公司。
角色: role ,就是在資訊科技部門或企業中,有各種不同的職稱、做不同工作的人。


設計的挑戰──在與客戶保持聯係方面

如果從密切瞭解客戶方面出發、來做設計,是最基本的事,為什麼那麼難做到呢?產品開發公司發起的時候,他們創造了讓設計者與客戶分隔的組織方式。剛開始是要設計者由與潛在的客人對談,以幫助銷售。但是當公司成長了,就發展出銷售部門做應對客戶的介面;安插了操作代表 (account representative) 控制業務部門;安差了行銷和產品管理部門。這些走向使設計者甚至和銷售人員分隔了。剛開始是把設計者擺在客戶服務線上。但是當公司成長了,有一個完整部門搞定客戶服務任務,還有正規的介面對開發工作提出回饋意見。開發者被孤立,無法直接接到客戶回報他們工作的好壞。我們跟一些開發人員談過,他們與客戶之間真是孤立;在另一方面感到無力的是,因為覺得自己無法修正客戶發現的問題,他們甚至不想跟客戶談談。

資訊科技部門有一個不同的理由對駐留在客戶那邊感到有困難。在公司成長時,他們也是動輒與客戶分隔,但可行的不同方式都伴隨著問題而來。他們創造新角色──商務、系統、或需求分析人員──在客戶和開發者之間做翻譯,卻發現客戶仍相信資訊科技部門不了解他們的東西。其他的角色則不和客戶創造有密切工作關係,也不為了開發人員創造無阻礙的不干涉局面。

為了控制變動的需求,資訊科技部門做了收尾舉動,但是客戶的優先順序和需求還在改變。因此他們把開發人員安排在所服務支援的企業人員身邊,就可以就近影響企業的工作。他們弄好了客戶關係,卻意味了資訊科技部們不能分享資源和專業,也不能做為看穿整個企業資訊系統的關鍵角色。所以,他們決定他們太沒組織了,就把人都再拉回來,並重新導出了孤立的問題。

在資訊科技部門,這種震盪是個典型,但是終究錯失重點。任何對人的安排都跟著伴隨著問題,所以唯一的解決辦法是瞭解問題並加以處理。資訊科技部門需要和客戶保持一些距離,以看清不同部門之間造成的衝突,並規劃系統將企業視為整理來處理問題 (連同對系統出資的方式)。同時,他們需要讓他們和客戶保持密切夥同關係的機制。

以上就是情境設計 (Contextual Design) 的挑戰:要讓設計團隊明瞭他們的客戶,要給他們足夠的距離能以整體觀──能看透企業或看透一個市場──來看工作的實務。這個過程同時還要讓設計團隊徹底以「什麼是對客戶較實在」的知識做為基礎。

Tuesday, May 12, 2009

Erlang gen_server 行為解析

本文為翻譯 gen_server behaviour in Erlang (http://geeklair.net/~pratzsch/blog/2008/04/gen-server-behaviour-in-erlang.html)一篇.

授權聲明:本篇是由 Phil Ratzsch 發表於個人 blog 「你不愛讀的東西」(You dont't want to read this. http://geeklair.net/~pratzsch/blog/) ,文章發表於 2008 年 4 月 30 日晚間。我已透過電子郵件徵求取得作者許可,在此張貼翻譯版本。非常感謝 Philip Ratzsch 閣下。
Claim: This article by Phil Raztsch is posted in his blog "You dont' want to read this" in the evening at April 30, 2008. I've got the author's permission that allows me to post my translated version. I would like to convey thanks to Mr. Philip Ratzsch.

標色文字是我的註解。


Erlang gen_server 行為解析

本文由 Phil Ratzsch 於 2008 年 4 月 30 日晚間發表

你們有些自己在家玩些什麼 (我說:宅男嗎?) 的人都知道我有點喜歡 Erlang 全部的東西。對啊!你們一些在家玩自己的 (還有任性的衝浪人,也是) 、與歐洲的戶外隔離的人,可能想知道為什麼 behaviour 字裡躲著一個煩人的 u 字母。 Erlang 來自 Ericsson 公司 (他們公開否認 Erlang 和 Ericsson Language 一詞的關係,而說 Erlang 跟著一位同名數學家的名字定名) 而且 Ericsson 正好位於 Scandanavia 地區。 (據查:Scandanavia 是北歐包含丹麥、瑞典和挪威三國的區域)

語言家的理論說可以隨他們喜好、用 u 代替「 o 中間劃一線」字母。 (我說:那是一個丹麥文字母 Ф ,做母音有時音同 bird 或 hurt 、有時音同 sister 的 i 音。) 或是可能他們想表現出多麼愛那個空集合符號。不管這個,我們跳進 gen_server 話題吧。

gen_server 是 OTP ──「公開電傳平台」(Open Telecom Platform) ── 的一項元件。 OTP 可說是 Erlang 的一種應用程式架構。像 Python (蟒蛇) 有 Pylons (高壓電線架) ,以及 Ruby (寶石) 有 Rails (軌道或扶手) ,還有 Windows 有「當機的毛病」。 OTP 有強大威力,令人喜不自禁;而身為相當新手的我,只開始領會它有多強。引述 Joe Armstrong 寫的 "Programming Erlang" 書中字句:
OTP 的能力來自於一些特性,諸如容錯、可延伸能力、以及動態碼的更新等等,都由它的行為提供。也就是說,寫 callback 的程式人不用煩這些事情了,因為 OTP 行為會提供這些能力。
好的,菲利普,「行為」是指什麼呢?一件行為,就是像它聽起來像是的東西 ── 像一個桶子裝了一種系統或平台的全部普通行為。 (我說:這到底是什麼樣的直覺?)

舉一個很傳統的人為範例,假想一家錄影帶店只讓你一次買一部片。程式碼可能看起來像下列我收錄的。像上次一樣,先來個程式,再來個說明。我無限地感謝執行 CouchDB 專案的主持人 Jan Lehnardt 的幫助、耐心指導和友誼。將來不久,他也會貼一筆同樣主題的 plok 記錄,所以請務必去看一下,而且要給他錢。 (我說: plok 是很像 blog 的東西。)

-module(movie_store).
-behaviour(gen_server).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

-export([checkout/2, lookup/1, start_link/0]).

start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
checkout(Customer, Movie) -> gen_server:call(?MODULE, {checkout, Customer, Movie}).
lookup(Customer) -> gen_server:call(?MODULE, {lookup, Customer}).

init([]) ->
Tab = ets:new(?MODULE, []),
{ok, Tab}.

handle_call({checkout, Customer, Movie}, _From, Tab) ->
Response = case ets:lookup(Tab, Customer) of
[] ->
ets:insert(Tab, {Customer, Movie}),
{ok, Movie};
[{Customer, OtherMovie}] ->
{already_checked_out, OtherMovie}
end,
{reply, Response, Tab};

handle_call({lookup, Customer}, _From, Tab) ->
Reply = case ets:lookup(Tab, Customer) of
[{Customer, Movie}] ->
Movie;
[] ->
none
end,
{reply, Reply, Tab}.

handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Msg, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVersion, State, _Extra) -> {ok, State}.

好,看起來很龐大 (順便地說,也是 Erlang 的超級威力) 但其實不是。第一行宣告了模組名稱 (而且 movie_store.erl 必須是檔名),這是 Erlang 每個程式都有的標準格式。

-behaviour(gen_server). 可想成是宣告我們程式裡用什麼「模版」。 gen_server 的行為要求我們要定義列在第一組匯出 (exports) 的函數。

-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). 是 gen_server 匯出並尋找的函數 (,而且如果缺了他們,可會抱怨得很大聲喔) 。下篇文章我會探究它們、深入到細節 (我說:但他的下一篇文章,我不見得會譯完。) ,恰如這會是一篇長篇大作。現在,要曉得,就算這些函數都不做事情,也要定義這些函數全部。如你所見,尾端一些程式像 handle_cast/2 、 handle_info/2 、 terminate/2 、 code_change/3 ,都不做事情。

-export([checkout/2, lookup/1, start_link/0]). 製做自訂的函數,讓 server 可使用它們於外界。這些函數列在另一個 -export 敘述中,以資區別,或者也可以與前面的 -export 合併。

start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

程式的起點。如你所見,這個函數是 server 運作命令的包裝。{local, ?MODULE} 顯示 server 會以區域方式執行,並不會讓叢集系統的其他 Erlang 節點存取。 ?MODULE 是現有程式的替身,指示我們該用什麼東西參考這個 server 。第二個 ?MODULE 告訴 server 往哪裡找到 callback (在此例是同一個檔案) 。其他選項容許開啟除錯功能、做檔案記錄、以及其他未列入此例的項目。

checkout(Customer, Movie) -> gen_server:call(?MODULE, {checkout, Customer, Movie}).
lookup(Customer) -> gen_server:call(?MODULE, {lookup, Customer}).

這幾行聯繫自訂函數,告訴 gen_server 當 movie_store:checkout(...) 和 movie_store:lookup(...) 函數呼叫時能做什麼。 ?MODULE 指定函數所在的檔案和模組,而 {some_name, Arg1, Arg2, ...} 提供函數名稱和傳入的參數。
init([]) ->
Tab = ets:new(?MODULE, []),
{ok, Tab}.
用 ets 建立資料表並傳回。 ets 是內建的記憶體資料庫。在部署的程式中,這或許有時有些 ... 耐久。 gen_server 的關鍵元件是程式狀態。在本例中,你將看到 Tab 被丟來丟去,丟到每一樣程式單元中,表達現有的錄影帶店狀態 (誰購買了什麼片) 。
handle_call({checkout, Customer, Movie}, _From, Tab) ->
Response = case ets:lookup(Tab, Customer) of
[] ->
ets:insert(Tab, {Customer, Movie}),
{ok, Movie};
[{Customer, OtherMovie}] ->
{already_checked_out, OtherMovie}
end,
{reply, Response, Tab};
記得之前說的一點 gen_server:call(...) 嗎?這是 gen_server 呼叫的東西。你們可能想知道為什麼 handle_call 定義了二個函數,而且引用相同數量的參數 (參數數量表達為 /x ,如 "functioname/2" 裡面的 /2 ) 。看它第一個參數,是有三項的一列記錄。再看看

checkout(Customer, Movie) -> gen_server:call(?MODULE, {checkout, Customer, Movie}).

第一個項目符合樣式 (我說:指 {checkout, Customer, Movie} ) ,這是 gen_server 知道如何處理 handle_call 呼叫 ... 那個 ... 呼叫。嗯,最後一截用太多「處理」和「呼叫」的字眼了。重點是就像其他許多 Erlang 的東西一樣,以符合樣式為基礎。

注意一下, Tab 表格也傳入了。我們就進到一個 case/of 段落,檢查客戶在表格中有沒有購買了影片。如果沒找到記錄 ([] -> ...) ,片子就賣給他們,在此段落傳回 {ok, 影片名稱} 。如果已經有記錄,則傳回 {already_checked_out, 另一影片名稱} 並拒絕客人購買片子。 (注意,本例沒有讓客人退貨的辦法。這個留給讀者你自己練習。)

本段落任何一個情況都將傳回值塞進一列記錄,發射回給呼叫這個函數的人。在往下一個 handle_call(...) 走去之前,看一下最後一行: {reply, Response, Tab}; 。你可能期待有個句點而不是分號。 handle_call(...) 句子是用分號結尾,而且如果是改用像其他函數一樣的結尾。我好不容易才找到它的道理。 (我說:分號表示同一函數的兩套不同的定義之間的分界。)
handle_call({lookup, Customer}, _From, Tab) ->
Reply = case ets:lookup(Tab, Customer) of
[{Customer, Movie}] ->
Movie;
[] ->
none
end,
{reply, Reply, Tab}.
這個 handle_call/3 定義一個函數檢查看看客人有沒有購買了影片。如果有,傳回一筆記錄包含了客人和電影的名字。如果沒有,則傳回 none 。 (我說:重講一次,應該說是找得到一筆記錄符合 {Customer, Movie} 就傳回電影名稱,否則,如果找不到就傳回 none 。) 我不要講這個太多,因為以正在講的 handle_call/3 來說,這個東西太細。

handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Msg, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVersion, State, _Extra) -> {ok, State}.

這段程式要擺在那邊,使 gen_server 能動;但這次我們沒用到它們。下一篇導引文章我會多談談。但我簡短說明: code_change/3 超酷,它讓 server 還在服務的時候可以將程式內容做熱抽換。要知道,想要改換程式何必麻煩讓 server 停掉呢,是吧?

最後,這是如何執行的示範:
2> c(movie_store).
{ok,movie_store}
3> movie_store:start_link().
{ok,<0.42.0>}
4> movie_store:checkout(phil, "Sneakers").
{ok,"Sneakers"}
5> movie_store:lookup(phil).
"Sneakers"
6> movie_store:checkout(phil, "Koyaanisqatsi").
{already_checked_out, "Sneakers"}
7> movie_store:lookup(phil).
"Sneakers"

(我說: 2 號命令是編譯 move_store.erl 。 3 號命令呼叫 movie_store:start_link(...) ,它轉呼叫 gen_server:start_link(...) 得到 {ok, <0.42.0>} ,表示命令完成,<0.42.0> 是 server 的程序代號。 Koyaanisqatsi (印地安語,意思是 life out of balance ,失衡的人生) 是一部藝術片,參考 IMDB 條目 (http://www.imdb.com/title/tt0085809/) 和 Wikipedia 條目 (http://en.wikipedia.org/wiki/Koyaanisqatsi) 可知道更多資訊。)

有個問題是程式在你試著選購 Koyaanisqatsi 時不會對你恭維幾句。嗯,我已經太煩人一整天了,至少希望你感興趣。如果你們要改就全都改,或者無論如何務必讓我知道。



建言:

Ulf Wiger 在 2008 年 5 月 1 日上午,說:

丹麥人和挪威人才用 o 中間砍一線,而瑞典人沒有這樣做。咱們都用 Ö 和 Ä ,很像德國人用的,但又多了很美的字母 Å 。對丹麥數學家致敬不代表分擔了使用 Ø 的原罪。 Erlang /OTP 團隊充斥著英國人,英文 behaviour 的拼字法可能源於那邊 ...

但不全沒有。若要建立自訂的行為, linter 接受 -behaviour() 和 -behavior() 兩種,還有 -behaviour_info() 和 -behavior_info() 。

還有,我聽說 Joe Armstrong (英格蘭人) 、 Mike Willams (威爾斯人) 、 Robert Virding 以前住在澳大利亞。

Harishi Mallipeddi 在 2008 年 5 月 2 日近午,說:

OTP Design Principles 一篇提供很有用 (至少對我來說) 的學習方法,學會用 OTP 的東西,包括 gen_server 、 gen_fsm 、其他等等。 Joe 的書可沒好好解釋 OTP 。

http://www.erlang.org/doc/design_principles/part_frame.html

Blog Archive