About Me

我的相片
台北市, Taiwan
我是方選,
方白科技(finebind tech.)共同創辦人,
臺大資管所畢,
希望能幫助更多的人!

FB: http://fb.com/function1122
LINE: http://bit.ly/1foeZft (手機開啟點擊網址自動加入)

最新15則讀者回應

最新文章

FUNction's 上課筆記

Label Cloud

Blog Archive

FeedBurner

追蹤者

[教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒)

FUNction 於 2008年7月22日 晚上9:26 發表
大綱:透過API 將事件新增到Google Calendar 上,並設定發生前五分鐘用簡訊提醒
前言
久等了!最近小弟有點低潮,所以這篇拖了一段時間才發出。建立事件我覺得是個最有趣的環節,另外我特別企畫設定成讓Google 發簡訊到你的手機,提醒你事件要開始囉!

新增一筆事件
透過首頁建立事件的表單,將事件傳送到new.php 去建立。建立完成後顯示建立成功的訊息,並將剛剛建立的事件復誦一次。

在首頁建立表單
其實之前的範例包首頁的表單已經打好了,我這邊再做一次是給光是看文章學的人。請在index.php 的 <body>標籤下加入以下html 語法

<form action="new.php" method="post" name="GClab" id="GClab">
<h2>新增事件</h2>
<p>*標題
<input name="title" type="text" id="title" size="20">
<br>
內容
<textarea name="content" cols="60" rows="5" id="content"></textarea>
<br>
地點
<input name="where" type="text" id="where" size="20">
<br>
*開始日期
<input name="startDate" type="text" id="startDate" value="2008-07-13" size="10">
時間
<input name="startTime" type="text" id="startTime" value="17:55" size="6">
<br>
*結束日期
<input name="endDate" type="text" id="endDate" value="2008-07-14" size="10">
時間
<input name="endTime" type="text" id="endTime" value="03:55" size="6">
(請依照範例格式)<br>
<input type="submit" name="Submit" value="送出">
</form>
<hr />

這是一個表單,將事件送到new.php 去處理。

登入Google 服務&接變數
接著我們建立new.php 網頁,並先打入以下程式碼,我相信看系列文章的讀者可以知道一樣是登入Google ,然後我們用$_POST 去取得index.php POST 過來的變數。new.php 接收了事件的標題(title)、地點(where)、內容(content)、開始日期(startDate)、開始時間(startTime)、結束日期(endDate)、結束時間(endTime)等資訊。
<?php
include('config.inc.php');

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // 提供Calendar 的服務名稱
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
$gdataCal = new Zend_Gdata_Calendar($client);

//Title 和when 是必要的欄位,這邊做個防呆
if($_POST['title'] != ''&& $_POST['startDate'] != ''&& $_POST['startTime'] != ''&& $_POST['endDate'] != ''&& $_POST['endTime'] != ''){
$title = $_POST['title'];
$where = $_POST['where'];
$content = $_POST['content'];
$startDate = $_POST['startDate'];
$startTime = $_POST['startTime'];
$endDate = $_POST['endDate'];
$endTime = $_POST['endTime'];
}else{
die("[<a href=\"./\">back</a>]<hr /><b>Warning</b>: Too few arguments.");
}
?>

如果首頁傳過來的變數不足,就顯示Too few arguments. 的警告,die()讓程式不要繼續執行。值得注意的是這邊開始日期與開始時間是分成兩個變數去抓,但是等一下還是會透過程是去處理成一個Google 看的懂的格式(結束時間、日期亦同)。

建立單一事件
請在上述程式碼尾端?>前加入以下程式碼:
$calendarURL="http://www.google.com/calendar/feeds/".urlencode($calendarID)."/private/full";

$newEvent = $gdataCal->newEventEntry();
$newEvent->title = $gdataCal->newTitle($title);
$newEvent->where = array($gdataCal->newWhere($where));
$newEvent->content = $gdataCal->newContent($content);

$when = $gdataCal->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000+08:00";
$when->endTime = "{$endDate}T{$endTime}:00.000+08:00";
$newEvent->when = array($when);

//當上傳事件後,Google 會回傳相同的事件,我們就可以得知這個事件的ID 了
//這裡值得注意的是第二個參數,指定上傳到我第二本日曆
$createdEvent = $gdataCal->insertEvent($newEvent, $calendarURL);

一開始做了一個變數$calendarURL 是因為我想要把事件加入到我第二本日曆,如果沒指定則會預設新增道第一本去。接下來我們就使用他寫好的方法將事件建立成物件,比較需要注意的是startTime 與endTime 的格式,尾端的+08:00 是因為我位在台北,是+8 時區,如果沒有寫時區會亂掉唷。

最後使用insertEvent() 建立事件,第二個參數$calendarURL 是指定新增道的日曆,不寫就會新增到預設日曆。當建立完成後,Google 會把事件回傳到$createdEvent 裡面,所以我們可以用$createdEvent->id->text 去找出事件建立完成後的ID。

建立簡訊提醒
簡訊提醒我故意透過修改事件的方法去新增,這樣也可以體會一下修改的方法。要使用簡訊提醒必須要先讓手機通過Google 的認證,這裡可以參考Google日曆也能寄簡訊通知你的行程事項(SMS) 香腸炒魷魚 這篇文章設定手機,在此就不贅述。請在?>前加入以下程式:
//到這裡已經完成事件的建立了,接著騷包一點讓他來個簡訊提醒吧
//目前網路上的範例提醒不能用,因為他把reminders 打成reminder 了
$query = $gdataCal->newEventQuery();
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setEvent($createdEvent->id->text);
$event = $gdataCal->getCalendarEventEntry($query);
$times = $event->when;
foreach ($times as $when) {
$reminder = $gdataCal->newReminder();
$reminder->setMinutes(5); //五分鐘前提醒我
$reminder->setMethod('sms'); //用簡訊
$when->reminders = array($reminder);
}
$eventNew = $event->save();

這裡要注意的是就連Zend 官網範例與Google 的PHP 範例都把$when->reminders = array($reminder);寫成$when->reminder = array($reminder); 所以範例會有問題。另外提醒除了sms(簡訊)之外,還有email 與alert 。email 會將提醒寄到你的信箱;alert 則是在Google Calendar 上彈出一個javascript 的alert()。最後,這裡使用$event->save();將修改後的事件儲存。

建立網頁顯示
?>後面加入以下html 語法,顯示事件建立成功的訊息,並使用建立成功事件回傳的$createdEvent 顯示建立事件的細節,告知使用者剛剛完成的建立。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FUNction's Lab 讀取Google 行事曆 :: <?=$createdEvent->title->text?></title>
</head>
<body>
[<a href="./">上一頁</a>] [<a href="delete.php?id=<?=basename($createdEvent->id->text)?>">刪除</a>]
<hr />
<h1><font color="red">事件建立成功!</font></h1>
<?php
echo "<h2>" . $createdEvent->title->text . "</h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$createdEvent->content->text."</li>\n";
foreach ($createdEvent->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";//地點
}
foreach ($createdEvent->when as $when) {
echo "\t<li><b>開始時間:</b>" . $when->startTime . "</li>\n";
echo "\t<li><b>結束時間:</b>" . $when->endTime . "</li>\n";
}
echo "\t<li><b>事件ID:</b>".basename($createdEvent->id->text)."</li>\n";
echo "</ul>\n";
?>
</body>
</html>
這邊顯示的方法跟上一篇顯示單一事件如出一轍,我想應該很好明白。

結語
我想今天應該還蠻讓人興奮的,做到這裡已經幾乎可以使用了,只剩下刪除事件。刪除事件是我的最後一篇了,我打算在那篇列出我所參考的資料,希望對持續開法的人能有拋磚引玉的功效。

範例程式下載:GClab-part-4.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件
下一篇[教學] 在PHP 中使用Google Calendar API - END 刪除事件(含補充)
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒)

誠實地想你

FUNction 於 2008年7月18日 晚上10:15 發表
最近聽到這首歌...總會覺得好心痛,因為好像你對我在唱

你...究竟在哪裡呢?
繼續閱讀全文 誠實地想你

[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件

FUNction 於 2008年7月17日 晚上9:40 發表
大綱:透過API 取得Google Calendar 的單獨事件
前言
經過前兩天的練習,樣子已經大概出來了,今天來做檢視單一事件的頁面,我想說不定你已經try 出來了!

檢視單獨事件資訊
我們希望在event.php 這頁列出單獨的事件,為了讓成是抓到事件,所以我們用?id=帶參數傳過去。

登入Google 服務&接變數
請開啟event.php 鍵入以下程式碼(跟上一篇一樣),為一要注意的是我在第二行加入$eventId,是從$_GET變數抓出來的值:
<?phpinclude('config.inc.php');
$eventId = $_GET['id'];

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // 提供Calendar 的服務名稱
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
$gdataCal = new Zend_Gdata_Calendar($client);?>


取得單一事件
請在上述程式碼尾端?>前加入以下程式碼:
//接下來這邊就是讀取某個事件的方法
$query = $gdataCal->newEventQuery();
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setEvent($eventId);

try {
$eventEntry = $gdataCal->getCalendarEventEntry($query);
}catch (Zend_Gdata_App_Exception $e) {
die($e);
}

需要注意的是這裡跟上一個範例不同的是使用getCalendarEventEntry 這個方法來讀取事件。我們使用setEvent()傳入$eventId 參數設定查詢事件,如果不給參數預設會抓最後被修改的事件。此外,我在這邊做一個try-catch,這是比較保險的做法,不過其實這裡不加是不會怎樣的。

建立網頁呈現
請接續程式碼,在?>下面加入以下html 語法
<html>
<head>
<meta http-equiv=" content="text/html; charset=utf-8"
<title>FUNction's Lab 讀取Google 行事曆 :: </title>
</head>
<body>
[<a href="./">上一頁</a>] [<a href="delete.php?id=">刪除</a>]
<hr />
</body>


加入PHP 語法
請在<hr />與</body>中加入以下PHP 程式,這裡其實跟上一篇大同小異,只是多讀取了開始時間(startTime)與結束時間(endTime),值得注意的是這兩個值跟地點(where)一樣是用foreach 讀取的。
<?php
echo "<h2>" . $eventEntry->title->text . "</h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$eventEntry->content->text."</li>\n";
foreach ($eventEntry->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";//地點
}
foreach ($eventEntry->when as $when) {
echo "\t<li><b>開始時間:</b>" . $when->startTime . "</li>\n";
echo "\t<li><b>結束時間:</b>" . $when->endTime . "</li>\n";
}
echo "\t<li><b>事件ID:</b>".basename($eventEntry->id->text)."</li>\n";
echo "</ul>\n";
?>
此外,如果要讀取修改的時間,我們可以使用$event->updated->text。

編輯網頁title 與刪除連結
幾乎大功告成了,最後為了使網頁標題能列出事件名稱,我們將
<title>FUNction's Lab 讀取Google 行事曆 :: </title>
修改成
<title>FUNction's Lab 讀取Google 行事曆 :: <?=$eventEntry->title->text?></title>


然後將刪除的連結設定傳入ID,原本如下(刪除在最後一天才會實做):
[<a href="delete.php?id=">刪除</a>]

改成
[<a href="delete.php?id=<?=basename($eventEntry->id->text)?>">刪除</a>]


結語
也許你覺得今天沒有學到很多,反正就凡事起頭難,那是因為你已經跟上了吧。接下來就是比較有趣的新增事件囉,敬請期待啦 :-)

範例程式下載:GClab-part-3.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表
下一篇[教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒)
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件

[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表

FUNction 於 2008年7月14日 晚上7:07 發表
大綱:透過API 取得Google Calendar 上的事件列表
前言
在建立完config.inc.php 之後,我們來牛刀小試,把我們在Google Calendar 上面建立的事件撈出來吧。

建立事件列表
希望在首頁把所有的事件列出來,所以我們打開GClab 資料夾,在下面建立index.php。

登入Google 服務
請開啟index.php 鍵入以下程式碼:

<?php
include('config.inc.php');

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // 提供Calendar 的服務名稱
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
$gdataCal = new Zend_Gdata_Calendar($client);
?>

第一行是把上一篇的設定檔include 進來,接下來三行是建立Client 登入Google 的服務。到這邊的已先run一下,確定一下自己帳號密碼沒有打錯。

讀取Google Calendar 上的事件
請在上述程式碼尾端加入以下程式,這裡使用getCalendarEventFeed 來讀取多個事件。

//接下來這邊就是讀取某本日曆的方法,據說最多只能列出25筆資料
$query = $gdataCal->newEventQuery();
//原始範例中setUser給的參數是'default' 這樣的話是開啟範例中$client的主日曆
//但由網頁說明中我們可指定User 來開啟任何一本日曆,例如這邊我設定成第二本日曆的ID
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$eventFeed = $gdataCal->getCalendarEventFeed($query);

這裡值的一題的是setVisibility ,對於私有的日曆需要用private 的方式開啟,可是設成公開的日曆private 和public 都可以開;此外,setOrderby 就是讀取出來的順序,參數starttime 就是依照事件開始時間,由新到舊列出。

建立網頁呈現
請在上面程式碼?>的後面加入以下html 語法,我們要開始建立流覽畫面:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FUNction's Lab 讀取Google 行事曆</title>
</head>
<body>
</body>
</html>


加入PHP 語法
最後一步了!在網頁中加入PHP 語法以顯示每個事件,這邊只列出事件的名稱(title)、內容(content)和地點(where)。如果要看事件的詳情,我希望點選事件標題,會由下一個網頁呈現。為了讓下一個網頁之道是哪一個事件,所以我把事件的ID 傳入。請在上述html 的<body>這裡</body>加入以下語法:

<?php
foreach ($eventFeed as $event) {
echo "<h2><a href=\"event.php?id=".basename($event->id->text)."\">" . $event->title->text . "</a></h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$event->content->text."</li>\n";
foreach ($event->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";
}
echo "</ul>\n";
}
?>
值得注意的是從API 中取出的事件ID 會以一個網址方是呈現,例如http://www.google.com/calendar/feeds/default/private/full/d72ts7587anu8vgu2gsrq9bl3k 所以我用PHP 的basename() 去取得最後一個slash 後的字串。此外,地點(where)是以陣列的格式出現,所以還要再用一個foreach 去解他,有點奇怪,但我也不知道為什麼。

結語
今天我們已經學會把Google Calendar 上的事件撈出來了,下一篇將會介紹如何去讀取單一個事件。希望這些文章對你有幫助喔!

範例程式下載:GClab-part-2.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 1 環境建立
下一篇[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表

[教學] 在PHP 中使用Google Calendar API - Part 1 環境建立

FUNction 下午3:11 發表
大綱:建立Google Calendar API 的PHP 環境。
前言
如果你是一個PHP 的開發者,想玩玩Google Calendar API ,想必這篇文章令你興奮。接下來的範例,包含使用PHP 對Google Calendar 新增、查詢、刪除。而且每一篇都會附加當篇程式碼的.zip檔案,希望能對所有PHP 的開發者有幫助。


範例
先讓你過過乾癮,這個小小的網站就是透過Google Calendar API 將資訊存在Google Calendar 上,也是接下來幾天的Lab 要做的,你可以試著新增、刪除事件,然後每個事件會在發生前5分鐘透過Google 傳簡訊通知我: http://functionlab.org/GClab/ 。當你新增事件之後,可以到Google 的畫面去檢視被寫入的事件:FUNction's Lab 公開日曆

讓我們開始吧
如果你不知道什麼是Google Calendar ,或是日曆裡還沒有建立事件,請參考Google Calendar (行事曆/日曆) 使用教學,因為接下來的程式會需要讀取你自己的日曆,請務必先手動建立幾筆事件。還有你要有心理準備,今天幾乎碰不到程式,今天的目標是把環境建立起來。

使用Zend Gdata
假設你的機器已經可以執行PHP 了,而且PHP 的版本在5.0.4 以上。我們必須先取得Zend 公司的Gdata 函式庫,請造訪http://framework.zend.com/download/webservices 下載最新版本(在本篇末也提供包好的函式庫+範例檔案,所以你也可以直接從我這邊下載)。下載之後,解開壓縮會是一個資料夾,其實只有library 資料夾需要用到而已。


建立檔案架構
在你可以執行PHP 的網站根目錄(可能名為htdocs, www, wwwroot...)開一個資料夾,就把它取名為「GClab」吧,代表Google Calendar 的練習。然後接著把剛剛下載來的library 資料夾複製到GClab 之下,這樣檔案架構就搞定了!

建立config.inc.php 檔案
如果要讀取你的Google 日曆,會需要你的Google 帳號、密碼。如果你需要指定讀取哪一本日曆,還會需要他的ID。

我們在GClab 資料夾下建立名為config.inc.php 的檔案,內容如下:
<?php
//以下欄位請依照自己需要調整
$googleAccount = 'myname@gmail.com'; //Google 帳號
$googlePassword = 'mypassword'; //Google 密碼
$calendarID = 'myname@gmail.com'; //Google Calendar 的 ID
?>

這邊要注意的是$calendarID,如果你只有一本日曆,那Calendar ID 會跟你帳號一樣,如果建立了第二本日曆,可以在Google Calendar 的左下角「管理日曆」,點選第二本的日曆名稱,拉到最下面看到(如左圖)。


接著,我們要讓系統能載入Gdata 函式庫,所以我們要在剛剛的檔案中加入一些include path 的設定:
//這裡透過程式碼動態修改php.ini 的include_path 值
//告訴系統Zend Gdata Library 的位置
$slash = (strstr(ini_get('extension_dir'), '/'))?"/":"\\"; //Windows 與Unix 的斜線方向不同,需要考慮到
$includePath = dirname(__FILE__).$slash.'library';
ini_set('include_path', $includePath); //動態設定php.ini

//這邊是在設定程式把Zend Gdata Library 載入程式碼中
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');


最後,我們在瀏覽器輸入http://localhost/GClab/config.inc.php 。只要不出現錯誤訊息,就代表今天的練習成功啦!順便很興奮的告訴你,我們已經完成一半了。

範例程式下載:GClab-part-1.zip

下一篇[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 1 環境建立

Google Calendar (行事曆/日曆) 使用教學

FUNction 於 2008年7月13日 晚上11:25 發表
前言
也許你像我一樣早就聽過Google Calendar ,也用了一下,但發現沒啥好用的,自己也沒寫行事曆的習慣,手機又不夠新穎,不能直接把事件上傳到Google Calendar 裡,行事曆對你來說一點也不好玩。但是,平均一天收0.幾封簡訊的我,偶爾Google 傳個簡訊通知一下,也感覺蠻溫馨的啦XD,所以讓我們來試試看怎麼用手機收Google 傳來的免費簡訊吧!

申請Google Calendar 帳戶
請先到http://calendar.google.com/ 。假設你已經有Google 帳戶,第一次登入Google Calendar 可以看到如右畫面,這時就填寫你想要用的姓名,以及選擇時區,例如台北是+8時區。設定完之後就可以開始使用Google Calendar 囉!

接著英文可能看不習慣,可以從Setting 把顯示語言改成中文,這邊就不帶大家一步一步做啦。

建立事件
建立事件有好多種方法,這邊講兩種。第一種方法是最簡單的:
請依照圖示操作,例如新增自己的生日。

第二種方法較為複雜,可以詳細設定事件開始、結束的時間,請點選網頁右上角Google Logo 下面的「建立活動」,你可以看到以下畫面,我有稍微填寫範例。


在事件開始前,讓Google 傳簡訊通知你
這邊我在網路上找到一篇很好的文章,按照文章的步驟設定就可以啦。Google日曆也能寄簡訊通知你的行程事項(SMS) 香腸炒魷魚

做到這裡,我想你一定跟我當初看到文章一樣迫不及待,馬上讓Google 傳封愛的簡訊給自己吧!

結論
教學就寫到這裡啦,這遊戲我玩了三天才膩XD
繼續閱讀全文 Google Calendar (行事曆/日曆) 使用教學

全面禁用免洗筷真的比較環保嗎?

FUNction 於 2008年6月19日 下午5:10 發表
今天去7-11 買便當的時候,發現為了配合政府規定,從6/16(一) 開始就不再主動提供免洗筷,一定要使用者要求才給,不禁讓人迷思,不使用免洗筷真的能上社會變得更好嗎?

如果不使用免洗筷,那外食者就會使用「衛生餐具」。也許比較聰明的人會以為,我要講的是衛生餐具會不會比較衛生,我覺得當然不會!衛生觀念在台灣我相信是無庸置疑的,大家一定會因為怕為生餐具不衛生而在用前用後努力的清洗,所以一定會洗的很乾淨

但是問題來了,一個人洗一雙衛生筷和一次洗一大堆筷子,我相信如果每個人自己洗筷子會造成相當多倍的用水量,在洗手台洗筷子就像用連盆頭洗澡一樣,一定是非常耗費水資源的情形。這時候餐廳或者是公司為了怕水的浪費,我想一定會把水龍頭換成「省水水龍頭」。換了之後呢?換了之後當然筷子就洗不乾淨了,那會不會引發全國性的腸病毒...

因為手、餐具清洗不當,引起全國性常病毒是很有可能的,到時候要花費更多的醫療資源,在解決腸病毒的問題上。原本只是想環保、減少垃圾量,反而引起浪費水資源、浪費醫療資源...這樣真的划算嗎?

所以我以為,如果要全面禁用免洗筷,一定要有更完善的配套措施。不能只單就免洗筷的衛生、浪費資源來考量,我相信水、醫療也都是很重要的資源。不論是從環保或衛生的角度來思考,都是希望避免破壞環境,讓人類能永續生存。可是重點仍然在人類的生存上吧,如果連短期目標活的健康都不能顧及,那討論永續生存是不是有些好高騖遠呢?
繼續閱讀全文 全面禁用免洗筷真的比較環保嗎?

UCMA Simple Bot Part 3 (如何解決8分鐘機器人不回應的問題)

FUNction 下午3:12 發表
English Title: [HOW TO] Solve the UCMA Bot can't receive invite or message after 8 mins.

之前Chming 在我Blog 問我之後,過不久Vincent 在UCMA 論壇問了相同的問題(國人推斷兩人應該是同一人),可惜到最後都沒有人會。沒關係,我們來看看國人如何讓機器人在20 分鐘之後仍然會理國人吧。

這篇的步驟是教大家從IDKStudioServer 改裝成會持續收到訊息的機器人,希望對UCMA 的開發者會有幫助。我先把重點放在如何解決,然後再稍微討論一下,我對為什麼可以成功的見解。

開始修改程式碼:
首先,先開啟有Connection Manager 的程式碼(這邊僅更改TLS 部分,TCP 部分相信聰明的你可以舉一反三):
  1. 先將private 變數_connectionManager 的型別改為"RealTimeConnectionManager"
  2. 在RegisterEndpoint 的一開頭加入以下語法
    IPAddress localIpAddress = Dns.GetHostAddresses(Dns.GetHostName())[0];
  3. 跳到TLS 的區塊(如果是TLS 則執行...)裡面增加一個變數
    RealTimeServerTlsConnectionManager serverTlsConnectionManager;
  4. 刪除
    _connectionManager = (RealTimeServerConnectionManager)new RealTimeServerTlsConnectionManager(憑證名稱, 憑證序號);"

    換成
    serverTlsConnectionManager = new RealTimeServerTlsConnectionManager(憑證名稱, 憑證序號);"
  5. 在catch 外面加入以下程式碼:

    //Turn on MTLS so that InteractiveBot can be trusted by OCS.
    serverTlsConnectionManager.NeedMutualTls = true;

    _connectionManager = (RealTimeConnectionManager)serverTlsConnectionManager;

    if (!serverTlsConnectionManager.IsListening)
    {
    try
    {
    serverTlsConnectionManager.StartListening(new IPEndPoint(localIpAddress, 0));
    }
    catch (ConnectionFailureException e)
    {
    hrow new InvalidOperationException(e.Message);
    }
    }
  6. 接下來要把RegisterCallback 裡面的
    _connectionManager.StartListening(new IPEndPoint(IPAddress.Loopback, 0));
    刪掉或注掉吧
  7. 打完收工!


我們來看看之前問題出在哪?為什麼機器人不回應了。
我以為問題出在RealTimeServerConnectionManager ,雖然到現在我仍然搞不清楚這麼多種Connection Manager 有什麼特別的目的。總之就是把Connection Manager 換成RealTimeConnectionManager 就ok了。此外,RealTimeConnectionManager 不支援StartListening 方法,但是在轉型之前我們仍然可以用RealTimeServerTlsConnectionManager 取得這個方法。所以在該篇Marc Wetters (reply#3) 有回答到點,問題的確出在Connection Manager ,也許是他一時口誤吧。

順帶一提,這些程式碼其實是跟Interactive Bot 有樣學樣做出來的,因為那時候Chming 提醒了我,Interactive Bot 可以持續回應,為什麼IDK Bot 卻不行...恩,總之以後在開發機器人的時候請大家愛用RealTimeConnectionManager ,不用再跟什麼鬼RealTimeServerConnectionManager 玩了吧!
繼續閱讀全文 UCMA Simple Bot Part 3 (如何解決8分鐘機器人不回應的問題)

輔大96年畢業典禮(下) - 輔大好友

FUNction 於 2008年6月16日 晚上8:39 發表
當然,在輔大我也認識很多很nice 的人。之前在構思第三篇的時候,我還想要弄個「我與正妹」的專題,但我覺得沒必要。當然,跟漂亮的女孩照像是一件開心且值得炫耀的事,但其實誰不希望有光纖的外表,如果真寫那篇是很主觀的,很沒意義的,寫了又怎樣的。

在輔大,雖然我朋友不多,但也有一些很好的朋友。因為這是畢典專輯,所以我就focus 在班上的朋友。我知道我還認識很多我們學校很優秀、很認真、很多才多藝、對人很好的人,有機會再寫寫我眼中的你們吧!

大一的時候我就跟Allen 很好,記得應該是在計概課認識的。帥哥一枚,雖然話不多,但個性隨和,他帶給我大學很多歡樂的時光。

一一名,牡羊座熱血男子。擁有著牡羊座的特質,正義感、遵守諾言。有時候雖然愛嗆人,但其實我都沒有被嗆到的感覺,也是一起打球的朋友。

Axell王,帥哥,比我還龜毛,就跟哈姆雷特一樣。雖然他總是困在人際漩渦裡,但總是很熱心的幫忙朋友(雖然好像朋友能幫他的比較多XD)。

一個獅子座個性卻很溫和的人,小廖。自從拍了恐怖蠟像館短片才熟的,人很好,他也一直關心我,然後我們約好每週六晚上打球。

小佐,大一個小天使,是個很可愛的女孩。他也是我可以彈心的朋友,跟他聊天都會很快樂。他以前還做給我聖誕卡片,說他照顧我比較多。

甘小魚,一個想的比Axell 多的處女座女孩。將心比心,也是訴苦的好對象。可惜有時候他亂想亂想的真是拿他沒辦法。

婉蓉,是個很優秀的女孩,不只成績好,對朋友也很貼心,也超級幫朋友忙的!之前曾經跟他一起去新光實習,還弄了很多BGS 的事阿。

佩茹倪仔李Man懿&華儀,這四個女生是從大一就熟的夥伴,我們之前也有很多很多的故事。雖然中間有一段時間沒什麼交集,但其實我知道我們一直是朋友阿。

荌淣,被選為我的創業夥伴,馬來西亞華僑。是個認真的女孩,而且總是有許多的秘密。

Gary趙,趙國雄。E-Office 的夥伴,其實他是被我拉進去的。Java達人,講話很嗆,但有時後仍然可以講些有建設性的東西。

症狀大大,我覺得他很關心我,雖然色了點,但人還不錯阿XD

寫到這...我累了。當然族繁不及備載,如果你看到為什麼沒有你,你可以MSN留離線訊息給我,等我下次敲你時就有了。不是我不想寫你,是因為我今天真的累了...

恩,我得要撐一下。這四年裡還很感謝翁頌舜主任、吳濟聰老師、吳怡瑾老師、馬正林老師、胡俊之老師、蔡明志老師、蔡幸蓁老師以及系辦的圓圓、圩君、育潔、小吳、智慧...謝謝你們唷!

畢業特輯:
輔大96年畢業典禮(上) - 永春之光
輔大96年畢業典禮(中) - 真正的VIP
輔大96年畢業典禮(下) - 輔大好友
繼續閱讀全文 輔大96年畢業典禮(下) - 輔大好友

輔大96年畢業典禮(中) - 真正的VIP

FUNction 晚上8:02 發表

畢典那天下著雨,忽大忽小的雨,我得要九點到,很早。前一天,你說你會來看我,我真的很感動,因為直到今天,也還沒有任何一個朋友主動恭喜我畢業。也許你們跟我很熟,知道我拿不到畢業證書,所以想說就不用跟我說了;也許是因為你畢業我也沒有主動恭喜你,想說我都忘了你幹嘛祝賀我;也許你還想著要恭喜我,可是那天事情一忙就晚上了,想說都過了就算了,也許...我知道有很多的也許,而且沒有一個人有責任跟我說畢業快樂!

謝謝你,真的!你雖然要趕場,但還是很早就來我們學校了,你到的時候其實我還在路上,但我不敢跟你說,只說我10分鐘就會到你那裡。早點到是我講的,但是我卻比你晚。你手裡拿著花,是昨天買的,你對我說,應該不會有人花跟你一樣

你要跟我到禮堂看看,我怕你不方便,但其實我也希望你能多留一會兒。進禮堂需要觀禮證,沒關係,我家人沒有一個來,我把僅有的觀禮證給你用。你想看看我朋友,可是我朋友都還沒來(想認識你的那男生還在家裡睡覺呢)。我帶你逛逛,上樓梯的時候我大腳一踩,水花四溢,你鞋子應該濕了。

在禮堂裡,遇到優秀的學妹,恩...那學妹真的很優秀,而且使用期限特長,看來他注定大學四年年年參加畢業典禮。你說我跟他有什麼臉,你真的想太多XD(好像這段是我硬要講的耶)。總之,我很感謝你,雖然我們平常也沒有特別聯絡,你最近心情不好我又幫不上忙,但你對我這麼好,這份恩情我一輩子不會忘!

畢典特輯:
輔大96年畢業典禮(上) - 永春之光
輔大96年畢業典禮(中) - 真正的VIP
輔大96年畢業典禮(下) - 輔大好友
繼續閱讀全文 輔大96年畢業典禮(中) - 真正的VIP