Total Pageviews

2018/08/09

[PostgreSQL] No operator matches the given name and argument type(s). You might need to add explicit type casts.

Problem
I have a table which name project (the data type of Project.id is integer):

the domain_projects column stored values which separated by comma.


As I try to execute the following SQL statement, it will occur this error 
SQLState:  42883, No operator matches the given name and argument type(s). You might need to add explicit type casts.


  select *
  from project
  where id in (select unnest(string_to_array( (select domain_projects from project where id = :projectId), ',')))



How-To
Owing to the return type of unnest function is set of any element, the result should be casted to integer to match project.id.



Hence, the updated SQL statement is as bellows:
  select *
  from project
  where id in (select cast(unnest(string_to_array( (select domain_projects from project where id = :projectId), ',')) as int))


2018/08/08

[PostgreSQL] How to split string into multiple rows?

Problem
I have a table which name project:

the domain_projects column stored values which separated by comma.


I attemp to split domain_projects string into multiple rows:


How do to it?

How-To
Here has SQL statement to fulfill this requirement:
  select cast(unnest(string_to_array( (select domain_projects from project where id = :id), ',')) as int) as project_id



Reference
[1] https://www.postgresql.org/message-id/20100121190706.GA12363@tux
[2] https://www.postgresql.org/docs/9.2/static/functions-array.html

2018/08/07

[Java 8] Sorting With JDK 8

Scenario
I have a Song class, and instantiate five instances as bellows:


How-To
Here has an example to do sorting:
 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  package test.albert.sorting;
  
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.Comparator;
  import java.util.List;
  import java.util.stream.Collectors;
  
  import lombok.extern.slf4j.Slf4j;
  
  @Slf4j
  public class SortingExample {
  
      public static void main(String[] args) {
  
          SortingExample sortingExample = new SortingExample();
  
          List<Song> songs = sortingExample.createSongs();
          sortingExample.sortedByYear(songs);
          sortingExample.sortedByArtistAlbum(songs);
          sortingExample.sortedByYearArtistAlbum(songs);
      }
  
      private List<Song> sortedByYear(List<Song> songs) {
          List<Song> sortedSongs = new ArrayList<Song>();
          sortedSongs = songs.stream().sorted(Comparator.comparingInt(Song::getReleaseYear)).collect(Collectors.toList());
  
          log.debug("sorted by rlease year");
          sortedSongs.forEach(s -> log.debug(s.toString()));
          log.debug("\n");
  
          return sortedSongs;
      }
  
      private List<Song> sortedByArtistAlbum(List<Song> songs) {
          List<Song> sortedSongs = new ArrayList<Song>();
          sortedSongs = songs.stream().sorted(Comparator.comparing(Song::getArtist).thenComparing(Song::getAlbum))
                  .collect(Collectors.toList());
          
          log.debug("sorted by artist, album");
          sortedSongs.forEach(s -> log.debug(s.toString()));
          log.debug("\n");
  
          return sortedSongs;
      }
  
      private List<Song> sortedByYearArtistAlbum(List<Song> songs) {
          List<Song> sortedSongs = new ArrayList<Song>();
          sortedSongs = songs.stream().sorted(Comparator.comparingInt(Song::getReleaseYear).thenComparing(Song::getArtist)
                  .thenComparing(Song::getAlbum)).collect(Collectors.toList());
  
          log.debug("sorted by rlease year, artist, album");
          sortedSongs.forEach(s -> log.debug(s.toString()));
          log.debug("\n");
  
          return sortedSongs;
      }
  
      private List<Song> createSongs() {
          Song jay = new Song("告白氣球", "周杰倫的床邊故事", "周杰倫", 2016);
          Song mayday = new Song("任意門", "自傳", "五月天", 2016);
          Song jamHsiao = new Song("阿飛的小蝴蝶", "王妃", "蕭敬騰", 2009);
          Song hebe = new Song("不醉不會", "渺小", "田馥甄", 2013);
          Song lala = new Song("尋人啟事", "尋人啟事", "徐佳瑩", 2015);
          return Arrays.asList(jay, mayday, jamHsiao, hebe, lala);
      }
  
  }


Sorting result:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
  sorted by rlease year 
  Song(title=阿飛的小蝴蝶, album=王妃, artist=蕭敬騰, releaseYear=2009) 
  Song(title=不醉不會, album=渺小, artist=田馥甄, releaseYear=2013) 
  Song(title=尋人啟事, album=尋人啟事, artist=徐佳瑩, releaseYear=2015) 
  Song(title=告白氣球, album=周杰倫的床邊故事, artist=周杰倫, releaseYear=2016) 
  Song(title=任意門, album=自傳, artist=五月天, releaseYear=2016) 
  
 
  sorted by artist, album 
  Song(title=任意門, album=自傳, artist=五月天, releaseYear=2016) 
  Song(title=告白氣球, album=周杰倫的床邊故事, artist=周杰倫, releaseYear=2016) 
  Song(title=尋人啟事, album=尋人啟事, artist=徐佳瑩, releaseYear=2015) 
  Song(title=不醉不會, album=渺小, artist=田馥甄, releaseYear=2013) 
  Song(title=阿飛的小蝴蝶, album=王妃, artist=蕭敬騰, releaseYear=2009) 
  
 
  sorted by rlease year, artist, album 
  Song(title=阿飛的小蝴蝶, album=王妃, artist=蕭敬騰, releaseYear=2009) 
  Song(title=不醉不會, album=渺小, artist=田馥甄, releaseYear=2013) 
  Song(title=尋人啟事, album=尋人啟事, artist=徐佳瑩, releaseYear=2015) 
  Song(title=任意門, album=自傳, artist=五月天, releaseYear=2016) 
  Song(title=告白氣球, album=周杰倫的床邊故事, artist=周杰倫, releaseYear=2016) 


2018/08/06

[Java] How to compare two string dates in Java?

Scenario

The format of string date is yyyyMMdd, ex. 20180806

How-To
Here has sample code:
 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
    @PostMapping(value = "/{utterTemplateId}/utterances/save")
    public @ResponseBody List<Utterance> saveUtterance(@PathVariable Integer utterTemplateId,
            @RequestBody Utterance utterance, Alerter alerter) {
        
        Boolean hasStartDate = !Strings.isNullOrEmpty(utterance.getStartDate());
        Boolean hasEndDate = !Strings.isNullOrEmpty(utterance.getEndDate());
        if ((hasStartDate && !hasEndDate) || (!hasStartDate && hasEndDate)) {
            throw new RuntimeException("請輸入完整上下架日期");
        }
        
        if (hasStartDate && hasEndDate) {
            String startDate = utterance.getStartDate();
            String endDate = utterance.getEndDate();
            DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            try {
                if (dateFormat.parse(startDate).after(dateFormat.parse(endDate))) {
                    throw new RuntimeException("下架日期不可早於上架日期");
                }
            } catch (ParseException e) {
                throw new RuntimeException("上下架日期解析發生錯誤, 錯誤原因: " + e.getMessage(), e);
            }
        }
        
        // ignore some code
    }

2018/08/05

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


  1. 寧願做愚鈍但具有反脆弱性的人,也不做極其聰明但脆弱的人
  2. 人的生命去向從來就不確定,只有那些追尋著天賦和興趣的人,才能在不確定性中碰到所有美麗的意外,並且在未來的某一天,把這些點滴都連接在一起。
  3. 不要跟豬打架,你們都會變髒,但豬會樂在其中。
  4. 對挫折的過度反應 (overreacts)所釋放出來的多餘能量成就了創新。
  5. 有些想法就像折磨人的愛那樣,越想擺脫,越是揮之不去,反而變成一種迷戀。心理學家告訴我們,控制思想會收到反效果,你花越多精力去控制你的觀念和想法,到頭來你卻被你的觀念所控制
  6. 資訊擁有反脆弱性,你越是想掩蓋它,它就會越壯大。例如政治人物想防衛他偷腥的資訊卻搞得身敗名裂;禁書會讓人們想辦法去取得,反而散播速度更快
  7. 批評和詆毀本身就是對壓制的反脆弱性的反應,錯誤的樂觀者樂意看到被批評者的反擊,以驗證一些想法。智慧的人也善於挑釁別人,激發別人對自己的嫉妒,並從反應中受益。一部作品遭到了批評,實際上說明它引起了真實的、毫不虛假的關注,表明它不是無聊的,無聊是作品最致命的缺陷。
  8. 微小的騷動和焦慮滋養了靈魂,讓物種繁榮的不是和平,而是自由。沒有波動,就沒有穩定。
  9. 你我周遭充滿了脆弱與反脆弱,一切是看他是有機(organic)或是機械(mechanical)。例如你的骨頭受到適當的運動與訓練的話,會增加骨質密度;又如盤子、車子等無生命的東西,若受到外力碰撞,則不會有反脆弱的反應
  10. 機器(無生命體)會受到壓力的傷害(如金屬疲勞等);有機體(有生命的)若沒受到任何壓力,反而會受到傷害,有機體就該受到適當的壓力刺激,因為其他隨的時間自我治療、變得更強壯
  11. 人類的衰老源自於失去自我修復能力(self-repair),會喪失此能力源自於錯誤的自我調適(misadjustment,可能是太少受到壓力的刺激或是受到刺激與刺激間的復原間隔時間太短)。面容老化是不可避免的,但是錯誤的自我調適則是可以預防的,欠缺壓力刺激反而對你的健康不利
  12. 我們所處的世界是一個 complex system,彼此間有深深的相互依賴,如同生態體系中的食物鏈一樣,若你將某種動物移除,就會擾亂整個食物鏈,捕食者會因為食物不見而餓死,被捕食者則因天敵消失而數量大增,進一步導致一連串的副作用;又如雷曼兄弟倒閉,不僅僅影響美國,遙遠的冰島也深受影響,產生漣漪效應 (ripple effect)
  13. 很多人以為因為年紀大了,導致骨質流失,容易骨折,但是根據研究顯示,骨頭缺乏壓力,沒有做適當的重量訓練也是造成骨質密度降低的原因之一,人體需要適當的 stressor (壓力因子)才會健康
  14. 人為的老化來自於內部的反脆弱性遭到阻隔
  15. 經濟學之父 Adam Smith 深深了解到市場是一個複雜系統 (complex system),且擁有相互依賴性 (interdependencies),並提出了看不見得手(invisible hand)的概念,意即在價格機制充分運作下,自由市場裡的供給和需求將會自然而然達到均衡,價格與數量都是最適當的水準,彷彿市場運作在冥冥之中受到神的指引一般,因此也有人稱之為「看不見的神之手」(invisible hand of God)。
  16. 語言的學習來自於不得不和別人溝通、了解別人以解決自己需求的壓力,在不斷犯錯與吃力溝通的壓力下才能把語言學好
  17. 現代人將人類的生活當作一部擁有詳盡使用說明書的洗衣機,簡單幾個機械反應,移除現實生活中的不確定性與隨機性,希望讓一切變得高度可預測性,讓人類的生活更加舒適、便利與效率。這一切都是徒然無功的事情,世界的本質就是高度不確定與隨機性
  18. 一個系統,必須要要靠犧牲個體局部的脆弱部分,來達成整體的反脆弱
  19. 毒物興奮效應(Hormesis,源自希臘語hormáein,意為「激活」)是毒理學中用來描述毒物雙相劑量效應的術語,與高劑量毒物對生物體有害;相反,低劑量毒物反而對生物體有益。其劑量效應曲線的特徵為低劑量具有刺激效應、高劑量具有抑制效應。
  20. 具反脆弱性的是「遺傳密碼」(自私的基因),而個別的有機體是相對顯得脆弱,個體不會因為遭受壓力而變得更強,個體會死亡,能夠適應環境的基因會存活下來
  21. 愈用力傷害細菌,存活下來的細菌愈強 (抗藥性),除非完全消滅它們;又如在化學治療的攻擊之後存活下來的癌細胞,往往繁殖更快
  22. 基因喜歡用競爭、混亂與壓力來做篩選,生物基因與組織文化的存活,取決於許多個體與個人的犧牲與淘汰。換言之,大自然與市場往往見機而作、冷血無情與自私自利。
  23. 歷史與大自然都是 complex system,歷史不會讓任何一個帝國永遠的統治地球(如巴比倫人到埃及人,到波斯人,到羅馬人,到現代的美國人)。complex system 會受到隨機性與不可預測性的影響,建立起超越 robust 的機制,每一代都見機而作,自我改造,導致群體與物種不斷地在變化
  24. 演化 (evolution) 會從隨機獲得好處的兩條路有:突變的隨機性與環境的隨機性。兩者都採取類似的方式 (最適者生存),導致存活下來的下一代的特徵出現變化
  25. 大自然不做預測,它用一個可以容納變異,因變異變得更強的演化系統來處理未來變異的問題。所以,我們要以大自然為師
  26. 當你讓自己挨餓,壞的蛋白質會先分解,並且由你的身體回收,這個過程稱為自體吞噬 (autophagy)。這純粹是進化的過程,也就是為了提高適應力而選擇、殺掉最弱的。
  27. 不要害怕犯錯,應該將每次嘗試失敗後的結果視為寶貴的資訊,代表你離正確的解決方案更靠近一步,每次嘗試都很珍貴
  28. 對反脆弱來說,錯誤所造成的傷害,一定比獲得的好處來得少 (前提是此錯誤不會造成萬劫不復的災難),例如每次的船難或空難,都會有詳細的災難調查,調查結果可以成為船隻與飛機製造商進行問題修正的重要資訊來源,避免因為相同原因再次造成災難
  29. 每一次的空難,都給了系統改進的機會,讓我們更接近安全,讓我們下次的航程更加安全,這些都是空難罹難者造就了整體系統的安全性 (犧牲個體來達成整體的反脆弱)
  30. 成功和失敗都能提供你寶貴得訊息,讓你更明白自己,在犯錯之後,不懂得內省、從錯誤中學習到智慧的人才是所謂的輸家


2018/08/04

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


  1. 若你在分析企業的過程犯了錯,你原先買進的理由不再有效,果決地賣出是你最好的選項
  2. 少有企業可以一直維持競爭優勢。若你發現企業的根本優勢已經永遠改變,而非只是暫時,整體營運轉壞,你或許就該考慮賣出股票
  3. 最佳的投資人總是在尋找它們的錢該擺放在哪裡。賣出價值較低的股票來購買 supercheap stock 會是個聰明的策略;若找不到其他具吸引力的標的,將 overvalued stock 賣出,增加現金水位,也是個好策略
  4. 若投資組合中某檔個股的持有比例過高,也可考慮賣出,一切端視你的風險忍受度
  5. 多閱讀可以看出投資決策過程犯了哪些錯誤,並且可以幫助你做出聰明的決策,我推薦的書籍有:
    1. Why Smart People Make Big Money Mistakes and How to Correct Them: Lessons from the Life-Changing Science of Behavioral Economics (by Gary Belsky and Thomas Gilovich)
    2. The Halo Effect: . . . and the Eight Other Business Delusions That Deceive Managers (by Phil Rosenzweig)
    3. Your Money and Your Brain: How the New Science of Neuroeconomics Can Help Make You Rich (by Jason Zweig)

2018/08/03

[閱讀筆記] Bogle On Mutual Funds: New Perspectives For The Intelligent Investor (6/9)

  1. Morningstar 星等評級純粹基於基金過往風險調整後表現數字排序,並無加入主觀評審準則。就是基金具高星等評級,亦不等於其適用於每個投資者的組合或於未來可繼續取得可觀成績。Morningstar星等評級旨在為投資者提供一個簡化篩選基金過程的工具,不應視作買賣基金的建議
  2. 投資者選擇基金時,請注意以下事項:
    1. 如基金經理有變動,Morningstar 星等評級不會隨之改變。因此,評級結果可能只反映了前任基金經理管理該組合的成績。
    2. Morningstar 星等評級把投資目標相近的基金歸類比較。每個基金組別內,有10%具三年或以上表現的基金會評獲5星級。但投資者要注意,若某組基金於過去三年的收益均為負數,該組的5星級基金的表現亦可能是負數。
    3. Morningstar 星等評級結果有變。投資者不應以評級下降作為拋售基金的指引。Morningstar星等評級的轉變,並不一定表示基金表現下滑,可能只是同組內其他基金對手表現較佳所致
  3. 對於 Morningstar 星等評級方式,我主要在意的是其是根據過去的績效所做出來的星等評級。別忘了,過去績效不代表未來績效,現在是五星級的基金,很有可能過了一兩年以後,變成二星級、甚至一星級的基金
  4. Morningstar star system 對於預測越來績效毫無幫助,就連 morningstar 出版者都承認,不要根據 star 來作為買賣建議
  5. 對於智慧型投資者來說,morningstar 的 star system 雖然幫助有限,但是其提供的基金資訊是無可匹敵的。融會貫通共同基金的投資組合結構、風險、回報與成本等,是無價的資產
  6. 報章雜誌列出來的基金績效很有可能是謊言,他的績效常忽略銷售費用(sales loads),忽略費用的結果會導致績效被誇大;另外,失敗、死亡的基金,則會被下架且避之不談。
  7. 基金過去歷史的資料庫充次無所不在的生存者誤差 (Survivorship bias),在熊市的年代,更有基金萎縮到經濟規模之下,結算出清。基金公司不會容許績效長期不彰或無法為公司帶來利潤的基金的存在,它們必需消失。投資人用現存的基金,來推估過去這類型基金的表現,其實是過於樂觀的看法。這個誤差,也是為什麼整個基金投資界,看起來績效都還不會太糟的原因。因為真的太糟的基金,已經被”處理”掉了。
  8. 一般基金公司呈現給投資大眾看的,是基金的投資組合隨著時間經過的價值變化。簡單的說,就是一種 Time-weighted return。而投資者報酬率,則算出整體該基金投資人的錢,在這支基金內會拿到多少報酬,這是一種Dollar-weighted return。
  9. Dollar-weighted return 可計算出內部收益率 (Internal Rate of Return, IRR on an investment) 其概念為應用 現金流折現模型計算內部收益率。Dollar-weighted return才是真相,才是基金參與者的實際狀況。它不僅比常見的Time-weighted return更為重要,更是投資人應該關注的重點。
  10. 當報章雜誌在歌功頌德某個基金經理人時,都不會提到是不是只是幸運地剛好今年獲得較好的績效表現,也不會提及之前失敗的記錄,更不會提及是不是因為基金的經營目標造就卓越的績效表現。當生物科技股蓬勃發展時,即便是平庸的基金經理人也可以獲得卓越的經營績效
  11. Mutual fund newsletters 有些可以提供有價值與有幫助的資訊,但是大部分都是沒有價值且無法達成預期目標(counterproductive)的資訊。當你訂閱這些 newsletters 時,一年可能要付出超過 $125 的訂閱費用,但提供的卻是令人懷疑的價值(dubious value)
  12. 市面上所有基金的資訊,是讓你對過去發生的事情有更好的理解,而不是用來預測未來
  13. Index mutual fund 是擁有金融市場某個特定產業或類別的基金,迄今最耳熟能詳的 index fund 就是 S&P 500,此指數型基金是由大型藍籌股 (large blue-chip companies, 如 Exxon、GE、AT&T、Coca-Cola等) 所組成的,涵蓋美股 70% 的價值。標準普爾500指數的組成股票是由一個委員會選擇並會更換股票。這個運作模式較接近道瓊斯工業平均指數,不過它的嚴格性卻不同於一般的其他指數,其他指數都是少見嚴格的。也正因為標準普爾500指數評選公司的嚴格,它的股市代表性極強,甚至足以顯示美國經濟的興衰。
  14. 由於整個股票市場是由所有投資人所共同擁有。如果被動式投資人 (passive investors, 長期甚至永久持有股票) 可以跟上股票市場的 gross returns (稅前收益),他就可以打敗大部分的主動式投資人 (active investors, 短線殺進殺出)
  15. Passive investors 在管理費用 (management fees) 與交易成本 (transaction costs) 的花費較 active investors 來得低得多,即便是兩者擁有相同的 gross returns (稅前收益),但是扣掉管理費用與交易成本後,passive investors 會擁有較高的 net returns (稅後收益)
  16. 根據長期資料顯示,大部分的投資顧問的投資績效無法打敗大盤
  17. 在近十年來被動投資管理(或稱消極投資管理)基金有加速成長的趨勢。這些基金依據市場指數定價,也就是指數基金。一般宣稱指數基金常態性地擊敗大多數主動投資管理(或稱積極投資管理)的基金;一個研究則指出,隨著時間過去,主動管理的基金平均報酬較 S&P 500 指數少 1.8%。因為指數基金是模仿指數持股比例,相較一般主動管理的基金,所需的投資研究及成本較低,且週轉率較低。指數也是另一種相關的投資商品的計價基礎,指數股票型證券投資信託基金(又稱指數型股票基金,the exchange-traded fund,或簡稱 ETF)。與指數基金(index fund)不同的是,指數基金每日計價,而 ETF 則是連續計價,並且可以買空及賣空。
  18. Wilshire 5000 Index 由威爾遜協會 (Wilshire Associates) 創立於1980年,現已超過7500家成份指數股股數。威爾遜5000指數除了涵蓋 S&P 500 指數的五百家公司,其餘 4500 檔股票是活躍於美國交易市場的公司。該指數目前已涵蓋超過7500支股票。由於涵蓋面廣許多美國投資者稱該指數為“市場總指數” (total stock market),是目前全球最大的指數。
  19. Wilshire 5000 Index 優劣
    1. 優勢:該指數是目前全球綜合性最強的指數。它幾乎涵蓋了所有美國上市公司。
    2. 劣勢:該指數只涵蓋那些總部設在美國的上市公司 因此許多實力雄厚的外國公司都與該指數無緣。該指數還有一種情況非常類似於S&P 500  Index 。 S&P 500  Index 中排名前10%的公司占整個指數值的 ¾ 以上。
  20. 根據研究顯示,只有 2/5 的 euquity mutual funds 的表現可以贏過整體市場,但若將 sales charges 納入考慮的話,僅剩下 1/5
  21. Gross return (稅前收益) 隨著時間拉長,常會傾向回歸均值 (regression to the mean),expense ratio 卻不會有這樣的傾向
  22. 平均來說,equity fund 的平均年度費用約 2.4%,然而 index fund 的年度費用僅 0.2%,equity fund 想追上 index fund 的 net return 非常不容易。因此,你應只投資擁有最低 expense ratios 的 index fund,絕對不要購買要支付 sales load 的 index fund
  23. 當某基金廣告宣稱其績效勝過另外一檔基金的時候,你要注意他是如何比較的,如果用一年的績效來比較,可能其較優異,但是若將時間拉長到五年、十年,結果可能是相反
  24. 為什麼 index fund 很難被投資人所接受
    1. Index fund 本質上是違反直覺的,為什麼沒有管理的 index fund 的績效表現會優於專業經理人管理的基金?
    2. 由於 index fund 可以收取的手續費極低,基金公司也不會主動推銷
    3. 人們喜歡自己選股,希望能打敗大盤,並吹噓一番
  25. 現在市面上有非常多的 index funds 供投資人選擇,一切看你個人的投資目標為何,有些人想買成長型的股票,有些人想買價值型的股票,記得直接選 index funds,不要選擇 active funds,index funds 擁有較低的周轉率 (turnover)、較低的交易成本,最後的績效一定比 active funds 來得好