2023/10/30

Vue 的 js 建構版本資訊

vue - Libraries - cdnjs vue 有多個版本的 js file,每一個版本有不同的用途

cjs

  • vue.cjs.js

  • vue.cjs.prod.js 有壓縮的正式版

CommonJS,是一種模組的定義,伺服器端使用,透過 require() 在 NodeJS 裡面使用。但目前 NodeJS 已宣布放棄了 CommonJS

global

  • vue.global.js    完整版,包含編譯器及 runtime

  • vue.global.prod.js 正式版

  • vue.runtime.global.js

  • vue.runtime.global.prod.js

這是在瀏覽器直接用 <script src""> 引用時使用,會得到一個 global Vue 物件,可直接使用。

完整版跟 runtime 版本的差異是,完整版包含編譯器跟 runtime。編譯器可處理將 template 編譯為 js

browser

  • vue.esm-browser.js
  • vue.esm-browser.prod.js
  • vue.runtime.esm-browser.js
  • vue.runtime.esm-browser.prod.js

透過 ES6 原生的 module 使用,可以在瀏覽器內,透過 <script type="module"> 使用

bundler

  • vue.esm-bundler.js
  • bue.runtime.esm-bundler.js

用在 webpack, rollup, parcel 等建構工具,通常預設是使用 vue.runtime.esm-bundler.js

References

Vue:浅析vue.js完整版 和 vue.runtime.js运行时版 - 掘金

大前端学习笔记--Vue.js 3.0-云社区-华为云

2023/10/23

Chicken-or-Egg Problem in Network

在網路效應中,常見到 2-sided martketplace,nfx 提出 19 個策略,用來解決先有雞還是先有蛋的問題。

  1. Get the hardest side first

    比較困難的那一邊,也代表其網路價值比較高

    ex: Ourdoorsy 是 RV 租借市場,困難點在於如何吸引 RV owners

  2. Appeal tightly to a niche and repeat

    找到市場的痛點

    ex: eBay 一開始 Beanie Babies。Craigslist 一開始是Craig的朋友想要找公寓,找工作

  3. Subsidize the most valuable side of the market

    付費補貼給該網路中最有價值的一方,請他們加入網路

    ex: Uber 付費給司機

  4. Make the supply look bigger with automation

    從 supply-side 收集資料,進而讓該活動被注意(產生光環)

    ex: Yelp 在平台收集評論資料

  5. Buid one side as an email list

    這是一個啟動 martketplace 最簡單的方法,特別是 buyer 同時也是 sellers 的狀況

    ex: Craigslist

  6. Host meetups & gatherings 辦聚會

    舉辦社交活動,可得到客戶直接的反饋

    ex: Poshmark 舉辦 "Posh Parties" 讓客人交換時尚資訊

  7. Buid a SaaS tool for one side of the market

    為某一方建立 SaaS 工具,這樣就能吸引另一方

    ex: OpenTable 為餐廳建立預訂軟體服務

  8. Give software to a thrid party who bring you one side of the market

    提供軟體給第三方

    ex: Android 為手機製造商提供軟體,手機可帶來消費者需求

  9. Find one giant user for the initial supply or demand

    一開始先找一個大客戶

    ex: Candex 提供軟體給 Siemens 使用

  10. Only make one side to change their behavior

    讓某一方改變行為

    ex: Square 改變店家行為,最終讓消費者也使用他們的信用卡

  11. Make something free suddenly

    把原本要付費的東西,突然變成免費,吸引客戶

    ex: Robinhood 免費交易。Skype 讓電話免費。Napster 讓音樂免費。

  12. Buid a product first, then open a marketplace

    先做產品,再打開市場

    ex: Salesforce 建立線上 CRM 工具

  13. Connect the two sides by hand

    先以人工(代工)方式連接兩端

    ex: Zappos 早期處理網路訂單,是以人工去買鞋,然後送貨完成

  14. Favor markets where buyers are sellers,too

    先做 buyers 也是 sellers 的市場

    ex: Poshmark 使用者買衣服,也會賣衣服

  15. Create exclusive access

    建立獨佔式存取,該想法可產生病毒式行銷

    ex: Gmail, clubhouse

  16. Set a geographic constraint

    設定地理限制,在初期先限制在某些地方發布服務

    ex: Lyft, Yelp, Craigslist

  17. Set a time constraint

    設定時間限制,初期只在某些時間提供服務

    ex: Tophatter 只提供在 8-9pm 可作競標

  18. Set a demand constraint

    設定需求限制

    ex: Groupon 限制店家每天產生一個 groupon

  19. Pay users with tokens

    以代幣支付給使用者,為市場創造代幣,提供代幣給使用者

References

19 Tactics to Solve the Chicken-or-Egg Problem and Grow Your Marketplace

2023/10/16

網路效應

nfx.com 有一份 The Network Effects Bible 討論網路效應的重要性,每增加一個使用者,會讓這個產品/服務更有價值,也就是大者恆大的局面,在網路時代,所有系統發展的初期,都還是在獲取使用者的眼球的競爭下,只有大量的使用者,才算是拿到了入場門票,才會有下一個維持跟進化的問題。

分類

文中提到 16 種不同的網路效應(該文章有持續在更新),根據網路化的程度由小到大排列

  1. Physical (e.g. landline telephones)
  2. Protocol (e.g. Ethernet)
  3. Personal Utility (e.g. iMessage, WhatsApp)
  4. Personal (e.g. Facebook)
  5. Market Network (e.g. HoneyBook, AngelList)
  6. Marketplace (e.g. eBay, Craigslist)
  7. Platform (e.g. Windows, iOS, Android)
  8. Asymptotic Marketplace (e.g. Uber, Lyft)
  9. Data (e.g. Waze, Yelp!)
  10. Tech Performance (e.g. Bittorrent,Skype)
  11. Language (e.g. Google, Xerox)
  12. Belief (currencies, religions)
  13. Bandwagon (e.g. Slack, Apple)
  14. Expertise (Figma, Microsoft Excel)
  15. Tribal (Apple, Harvard, NY Yankees…)
  16. Hub-and-Spoke  (TikTok, Medium, Craigslist)

網路就是 node 與 link 的組合,網路大小以 node 的數量計算,但該數量不完全代表價值,因為該網路內的活動頻繁程度,也會影響價值。

網路密度 Density 是另一個網路的價值屬性,密度越高,代表價值越高,也就是 nodes 之間的 link 強度跟數量。

link 是有方向性的,例如 twitter 的知名人士,以單向方式跟 fans 提供資訊,單向交流,也有可能沒有方向,例如 Messenger 的交談一定是雙向的,因此沒有必要定義方向。

nodes 之間的關係有 1-1 (ex: Facebook) 與 1-to-many (ex: Youtube),1-1 的互動是雙向的,1-to-many 的互動是單向的。網路的 nodes 分佈會有 cluster 的特性,是一群一群的。

數學模型

有幾個網路效應的法則,試圖以數學模型說明網路效應的價值

  1. Sarnoff’s Law

    早期的電視廣播,其價值直接跟使用者數量成正比。該網路都是從網路中心單向發送連結到使用者

    V = N
  2. Metcalfe’s Law

    在 Internet 時代,連上網路的電腦都可以用任何方式互相傳送資訊。因此網路的價值每增加一個 node,該 node 都可以跟原本的其他 node 連結,價值應該要是所有的節點數量。

    V = N * (N-1) /2 => 約等於 N^2
  3. Reed’s Law

    David P. Reed 於 1999 年提出,增加一個 node 的網路價值,除了連結的節點數量以外,還要再乘上該 node 帶來的潛在的 cluster,該 node 還會產生更多 sub-groups/clusters

    V = 2^N

網路特徵

  1. 不規則性

    nodes 與 cluster 的分佈並不均勻,各節點之間的 link 狀況,也跟真實世界一樣,沒有固定的樣式

  2. 身份:真實、假名、匿名

    有真實身份的網路,會比假名的網路能更有效地建構網路。但在加密或間諜應用中,反而需要匿名的網路,但卻可能因為匿名,該網路關係更容易被破壞。

  3. 不對稱性

    有不同的角色組合的網路,且某一邊的使用者取得比其他的困難。這被稱為是 Demand-Side 或是 Supply-Side Marketplace,例如 Uber

  4. 同質、異質網路

    當所有 nodes 的角色都一樣時,這是同質網路,如果網路內有分不同的角色,則是異質網路,例如網拍網站,有分買家及賣家兩種角色。

  5. 漸近 Asymptotic

    通常使用者增加,每個使用者產生的價值也在增加,但當網路成長到某個程度後,網路效應的增加就開始減弱。ex: Uber 乘客的等待時間,隨著司機數量增加到某個程度後,等待時間就無法再一直縮短了

  6. 同邊 Same-Side

    同樣使用 Windows Office 的使用者,因為檔案相容性的關係,會因為使用者增加而讓該檔案更加流通

  7. 橫向 Cross-Side

    例如 Uber,driver 增加會增加客人,客人增加也會再吸引更多 driver

  8. Indirect

    例如 ebay,新賣家的加入,只會讓賣家之間的競爭更激烈,但由於賣家增加,更吸引買家加入,整體來說,還是會讓所有賣家間接受惠。

  9. Negative

    網路的負面效應有兩種:Congestion (增加使用量) 及 Pollution (增加規模)

    因為更多人使用網路,會讓網路壅塞,速度變慢。

    FB, Twitter 會因為更多人使用,而污染自己個人的 News Feed

建構與維護

  1. Multiplayer vs. Single-Player Mode

    單人模式只會線性增長,多人的聯網產品同時具有單人與多人的價值

  2. 轉換成本 switching cost

    切換到不相容的產品,會花時間、精神與金錢,這會讓使用者傾向於使用同一個廠商的商品,並待在同一個生態體系下

  3. Chicken or Egg Problem (Cold Start Problem)

    這是 2-sided martketplace 常見的問題,buyers/sellers 或是 developers/users

    當有一邊的使用者增加,才會讓另一邊也加入。有 19 Tactics to Solve the Chicken-or-Egg Problem and Grow Your Marketplace 能解決此問題

  4. Multi-Tenanting

    同時加入多個互相競爭的網路 ex: Lyft, Uber,同時加入多個社交平台

    越大的網路會越有知名度,越能吸引新客戶

  5. Disintermediation 去中心化

    在 marketplace 或 merket network 產品中很常見。一開始透過該網路進行交易,後續就改為不透過網路平台而直接交易。

  6. Retention 留存率

    客戶回頭再使用產品的頻率。留存率高的網路效應才高。

結語

經過這些年的社交網路更迭,有很明顯的世代交替狀況,使用者的增加,確實放大了網路的價值,也許大部分的人會因為要跟其他人溝通與交流,而加入某些網路 ,雖然人數增加了,卻也凸顯了沒有一個系統能夠適用於所有人的情況,系統可以瞬間爆紅,也可能會一下子就因為技術替換與世代交替消失。

References

# 网络效应“圣经”(上):网络效应为什么重要?其运作原理是什么?

# 网络效应“圣经”(下):如何建立和维护网络效应?相关概念有哪些?

《NFX:网络效应圣经》笔记

The Network Effects Manual: 16 Different Network Effects (and counting)

# 网络效应是什么?网络效应定律简介

2023/10/02

erlang poolboy

poolboy: A hunky Erlang worker pool factory 是一個通用用途的 erlang pool library,主要是用在 pool 管理,對於 server 程式來說,最常見的就是連接資料庫的 connection pool。

連接資料庫最簡單的做法,是在程式中要呼叫使用資料庫時,要經過連線與認證,使用完畢後,就馬上關閉該資料庫連線,但對於 server 來說,因為大量的連線建立關閉,消耗了很多運算資源,故通常會以資料庫 connection pool 的方式來處理。

一般的 connection pool,會有初始的連線 pool 數量,就是一開始啟動時,固定會產生並維持幾個連線數量,然後在所有連線都被佔用時,有一個 overflow 的數量,設定超量使用時,一次多產生幾個連線。另外為了確保該網路連線是正常連線的狀態,DB pool 通常會定時發送一個 SQL 指令,以該指令有沒有回應來確認連線狀態。例如 MySQL 可以使用 SELECT CURRENT_TIMESTAMP 這樣的 SQL 指令。

poolboy 就是用 erlang process 來作為一個 connection 的資源,該 process 的 state 裡面,就記錄該資料庫連線,另外有個 supervisor 用來做連線的資源管理。

使用方式

poolboy 以 epgsql 為例,說明如何使用 poolboy,要實作兩個部分 worker 跟 supervisor,另外要做 pool 的設定。細節直接看 poolboy 的 github 首頁即可。

poolboy 裡面的 transaction 就是使用該 pool 的最簡單的方式,先 checkout 一個 worker,然後呼叫 worker 裡面的某一個 function,最終使用完成後,呼叫 checkin 釋放 worker。

transaction(Pool, Fun, Timeout) ->
     Worker = poolboy:checkout(Pool, true, Timeout),
     try
         Fun(Worker)
     after
         ok = poolboy:checkin(Pool, Worker)
     end.

checkout 有三種方式

% 取得可以使用的 worker process,如果沒有,預設會等待 5s
1> Worker = poolboy:checkout(PoolName).
% returns PID in under 5 seconds or full.

% 不等待,直接回傳可使用的 worker
2> Worker = poolboy:checkout(PoolName, false).
% no waiting, either you have an idle worker for me or not.

% 等待 10s
3> Worker = poolboy:checkout(PoolName, true, 10000).
% like the first one but wait 10 secs instead of 5

注意事項

poolboy 的坑(Erlang) - 开发者头条

使用 poolboy 時,要注意幾個問題,產生 worker process 時,不能失敗,如果 worker 失敗,會導致整個 gen_server crash,無法啟動 pool。

解決方法是使用 proxy,也就是在建立 worker 時,並不直接產生 db 的連線,而是直接將 worker process 建立起來,後續在使用到該 worker 時,才去檢查 worker 裡面的 conn state。

這邊的問題是在如何做連線維持,因為 worker 把連線建立延後了,這表示使用 worker 以前,不能確認該 worker 擁有的 conn 到底是不是正常的連線,連線也可能因為 idle 太久而被資料庫直接斷線。

連線維護的部分,會需要在 worker 裡面另外寫 timer,定時做 callback,然後定時發送一個 SQL 指令,以該指令有沒有回應來確認連線狀態。

References

GitHub - interline/epgsql_pool: Pooled epgsql connections using Poolboy

GitHub - hiroeorz/eredis_pool: eredis_pool is Pool of Redis clients, using eredis and poolboy.

erlang进程池-poolboy源码分析_食鱼酱的博客-CSDN博客

# erlang线程池poolboy源码阅读

Erlang poolboy notes – Triggers-World