Total Pageviews

2015/12/05

[Java] How to display double in 2 decimal places

Problem
I would like to pass a remarks report parameter to iReport. 
But the amount format should be formatted to 2 decimal places. ex1. 0 should display 0.00, ex2. 68.122223 should display 68.12

Original code snippet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public Report generateDbm030rReport(final String qryYear) {

        Map<String, BigDecimal> dataMap = createInitialMap();

        // query DB and merge
        dataMap = this.query(qryYear, dataMap);
  
  //....
  
        BigDecimal a1Amount = dataMap.get("A1");
        BigDecimal a8Amount = dataMap.get("A8");

        StringBuilder remarks = new StringBuilder();
        remarks.append("備註:<br />");
        remarks.append("1.本表統計各級政府向未納入集中支付基金及特定用途專戶調度周轉金額。<br />");
        remarks.append("2.截至 " + qryYear + " 年 12 月底止向各級政府納入集中支付支基金及特定用途專戶餘額如下:<br />");
        remarks.append("(1)中央政府: " + a1Amount + "  億元 <br />");
        remarks.append("(2)直轄市: " + a8Amount + "  億元 ");

        final String param[][] = { { "remark", remarks.toString() }, { "createOrg", org.getName() } };

        return this.generateReport("dbm030r1", param, dataMap);
    }


How-to
Updated code snippet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 public Report generateDbm030rReport(final String qryYear) {

        Map<String, BigDecimal> dataMap = createInitialMap();

        // query DB and merge
        dataMap = this.query(qryYear, dataMap);
  
  //....
  
        BigDecimal a1Amount = dataMap.get("A1");
        BigDecimal a8Amount = dataMap.get("A8");

        StringBuilder remarks = new StringBuilder();
        remarks.append("備註:<br />");
        remarks.append("1.本表統計各級政府向未納入集中支付基金及特定用途專戶調度周轉金額。<br />");
        remarks.append("2.截至 " + qryYear + " 年 12 月底止向各級政府納入集中支付支基金及特定用途專戶餘額如下:<br />");
        remarks.append("(1)中央政府: " + customFormat(a1Amount) + "  億元 <br />");
        remarks.append("(2)直轄市: " + customFormat(a8Amount) + "  億元 ");

        final String param[][] = { { "remark", remarks.toString() }, { "createOrg", org.getName() } };

        return this.generateReport("dbm030r1", param, dataMap);
    }
 
     private String customFormat(BigDecimal amt) {
        return String.format("%.2f", amt.doubleValue());
    }


Reference
[1] http://stackoverflow.com/questions/5195837/format-float-to-n-decimal-places

2015/12/04

[Fortify] Fix File Separator Issue

Problem

Code snippet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
   /**
     * 複製檔案至新路徑
     * 
     * @param oldfile
     * @param status
     * @param fileName
     * @throws IOException
     */
    public void copyFile(File oldfile, String status, String fileName) throws IOException {
        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMdd");
        String date = sdFormat.format(new Date());
        // 20151130 fix fortify file separator issue
        String newPath = BACKUP_FILE_PATH + status + "\\" + date + "\\";
        File file = new File(newPath);

        InputStream inStream = null;
        FileOutputStream fs = null;

        try {
            if (!file.exists()) {
                file.mkdirs();
            }
            // int bytesum = 0;
            int byteread = 0;

            inStream = new FileInputStream(oldfile);// 讀入原檔
            fs = new FileOutputStream(newPath + fileName);
            byte[] buffer = new byte[1444];

            while ((byteread = inStream.read(buffer)) != -1) {
                // bytesum += byteread; 位元組數 檔案大小
                fs.write(buffer, 0, byteread);
            }

        } catch (Exception e) {
            log.info("複製檔案錯誤", e);
        } finally {
            if (fs != null) {
                fs.close();
            }

            if (inStream != null) {
                inStream.close();
            }
        }
    }

How-to
updated code snippet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    private final String FILE_SEPARATOR = FileSystems.getDefault().getSeparator();
 
    /**
     * 複製檔案至新路徑
     * 
     * @param oldfile
     * @param status
     * @param fileName
     * @throws IOException
     */
    public void copyFile(File oldfile, String status, String fileName) throws IOException {
        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMdd");
        String date = sdFormat.format(new Date());
        // 20151130 fix fortify file separator issue
        String newPath = BACKUP_FILE_PATH + status + FILE_SEPARATOR + date + FILE_SEPARATOR;
        File file = new File(newPath);

        InputStream inStream = null;
        FileOutputStream fs = null;

        try {
            if (!file.exists()) {
                file.mkdirs();
            }
            // int bytesum = 0;
            int byteread = 0;

            inStream = new FileInputStream(oldfile);// 讀入原檔
            fs = new FileOutputStream(newPath + fileName);
            byte[] buffer = new byte[1444];

            while ((byteread = inStream.read(buffer)) != -1) {
                // bytesum += byteread; 位元組數 檔案大小
                fs.write(buffer, 0, byteread);
            }

        } catch (Exception e) {
            log.info("複製檔案錯誤", e);
        } finally {
            if (fs != null) {
                fs.close();
            }

            if (inStream != null) {
                inStream.close();
            }
        }
    }


Reference
[1] http://stackoverflow.com/questions/8075373/file-separator-vs-filesystem-getseparator-vs-system-getpropertyfile-separato

2015/12/02

How to Add User in JBoss AS 6 ?

Problem
If I would like add user in JBoss AS 6, how to do?

How-To
Step 1: Go to [JBOSS-HOME]\\bin, and execute add-user.bat or add-user.sh

Step 2: Choose "type of user"

Step 3: Click enter


Step 4: create user name and password


Step 5: Try Log into JBoss Administration Console



How to utilize Oracle SQL Developer to Connect to Microsoft SQL Server

Problem
Oracle SQL Developer only support connection to Oracle and Access by default.
If I would like to connection to Microsoft SQL Server, how to configure it?



How-To
Step 1. Download jTDS - SQL Server and Sybase JDBC driver from http://sourceforge.net/projects/jtds/files/

Step 2. Tool => Preference => Third Party JDBC Driver. Set library file to Third Party JDBC Driver

Step 3. Click create new database connection. You can find out SQLServer option is the create new database connection dialog after forging configuration.

Step 4. Fill in the SQL Server database connection information and do test. It can connection to SQL Server database successfully via Oracle SQL Developer.


Reference
[1] https://www.dotblogs.com.tw/smartleos/archive/2013/09/16/118705.aspx

2015/12/01

[閱讀筆記] The Intelligent Investor (Part 4)


  1. 智慧型投資人在看財報的時候要注意: 記得要從頭看到尾,因為公司不想讓你知道的東西都放在後面;不要忽略footnote,因為不想讓你知道的事情都會放在footnote
  2. 選股七原則:公司大小適中、財務健全、至少連續20年有發放股利、過去十年營收沒有赤字、過去十年至少有1/3的時間有成長、股價不要超過net asset value的1.5倍、股價不可超過過去三年平均EPS的15倍
  3. Defensive investor 的選股消去法: (1) 公司規模太小(年營收小於10 million) ; (2) 財務體質脆弱 ; (3) 過去十年曾經有過營收赤字 ; (4) 沒有持續發放股利,以上應可以濾掉大部分不健全的公司
  4. 從歷史資料來看,無趣的S&P utility index的績效,勝過自吹自擂的NASDAQ Composite Index
  5. 雖然你是現在投資,但其實你是在投資未來,然而未來是如此不確定,與其花時間在做projection,不如花力氣在protection,不要overpay
  6. 分析師應該了解,他(她)的績效好壞,取決於該檔股票未來會發生什麼事情,而不是過去已經發生的事情
  7. 哪幾檔股票是最好的股票,一直是有爭議的。與其去挑選最好的股票,不如將投資組合做適當的多樣化(diversification),做好protection,降低風險
  8. Projection 是定性(qualitative)分析;Protection是定量(quantitative)分析。定性研究具有探索性、診斷性和預測性等特點,並不追求精確的結論;定量研究是為了對特定研究對象的總體得出統計結果
  9. 一般的股市投資人,應該先把資金投入到指數型基金,這是你的基石,一旦基石穩固後,你再拿一些資金出來實驗、選股。將你的股票資金中,90%投入指數型基金、 10%投入選股實驗。記住,當你的基石夠穩固以後,再來做實驗
  10. 當投資人在選股時,要注意該公司的財務狀況,其流動資產(current assests)至少要是流動負債(current liabilities)的兩倍,長期債務不可超過營運資金(working capital)
  11. 如果你在挑選股票時,覺得詳讀該家公司過去五年來的財務報表這件事很麻煩,不想花時間的話,那麼你不適合自己挑選股票,去買index fund吧
  12. 積極型投資者的選股條件有:流動資產至少是流動負債的1.5倍;債務不能超過淨流動資產的110%;過去五年不能出現營收赤字;每年都有穩定配息;價格低於淨有形資產的120%
  13. 如果你真的對於自己選股深感興趣,記住,這部份只能佔你股票投資資金的10%,其餘通通去買index fund
  14. 最佳與最專業的投資人,與一般人不同,他們只有在公司股價下跌時感到興趣,而不是上漲的時候
  15. 當你發現一家公司的管理者,大部份談論的是公司的股價而不是公司業務時,請遠離這類公司
  16. 成功的投資專家有兩個共同點:一、有紀律並持續執行,即便該技術方法已經退流行;二、時間會花在要做什麼與如何做,不管市場在做什麼
  17. 長期來說,可轉換債券與公司債的績效相較之下,公司債的收益會比較好
  18. 當股市下跌時,可轉換債券的表現會比S&P 500指數好。但是,若跟其他債券相比,其他債券的表現又比可轉換債券好
  19. Bulls make money, bears make money, but pigs get slaughtered (屠殺)
  20. 儘管可轉換債券(convertible bonds)被稱之為債券,實際上他的行為像股票,運作像選擇權
  21. 可轉換債券(convertible bonds)與一般債券相比,可轉換債券風險較高、收益較差
  22. 遠離可轉換債券(convertible bonds),將你的投資組合做好配置:現金、債券、美國與外國股票
  23. 儘管公司有好壞之分,但是股票沒有好壞之別,只有股價有好壞之分(overprice or not)
  24. 透過一連串的併購來成長的公司,最後的結果都不是太好
  25. 短期來說,市場是一個投票機器(voting machine),投資人像趕流行、一窩蜂買某幾檔股票;長期來說,市場是一個體重機(weighing machine),其會衡量公司的本質與真實價值
  26. 智慧型投資人要知道,市場恐慌可以為好公司創造出好價格(即股價跌落至便宜價位)
  27. 如果你買股票的原因單單只是因為其股價上漲,沒有去探究此家公司的價值是否有增加,不用太久,你就會嚐到苦果。這不是機率,這是必然
  28. 每年持續發股利的公司越來越少,公司的管理者說是要把現金留下來,做最妥適的運用,為了未來公司成長做準備,但實際上,這些現金都被浪費掉了
  29. 根據研究顯示,股利發放較少的公司,其未來營收也會比較少;股利發放比較多的公司,其未來營收也會比較高
  30. 公司管理階層的責任並不單單只是在確保公司股票沒有被低估(undervalued),也要確保其被高估(overvalued),避免泡沫化



2015/11/30

2015/11 Travel

行天宮



淡水漁人碼頭
DSC08590

DSC08641

DSC08645

DSC08647

淡水福容飯店
DSC08601
淡水旅遊景點規劃


2015/11/29

[閱讀筆記] 鄭弘儀教你投資致富 (1/2)


  1. 工作不只是幫老闆口袋賺飽飽,也是為了創造屬於自己的資產,特別是要做你所愛,愛你所做,你才會做的認真,做的快樂
  2. 走的慢且堅持到底的人,才是真正走得快的人。堅持到底的道路看起來很遠,卻是達成目標最近的路
  3. 離開現在的工作崗位,必須不是意氣用事,也不是逃避問題,一定要清楚自己的方向,也要有所準備
  4. 對於一艘盲目航行的船來說,任何方向的風都是逆風 ( To a crazy ship all wind are contrary, George Herbert )
  5. 贏得信任必須走一段長路,且不斷接受檢驗
  6. 我今天所取得的成就,並不是說明我比前人高明多少,我只不過是站在前的肩膀眺望,自然看得遠一些罷了
  7. 你自己不可能是位全才,成功通常是由一些多才多藝的智者通力合作的結果
  8. 勇敢跨出第一步,不一定會成功,但是一定不會錯過機會。跨出去不見得有收穫,但不跨出去你永遠不會有機會
  9. 投資理財是「馬拉松競賽」,而非「百米衝刺」,比的是耐力而非爆發力
  10. 你不可能靠收入致富,你要藉由儲蓄本金的投資來致富
  11. 你不理財,財不理你。忽視理財就像忽視健康一樣,遲早會使你付出沈重的代價
  12. 靠薪水是不會致富的,假使你不懂投資理財,靠死薪水存錢養老,別說想老年想福,可能連基本生活費都會不夠用
  13. 你不知道你退休後會發生什麼事情,錢會貶值,利率會下降,這些都是風險
  14. 投資最大的錯誤,就是從不開始,因此也永遠無法退休。投資的越早,複利的迷利便越大
  15. 人的一生,如果被別人需要,就會產生自我價值和成就感
  16. 要考慮到未來不可預知的狀況,保留緊急時所需要的預備金。保險是一個社會風險共同承擔的制度,給社會無法預知的危險一個金錢上的保障。保險早一點買是比較划算的,但是不需要花太多錢在保險上,一般而言,意外險、醫療險、癌症險都是基本保障,但是要注意「住院費用」與「門診費用」的給付是否完整
  17. 近年來所盛行的儲蓄行或投資行保險需視你個人情況而定,因為每個月要繳的費用很高,而且投資型保單有一定的保險存款準備,只有一小部分能使用於投資,且獲利空間並不大
  18. 投資賺錢要行有餘力,特別要把握零負債的原則
  19. 外匯投資在台灣的可操作空間很小,沒有什麼利潤可言。因為台灣政府對外匯的正式,是一個用穩定外匯,讓商人能夠必顯得工具,中央銀行不希望外商銀行賺取外匯波動的錢,原因在於台灣是出口貿易導向型的國家。因此,外匯對於像台灣以貿易為導向的國家而言,是不容易有利潤的
  20. 債券雖然風險很小,有穩定的獲利空間,但是報酬率很低,通常在 2 ~ 5 % 左右。在不景氣的時候,隨著央行利率調降 17 次,市場利率幾乎要降到 0,代表買債券是賺錢的。但是當景氣反轉時,債券市場就會變得無利可圖
  21. 在股市群眾裡,人們的智慧不會增加,反而是愚笨程度會越積越高,而且群眾的理性程度等同於八、九歲的孩童
  22. 大起大落的每股盈餘不適合長線投資,比方說今年每股盈餘賺五元,明年卻賠了三元,此時,配了股票不但沒有填權,股價還越走越低
  23. 檢查所投資的公司是否有揭露董監酬勞和員工分紅所佔的盈餘比率,若是分紅比率過高,就要計算所買的股價是否合理
  24. 股市聽信明牌是最危險的事情,任何旁門左道的「明牌」到了散戶手中就是「廢牌」,你聽到媒體講的「新聞」其實都已經是「舊聞」
  25. 「貨幣供給」是指整個社會在某一時間所存在的貨幣數量。貨幣供給額的增減能夠反應經濟市場資金狀況的好或壞。大致來說,影響貨幣供給額的因素包含貿易逆差、經濟成長率、貨幣流通速度和物價水準等。當貿易呈現順差、經濟不斷成長、貨幣流通速度快及物價水準高,貨幣供給額就會增加,反之則減少。貨幣供給額增加快速,代表這個國家在創造金錢的能力很強;若貨幣供給額增加減速,代表這個國家掙錢能力縮水,錢越來越難賺

2015/11/19

[AngularJS] Round to at most 2 decimal places in ng-grid CellFilter

Problem
I utilize ng-grid to implement the grid as bellows:

The value of 利率 has 4 decimal places, customer ask to change to 2 decimal places.
The ng-grid definition is as following:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 $scope.itemGrid = {
            multiSelect : false,
   data : 'itemData',
            showFooter : false,
            keepLastSelected: false,
   enableColumnResize: true,
            columnDefs : [ {
                field : 'fundName',
                displayName : '借入基金專戶',
                width : '21%',
                cellClass : "text-left",
                cellFilter:'dbm035eFundFilter:row.entity.toFundName : row.entity.debtType=="B"'
            }, {
                field : 'toFundName',
                displayName : '借出基金專戶',
                width : '21%',
                cellClass : "text-left",
                cellFilter:'dbm035eFundFilter:row.entity.fundName : row.entity.debtType=="B"'
            }, {
                field : 'debtDateB',
                displayName : '調借起日',
                width : '10%',
                cellClass : "text-left",
                cellFilter:"dbm035eToStringFilter|dateFilter" 
            }, {
                field : "debtDateE",
                displayName : "調借迄日",
                width : '10%',
                cellClass : "text-left",
                cellFilter:"dbm035eToStringFilter|dateFilter" 
            }, {
                field : "debtAmt",
                displayName : "調借金額",
                width : '10%',
                cellClass : "text-right",
                cellFilter:"dbm035eAmountFilter | number"
            }, {
                field : "debtRate",
                displayName : "利率",
                width : '8%',
                cellClass : "text-right"
            }, {
                field : "remark",
                displayName : "備註",
                width : '20%',
                cellClass : "text-left"
            }
   //....
 }];


How-To
Step 1. Create a cellFilter to debtRate field
1
2
3
4
5
    app.filter('dbm035eRateFilter', function() {
        return function(input) {
            return null==input?null:(Math.round(input * 100)/100);
        };
    });

Step 2. Add this cellFilter to debtRate field
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 $scope.itemGrid = {
            multiSelect : false,
   data : 'itemData',
            showFooter : false,
            keepLastSelected: false,
   enableColumnResize: true,
            columnDefs : [ {
                field : 'fundName',
                displayName : '借入基金專戶',
                width : '21%',
                cellClass : "text-left",
                cellFilter:'dbm035eFundFilter:row.entity.toFundName : row.entity.debtType=="B"'
            }, {
                field : 'toFundName',
                displayName : '借出基金專戶',
                width : '21%',
                cellClass : "text-left",
                cellFilter:'dbm035eFundFilter:row.entity.fundName : row.entity.debtType=="B"'
            }, {
                field : 'debtDateB',
                displayName : '調借起日',
                width : '10%',
                cellClass : "text-left",
                cellFilter:"dbm035eToStringFilter|dateFilter" 
            }, {
                field : "debtDateE",
                displayName : "調借迄日",
                width : '10%',
                cellClass : "text-left",
                cellFilter:"dbm035eToStringFilter|dateFilter" 
            }, {
                field : "debtAmt",
                displayName : "調借金額",
                width : '10%',
                cellClass : "text-right",
                cellFilter:"dbm035eAmountFilter | number"
            }, {
                field : "debtRate",
                displayName : "利率",
                width : '8%',
                cellClass : "text-right",
                cellFilter:"dbm035eRateFilter" 
            }, {
                field : "remark",
                displayName : "備註",
                width : '20%',
                cellClass : "text-left"
            }
   //....
 }];

Check the result


Reference
[1] http://stackoverflow.com/questions/11832914/round-to-at-most-2-decimal-places-in-javascript

[iReport] How to Set Line Break in Text Field

Problem
Here is my existing report design template:

You can see the report column is dynamic.
The report, with PDF format, is generating as following:

But our customer ask to set line break between 一般政府 and (基金或法人名稱).


How-To
1. Click the textfield

2. Set Markup property to styled
3. Java code should amend as bellows:
1
2
3
4
5
6
7
    Dbm037rVo header = new Dbm037rVo();
    header.setFundName("<style>公共公司<br />(基金或法人名稱)</style>");
    header.setRate1Year(Integer.toString(Integer.valueOf(accountYr) - 2).concat(" 年度(比率)"));
    header.setRate1Year(Integer.toString(Integer.valueOf(accountYr) - 1).concat(" 年度(比率)"));
    header.setRate1Year(accountYr.concat(" 年度(比率)"));
    
    result.add(header);


Reference
[1] http://www.tutorialspoint.com/jasper_reports/jasper_report_styles.htm