Total Pageviews

2017/09/08

[webMethods] How to invoke a Flow Service from a Java Service

Problem
如何在 Java Service 中,呼叫一個 Flow Service?

How-To
按照不同的情境 (synchronous 或 asynchronous),與有參數或無參數,需呼叫不同的 API,JavaDoc 如下:
JavaDoc for asynchronous


JavaDoc for synchronous


Examples:
1. Asynchronous and DO NOT have input parameter
    Session session = Service.getSession(); 
    Service.doThreadInvoke("test.work", "Test_Flow", session, IDataFactory.create());


2. Asynchronous and HAVE input parameter (s)
    Session session = Service.getSession(); 
    
    IData input = IDataFactory.create();
        
    IDataCursor inputCursor = input.getCursor();
    IDataUtil.put(inputCursor, "input", " test test ");
    inputCursor.destroy();
    
    Service.doThreadInvoke("test.work", "Test_Flow", session, input);


3. Synchronous and DO NOT have input parameter
    Service.doInvoke("test.work", "Test_Flow", IDataFactory.create());


4. Synchronous and HAVE input parameter (s)
    IData input = IDataFactory.create();
        
    IDataCursor inputCursor = input.getCursor();
    IDataUtil.put(inputCursor, "input", " test test ");
    inputCursor.destroy();
    
    Service.doInvoke("test.work", "Test_Flow", input);

2017/09/07

How to call a REST service in webMethods Integration Server from commons-httpclient

Scenario
Assume I had created two REST Resources in webMethods, one is via HTTP Post method, another one is by HTTP Get method.

How do I test them by commons-httpclient?


How-to
Add two dependencies in your pom.xml
    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency>

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>


Here has sample code to demonstrate how to send  HTTP Post method and HTTP Get method using commons-httpclient:
package albert.practice.httpClient;

import java.io.IOException;

import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.io.IOUtils;

import com.google.common.base.Charsets;

public class HttpClientExample {

    private String post_uri = "http://10.12.14.28:5555/rest/test.restful.RestTest2";
    private String get_uri = "http://10.12.14.28:5555/rest/test.restful.RestTest3";
    private String inputJson = "{\"ip\":\"10.10.12.66\",\"state\": \"OFFLINE\"}";

    /**
     * Implements the HTTP POST method.
     * 
     * @return response code
     * @throws HttpException
     * @throws IOException
     */
    public int sendPost() throws HttpException, IOException {
        AuthScope authScope = getAuthScope();
        Credentials credentials = getCredentials();

        HttpClient client = new HttpClient();
        client.getState().setCredentials(authScope, credentials);

        PostMethod postMethod = new PostMethod(post_uri);
        postMethod.setDoAuthentication(true);
        postMethod.setParameter("data", inputJson);

        return client.executeMethod(postMethod);
    }

    /**
     * Implements the HTTP GET method.
     * 
     * @return the response string of the HTTP method
     * @throws HttpException
     * @throws IOException
     */
    public String sendGet() throws HttpException, IOException {
        String responseString = "";

        AuthScope authScope = getAuthScope();
        Credentials credentials = getCredentials();

        HttpClient client = new HttpClient();
        client.getState().setCredentials(authScope, credentials);

        GetMethod getMethod = new GetMethod(get_uri + "?input=albert");
        getMethod.setDoAuthentication(true);

        int statusCode = client.executeMethod(getMethod);
        if (HttpStatus.SC_OK == statusCode) {
            responseString = IOUtils.toString(getMethod.getResponseBodyAsStream(), Charsets.UTF_8);
        }
        return responseString;
    }

    /**
     * Set authentication scope.
     * 
     * @return authentication scope
     */
    private AuthScope getAuthScope() {
        String ip = "10.12.14.28";
        int port = 5555;
        String realm = AuthScope.ANY_REALM;

        AuthScope authScope = new AuthScope(ip, port, realm);
        return authScope;
    }

    /**
     * Set the authentication credentials for the given scope.
     * 
     * @return credentials
     */
    private Credentials getCredentials() {
        String username = "cctv";
        String password = "cctv";
        Credentials credentials = new UsernamePasswordCredentials(username, password);
        return credentials;
    }

}


Here has the test code:
package albert.practice.httpClient;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.IOException;

import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.junit.Before;
import org.junit.Test;

public class HttpClientExampleTest {

    private HttpClientExample httpClientExample;

    @Before
    public void setup() {
        httpClientExample = new HttpClientExample();
    }

    @Test
    public void testSendPost() throws HttpException, IOException {
        int statusCode = httpClientExample.sendPost();
        assertEquals(HttpStatus.SC_OK, statusCode);
    }

    @Test
    public void testSendGet() throws HttpException, IOException {
        String responseString = httpClientExample.sendGet();
        System.out.println("responseString = " + responseString);
        assertNotNull(responseString);
    }

}
    



2017/09/06

[webMethods] How to Create a Restful Service?

Problem
若我要提供一個 restful service 給另外一個系統呼叫,該如何實作?


How-To
步驟如下:
(1) 在 restful folder 下,建立一個 Rest Resource,命名為 RestTest




(2) RestTest 提供呼叫的方式為 HTTP POST


(3) 在 RestTest 中,設定一個 input parameter,parameter name 為 data


(4) 建立一個測試用的 Java Service,命名為 TestJavaService


(5) 在 TestJavaService 中,設定一個 input parameter,命名為 inputJson


(6) TestJavaService 程式邏輯為:當接收到參數值後,將 log 印到 integration server


(7) 將 TestJavaService drag and drop,放到 RestTest 中,並且將透過 restful service 中傳入的參數,傳遞到 TestJavaService  的 inputJson parameter


(8) 透過 rest client,用此 url 來進行呼叫 http://10.12.14.28:5555/rest/cctv.restful.RestTest,http method 選取 POST,在 Data Form 設定參數名稱為 data,並填入 value,按下 Send。

需注意 URL 呼叫規範為:
http://server:port/rest/FullyQualifiedResource
若是要在 URL 帶入帳號密碼,呼叫規範為:
http://username:password@server:port/rest/FullyQualifiedResource




(9) 到 integration server 的 administration console 檢查結果


Reference
[1] http://serviceorientedarchitect.com/how-to-create-a-rest-service-in-webmethods-integration-server/

2017/09/04

[JSON] Using JSONObject to build and parse JSON

Assume we would like to build a user JSON string, it looks like:
{"users":[{"name":"Albert","id":1},{"name":"Mandy","id":2}]}

Steps:
1. Create a User object which have two attributes (id and name)
2.  Create a getUsers method to retrieve dummy user collection 
3. Create buildUserJson() to build JSON string from List of User 
package albert.practice.json;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class JsonObjectTest {

    public static void main(String[] args) {

        JsonObjectTest test = new JsonObjectTest();
        
        String userJSON = test.buildUserJson();
        log.debug("user JSON = " + userJSON);
    }

    public String buildUserJson() {
        List<User> users = getUsers();
        JSONObject dataset = new JSONObject();
        users.stream().forEach(u -> addToDataset(u, dataset));

        return dataset.toString();
    }

    private static void addToDataset(User user, JSONObject dataset) {
        JSONObject userObj = new JSONObject();
        userObj.put("id", user.getId());
        userObj.put("name", user.getName());

        // use the accumulate function to add to an existing value. The value
        // will now be converted to a list
        dataset.accumulate("users", userObj);
    }

    public List<User> getUsers() {
        User albert = new User(1, "Albert");
        User mandy = new User(2, "Mandy");
        return Arrays.asList(albert, mandy);
    }

    @Data
    @AllArgsConstructor
    @ToString
    private static class User {
        private Integer id;
        private String name;
    }

}


If you would like to parse JSON string to List of User, you can check parseUserJson(String json)
    public List<User> parseUserJson(String json) {
        JSONObject jsonObj = new JSONObject(json);
        JSONArray userArray = (JSONArray) jsonObj.get("users");

        List<User> users = new ArrayList<>();

        userArray.forEach(u -> addToList(u, users));

        return users;
    }

    private void addToList(Object user, List<User> users) {
        JSONObject userObj = (JSONObject) user;
        Integer id = (Integer) userObj.get("id");
        String name = (String) userObj.get("name");
        users.add(new User(id, name));
    }




Reference
[1] http://www.studytrails.com/java/json/java-org-json.jsp

2017/09/03

[閱讀筆記] 惡魔財經辭典 (The Devil’s Financial Dictionary) [5/6]


  1. Pac-Man defense (小精靈反嗜)是抵擋惡意收購的一種戰術,成為收購目標的公司反守為攻,反擊收購者。此舉短期來看通常會拯救被收購者,但長期來看會毀了雙方
  2. Pareidolia (空想性錯視) 是一種人類難以抑制的傾向,會從隨機的事件或圖像中看出有意義的模式或趨勢。如在一片烤三明治發現喜馬拉雅山、在火星地表看到水道、相信過去的投資績效可以預測未來的結果
  3. 華爾街深受各種疾病所苦,而失憶症是其中最嚴重的一種。藉由埋葬過去,金融圈就可以拒絕從過去的錯誤中學習
  4. 耐心在蝸牛和烏龜之類的低等生物上很明顯的特質,但在從事金融投資的人類身上很罕見。金融資產的每一筆買賣都會產生交易成本,多半還會帶來稅金。一再有研究顯示,投資人交易越頻繁,賺到的錢越少
  5. Ponzi scheme (龐式騙局) 是一種詐欺投資行銷,記住,如果聽起來好到不真實,百分之百是假的
  6. Portfolio (投資組合)本身可以保護所持有個每一個資產;一個好的投資組合會持有多元類別的資產,不會重疊,價格走勢也不會同步。雖然投資組合無法避免虧損,但分散風險、種類多元的投資組合,是所有理財行為中最穩當的
  7. Porfolio manager(投資經理人)是一群『假裝做他們做不到的事,假裝喜歡他們不喜歡的事』的人,他們全部以同樣膽小的方式挑選同樣的股票和債券,因此投資績效要高人一等幾乎不可能,尤其是收了手續費以後
  8. 大多數的投資人往往持有虧損投資太久,而有賺錢的投資又太早賣掉
  9. Portfolio turnover (投資組合週轉率)的本意是做為投資組合累積過程中的潤滑劑,結果作用卻反而像砂紙。投資經理人交易的愈快速,產生的摩擦力就愈大,也就會燒得愈燙,如同古諺所云:「欲速則不達。」
  10. 犯錯難免,重大事件和新訊息也會改變資產的價值。不過,一般來說,投資人如果在買進之後很快又脫手,這八成是錯誤的做法
  11. 人類的不幸全來自一件事,不知道該如何在一個屋子裡保持平靜
  12. 眼睛一直盯著價格看的投資人,到頭來會交易過度頻繁,對他人的情緒波動反應過度;把重點放在追求價值,才能獲得更好的長期報酬
  13. 由於盈餘有很多動手腳的方法,所以用本益比來衡量一家公司的價值並不精確,往往會造成誤導。「常態化」(normalized)的本益比會將數年的盈餘加以平均,以取得較可靠的數字
  14. 保護本金(principal)是固定收益投資(fixed-income investment)的首要原則
  15. 審慎之人的職責是避開不必要且會賠錢的風險,而不是所有風險都一律避開。所謂審慎,是根據歷史證據和仔細分析做出良好判斷,而不是不論如何就是要追求安全
  16. 量化寬鬆(QE, Quantitative Easing)是指央行大舉購買債券等等金融資產的行為,企圖用資金淹沒整個金融體系。長期會讓利率下滑,理論上會鼓勵銀行放貸、鼓勵投資人投資、鼓勵消費者消費。但長久以來,普遍認為 QE 會引發大規模通貨膨脹
  17. 不動產信託(REIT, Real-Estate Investment Trust)包括了一籃子公司,這些公司都持有商業不動產,並且以股利(dividend)形式將租金等收入發放給投資人。那些收入很誘人,不過 REIT 的風險可比債券高
  18. 回歸平均值(regression to the mean)是一種傾向,「高於平均」之後是「低於平均」,「異常糟糕」之後是「異常美好」,這種傾向是金融物理學中最強大的一股力量。畢竟,人類的努力最基本的單位是「運氣」。偉大的 value investor Graham 喜歡把 regression to the mean 稱為 the law of compensation (補償定律)
  19. 要預測事件何時會 regression to the mean 、回歸程度如何,這很難。不過,不管是什麼領域,運氣遲早會發揮其重大影響力
  20. Regulation(管控)無法遏止大型金融公司定期摧毀客戶數十億美元財富,也未能主旨破壞擴散全球經濟,倒是把小公司困在官僚式繁文褥節中,讓小公司無法施展拳腳與大公司一較高下
  21. 對投資經理人來說,短期績效是唯一重要的東西,因為跟他們的薪水關係密切;但是對客戶來說,長期績效才是最重要的東西
  22. 若是某個投資或是某個投資經理人處於連續好運中,這時該問的問題不是好運會持續多久,而是從長期的成功機率來看,這個結果的代表性如何?短期表現幾乎絕不是預測長期結果的好指標
  23. 金融研究是一種金融猜測(guesswork)的技藝,看似科學,其實是猜測,每年大概要花投資人總資產 1% 的成本
  24. 根據技術分析(technical analysis),壓力(resistance)是指資產的當前價格接近過去高點。技術分析者認為,價格接近壓力水準(resistance level)時,絕不可能繼續上漲,至少短期不會(反正短期到底多短都是隨他們說,只要沒猜到就重新定義)
  25. 股東權益報酬率(ROE,Return On Equity)是衡量一家公司獲利能力的一種方法,計算方式是淨收入除以股東總投資金額。但是,ROE 告訴你的事公司過去的情況,並不是未來
  26. 風險就是,不管未來會發生什麼,一定會有更多超乎預期的事發生。風險就是一個落差,一邊是投資人自認為對投資、對金融市場、對自己的了解,另一邊是他們最後學到的
  27. 沒有任何事比看到朋友致富更能擾亂一個人的安寧和判斷
  28. Self-serving bias (自利偏誤)是人類的一種傾向,容易把成功歸因於自己的行為,把失敗歸咎於他人或不可控制的外在因素。在年度報告中,經理人會把好的結果歸因於自己的聰明才智,把不號的結果歸咎於政治、戰爭或天氣等等無關的因素
  29. 一旦企業高層集中精力在經營股票,而不是經營企業,結果必然是企業業績先落難,然後股票接著跟進
  30. 原本對股票市場不感興趣的人也瘋狂買賣股票時,那你就要注意,現在市場風險非常高。某些華爾街分析師信奉『擦鞋童』(shoeshine boy)理論,其實是因為瞧不起人,如果連無知的散戶投資人(retail investor)也對股票感興趣,老練投資人當然可以嘲笑這些傢伙這麼容易上鉤

2017/09/02

[閱讀筆記] Common Stocks and Uncommon Profits (1/4)


  1. 投資目標應該是一家成長的公司,公司應當有按部就班的計劃使盈利長期大幅成長,且擁有很難讓新加入者分享其高成長的內在特質
  2. 集中全力購買那些失寵的公司。這是指因為市場走勢或當時市場誤判一家公司的真正價值,使得股票的價格遠低於真正的價值,此時則應該斷然買進。費雪有過教訓,在股市高漲的年代,買到一家成長股,但是由於買進的價格高昂,業績即使成長,但亦賺不了錢。
  3. 我們投資的是公司不是GDP,亦不是 CPI 或者定期存款利率。許多人信奉波段操作,但是至今沒有一個靠波段操作成為投資大師的
  4. 追求資本大幅成長的投資人,應淡化股利的重要性。獲利高但股利低或根本不發股利的公司中,最有可能找到十分理想的投資對象。成長型的公司,總是將大部分盈利投入到新的業務擴張中去。若大比例分紅,則多數是因為公司的業務擴張有難度,所以才將盈利的大部分分紅。
  5. 無論是公司經營還是股票投資,重要的是停損,而不是停利。許多投資者往往是做反了,買進一隻股票一旦獲利,總是考慮賣出;相反的,買進的股票套牢了便一直持有,讓虧損持續擴大。
  6. 股票投資,有時難免有些地方需要靠運氣,但長期來說,好運、壞運會相抵,想要 持續成功,必須靠技能和運用良好的原則
  7. 在熊市時,這是個去提升你持有股票品質的好時機,公司的素質在熊市時一覽無遺
  8. 當大家對於市場焦躁不安、瘋狂殺出時,你反而要憂心那些股票是你該擁有的,但是你卻沒有
  9. 購買股票前,你要考慮 15 個面向:
    1. 這家公司所提供的產品與服務,在未來數年間,是否有足夠的市場潛力來產生大量的銷售業績?【此點著重於公司現有產品的銷售成長潛力】
    2. 當現有的受歡迎的產品線的成長潛力出現停滯時公司的管理階層是否有能力持續開發新產品或服務?【此點著重於公司領導階層的能力與態度。其是否能從現有市場中,發展出有潛在需求的產品或服務,做為未來成長的動能】
    3. 公司是否有效利用其研發能力,如投入多少  R&D成本,帶來多少效益?【你可以研究一下這家公司在特定時間區間 (如過去十年),花多少錢在 R&D,以及貢獻多少銷售額或是淨利】
    4. 公司是否擁有優於一般公司的銷售組織?【企業成功的三大基石:生產 (production)、銷售 (sales) 與研發 (research),只有堅強的生產與研發團隊,是不夠的,若要有穩定、長期的成長,一個強大的銷售團隊是非常重要的】
    5. 公司是否有足夠的淨利 (profit margin)?【投資人要遠離低淨利的公司】
    6. 公司在維持或改善淨利上,做了甚麼努力?【靠漲價來維持或改善淨利,長期來說對投資人不是好事;好的公司,會思考新的點子、方法來降低成本與改善淨利,這才會是長久之道】
    7. 公司與員工間是否有良好的關係?【好的勞資關係,員工的就會擁有較高的生產力、比較高的向心力、較低的流動率,對於公司是正向的。若一家公司,很多人排隊去應徵、薪水高於該產業平均薪資以及高階主管是否善待基層員工,都是可以觀察的重點】
    8. 公司的高階管理階層與基層工作人員是否有良好的關係?【公司內部人員的升遷、調薪,是否有被公平對待,影響著內部的和諧、向心力與生產力】
    9. 一人管理 (one-man management) 的公司是無法持續成長的。【若公司要獲得更進一步的成長,最高主管有無培養接班人選、是否能傾聽別人的意見,都是值得注意的地方】
    10. 公司是否有良好的成本分析與成本會計?【沒有好的成本分析,就不會有好的訂價策略。成本會計分為管理及財務兩個方面,成本會計協助管理計劃及控制公司的經營,制定長期性或策略性的決策,並且建立有利的成本控制方法、降低成本與改良品質】
    11. 公司在此產業中,是否異於其他公司的特色或能力?【如擁有技術專利,可以在激烈的競爭中取得優勢、維持一定的毛利,但是要注意,當專利到期後,此保護傘就不見了】
    12. 公司有無短期或長期的獲利目標?【投資人要避免短視的公司】
    13. 公司是否擁有健全的財務來支撐公司未來的成長?【請記住,不要因為財務健全就投資此間公司,其還要滿足其他十四點條件】
    14. 公司的管理階層是否只有在經營狀況好的時候跟投資人說明狀況,但是在經營狀況不佳時,則三緘其口?【若是遇到問題,卻不跟投資人說清楚狀況,代表經營者也徬徨不安,對於問題沒有解決方法,也代表著對於股東毫無責任感,投資人應遠離這類型的公司】
    15. 公司的經營者是否有誠信?【若一家公司缺乏誠信,即使擁有極佳的經營績效,符合上述的14點說明,投資人仍應遠離這類型的公司】
  10. 挑選理專時,有兩個原則
    1. 理專必須誠實
    2. 理專的財顧管理的基本概念必須要跟你一致,如上述的15點。若理專與你的想法不一致,你最好換另外一個理專,因為若想法不同,其所挑選的投資組合,也不會是你想要的
  11. 在投資前,請準備好足夠的錢來面對可能會遇到的醫療費用、或是其他意外事件所衍生的額外費用。投資不保證賺錢,再怎麼訓練有素的投資人,也有可能誤判情勢
  12. 成長型的股票,不僅在同行中要有卓越的績效表現,其在股息回報率上,在同行中也會擁有卓越的表現
  13. 不要仰賴財經專家、機構所做的預測來投資,因為他們的預測,大部分都是錯的
  14. 當公司經營過程出現麻煩,此時你要判斷這對公司的影響是暫時的,還是永久的。如果只是暫時的,你可以考慮在投資大眾恐慌殺出時,酌量買進

2017/09/01

[閱讀筆記] The Long Tail (1/2)


  1. 不要一直想要征服大眾市場,因為那邊有太多強敵與競爭。一定要找到自己的利基,只要能夠把一群小眾的消費者顧好,你就會有很大的生存空間
  2. 市場上還是會有暢銷品,只是過去「只有」暢銷品,未來會被分成:有一些暢銷品,以及很多利基產品。暢銷品的市佔率從過去50%以上,可能會降至20%
  3. 眾多利基商品,以往因為不符合經濟效益,所以未能浮上水面,但這些商品其實存在許久,只不過不易為人見到或找到。舉凡各地戲院沒有上映的電影,各地廣播電台沒播的音樂。現在透過Google、Netflix、iTunes等等,以往隱形的利基市場終於浮上水面
  4. 如果說二十世紀的娛樂產業事由暢銷主導,那麼二十一世紀則是以利基分眾為馬首是瞻
  5. 促成長尾效應的三個力量
    1. 生產工具大眾化:過去只有專業人士才能做的事,現在人人都能做
    2. 配銷工具大眾化:網路降低了接觸更多顧客的成本,有效增加尾巴部分市場的流動性,進而促進消費、提高銷售量
    3. 連接供給與需求:如 Google 降低搜尋利基內容的『尋找成本』
  6. 被強迫、非自動、為薪資而做的勞動,將被自動自發的活動所取代
  7. 長尾的頭部與尾部生產者的差異,是愈靠近尾巴,就越可能必須保有一份正職的工作。「專業」與「業餘」生產者的界線已經日漸模糊,最終可能無關緊要。有的人為報酬而做,有的人為興趣而做,兩者皆可產生價值
  8. 即使99%的 blog 吸引的讀者不多,但是這 1% 能接觸到更多的讀者。這 1% 的 blog 的訪客總數不輸給主流媒體
  9. 長尾間的流動性日益增加,在暢行無阻的數位市場,從尾部開始的內容,如果能引起眾人共鳴,有可輕易移動到長尾的頭部
  10. 長尾市場最基本的原則是:銷售成本越低,銷售量越高。因此,aggregator 代表長尾市場的第二股力量,能促進配銷得大眾化。Aggregator 降低市場的進入障礙,讓更多商品越過障礙、流入市場、找到知音
  11. 今日的資訊取得,簡直易如反掌。搜集資訊不再是問題,如何根據資訊做出明智的決定,才是困難所在
  12. 第一股力量(生產工具大眾化)拉長了市場尾巴,第二股力量(配銷大眾化)讓人人都能進入長尾市場,第三股力量(個性化推薦),幫助人們在豐沛的選擇只選擇中找到他們要的,才能真正釋放長尾的澎湃潛力
  13. 在選擇無限的世界,真正的主宰是context (架構),而非content (內容)。現在的內容太多,你需要有一個 filter (篩選器),帶領人們從已知的世界(暢銷商品),走入未知的世界(利基商品)
  14. Filter (篩選器)的挑戰是,如何慧眼識英雄。如果你善用聰明的搜尋引擎、推薦系統或其他 filter ,就比較容易在長尾中挖到寶。filter 不但能為市場尾部的商品帶來需求,還能撮合人和商品,提升滿意度
  15. 在暢銷導向的世界,我們常高估暢銷商品占整體市場的比例。其實,暢銷商品反而是罕見的例外。這就是Nassim Taleb 提出的 Black Swan Problem
  16. Black Swan 是符合三項特質的隨機事件
    1. 影響重大: 事件的發生會造成重大影響
    2. 機率無法估算:根據事件尚未發生前的資訊,事件發生機率儘管很小,卻無法計算
    3. 出其不意:觀測時無確切跡象顯示事件發生機率會升高,但後來事情偏偏就是發生了
  17. Power-law distribution (冪次分佈) 是指,不管你要找什麼,沿著尾巴走,會出現越多你不要的東西。這就是為何訊號雜訊比會惡化,即使通常你必須走入長尾才能找到你要的東西。這就是 filter 要解決的問題
  18. Law of the Vital Few (重要少數法則):財富與人口的分佈,80%的財富為約20%的人所持有,這也是我們現在所說的80 / 20 法則