2009年10月20日 星期二

Microsoft SMS Sender

此部份與開會的ppt內容相同,
1.建立Dial-up Network連線
(在wm5中可設定,但wm6中無此功能,一般手機可以不用設定)

2.在PC的控制台=>電話和數據機選項中新增撥號連線(除了區碼外可以不用填)


3.連接上藍牙接收器=>點選數據機=>新增後會去搜尋藍牙手機作為數據機使用



4.開啟Microsoft SMS Sender,選擇藍牙數據機,填寫完畢按下SEND即可送出


====================================================
使用命令列

从 Windows 命令提示符下,转到 SMS Sender 安装文件夹(通常为 C:\Program Files\Microsoft SMS Sender)并使用适当的选项运行 smssender.exe。应用程序将使用发送上一个消息最后所使用的设备,这样可以使某些发送阶段自动进行。

使用方法:
smssender.exe [[/i] /p: /m:"" [/u] [/l]] [/?]
/i 电话号码用国际格式表示。
/p: 电话号码(仅数值)。
/m:"" 键入的消息在引号以内。
/u 消息按 UCS-2 编码。默认情况下使用 GSM 字母
表。
/l 记录已发送的消息。
/? 显示此帮助。


測試程式


====================================================

問題與解決方法:在使用命令列時,有些電腦可能會遇到找不到DEVICE的問題,此時要回到圖形化介面=>Option中將Logging勾選,然後發送一次簡訊後即可正常使用命令列。

本週進度

這個禮拜的進度是測試microsoft sms sender 和幫忙哲賢的web service,
而sms基本測試已經完成,
不過由於易付卡購買還沒回應,
所以先暫停.

2009年10月16日 星期五

本週進度

本週的進度是將每個註冊者所喜好的分類商品包成RSS供使用者訂閱,
和有新商品時會發送EMAIL通知,
這個部份已經完成,
而目前主要在修改論文還有測試自動發簡訊的功能.

自動發信

我使用的是JAVAMAIL來達成自動發信的功能,
好處是你只要有一個有提供外部SMTP的信箱,
不用自己架伺服器,
缺點是在發信的時候需要一些時間,
以下我是使用GMAIL為例


try{
String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = System.getProperties();
props.setProperty("mail.smtp.host", "smtp.gmail.com"); //設定使用GMAIL的SMTP
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465"); //465是GMAIL提供的SMTP PORT
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");


String username = GMAIL帳號
String password = GMAIL密碼

Session sendMailSession;
Store store;
Transport transport;
sendMailSession = Session.getInstance(props, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username ,password );
}});


// -- Create a new message --
Message msg = new MimeMessage(sendMailSession);

// -- Set the FROM and TO fields --
msg.setFrom(new InternetAddress("寄件者信箱"));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("收件者信箱",false));
msg.setSubject("標題");
msg.setText("內容");
msg.setSentDate(new Date());
Transport.send(msg);

// system.out.println("Message sent.");



// -- Set the FROM and TO fields --

}
catch(MessagingException m)
{
out.println(m.toString());
}


RSS修改

原本我的RSS是利用開啟一個XML新檔案然後寫入,
但是後來發現這個方法既不夠即時,
而且也會浪費主機空間,
唯一的好處是會有一份XML的備份檔,
不怕資料庫當掉,
而我後來修改成直接頁面PRINT出來,
只要在JSP檔頭加入
response.setHeader("content-type","text/xml;charset=utf-8");
將檔案判斷成XML,
就可以直接利用JSP頁面即時找尋資料供RSS使用.

2009年9月28日 星期一

本週進度

上週因為在忙著準備專題期中的預備工作,
所以進度稍微暫停,
而本週在石作自動發送mail的功能,
原本要自己架一個mail server來實做,
但是搜尋之後發現不只要固定IP,
還要有dns來定位,
所以改變方向利用javamail套件來實做,
目前已經可以發送固定內容的email,
過幾天再來整合資料庫和專題內容.

2009年9月19日 星期六

本週進度

由於之前都在作其他計畫的內容,
所以專題進度稍微停止。
而本週的進度在於修改報告與構想個人化的架構,
目前個人化的部份是暫定使用者於註冊時提供三個喜好分類選項,
而在登入時檢查喜好分類並利用跳出視窗提示,
這部份完成後再考慮e-mail或簡訊自動提醒。

2009年7月25日 星期六

GOOGLE圖表問題

由於一開始圖表中的中文一直都出不來,
我原本以為是資料庫與網頁編碼設成BIG5的問題,
花了一兩天改成測試UTF-8還是無法正常顯示,
後來我開了範例網頁發現範例也無法顯示中文,
上網查了以後才發現要轉成ASCII(像是%0D%0A)格式,
但是這部份要改起來很花時間,
所以到最後我決定使用跟QRCODE一樣的模式,
利用表單GET方法來抓取數值,
跳出視窗來顯示圖表,
以下是GET方法的詳細內容:
<'form action="http://chart.apis.google.com/chart" name="form1" method="get" target="_blank">
<'input type="hidden" size="200x200" maxlengh="8" name="chs" value="600x300"/>
<'input type="hidden" size="200x200" maxlengh="8" name="cht" value="p"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chd" value="t:<%out.print(male);%>,<%out.print(female);%>,<%out.print(other);%>"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chco" value="ff00ff"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chts" value="0000ff,24"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chtt" value="性別"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chxt" value="x,y,r,t"/>
<'input type="hidden" size="200x200" maxlengh="8" name="chxl" value="0:男:(<%out.print(male);%>)女(<%out.print(female);%>)未知(<%out.print(other);%>)"/>
<'input value="性別" type="submit"/>
<'/form>

本週進度

因為最近身體有些不舒服...
所以專題進度比較慢,
而且大部分都是在做計畫的事情,
專題部分我已經放了一張GOOGLE圖表了,
其中有一些問題我會寫在另一篇上.

2009年7月16日 星期四

本週進度

由於上週實驗室電腦電源燒毀,
而且忙於其他計畫的提案構想,
所以進度暫時停止。
而本週預計開始看Google chart的相關資料,
並想辦法加進去專題裡。
不過因為實驗室電腦這兩天才修好,
還要把其他計畫的基本環境架起來,
所以進度可能還會稍微延遲一下。

2009年6月17日 星期三

本週進度

因為期末考的關西,
所以本週進度把基礎的GOOGLEMAP放上去,
然後把專題的資料放到實驗室總伺服器上去,
也討論和修改了一下期末報告的內容.
另外我也寫了ZIGBEE部分PDA搜尋TAG程式的安裝步驟,
有控就會放上去.

期末老師講評

首先做出一份簡單的首頁,介紹內容,
另外想一下RSS和QRCODE的專題其他應用,
將買賣的狀態記錄下來不要刪除,
然後把PPT、WIKI的報告補完。

2009年6月9日 星期二

ZIGBEE設備安裝

ZIGBEE設備安裝部分我已經將IP-3200和IP-2220和三角定位程式安裝完成並放上WIKI(還有另一台ZIGBEE設備因為只要插上電源即可動作所以就沒有寫上去),
但由於PDA還沒回實驗室所以沒有將廠商給的偵測TAG範例裝起來。

QRCODE

我的QRCODE 是利用GOOGLE 提供的編碼API來製作,
<*img src="http://chart.apis.google.com/chart?
chs=(寬x高)&chl=(編碼內容)&choe=(編碼)&cht=(編碼類型)"/>
這部份是之前使用的語法,
這個編碼出來的是純文字內容,
利用QuickMark所提供的解碼軟體並不能拿來做地標搜尋的動作,
後來找了很久發現了http://www.qrdoor.com.tw/software3.aspx,
裡面提供了QRCODE應用協定文件,
其中提供了地標的辨識,

  辨識語法:BEGIN:VCARD 或 NAVG
  QR CODE裡含 BEGIN:VCARD 或 NAVG 開頭時就表示此QR CODE是內含地標,開發者請依此編碼即可。  
  範例:
  BEGIN:VCARDN:位置名稱GEO:121.5512345;25.0012345END:VCARD
  =換行 (ASCII 0x0D 0x0A)
  N:地標名稱
  GEO:經緯度
  ORG:公司
  TEL:電話
  URL:網址
  EMAIL:信箱
  ADR:地址

(不過我測試時只有地標名稱和經緯度可以被解出來,
其他的不知道是解碼程式的問題還是我程式寫法的問題,
沒有辦法對應到解碼選單裡,
不過在解開的原始碼裡面沒有有錯誤)

利用此語法就實作後就可以利用QUICKMARK提供的辨識程式解碼出後用GOOGLE MAP定位的作用.

重點在於QRCODE的編碼最好是利用HTTP表單GET方法來實作,不然中文的部份會造成編碼錯誤形成無法解碼或是解出錯誤的內容出來.

googlemap基礎和書籤整理完成

今天我把在實驗室IE裡我用到的我的最愛一併加入了網路書籤裡,
另外我也把之前修改了的GOOGLEMAP網路範例做整合,
最後把一個利用地址定位的程式加入到每個商家的"關於我"網頁裡,
如果商家註冊時輸入的是有效的地址就會直接顯示在地圖上,
目前大致上把基礎完成,
剩下大概就只有一些細部的地方需要再調整而已。

2009年6月8日 星期一

本週進度

上週已經把RSS的部分完成,
本週是要把QRCODE的部分和把ZIGBEE設備完成.

2009年6月2日 星期二

RSS完成

我的RSS釋放在當有人按下商品列表時,
頁面就會利用寫入檔案的方式將RSS的標籤與資料庫抓出來的數值寫入到一份XML檔案中,
而要訂閱的使用者就可以直接利用該輸出的XML檔案匯入到RSS READ做訂閱的工作,
而RSS XML檔案在商家上傳商品及有人按下商品列表時都會更新,
所以應該不會造成資訊錯誤的問題.

本週進度及上週進度

因為連假和接近期末很多作業報告的關西,
做專題的時間減少很多,
上週主要是決定QRCODE的放置位置,
最後決定在使用者註冊時勾選是否要顯示QRCODE,
如果使用者有勾選的話,
將會在使用者的"關於我"的頁面中顯示其QRCODE地址編碼.

接下來本週是要把GOOGLE MAP結合進去,
初步構想是先作一個專門用來顯示GOOGLE MAP的頁面,
然後當使用者按下該商家的QRCODE時會跳出GOOGLE MAP頁面提供查詢服務.

2009年5月21日 星期四

本週進度

由於接近期末,
各科的作業和考試都變多了,
所以比較沒時間處理專題,
我這禮拜主要是把主頁面的顯示商家的關於我、qrcode和商品列表完成,
也大概了一下google map的範例,
目前預定期末考前把google map弄清楚.

RSS訂閱系統構想

由於利用xsl結合xml輸出rss檔案的方法的難度有點太高,
所以我最後還是選擇使用直接寫入檔案的方式,
將從資料庫抓出來的資料依照rss的格式寫入到一個xml檔案裡,
而rss xml檔案會在商家上傳商品的時候更新,
所以rss 與商品上傳是同步的,
不用擔心即時性的問題,
這方法的缺點就是不管有沒有人訂閱商品都會產生一個xml檔案,
但一份xml檔案大概只有1-2kb的空間,
跟上傳資料所使用的圖片相比少的多,
而且好處是對伺服器的負擔比較小,
對rss read來說只是抓一個檔案來顯示,
不用抓連結以後還要抓資料庫後利用xsl來顯示rss.

2009年5月14日 星期四

RSS設計

我這幾天看了一下之前找得rss網站資料,
發現其實目前有幾個網站可以直接使用他們的api來加入rss feed,
不過這樣做起來比較沒有難度,
所以我打算自己來寫rss的語法.

不過遇到的問題是rss要作成.xml的檔案,
如果要在jsp裡寫的話似乎要用XSL的樣板來做轉換,
但是我看裡幾本參考書和網路上的範例,
似乎都是從外部匯入一個XML利用XSL來轉換成其他格式,
沒有將JSP轉換成XML的(或是根本沒有這方法?),
不過另一個方法就是利用jsp輸出檔案的方式,
將所需的資料和xml rss的語法寫到另一個.xml檔案裡,
要讀rss的話就直接去讀取輸出的那個檔案網址,
這樣的話應用性更高而且做起來比較簡單,
所以我用了這個方法,
目前這部份進度大約80%,
基本的語法和檔案都可以輸出了,
接下來就是決定好rss放置的位置和每個商家輸出的rss xml檔案就可完成了.

2009年5月10日 星期日

本週進度

由於上禮拜發生刪除到期商品頁面的錯誤,
且登入頁面和商家的商品列表未完成,
所以rss尚未開工,
不過有先找了一些資料,
所以本週優先將使用者登入後到上傳商品的流程和使用者登入後列出其拍賣商品的頁面完成後,
即可以開始製作rss的部份.

商品到期機制完成

由於後來發現當用sql select到兩個資料表時,
使用rs.deleterow()會發生錯誤,
發生原因找了好幾天都找不到,
而且因為商品到期時要刪除到3個資料表的的資料,
且一個商品在圖片資料表裡最多可以有4筆紀錄,
用rs.deleterow()的話會造成不易處理且修改困難,
所以打算用回sql delete語法來作刪除的動作,
正好後來又發現之前用sql delete刪除複數資料的原因是出在stmt,
後來用了兩個stmt,
一個用來刪除,
一個用來搜尋,
這樣就成功的完成了商品到期機制,
後來可能會再加入管理者的登入確認,
以防一般使用者發現此頁面造成資料被亂刪的情況.

2009年5月6日 星期三

本週進度

由於前幾天在處理家裡的事情,
所以暫時沒作專題.
這裡拜預計先看一些rss的資料,
接下來就要把每個商家的商品列表都作成rss來給買家訂閱查詢.
另外發現如果使用到有關時間的函式的話,
似乎會造成雖然有存檔,
但是在測試網頁時ie仍然會使用舊的檔案,
要把資料夾或檔案的名稱改過後才會正常.

2009年4月30日 星期四

RFID模組

今天下午看了廠商DEMO了RFID模組,
在無限RFID的那個模組我這邊應該是沒有應用的可能,
但是另外一個教學用RFID模組我到是有一點好奇,
可以讀取和修改卡片的資料,
當作儲值卡、電子錢包來用的話,
倒是可以用來作為線上交費的功能,
可是這樣的話不僅要能夠用那個模組連接資料庫,
而且每個想使用此功能的人家裡都要有一台,
這樣成本過高大概不會有人想要用.
重點在於他是用.NET來寫應用程式,
要改成網頁形的話還要改寫成JAVA來跟JSP結合,
這樣子應該還要花上不短的時間,
我認為想要把他結合到專題裡恐怕有些困難!

2009年4月28日 星期二

商品到期機制的資料刪除(5/8修改)

原本我的商品到期以後只有設定顯示商品到期,
但是後來加入到期後刪除資料的地方卻發生錯誤,
while(rs.next)
{
int id=rs.getint(article_id);
...
if(設定時間==目前時間)
{
stmt.executeUpdate("delete from time where article_id=id;");
}

}
發生錯誤的地方如上,
如果以這樣方式的話,
在刪除一筆資料時不會錯誤,
但如果有多筆資料的設定時間都一樣時,
刪除第一筆完後就會發生錯誤,
我猜測的原因是因為當刪除時,
rs的指標會因為在刪除第一筆資料後,
檢查下一筆時因為同樣需要刪除,
導致指標可會指向錯誤而發生錯誤.
(後來確定是由於是使用同一個STMT,
所以當我刪除以後就會失去的原本的資料)

而我原本設計成如果到期,
則跳到另一個網頁刪除後再跳回,
想不到同樣會出現錯誤,
而最後我就想直接從rs的地方下手,
上網搜尋了以後發現了rs.deleteRow()函式,
此函是可以直接把目前rs指標指向的資料整筆刪除,
不過一開始要把stmt的rs權限設定為CONCUR_UPDATABLE,
讓它可以去改資料庫的內容,
然後把程式碼改成:
while(rs.next)
{
...
if(設定時間==目前時間)
{
rs.deleteRow()
}

}
這樣就可以直接把到期的商品資料做刪除的動作了.

2009年4月26日 星期日

本週進度

我本週預計先協助組員將每個商家的物品列表完成,
完成以後就可以開始設計商家RSS訂閱系統,
目前整組除了使用者方面的進度比較慢以外,
而商品和搜尋部分都很順利進行中,
較複雜的RSS和GOOGLE MAP部分也應該很快就可以開始進行.

商品到期機制

由於商家和上傳商品的部分尚未整合好,進階搜尋也已經完成,所以我就開始設計商品到期機制.
這個部分不難,主要的問題在於如何得到上傳商品的時間,
而這個功能可以用Calendar.getInstance()來得到系統目前時間,
不用像getyear()、getmonth()這樣分開來抓資料,
例如,
Calendar c=Calendar.getInstance( );
c.get(Calendar.YEAR);
可取得年.
又例如,
c.get(Calendar.MONTH);
可取得月.
所以我上傳商品的就寫入目前的時間和限制的日數,
然後當有使用者查看商品時,
就將上傳時的時間加上限制日數,
和查看時的時間來做比較,
如果相同就顯示商品到期,
不同就給予查看.
另外Calendar.getInstance()的詳細用法和欄位常數可以看這投影片:
點我!!!

2009年4月22日 星期三

==和 java.lang.String.equals()的不同

因為有時判斷的時候明明==的意思是正確的,但是依然會出現錯誤,所以我就放上這一篇做參考
轉載自:http://www.javaworld.com.tw/jute/post/view?bid=29&id=9578&sty=3&age=0&tpg=1&ppg=1


當比較兩個字串(String)時,使用 '==' 運算子和 java.lang.String.equals()這個
method有什麼不同呢?

'=='這個運算子會看看這兩個字串的references是不是指向同一個字串object。而
java.lang.String.equals()這個method則會比較這兩個字串的"值"是不是一樣的。換句
話說,比較這兩個字串是不是有相同的字元序列。

當使用String literals(一串被雙引號括住的字元)時,使用 '=='運算子和使用equals
method 的結果會是一樣的。所有的String literals都是指向同一個String 類別的
instances。系統中有一個pool,當有新的String literals出現時,系統會先去檢查pool
之中,是不是已經存在一個和這個新的String literals有相同內容的物件。如果存在,
則會傳回一個指向這個此物件的reference。若不存在,則會將此String literals放到
pool中,然後傳回這個物件的reference。

舉個例子:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"這個關鍵字所造出來的時候,則不是這麼一回事。

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

傳用"new"這個關鍵字時,會造出兩個不同的物件,所以會有兩個不同的references,即
使在底層的string literal是一樣的。在上面的例子中,'=='運算子傳回false,因為兩
個references是不同的。而equals method則傳回true,因為這兩個物件所代表是同樣的
字元序列。

2009年4月19日 星期日

本週進度

由於前兩個禮拜是期末考時間,
所以沒有進度.

另外這週我本來想要做有關商品資料修改的部分,
但是考慮會關係到如果可以修改的話會影響到買家的權益,
例如說有人下標後商家修改內容等,
所以這部分先不做,
改做商品的進階搜尋.

2009年4月4日 星期六

利用html+JSP傳陣列

傳陣列的問題困擾了我好幾天,主要是因為checkbox傳的名稱都只是單一的變數,沒有辦法寫成陣列,後來發現了request.getParameterValues語法,不過我以為是將a[1].a[2]...這樣的名稱用a來做為抓資料的媒介,想不到是光用a一個名稱就可以抓到多個資料,所以這部分我花了很久時間.
以下是詳細的用法:
while(rs.next())
{
id=rs.getString("article_id");



...
<*input name="delete" type="checkbox" value="<% out.print(id);%>" />


}
先抓取選擇到的id存到delete裡(我原本以為是存成delete[0]、delete[1]、...delete[n],當request.getParameterValues抓值會以delete當參考,不過這樣是錯誤的),

String delete[] = request.getParameterValues("delete");
把delete的值抓到delete陣列裡(會依照打勾的checkbox存值,都沒有的話會是NULL),

int size=java.lang.reflect.Array.getLength(delete);
抓delete陣列的大小(不知道為什麼如果用其他的整數變數似乎會錯誤),

for(int x=0;x<*size;x++)
{
out.println(delete[x]);
}
輸出delete陣列.

2009年3月31日 星期二

getString()問題

當一個變數儲存用getString抓取的資料庫的數值之後,無法直接在其他地方利用
以下是在抓取商品ID的最大值後,要儲存在picture的商品ID時候發生的錯誤

String strSQL ;
String test;
String article_idSQL ="SELECT MAX(article_id) FROM article";
rs=stmt.executeQuery(article_idSQL);

while(rs.next()){
test = rs.getString(1);
out.print(test);
}
strSQL = "INSERT INTO picture(picture_name,avail,article_id) values ('"+picture[s]+"','o','"+test+"')";

在執行時會發生test內容雖然是正確的,卻無法順利存入的情況.
解決的辦法是要將test變數做初始化的動作,也就是改成String test="";
就可以順利存入資料庫中,但詳細的錯誤原因不明.

本週進度

本週主要的工作在設計搜尋和列表商品的網頁,順便與上傳商品的網頁做相關.

2009年3月23日 星期一

本週進度(3/27修改)

本週主要進度要認識RSS的原理,不過由於目前的網站狀態比較難以測試,所以決定先把網站基本功能做好,再進一步設計測試RSS.
本週已經測試用QRCODE編寫由資料庫抓出的資料
目前撰寫資料列表網頁部份

2009年3月19日 星期四

QRCODE解碼問題

在我使用WEBCOM讀取螢幕上QRCODE時,發現某些時候會無法獲很久才能讀取成功
情況如下:
1.QRCODE大小為120x120
2.背景為黑色或深色系

解決辦法:
1.查詢網上討論後,最佳的QRCODE大小為200x200,更改大小設定
2.將WEBCOM與螢幕成約45度角,並且將亮度調低

QRCODE製作

右邊的兩個工具分別是直接顯示的QRCODE和可給使用者輸入的QRCODE
由於目前沒有PDA,所以無法測試由PDA擷取QRCODE資料到GOOGLE MAP的情況
本QRCODE是由Google Chart API所提供的語法製作
語法說明(直接顯示):
<*img src="http://chart.apis.google.com/chart?
chs=(寬x高)&chl=(編碼內容)&choe=(編碼)&cht=(編碼類型)"/>

語法說明(使用者輸入):

<*form action="http://chart.apis.google.com/chart" name="form1" method="get">

寬度×長度:<*input style="width:79px;height:20px" value="(編碼大小)" maxlengh="8" name="chs" size="1"/>

文字:<*input style="width:356px;height:20px" value="(編碼內容)" name="chl" size="1"/>

<*input value="(編碼)" name="choe" type="hidden"/>
<*input value="(編碼類型)" name="cht" type="hidden"/>

<*input value="送出" type="submit"/>

<*/form>
ps.我本來想使用QRDOOR的API所製作,但是他們用於地址編碼的API似乎有問題,所以轉用Google Chart API

本周進度

1.設計資料表
2.製作QRCODE

PS.這幾天重感冒,進度緩慢

2009年3月15日 星期日

2009年2月28日 星期六

目前進度

專題計畫構想:已完成
國科會初稿修改:最後步驟中
國科會報名:文件申請中

想不到我的專題計畫居然是在廁所想出來的= =
在構想系統的階段大部分都進行的很順利.
不過國科會報告真的是寫的很辛苦,
光是動機和研究步驟就花了我兩天的時間,
後來還要改來改去,
真的是累死了,
我想目前報蓋內容應該已經定案了,
接下來就來照那個超複雜的申請步驟完成計畫申請吧!!!

不過這幾天吃壞肚子了,
目前進度緩慢進行中.