顯示具有 key 標籤的文章。 顯示所有文章
顯示具有 key 標籤的文章。 顯示所有文章

2019年11月25日 星期一

jq 指令筆記 - 使用 to_entries 保留 key/value 資料,再用 select / index / match 過濾資料

人生就是有那種怪怪的堅持,明明寫個 php 或 python 就立刻可以解掉的需求,偏偏愛用 jq 來處理 XD

故事是來自於有個 key-value pair 的 json 資料:

% echo '{"A":{"field":"v1"},"B":{"field":"v2"}}' | jq ''
{
  "A": {
    "field": "v1"
  },
  "B": {
    "field": "v2"
  }
}


想要透過 jq 過濾時,也能保留 key 資料,這時就用 to_entries 來達成:

% echo '{"A":{"field":"v1"},"B":{"field":"v2"}}' | jq 'to_entries[]'
[
  {
    "key": "A",
    "value": {
      "field": "v1"
    }
  },
  {
    "key": "B",
    "value": {
      "field": "v2"
    }
  }
]

% echo '{"A":{"field":"v1"},"B":{"field":"v2"}}' | jq 'to_entries[]'
{
  "key": "A",
  "value": {
    "field": "v1"
  }
}
{
  "key": "B",
  "value": {
    "field": "v2"
  }
}


接著要再過濾指定欄位帶有 關鍵字 時,就靠 select 跟 index 來達成:

% echo '{"A":{"field":"v1"},"B":{"field":"v2"}}' | jq 'to_entries[] | select( .value.field | index("v2") >= 0 )'
{
  "key": "B",
  "value": {
    "field": "v2"
  }
}


此例是輸出 value.field 數值帶有 v2 關鍵字。而 index 之外的還有 match 等支援 regular expression 的用法,只是要用 !match 時有點卡卡串不太起來,就乾脆用 index 來處理。

2015年1月8日 星期四

[MySQL] 使用 FOREIGN KEY 筆記 @ MySQL 5.6

話說,2014年算是我最常用 SQL DB 的一年,在這之前我都是用 NOSQL 架構 Orz (扣除 SQLite 啦)。最近設計一些新服務的資料儲存,正在想如何使用 MySQL Relations 的特色,才發現之前都沒在用 FOREIGN KEY 啦 :P

簡短介紹 FOREIGN KEY 的功用:

當設計很多階層性的 table 時,如 user (上層), group (中層), data (下層),其中 data 每一筆都有 user, group 資訊,而 group 裡每一筆都跟 user 有關。此時在 DELETE 事件發生時,如果有建立 Relations 時,可在上層資料刪除時,順便幫你把相關資料刪掉。此外,在新增下層資料時,也會幫你驗證資料的正確性,不會讓你隨意新增假資料。

對於要建立 FOREIGN KEY 的要件:
  • 在上層(Parent)預計使用的參考欄位要有 index 屬性,如 Primary Key, Unique Key 或 Index 都行
  • 在下層(Child)預計使用的欄位也要有 index 屬性
  • 在上層跟下層對應的欄位型態要一樣,例如一樣為非負整數等
此外,則是可以設定 Action,例如上層刪除、更新資料時,下層是否也要一同更新,其選項:
  • Restrict: 拒絕 parent event,也將造成 parent 動作失敗
  • Cascade: 跟著 parent event 更新或是刪除
  • Set null: 收到 parent event 時,將參考欄位設定成 null
  • No action: 標準 SQL 語法且為預設選項,在 MySQL 環境上與 Restrict 等價
下次是操作時碰到的問題:

Q: Cannot add foreign key constraint
A: 仔細確認一下指定的欄位,其型態是不是一致的,或是對應的 Action 若為 Set Null 時,要確認資料欄位是否允許 Null

Q: Cannot add or update a child row: a foreign key constraint fails
A: 追蹤一下已存在的資料,是不是有不合理的地方,例如下層存在一筆資料,其對應上層的資料無法匹配。解法就是手動修正,或是乾脆清光資料來做也行。

整體上,建議有參考關係時,可以面對 Parent delete event 時,可以設定成 Cascade 處理,如此一來刪除資料就輕鬆許多,不必做多個處理。

2014年4月10日 星期四

[Linux] 更新 OpenSSH Server Key @ Ubuntu 12.04

由於熱門議題 OpenSSL Security Advisory [07 Apr 2014] / CVE-2014-0160 的影響,只好重新處理一下 OpenSSH Server key 了:

$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 12.04.4 LTS
Release: 12.04
Codename: precise
$ sudo rm /etc/ssh/ssh_host_*
$ sudo dpkg-reconfigure openssh-server

2014年2月27日 星期四

[Linux] 申請 Godaddy Wildcard Certificate 和設定 Nginx Web Server @ Ubuntu 12.04

ssl-01

在 Godaddy 購買 Domain Name,接著就來申請 SSL 憑證,依據需求就買了 wildcard certificate 版本。自簽憑證的經驗不少,但是還沒設定過 wildcard 版本 XD

ssl-03

首先先完成 Godaddy 的購買,可以參考 [筆記] SSL 憑證購買記

接著,很快就進入 Godaddy SSL 設定界面,並要求貼上 Certificate Signing Request(CSR) 資料。這邊需留意的是建立 CSR 的過程中,以前在 Common Name 總是輸入完整的 hostname (如 blog.changyy.org),現在要改輸入成 * 開頭(如: *.changyy.org),算是關鍵之處。

$ openssl req -new -newkey rsa:2048 -nodes -keyout wildcard.domainname.key -out wildcard.domainname.csr

最後再把 wildcard.domainname.csr 打開後,複製內文貼上即可進行。

ssl-04

由於是購買 wildcard 版本,如果 common name 不是輸入 * 開頭,會看到錯誤訊息,也是個不錯的防呆。

ssl-06

接著,再切換到下載頁面,就可以挑選屬於自己的 web server 資料。

對於 nginx 的部分,下載回來共有兩個 csr 檔案,對 apache web server 而言,可以分開設定剛剛好,但 nginx 只有 ssl_certificate 跟 ssl_certificate_key 兩個啊,因此,只要把 godaddy 給你的兩個 crt 串起來使用即可:

$ cp xxxx.crt hostname.crt
$ cat gd_bundle-g2-g1.crt >> hostname.crt


接著在 nginx 設定檔中,把 ssl_certificate 填 hostname.crt 而 ssl_certificate_key 則是最早建立 crt 的 key (此例 wildcard.domainname.key)