Tuesday, February 16, 2021

減少不必要的 reflection

在 Clojure 與 Java 的交界處,會產生大量的 reflection 。這種時候,可以用 type hints 來減少不必要的 reflection 。有效的作法是開啟一個特定的變數,將它的值改成 true ,然後 Clojure compiler 就會產生 reflection warning ,讓我們可以在開發的時候,很清楚明確地知道「哪些地方產生了 reflection」,於是就可以針對這些地方,去加上 type hint 。

這個重要的變數是 *warn-on-reflection*

Clojure 程式開發的依賴注入

Clojure 的世界裡,常用的依賴注入 (dependency injection) 手法主要有五種:

  • 依賴注入應用於函數 (function) 
  • 依賴注入應用於命名空間 (namespace)
  • 依賴注入應用於攔截器 (interceptor)
  • 依賴注入應用於網站處理器 (web handler)
  • 依賴注入應用於 Java program 的物件工廠 (factory)

這五種手法都頗為重要:

  • 第一種非常的常見,可以算是基本的要求。
  • 第二種,在使用 REPL workflow 就會應用到,Luminus 搭配的 mount 就是例子。
  • 第三種可以提高程式碼的可讀性、可預測性。因為條件限制 (constraints) 多,可讀性就變好。通常是將 web handler 之後會依賴的 component 透過攔截器注入到 request 裡。
  • 第四種可以看成是第三種的變型:在生成 web handler 的時候,注入依賴。
  • 第五種則應用於 Clojure/Java interoperation 。當要利用 java library 的時候,有時候既有的 java library 有預留可以注入的 factory pattern 。這時候,如果覺得既有的 java library 不夠好用,想做一些微調整的話,就可以考慮使用 Clojure 的關鍵字 reify 去生成新的 factory 來給 java library 使用。於是,Clojure wrapper 包覆的 java library 就是有微調過的版本。

Mac 筆電的快捷鍵整理

由於新工作的資安規定,硬碟要加密,我決定全心全意地來改用 Mac book 。研究了一陣子之後,發現還真的滿多需要且值得記憶的:

1. 截圖類

cmd + shift + 3 --- screen shot 
cmd + shift + 4 --- screen shot with area
cmd + shift + 5 --- screen record 

2. Finder 類

cmd + <up>     --- 往上移一層資料夾
cmd + [           --- 回到前一個資料夾  // 同時也適用於 browser 
cmd + alt + L   --- 到「下載資料夾」    // 同時也適用於 browser

3. 文字編輯器

cmd + <left>      --- 移動到行首
cmd + <right>    --- 移動到行尾
cmd + <up>       --- 移動到文章首
cmd + <down>   --- 移動到文章尾
cmd + shift + T   --- 切換 .txt 與 .rtf  (存檔的格式)
cmd + T             --- 顯示字型
cmd + shift + C   --- 顯示色碼
cmd + V                  --- 貼上 with formatting
cmd + alt + shift + V --- 貼上 without formatting


4. 一般應用程式

cmd + <Comma>    --- 偏好設定
cmd + Q                --- 關閉應用程式


5. 移動類

fn + <up>      ---   Page Up
fn + <down>  ---   Page Down 
fn + <left>     ---   Home
fn + <right>   ---   End


6. 其它

cmd + <Space>       ---  Spotlight search
cmd + shift + ESC   --- 強制關閉應用程式
cmd + ctrl + Q        --- lock screen

Sunday, November 22, 2020

研究 Monad 的心得

學了 Clojure 再來學 monad ,彷彿像是學了英文之後,再來學日文。表達同樣的語意,但是,用不同的方式表達。

一 monad 用來幹嘛?

monad 用來夾帶 context 。什麼是 context ?基本的概念有點像是,本來是「值」語意,加上了 context 就變成了「向量」語意。


二 如何定義 monad

定義一個 monad 就是要定義兩個 operations
(1) unit 或是稱之為 return 。
     這個 op 接受一個 value ,傳回被 monad 修飾過的 value (monadic value)

(2) combine 或是稱之為 bind。
     這個 op 接受一個 monadic value 和一個可以接受 ordinary value 的函數。這個 op 的作用就是組合上述兩者,於是就可以得到一個可以處理 monadic value 的新函數。

三 常見的 monad 所處理的問題集合

(1) Maybe monad 
     在 Clojure 的世界裡,比較好的 modeling 沒有值的方式,並不是使用 nil 。 而是使用 vector 或是 hashmap 來 modeling 真實世界的 entity 。如果用 vector 或是 hashmap 來做 modeling 的話,有時候根本不用判定 nil ,也就是 Maybe monad 完全不需要。

(2) List monad
     處理 mapcat 可以處理的問題。

(3) Reader monad
      處理 dependency injection 可以處理的問題。 

Sunday, November 15, 2020

Some database-related quotes

* SQLite is not a replacement for PostgreSQL. SQLite is a replacement for fopen()


* We should call NoSQL databases as Postmodern Databases because they are:

  1. Absence of objective truth

  2. Queries return opinions rather than facts


* NoSQL databases that only have weak consistency are enforcing a broadly applied premature optimization on the entire system.

Tuesday, September 8, 2020

npm lockfile

話說,長久以來,我在開發 nodejs/javascript 的 project ,都有一個問題。到底需不需要把 package-lock.json 放進 source control 裡?

總是感覺需要,但是常常 npm install 的時候,這個  package-lock.json  就會大改。讓我覺得也滿困擾的。總覺得好像並沒有真的 lock 下來?

原來我少學了一個指令 npm ci

npm ci 的功能,就是可以嚴格地依賴 package-lock.json 來安裝套件。如果真的需要昇級才能裝的話,它就會丟出 error 。

Tuesday, August 11, 2020

讀書心得 --- 什麼才是經營最難的事

作者是安霍創投的經營者, Ben Horowitz 。書裡的內容,看起來,雖然也有引述許多經營管理書的論點,但是,最精采的部分,則是作者獨到的心得。對我來說,書中有一些點,是我不曾在其它書看到過的。以下列出幾點:

1. 人資的功能

長久以來,我也想不清楚,人資是用來幹嘛的?好像重要、又好像不重要。書裡給了一個簡單、清楚的概念:產品品質靠品保、管理品質靠人資。人資就是用來確保管理的品質的,是用來防止人事管理的環節,有任何一環嚴重出錯的功能。

2. 先管人、再管產品、最後才管利潤

作者主張要「必須」打造優良的工作環境。當公司的營運順利時,公司是否是依靠快樂的員工、優良的工作環境來達成利潤,也許沒有很明顯的差別。然而,當公司營運不順時,如果沒有優良的工作環境,優秀的員工就會快速離職,公司的營運會雪上加霜。而經營公司,一定會有營運不順的時刻。也因此,打造優良的工作環境,是目的而不是手段。

3. 員工訓練

Why?
有至少四個理由,應該實施「員工訓練」:生產力、產品品質、績效管理、員工留任。

績效管理是一般公司很容易欠下管理債的地方。在員工訓練時,就應該清楚設定好績效目標。等到真的需要開除員工時,就容易說清楚,為何沒有達成績效目標。

一般員工最常見的離職理由,除了經濟因素之外,往往不外乎兩個原因:
1. 討厭主管 - 主管不懂得帶人、不管屬下的職涯發展、不知道應該給予回饋。
2. 學不到東西
而員工訓練可以同時解決上述兩大問題。

How?
員工訓練應該要分成兩大主軸:職能訓練 (functional training) 與管理訓練。做得好的話,對於員工的士氣也極有幫助。

如何讓主管一定會落實員工訓練呢?最大的障礙往往是觀念問題,很多人覺得員工訓練太浪費時間。最有效的作法:要主管先訂出一套待聘人員的培訓計畫,否則遇缺不補。