2008年12月26日

java.util.Properties的應用:setProperty, getProperty, storeToXML, loadFromXML


在我們撰寫java的過程中常需要設定一些外部的參數
譬如說連線的IP位址或都某些路徑的設定
這些參數當然可以直接設定在 .java 的程式碼中
只是這樣每次更改都必須重新 compile 非常不便

所以這篇要介紹的是把 (key, value) 設定在檔案中的方法
只要透過 java.util.Properties 就可以輕鬆達到我們的目的
之後更改參數不用在程式碼中尋找,全都設定在一份檔案中即可

先說明一下下面的程式碼
首先我們還不知道 java.util.Properties 所能讀取的檔案格式
所以一開始我們先設定幾組參數後利用內建的功能產生 .xml 和 .properties
詳細的檔案格式內容我有列出來

知道格式之後我們以後就可以寫好參數在檔案中
然後再使用 function 把參數取出來,這些也有詳細的說明
以下是程式 Demo:
  1. import java.io.*;
  2. import java.util.Properties;

  3. public class PropertiesDemo {

  4. private static Properties props;

  5. public static void main(String[] args) {

  6. props = new Properties();

  7. // 用props.setProperty("key", "value")設定(key, value)配對
  8. props.setProperty("key1", "value1");
  9. props.setProperty("key2", "中文測試");

  10. // 用 props.list(System.out)在console 印出props中所有的(key, value)配對
  11. // -- listing properties --
  12. // key2=中文測試
  13. // key1=value1
  14. System.out.println("在console 印出props中所有的(key, value)配對");
  15. props.list(System.out);
  16. System.out.println();

  17. // 設定重覆的(key, value)配對會覆蓋掉
  18. // -- listing properties --
  19. // key2=中文測試
  20. // key1=更改value1
  21. System.out.println("印出更改後所有的(key, value)配對");
  22. props.setProperty("key1", "更改value1");
  23. props.list(System.out);
  24. System.out.println();

  25. try {
  26. // 輸出props中所有的(key, value)配對到xml(storeToXML)及txt(store)
  27. // 輸出後Stream不會自動關閉必須手動關閉,否則有可能出錯(不是在()中使用new時)
  28. // storeToXML(OutputStream os, Stirng comment, String encode)
  29. // storeToXML(OutputStream os, Stirng comment) encode預設使用 UTF-8
  30. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  31. props.store(new FileOutputStream("properties.properties"), "store");
  32. } catch (FileNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }

  37. props.clear();

  38. try {
  39. // props.getProperty(key)讀出(key, value)配對
  40. // props.getProperty(String key, String defaultWhenNotFound)
  41. // props.getProperty(String key) throws exception when not found
  42. System.out.println("props.getProperty(key)讀出(key, value)配對");
  43. props.load(new FileInputStream("properties.properties"));
  44. System.out.println(props.getProperty("key", "test")); // default value test
  45. System.out.println(props.getProperty("key1"));
  46. props.clear();
  47. System.out.println();
  48. } catch (FileNotFoundException e) {
  49. e.printStackTrace();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }

  53. try {
  54. // 印出從 properties.xml 讀出的所有(key, value)配對
  55. System.out.println("印出properties.xml讀出的所有(key, value)配對");
  56. props.loadFromXML(new FileInputStream("properties.xml"));
  57. props.setProperty("key3", "new value");
  58. props.list(System.out);

  59. // 將新配對寫回 properties.xml,串流沒出錯
  60. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  61. } catch (FileNotFoundException e) {
  62. e.printStackTrace();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
輸出結果:
  1. 在console 印出props中所有的(key, value)配對
  2. -- listing properties --
  3. key2=中文測試
  4. key1=value1

  5. 印出更改後所有的(key, value)配對
  6. -- listing properties --
  7. key2=中文測試
  8. key1=更改value1

  9. props.getProperty(key)讀出(key, value)配對
  10. test
  11. 更改value1

  12. 印出properties.xml讀出的所有(key, value)配對
  13. -- listing properties --
  14. key3=new value
  15. key2=中文測試
  16. key1=更改value1
產生的 properties.properties內容:
#store
#Fri Dec 26 15:23:38 CST 2008
key2=\u4E2D\u6587\u6E2C\u8A66
key1=\u66F4\u6539value1
使用 store 所產生的文件並不直接支援中文
所以建議使用 storeToXML

產生的 properties.xml內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>storeToXML</comment>
<entry key="key3">new value</entry>
<entry key="key2">中文測試</entry>
<entry key="key1">更改value1</entry>
</properties>
關鍵字:Properties, setProperty, getProperty, storeToXML, loadFromXML, 參數

2008年12月23日

利用Google Reader 閱讀器查詢RSS訂閱數


我想只要是正常人都會好奇自己的部落格受不受歡迎,
尤其是對有認真在經營部落格的人更會想知道究竟有多少人在看在 follow,
部落格的閱讀人數除了實際頁面上的流量外,
那些默默使用RSS feed 或 ATOM feed 訂閱的人也不在少數喔。


要統計實際頁面的流量有很多工具可以使用,
只要找到喜歡的把相關的 javascript 或圖片嵌在網頁中即可。
我想這個大家都很熟悉了,google 也能找到許多教學,在這邊就不贅述了。

離題了,這篇的重點是要找出利用 Google Reader (Google 閱讀器) 訂閱部落格的人數,
只要利用 google 的查詢工具就可以很簡單的查出來囉。
範例:http://www.google.com/reader/directory/search?hl=zh&q=BLOG網址

例如這個blog的查詢:
http://www.google.com/reader/directory/search?hl=zh&q=

http://werdna1222coldcodes.blogspot.com/

就會得到下面這個頁面 (沒有人訂閱 = =)

透過以上的查詢方式,大家應該都可以看到自己的人氣旺不旺了。
如果上面的方法沒辦法使用,
也可以在 Google Reader 裡面新增自己的 BLOG 訂閱,
然後點選『查看詳細資料與統計資料』,
就可以看到訂閱這個部落格的人數了,任何部落格都可以喔 :p

關鍵字:RSS, ATOM, Feed, Feeds, 訂閱, 人數, 查詢, 統計, Google Reader, Google 閱讀器

[發佈] 電子賀卡平台


最近寫了一個電子賀卡的平台
下面這是正式版本的卡片預覽:


另外也附上最初版本的圖
我是覺得這種底色也蠻溫暖喜氣的呀 XD
感覺很有聖誕節的氣氛呢

2008年12月19日

Tomcat 刪除了 war 檔後資料夾也消失了?


我們都知道Tomcat有自動解壓縮war檔的功能
只要在Tomcat啟動時將war檔放到%Tomcat_Home%/webapps中
Tomcat就能自動解開war檔並deploy
deploy完看到產生了新的資料夾就可以使用我們所寫的服務了

一般我們這樣deploy完測試服務正常就不管war檔了
但如果這時候直接刪除war檔會連對應解開的資料夾也一起刪除喔
然後服務當然也就死了 我們在老闆的眼中也黑了 orz

要避免這種狀況其實也不需要什麼麻煩的動作
只要在刪除war檔前先把Tomcat關閉就可以了
這是我昨天發現資料夾一再被刪除後才找到的原因
本來還以為是被駭客入侵了 = =+

另外如果在webapps底下想直接修改檔案
也記得要先將war檔先刪除
否則修改過的檔案會不斷被war檔解壓縮後的內容給覆蓋
就會造成再怎麼改也不會更新的鬼打牆窘境....

關於更多更詳細的設定可以參考 Tomcat 設定技巧 - Top 10

關鍵字:Tomcat, war, deploy, delete, 刪除, 佈署, 消失, 不見
參考資料:
1. JSP_TomcatSetup
2. Tomcat 設定技巧 - Top 10

2008年12月15日

Java, Javascript 的網頁控制


這是一份關於網頁控制的簡短筆記
歡迎參考,如果有錯也請留言告知指教

# Java #
//從jsp, html讀取資訊:
String message = request.getParameter("message");
Object object = (Object)request.getAttribute("obj");

//轉換頁面:
response.sendRedirect("./NewPage.html");
//OR傳送資訊+轉換頁面:
request.getParameter("message", message);
request.setAttribute("obj", obj);
RequestDispatcher view = request.getRequestDispatcher("/NewPage.jsp");

# JavaScript #
//上一頁:
history.back();
//轉換頁面:
window.location.replace('./NewPage.html');
//自動跳轉:
setTimeout("window.location.replace('./eCard.html')", 3000);

關鍵字:Javascript, Java, url, getParameter, getAttribute, 網頁

2008年12月4日

用Javascript替中文網址轉碼:escape, encodeURI, encodeURIComponent 的比較


如果你要找線上轉碼的工具請至
Online UrlEncoder:線上轉換中文網址為UTF-8編碼

在程式或者網頁的應用中我們常常需要把中文轉換為其他編碼
例如在 Google Chart API:繪製中文圓餅圖(Pie Chart)
就需要把中文網址轉換為 UTF-8 的編碼
用Java替中文轉碼:URLEncoder 中已經介紹了使用Java來轉碼的方法
這一篇要介紹的則是Javascript中的三種轉碼工具以及這三者間的比較

首先先看到節錄自用javascript轉UTF-8編碼的編碼解碼介紹
其中紅色的部分是我自己更改的地方,與網頁內容不同

escape(String args),unescape(String args)
會處理#字元為%23,空白字元轉換為+,中文字處理為UniCode

encodeURI(String args),decodeURI(String args)
不會處理#字元,空白字元轉換為%20,中文字處理為UTF-8

encodeURIComponent(String args),decodeURIComponent(String args)
會處理#字元為%23,空白字元轉換為%20,中文字處理為UTF-8

而更詳細的區別則在對比 javascript url編碼可以看見
javascript 常用的編碼格式有:
escape(), encodeURL(), encodeURIComponent() 區別如下:

escape() 方法:
採用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉化成%xx格式的字符編碼(xx等於該字符在字符集表裡面的編碼的16進制數字)。比如,空格符對應的編碼是%20。
不會被此方法編碼的字符: @ * / +

encodeURI() 方法:
把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。
不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:
把URI字符串採用UTF-8編碼格式轉化成 escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串裡面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之後URL將顯示錯誤。
不會被此方法編碼的字符:! * ( ) '

因此,對於中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要採用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之後引進的,escape則在javascript1.0版本就有。

藉由以上的比較後得知如果需要用javascript處理utf-8的中文的話
那麼使用encodeURIComponent絕對是最佳的選擇
若是對英文不害怕的話可以再看看這篇文章
Handling UTF-8 in JavaScript, PHP, and Non-UTF8 Databases
應該會對UTF-8的使用更為了解

這篇javascript轉碼的應用也可以使用在
Google Chart API:繪製中文圓餅圖(Pie Chart)
趕快寫個簡單的測試網頁看看結果吧

關鍵字:javascript, UTF-8, escape, encodeURI, encodeURIComponent, url, encode, decode, 比較, 中文, 中文網址, 轉碼, 編碼
參考資料:
1. 用javascript轉UTF-8編碼
2. 對比 javascript url編碼
3. Handling UTF-8 in JavaScript, PHP, and Non-UTF8 Databases

Online UrlEncoder:線上轉換中文網址為UTF-8編碼


如果你要找的是用程式轉碼的方法
那麼請參考下面兩篇文章
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
用Java替中文轉碼:URLEncoder








上面如果沒出現輸入框和按鈕的話可能是主機出問題了,請稍後重試或回報給我。
出現亂碼的話請選擇 UTF-8 編碼再重新讀取一次。

這個轉換工具是利用javascript所寫的
其實是為了Google Chart API:繪製中文圓餅圖(Pie Chart)所寫的
其中用到了encodeURIComponent和decodeURIComponent
可以將網址或者中文轉換為UTF-8的連結或編碼

關於轉換方式詳細的介紹可以看我寫的文章
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
另外因為blog無法放上完整的html code
所以這篇裡頭也用到了iframe來把工具插入文章中
iframe的簡單介紹可以參考iframe語法

關鍵字:javascript, 線上, online, url, encode, decode, 中文, 中文網址, 轉碼, 編碼, UTF-8, encodeURIComponent
參考資料:
1. 用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
2. iframe語法

2008年11月27日

TIOBE Programming Community Index


TIOBE Programming Community index
是TIOBE公司利用搜尋引擎對程式語言統計而產生的數值
可以將它視為 程式語言受歡迎程度的指標
每個月這個指標都會更新一次
連結:TIOBE Programming Community index
定義:TIOBE Programming Community Index Definition

下面是2008年11月的資料:

依據網站上的說明近5年的前十名程式語言排名幾乎沒有變化
盤據十名榜的常勝軍包括Java、C、C++、PHP、Visual Basic、JavaScript、C#
(但最近似乎有不少新進的語言大幅成長而使十名榜產生變化了)


若是看趨勢圖會發現2004年中趨勢有了劇烈的起伏
原因不是因為有什麼程式語言迅速崛起或沒落
而是因為google調整了他的搜尋策略使搜尋結果有很大的變動
因而影響到這個依據搜尋引擎統計的指標

TIOBE index雖然是個程式語言受歡迎程度的指標
但TIOBE一開始就在網頁上提到:
TIOBE index並不是要指出哪個語言才是最好的程式語言
也不是在比較程式設計師使用哪個語言寫了最多行的程式碼
它的目的是用來檢視我們的程式開發技能是不是能跟上潮流處於最新的狀態
也提供我們在開發建置新的專案或系統時選擇程式語言的參考

關鍵字:程式語言, 比較, 排名, 趨勢
參考資料:
1. TIOBE Programming Community index
2. 程式語言 -- 專案各有所需、人人各有所好

2008年11月25日

自製小玩具:期中考成績分析


首先希望看到這個頁面的大家都可以試玩看看

命運的期中考成績分析

整個結果頁面的預覽圖:

## 注意 ##
這個並不會是永久放置的小玩具 也許過一陣子連結就會失效了
這篇文章的目的並不是為了要宣傳或讓大家試玩
而是要稍微紀錄解說一下整個頁面的運作

首先要讓大家了解到的是這雖然名為分析
但運作模式卻不折不扣是個完全依據亂數決定的程式
程式一開始由檔案中取得我事先輸入的40多個項目
接著亂數選出一個項目 再亂數產生一個介於0到bound的數字
(bound目前設定是20 功用是避免某個項目佔的比重太大)
產生數字後就把數字加入該次亂數選到的項目
(若多次亂數選到同一個項目則數字會疊加上去
所以若看到某一項目比例超過bound那麼就是這個項目被選中兩次以上)

將數字加到項目以後會計算剩餘的比例
當剩餘的比例低於bound時就把剩下的加到最後一次亂數選中的項目
(這是避免產生太多比例非常低的項目)
產生了所有項目和比例之後透過Google Chart API產生統計資料的圓餅圖
(細節可參考Google Chart API:繪製中文圓餅圖)
最後在動態網頁上把資料和圖片一起顯示出來

基本上功能到這邊就已經完全
但在這種模式下每個人每次的計算結果都會不一樣
於是又另外寫了紀錄的功能
(紀錄在檔案而不是資料庫,不是沒能力存到資料庫,而是有點麻煩XD)
完成這個功能以後每個人計算時會先看是否已經玩過存有資料
如果沒有的話就照平常的方法產生結果
已經玩過的話就從檔案裡讀取資料

以上便是這整個小玩具的運作模式
一開始是因為成份分析產生器產生興趣
在不知道他的做法的狀況下以自己的想法模擬做了一個
結果就是發現這樣的分析其實都只是亂數罷了 :p

關鍵字:成份分析
參考資料:
1. 成份分析產生器

用Java替中文網址轉碼:URLEncoder


在程式或者網頁的應用中我們常常需要把中文轉換為其他編碼
例如在上一篇 Google Chart API:繪製中文圓餅圖(Pie Chart)
就需要把中文網址轉換為 UTF-8 的編碼
當然下面介紹這些也不僅僅限於轉換網址而已

圖片來源:http://www.stringfunction.com/blog/url-encoding-decoding/

在我目前的應用中只用過了JAVA
使用的函數是 URLEncoder.encode(String 字串, String 編碼)
(編碼為:UTF-8, UTF-16等等)
以下是節錄自用javascript轉UTF-8編碼的編碼解碼介紹

#Java#
會處理#字元為%23,空白字元轉換為+,中文字拆開每BYTE處理為ASCII
第二個String 為Locale
java.net.URLEncoder.encode(String args,String args)
java.net.URLDecoder.decode(String args,String args)

#JavaScript#
會處理#字元為%23,空白字元轉換為+,中文字處理為UniCode
escape(String args)
unescape(String args)
不會處理#字元,空白字元轉換為%20,中文字拆開每BYTE處理為ASCII
encodeURI(String args)
decodeURI(String args)
會處理#字元為%23,空白字元轉換為%20,中文字拆開每BYTE處理為ASCII
encodeURIComponent(String args)
decodeURIComponent(String args)

#PHP#
會處理#字元為%23,空白字元轉換為+,中文字拆開每BYTE處理為ASCII
urlencode
urldecode
會處理#字元為%23,空白字元轉換為%20,中文字拆開每BYTE處理為ASCII (RFC 1738 )
rawurlencode
rawurldecode

這篇只介紹了使用java來做轉碼
使用javascript編碼轉換的介紹可以查看
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
或者直接利用Online UrlEncoder:線上轉換中文網址為UTF-8編碼

關鍵字:java.net.URLEncoder, UTF-8, url, encode, decode, 中文, 中文網址, 轉碼, 編碼
參考資料:
1. 用javascript轉UTF-8編碼
2. (JSP)傳送URL的時後需要的URLEncoder.encode(c,"utf8");

Google Chart API:繪製中文圓餅圖(Pie Chart)


目前在網路上看到的文章都還說Google Chart API無法使用中文
但其實是可以的 所以特地寫一篇介紹如何達成我們的目標

Google Chart API是google提供的服務
我們只要透過網址傳遞相關的參數和資料
就可以獲得對應的資料圖表
今天要介紹的就是利用google來繪製圓餅圖

上圖就是google官方所提供的範例,網址是:
http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World
其中http://chart.apis.google.com/chart?是Chart API的網址後面要接參數
重要的參數說明如下:
cht=p3:選擇圖片類型,如現在是立體圓餅圖
chd=t:60,40:各項資料的比例,注意順序要與chl對應,以 , 分隔
chs=250x100:圖片大小,Google提供支援到300000畫素,可以自訂為1000*300,750*400,600*500等等,注意若文字過長被圖片切掉可以透過把圖調扁來讓他顯示
chl=Hello|World:各項資料的名稱,以 | 分隔
另外還有chtt是圖表的名稱,其餘的參數可以參考Google Chart API

上面的一段在google已經可以找到很多說明了
本篇的重點其實是在如何為圖表加入中文
因為google目前還不支援直接把中文放在網址中產生圖片
所以很多人都以為這個API是無法使用中文的
但是讓我們來看看下面這個例子

其中的網址和剛剛都很類似
http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=%E4%B8%AD%E6%96%87|%E5%87%BA%E7%8F%BE%E4%BA%86
只有chl的地方改變了
%E4%B8%AD%E6%96%87對應到的是中文的UTF-8編碼
%E5%87%BA%E7%8F%BE%E4%BA%86則是出現了的UTF-8編碼
關於中文網址的編碼轉換請參考
用Java替中文轉碼:URLEncoder
用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
如果只想產生圖檔而不是在程式中應用的話請利用
Online UrlEncoder:線上轉換中文網址為UTF-8編碼
應該就可以順利把中文網址轉換成UTF-8了

關鍵字:Google Chart API, Pie Chart, 圓餅圖, 中文, sort, 排序
參考資料:
1. Google Chart API
2. 用網址畫圖,Google 推出 Google Chart API

2008年11月12日

HashMap的應用及資料排序


在資料處理時我們常常需要 (key, value) 的對應
先前在將List做排序的方法也是為了類似的目的
當初利用List是因為我們不需要由key去取得value的功能
只需要把所有資料依某個欄位排序全部印出即可
在這種情況底下自己建立所需資料型態的物件List會比較方便

然而有時候我們需要的是針對某個鍵值提出對應的資料
以成績單舉例好了 當我們的目的只是要列印成績單
那麼用List去做會是一個不錯的選擇
可是在List的結構底下若是我們只想得到某一學生的成績
那我們就得在List裡頭搜尋這個學生的名字然後才能得到成績
面對這種狀況另一個方法就是利用HashMap

把資料的 (key, value) 放入HashMap以後要針對特定的key取得value是非常簡單的
可以參考最下面程式碼裡面單純取得成績那段
如果HashMap裡頭有儲存資料則會傳回對應該key的value
HashMap裡沒有資料的話則會傳回 null

在HashMap裡資料的排列與key、value、加入順序都無關
HashMap有自己獨特的排列方式,像程式碼第二段的輸出結果
若是想讓資料以key值排序可以選擇用TreeMap 但效能是HashMap較佳

利用HashMap我們已經達到可以利用key值迅速取得value
但是如果我們想要印出所有資料卻又不知道姓名怎麼辦呢?
這時候只好利用HashMap的entrySet()方法取得所有資料
然後把這些資料匯入List中做處理
只要資料匯入List後就可以依照key或value排序印出了
如程式碼第三四段

在看程式碼和結果前先下個簡短的結論
如果是單純的想列印全部資料或者欄位不只兩個
那麼就建立一個自訂class的List來處理會比較方便
如同將List做排序的方法所介紹的
但如果資料只是兩欄 (key, value) 的配對
則用HashMap可以迅速取得單一key對應的資料
HashMap的作法只要稍加轉換仍舊可以排序列印出所有資料
以上供大家在選擇時做參考,下面是程式碼和輸出結果
  1. import java.util.*;

  2. public class HashMapDemo {

  3. private HashMap<String, Integer> transcript;

  4. public static void main(String[] args) {
  5. new HashMapDemo();
  6. }

  7. public HashMapDemo() {

  8. transcript = new HashMap<String, Integer>();
  9. transcript.put("Alex", 95);
  10. transcript.put("Bibby", 70);
  11. transcript.put("Charlie", 85);
  12. transcript.put("David", 75);

  13. // 單純取出學生的成績
  14. printGrade("Alex");
  15. printGrade("Bibby");
  16. printGrade("Joice"); //沒資料會傳回null
  17. System.out.println();

  18. // 想印出HashMap裡的全部資料
  19. // 注意這裡印出的順序不按姓名、成績,也不按加入順序
  20. // 因為HashMap有自己的排序方式,若要按姓名排序可用TreeMap但效能較差
  21. for (String name:transcript.keySet()) {
  22. printGrade(name);
  23. }
  24. System.out.println();

  25. // 想依照姓名或成績牌列印出所有資料,先將所有HashMap裡的entry放入List
  26. List<Map.Entry<String, Integer>> list_Data =
  27. new ArrayList<Map.Entry<String, Integer>>(transcript.entrySet());

  28. // 依姓名排序並列印
  29. Collections.sort(list_Data, new Comparator<Map.Entry<String, Integer>>(){
  30. public int compare(Map.Entry<String, Integer> entry1,
  31. Map.Entry<String, Integer> entry2){
  32. return (entry1.getKey().compareTo(entry2.getKey()));
  33. }
  34. });
  35. for (Map.Entry<String, Integer> entry:list_Data) {
  36. printGrade(entry.getKey());
  37. }
  38. System.out.println();

  39. // 依成績排序並列印
  40. Collections.sort(list_Data, new Comparator<Map.Entry<String, Integer>>(){
  41. public int compare(Map.Entry<String, Integer> entry1,
  42. Map.Entry<String, Integer> entry2){
  43. return (entry2.getValue() - entry1.getValue());
  44. }
  45. });
  46. for (Map.Entry<String, Integer> entry:list_Data) {
  47. printGrade(entry.getKey());
  48. }
  49. }

  50. private void printGrade(String name) {
  51. System.out.println(name + "\t" + transcript.get(name));
  52. }
  53. }
輸出結果:
  1. Alex 95
  2. Bibby 70
  3. Joice null

  4. Charlie 85
  5. Bibby 70
  6. David 75
  7. Alex 95

  8. Alex 95
  9. Bibby 70
  10. Charlie 85
  11. David 75

  12. Alex 95
  13. Charlie 85
  14. David 75
  15. Bibby 70

關鍵字:HashMap, Map, Key, Value, Collections, sort, 排序

參考資料:
1. 針對java.util.Map的Value做排序(1)
2. 將List做排序的方法

2008年11月11日

用 Blog 賺小錢 - 博客來AP策略聯盟


(2011.12.19更新)
本系列介紹文章已有新版本,請見:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
部落格廣告賺錢術(二):博客來AP策略聯盟、Yahoo!奇摩購物中心大聯盟計畫平台、PChome商店街分紅網
更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

這篇要介紹的是博客來AP策略聯盟
博客來AP策略聯盟和前面介紹的廣告收益方式完全不同,
前者是以廣告出現頻率和使用者點擊廣告的次數來計算收益,
而博客來則利用使用者由個人推薦連結進入購買的金額來計算分紅。
也就是說今天有人點了屬於我的推薦連結購物,
那麼我就可以在這筆消費中取得固定比例的分紅。

和前面的廣告最不同的是,這個類型的廣告一定要有消費產生才有錢,
光點擊連結是無法產生收益的,這也是為什麼這類廣告被稱為 CPA (Cost-per-Action) 的原因,
而 Google Adsense、BloggerAds 等則被歸類於 PPC(Pay-per-Click) 每次點擊收益,
或 CPM(Cost per Thousand Impressions) 千次曝光收益。

在加入博客來AP策略濕盟前我們可以先到註冊頁面看看回饋比率,
然後選擇自己想要的合作方式:
回饋金計算比率表
商品類別 獨家AP 非獨家AP 無回饋金AP
書籍 4 % 2 % 0 %
雜誌 2 % 2 % 0 %
影音 2% 1 % 0 %
美妝 2% 0 % 0 %
親子 2 % 0 % 0 %
衣飾 2 % 0 % 0 %
創意生活 2 % 0 % 0 %
玩藝 2 % 0 % 0 %
美食 2 % 0 % 0 %

其中合作方案的規則是:
獨家AP
合作期間貴網站除了博客來之外,不放置其他電子商務網站相關的銷售連結
非獨家AP
合作期間貴網站放置包含博客來,以及其他電子商務網站相關的銷售連結
無回饋金AP
適用於學術單位或政府機關,或者決定不要回饋金者,博客來不提供回饋金

註冊後博客來提供了好幾種形式的連結,
第一種是聯播貼紙,結果會像下面這樣,
其中第一個欄位是博客來內建的,其他的欄位可選擇0-3個想推薦的主題活動。


第二種則是簡單的搜尋工具貼紙
透過這個工具找到的購買訂單也都可以有分紅。

第三個主題活動貼紙和第一個類似但比較整潔俐落,
而且可以只推薦單一的主題活動就好,
取得程式碼以後結果會像是一張圖片。


最後一種銷售連結產生器則是我覺得博客來最吸引人的地方,
我們可以把博客來上的商品連結轉換成成自己的推薦連結,
這樣我們就可以在blog上介紹有試用過或是推薦的圖書音樂,
只要朋友們覺得喜歡,點下購買以後我們就能得到分紅,效果像這樣:
http://www.books.com.tw/exep/assp.php/your_ap_id/exep/prod/booksfile.php?item=0010522255,
我們也可以利用圖片連結:


介紹完畢,總而言之,若你是個容易煽動別人購買慾的人,
就可以在 Blog 等地方加入這些工具來賺分紅囉!大家可以試試看。

相關文章:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪

關鍵字:分紅, 收入, 網賺收益, 比較, 自己點, Facebook, 部落格, blog, 廣告, 賺錢, 停權, 資訊提供廣告, 網域廣告, 網路賺錢部落格, 申請, 下線, 獎金

2008年11月8日

用 Blog 賺小錢 - BlogAD、BloggerAds



(2011.12.19更新)
本系列介紹文章已有新版本,請見:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
部落格廣告賺錢術(二):博客來AP策略聯盟、Yahoo!奇摩購物中心大聯盟計畫平台、PChome商店街分紅網


這系列大概只會有三篇介紹文章
之前已經在第一篇用 Blog 賺小錢 - Google Adsense介紹了Google Adsense
這篇則要介紹與Adsense有相同收益模式的BlogAD和BloggerAds

首先BlogAD的網址在http://www.blogad.com.tw/BlogAD/
也可以透過我的BlogAD招募網址連結過去
BlogAD和BloggerAds都是台灣的部落格廣告公司
收益方式基本上都和Adsense差不多
唯一的小差別是BlogAD的獎金計算可以選擇曝光式或點閱式
詳細計算方式可以參考BlogAD的說明
點閱式是只要有點擊就有獎金 適合流量小的blog
如果是每天廣告播放數會超越5000次則建議使用曝光式

常常被拿來和BlogAD比較的是BloggerAds
印象中BloggerAds是比BlogAD還早出現的
BloggerAds的網址在http://www.bloggerads.net/
同樣也可以透過我的BloggerAds招募網址來連結喔
BloggerAds和BlogAD主要的差異在於BloggerAds直接整合了曝光與點閱
也就是說無論是廣告曝光或者有人擊點廣告都能獲得收益
這對一般的blog使用者是比較方便的
BloggerAds的廣告放置幅數有限制所以版面會比較乾淨
但這不影響收益喔 多數網友的使用心得都是BloggerAds的獎金較高

除了廣告曝光和點擊的收益外
這兩個網站都有拉下線的機制
其中BlogAD的回饋是終身有效而BloggerAds則不是
所以如果有人想要加入的話歡迎透過我的招募連結加入
BlogAD招募網址BloggerAds招募網址
不過網路上的心得好像是不用太期待從這兒賺錢就是了

以上是這系列的第二篇
一樣提供給大家參考喔

相關文章:
用 Blog 賺小錢 - Google Adsense
用 Blog 賺小錢 - 博客來AP策略聯盟

2008年11月7日

121 - Pipe Fitters


UVa網站題目連結
My Solved Problems Performance

Background

Filters, or programs that pass ``processed'' data through in some changed form, are an important class of programs in the UNIX operating system. A pipe is an operating system concept that permits data to ``flow'' between processes (and allows filters to be chained together easily.)

This problem involves maximizing the number of pipes that can be fit into a storage container (but it's a pipe fitting problem, not a bin packing problem).

The Problem

A company manufactures pipes of uniform diameter. All pipes are stored in rectangular storage containers, but the containers come in several different sizes. Pipes are stored in rows within a container so that there is no space between pipes in any row (there may be some space at the end of a row), i.e., all pipes in a row are tangent, or touch. Within a rectangular cross-section, pipes are stored in either a grid pattern or a skew pattern as shown below: the two left-most cross-sections are in a grid pattern, the two right-most cross-sections are in a skew pattern.

picture26

Note that although it may not be apparent from the diagram, there is no space between adjacent pipes in any row. The pipes in any row are tangent to (touch) the pipes in the row below (or rest on the bottom of the container). When pipes are packed into a container, there may be ``left-over'' space in which a pipe cannot be packed. Such left-over space is packed with padding so that the pipes cannot settle during shipping.

The Input

The input is a sequence of cross-section dimensions of storage containers. Each cross-section is given as two real values on one line separated by white space. The dimensions are expressed in units of pipe diameters. All dimensions will be less than tex2html_wrap_inline133 . Note that a cross section with dimensions tex2html_wrap_inline135 can also be viewed as a cross section with dimensions tex2html_wrap_inline137 .

The Output

For each cross-section in the input, your program should print the maximum number of pipes that can be packed into that cross section. The number of pipes is an integer -- no fractional pipes can be packed. The maximum number is followed by the word ``grid'' if a grid pattern results in the maximal number of pipes or the word ``skew'' if a skew pattern results in the maximal number of pipes. If the pattern doesn't matter, that is the same number of pipes can be packed with either a grid or skew pattern, then the word ``grid'' should be printed.

Sample Input

3 3
2.9 10
2.9 10.5
11 11

Sample Output

9 grid
29 skew
30 skew
126 skew

Solution

  1. import java.io.BufferedInputStream;
  2. import java.util.Scanner;

  3. public class Main {

  4. public static void main (String[] args) {

  5. double double1, double2;
  6. int grid, skew;
  7. Scanner in = new Scanner(new BufferedInputStream(System.in));

  8. while (in.hasNext()) {
  9. double1 = in.nextDouble();
  10. double2 = in.nextDouble();
  11. grid = (int)(double1) * (int)(double2);
  12. skew = skew(double1, double2);
  13. if (grid>=skew) {
  14. System.out.println(grid + " grid");
  15. } else {
  16. System.out.println(skew + " skew");
  17. }
  18. }
  19. }

  20. private static int skew(double double1, double double2) {

  21. if ((double1<1)|(double2<1)) {
  22. return 0;
  23. } else {
  24. int skew1 =(((int)((double1-1)/(1.732/2))+1+1)/2 * (int)(double2) +
  25. ((int)((double1-1)/(1.732/2))+1)/2 * (int)(double2-0.5));
  26. int skew2 =(((int)((double2-1)/(1.732/2))+1+1)/2 * (int)(double1) +
  27. ((int)((double2-1)/(1.732/2))+1)/2 * (int)(double1-0.5));
  28. return (skew1>skew2) ? skew1 : skew2;
  29. }
  30. }
  31. }
關鍵字:UVa Online Judge, ACM. Java

2008年11月4日

用 Blog 賺小錢 - Google Adsense


(2011.12.19更新)
本系列介紹文章已有新版本,請見:
部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
部落格廣告賺錢術(二):博客來AP策略聯盟、Yahoo!奇摩購物中心大聯盟計畫平台、PChome商店街分紅網

自從部落格風行之後
利用在部落格擺放廣告的收益方式也越來越多
這系列就是要介紹幾個比較常見的

首先先介紹的Google Adsense和BlogAD、BloggerAds算是同一類
他們得到收益的方式都是靠網友擊點廣告
當然我們想的到的作弊方式他們也都想的到
所以自己點或者叫朋友幫忙點都是違反規則的

Google Adsense是由Google推出
申請後可以依據自己的喜好設定不同的廣告
譬如說長的像下圖這樣的廣告組:

另外也有連結組的廣告橫幅可以選擇


這些是最單純也最直覺的廣告
使用者看見了點擊然後blog放置廣告的人獲得收益
Google還有另一種廣告方式是透過像左上角Google的搜尋工具

這個工具十分好用可以設定搜尋自己部落格裡的所有資料
對於要在部落格裡找從前文章是很方便的工具
這個小工具的收益方法是Google會在搜尋結果頁面放和搜尋詞相關的廣告
一樣也是要使用者擊點那些廣告後才會產生收益

Adsense產生的收益要累積到100美元才能領取
在網路上有其他介紹相關細節的文章所以在這邊就不贅述了
透過Adsense的網頁我們可以看到廣告出現和點擊的次數
當然還有產生的收益
據說每千次廣告的出現大概只會有1~3次點擊
所以如果出現了奇怪的現象說不定會被Google盯上喔

簡單介紹 :p 大家可以試試看喔

相關文章:
用 Blog 賺小錢 - BlogAD、BloggerAds
用 Blog 賺小錢 - 博客來AP策略聯盟

Money Assistant 記帳軟體圖解教學


出門在外有時候總不知道錢花到哪去了
沒有良好規劃統計的話就只能當個月光族
甚至更慘的到月底就只能吃泡麵維生
如果能養成記帳的習慣的話上面的問題都解決囉
所以在這推薦一個很棒的記帳軟體 Money Assistant

本軟體需要先安裝 .NET framework 1.1
這個軟體的官方連結已經消失了
但是仍可以在 http://freakshare.com/files/r12clw7g/MoneyAssistant_227_Full.exe.html 下載
最終的版本是2.27版
之後似乎就沒有繼續更新了
不過使用上都很正常沒有問題

在安裝完軟體之後首先要新增帳號
帳號的功能就是讓這個軟體可以全家人使用
帳號有搭配密碼所以也不怕內容被看見


第一次使用時要先設定帳戶
在這邊可以新增常用的資產、收入支出
譬如說資產可能有郵局帳戶、現金、I-cash等等


設定完帳戶後得先幫個別的帳戶設好初始值

這樣幾個簡單的設定之後就可以開始使用囉

這個軟體最方便的地方是它可以自由轉換資產
譬如說儲值I-cash就可以把錢從現金轉到I-cash帳戶
當然也可以轉換到其他用途囉



當然記帳軟體最重要是要能紀錄花費
方法很簡單 就只要新增一筆紀錄從資產到支出就可以了


新增後離開就可以看到全部的紀錄了
也要記得對照目前的資產金額是不是都正確喔
才不會忘記哪一筆消費讓帳對不上
也可以看到累積的花費收入是多少呢



另外在左下方也可以選擇只看到當月的收入支出喔



最後最後 如果想知道自己消費的趨勢
這個軟體也提供了一些統計的功能
玩起來還蠻有趣的呢



其實這個軟體還有很多很多強大的功能
不過在這邊沒辦法一一詳述
就讓大家自己慢慢摸吧
希望大家看了這篇以後都能多省點錢喔

關鍵字:Money Assistant, assistance, 記帳, 軟體, 下載, 教學, 圖示, 好用, 方便
參考資料:
  1. 國人自製免費記帳軟體 MoneyAssistant

2008年11月3日

[發佈] NTU-Library-Search


其實這是在werdna-feeds發佈前就寫的東西
大部分的功能並不是我完成的
只是讓我當作踏入這塊領域的入門練習
之前測試了許久開發了一些新東西
也把原始的程式碼更改做出中英文的版本
現在已經正式發佈在圖書館新服務實驗室

想找書或者搜尋資料時總是覺得還要連上特定網頁太麻煩嗎
NTU-Library-Search小工具提供了一個解決之道
只要在iGoogle上面就能簡單的查詢資料喔
而且這個小工具還貼心地提供了中文版英文版兩個版本喔

小工具預覽圖:

英文版:
NTU-Library-Search.png

中文版:
NTU-Library-Search-zh_tw.png

使用步驟如下:
1. 這是個iGoogle小工具
要使用iGoogle服務得先擁有google帳號
如果沒有帳號可以按這裡申請

2. 有了帳號之後選擇點下下面的按鈕將小工具加入iGoogle
英文版:Add to Google
中文版:Add to Google
接著可視自己需求選擇是否將iGoogle設為首頁
加入後的小工具會出現在http://www.google.com/ig

3. 加入小工具後可以點右上角的倒三角形變更設定
取消勾選後選項就不會出現在小工具的頁籤
選項的網站如下:
台大圖書館 : http://www.lib.ntu.edu.tw/
台大整合查詢系統 : http://metacat.ntu.edu.tw/
台大學術資源網 :http://sg.lib.ntu.edu.tw/
台大機構典藏 : http://ntur.lib.ntu.edu.tw/
台大圖書館網站典藏庫 : http://webarchive.lib.ntu.edu.tw/

4. 完成上面三個簡單步驟後就可以開始使用這個小工具了
只要先選取想搜尋的網站 接著將關鍵字輸入按下enter
預設的瀏覽器就會將搜尋結果顯示出來

這個小工具也可以內嵌在blog或個人網頁喔
嵌入英文版
嵌入中文版
先設定長寬顏色邊框 再按下取得程式碼
最後再將程式碼貼上自己的網頁即可
做出來的效果會像下面一樣