如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2016年3月2日

Java基本資料型別轉換

原始發文日 :2005/7/1 , 修訂: 2011/11/3, 2016/3/2 作者 : Fred Wang

這是一些簡單常用的Java基本資料型別轉換
1.數字轉字串
1.1 整數轉字串 integer to String 
int i = 20;
String str = Integer.toString(i);
or
String str = String.valueOf(i);
or
String str = "" + i;

1.2 雙精度數字轉字串 double to String :
double d = ...;
String str = Double.toString(d);
or
String str = String.valueOf(d);

1.3 長型態數字轉字串 long to String :
long l = ...;
String str = Long.toString(l);
or
String str = String.valueOf(l);

1.4 浮點型態數字轉字串 float to String :
float f = ...;
String str = Float.toString(f);
or
String str = String.valueOf(f);

2.字串轉數字
2.1 字串轉整數 String to integer :
String str = "20";
int i = Integer.valueOf(str).intValue();  //第一種方法, ValueOf會傳回一個Integer物件
or
int j = new Integer(str).intValue(); //第二種方法
or
int k = Integer.parseInt(str);  //第三種方法

2.2 字串轉雙精度數字 String to double :
double d = Double.valueOf(str).doubleValue()
or
double d = Integer.parseDouble(str);  


2.3 字串轉長型態數字 String to long :
long l = Long.valueOf(str).longValue();
or
long l = Long.parseLong(str);

2.4 字串轉浮點型態數字 String to float :
float f = Float.valueOf(str).floatValue();
or
float f = Float.parseFloat(str);

3.十進位二進位,八進位與十六進位數字的轉換
3.1 十進位轉二進位 (decimal to binary)
int i = 20;
String binstr = Integer.toBinaryString(i);

3.2 十進位轉十六進位 (decimal to hexadecimal)
int i = 20;
String hexstr = Integer.toString(i, 16);
or
String hexstr = Integer.toHexString(i);
or (含前置零與大寫 with leading zeroes and uppercase)
public class Hex {
  public static void main(String args[]){
  int i = 20;
  System.out.print(Integer.toHexString( 0x10000 | i).substring(1).toUpperCase());
  }


3.3 十進位轉八進位 (decimal to octal)
 int i = 20;
String octstr = Integer.toString(i, 8);
or
String octstr = Integer.toOctalString(i);


3.4 十六進位轉整數 (hexadecimal (String) to integer)
int i = Integer.valueOf("B8DA3", 16).intValue();
or
int i = Integer.parseInt("B8DA3", 16);

4. ASCII Code的轉換
4.1 ASCII碼轉字串 (ASCII code to String)
int i = 64;
String aChar = new Character((char)i).toString();

4.2 整數轉ASCII碼 (integer to ASCII code (byte))
char c = 'A';
int i = (int) c;  // i 的值會轉成 65

4.3 從字串擷取ASCII碼 (To extract Ascii codes from a String)
String test = "ABCD";
for ( int i = 0; i < test.length(); ++i ) { 
   char c = test.charAt( i ); 
   int i = (int) c; 
   System.out.println(i); 
}  

5.布林(Boolean)值的轉換
5.1 整數轉布林值 (integer to boolea)
b = (i != 0);

5.2 布林值轉整數 (boolean to integer)
i = (b)?1:0;

5.3 布林值轉字串 (boolean to string)
String str = String.valueOf(b);


6.數字轉換的錯誤處理

使用try/catch來捕捉轉換過程的錯誤
try{
       i = Integer.parseInt(aString);
}  catch(NumberFormatException e) {

}

7.日期與字串的轉換 
7.1 日期時間轉字串 : 顯示預設完整的日期時間格式, 例如 Wed Nov 05 12:05:06 EST 2003
Date dNow = new Date(); 
String sNow = dNow.toString();
 
7.2 日期轉字串 Date to String : 顯示特定的日期格式

方法一日期轉成指定格式的StringBuffer, 再將StringBuffer轉成String
Date dNow = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
StringBuffer sbNow = new StringBuffer();
// 將日期dNow以"yyyy-MM-dd"的格式轉存到StringBuffer sbNow中
sbNow = formatter.format(dNow, sbNow, new FieldPosition(0));
// 將StringBuffer轉成String
String sNow = sbNow.toString();

方法二 日期直接轉成指定格式的字串(String) --比較簡單
Date dNow = new Date(); 

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String sNow = formatter.format(dNow)

7.3 字串轉日期 String to Date
String sDate = "2005-01-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dDate = formatter.parse(sDate,new ParsePosition(0));

8.數字型態間的轉換
8.1 由短數字型態轉換成長數字型態 (擴大轉換)
如byte 轉成 short, int, long, float, 或 double,short轉成int, long, float, or double, char轉成int, long, float, or double, int 轉成 long, float, or double, long轉成float or double, float轉成double
(數字型態由短至長的順序為 byte, short or char, int, long, float, double)

直接指定就可以自動轉換 !
例 :
int a = 50;
long b = a; // widening conversion

8.2 由長數字型態轉換成短數字型態 (縮小轉換,又稱為Casting)
例 :
long a = 100000000L;
int b = (int) a; // narrowing conversion

但是長數字型態的內容長度如果超過較短數字型態可容納的長度,雖然編譯與執行都不有錯誤訊息,但是會造成資料loss的現象。(這種隱含的錯誤,不容易debug,要特別留意)

2015年12月29日

流程管理平台(BPM/Workflow) - ProcessMaker資源備忘

作者: Fred Wang (FW知識瑣記) 日期:2014/8/28, 修訂 : 2015/10/2, 2015/11/19

近期研究多個Open Source的BPM & Workflow platform,其中ProcessMaker安裝方便,入門容易,在這裡作一個資源整理的備忘。

ProcessMaker 在SourceForge中列為企業級的商業流程管理(BPM)與工作流程(Workflow)管理軟體,適用於中小型企業。

引進一套簽核與工作流程軟體,需要投注非常多的時間,深入了解它的流程開發的介面,測試與除錯的方法,客製化使用的物件與程式庫與客製化的限制,異常處理的方法,例如是否有後台管理介面可以由管理員直接跳過特定關卡。

除此之外,如何將一個人工流程轉換成電子簽核流程,需要考慮各相關單位人員的使用上的可能運作與習慣,因此,通知信,催簽,並簽,退信機制,代理人機制,等都可能影響到流程開發的複雜度。

官網 
2. ProcessMaker University      http://university.processmaker.com/
3. ProcessMaker 討論區 http://forum.processmaker.com/
4. ProcessMaker Blog  http://www.processmaker.com/blog/

線上手冊
1 Process Maker 2.x 版線上手冊 http://wiki.processmaker.com/index.php/Main_Page

教學影片

軟體下載
1. SourceForge
2.語言包

範例
  
整合
1.ProcessMaker 官方有專門針對sugarCRM的包
2. sourceforge 第一的工作流開源軟件 ProcessMaker BPM / Workflow http://blog.chinaunix.net/uid-721864-id-97039.html
3.國內有人開發了一個sugar的包 http://blog.sina.com.cn/s/blog_69f512b301019j3r.html

其他

ProcessMaker OpenSource版本主要的問題在於
1. 不提供升級patch
2. 不提供軟體更新patch
3. 不提供流程範本
4. 不提供支援與文件

其中第二點,出現bug時,無法上錯誤更新的patch,讓ProcessMaker  open source版要正式使用運作更為困難。


其他比較有規模的免費的BPM與Workflow平台還有
1. jBPM (企業級): SourceForge Project, 官網
2. Bonita BPM (企業級): SourceForge Project, 官網 
3. YAWL (企業級): SourceForge Project , 官網
4. Joget Workflow (企業級): SourceForge Project, 官網
...等
註 : jBPM並沒有繁體中文版,Bonita BPM Community版與Joget Workflow Community版都不提供LDAP認證功能 


站內相關文章
1. ProcessMaker不同版本間的差異 
2. 流程管理平台ProcessMaker基本開發程序 
3. 流程管理平台ProcessMaker 基本觀念(名詞解釋)


2015年11月25日

三十年來筆者工作用與學習過的程式語言

作者: Fred Wang (FW知識瑣記) 日期: 2015/11/25, 2016/6/8(修訂)

盤點1985~2015年,三十年來筆者工作使用與學過的程式語言。

在工作上,有專案開發與維護經驗的程式語言
1.網站開發,網頁應用系統(Web Application)
     1.1 PHP, Codeignitor(framework)
     1.2 Java, JSP, Structs(framwwork)
     1.3 前台設計 - Javascript, jQuery, HTML, CSS
2. 資料處理
     2.1 SAP ABAP/4 -世界排名第一的ERP ERP平台 "SAP" 專用的程式語言,通常是中大型企業使用。
     2.2 VB,  VBX - VBX是Microsoft Word, Excel內的自動化語言,可與Microsoft SQL Server整合,對個人與小型公司而言,可以採用此技術做為便宜的資料處理方案。
     2.3 SQL : Oracle, SQL Server, mySQL,SQLite等資料庫的標準查詢語言,可以直接在這些資料庫提供的Script Editor或透過Toad編輯SQL命令,直接查詢或存取資料庫。
     2.4 COBOL : 個人經驗是用於早期大型系統 IBM S/36與王安電腦系統做資料處理。
     2.5 Clipper, DBaseIII, Foxbase : 開發小型的商業應用系統。  註:現在已經沒甚麼人在用了
3. 業務流程開發
     3.1 Notes Script on Lotus Notes
     3.2 Java on Agentflow
     3.3 PHP+Javascript on ProcessMaker
4. 自動化應用 :
     4.1 AutoIT, PHP  透過這些語言強大的字串處理函式,開發自動化機器程式,排程自動執行,如Web Crawler,Data Parser,B2B,C2B, G2B應用等。

在工作上, 僅維護無專案開發經驗的程式語言
1. Python : 個人經驗是應用於通訊介面
2. C, C++ : 自動化應用,資料處理 等
3. RPGII   : 個人經驗是於早期大型系統 IBM S/36做資料處理,註:現在已經沒甚麼人在用了

只有在學校學過, 寫過作業或個人練習的程式語言
1. Pascal  : 資料結構課。
2. Fortran, Basic, VB : 計算機概論課, 用VB寫一些小遊戲。
3. Assembly : 電腦安全課,實驗反組譯並改寫病毒程式。
4. Prolog, Lisp : 人工智慧課。

不同的程式語言適合不同的應用,沒有最好的,只有最合適的。把程式語言當成工具, 用對工具後, 把較多的時間用在思考解決問題的方法,及最好的邏輯來解決問題。

2015年11月23日

ProcessMaker流程開發 - ProcessMaker的Trigger能做甚麼? 使用的時機?

作者: Fred Wang (FW知識瑣記) 日期: 2015/11/23


ProcessMaker的Trigger提供流程設計大量客製化功能與彈性, 提供流程進行過程中的後端資料處理, 根據官方文件與筆者的實作案例,列出下面的應用 :

資訊取得
1. 取得 使用者, 使用者主管,代理人等資訊
2. 取得 流程流程監督人資訊
3. 取得流程名稱, 關卡(Task)名稱 , 單據(Dynaform)名稱
4. 取得案件備忘資訊
5. 查詢ProcessMaker任意資料庫表格的內容(使用executeQuery)
6. 存取與開啟公共區的檔案
7. 存取流程與案件的全域變數, ProcessMaker客製化資料表(PM Table)與外部資料庫
8. 取得下個關卡被指派的使用者
9. 取得欄位的文字標籤

內容設定與轉換
1. 設定表單填寫的預設值
2. 顯示案件清單在一個Grid內
3. 動態產生網頁連結
4. 增加案件備忘資訊
5. 資料格式轉換, 例如移除金額欄位的千位分隔號與幣別符號, 轉成數字
6. 設定某一流程的案件計數器
7. 產生輸出文件檔案

使用者設定
1. 使用者新增,更改, 指定群組

流程處理
1. 跳過案件的某個關卡
2. 導到特定的案件或步驟
3. 流程中斷跳離
4. 錯誤處理
5. 重導到其他網頁(Redirection)
6. 案件新增, 暫停, 取消與刪除

郵件通知
1. 取得(多個)使用者的郵箱地址,用來產生寄件者清單
2. 將檔案加入郵件附件
3. 郵件中包含流程檔案管理中的附件檔
4. 傳送使用者上傳的檔案
5. 傳送程式產生的檔案
6. 信件中加入HTML連結與圖片
7. 信件中包含表格資訊
8. 送信件給一個案件目前的使用者
9. 送信件給目前案件使用者的主管
10. 送信件給下一關卡的使用者
11. 送信件給前面關卡的使用者
12. 送信件給一個案件所有參與者
13. 送信件給一個部門的所有成員
14. 送信件給一個群組的所有成員
15. 送信件給某種角色的所有使用者
16. 關閉案件並傳送通知

ProcessMaker的Trigger透過PHP程式碼,使用ProcessMaker提供的功能函式,可以進行上面各類應用的開發。

ProcessMaker的使用時機有五個
1. Before Dynaform 也就是輸入表格顯示前
    應用1 : 在第一個關卡, 案件開始(@@INDEX==1)可以設定案件的預設值
    應用2 : 可用來設定每一關卡的預設值

2. After Dynaform 此時使用者已經按下"送出/下一步",但關卡資料尚未寫入資料庫
    應用 : 檢查使用者的輸入值,可以讓游標停留在有問題的欄位,並讓該欄位用紅框顯示。

3. Before Assignment 此時關卡資料已經寫入資料庫, 但下一關卡負責人尚未被指派
    應用 : 如果下一工作階段採Vaue Based Assignment, 可以在此指定下一關負責人

4. Before Routing 此時案件的下一關卡Routing紀錄尚未寫入資料庫(wf_.APP_DELEGATION表格)
     應用 : 在第一個關卡,申請人勾選案件作廢,在此時機將此案件取消

5. After Routing 此時案件的下一關卡Routing紀錄已經寫入資料庫(wf_.APP_DELEGATION表格) 

    應用1 : 通知下一關簽核人
    應用2 : 如果是簽核關卡,簽核人選擇退件,則發送退件通知給簽核人
    應用3 : 最後一個關卡,在此可以發送案件審核完成通知

ProcessMaker流程開發 - Javascript in Dynaform功能與限制

作者: Fred Wang (FW知識瑣記) 日期:2015/11/23

ProcessMaker使用者介面客製化,除了使用Dynaform Designer外,可以使用Javascript來客製化,更改外觀,進行資料檢查等,提升ProcessMaker動態輸入表格(Dynaform)的可用性與功能。下面說明在ProcessMaker中Javascript能做甚麼? 不能做甚麼?

Javascript在Dynaform,能做甚麼?
1. 可以根據使用者行為動態隱藏與顯示欄位
2. 可以改變欄位的文字與風格屬性
3. 可以提供訊息和警示協助與指引使用者
4. 可以驗證與標準化輸入到欄位內的資料
5. 可以自動插入值到欄位內
6. 可以計算欄位間的值
7. 可以管理網格欄位的操作
8. 可以在Submit前檢查資料並強制使用者變更內容
9. 可以開啟與關閉其他的視窗

Javascript是瀏覽器端的程式語言,由瀏覽器來解析與執行。由於安全理由,Javascript對伺服器端的資料存取與操作控制有一些限制。

Javascript在Dynaform,不能做甚麼?
1. 無法存取不在DynaForm內的資料
2. 不能存取伺服器中的資料庫
3. 不能執行伺服器中的作業
4. 無法執行外部程式