Total Pageviews

2018/02/06

[JSR 303 - Bean Validation] HV000183: Unable to initialize 'javax.el.ExpressionFactory'.

Problem
I am using JSR 303 to do bean validation.

When I try to initialize 
Validator instance ..... 
Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 

But I get the following error message: 

Exception in thread "main" javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
 at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:115)
 at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:46)
 at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:420)
 at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(ConfigurationImpl.java:596)
 at org.hibernate.validator.internal.engine.ConfigurationImpl.getMessageInterpolator(ConfigurationImpl.java:355)
 at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:149)
 at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
 at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:322)
 at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
 at albert.practice.validation.CustomerService.validate(CustomerService.java:38)
 at albert.practice.validation.CustomerService.create(CustomerService.java:21)
 at albert.practice.validation.CustomerService.main(CustomerService.java:32)
Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager
 at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:107)
 ... 11 more
Caused by: java.lang.ClassNotFoundException: javax.el.ELManager
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 ... 12 more
    



How-to
Add this dependency to your pom.xml
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b08</version>
    </dependency>



Reference
[1] https://stackoverflow.com/questions/42718869/hibernate-validation-unable-to-initialize-javax-el-expressionfactory-error

2018/02/05

[Google Guice] Dependency Injection Example

Google Guice is the framework to automate the dependency injection in applications. Google Guice is one of the leading frameworks whose main work is to provide automatic implementation of dependency injection. 



How-To
Step 1. Add dependency in your pom.xml
1
2
3
4
5
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.1.0</version>
    </dependency>


Step 2. Create a service class to retrieve a person's contact people
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package albert.practice.guice;

import java.util.List;

import com.google.common.collect.ImmutableList;
import com.google.inject.Singleton;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Singleton
public class ContactService {

    public List<Contact> getContacts(String id) {
        log.debug("person id is " + id);
        return ImmutableList.of(new Contact("Mandy", "0912111111"), new Contact("Dad", "0911111111"),
                new Contact("Mom", "0922222222"));
    }

}


Step 3. Create a resource to inject service class and retrieve person's contact people 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package albert.practice.guice;

import java.util.List;

import com.google.inject.Inject;


public class PersonResource {
 
    @Inject
    private ContactService contactService;
    
    public List<Contact> getContacts(String id) {
        return contactService.getContacts(id);
    }
    
}



Step 4. Create a test class
 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
package albert.practice.guice;

import static org.junit.Assert.assertEquals;

import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.google.inject.Guice;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class PersonResourceTest {
 
    private PersonResource personResouce;
    
    @Before
    public void setup() {
        personResouce = Guice.createInjector().getInstance(PersonResource.class);
    }
    
    @Test
    public void testGetContacts() {
        List<Contact> contacts = personResouce.getContacts("123");
        contacts.stream().forEach(c -> log.debug(c.toString()));
        
        assertEquals(3, contacts.size());
    }
}
    





2018/02/04

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


  1. 巴菲特曾說:偉大的企業必須有偉大的護城河,一種是低成本(如 GEICO 保險公司和Costco 超市),一種是大品牌(如可口可樂、Nike 和美國運通公司)
  2. 巴菲特把競爭優勢壁壘稱為“護城河”(moats):“那些所提供的產品或服務周圍具有很寬的護城河的企業能為投資者帶來滿意的回報。”“我們喜歡持有這樣的‘企業城堡’:有很寬的護城河,河里游滿了很多鯊魚和鱷魚,足以抵擋外來闖入者。
  3. 護城河的要義,就是讓事業成為這家公司的獨占,讓對手因法令、因專利、因成本、因地緣等種種關係而無法踏進,那這家公司便有了護城河。
  4. 護城河(moats)是 Morningstar 的選股基礎,其推薦長期投資人要挑選擁有廣泛經濟護城河的公司,長期來說,這類的公司可以獲得高於平均的報酬。你可以長期持有這類型的公司,降低交易成本,獲得較好的報酬。wide-moat company 應是每個人的核心投資組合
  5. 投資股票的策略:
    1. 找出未來幾年可以產生高於平均獲利的公司
    2. 耐心等待到公司股價低於內在價值後再買進
    3. 長期持有股票直到公司營運出現衰退、股價高估或找到更好的投資標的。持有的期間通常是幾年,不會是幾個月
    4. 重複上述三步驟,如果需要的話
  6. 公司持久與否,在於其是否有強大的競爭優勢與經濟護城河,若無明顯競爭優勢與護城河,很容易從英雄變狗熊(from hero to zero)。擁有護城河的公司一定較有價值,也是你該投資的對象
  7. 擁有護城河的公司較值得購買,因為其會長期產生獲利。當你購買具有護城河的公司的股票,你就是買進一間未來幾年受到保護的公司。如同你用較高的價格買進一台好車可以讓你開個十年,若貪便宜買了一台爛車,可能幾年後就會讓你顧路
  8. 高獲利的市場必定會吸引眾多競爭者加入,若沒有護城河的保護,過去的輝煌馬上就成為歷史,這類型的公司稱為 hot-today-and-gone-tomorrow stocks
  9. 擁有護城河的公司會隨著時間穩健地增加公司的內在價值(intrinsic values),這對你的投資回報較有保障
  10. 擁有護城河的公司也擁有較好的回復力,當遇到暫時的困難時,可以利用其原先的競爭優勢恢復公司元氣
  11. 企業的價值在於其未來可以產生的所有現金
  12. 資本回報率(Return on capital)是用來判斷企業獲利能力的最佳方式。其可用來衡量企業如何運用投資人的錢與替投資人產生回報
  13. 資本報酬率是用以衡量公司運用所有資本所獲得經營成效的指標。比率越高,表明公司資本的利用效率越高,反之則資本未得到充分利用。在股票交易市場,股票公開上市的條件之一,就是公司在近幾個年度內資本報酬率必須達到一定的比率。例如,臺灣證券交易所規定,資本報酬率低於 6% 的公司,其股票不得上市;資本報酬率在 6%~8% 之間的公司,其股票只能被列為第二類上市股票;只有資本報酬率達到 8% 以上的公司,其股票才能准予列為第一類上市股票。
  14. 經濟護城河(economic moats)可以保護企業免於流血競爭,長期來說可幫助公司賺更多的錢,對投資人來說就是好的投資標的
  15. Bet on the Jockeys, Not the Horses (不賭馬,賭騎士)通常是指在評估潛在投資案時,創投家通常會查核公司創辦人,檢視他們的背景、評量他們先前的企業、打聽他們的風評。在 harvard business review 中,一項針對 681  家公司裡 885 個創投單位的新研究顯示,許多創投認為,最重要的因素是管理團隊,尤其是創辦人,這甚至比商業構想還重要
  16. 護城河是企業的結構性特色,此優勢可以持續數年且競爭者非常難以複製。但是有些是『誤認的護城河』,如『好產品』(great product)、『高市佔率』(high market share)、『好的執行力』(great execution)與『好的管理』(great management),這四個陷阱會讓你誤以為此公司擁有護城河
  17. 『好產品』很少能建構出護城河,儘管好產品可以產生短期榮景,如 Chrysler 在 1980 年代推出第一款小轎車,替公司印出大筆鈔票,如此成功的成績單,馬上受到 Chysler 相關競爭者的注意,隔年馬上推出相似的款式。由於沒有結構性的特色可以避免其他競爭者侵蝕 Chysler 的利潤,很快的榮景就不復存在
  18. 除非公司擁有經濟護城河來保護自己的業務,競爭者很快就會上門,吃掉你的利潤
  19. 沒有經濟護城河,一家公司的財務業績會急煞車(turn on a dime)
  20. 高市佔率 (high market share) 不代表已經挖好經濟護城河 (economic moats),如 Kodak (底片)、IBM (個人電腦)、Netscape (瀏覽器)、GM (汽車) 與 Corel (文字處理軟體) 等,這些企業在當時都擁有 NO.1 的市占率,但是由於沒有挖好護城河,市占率馬上被其他競爭者侵蝕殆盡。對於投資人來說,與其研究企業如何達到如此的市佔率,不如研究其如何做好防禦、如何捍衛目前的市占率
  21. 企業規模可以幫助公司建立競爭優勢,但是很少會變成經濟護城河,如同市占率也不是護城河的必要元素
  22. 好的執行力與營運效率並無法讓你獲得長久的競爭優勢,除非你是基於一些專屬的流程 (proprietary process) 且不易被複製
  23. 真正的經濟護城河 (economic moats) 是:
    1. 無形資產 (intangible assets):如品牌、專利 (patents) 或法規授權販售商品與服務 許可(其他競爭對手未獲法規許可就不可販售) 等
    2. 轉換成本 (switching costs):公司販售的商品或服務讓客戶很難放棄,因公司建立了昂貴或困難的客戶轉換成本
    3. 網絡效應 (network economics):公司幸運地從網路效應中獲利 (指的是愈多人使用,便愈有價值的服務,即大者恆大),這是一個非常強大的經濟護城河,可以將競爭者隔離在外
    4. 成本優勢 (cost advantage):公司由於其生產流程、地理位置、規模或獨特的資產,導致其擁有成本優勢,能夠提供價格低於競爭者的產品或服務
  24. 所謂的這些公司比那些公司好,是指這些公司有較大的可能性產生持久的、較高的回報
  25. 好的產品、巨大的規模、良好的執行力與管理無法建立長久的競爭優勢,這些是 nice to have,但是還不夠


2018/02/03

[閱讀筆記] Peak and Valleys (2/2)


  1. 將你快速帶離高峰的最常見原因是自負與狂妄;讓你一直停留在低谷的最常見原因則是害怕與恐懼
  2. 當你將自我(ego)放一旁,你會更快地離開低谷;當你將自我(ego)放在一旁,你可以在高峰待的更久
  3. 很多人將低谷視為挫折、疼痛、失望、憤怒與失敗。那是因為你忘了,要走過低谷才能登上高峰,發覺在低谷中隱藏的事物。
  4. 到達下一個高峰的好方法就是追隨你的理想願景(sensible vision)。想像自己沉浸在美好未來的樣貌,描繪出具體可信的細節,不久之後你就會為了實現願景而樂於吃苦耐勞。追隨你的理想願景(sensible vision),是朝向你下一個高峰的最好的方式
  5. 在低谷的痛苦,可以喚醒你之前所忽略的事實(truth)
  6. 當你在低谷走不出去時,因為你腦袋只有恐懼的影響(fearful vision),缺乏理想願景(sensible vision),恐懼就是你的低谷
  7. 在高峰時,要避免過度樂觀;同時在低谷時,要避免過度悲觀。讓自己擁抱現實
  8. 戰勝恐懼,就是你個人的高峰
  9. 當你真的跟著你的理想願景(sensible vision)走,你就建立了高峰。你的恐懼會漸漸散去且你會變得更加平靜與成功
  10. 在人生的旅途上,無論是順境或逆境都是珍貴的禮物,你都可以從中學習到珍貴的事物,順境與逆境都有其價值
  11. 在高峰時,你要更加謙遜,你才能在高峰待的更久
  12. 在低谷時,不要試圖逃避它,應該正面面對低谷,將其視為自我成長的契機
  13. 處在逆境時,要懂得看見「真相」(reality),擁抱最真實的情況,而不是選擇性的蒙蔽自己。在順境時要懂得感恩、保持謙遜,在逆境則是學習、改善現況。
  14. 為了在高峰待的久一點:你的態度要謙遜,時時心存感激。繼續讓事情變得更好、多幫助他人,為了未來的低谷儲備資源
  15. 當你對於如何離開低谷感到困惑時,別忘了高峰就在低谷的對面。反省一下做過那些事情導致自己走入低谷,做相對應的事情,你就會得到相反的結果
  16. 當你在渴求失去的東西,你就在低谷;當你對於自己所擁有的心存感謝,你就在高峰
  17. 當我們在低谷時,如果忘了記取教訓,就可能讓自己變得怨天尤人,汲取教訓、從中學習,才能更快走向另一個高峰、讓自己更上一層樓。
  18. 低谷常常讓人窒息,休息是為了走更長遠的路,有時我們看不清楚事實常常是因為我們身在其中,讓自己從現實中抽離,更能夠看清楚整個事情的原貌。
  19. 你在低谷時,以什麼樣的心境自處,決定了你能多快走出谷底。人會陷入低谷的原因,在於當我們處於高峰時,忽略了某些事實,而那樣的事實讓我們陷入了低谷。
  20. 峰與谷是相連的,只要換個角度思考,上山的路就會出現。
  21. 在今天順境犯下的錯誤,會造成未來的逆境。而在今天逆境做下的正確的事,會開創未來的順境
  22. 當你身處低谷,你應該問自己
    1. 目前現況的真相是什麼?
    2. 我們如何從現在的困境找出正面的事物並使用它?


2018/02/02

[閱讀筆記] The Four Pillars of Investing (2/12)


  1. 我們現在的投資,是為了以後能夠想像。這就是投資的本質:節制眼前的花費,以換取未來的收入
  2. 對於未來,我們不可能做到精確預測,但充分的了解過去,通常可讓我們有能力便是此時此地的風險。雖然報酬仍是未知數,但至少風險可以被控制下來
  3. 無法記取教訓的人,必會重蹈覆轍
  4. 如果將某個國家利率變動過程會製程圖表,就可以當做是這個國家經濟發展過程的「體溫計」,如果體溫攀升,就代表這個國家陷入軍事、經濟或政治危機;如果圖形長時間維持平穩狀態,則意味這個國家正處於長期穩定狀態
  5. 在資本市場中,債券的價格走向正好和利率相反。當利率上升,債券價格便會走軟;當利率下降,債券價格便會上升
  6. 不要把預期收益和實際收益混為一談,不要把未來和過去搞混了。眼前的高報酬意味著未來獲利微薄,過去的低報酬通常意味著未來獲利豐厚
  7. 以低價買進的這個想法總是讓人感覺膽怯,足以創造巨大未來利潤的廉價投資,不可能不伴隨著風險與災難
  8. 對於現在投資人來說,利率風險就幾乎等於通貨膨脹的風險。當你決定要買進三十年期國庫債券,最大的風險就是通貨膨脹吃掉未來的利息,而本金也因此變得毫無價值可言
  9. 利率風險也有解決方案,那就是短期借貸。如果你的貸款或債券會在一個月之內到期,那就可以幾乎完全消除通貨膨脹獲利率風險,投資人大有機會將本金抽回,轉投資在利率更好的標的上,不幸的是,短期借貸一樣有風險
  10. 「票券」(bill)與「債券」(bond)的差異在於,短期債權(short-term obligations,,通常兌現期在一年以內)稱為 bill,長期債權(long-term obligations)稱為 bond
  11. 票券(bill)的利率比債券(bond)更不穩定,因此票券(bill)的投資者必須獲得更高的報酬才能支應這種不確定的成本
  12. 當陽光最耀眼的時刻,正也是投資報酬處於最低點的時刻。事情本就應該如此,穩定與繁榮意味著資產價格居高不下,基於產出與價格之間的反轉關係,未來的報酬自然會相當的低。相反地,當風險逼近眼前,市況淒涼冷清時,則是投資報酬最高的時刻
  13. 債券就是「債」,一般而言,債券有其極限,投資者至多只能收到利息,等時間一到,就回收本金。相對來說,股票則意味著可分享特定公司在未來的經營利潤,如此一來,收益可能沒有上限。當然,投資債券或股票都有可能血本無歸
  14. 債券與股票之間最大的差別在於「通貨膨脹」的影響,由於債券股息固定,因此遭遇通膨時,價值便因此而減損,如果通膨非常嚴重的話,債券可能會一文不值;股票也會受到通膨衝擊,但由於企業可提高貨品與服務的價格,因此營收與價值也會隨著通膨而上升。不過者不代表股票永遠勝過債券,債券也不是沒有揚眉吐氣的時候
  15. 沒有將通貨膨脹的幅度計算在內的報酬稱之為「名目報酬」,若已根據通貨膨脹率調整過的報酬,稱之為「實質報酬」
  16. 簡單來說,投資就是「承擔風險」,並以此「換取報酬」。報酬其實還算容易定義與計算,風險就不是那麼容易定義與衡量了
  17. 年股票報酬幾乎是完全沒有規則且不可預測的,去年的報酬或是過去五年的報酬不可能提示任何與明年報酬有關的訊息,因為他是「隨機移動」的結果
  18. 從股市報酬的長期歷史來看,市場是有可能陷入長達 15 到 20 年的長期衰退的。舉例來說,在 1966 到 1982 年的 17 年間,股市報酬幾乎跟不上通貨膨脹的速度; 1973 與 1974 年的狀況更是悲慘。假設你在 1966 年退休,在通貨膨脹的影響下,你的投資報酬將少的可憐
  19. 當我們追逐市場的短期變化時,真正感受到的是這種為期僅有幾年的短期風險,這也正是讓投資者在夜裡輾轉難眠的「短期風險」。為了短期現象而著迷,本來就是人性中根深蒂固的一部分,是無可忽視的衝動
  20. 在股市大漲時,所有人都相信自己一定會長期投資。不幸的是,歷史也告訴我們,當股市一敗塗地時,就算你想賣也賣不掉

2018/02/01

[閱讀筆記] Purple Cow (2/2)



  1. 一定要先找出市場利基,然後創造卓越非凡的產品。但是,倒過來就行不通了
  2. 如果你的公司裡有人在負責創造紫牛,別干涉他們,不要用內部的評量標準或可行測試,檢視他們開發的新產品是否與現有產品一樣好。你反而應該把這些特立獨行的人找出來,別擋了他們的路
  3. 讓消費者願意聽你說話有四個步驟:
    1. 找到第一眼就令你印象深刻的人,然後爭取他們的許可,與他們溝通
    2. 與這群人裡的噴嚏者一起合作,讓他們幫你推銷創意
    3. 一旦紫牛開始成為賺錢的事業,試著讓不同的人來餵養這頭紫牛,讓服務產品化,產品服務化,讓數千種不同的變化開始萌芽茁壯
    4. 重新投資,再一次創新,不要遺漏任何細節
  4. 如果行銷人員能夠學習投射人們心裡想要什麼產品的科學,就不會有特別的成見與主觀意識。相反地,他們會了解這個過程,並且會順著產品該發展的路往下走
  5. 說話的方式並不重要,重要的是你說了什麼
  6. 驚世駭俗並不一定是不凡,不凡不見得一定要驚世駭俗。有時候,驚世駭俗只會帶來麻煩
  7. Best Buy CEO Brad Anderson曾說:我們不賣自己想賣的東西,只賣人們想要買的東西,然後找出如何由此賺錢的方法。有機會和顧客溝通,都會發現顧客希望我們走的那條路,總是我們覺得最不可能選擇的方向,但是每一次,他們指出的那條路都是最正確的路
  8. 卓越非凡的事情,不見得一定是換掉你工廠裡最大最貴的設備,有可能只是改變你回答客戶來電的方式,也可能是研發新品牌,或為軟體重新定價。一定要讓自己習慣,一有機會就做些不安全的事情,這是你從專案中學習的最好方法,你可以從這樣的練習中看到哪些努力是有效的,哪些是無效的
  9. 低價策略是逃避紫牛戰爭最懶惰的方法,是產品研發人員或行銷人員前驢技窮時的避難所
  10. 如果你想做頭紫牛,現在應該做的事,就是在不找工作時做些卓越非凡的工作。無論是職場生涯或經營一個品牌,只想尋求安全往往是最危險的事。想要安穩地保有一份一輩子的工作,最保險的方法就是做個卓越非凡的人
  11. 只要能提供獨特的商品就可以掌控價格優勢;要是商品獨特,價格又便宜的令人大吃一驚,根本毋須龐大的廣告預算,就能獲得勝利
  12. 日用品市場有個十分明顯的特性,一旦在某個地區站穩了,就可以屆此獲得長期的利潤。日用雜貨商店很難逃脫這樣的框架,所以一定業績登上高峰,就可以在顛峰長期盤據
  13. 紫牛只是整個商品生命週期的一部分,你不可能一直靠紫牛維生(因為這麼做太累、太危險、太昂貴)。但如果你的企業需要成長,你就必須創造出一些新的東西,好好善待你的紫牛才是上策
  14. 八種運用紫牛的方法
    1. 列出時種改變你產品的方法,想辦法滿足你的目標消費群中的一小群人
    2. 野心不要太大,想想那些規模不大,但最容易接受你產品的市場,然後設計一項卓越非凡的商品,讓這個市場完全接受這項產品
    3. 向外尋求資源。當你正努力讓產品有趣刺激時,大工廠潑了你一大盆冷水,那就到別的地方去吧
    4. 一旦可以直接與最忠實的客戶談話,無論是開發產品,或對他們推銷新奇的產品就容易多了
    5. 找一個比你更無趣的產業,看看誰是該產業最卓越非凡的公司,然後模仿他們所做的事
    6. 仔細分辨競爭對手在產業裡的評價。無論他們是以什麼聞名,想辦法比他們做得更多、更好;如果他們打安全牌,你就做和他們完全相反的事情
    7. 在你的產業中找出「不是不能做,只是還沒做」的事,然後立即動手
    8. 常常問自己「為什麼不做?」。你沒做,多數時候是因為害怕、懶惰,或是一直少了一個人問你:「為什麼不做?」