Total Pageviews

2018/10/01

[閱讀筆記] Thinking, Fast and Slow (7/9)

  1. 前景理論 (Prospect theory) 通過大量的實驗和效用理論 (utility theory) 的運用,概括起來基本內容主要有四點:
    1. 人們不僅看重財富的絕對量,更加看重的是財富的變化量。
    2. 當人們面臨條件相當的「獲得」前景時更加傾向於實現『風險規避 (risk averse)』,而面臨條件相當的「損失」前景時更加傾向於『風險趨向 (risk seeking)』
    3. 人們對損失和獲得的敏感程度是不同的,人們對損失比對獲得更敏感。即財富減少產生的痛苦與等量財富增加給人帶來的快樂不相等,前者要大於後者。損失 (losses) 與獲得 (gains) 的兩者權重 (weighs),正常來說是二比一
    4. 前期的決策的實際結果會影響後期的風險態度和決策。前期獲利可以使人的風險偏好增強;而前期的損失會加劇以後虧損的痛苦,風險厭惡程度也相應提高,但也可能因為極度的風險規避 (risk averse),導致拒絕了很多好機會。
  2. Endowment Effect (原賦效應, 稟賦效應或厭惡剝奪),形容當一個人擁有某項物品或資產的時候,他對該物品或資產的價值評估要大於沒有擁有這項物品或資產的時候。這一現象常常用於行為經濟學的分析中,並與損失厭惡的理論相聯繫。由於 Endowment Effect ,人們在決策過程中,往往會產生偏見,導致對於規避風險的考慮遠遠大於對於追逐利益的考慮,因此人們在出賣物品或資產時,往往要求比其本身更高的價值。套用於股市中:人對利潤及損失的要求並不平等,損失帶來的痛苦,往往比利潤帶來的快樂更大。當要你捨棄手上的股票,往往需要另一隻更好前景、回報更好的股票。所以,要投資者在買賣股票中承認自己錯誤,確定損失,是非常困難,這亦解釋了為何一般人難以在股市中贏錢
  3. Endowment Effect 不但左右人們的投資決定,還影響到人們生活的大小事,具體至一件物件的取捨,抽象至一段感情的收放,小至一個交易,大至人生態度。因為人性厭惡失去 (lose aversion),對於自己擁有的東西,即使客觀價值不高,也不論好醜,都寧願繼續擁有,不願意和別人交換或賣出,也無法接受別人的批評和貶低──雖然實際上很可能是自己對於自己所擁有的東西過於高估。為避免 Endowment Effect ,事先的個股研究以及設定買賣原則是很重要的,別讓自己的好惡影響了投資的判斷力
  4. 當雙方的協調陷入瓶頸,彼此無法在做出任何讓步,即便他們都有取得各自的好處,這是因為損失的痛苦要遠遠大於獲得的快樂 (loses loom larger than gains)
  5. 房屋買賣時,賣家永遠討厭他的房子賣出價格低於當初他買入的價格,這是因為人性厭惡損失 (lose aversion)
  6. 由於人性天生 lose aversion ,所以會較喜歡穩定而非改變
  7. 從高爾夫球選手的推桿表現也可以看出 lose aversion,根據研究顯示,當此次推杆是避免 bogey 或是達成 birdie,推杆的準確率有很大的差別,避免 bogey的準確率比達成 birdie高得多
  8. Bad is stronger than good。負面情緒、不好的父母與負面的回饋所造成的衝擊,永遠比正面的多;負面的消息會比正面的消息被經過徹底的蒐集與整理;不好的印象與負面的刻板印象會很快地被建立起來,而且不容易被打破;友誼需要很多年建立起來,但是毀掉它只需要一個動作
  9. 厭惡損失 (lose aversion) 不論在是個人或組織中,所代表的是一個強大的保守力量,喜歡現況 (status quo) 且改變越小越好,這份保守主義協助我們維持穩定的婚姻、工作等,讓我們的生活貼近參考點 (reference points)
  10. 改革的法案容易受到阻力,因為權益受到損益的一方,其抗爭強度遠大於獲利者
  11. 當某人在付了網球俱樂部的 membership fee 後,發生了網球肘的問題,但是他仍舊忍耐著身體的痛苦繼續去打網球,避免浪費  membership fee 。換個角度想一下,如果沒有付  membership fee ,你如果已經有網球肘的問題,你還會繼續打網球嗎?會繼續拖著病痛打球是因為你將  membership fee 當成 cost,避免繼續打球造成病情惡化則是將  membership fee 視為 dead lose,一切端看你如何 frame 這個問題
  12. 確定性效應(Certainty effect),是一種認知偏差帶來的心理效應,人類對於確定與可能的結果,有給與不同評價的傾向。而對於不可能與低可能性的結果,可能做出過度高估的反應,則稱可能性效應(Possibility Effect)。這個結果不是來自邏輯推導,主要來自風險厭惡的心理。兩個著名的實驗:
    1. A. 確定可以獲得 $30; B. 80%的機會獲得 $45,但20%的機會一無所獲 。根據實驗結果,有78%的人會選擇A方案。但是根據預期效用理論,B方案的預期效用($45*80%+0*20%=36)大於A方案。這個實驗顯示,在這個狀況下,「人在決策時,對結果確定的現象過度重視」。
    2. C. 25%的機會獲得 $30,75%的機會一無所獲;D. 20%的機會獲得 $45,80%的機會一無所獲。在這次實驗中, 42%的參與者選擇 C方案,而58%的人選擇 D方案。第二次實驗,把第一次實驗兩個方案的發生機率同時減少到1/4,保持預期效用不變。但是參與者的選擇,由風險趨避,轉向於風險愛好。
  13. 人們在做決策時,很自然地認為是根據每個項目發生機率來賦予權重來進行評估,但是在真實世界上並非如此,人們常給一些較不可能發生的項目給予過高的權重,反而給予較確定的事情較低的權重。以下兩個實驗,機率都只差 2%,但是會獲得不一樣的選擇
    1. 61%  的機會贏得 $520,000 或 63% 的機會贏得 $500,000:大多數的人會選擇前者,這顯示出『對於不可能與低可能性的結果,可能做出過度高估的反應
    2. 98% 的機會贏得 $520,000 或 100% 的機會贏得 $500,000;大多數的人會選擇後者,這顯示出『人類對於接近必然時對安全的偏好
  14. 一個決策者若希望所做的決策是理性的,一定要遵守 expectation principle
  15. 根據人性的弱點,你在賣保險的時候,你應該強調這個保險可以消除哪些風險,而非降低風險,這樣會讓你的保險商品更有吸引力
  16. 付帳時打開皮夾,裡面有一張1000塊和十張100塊,你會先用哪邊結帳呢? 調查發現,如果我們手上的現金相同,多張小面額的紙鈔硬幣,比大面額的鈔票更容易花掉。在經濟學中,這就叫做「大鈔效應」(denomination effect)。這微妙的心理過程被解釋為,把大面額的鈔票換成小鈔和硬幣時,人們會覺得錢的價值變小了。在掏錢時心中負擔就沒這麼大,覺得自己只花了一點點而已。換個角度也可以說,大面額的紙鈔讓人一目了然,知道自己的目前的總財產有多少,導致我們高估大面額鈔票,低估了小面額,使得人們覺得大面額鈔票價值較高。
  17. 以下有兩個罐子,你要選擇其中一個,如果你摸出一顆紅色彈珠,就算你贏。A罐中有10顆彈珠,有1顆是紅色。B罐中有100顆彈珠,有8顆是紅色。對此,A罐贏的機率是10%,B罐是8%,這樣看來「選擇」顯而易見,但實驗結果顯示,有30%至40%的學生選紅色彈珠較多的B罐,而不是贏得紅色彈珠機率較高的A罐。心理學家Paul Slovic稱它為「分母的忽略」(denominator neglect),意指當你的注意力聚焦在能使你贏的彈珠上,你就不會去理會不能讓你贏的彈珠,至少你不會給予它們同樣注意力。這是人性使然,大部分人的思維方式,對機會率不是十分敏感,於是往往在投資或作其他的決定的時候,放棄了值博率較高的機會
  18. 人們常在追求不太可能發生的收益(如買樂透彩),規避不太可能發生的風險(如買保險)
  19. pseudo-certainty effect:面對收益逃避風險,面對損失喜好風險——即股票稍漲就賣,跌了卻不賣、裝死
  20. 『此疫苗有 0.001% 的風險造成新生兒在注射疫苗後終生癱瘓』與『此疫苗注射後,每 100,000 新生兒中,有一個新生兒在注射疫苗後終生癱瘓』,其實這兩段論述所表達的事實是一樣的,但是後者會讓你聽起來更加害怕,似乎副作用的機率會更高的錯覺。無論是投資或是作其他的決定,要避免陷入人性常見的「分母的忽略」(denominator neglect),也即是說很多人對數字和概率不大敏感,最起碼要時常提醒自己,大腦不要太懶惰,不要被表面的數字影響,要更進一步,找出相關的機率,才能作出更好的決定
  21. 身為一個辯護律師,若要質疑 DNA 證據的正確性,通常都不會告訴法官『此 DNA 證據會有 0.1% 的錯誤機率』,通常會這麼說『每 1000 個案例裡面會有 1 個錯誤』,這樣的說法會較容易引導法官產生合理的懷疑,這就是「分母的忽略」(denominator neglect)
  22. 人們常會高估罕見事件、對罕見的結果給予過高的權重 (相對於其出線的機率),例如海嘯對於日本來說是非常罕見的,但是由於栩栩如生與強烈的印象,導致遊客高估海嘯發生的機率。鮮明的結果帶來的情緒反應,讓人給予這些罕見事件過高的心理加權,進一步影響自己的決策與行為
  23. 我們不應該聚焦在一個單一的可能事件,否則常會高估其發生機率。我們應該列出所有可供選擇的選項,確保各個選項的機率加起來等於 100%,如此你才能做出正確的決策與行為
  24. 對於獲得 (gains) 的時候卻風險趨避 (risk averse),對於損失 (losses) 的時候卻追求風險 (risk seeking),你要避開這種人類的天性,若否你會付出昂貴的代價

  25. Fourfold pattern:

    1. (Top Left: risk averse over high probability gains) 若面臨 95% 的機會來贏得 $10,000 的賭局,人們若有較大的機會去得到大額的回報,其會因為害怕失望而傾向風險趨避 (risk averse),人們願意接受確定期望值較低的回報 (sure gain)。【確定性效應(Certainty effect)】
    2. (Bottom left: risk seeking over low probability gains) 若面臨只有 5% 的機率贏得 $100,000,000 的樂透,人們會因為頭獎的獎金非常誘人,而不管其極低的機率而購買,因為沒有買樂透就沒有贏得頭獎的機會,儘管其機率非常低。此時人們就會因為希望獲得頭獎,態度轉變成風險追求 (risk seeking),反而會拒絕其他期望值較高的選項【可能性效應(Possibility Effect)】
    3. (Bottom Right: risk averse over low probability loses) 若面臨可能有 5% 的機會損失 $10,000,人們卻因為害怕鉅額損失而傾向風險規避 (rsik averse),如人們常願意購買超過期望值的保險,深怕因為一些罕見意外或疾病造成自身損失,這也是保險公司的獲利之道。人們常購買過多的保險來預防罕見疾病,其實只是為了消除心中的憂慮,購買內心的平靜。【可能性效應(Possibility Effect)】
    4. (Top Right : risk averse over high probability loses) 面臨 95% 的機會損失 $10,000,內心雖然是希望避免損失,但是心態卻是尋求風險 (risk seeking)落在此類別的通常都是有著不幸遭遇的人,其面臨的都是不利的選擇,卻接受擁有很高的失敗機率的選擇,冀望有微小的機會來避免巨大的損失




2018/09/30

[Travel] 2018/09 嘉義

嘉義棒球場
IMG_8821

享櫻 shine 和風西洋料理
IMG_8824

IMG_8828

IMG_8827


花磚咖啡。淺嚐館
IMG_8845

IMG_8836

IMG_8842

2018/09/15

[Java] java.security.InvalidKeyException: Illegal key size or default parameters

Problem


When I try to use AES to do encryption and decryption, I got this error message:
Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
 at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
 at javax.crypto.Cipher.implInit(Cipher.java:801)
 at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
 at javax.crypto.Cipher.init(Cipher.java:1249)
 at javax.crypto.Cipher.init(Cipher.java:1186)
 at test.albert.security.AESUtils.encrypt(AESUtils.java:25)
 at test.albert.security.AESUtils.main(AESUtils.java:41)


How-To

JCE download link: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html



Screenshot for Step 2


Screenshot for Step 3


Reference
[1] https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters

2018/09/14

[Neo4j] Using Spring Data to create / delete nodes and relationship

假設我想透過 Spring Data API 建立起以下的 graph:


架構規劃如下:

pom.xml 內容:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>neo4j</groupId>
 <artifactId>springdata</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>springdata</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <java.version>1.8</java.version>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-neo4j</artifactId>
   <version>2.0.0.RELEASE</version>
  </dependency>

  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.16.18</version>
  </dependency>

  <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>23.0</version>
  </dependency>

  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>

 <repositories>
  <repository>
   <id>spring-libs-release</id>
   <name>Spring Releases</name>
   <url>https://repo.spring.io/libs-release</url>
   <snapshots>
    <enabled>false</enabled>
   </snapshots>
  </repository>
 </repositories>
</project>

Value objects - Brand
package neo4j.springdata.vo;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@NodeEntity
@Data
@ToString
@NoArgsConstructor
@RequiredArgsConstructor
public class Brand {

    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String name;

}

Value objects - Product
package neo4j.springdata.vo;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@NodeEntity
@Data
@ToString
@NoArgsConstructor
@RequiredArgsConstructor
public class Product {
    
    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String name;
    
    @Relationship(type = "MADE_BY")
    private Brand madeBy;
    
}

Repository class - BrandRepository
package neo4j.springdata.repository;

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import neo4j.springdata.vo.Brand;

@Repository
public interface BrandRepository extends CrudRepository<Brand, Long>{

    @Query("match(b:Brand) where b.name = {name} return b")
    Brand findByName(@Param("name") String name);
    
    @Query("match(n:Brand) optional match (n)-[r]-() delete r, n")
    void deleteAllBrands();
    
}

Repository class - ProductRepository
package neo4j.springdata.repository;

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import neo4j.springdata.vo.Product;

@Repository
public interface ProductRepository extends CrudRepository<Product, Long> {

    @Query("match (n:Product) optional match (n)-[r]-() delete r, n")
    void deleteAllProducts();
    
}

Service class - BrandService
package neo4j.springdata.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import neo4j.springdata.repository.BrandRepository;
import neo4j.springdata.vo.Brand;

@Service
public class BrandService {

    @Autowired
    private BrandRepository brandRepo;
    
    public void createBrands(List<Brand> brands) {
        brandRepo.saveAll(brands);
    }
    
    public void deleteAllBrands() {
        brandRepo.deleteAllBrands();
    }

}

Service class - ProductService
package neo4j.springdata.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import neo4j.springdata.repository.BrandRepository;
import neo4j.springdata.repository.ProductRepository;
import neo4j.springdata.vo.Brand;
import neo4j.springdata.vo.Product;

@Service
public class ProductService {

    @Autowired
    private BrandRepository brandRepo;
    
    @Autowired
    private ProductRepository productRepo;
    
    public void createProducts(List<Product> products, String brandName) {
        Brand brand = brandRepo.findByName(brandName);
        products.forEach(p -> p.setMadeBy(brand));
        
        productRepo.saveAll(products);
    }
    
    public void deleteAllProducts() {
        productRepo.deleteAllProducts();
    }
    
}

Client class - App
package neo4j.springdata;

import java.util.List;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;

import com.google.common.collect.Lists;

import neo4j.springdata.service.BrandService;
import neo4j.springdata.service.ProductService;
import neo4j.springdata.vo.Brand;
import neo4j.springdata.vo.Product;

@SpringBootApplication
@EnableNeo4jRepositories
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    CommandLineRunner createBrands(BrandService brandService) {
        return args -> {
            List<Brand> brands = Lists.newArrayList(new Brand("Apple"), new Brand("Google"), new Brand("Samsung"));
            brandService.createBrands(brands);
        };
    }

    @Bean
    CommandLineRunner createProducts(ProductService productService) {
        return args -> {
            List<Product> appleProducts = Lists.newArrayList(new Product("iPhne"), new Product("iPad"),
                    new Product("iPad Pro"), new Product("MacBook"), new Product("MackBook Pro"));
            productService.createProducts(appleProducts, "Apple");

            List<Product> googleProducts = Lists.newArrayList(new Product("Nexus 6P"), new Product("Nexus 5X"),
                    new Product("Chromecast"));
            productService.createProducts(googleProducts, "Google");

            List<Product> samsungProducts = Lists.newArrayList(new Product("Samsung Galaxy Note 8"),
                    new Product("Samsung Galaxy Note FE"), new Product("Samsung Galaxy S9"),
                    new Product("Samsung Galaxy A8"));
            productService.createProducts(samsungProducts, "Samsung");
        };
    }

    @Bean
    CommandLineRunner deleteProductAndBrands(BrandService brandService, ProductService productService) {
        return args -> {
            brandService.deleteAllBrands();
            productService.deleteAllProducts();
        };
    }

}


application.properties (記錄連線資訊)
spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret