找 git repository commits 裡的特定字串

因為在目前的程式碼裡找不到特定的字串,但是之前應該有,可能被移掉了,所以想找找之前提交的程式碼有沒有特定的字串。

請 Google 大神幫忙了一下,在 StackOverflow 上找到答案:How to grep (search) committed code in the git history? – Stack Overflow ,原來用 git grep 搭配 git rev-list 就可以做到:

# 找全部
git grep <regexp> $(git rev-list --all)

# 只找特定目錄下的
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

sudo 免輸入密碼

這篇 command line – Execute sudo without Password? – Ask Ubuntu 講的很仔細,簡單說就是用 visudo 加入

username ALL=(ALL) NOPASSWD: ALL

就可以了。

我的作法是:

  1. 新增 sudo_nopass 的 group:
    sudo groupadd sudo_nopass
  2. visudo 之後,加入:
    sudo_nopass ALL=(ALL) NOPASSWD: ALL
  3. 將 user 加入 sudo_nopass 群組:
    sudo usermod -a -G sudo_nopass user
  4. 重新登入或重開機

這樣 user 用 sudo 時,就不需要再輸入密碼了。

在 javascript 裡將 dict/object 轉換為 xml

照一般的作法,會是用操作 DOM 的方式來產生出 XML,但這樣很繁瑣,找了好幾個函式庫,最後是找到 object-to-xml (Github網址),使用方法很簡單:

var objectToXML = require('object-to-xml');

var obj = { 
  '?xml version=\"1.0\" encoding=\"iso-8859-1\"?' : null,
  request : {
    '@' : {
      type : 'product',
      id : 12344556
    },
    '#' : {
      query : {
        vendor : 'redhat',
        name : 'linux'
      }
    }
  }
};

console.log(objectToXML(obj));
/*
<?xml version="1.0" encoding="iso-8859-1"?>
<request type="product" id="12344556">
  <query>
    <vendor>redhat</vendor>
    <name>linux</name>
  </query>
</request>
*/

在 ‘@’ 裡的,都是屬性,而在 ‘#’ 裡的則是子 element 。

在 typescript 裡,要用

import * as objectToXML from 'object-to-xml';

來匯入使用。

sqlite3 的 alter table

sqlite3 的 alter table 不能刪除 column 或是修改 column ,只能新增!!

是故,如果要修改或刪除,只能先將原來的 table 更名,然後重新建立,再使用 insert into + select 來插入。

語法示意如下:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

寫這篇,才想到 django migration 可能也因為這限制,所以當資料庫是 sqlite3 時,有刪除或更動 model 屬性時,並沒有真的更動資料表格。

Run ansible in gitlab runner

在 gitlab runner 裡想要執行 ansible playbook 進行佈署,幾個問題以及我的應對:

  1. ansible 的安裝:是可以自己加 ansible 的 package repository ,然後用 apt 安裝,但已經有好心人打包了裝好 ansible 的 docker image ,只要在 .gitlab-ci.yml 加入 image 設定即可:
    image: williamyeh/ansible:ubuntu14.04
  2. playbook 要放在哪裡?因為要直接在專案進行佈署,所以 playbook 也要放在專案裡,我在專案裡建立了一個 ansible 的目錄,把 playbook 放在這裡。
  3. 私密資料如何保存?gitlab 在專案設定裡提供了 variables,可以用來存放這些私密的資料,在 .gitlab-ci.yml 裡,只要用 $VAR_NAME 就可以使用這些變數。.gitlab-ci.yml 裡也可以自訂 variables ,但這些 variables 是進到 git repository 的,要視情況使用。
  4. Ansible 連到目的機器需要 SSH Key:這比較麻煩一點,好在 gitlab 有提供如何使用 SSH key 的文件,步驟很詳細,簡述如下:
    1. 在專案設定的 variables 裡新增有 SSH private key 的變數。
    2. 檢查 ssh-agent ,如果沒有就安裝 openssh-client
    3. 執行 ssh-agent
    4. 用 ssh-add 匯入第一個步驟所設定好的變數
    5. 在 ~/.ssh/config 裡加入不檢查 host key 的設定:
      Host *
          StrictHostKeyChecking no

參考資料: