文章分類

2011年11月14日 星期一

[轉貼]OfficeTab 讓Word、Excel、PowerPoint 用「分頁」顯示多個文件


※轉貼自重灌狂人

用過Firefox或Opera、Google Chrome...等網路瀏覽器的人,
應該都會對這類軟體使用同一個視窗、不同「分頁」來展示不同網頁的方式印象深刻,
後來很多軟體如EmEditor這類的純文字編輯器也都陸續支援了類似功能,
讓我們可以很快速、方便的開啟很多文件檔,同時編輯快速切換。

如果你也希望能在微軟的Office軟體如Word、Excel或PowerPoint中使用分頁來開啟多個文件檔的話,
可以試試看以下的OfficeTab小軟體,讓Office文書編輯軟體也可以支援多頁籤顯示方式。


▇ 軟體小檔案 ▇ (錯誤、版本更新回報)
•軟體名稱:OfficeTab
•軟體版本:1.20
•軟體語言:英文、簡體中文版
•軟體性質:免費軟體
•檔案大小:1.01MB
•系統支援:Windows 98/2000/XP/2003/Vista
•官方網站:http://hi.baidu.com/officecm
•注意事項:安裝軟體前,請記得先關閉Word、Excel與PowerPoint的視窗。






OfficeTab 1.11版的軟體安裝介面有支援繁體中文跟英文,不過安裝好之後,開始功能表的軟體名稱卻會顯示成簡體中文字(亂碼)。
而在設定頁面的部份在繁體中文電腦中也只能顯示英文版,不過如果安裝好之後你沒有想要更改任何設定,也可以直接使用,
不用管OfficeTab的語言介面是否正常,在Word等軟體中都可正常用分頁的方式顯示、編輯多個文件。



設定方法:

第1步 在安裝軟體時,會出現一個「選擇元件」的視窗,讓我們依照實際需求勾選、安裝哪些項目。如果你都有用到,可以全部都勾選。






第2步 安裝好OfficeTab軟體之後,Word功能表的下方會出現一個Tab工具列,當我們再開啟其他第二、第三個Word文件檔時,便可用不同頁籤顯示多個文件檔的內容。

如果你想調整OfficeTab或Tab工具列的設定,可以在Tab工具列的任意空白處按一下右鍵,再點【WordTab Options】。






第3步 在「WordTab Options」設定視窗中,我們可以勾選是否顯示長檔名、是否永遠顯示Tab工具列或者是否支援按兩下頁籤關閉該文件...等功能。

另外也可在「Position」的地方設定Tab工具列的位置,看是要放在視窗上方、下方或左邊、右邊都可以。






第4步 如果你覺得預設的頁籤圖示長得不好看的話,也可以在「Appearance & Color」頁面中設定頁籤顯示樣式,目前共有11種樣式可供選擇。

另外我們也可自行設定頁籤的顏色,不管是工具列的顏色、頁籤的底色、文字的顏色…等等項目,都可自行修改。




基本上這軟體的功能還算不錯,不過目前測試這軟體無法正常讓Excel與PowerPoint在桌面下方工具列的縮圖合併成一個,
但Word的部份卻可以正常。不確定是不是軟體Bug還是原本就這樣設計,如果大家習慣這樣使用的話,可以裝來玩玩看。


2011年10月5日 星期三

[J2SE]String的應用 - valueOf



從資料庫做查詢,有時一筆資料會包裝成一Map<String,Object>物件。

此時若要把其中一個欄位的資料傳回前端,便要把Object轉型為String

return map.get( "empno" ).toString( );

但map.get( "empno" )很有可能是null,很有可能會出現NullPointException,

一般來說會再寫個if else來判斷。
if( map.get( "empno" )!=null  ){
    return map.get( "empno" ).toString( );
} else {
    return null;
}



前兩天得知String裡面其實已經有寫好這個判斷了,那就是String.valueOf( )方法

public static String valueOf(Object obj)
返回 Object 參數的字元串表示形式。

參數:
obj - 一個 Object
返回:
如果參數為 null,則字元串等於 "null";否則,返回 obj.toString() 的值。
只要return String.valueOf( map.get( "empno" ) );   一行搞定。

之後遇到這樣的情形,就用這個方法吧!!





[J2SE]StringBuffer與StringBuilder



StringBuffer,應用在同步 (synchronization) 或多重執行緒的情況,是thread-safe的。
主要的功用在於進行多個字串的新增、連接、修改、插入、刪除時,
會比String來的節省資源、有效率。其包含了一個用來做字串初始化的"緩衝區"(buffer),
預設有16個字元的長度,這個字串緩衝區可以當下做一些管理,而不需要在修改字串時,
像 String 物件一樣得重新建立新的字串。


StringBuilder,與StringBuffer不同之處是沒有thread-safe,應用於單一執行緒的環境下,
會比StringBuffer更有效率些。


無論StringBuilder或是StringBuffer的緩衝區都有容量上的限制,
不過程式員無需手動去控制 buffer array,如果內部將產生 buffer overflow時,
它們都會自動加大容量 [4]。

2011年9月21日 星期三

正則表示式(Regular expression)

Java Gossip: 使用正則表示式(Regular expression)

如果您查詢J2SE 1.4之後String的線上API手冊說明,您會發現有matches()、replaceAll()等方法,您所傳入的參數是「正則表示式」(Regular expression)的字串,正則表示式的功能是J2SE 1.4之後加入的新功能。

正則表示式最早是由數學家Stephen Kleene于1956年提出,主要使用在字元字串的格式比對,後來在資訊領域廣為應用,現在已經成為ISO(國際標準組織)的標準之一。

Java在J2SE 1.4之後開始支援正則表示式,您可以在API文件的 java.util.regex.Pattern 類別中找到支援的正則表示式相關資訊。

如果您使用String類別來配置字串物件,您可以使用簡易的方法來使用正則表示式,並應用於字串的比對或取代等動作上,以下先介紹幾個簡單的正則表示式。

例如一些常用的範圍,我們可以使用預先定義的字元類別: 
.	符合任一字元
\d	等於 [0-9] 數字
\D	等於 [^0-9] 非數字
\s	等於 [ \t\n\x0B\f\r] 空白字元
\S	等於 [^ \t\n\x0B\f\r] 非空白字元
\w	等於 [a-zA-Z_0-9] 數字或是英文字
\W	等於 [^a-zA-Z_0-9] 非數字與英文字

. 符合任一字元。例如有一字串abcdebcadxbc,使用.bc來比對的話,符合的子字串有abc、ebc、xbc三個;如果使用..cd,則符合的子字串只有bcd。

以上的例子來根據字元比對,您也可以使用「字元類」(Character class)來比較一組字元範圍,例如: 

[abc]	a、b或c
[^abc]	非a、b、c的其它字元
[a-zA-Z]	a到z或A到Z(範圍)
[a-d[m-p]]	a到d或m到p(聯集)
[a-z&&[def]]	d、e或f(交集)
[a-z&&[^bc]]	a到z,除了b與c之外(減集)
[a-z&&[^m-p]]	a到z且沒有m到p(a-lq-z)(減集)









一次只指定一個字元不過癮,也可以用Greedy quantifiers來指定字元可能出現的次數: 

X?	X出現一次或完全沒有
X*	X出現零次或多次
X+	X出現一次或多次
X{n}	X出現n次
X{n,}	X出現至少n次
X{n,m}	X出現至少n次,但不超過m次

另外還有Reluctant quantifiers、Possessive quantifiers等的指定,您可以自行參考 java.util.regex.Pattern 類別中的說明。

在String類別中,matches()方法可以讓您驗證字串是否符合指定的正規表示式,這通常用於驗證使用者輸入的字串資料是否正確,例如 電話號碼格式;replaceAll()方法可以將符合正規表示式的子字串置換為指定的字串;split()方法可以讓您依指定的正規表示式,將符合的子 字串分離出來,並以字串陣列傳回。 


下面這個程式示範幾個正則表示式的應用: 
UseRegularExpression.java
import java.util.Scanner;
 
public class UseRegularExpression { 
    public static void main(String args[]) { 
        Scanner scanner = new Scanner(System.in);
 
        String str = "abcdefgabcabc"; 
        System.out.println(str.replaceAll(".bc", "###")); 
 
        System.out.print("輸入手機號碼: "); 
        str = scanner.next();
 
        // 簡單格式驗證 
        if(str.matches("[0-9]{4}-[0-9]{6}")) 
            System.out.println("格式正確"); 
        else 
            System.out.println("格式錯誤");
 
        System.out.print("輸入href標籤: "); 
        // Scanner的next()方法是以空白為區隔
        // 我們的輸入有空白,所以要執行兩次
        str = scanner.next() + " " + scanner.next();
 
        // 驗證href標籤 
        if(str.matches("<a.+href*=*['\"]?.*?['\"]?.*?>"))
            System.out.println("格式正確"); 
        else
            System.out.println("格式錯誤");
 
        System.out.print("輸入電子郵件: "); 
        str = scanner.next();
 
        // 驗證電子郵件格式 
        if(str.matches(
        "^[_a-z0-9-]+([.][_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$"))
            System.out.println("格式正確"); 
        else
            System.out.println("格式錯誤"); 
    } 
} 

執行結果:
 ###defg######
 輸入手機號碼: 0988-100432
 格式正確
 輸入href標籤: <a href="http://caterpillar.onlyfun.net">
 格式正確
 輸入電子郵件: justin@caterpillar.onlyfun.net
 格式正確

最後兩個href標籤與email驗證例子是很常見的正規表示式應用,您可以仔細看看以瞭解如何比對,並不會特別困難。


------------------


([A-Z]|[a-z])\d{9}
網址
http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
電子郵件
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
郵遞區號
\d{3}((-)?\d{2})? 
電話
[0-9]{2}\-[0-9]{7}
手機
[0-9]{4}\-[0-9]{3}\-[0-9]{3}


正整數
^\d*$ 
整數
^([+-]?)\d*$
小數點
^([+-]?)[1-9]\d*\.\d*$


驗證 IP
^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$
驗證時間 (HH:MM:SS)
([0-1][0-9]|2[0-3])\:[0-5][0-9]\:[0-5][0-9]
驗證日期 (YYYY/MM/DD)
^[0-9]{4}/(((0[13578]|(10|12))/(0[1-9]|[1-2][0-9]|3[0-1]))|
(02/(0[1-9]|[1-2][0-9]))|((0[469]|11)/(0[1-9]|[1-2][0-9]|30)))$


HTML 標籤
/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
使用者名
^[a-z0-9_-]{3,16}$
密碼
^[a-z0-9_-]{6,18}$


中日韓符號區。收容康熙字典部首、中日韓輔助部首、注音符號、日本假名、韓文音符,中日韓的符號、標點、帶圈或帶括符文數字、月份,以及日本的假名組合、單位、年號、月份、日期、時間等。
\u2e80~\u33ffh
中日韓認同表意文字擴充a區,總計收容6,582個中日韓漢字。
\u3400~\u4dffh
中日韓認同表意文字區,總計收容20,902個中日韓漢字。
\u4e00~\u9fffh
彝族文字區,收容中國南方彝族文字和字根。
\ua000~\ua4ffh
韓文拼音組合字區,收容以韓文音符拼成的文字。
\uac00~\ud7ffh
中日韓兼容表意文字區,總計收容302個中日韓漢字。
\uf900~\ufaffh
文字表現形式區,收容組合拉丁文字、希伯來文、阿拉伯文、中日韓直式標點、小符號、半角符號、全角符號等。
\ufb00~\ufffdh

2011年9月16日 星期五

[應用]用來檢核你寫的JAVA程式的好用工具 - CheckStyle,Find Bugs與PMD

<Findbugs簡介>

   程式找出的問題還會依嚴重程式分成 HIGH, NORMAL, LOW 等等級,不過建議還是全都都需要正視並處理(所以選擇low,可讓FindBugs好好檢查你的程式並釋出所有的warnning)
  bug patterns
Bad practice 不好的習慣
  HE:類定義了equals(),卻沒有hashCode()
  SQLPrepared Statement是由一個非常數(變動的)的字串產生
Correctness 程式碼的正確性
  NPnull pointer被使用,沒有檢查參數或方法是否為null
Internationalization 國際化
  當對字串使用upperlowercase方法,如果是非英文的字串,可能會不恰當的轉換 
Malicious code vulnerability 程式碼弱點(可能受到的惡意攻擊)
  FI:一個classfinalize()方法(回收物件)應該是protected,而不是public
Multithreaded correctness 多執行緒的正確性
  SCconstructor使用了Thread.start(),當該類被繼承可能會導致錯誤使用空的synchronized() {}區塊,可能無法完全達到預期的結果
Performance 效能(可能導致性能不佳的程式碼)
  SS:如果屬性被宣告為final,它應該也同時考慮宣告static
  DM:用類似Integer.toString(1)代替new Integer(1).toString();應該用靜態的valueOf方法(Boolean.valueOf(…), String.valueOf(…)…)
  Dodgy 小問題(可能runtime產生錯誤)
  INT:沒必要的整數比較,如X <= Integer.MAX_VALUE
  NP:對方法直接引用,而方法可能返回null
  ICAST:整數相乘結果轉化為long數字,應該將整先轉化為long數字再相乘
  DLS:對一個local變數值,但卻沒有使用該變數
Security 安全性
  Dm: Hardcoded constant database password
  SQLPrepared Statement是由一個非常數(變動的)的字串產生
  HRS: 避免直接將http參數寫入http header裡,應用URL-encode後再加入
Experimental 實驗性
  OBL: 當方法開啟了stream或其他資源(database),使用try/finally確認方法在回傳之前釋放掉資源
更多請參考:
 
<PMD簡介>
有點類似FindBugs,但是主要是偏重Best Practice(好習慣!)的要求,最好也能盡量遵守,從他的建議可以學到不少東西。
PMD可做些甚麼,例如:
  可能會有bug的地方(possible bugs) - 空的try/catch/finally/switch描述句
  未使用到的程式碼(dead code) 區域變數、private method
  較不優的程式碼(suboptimal code) - 效率不良的使用 String/ StringBuffer
  太複雜的寫法(overcomplicated expressions) 過多的if使用、while可以取代for即可做到的事
  重複的程式碼 (duplicated code) – copy/paste的程式碼有可能bug也被複製了
  資源釋放:ConnectResultStatement使用後要確認釋放
 
<CheckStyle簡介>

檢查項目
EqualsAvoidNull
說明
使用equals() method時,避免潛在的NullPointerException疑慮

屬性
範例:
-不好的
String nullString = null;
nullString.equals("My_Sweet_String");

-好的
String nullString = null;
"My_Sweet_String".equals(nullString);



檢查項目
JavadocMethod
說明
檢查方法是否有javadoc註解

屬性
說明
預設值
scope
檢查範圍
public
logLoadErrors
是否載入javadoc註解中所提及的@throws exception classes
true
範例:

檢查項目
NeedBraces
說明
檢查必須使用括號{}

屬性
說明
預設值
範例:
不好的:
if(true)
    a = 0;



好的:
if(true){
    a = 0;
}






檢查項目
AvoidNestedBlocks
說明
檢查是否有使用多餘的括號

屬性
說明
預設值
範例:
public void guessTheOutput()
{
    int whichIsWich = 0;
    {   //多餘的
        int whichIsWhich = 2;
    }
    System.out.println("value = " + whichIsWhich);
}


檢查項目
JavaNCSS
說明
檢查方法與類別所允許的行數(不含註解)

屬性
說明
預設值
methodMaximum
允許單一方法最多n
50
classMaximum
允許單一類別最多n
1500
範例:





檢查項目
Indentation
說明
檢查程式碼層級縮排空格數

屬性
說明
預設值
basicOffset
與上一層級應縮排的空格數
4
braceAdjustment
括號寫在下一行時應縮排空格數
0
caseIndent
使用case應縮排空格數
4
範例:

檢查項目
DeclarationOrder
說明
宣告變數的順序

屬性
說明
預設值
範例:
宣告變數時,依照public, protected, 不描述(package level), private的順序
Class宣告順序,依照static variables, instance variables, 建構子, 方法的順序

檢查項目
LineLength
說明
檢查程式一行程式碼最多的characters 

屬性
說明
預設值
max
一行程式碼最多的characters 
80
範例:

檢查項目
MultipleVariableDeclarations
說明
檢查每個變數的宣告是否自己一行,且僅宣告該變數

屬性
說明
預設值
範例:
-不好的
int x,y = 1;

-好的
int x = 1;
int y = 2;










檢查項目
GenericWhitespace
說明
檢查Generic(泛型) tokens的寫法不要存在空白

屬性
說明
預設值
範例:
-不好的
List < Integer > x = new ArrayList < Integer > ();

-好的
List x = new ArrayList();
List<String> y = new ArrayList<String>();


檢查項目
LeftCurly
說明
檢查左大括號的位置

屬性
說明
預設值
option
在一行的結尾
eol
範例:

檢查項目
ParenPad
說明
檢查左括號(之後或右括號)之前是否有空白

屬性
說明
預設值
option
不可存在空白
nospace
範例:
-不好的
pulic void test(  int a, int b  )
-好的
pulic void test(int a, int b)










檢查項目
RightCurly
說明
檢查右大括號的位置

屬性
說明
預設值
option
else, try, and catch tokens 在同一行
 same
範例:

檢查項目
MissingSwitchDefault
說明
檢查switch statement是否有”default”

屬性
說明
預設值
option


範例:

檢查項目
WhitespaceAround
說明
檢查方法與建構子的body是否為空的;
檢查token是否有空白包覆

屬性
說明
預設值
範例:
public MyClass()  {}      // empty constructor
public void func()  {}    // empty method
int  i  =  0;

-不好的
int i=0;


檢查項目
RegexpHeader
說明
檢查檔案標頭註解是否合乎規則()

屬性
說明
預設值
範例:
^/\*\*\n
^ \* 程式資訊摘要:.+\n
^ \* 類別名稱:(\w*)\.java\n
^ \* 程式內容說明:.+\n
^ \* 版本資訊:(\d+\.)?(\d+\.)?(\*|\d+)\n
^ \* 程式設計人員姓名:.+\n
^ \* 程式修改記錄:\d\d\d\d-\d\d-\d\d (.)+ (.)+\n
^ \* 版權宣告: FDC all rights reserved\.\n
^ \*/\n
package [\w\.]*;

說明:
^   一行的開始
\   跳脫字元
\n  跳新一行
.   任何單一字元
\w  letter(a-zA-Z), number(0-9), underscore(_)
*   表示任何 (\w* 表示任何字元長度的letter, number, underscore)
\d  任何數字
+   one or more (\d+ 表示1個以上的數字)
?   zero or one (\d? 表示1個或沒有數字)
|    or  (\*|\d+ 表示結果為*或者1個以上的數字)


更多可參考http://www.rubular.com/