Total Pageviews

2017/10/11

[CSS] Font Size Problem in iOS

Problem
I am testing my web page in every browser (ex. Chrome, Firefox, IE, Safari, etc.), iOS and Android. Each platform is working fine except iOS. 

The problem is the font size of the text in specific table cell is larger than other.


How-To
Add the following code in my CSS file is working:
body {
    -webkit-text-size-adjust: 100%;
}


Reference
[1] https://stackoverflow.com/questions/2545542/font-size-rendering-inconsistencies-on-an-iphone

2017/10/10

How do I Keep Leading Zeros in CSV Files?

Problem
I am using Java to write data into CSV file. 
One of the column in the CSV file is cell phone number.
If I open this CSV file by Microsoft Excel, the first digit will disappear.

Take the first record for example. The correct value is 0912123456, but it show 912123456 in Microsoft Excel.

How-To
When you write cell number into CSV file, you should write ="0912123456" instead of 0912123456.



2017/10/09

[AngularJS] How to resize text width on demand ?

Problem
I am using AngularJS to implement web application. 

You can find an URL text filed in the web page. 

The requirement is the width of the URL text field will resize based on the text length which key in by end user. 

How to do it?


How-To
You can make good use of ng-keyup and ng-style to fulfill this requirement.
Using ng-keyup to calculate the length of text and using ng-style to set width at the same time.

The HTML code snippet looks like:
1
2
3
4
5
6
7
8
    <div class="row">
      <div class="form-group col-sm-3">
       <!- ignore -->        
        <label for="url" class="control-label label-width-5">URL</label> 
        <input type="text" id="url" name="url" class="form-control" data-ng-model="model.url" 
               data-ng-keyup="keyInUrl()" data-ng-style="{'width':urlWidth}">
      </div>
    </div>


The JavaScript code snippet are the following:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  // set the initial value for url width
  $scope.urlWidth = 200;    

  // calculate width at runtime
  $scope.keyInUrl = function() {
   var url = $scope.model.url;
   if (!isEmptyOrUndefined($scope.model.url)){
    var width = ((url.length + 1) * 9);
       console.log('width = ' + width);
       if(width > 200) {
        $scope.urlWidth = width;
       } else  {
        $scope.urlWidth = 200;
       }
   }
  }


Demo:


2017/10/08

[Oracle to SQL Server Migration] NVL

Problem
In Oracle, NVL function lets you replace null (returned as a blank) with a string in the results of a query. 




If expr1 is null, then NVL returns expr2. If expr1 is not null, then NVL returns expr1.

The SQL statement is as follows:
SELECT DRAWING_ID,
       NVL(TARGET_INSFEE, 0)
FROM CAM_DRAWING

Owing to NVL is only for Oracle, but it cannot be executed in Microsoft SQL Server.


How-To
You can use ISNULL instead of NVL in Microsoft SQL Server.
The SQL statement is as bellows:
SELECT DRAWING_ID,
       ISNULL(TARGET_INSFEE, 0)
FROM CAM_DRAWING



2017/10/07

Using JPA to Insert and Retrieve BLOBs

Problem
I am using JPA to do CRUD in persistence tier. If I would like to insert an image file into Microsoft SQL Server, how to do it?

The table schema is the following:
CREATE TABLE "CAM_CAMPAIGN_IMGS"
(
   CAMPAIGN_ID nvarchar(10) NOT NULL,
   CID nvarchar(100) NOT NULL,
   IMAGE varbinary(MAX) NOT NULL,
   CONTENT_TYPE nvarchar(100) NOT NULL,
   CONSTRAINT PK_CAM_CAMPAIGN_IMGS PRIMARY KEY (CAMPAIGN_ID, CID)
)
GO


How-To
You can see image column add @Lob annotation in entity class:
package com.xxx.ecp.commons.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Table;


@Entity
@Table(name="CAM_CAMPAIGN_IMGS")
public class CamCampaignImg implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private CamCampaignImgPK id;

    @Column(name="CONTENT_TYPE")
    private String contentType;

    @Lob
    @Column(name="IMAGE")
    private byte[] image;

    public CamCampaignImg() {
    }

    public CamCampaignImgPK getId() {
        return this.id;
    }

    public void setId(CamCampaignImgPK id) {
        this.id = id;
    }

    public String getContentType() {
        return this.contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public byte[] getImage() {
        return this.image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

}


Code snippet regarding insert image file looks like:
     CamCampaignImgPK imgPK = new CamCampaignImgPK();
     imgPK.setCampaignId(camCampaign.getCampaignId());
     imgPK.setCid(form.getImgFileName());
     
     CamCampaignImg camCampaignImg = new CamCampaignImg();
     camCampaignImg.setId(imgPK);
     camCampaignImg.setContentType(form.getContentType());
     
     // convert to bytes from input stream
     camCampaignImg.setImage(form.getImgFile().getBytes());
     
     camCampaiganImgRep.create(camCampaignImg);


Code snippet about retrieve image file looks like:
     List<CamCampaignImg> imgs = camCampaignImgRepCust.findByCampaignId(campaign.getCampaignId());
     for(CamCampaignImg img : imgs) {
        // get image's content type
        String contentType = img.getContentType();
        // get image file's input stream
        InputStream imgInputStream = new ByteArrayInputStream(img.getImage());
     }


2017/10/06

How to prevent JavaScript cache in Chrome during development ?

Problem
I am working on a web application project, and using Google Chrome as my browser to do development and test.

I face a JavaScript cache problem during my development, the JavaScript file which I updated does not take effect. It's very annoying, how do I do?


How-To
Open "incognito window" (無痕視窗) can overcome this annoying problem. In incognito mode (無痕模式), you will retrieve up-to-date JavaScript file after page reloaded.


2017/10/05

How to check file's media type?

Problem
If I have a file upload function in my web application, this function need to check the file which upload by user is image file or not. How to do it?

How-To
You can make good use of Apache Tika to fulfill this requirement.

Add dependency in your pom.xml
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.14</version>
            <scope>compile</scope>
        </dependency>




Sample code is as follow:
package albert.practice.file;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.tika.Tika;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class FileContentTypeUtils {

    private static List<String> imageMediaTypes = new ArrayList<>();

    private static void setImageMediaTypes() {
        // http://www.fileformat.info/info/mimetype/image/index.htm
        imageMediaTypes = Arrays.asList("image/cgm", "image/fits",
                "image/g3fax", "image/gif", "image/ief", "image/jp2",
                "image/jpeg", "image/jpm", "image/jpx", "image/naplps",
                "image/png", "image/prs.btif", "image/prs.pti", "image/t38",
                "image/tiff", "image/tiff-fx", "image/vnd.adobe.photoshop",
                "image/vnd.cns.inf2", "image/vnd.djvu", "image/vnd.dwg",
                "image/vnd.dxf", "image/vnd.fastbidsheet", "image/vnd.fpx",
                "image/vnd.fst", "image/vnd.fujixerox.edmics-mmr",
                "image/vnd.fujixerox.edmics-rlc",
                "image/vnd.globalgraphics.pgb", "image/vnd.microsoft.icon",
                "image/vnd.mix", "image/vnd.ms-modi", "image/vnd.net-fpx",
                "image/vnd.sealed.png", "image/vnd.sealedmedia.softseal.gif",
                "image/vnd.sealedmedia.softseal.jpg", "image/vnd.svf",
                "image/vnd.wap.wbmp", "image/vnd.xiff");
    }

    public static Boolean isImage(String sourceFile) throws IOException {
        setImageMediaTypes();
        Boolean isImage = Boolean.FALSE;
        File file = FileUtils.getFile(sourceFile);
        Tika tika = new Tika();
        try {
            String mediaType = tika.detect(file);
            isImage = imageMediaTypes.contains(mediaType);
        } catch (IOException e) {
            throw e;
        }
        return isImage;
    }

}



Test code is the following:
package albert.practice.file;

import java.io.IOException;

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

public class FileContentTypeUtilsTest extends FileContentTypeUtils {

    private String imageFile;
    private String pdfFile;

    @Before
    public void setup() {
        imageFile = "/Users/albert/Dropbox/picture/panda.png";
        pdfFile = "/Users/albert/Dropbox/test_測試.pdf";
    }

    @Test
    public void testImageFile() throws IOException {
        Assert.assertTrue(isImage(imageFile));
    }

    @Test
    public void testPdfFile() throws IOException {
        Assert.assertFalse(isImage(pdfFile));
    }

}



Test results are shown bellow:






2017/10/04

How to Improve Code Coverage in Enumeration Type ?

Problem
Assume I have a enumeration as bellows:
package albert.practice.designPattern.factory;

public enum ShapeEnum {
    CIRCLE, RECTANGLE, SQUARE, TRIANGLE, OVAL;
}


After I run code coverage test, the coverage rate in enumeration is low:


How to improve its code coverage rate?




How-To
To get rid of this issue, you need to call the values() methods in this enumeration. You can check the testShapeEnum() in the test code:
package albert.practice.designPattern.factory;

import static org.junit.Assert.assertEquals;

import java.util.function.Supplier;

import org.junit.Test;

public class ShapeFactoryTest {

    @Test
    public void testDifferentShape() {
        Supplier<ShapeFactory> shapeFactory = ShapeFactory::new;
        shapeFactory.get().getShape(ShapeEnum.CIRCLE).draw();
        shapeFactory.get().getShape(ShapeEnum.RECTANGLE).draw();
        shapeFactory.get().getShape(ShapeEnum.OVAL).draw();
        shapeFactory.get().getShape(ShapeEnum.SQUARE).draw();
        shapeFactory.get().getShape(ShapeEnum.TRIANGLE).draw();
    }

    @Test
    // https://stackoverflow.com/questions/4512358/emma-coverage-on-enum-types/4548912#4548912
    public void testShapeEnum() {
        ShapeEnum[] shapeEnums = ShapeEnum.values();
        assertEquals(5, shapeEnums.length);
    }

}







2017/10/03

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


  1. 如果是做多,虧損不可能高過百分百(除非是用融資保證金);如果是做空(short sale),虧損可能無上限,因為資產價格可能不跌反漲,而且可以無限制上漲。做空的風險:賣掉不屬於自己的東西,要不就得買回來,要不就得進監獄
  2. 投資操作要以徹底分析為基礎,確保本金安全無虞,還要有令人滿意的報酬率。不符合這些要求的操作就是投機(speculation)
  3. 所謂投機(speculation),通常是什麼東西當紅就買什麼,然後希望找到願意接手的傻瓜
  4. 每一個買對股票的挑股者(stock picker),背後一定有一個賣錯股票的挑股者;一個經理人的收益,必定是另一個經理人的虧損
  5. Stop-loss order(停損單)是指當有價證券跌到某個價格以下時提交賣出指令,但在實務操作是,也可能反倒停掉收益
  6. Tactic (戰術)是短期的決策,目的是為了落實長期的 strategy (策略)。但是在華爾街,strategy 通常是委婉的說法,其實是指快速、頻繁交易的 tactic
  7. 根據技術分析,support (支撐)是指資產的價格接近過去低點。技術分析師認為,價格接近 support level (支撐水準)時,絕對不可能繼續下跌,至少短期不會。但是,有智慧的投資人都知道,不論是哪種金融資產,支撐價位只有一個:0
  8. 塑造未來期待的時候,投資人應該先確定自己對過去歷史的理解沒有失真或扭曲。雖說史書是由勝利者寫的,但歷史是由勝利者與失敗者共同製造的
  9. Tax shelter (避稅)是一種複雜的投資,這種投資可能保護投資者的收入不受高額稅負危害,但卻必然會暴露於高額佣金之下
  10. 股票和其他有價證券的未來價格,是由標的的資產產生的現金流決定,而不是由證券本身的過去價格決定的。這就好像,一個球隊未來的比賽紀錄是由隊員的表現決定的,而不是由他們過去的得分決定的
  11. 在華爾街,有這樣一條很實用的通則:行話越是難懂,他描述的東西就越不可能賺錢
  12. Trailer (佣金) 是付給經紀人的一筆年費,因為他賣了共同基金或其他投資商品給你。你買一次基金,你的經紀人就會拿到 trailer ,通常是 0.25% 到 1%,只要你持有這隻基金就要付這筆錢,就算你沒有獲得任何關於這隻基金的任何「建議」
  13. 市場價格持續不斷波動中,很多證券商會鼓勵客戶去找出趨勢,並根據趨勢來進行交易。但趨勢(trend)很難持久,試圖從中獲利的業餘投資人也很少能持久
  14. 承銷(underwrite)是指投資銀行承擔股票和債券的銷售工作,他們先向發行銀行買進股票或債券,然後再立即轉賣給投資大眾,該銀行通常會收取高達收益的 7%,以補償自己持有那幾個小時所承擔的風險
  15. 宇宙(universe)常用來比喻一大堆投資可能標的或組合,分析師或投資經理人可以經理人可以從中隨意挑選組合。這個宏偉的字眼掩蓋了一個事實:對於無數的專業投資人來說,universe 包含的是一個極為狹隘的參考框架,以及極為有限的購買選擇
  16. 價格(price)是你所支付的,價值(value)是你得到的
  17. 神智清楚的買家在取得所有必要資訊後進行評估(根據該資產未來可能賺多少錢來評估),得出該項資產到底值多少錢,這就是所謂的「價值」。一支股票的價值取決於該公司產生現金的潛力,不會每季、每月、每日產生改變。股票價格在短短一天內就會改變成千上萬次,這只會造成股票交易者產生某些反應,卻完全不會影響該公司的生意
  18. 對一家公司未來盈餘的洞察力或信心,通常只能透過後照鏡來看
  19. Visibility 是 predictability 的同義字,但其實也是 self-illusion (自我欺騙)的同義字。從來沒有人能看到一點未來;未來一直都是 invisible
  20. 一直在賺錢時,持有人會說他們對波動性(volatility)感到自在,但一旦開始虧錢,就會說他們討厭波動性。該筆投資並沒有改變,改變的只是他們的觀感。金融市場波動最大的元素,就是投資人對波動的看法
  21. 追求投資效益率的過程中,損失的金錢比被人拿槍指著搶劫失去的金錢還多

2017/10/02

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

  1. 如果遇到全球性的太衰退,即便是優質的股票,從高點下跌 40 ~ 50 % 也是一件非常正常的事情
  2. 影響 common stocks 股價的五大力量 (但是這五大力量並非把股價拉到同一個方向,而是互相拉扯):
    1. 產業的 business cycle
    2. 利率的趨勢
    3. 政府對於整體投資的態度
    4. 通膨的長期趨勢 (這個力量可能是五個力量中,影響最大的)
    5. 是否有影響現有產業的新發明或新技術
  3. 股票賣出的三個理由
    1. 股票買進後,發現自己當初判斷錯誤 :承認錯誤並不可恥,你該好好審視為什麼此次判斷失準,要從中獲得教訓,避免下次買進時又犯了同樣的錯誤。別只做停利,卻不做停損
    2. 當初買進時,有符合上述的 15 個條件,但是經過時間更迭,此間公司不再符合:投資人應該時時檢視手上的投資組合,是否仍舊符合當初設定的條件
    3. 當此公司已失去投資的吸引力時:如公司的平均年度成長率日益下滑
  4. 不要因為恐懼  bear market 的到來,就賣光手中績優的股票。如果手中的股票是正確的績優股,下個 bull market 的出現,會將其推向更高的高點
  5. 當股價已經到高點的時候,是否應該賣出呢?這個問題牽涉到,你根本無法預測未來兩年的 EPS 是多少?你如何判斷現在就是高點?想要做精準的預測是不可能的!
  6. 若選擇到正確的股票,就不要賣出,持續持有它,股價過高不是個好理由
  7. 當企業沒有把盈餘發給股東時 (即現金股利),投資人不需太負面看待,你該審視的是,這些沒有被當作現金股利發放的金額跑去哪裡了?有些公司會保留現金來興建新的廠房、開闢新的產品線、改裝舊廠房使其運作更有效率等等;或者現金都跑去公司高層的口袋裡 (若是後者,投資人應該賣出股票)
  8. 投資人買進股票,是因為此間公司表現傑出,而非單單只是因為便宜。若管理階層運作起來無效率,其不會滿足前述的 15 點條件。好個管理階層,一定會好好運用其過剩的資金,而非圖利自己
  9. 購買股票不應過度追求高股利,公司應該要妥善應用剩餘資金,而非一直發放股利,反而現在未來的成長空間
  10. 企業經營者與農場的管理者很類似,它可以將幼小的牲畜帶到市場直接賣掉換取現金,或者是將牲畜養大以後再賣掉,獲取最大的利益
  11. 好公司的股利分配政策,應該要是穩定且持續發放,而非時常大起大落
  12. 在選擇績優股時,股利分配的多寡此條件,權重可以放到最低,此非選股的優先條件。過了五到十年後,你會發現,那些讓你賺錢的股票,可能不是那些在當時高殖利率的股票,反而是低殖利率的股票,因為低殖利率的公司,其管理階層將其剩餘金額拿來投資未來,而非只是發給股東而已
  13. 投資人不該做的五件事情
    1. 無論有多麼具有吸引力,不要買進IPO 或剛起步公司的股票:即便是老練的投資人,也很難判斷這樣的公司,其未來是否真的能夠獲得巨額利潤。而且往往這樣的新創公司,初期都是由幾個人所掌舵,其擁有極佳的研發天分,但是企業要成功,除了研發、還有製造、行銷、財務等等
    2. 並非所有的 OTC (over the counter) stocks 都是高風險的股票,別忽略其中也是有好股票的
    3. 不要因為一家公司的精美的年報,就買它的股票:這如同光看廣告就決定買某個商品,卻忽略其有可能廣告不實
    4. 不要因為本益比 (PE Ratio) 過高就賣出股票:好的公司會持續成長且其價值會快速增加
    5. 若目前的市場價格是吸引人的,就不要再那邊計較是否要低一塊錢或五毛錢買進:基本的原則是,如果此檔股票是正確的標的,目前的價位適合且有吸引力的,用現價買
  14. 投資人也不該做的另外五件事情
    1. 投資組合不要過度多樣化:人們常說雞蛋不要放在同個籃子裡,但是也不能放得太分散
    2. 不要在戰爭恐懼中懼怕買進股票:根據歷史經驗,每當有戰爭恐懼時,股市會劇烈崩盤,然後在恐懼減緩後,急速上升。但是沒人知道股價會跌多久、跌多低、何時會漲回來,你該做的是克服恐懼心理,並在戰爭恐懼期間,定期定額的買進好股票
    3. 投資人不需要過度在意最近52周的股價高點與低點:不要被不重要的資訊所影響,過去52週的高低點,無法告訴你這家公司的現在的價值與未來的潛力。這些數據只能當作輔助,不能當作你決定買賣的主要因素。要謹記,你無法用過去的數字來推估未來
    4. 考量時機與價格來買進真的成長股:績優股常因其吸引力與潛力導致其股價過高,與其買這些價格過高的股票,你反而該去買那些還股價還沒開始飛漲的潛力股
    5. 不要跟著群眾的腳步:你要有自己的想法,不是跟著大家一窩蜂買賣
  15. 在股市中,擁有一個好的 nervous sytem (憂慮系統) 比擁有一個好的腦袋還重要
  16. 莎士比亞的這段話,可以解釋成功的普通股投資的過程是:人生潮起潮落,若能把握機會乘風破浪,必能馬到成功 (There is a tide in the affairs of men which , taken at the flood , leads on to fortune)
  17. 保守/謹慎投資的第一個象限的四個面向 (生產、行銷、研發、財務):
    1. 低生產成本 (Low-Cost Production):生產成本比對手低,代表更快達到損益兩平,當景氣不好或是要打價格戰時,就具備成本優勢;生產成本低,也代表的你的毛利率會比對手好。
    2. 具備強大行銷能力的組織 (String Marketing Organization):行銷團隊要時時保持警戒,探索顧客不斷變動的需求與喜好,了解潛在客戶真的要什麼(有時候客戶自己都沒意識到自己需要這樣的產品或服務),並且用他的語言話告訴他,為什麼他需要這樣的產品、功能或服務
    3. 傑出的研發與技術能力 (Outstanding Research and Technical Effort):企業要想辦法生產出新的與更好的產品、提供比過去更好或成本更低的服務。好的企業會做好研發、行銷與生產部門之間的溝通,沒有行銷部門決定正確的方向,研發與生產出來的產品,也賣不出去,故這幾個部門間的合作非常重要。
    4. 財務能力 (Financial Skill):好的企業會精準算出製造出每個產品所需花費的成本,並更進一步透過技術創新或是提升員工技能來降低成本,讓獲利最大化

2017/10/01

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


  1. 如果人們有無窮的選擇,並可以輕易找他們想要的,你會發現,市場對電影的需求會繼續延伸、觸及之前想都沒想過的利基商品。網路租片商 Netflix 改變了供應利基商品的經濟效應,也因此讓我們重新理解人們真正想管賞什麼影片
  2. 別被 80 / 20 法則牽著鼻子走,即使 80% 的營收是由 20% 的商品所創造,我們也沒有道理不要其他那 80% 的產品。在長尾市場,存貨成本很低,因此不管商品的銷量如何,你的存貨都應該盡量多樣化。世事難料,有了功能強大的搜尋引擎和推薦系統,排名在後面的 80% 的冷門商品,很有可能哪天就會擠進前 20%
  3. 推薦系統與篩選器對長尾市場非常重要,藉由鼓勵人們從暢銷商品世界(高進貨成本)進入利基商品世界(低進貨成本),聰明的零售商便有可能大幅改善零售業的經濟效應
  4. 人類的注意力比金錢更有擴展性。長尾的主要效應是將我們的品味轉向利基商品,但消費是否增加,則視我們對搜尋到的東西滿意度而定
  5. 口耳相傳的回饋循環會擴大消費者喜好,為口碑好的產品錦上添花,引來佳評如潮,讓劣評者越來越難翻身。在網絡理論下,這種正向回饋循環會創造贏家通吃的局面,換言之,它是絕佳的暢銷品製造機
  6. 無論是暢銷商品也好,利基商品也罷,銷售量都會隨著時間趨緩;暢銷商品的起步點可能會高些,但他們終究會走入長尾的末端
  7. 在資訊科學的世界裡,事情如何歸類是個棘手的難題,也稱為「本體論的難題」(ontology problem)。本體論在各學門意義各異,對圖書館員和電腦科學家而言,本體論是指安排事物的方式。杜威的十進位分類法是歸類圖書的一種方式;大英百科全書是編列資訊的一種方式;元素週期表則是排列物質的一種方式
  8. 在 The Lure of Choice論文中提到,選項較多時,消費者比較願意做選擇。消費者偏好放映聽較多的戲院,桌子較多的賭場;選擇越多,他們被迫接受不理想產品的風險也會降低
  9. 零售商店為什麼要把一堆小東西擺在收銀機旁邊,因為可及性 (availability) 與便利性可以創造出更多的銷售量。牛奶、啤酒、飲料這些產品,便利商店販售的價格遠比超市高,但便利商店販售的與其說是商品,倒不如說是可及性,讓你當下即可取得
  10. 電視的粗俗、下流中、愚蠢,並非因為觀眾粗俗、愚蠢。電視之所以是現在這副德行,純粹是因為人們對粗俗、下流、愚蠢事務的關注極其相似,但對精緻、美感、高尚等各類事務的興趣卻大不相同
  11. 建立成功的長尾事業的秘訣,可以歸納為兩個要件:
    1. 讓所有東西都很容易取得
    2. 幫客戶找到它
  12. 長尾整合者的九大成功原則
    1. 把存貨搬進來,或搬出去:Sears、Wal-Mart利用其現有的倉儲網,提供比店面更多樣的商品,因為其存貨集中化,比把產品分別放到數百家店面的貨架上,還有效率。Amazon 已擴展到虛擬存貨,如實體貨品放在某個夥伴的倉庫內,但在Amazon 網站上展示與銷售。Amazon 的庫存成本為0
    2. 讓客戶自己動手:同好生產創造了eBay, Wikipedia, MySpace等。這不是outsourcing,而是crowdsourcing (運用群眾資源)。使用者的時間與精力幾乎無窮盡。因此,只有同好生產才能將長尾延伸到最遠處。在自助服務下,做事的人就是最關心這件事,也是最瞭解自己的人
    3. 單一配銷方式不適用於所有人:有的人喜歡到商店購物;有的人喜歡在網路買東西;有的人喜歡先在網路研究,在到商店購買;有的喜歡先到商店瀏覽,然後再網路購買
    4. 單一商品不適合所有人:我們面臨的顧客,是一群口味各異的顧客
    5. 單一價格不適合所有人:只要製造與配銷的邊際成本接近零,那麼可變動訂價是順理成章的模式
    6. 分享資訊:若把購買模式的資訊轉化為客戶推薦,就可成為強力的行銷工具。有了評鑑或產品規格之類的深度產品資訊,某些原本可能阻礙購買行動的問題往往可得到解答。資訊越多越好,但前提是呈現方式應該要幫助顧客做選擇中,而不是讓人摸不著頭緒
    7. 兼得(and),而非擇一(or):稀少性思考的症狀之一,就是假設市場為零和。換言之,就是誤認凡事只有非此即彼的選擇。但在容量無限的市場,提供所有選項才是正確的策略
    8. 放心讓市場替你做事:網路市場可貴之處,在於擁有高效率的群眾集體智慧測量工具。由於資訊充分,網路的消費者很容易比較各種商品,並傳播有關自己好惡的訊息。請謹記;別事先預測,而是要根據測量結果做出反應
    9. 了解免費的威力:網路最普遍的一種商業模式,就是以免費服務吸引大批使用者,在說服其中部分人升級到必須付費訂閱的加值版,以獲得較高品質或功能。由於數位服務成本如此低廉,因此免費服務顧客花部了公司什麼成本,只要其中一小部分能轉換為付費顧客就划得來