程式設計CLUB
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()
的值。
之後遇到這樣的情形,就用這個方法吧!!
[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()
SQL:Prepared Statement是由一個非常數(變動的)的字串產生
Correctness 程式碼的正確性
NP:null pointer被使用,沒有檢查參數或方法是否為null
Internationalization 國際化
當對字串使用upper或lowercase方法,如果是非英文的字串,可能會不恰當的轉換
Malicious code vulnerability 程式碼弱點(可能受到的惡意攻擊)
FI:一個class的finalize()方法(回收物件)應該是protected,而不是public的
Multithreaded correctness 多執行緒的正確性
SC:constructor使用了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
SQL:Prepared Statement是由一個非常數(變動的)的字串產生
HRS: 避免直接將http參數寫入http header裡,應用URL-encode後再加入
Experimental 實驗性
OBL: 當方法開啟了stream或其他資源(database),使用try/finally確認方法在回傳之前釋放掉資源
更多請參考:
<PMD簡介>
有點類似FindBugs,但是主要是偏重Best Practice(好習慣!)的要求,最好也能盡量遵守,從他的建議可以學到不少東西。
Rulesets - http://pmd.sourceforge.net/rules/index.html
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也被複製了
資源釋放:Connect、Result、Statement使用後要確認釋放
<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個以上的數字)
|
訂閱:
文章 (Atom)