我的雲端生活網 - Life+
Wednesday, December 30, 2009
我要公開感謝你們,你們才是最棒的~~
???我有好多疑問???是思考?還是想太多 ?
Tuesday, December 29, 2009
Monday, December 28, 2009
Erlang 叫用外部程式很簡單
Port1 = open_port( {spawn, simple_work}, [in, out, use_stdio] )
#!/usr/bin/perl -w# simple_work programmy $buffer;$buffer = readline STDIN;print $buffer
port_command(Port1, "hello!\n")
- Erlang 參考手冊 open_port/2 說明:
http://ftp.sunet.se/pub/lang/erlang/doc/man/erlang.html#open_port-2
Sunday, December 27, 2009
劍客其實不擅長刀法
有感而發,突然想講一個故事 ,不管你認不認識我 ,不管你是不是跟我一
起努力打拼的夥伴 ,不管你喜不喜歡我說故事風格,不管你是不是想給我
一些噓聲或掌聲 ,也許你會嗤之以鼻 ,也許你會會心一笑 ,總之不管如
何 ,這個故事正要開始
以前一個朋友問我一個問題,他問,你喜歡刀還是劍? 這問題讓我思考了很
久 ,我在想; 刀與劍哪裡不同? 想了很久沒有答案(你可以上網找到類似
這類的圖片http://blog.sina.com.cn/s/blog_4a1b8858010005i8.html)
,這讓我想起了另一個故事 ,一群劍客裡有一個劍法精湛的劍客 ,在相同
資歷的劍客裡他總是能輕易的擊敗對手 ,很多高手名流遇到他總是甘拜下風
,但這個劍客有一個習慣,他總是喜歡跟其他的劍客聊到刀客的刀法 ,說那
個刀客的刀法過慢 說這個刀客遇事只攻不守 ,成不了大氣,尤其是他喜歡
問他的劍客友人 ,某個刀客對他的評論是不是公平...,一天 ;他與自己劍
友聊到類似的事情 ,這個同好恰好有事無法久留,但 ;給了一個建議 ,約好
明天一早上山與某位高僧一起繼續這個話題
第二天 ;劍客依約上山找了老和尚 ,老和尚第一句話就說; 久聞施主是一
個毫無自信之人 ,劍客大驚 ;連忙詢問 ,何以見得? 老和尚端坐一旁不急
不徐的說; 眾知施主的劍藝高超, 但卻常評斷刀客刀法拙劣, 正是尋求外
援以解自我空虛之徵 ,探尋其他刀客對自己的評論是否公平 ,正是自信不
足之兆;劍客下山後從此不再向外尋求解答 ;勤鍊刀法 ,往後10年成為一
代宗師
這故事應該有一些啟示 ;顯而易見的是;他思考過這個老和尚說話的意思 ,
而不執著於刀與劍的關係,因為如果下山後再去問朋友自己是不是常常在意
外人對自己的評論? 恰好正中下懷 ,所以及時反求諸己 ,然而真實的世界
裡 ,我們很少思考一件事的全貌 ,劍客應該勤鍊劍法 ,刀法的優劣與劍客
無關 ,但如果要向另一個層次突圍 ,需要熟悉刀法的優點勤練刀法 ,如此
才能融合多方優點成為一代宗師 ,能夠把別人的武器運用自如 ,劍客就會
變成刀客最後變成宗師 ,不管是故事裡故事外道理都是相通的 ;這故事本
身也許是一種武器 ,但要看拿在誰的手裡 ,巧妙各不同 ;而說故事總要有
一些啟發作用 ,至於是不是有啟發的效果 ,可能還需要多一點思考的空間
與慧根了
Sunday, December 13, 2009
WebGL規格草稿釋出
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 恰好非常適用於統計式翻譯。
Friday, December 4, 2009
Thursday, December 3, 2009
程式風格與系統實作
- 反轉一列資料。
- 檢查一列資料是不是回文。
int i;
for(i=0; i<xn/2+1; i++) {
y[i] = x[xn-1-i];
y[yn-1-i] = x[i];
}
int i;
// yn = xn;
// y[i] = x[xn-1-i];
// y[yn-1-i] = x[i];
}
}
Wednesday, November 25, 2009
嘉南藥理科技大學開發校內專屬msn機器人
資管系公告
即時通訊在校園生活裡日趨頻繁,為了提供師生更佳的資訊服務,感謝
微程式資訊(股)公司提供msnSDK訊息控制開發套件測試即日起將進行
校內系統開發整合等測試,期能完成校內專屬msn機器人,成為師生訊
息傳播另一重要管道
http://mis.chna.edu.tw/data3/average_show.asp?average_id=814
Sunday, November 22, 2009
答覆客戶問題: 你們與其他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機器人
身可以在 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
- 在 Ubuntu 安裝 Go 語言 (Google’s Newest Toy - Installing Go in Ubuntu 9.10)
Saturday, November 7, 2009
Oracle-Sun 全新資料庫發表
Friday, November 6, 2009
邏輯程式設計 Prolog
Tuesday, November 3, 2009
用Erlang做個文書編輯器
Monday, November 2, 2009
用 MapReduce 處理大量工作
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年度發表)
- RFID的採用改善資料品質、可信度和及時性。
- 高層管理者的贊助,提供投資的可能。
- 改善供需的結盟。
- 威脅隱私。
- 威脅到安全方面。
- 工程標準模糊不定。
最早的對話系統 Eliza
Monday, October 26, 2009
微程式「MSN機器人」成為校園安全守門員
微程式資訊提供國立新竹教育大學「MSN機器人」系統,協助校園安全維護。
國立新竹教育大學在「98年校務資訊系統經驗交流研討會」中,展示校務資訊系統與MSN機器人的整合成果,運用最普遍的即時互動工具MSN,主動發佈學生個人或校務相關資訊,讓校園大小資訊情報不漏接,達到即時的校園安全防護。
學生可透過MSN即時查詢各項教學或校務相關資訊,包括選課、就學貸款、社團公告。
教職員可透過MSN即時查詢、傳送、接收各項公告資訊,以及校務資訊系統異常通知。
學校可整合RFID門禁應用、貴重儀器等資訊系統,透過MSN達成即時資訊的雙向傳遞。
Wednesday, October 14, 2009
Sunday, October 11, 2009
易飛網與imoo msn機器人行銷合作
;只要在活動期間,跟著小咩妹改MSN暱稱,持續三天者,就有機會抽中
『花蓮。理想大地 豪華雙人房住宿券唷』http://ezfly.imoo.tw
Wednesday, October 7, 2009
MSN機器人應用實例
<<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
<<雷爵網路科技股份有限公司-萬王之王 合作案>>
<<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
檔案保安方法
拿到一個檔案,要將檔案透過一些處理方法,儲存在電腦中。經由這些處理,希望使檔案的儲存帶有保祕性和資料的完整性。儲存檔案的處理步驟依序為:
- 根據一個數LC,將每個位數數字加總得到另一個數字NC,將檔案分割為為NC份,檔案長度不足NC倍數則在尾端填塞一些虛資料。對這NC份檔案分塊,每一塊尾端都填塞固定長度的虛資料。如此,結果得到一份實、虛交錯的檔案。
- 根據一個數NB,將前一步的結果分為NB份檔案分塊。再根據另外二個數LRB和RRB,將每個檔案分塊依序左旋LRB個bytes或右旋RRB個bytes。如此,結果得到一份實、虛交錯又區塊位元組旋轉的檔案。
- 根據一串數列LST (數列長為LLST) ,將前一步的結果依序將每個bytes按照LST的數字左旋幾個bits。當LST數字用完時,再從LST的第一個數字開始使用。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits的檔案。
- 根據一個數FC,以FC為代碼,不同的代碼對應不同NB, LRB, RRB和LST數列的順序。然後將FC, LLST和{NB, LRB, RRB, LST}等等資料排列成一個表,準備塞進最後的檔案。這個表格稱為EDT。
- 根據FC,如果FC是複數,則將前前一步的結果檔案逆向排列。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits,並且可能又逆向排列的檔案。
- 令前一步的結果檔案長度稱為LF。根據LF和LC,求檔案中一個可插入表格EDT的位置點,稱為LP。LP的計算式約略是LC對LF取模數 (LC mod LF)。然後,將EDT插入LP位置。如此,結果得到一份實、虛交錯,區塊位元組旋轉之後,又讓每個bytes有左旋轉不同個bits,並且可能又逆向排列,之後插入了所有編碼參數的檔案。
經過以上複雜到極點的步驟,得到的檔案是一個經過編碼、並且本身攜帶著重要參數的檔案。據說,如此經過三個層次以上簡單檔案命令操作的這麼一個檔案,能保障相當好的檔案安全。而LC數字是編碼和解碼過程都要知道的一個參數,另外提交給資料庫,由帳號密碼權限控管。
解碼的步驟,是將以上編碼步驟依反序一一撰寫反函數程式。
這樣的方法顯然有二大問題:
- 本方法顯露一項矛盾是:計算LP值是用LC對未插入EDT表的檔案長度LF取模數。令EDT表的長度為LE,最後的檔案長度已經改變為LF+LE了。解碼程式只知道LC和LF+LE,卻不知道LF和LE分別是多少。因此,求LP值的公式缺乏了足夠的資訊。對於精通協定設計的專家們,設計這種根據某些參數計算正確LP值的公式並不困難。然而,目前本方法的發表人並沒有在此細節上詳細說明太多。
- 本方法固然是個好概念,然而,在資訊安全領域所講的保安方法通常是藉由隱藏關鍵數字 (key) 來達到保障的效果,而不是藉由複雜的程式過程。
我撰寫本文、提出這個方法的目的,是希望展示出在學術界,非深入此領域的人可能會將問題看得太簡單,因此也將解決辦法的設計太簡單或是有錯。而雖然這個方法可能在學術領域講得很簡單、並且在產業界也可能偷偷使用這種比較普通的方式做資訊安全,但其實做出來的結果卻不夠好 (方法複雜卻容易破解,並且協定的關鍵數值沒有設計好) ---雖然很多人只求足夠的結果即可。
Monday, September 28, 2009
未經證實的小道消息--imoo msn機器人與plurk機器人 進行策略聯盟
近期會有針對plurk 機器人相關應用的簡介給大家參考,請拭目以待
Thursday, September 24, 2009
連繫真實與虛擬世界的RFID應用
Sunday, September 20, 2009
MSN機器人在校園e化整合的應用展示
承辦單位:中國文化大學
會議日期:2009年9月24日(星期四)、2009年9月25日(星期五)
會議地點:中國文化大學體育館8樓柏英廳〈臺北市11114陽明山華岡路55號體育館〉
詳細相關資訊請參考會議議程網頁。
http://eshare.moe.edu.tw
Wednesday, September 9, 2009
Wednesday, September 2, 2009
Monday, August 31, 2009
Adwords 上的 MSN機器人 廣告
各程式語言使用msnsdk範例請自行參考相關文章, 計有 c# java jsp vb asp php perl ...相關範例可供參考
MSN機器人行銷服務說明
平台測試申請流程
MSNSDK文件下載
ps.如欲 為文 介紹msn機器人程式撰寫相關...事宜,可洽 sonet.all@gmail.com , 我們會開免費的測試帳號供您使用
Thursday, August 13, 2009
謠言中的謠言--MSN掛上小太陽
當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
即時通訊機器人 最立即有效的行銷工具
推活動、養社群,比企業官網更靠近消費者
你的電腦開機上網時,第一個開啟的應用程式是哪一個?它可能是比瀏覽器還要早開啟、設定為自動登入的即時通訊軟體,高人氣與高黏性,成為潛力十足的行銷平台。其中不用睡覺、永遠在線的「機器人」,更是企業的最佳行銷專員。
即時通訊(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機器人獻身公益
互動優勢有限公司跨足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廣告詞
Thursday, July 9, 2009
分散式系統的複雜事件處理
基本層次的訊息、事件系統存在著一些問題。第一是要由網路上許多線路來偵測事件的發生;第二是代表事件發生的訊息量非常大;第三是為了製作事件的產生與偵測,通常在建立系統時將事件模型固定在系統中,使事件的偵測與使用變得比較不彈性。而系統中許多事件的發生可能造成系統的卡死或「當機」;無法準確判斷系統事件的類型,是大問題。為了處理這些問題,他們使用多層次事件觀點來處理事件的抽象化。基本上是將系統的活動分解再分解。
系統事件的層次分解,以生產線為例,可分為下層是通訊層、以及上層是工作流層。通訊層處理基本的通訊工作,包括廣播訊息、分派訊息、接收訊息、控制訊息等等。而生產線工作流層次,則需要若干事件有:產生大量訊息、載入大量訊息、消化大量訊息等等。「載入大量訊息」是一項虛擬事件,是由廣播訊息、分派訊息、接收訊息、和接受訊息等基礎事件組合成的。
在以訊息為本的分散式系統中,對於大量訊息,需要有過濾和映射的功能。過濾是指從儲存的事件中找到符合某個複雜事件組合樣式的一組事件。映射是指把一組事件當做輸入而產生另一些事件當做結果。於是,系統的抽象事件階層由下往上有下列構成:
- 分散式系統軟硬體裝置。
- 基本事件層。
- 過濾事件層:從基本事件層或過濾事件層,取出符合複雜事件樣式的抽象事件。
- 映射事件層:從過濾事件層取出符合複雜事件樣式的抽象事件。
- 因果事件。
- 事件過濾和映射的演算法。
- 由抽象層反推,解決基本層發生的錯誤。
Tuesday, July 7, 2009
用 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
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Live\Messenger
如果沒有 MultipleInstances,可自行新增一個,MultipleInstances 將 數值資料(DWORD 32-位元)改為1
Friday, July 3, 2009
事件處理詞表
摘錄
事件:任何已發生或打算要發生的事。
事件物件:用來表達事件的結構:例如訂單是事件物件,用來表達訂購事件。
虛擬事件:未實際發生,但需要用來象徵實際事件的事件;多半來自想像或模擬。
事件類型:事件物件的種類。
事件時間:屬於事件的時間值。
時間間隔:由二個事件時間所限定的一段時間;二個事件時間是指時間間隔的開始時間和結束時間。
即時事件:事件的時間間隔小於單位時間;也就是說,事件的開始時間和結束時間是同一個。
抽象事件:用來為一組事件做摘要、做註解的事件。
複雜事件:是一個抽象事件,所摘要、解釋的事件對象是它的成員。
衍生事件:被產生而做為一項結果,要再對其他事件做處理,的事件。
複合事件:是複雜事件,也是衍生事件,是用到如事件的分離、結合、順序等等運算方法將基本事件結合而成的事件。複合事件自然包含了從所衍生的基本事件。
Thursday, July 2, 2009
RFID中介軟體如何處理複雜的事件?
架構分為三個層次,由下層到上層依序為:
- 邏輯結構: RFID 事件源自讀寫機探測到的基本事件,而複雜的事件是由一些基本事件組成,或者,複雜事件也可以由另外一些複雜事件組成。
- 時間限制:在複雜事件結構中,可以加上時間限制的屬性。
- 事件偵測:應用前二層的產物,藉由複雜事件分析,向上回報究竟發生了哪些事件類型。
這篇文章對事件結構做了初步的正規描述,並使用 Petri Net 為處理工具。對第一層,邏輯結構方面,使用 Petri Net 延伸的模型 Composite Event Structure-layer Net 。對時間限制層面,使用 structured token and transition mark 處理。對事件偵測層面,使用 Petri Net 著色方法處理;但是本文尚未討論到 Petri Net 著色方法的細節。
邏輯結構
每一個基本事件,按照 EPCglobal 的說法,是讀寫機探測並回報在什麼時候「看見」了哪個 tag 。用大寫字母 A, B, ... 表示每一個基本事件的類型。於是,用到以下六項運算,可以處理許多基本事件之間的各種基本邏輯關係:
- 彙總: (A, n) 表示進來 n 個 A 事件。
- 分離: (A | B) 表示進來的事件是 A 或 B 。
- 結合: (A & B) 表示 A 和 B 二事件都進來。
- 否定: (~ A) 表示 A 事件沒有進來。
- 順序: (A; B, t) 表示依序有 A 和 B 二事件,而且二事件的間距在 t 時間區段之內。
- 內在: 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 相容資料處理
例如,感應器分四種類型:
- 水量感應器: A 廠製造,感應電導率、水溫、氯含量、酸度和渾度。
- 水位感應器: B 廠製造,感應水位。
- 水質感應器: C 廠製造,感應瞬時水質、累積水質、瞬間水速、累積時間。
- 雷擊感應器: 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機器人測試平台公告
Thursday, June 11, 2009
(翻譯) Erlang 程式設計第七章:並行風格
並行風格
人都知道何謂並行 對並行的深入認知,直接連通到我們腦內。我們能極速地對刺激做反射動作,是用到腦的一部份,稱為杏仁體。若少了這樣的反應,我們可能會死。有意識的思考動作太慢。而用到思考「快拉煞車桿」耗掉的時間,我們早就做了那個動作了。
行駛在幹道上的時候,我們心裡會打量十幾輛或百來輛車。這不經過意識思考。如果我們沒本事做到這種事,可能就會死。
世界是平行的 假如我們要寫一些程式,表現如同在真正世界中表現著的其他物件,這些程式會有個並行的組織方式。這是何以我們該用「並行程式語言」來寫程式。
然而我們很常用「循序程式語言」寫真實世界的程式。真是多餘的難。
用我們設計來寫並行應用程式的語言吧!並行程式開發會變得超容易。
Erlang 程式建構我們思考及感興趣的模型 我們不共用記憶。我有我的記憶,你有你的記憶。咱們是兩個腦袋,一人一個。兩個腦袋不會融合成一個。要改變你的記憶,我要對你送訊息,或者說,我要揮揮手。你聽到了,或瞧見了,你的記憶就會改變。不過,如果沒問你問題並看看你的反應,我不知道你有沒有收到我的訊息。
這是有 Erlang 程序的情況該是的樣子。 Erlang 程序沒有共用記憶體,每個程序有自己的記憶體。要改變其他程序的記憶體,你必須送個訊息,期望對方收到並了解訊息。要確定別的程序已經收到你的訊息,並且改變他的記憶體了,你必須問問他 (也送個訊息) 。這完全是我們都怎麼互動的模式。
煦:嗨,比爾,我的電話號碼是 45-67-89-12 。
煦:你聽到了嗎?
比爾:有,你的號碼是 45-67-89-12 。
這些互動模式是我們如此熟悉,從小到大我們都和這世界這樣互動,觀察它,對它送送訊息,然後看看反應。
人們發揮功用,如獨立個體般送訊息做溝通 這是 Erlang 程式做事的辦法,也是人們做事的辦法。所以,很容易學懂一份 Erlang 程式。
一份 Erlang 程式用許多成千或上百千的小程序構成。這些小程序獨立運作。它們彼此送訊息溝通。每個程序有自己的記憶體。它們表現得像一大房間的人群彼此在饒舌交談。
這讓 Erlang 天生就是簡單,容易維護並擴充。假定我們有十個人 (或程序) ,他們要做太多工作。可以怎麼做呢?找更多人來。而我們怎麼管理這些人呢?很簡單,就對他們喊口令 (或叫廣播) 。
Erlang 程序沒有共用記憶體,所以記憶體使用時不需要鎖定。有鎖的地方就有會有鑰匙,而有鑰匙就可能會遺失鑰匙。當你鑰匙掉了會怎麼樣呢?你會驚慌得不知道怎麼辦。在軟體發生的,則是當你丟掉了鑰匙,鎖定就造成錯誤。分散式軟體系統如果有鑰匙和鎖,都會出錯。
而 Erlang 可沒有鎖和鑰匙。
有人死掉,其他人一定會注意到 假如我在一個房間裏突然傾覆而死,有人可能會注意到。 Erlang 程序就像人們,他們有時可能死掉。但不像人們的是,人們死掉會用盡力氣叫出聲,而叫聲與他們的死因有關。
想想滿滿一整房間的人,有人突然倒斃了。像他們死的時候,會叫說「我的心臟──我要死了」或是「我的胃抽搐」。這就是 Erlang 程序所做的。一條程序可能死前說:「我死於除以零。」另一條程序可能說:「我死於向空串列要最後一項串列資料。」
現在在我們滿是人的房間裏,假想有位特定的仁兄,他的任務是清除遺體。假定有珍和尚二人,如果珍死掉,尚會修正對珍的死亡所有的錯誤。如果尚死亡,珍會修定那些錯誤。珍和尚是被無形的契約連成一體,約定若有一方死亡,另一方會修正所有造成其死亡的錯誤。
這就是 Erlang 怎麼處理錯誤偵測的方法。程序可以連成一體。如果一條程序死掉,另一條程序獲得一則錯誤訊息,指出前一條程序為什麼死掉。
基本是這樣。 Erlang 怎麼做事如以上所述。
現在我們學到的東西有:
- Erlang 程式由一大堆程序構成。這些程序可以彼此送訊息。
- 這些程序可能會接收訊息並瞭解訊息,也可能不會。如果你要知道訊息有沒有收到並解讀,你必須向程序送訊息,並等它回應。
- 成對的程序可以被連成一體。如果其中之一死掉,錯誤訊息會送給另一個程序,訊息中包含前一程序為什麼死掉的理由。
下一章我們開始寫並行程式。我們需要學三種基本項: spawn 、 send (這用到 ! 運算子) 和 receive 。然後寫一點簡單的並行程式。
當程序死掉的時候,如果有其他程序跟它連成一體,其他程序就會注意到。這是第九章的主題,「並行程式的錯誤」。
在你讀下兩章的時候,想著房間裏有一群人。人們是程序。在房間裏的人們有自己私有記憶,這記憶就是程序的狀態。要改變你的記憶,我就跟你講話,而你就聽,這是送訊息和收訊息。我們會有兒女,這是 spawn (生產) 。我們死掉,就是一條程序結束了。
Wednesday, June 10, 2009
ithome blog 與微軟bing搜尋 不合
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.
- blog.ithome.com.tw/index.php?blogId=1302
- · 庫存頁面
Wednesday, June 3, 2009
imoo msn機器人 行銷服務
imoo 提供2種創新的行銷服務模式
請問有範例可以參考嗎?
imoo msn 機器人應用概念圖 |
Monday, June 1, 2009
排列函數
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
解析
首先,我覺得取一列資料,如 [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] 這些。
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' xs = map f xs
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))
allPermu' xs = concat (map f xs)
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))
allPermu' :: (Eq a) => [a] -> [[a]]
allPermu' [] = [[]]
allPermu' xs = concat (map f xs)
where f = \x -> map (x:) (allPermu' (filter (x/=) xs))
map (map (\x -> [1, 2]!!x)) [[0, 1], [1, 0]]
allPermu xs = rs
where rs = map (map (\x -> xs!!x)) (allPermu' [0..((length xs)-1)])
Monday, May 25, 2009
什麼是情境感知
(自訂標題) 情境感知的定義
Saturday, May 23, 2009
(翻譯) 寫程式:從「如何」到「什麼」
- 展現方面的元件
- 資料庫方面的元件
- 由商務功能本身定義出來的元件
Tuesday, May 19, 2009
imoo msn機器人即將支援 傳遞客製化表情符號
Thursday, May 14, 2009
在企業組織裡設計的挑戰
在書中,「設計」一詞幾乎都是指「開發資訊系統」。
標色文字是我的註解。
在企業組織裡設計的挑戰
誰能說一套系統將能做什麼?真是行銷部門或系統分析師說:「搞出這個」,就能教開發團隊只跟隨規格做事嗎?或者,行銷人員或分析師真的只要說:「弄出『這一類的』東西」,開發團隊其實決定做他們想要做的以及決定系統該是哪個樣子?事實上,兩方人馬都要擔任說明新系統是什麼長相的角色──在企業組織裡,建立一套系統是他們這些人合作的結果?
下層的問題無可逃避。今日的系統太大,很難教一個人做完。所以企業組織把規定和建立系統的流程分為幾個部份,把每個部份指派給一小群人。每群人又特定他們負責的部份,與其他處理其餘部份的人失去聯係。在開發系統的事情上,有四個問題該答,這些問題傾向於將開發流程自然分割。所以很容易指定一群人回答一個問題。問題有這些:「工作中有哪些事項」──該認定工作的哪幾個方面;「該如何應對」──團隊該用什麼系統做應對;「系統該如何架構」──到底有什麼功能、功能的規劃、以及系統架構,能適合工作的需要;以及「我們做得怎麼樣」──所設計的系統真的能為客戶服務嗎?
(「工作中有哪些事項」──該認定工作的哪幾個方面 )
頭一個問題 (「有哪些?」) 是問,有哪些客戶的工作活動是新系統該認定的,有哪些提議或問題該克服、有哪些角色和工作項目有必要支援。指定回答這個問題的那群人是行銷人員或商務分析人員。在管理工作會改變企業組織的時候,他們常下指令定義企業資訊系統有哪些是要項。他們說:「採購的費用太多了。給每個部門一張信用卡,只有授權才准使用」、或說「咱們的化學資料庫是咱們的命脈。把所有資料庫跟公司綁在一起。」或者,行銷部們可能會告誡工程團隊說:「設計一項產品支援公司的計劃。」或「讓產品放到網路上。」這些指令說了好多高層次的工作方面的事項,要系統能夠幫忙,卻沒有實際定義系統。把產品放到網路上,影響工作的哪方面呢?把資料庫都綁在一起,意思是一個資料庫呢、重複的資料庫呢、還是一種搜索許多資料庫的方法?在那些設定方向的觀點上,上述問題則是細節,他們不必回答這些小問題。
(「該如何應對」──團隊該用什麼系統做應對 )
回答這些小問題,意味要說要應付些什麼:公司將要如何回應這些有關系統設計、流程、服務、以及發行策略的議題。行銷人員可能是定義回應方式的參與者,但除了公司都是技術導向之外。需求分析人員可能也是參與者,但除了這些人真的太不懂技術了,就要是開發人員來做了之外。客戶自己應該要涉入內部系統,因為系統定義了他們要怎麼工作。行銷人員和分析人員可能要得到正式許可「發展系統規格」,但是依照經驗,他們不在必須寫程式的層面中定義系統的行為。「他們丟了一份規格給我,」開發人員都這樣對我們說。接著,「但是老是有太多我們要決定的事情,而他們通常只問我們那些不夠實際的事情。所以這個叫做交換意見。」
(「系統該如何架構」──到底有什麼功能、功能的規劃、以及系統架構,能適合工作的需要 )
決定要怎麼架構系統,意味要具體決定要納入什麼功能,具體上系統怎麼動,還有系統會怎麼顯現視窗、選單或畫面。這幾乎都是開發人員做的事,也表示他們要了解使用系統的工作環境。要不然他們不能做什麼對客戶好的決定。開發團隊無法從行銷人員或分析師手中拿到客戶資料。做出詳細的系統架構仰賴於額外一層的客戶資料,開發人員要自己拿到──或者是,自己做出感覺對的系統。有些公司又走得很遠,把開發團隊擺在與他們客戶和分析師有差別的地位,創造了一群專精在他們設計工作中的人力。但那只是弄得需要更多溝通,而且如果缺少車馬費,就造成更嚴重的孤立。
(「我們做得怎麼樣」──所設計的系統真的能為客戶服務嗎 )
最後一個設計的問題,說,「我們做得怎麼樣?」這個問題是和客戶核對系統的進度,確認它還是個對的系統,而且在細節層次改動程式不會讓系統變得不能用。這個問題經常分割出去給一組可用度研究團隊或品質保障團隊做測試。回答這個問題,是檢查系統本身 (看看 bug 和是否符合規格) 以及跟使用者一起測試系統。但無論哪方面,處理檢查結果都是開發者的工作。所以,他們必須接收回報訊息,還要了解它並相信它──那表示他們要買進取得回報訊息的程序,並且信任收集回報訊息的人。並且經常是,到目前為止都沒有真的取得實際資料做設計,在這個時候發現的缺陷都是很基本,他們在開發階段很難確實找到的。
這些定義系統該如何的不同部份,若系統設計程序要啟動,就要一起做。界定應對方案的人要能答覆真實的問題;建立系統的人要建構他們認同的應對方案。但是,要保持每個問題都分別由指定的人來處理,會造就組織之間的溝通難題。開發的正式文件掌握擬定的設計方案,也要盡力控制各群人馬之間的溝通和歧見。「你們簽了協議。表示你們承諾了。」「是,不過我們已經了解並且真的不需要。」或「是的,但是我們與這位重要客戶談過,若我們沒有碰上需要,就沒有必要出貨。」或「是,但是依現有的技術我們真的沒能力實作。」
組織裡的設計,與在各群人之間發展同一凝聚的方向有關:符合他們打算交付的公司應對方式。並不是永不改變,而是在改變時,整個企業組織在各種功能上可以適當地回應,而不是將改變轉換為兩方人馬的叫囂。反過來說,同一凝聚的願景仰賴於在公司應對方向的發展之間多加考慮不同的觀點。行銷和分析人員需要科技方面的展望,看見新系統種類的契機。開發人員需要行銷觀點來看清為什麼有些走向造就好產品,有些卻不能。又需要分析師的看法,看到他們要處理的工作要點。資訊科技團隊需要客戶的看法,確定自己提議的工作流程變更很合理而且可採用。在他們發展出公司的應對方式之後,他們可以同時有效地做事,並且不會迷失方向。但是,在突出的設計上,跨功能團隊做得最好。
實際環境中的工作團隊
建立跨功能團隊來做一同的設計會執行出真實企業組織裡某些意外的問題。想想一個基本問題:這樣的團隊要符合什麼期待?快速檢視大部份組織的實際結構,就發現他們都做到讓人們分開。最常見的開發工作環境是小方塊,是一塊夠大的一人空間,可以舒服地做事,有電腦和桌子。但是那個區域沒有大到可以讓幾個人一起舒服地工作,也沒有一塊大的隔牆空間讓一支團隊工作。當然另外有會議室,但會議室的特色就是只能預約並共用幾個小時。因為預約時間有限,能提供的工作只是短時間完成的事情,不超過半天。以超過標準的方式預約這個房間,同事的樣子會讓你擺臭臉。畢竟是在浪費一塊公用空間。不但如此,因為房間是共用的,你不能擺太多東西。每次對談要從頭開始,每次會議要重新攤開設計圖。
所以會議室支援的工作是在能短時間做好,而不需要實體支援的類型──不要硬體、不要圖表,沒有你不能捲起來帶著走的東西。也許有網路線,但要接上哪個區域網路呢?網路品質還不錯吧?接上筆記型電腦怎麼樣呢?有這些限制,會不會有開發人員和工程師覺得開會浪費時間呢?有標準規模的公司的實體架構明白地說,真正的工程都在小方塊裡做成的,而人都來到會議室則是他們沒有真在做事。企業的普通結構,沒有可以支援面對面溝通而能啟動系統設計的。
管理面對面的設計
一同有效地工作,意思是擁有在其中能真正工作的場所,讓許多人面對面地完成工作。也意味了賦與人們人際能力和流程,使他們的聚集比較有效。有一位部門主管指出一件棘手的問題,是在當地旅店訂房間讓五位資深架構師待著,並告訴他們,如果不在一週內提出解決方案,就要辭退他們。他得到結果,而我們發現如果人們有合理的工作過程,通常會比較快樂、有創造力,並且更快產生結果。對程序的典型回應是「感謝你,我現在終於知道該做什麼。」即使痛恨程序的人也會這麼說。
一起工作是一種新技能。是學校沒教的事,也是工作很少教的事。一起有效地工作,意味要懂得怎麼時常維持設計方面的對話,要怎麼用心到工作要項而不是其他事情上,要怎麼掌控每個人的特質,還有要怎麼發現並指出歧見的根本原因。如果團隊不這樣做,他們的工作就會因為人們處理歧見的模式與保持他們愉快的工作凝聚力之間的取決,而遭受損失。
人們處理歧見的一種主要的模式是政治交易:「我覺得你弄錯了。但是,如果你給我一些對我來說比較重要的東西,我就容得了你。」政治交易帶出一套以拼湊為主的系統,缺少具備向心力的主題。而且政治交易讓團隊的每個人都減少對設計工作投注心力,因為每一位都至少要認同一個人的決定,而他認為那個決定是錯的。
也有其他處理歧見的方法,但是大都不夠好。有一種方法是妥協,說:「你說我們要把什麼都做成對話方塊,但我覺得應該要做成按鈕才對。所以,兩種都做,我們誰都高興了。」誰都高興了,不過使用者不高興。他們有一打達到功能的辦法,但是沒有好的理由說明哪個辦法比較好。或者,會有教師式的歧見處理方式,說:「大師最聰明,而且什麼都懂。我們要跟著做大師所說的。」這很好,但除了在科技環境、圖形使用者介面設計、使用者實際工作、行銷、專案規劃、以及其他能力方面,這些絕對不錯的大師們所佔的人口數少到幾乎沒有。
情境設計 (Contextual Design) 規定一種發展系統的過程,可以帶出人際技能的價值。規定了根據資料來取捨各種開發選項,所參考的資料不包括爭議和政治交易。情境設計規定了人該扮演的角色,能在設計的過程中一直保持討論。不但要讓設計的過程比較有效率,還要因為人們爭議並沒有進展而將系統暫時擱到一邊。
前端系統設計讓我們著眼於人際的課題,因為設計程序的這一部份會帶來由面對面影響得很深的不一樣的功能。傳統的設計較不帶出著重在一起工作的技能。致力於保持客戶工作的凝聚力,而排除團隊中不同的看法和不同的能力,會使認知到如何一起工作變得很重要。我們發現,在人們該進行明確的流程、扮演明確的角色時,那時他們會對個人風格很敏感,使他們在房間裡起衝突。而當他們有具體的資料可以根據以設定決策,就會跨過隔籬,一起有效地工作。
這就是以客戶為中心的意義:不只做到客戶導向的設計,還要讓設計流程將系統帶往能讓客戶的工作──從開始到實作──能凝聚在系統中。對情境設計的挑戰是內建在方法中,要瞭解一同工作的要點,還要提供有效工作的辦法。
Wednesday, May 13, 2009
MSN換暱稱 相關行銷活動資訊
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
設計的挑戰──在與客戶保持聯係方面
文中有下列角色:
設計團隊: design team ,就是開發人員。
開發人員: developers ,就是設計團隊或設計者。
企業: business ,就是客戶、提出需求和出資的公司。
資訊科技部門: IT department ,就是今日名上有「資訊」、「科技」等字眼的公司。
角色: role ,就是在資訊科技部門或企業中,有各種不同的職稱、做不同工作的人。
設計的挑戰──在與客戶保持聯係方面
如果從密切瞭解客戶方面出發、來做設計,是最基本的事,為什麼那麼難做到呢?產品開發公司發起的時候,他們創造了讓設計者與客戶分隔的組織方式。剛開始是要設計者由與潛在的客人對談,以幫助銷售。但是當公司成長了,就發展出銷售部門做應對客戶的介面;安插了操作代表 (account representative) 控制業務部門;安差了行銷和產品管理部門。這些走向使設計者甚至和銷售人員分隔了。剛開始是把設計者擺在客戶服務線上。但是當公司成長了,有一個完整部門搞定客戶服務任務,還有正規的介面對開發工作提出回饋意見。開發者被孤立,無法直接接到客戶回報他們工作的好壞。我們跟一些開發人員談過,他們與客戶之間真是孤立;在另一方面感到無力的是,因為覺得自己無法修正客戶發現的問題,他們甚至不想跟客戶談談。
資訊科技部門有一個不同的理由對駐留在客戶那邊感到有困難。在公司成長時,他們也是動輒與客戶分隔,但可行的不同方式都伴隨著問題而來。他們創造新角色──商務、系統、或需求分析人員──在客戶和開發者之間做翻譯,卻發現客戶仍相信資訊科技部門不了解他們的東西。其他的角色則不和客戶創造有密切工作關係,也不為了開發人員創造無阻礙的不干涉局面。
為了控制變動的需求,資訊科技部門做了收尾舉動,但是客戶的優先順序和需求還在改變。因此他們把開發人員安排在所服務支援的企業人員身邊,就可以就近影響企業的工作。他們弄好了客戶關係,卻意味了資訊科技部們不能分享資源和專業,也不能做為看穿整個企業資訊系統的關鍵角色。所以,他們決定他們太沒組織了,就把人都再拉回來,並重新導出了孤立的問題。
在資訊科技部門,這種震盪是個典型,但是終究錯失重點。任何對人的安排都跟著伴隨著問題,所以唯一的解決辦法是瞭解問題並加以處理。資訊科技部門需要和客戶保持一些距離,以看清不同部門之間造成的衝突,並規劃系統將企業視為整理來處理問題 (連同對系統出資的方式)。同時,他們需要讓他們和客戶保持密切夥同關係的機制。
以上就是情境設計 (Contextual Design) 的挑戰:要讓設計團隊明瞭他們的客戶,要給他們足夠的距離能以整體觀──能看透企業或看透一個市場──來看工作的實務。這個過程同時還要讓設計團隊徹底以「什麼是對客戶較實在」的知識做為基礎。
Tuesday, May 12, 2009
Erlang gen_server 行為解析
授權聲明:本篇是由 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([]) ->用 ets 建立資料表並傳回。 ets 是內建的記憶體資料庫。在部署的程式中,這或許有時有些 ... 耐久。 gen_server 的關鍵元件是程式狀態。在本例中,你將看到 Tab 被丟來丟去,丟到每一樣程式單元中,表達現有的錄影帶店狀態 (誰購買了什麼片) 。
Tab = ets:new(?MODULE, []),
{ok, Tab}.
handle_call({checkout, Customer, Movie}, _From, Tab) ->記得之前說的一點 gen_server:call(...) 嗎?這是 gen_server 呼叫的東西。你們可能想知道為什麼 handle_call 定義了二個函數,而且引用相同數量的參數 (參數數量表達為 /x ,如 "functioname/2" 裡面的 /2 ) 。看它第一個參數,是有三項的一列記錄。再看看
Response = case ets:lookup(Tab, Customer) of
[] ->
ets:insert(Tab, {Customer, Movie}),
{ok, Movie};
[{Customer, OtherMovie}] ->
{already_checked_out, OtherMovie}
end,
{reply, Response, Tab};
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) ->這個 handle_call/3 定義一個函數檢查看看客人有沒有購買了影片。如果有,傳回一筆記錄包含了客人和電影的名字。如果沒有,則傳回 none 。 (我說:重講一次,應該說是找得到一筆記錄符合 {Customer, Movie} 就傳回電影名稱,否則,如果找不到就傳回 none 。) 我不要講這個太多,因為以正在講的 handle_call/3 來說,這個東西太細。
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}.
這段程式要擺在那邊,使 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