2015/04/14

Case-insensitive in HFS+

因為某個 repo. 底下有二個大小寫不同的檔案:
$ ls
readme.md
README.md

git 顯示檔案有異動:
$ git status

    modified: readme.md

確定檔案內容有問題,強制從 repo. 中拉出 readme.md:
$ git checkout -- readme.md

checkout 以後,換成 README.md 有異動:
$ git status

    modified: README.md

看起來是 case-insensitive 的問題,先強制讓 git 區分大小寫:
$ git config --global core.ignorecase false

可惜還是沒有效果。

後來才知道 Mac OS 的檔案系統 HFS+ 中,預設是不區分大小寫的。
也可在格式化時可以另外設定成 case-sensitive,但有可能會造成部分程式無法正常運作。


Ref:

2015/03/30

Install Gems without Docs

使用 gems install 時,預設會下載並產生 gem 說明文件,但這個步驟會花掉不少時間。

若環境為 production,說明文件其實是沒有必要安裝的,可以在家目錄下新增 .gemrc 檔,要求安裝 gems 時忽略說明文件:
cd ~
echo 'gem: --no-rdoc --no-ri' > .gemrc

2015/03/18

irssi 快速鍵

無意間按錯,發現一些快速鍵可以用。

Ctrl + N / P:下一個 / 上一個 channel

Alt + N / P:該 channel 訊息下一頁 / 上一頁

2014/11/25

PHP array_merge() 在資料型別上行為的差異

array_merge() 可合併多個陣列,遇到相同的陣列索引,將由後方陣列的值取代前一個值。

如:
$d = array(
  'a' => 111,
  'b' => 222,
);
 
$e = array(
  'a' => 123,
  'c' => 333,
);
var_dump(array_merge($d, $e));

執行結果為:
array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  int(222)
  ["c"]=>
  int(333)
}

此特性常被用來做設定選項合併,如:
function__construct(array $config){
  $defaultsStyle = array(
    'display' => true,
    'color' => 'red',
    'size' => '14px',
  );

  $settings = array_merge($defaultStyle, $config);

  // initialize by $settings
}

上面的寫法可以讓預設的三項索引「display」、「color」、「size」一定存在,不需特別在做 array_key_exists() 檢查,且外部傳入的數值,會將內定的預設值覆蓋掉。

不過只有字串型態的陣列索引,經過 array_merge() 以後可以保留原有的索引名稱,若為數字型態的陣列索引,array_merge() 會將原有索引打掉重新排列。

如:
$d = array(
  0 => 111,
  1 => 222,
);
 
$e = array(
  9 => 123,
  7 => 333,
);
var_dump(array_merge($d, $e));

執行的結果會是:
array(4) {
  [0]=>
  int(111)
  [1]=>
  int(222)
  [2]=>
  int(123)
  [3]=>
  int(333)
}


另外 array_merge() 有個很奇怪的行為,假設陣列的索引是「類似數字」的字串 (不曉得判斷規則為何),像是 "100"、"200",經過 array_merge() 時會被當成數字型索引處理。

如:
$d = array(
  '100' => 111,
  '200' => 222,
);
 
$e = array(
  '100' => 100,
  '300' => 333,
);
var_dump(array_merge($d, $e));

執行後為:
array(4) {
  [0] =>
  int(111)
  [1] =>
  int(222)
  [2] =>
  int(100)
  [3] =>
  int(333)
}

若索引名稱為 "001"、"002",經過 array_merge() 才會被當成字串,不會有上述情況發生。

要避免索引被吃掉,可以改用 array unioin operator:
$d = array(
  '100' => 111,
  '200' => 222,
);
 
$e = array(
  '100' => 100,
  '300' => 333,
);
var_dump($d + $e));

陣列索引會被保留下來:
array(3) {
  [100] =>
  int(111)
  [200] =>
  int(222)
  [300] =>
  int(333)
}

不過要注意的是,array union operator 遇到相同索引時,陣列值並不會被後方的陣列取代 ($merged['100'] 會是 111 而非 100),所以使用時要注意順序問題。

總之,'100'、'200' 被 array_merge() 當成數字讓我極度不爽。

2014/09/29

Vim Arrow Key Alias



每次用 autocomplepop 都會覺得右有要移動到方向鍵才能選字實在麻煩。

於是開使加了一些 short keys 讓操作簡單一底,二隻手也可以盡量不宜開主鍵盤區域。





在 .vimrc 中加入 maping,來取帶 arrow 按鍵:
imap <C-J> <Down>
imap <C-K> <Up>

這樣編輯時跳出選字方塊時,變可以使用 Ctrl + J or K 來上下選字。