Total Pageviews

2018/06/12

[jackson] How to define ordering when serializing object properties to JSON ?

Problem
How to define ordering when serializing object properties to JSON ?
Employ class
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
  package test.albert.jackson;
  
  import lombok.Builder;
  import lombok.Data;
  
  @Data
  @Builder
  public class Employee {
  
      private Integer id;
  
      private String name;
  
      private String email;
  
      private String phone;
  
      private Address address;
  
  }


Address class
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
  package test.albert.jackson;
  
  import lombok.Builder;
  import lombok.Data;
  
  @Data
  @Builder
  public class Address {
  
      private String streetAddress;
      private String city;
      private String zipCode;
  
  }


Using ObjectMapper to serialize object properties to JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  package test.albert.jackson;
  
  import java.io.IOException;
  
  import com.fasterxml.jackson.databind.ObjectMapper;
  
  import lombok.extern.slf4j.Slf4j;
  
  @Slf4j
  public class JacksonTest {
  
      public static void main(String[] args) throws IOException {
          Address address = Address.builder().zipCode("110").city("台北市").streetAddress("信義區信義路五段7號").build();
          Employee albert = Employee.builder().id(1).name("Albert").email("albert@gmail.com").phone("0900123456")
                  .address(address).build();
          
          ObjectMapper mapper = new ObjectMapper();
          
          // convert object to JSON
          String json = mapper.writeValueAsString(albert);
          log.debug(json);
      }
  
  }


How-to
You can make good use of @JsonPropertyOrder to define the ordering, for example
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  package test.albert.jackson;
  
  import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  
  import lombok.Builder;
  import lombok.Data;
  
  @Data
  @Builder
  @JsonPropertyOrder({ "id", "name", "address", "phone", "email" })
  public class Employee {
  
      private Integer id;
  
      private String name;
  
      private String email;
  
      private String phone;
  
      private Address address;
  
  }


2018/06/11

[JavaScript] How to get selected value from a drop-down list that allows multiple selections ?

Problem
Assume I have a drop-down list that allows multiple selections.
1
2
3
4
5
6
7
   <select class="form-control" multiple id="importIntentList" 
           name="importIntentList" style="height: 100%;" size="20">
      <option value="1">A</option>
      <option value="2">B</option>
      <option value="3">C</option>
      <option value="4">D</option>
   </select>

I try to get selected value from the drop-down list, how to do it?


How-To
Here has code snippet to get values from the multi-selected drop-down list and push values into array:
1
2
3
4
5
6
7
   var intentSelectedOptions = [];
   var items = document.getElementById("importIntentList");
   for (var i = 0; i < items.options.length; i++) {
       if (items.options[i].selected == true) {
           intentSelectedOptions.push(items.options[i].value);
       }
   }


2018/06/10

[Bootbox] How to keep the modal dialog open until the input is valid?

Problem
I utilize Bootbox to open a dialog, it has one dropdown list for end user to select. And click Import button after select dropdown list.



The code snippet looks like:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
bootbox.dialog({
    title: '匯入專案',
    buttons: {
        importProject: {
            label: '匯入',
            className: 'btn-primary',
            callback: function() {
                var projectSelectedVal = document.getElementById("projectList").value;
                var importOptionVal = document.querySelector('input[name="importOption"]:checked').value;
                if (projectSelectedVal == '') {
                    bootbox.alert('<font color=red><b>請選擇要匯入的專案</b></font>');
                } else {
                    // do something
                }
            }
        },
        cancel: {
            label: '取消'
        }
    }
});

If end user do not select required attribute, I will show warning message to end user. But the Bootbox dialog will close it automatically, how do I keep the dialog open?


How-to
Here has updated code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
bootbox.dialog({
    title: '匯入專案',
    buttons: {
        importProject: {
            label: '匯入',
            className: 'btn-primary',
            callback: function() {
                var projectSelectedVal = document.getElementById("projectList").value;
                var importOptionVal = document.querySelector('input[name="importOption"]:checked').value;
                if (projectSelectedVal == '') {
                    bootbox.alert('<font color=red><b>請選擇要匯入的專案</b></font>');
                    return false;
                } else {
                    // do something
                }
            }
        },
        cancel: {
            label: '取消'
        }
    }
});



2018/06/09

[liquibase] How to add new column in YAML?

Problem
I attempt to add new column in existing table, how to define these change in YAML?


How-To
YAML will looks like:
  - changeSet:
      id: 4
      author: albert
      changes:     
       - addColumn:
          tableName: model_sentence
          columns:  
          - column:
             name: is_green_icon
             type: int


Reference
[1] http://www.liquibase.org/documentation/changes/add_column.html

2018/06/08

[liquibase] How to rename column and modify data type in YAML?

Problem
I attempt to rename an existing column name and modify its data type in liquibase, how to define these changes in YAML?


How-To
YAML will looks like:
  - changeSet:
      id: 4
      author: albert
      changes:     
       - renameColumn:
          tableName: model
          oldColumnName: PREDICT_JSON
          newColumnName: STATISTICS_JSON        
       - modifyDataType:
          tableName: model
          columnName: STATISTICS_JSON
          newDataType: text


Reference
[1] http://www.liquibase.org/documentation/changes/rename_column.html
[2] http://www.liquibase.org/documentation/changes/modify_data_type.html

2018/06/07

[Tools] How to format JSON string in Notepad++

Problem
How to format JSON string in Notepad++?

How-To
You can download JSONViewer Notepad++ plugin, https://sourceforge.net/projects/nppjsonviewer/?source=typ_redirect to fulfill your requirement.

The process regarding download and configuration is as bellows:


You can select all text and use Plugins -> JSON Viewer -> Format JSON to do JSON format



2018/06/06

[Git] How to resolve non-fast-forward problem?

Problem
As I try to push my branch to GitLab
git push origin fix_issue6


I get this error message when I do push:
To https://gitlab.com/xxx/xxx.git
 ! [rejected]        fix_issue6 -> fix_issue6 (non-fast-forward)
error: failed to push some refs to 'https://gitlab.com/xxx/xxx.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.



How-To
Here has the resolution process:

2018/06/05

[閱讀筆記] Antifragile: Things That Gain from Disorder (1/10)


  1. 反脆弱的基本定義,”因為變動,造成的傷害小於帶來的獲益,那就是反脆弱”。
  2. 人類的免疫機制為我們提供了一個認識反脆弱的視角——反脆弱性能讓你從適當的「壞事」中獲益,讓你從脆弱邁向強韌,而強韌則能讓你抵抗更多不利的環境因素。不過要特別注意的是,「壞事」是有分大小的,小壞事無法起到成長的作用,而太大的壞事你可能無法承受。了解了這些之後你會發現,當我們在評估一個人是否強大時,不應該只考慮他現在有多強韌,也應該同時考慮他的反脆弱性,因為具備反脆弱性才能讓他跟上環境的腳步,持續的變得越來越強。
  3. 以人為例,如果你每次染上小病都立刻服用抗生素,那你就喪失了一次「鍛煉」免疫系統的機會,更糟的是,你體內的病菌可能會因你長期服用抗生素而出現抗體,變得更頑強,換言之,你變得更脆弱。塔雷伯把遇上小病就立刻服用抗生素的行為稱為「過度干預」,而醫生成了「脆弱推手」,因為是醫生讓你吃抗生素的,是他間接的把你推向脆弱的。
  4. 當環境發生變化時,容易遭受損害代表「脆弱」(fragile);不受影響代表「強固」(robust);變得更大更強則是「反脆弱」(antifragile)。
  5. 未來是個急遽變化的時代,與其對抗改變,不如加強自己的「反脆弱性」,轉身擁抱改變!
  6. 讓黑天鵝的出現變成對自己有利,能從黑天鵝事件中得到好處,這就是「反脆弱」(antifragile)
  7. 有個簡單的測試可以判斷是脆弱(fragile)或是反脆弱(antifragile),若可以從隨機事件(random events)中獲得有利多於不利就是反脆弱(antifragile),反之就是脆弱(fragile)
  8. 無論是在商場、政治、醫療或是人生,充滿著在不確定的狀況下進行不可預測的(unpredictive decision)決策制定,這些狀況都是隨機的、無法預測的、不透明的或不全然了解的
  9. 人類很本能的想要抑制隨機(randomness)與不穩定(volatility),如此作法會讓人類脆弱化,舉凡經濟、健康、政治、教育等等領域,無所不在
  10. 人類通常會將過去的歷史轉化成平順的、線性與能自圓其說的事件,讓我們低估了隨機性
  11. 複雜系統充滿了難以察覺的相互依賴與非線性的反應。非線性(nonlinear)表示,你施打兩倍的藥物劑量,或指派兩倍的員工數量到產線,你未必可以得到兩倍的效果,有時候可能得到多一點點的效果,或者是比原本更少的效果
  12. Black Swan Problem (黑天鵝問題)最惱人的地方是,罕見事件發生機率是無法計算的。我們對於百年一遇的洪水的了解,一定比五年一遇的洪水了解來得少。
  13. 越罕見的事件,我們就越少去做追蹤,我們就越無法知道其發生頻率,也越無法預期發生後產生的後果
  14. 人類常有求取安逸與穩定的傾向,懂得反脆弱現象,就會知道追求安定,其實是追求脆弱的人生。
  15. 系統就是要經歷挑戰、變化、波動、不安,它才會更好。安逸與穩定,反而會讓它失去進步的契機。
  16. 反脆弱(antifragile)可能可以提供對黑天鵝事件的一些基本防護力。因為黑天鵝就定義來說,就是事前不知道,無法預期,有嚴重影響的重大事件。脆弱的系統將被黑天鵝毀滅,但反脆弱的系統有機會走過黑天鵝的挑戰。
  17. 反脆弱(antifragile)是解決 Black Swan Problem (黑天鵝問題)的解藥,並且了解反脆弱(antifragile)會讓你理解這些罕見事件在人類發展的歷史、科技、知識等任何事物,都是會發生的
  18. 脆弱 (fragile) 是可衡量的,風險則未必,特別是與罕見事件相關的風險
  19. 我們可以衡量脆弱與反脆弱,但是我們無法計算風險與罕見事件的發生機率。例如我們可以評估新建的大樓與 40 年的老公寓,若遇到大地震,後者會比較脆弱;又如當氣溫發生劇烈變化,你的外婆的身體反應會比你更強烈
  20. 大自然具有反脆弱性。生命會消亡,但基因密碼會留下來,大自然藉著不斷淘汰脆弱的事物,來達成整個系統的反脆弱性。持續不斷的失敗,有助於保存整個系統。少了波動,就沒有穩定。
  21. 脆弱推手(fragilista)容易產生由上而下的政策和古怪的新發明,還誤把未知當作不存在。醫療脆弱推手總是過度干預,忽視人體自然的痊癒能力,而開出可能有非常嚴重副作用的藥,連醫生自己都不敢吃;政策脆弱推手誤把經濟當作洗衣機,認為需要三不五時由他不斷出手去攪和;精神脆弱推手用藥物治療孩子,讓他們在教室裡更安份;金融脆弱推手推出風險模型,摧毀了銀行體系,然後卻又再度使用它們
  22. 我們應該用否定法來解決問題,消除錯誤的知識。否定法的應用是建立在少即是多的觀念上,把有限的資源投注在掃除風險。他認為,對於創新與發明,不需要理論的指導,嘗試錯誤的貢獻遠大於正規科學
  23. 引發 2008 年的金融危機,就是由於現代法律、經濟和政治事務日趨複雜,偷偷讓別人承受風險而爆炸的這種做法很容易掩飾。美國立個法,隨便都是幾千頁。愈繁複的法規,就愈能讓參與立法者鑽漏洞
  24. 「因為每個人都這麼做」並不會使事情變成正確,但大家卻經常誤解。社會執行似乎沒有道理的活動行之有年,而且因為未知的理由而繼續堅持做下去
  25. 這個世界的魅力,在於我們沒有能力真正了解它
  26. 『沒有作為』不被認為是種行動,因此我們繼續對於雜訊過度反應,而且這也是為什麼「專業經理人」基金的表現通常很差
  27. 越複雜的系統,越不透明,若再加上人為干涉,會導致無法預期的後果。The simpler, the better
  28. 不要將系統複雜化,秉持著少即是多的觀念,而且通常更有效率
  29. 我們沒有能力預知未來可能有哪些波動 (volatility),我們應聚焦於當波動發生時該如何反應
  30. 我們身處高度不確定、隨機、無法計算機率、非線性與失序的世界,我們常在資訊不透明、複雜與隨機的狀況下進行決策制定



2018/06/04

[閱讀筆記] The Little Book That Builds Wealth (5/7)



  1. 若你可以指認出企業的護城河,你還要想想護城河的強度與能維持多久。有些護城河可以持續數十年,有些則是曇花一現
  2. 如果你買入價格過高,最佳的公司仍有可能會讓你賠錢
  3. 若投資只要找出擁有經濟護城河的企業,在股票市場賺錢就容易多了。實際上,你在股市所付出的價格,對於你未來的投資收益影響巨大
  4. 人是很奇怪的動物,買車會花時間討價還價,為了省幾塊錢開到幾公里遠的較便宜的加油站加油,但是對於買股票,卻是用很模糊的概念再買。會造成此現象,其實是股票鑑價是一件困難的事情,充滿著許多不確定性,即便是號稱股市專家們,也無法做出正確的鑑價
  5. 要買某台筆記型電腦,我們可以到店家或上網進行比價,因為比價的是同一款式的電腦,這很容易比價,但若是要針對企業進行鑑價,可就沒這麼容易。常見的困難有:
    1. 企業間彼此都會有差異,導致其難以進行比較,如成長率、資本回報率、競爭優勢強度等因素,都會影響企業的價值
    2. 企業的價值與其未來財務績效表現息息相關,但是未來的事情通常就是未知,難以預測,導致大部分的人都聚焦於股票的市場價格 (market prices) ,忽略較難取得的資訊  (business values)
  6. 股票現值 (present value) 等於企業未來會產生的現金
  7. 自由現金流量(Free cash flow, FCF),是可自由運用的現金流,是從營運來的現金流量扣減維持現有營運所需的資本支出和稅金後之餘額。企業可以用這些現金為公司的成長擴充,也可以作為發放股東股利,清償負債或是預留下來備度過景氣蕭條期。總之,自由現金流量是公司在不影響營運下可以自由使用的現金餘額,也是衡量公司財務彈性的指標。自由現金流量 = 營運現金流量 - 資本支出 - 利息 - 稅金
  8. 自由現金流量的成長可能預告著盈餘的成長,當公司的營收成長,成本控制得宜,經營有效率等都是自由現金流量成長的關鍵,也代表公司營運的起飛;反之當公司的自由現金流量不足時,不僅喪失可能的投資機會,嚴重時可能被迫增加負債。也因此國外的投資分析師非常重視企業自由現金流量的分析,其重視程度不亞於每股盈餘。
  9. 自由現金流可以用房東來做為類比
    1. 營業收入:每個月收到的租金
    2. 營運費用:房屋貸款、社區管理費等
    3. 資本支出:房屋修繕
    4. 將營業收入減去營運費用、資本支出以後,就是房東的自由現金流,房東可以把這些錢存在銀行、去度假或是購買另外一間公寓來出租
  10. 繼續以房東為例,未來現金流其實就要看未來性
    1. 若公寓旁邊還有其他的土地可以建立更多的公寓,未來的租金收入就會增加,故未來現金流是看多
    2. 若房客都是領薪水的上班族,其價值一定比租給學生來得值錢且不容易遇到收不到租金的困擾,若要調漲房租時,上班族也較容易負擔的起,故未來現金流是看多
  11. 當你要做企業鑑價時,需考慮四個指標:
    1. 風險 (risk):預估的未來現金流 (future cash flows),在未來能實現的機率有多高?
    2. 成長 (growth):現金流能成長到多大?
    3. 資本回報率 (return on capital):為了維持現有賺錢的項目,該投入多少投資?
    4. 經濟護城河 (economic moats):要花多久時間可以產生超額利潤 (excess profits),將競爭者逼到牆角
  12. 公司鑑價的三種工具包含:本益比 (price multiples)、殖利率 (yields) 與內在價值 (intrisic values)
  13. 推動股價漲跌的兩個力量
    1. 投資回報 (investment return):由營收成長與股利所驅動
    2. 投機回報 (speculative return) :由本益比 (price-earnings ratio) 所驅動
  14. Investment return 反映的是公司的財務績效,speculative return 反映的是投資人的樂觀或悲觀的情緒。一間公司的股價從 $10 漲到 $15,是因為EPS 從 $1 增加為 $1.5;或是因為 EPS 沒有增加,本益比從 10 變成 15。前者屬於 investment return,後者屬於 ,speculative return
  15. 若是你用尋找經濟護城河的方式在搜尋投資標的,你就是在最大化你的潛在投資回報,因為你是在尋找最有可能建立經濟價值的公司,以及能夠長期增加營收的公司
  16. 你必須將 speculative return 的負面風險最小化,不要讓其他投資人的情緒波動而傷害你的投資績效。沒有人知道某檔股票五年或十年後的 speculative return 是多少。你應該用 investment return 來做合理的推估。謹慎賤價可以保護你不受市場情緒的負面影響
  17. 進行企業價值評估時,應該將你可以預測的、會造成影響的因素最大化 (如公司財務績效, investment return),將你所無法預測的因素最小化 (如投資人的樂觀或悲觀情緒, speculative return)
  18. 低毛利的產業 (如零售業) ,通常股價營收比(Price-to-Sales Ratio,P/S Ratio 或PSR)都非常低;高毛利的產業 (如軟體業、製藥業),股價營收比通常都很高。所以,不要用本益比來比較不同產業的企業。
  19. 股價營收比 = 股價/每股營收=(股價 × 總股數)/營收= 總市值/營收
  20. 股價營收比,這一指標可以用於確定股票相對於過去業績的價值。市銷率也用於來確定一個市場板塊或整個股票市場中的相對估值。股價營收比越小(比如小於1),通常被認為投資價值越高,這是因為投資者可以付出比單位營利收入更少的錢購買股票
  21. P/S Ratio 較 P/E 好用,是因為本益比本身並不會透露出太多關於股票的評價,簡單來說,20倍的本益比是「高」或是「低」很難有一個界定,除非再考量到整體市場的本益比、主要競爭對手的本益比,或是公司歷史的本益比等資訊,才能理出一些具有參考價值的頭緒。
  22. 帳面價值(Book value)是公司之會計紀錄上所記資產的價值,它通常指資產的取得成本 (如工廠、電腦、不動產、庫存等等) 減去累積折舊的餘額,並非現金流量,使用不同的折舊方法會有不同的帳面價值。
  23. 資產密集的企業如鐵路或製造業等,帳面價值 (book value) 代表著產生收入的所有資產,如火車、工廠與庫存,此類的企業擁有較高的帳面價值 (book value);但是對於提供服務或科技公司,產生收入的資產是人、創意與流程,這些資產卻不見於帳面價值 (book value)
  24. 商譽 (goodwill) 並不是廠房或設備等實物資產,因此被視為是一項無形資產,反映受歡迎的品牌、良好的客戶關係、忠心能幹的員工、專利,或是專有技術等無形資產的價值。商譽 (goodwill) 是資產負債表上資產方的一個項目。商譽通常因企業併購而出現,收購代價超過被收購公司帳面資產淨值的部分,就是商譽,通常視為代表被收購公司的無形資產。
  25. 當帳面價值(Book value)好的不像真的的話,你該看看其帳面價值(Book value)是否包含商譽 (goodwill) ,你應該將 goodwill 扣除來分析會比較恰當,因為 goodwill asset 會膨脹 book value,導致數字失真。如 AOL 收購 Time Warner,book value 在合併後 goodwill 增加 130 billion