Cronitor

網址:https://cronitor.io

今天在 hacker news 上看到 crontab.guru,網址名稱挺不錯的,詳細介紹 crontab 怎麼用。正在想說怎麼會有人這麼佛心的建這網站時,就看到建立網站的是 cronitor.io。去看了 cronitor.io 以後,發現這個服務很有趣,是監控主機上的 cron job 用的。

一般 cron 的工作,只能透過 SMTP 發送結果,或者是自己去寫 wrapper ,把執行結果送到 slack, telegram 等服務。cronitor 就等同於是 wrapper 的角色,幫你執行指令,再把結果送到 cronitor 網站上,然後你可以在網站設定要通知誰。在網站上也可以去看 cron job 的執行歷程或者是知道到底有沒有被執行。

cronitor 這個工具不管是用網站介面或是 CLI,都需要先行安裝。安裝很簡單,就一個執行檔,下載以後,複製到 /usr/local/bin 就行了。(安裝說明,同時頁面也會提供你的 api-key)

tar xf cronitor-stable-linux-amd64.tgz
sudo cp cronitor /usr/local/bin
sudo cronitor configure --api-key <your-api-key>

你可以直接用網站介面,只是用網站介面,要先在介面上建立 cron job monitor ,然後再自己去改自家的 crontab,稍嫌麻煩。

用 CLI 比較方便,基本上用 sudo cronitor discover 就跑完了。sudo cronitor discover 會掃描你的 crontab,然後逐一詢問你 job 的名稱,然後再去網站上建立對應的 cron job monitor。這邊要注意的是,sudo cronitor discover 會自動幫你改 crontab ,也就是 root 的 crontab、/etc/cron.d 下的檔案都會幫你改掉。如果你不想這樣的話,得之後手動還原。目前網站雖然可以建立多個 cron job monitor,但目前只有一個 monitor 能運作,要用更多,得升級。收費的資訊在這裡:https://cronitor.io/subscribe

Tor

這篇只講在 Ubuntu 16.04/18.04 上的安裝。

安裝

echo "deb https://deb.torproject.org/torproject.org/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/tor.list
curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
sudo apt-get update
sudo apt-get install tor tor-geoipdb torsocks deb.torproject.org-keyring privoxy

修改 /etc/privoxy/config ,檔案結尾加入

forward-socks5 / localhost:9050 .

然後重新啟動

sudo systemctl restart privoxy

privoxy 主要是為只支援 http proxy 的程式提供 http proxy,tor 主要只提供 sock proxy。執行程式時,用 torsocks your_command 即可。要查 IP ,可以用 torsocks curl ipv4.icanhazip.com

參考資料

Bulma

介紹與教學

跟 Bootstrap 的差異與比較:https://bulma.io/alternative-to-bootstrap/

Django 生態圈已經有人寫 app 了 – django-bulma,支援 template 以及 form ,包的挺完整的。

AWS SES SMTP

前兩周碰到 GMAIL 很 GY 的問題,想說要不要去申請 MailGun ,後來想說,要另外申請服務挺麻煩(畢竟不是自家用),AWS 應該有這類服務吧。去 Google 以後,才發現自己之前有用過,只是全都忘光光了,這次要紀錄下來。這次的紀錄重點:

  1. 簡介
  2. 需要什麼?
  3. 如何移出 Sandbox?

AWS SES 是 AWS 的大規模電子郵件解決方案,可以用來寄發大量的電子郵件。他除了有提供 SMTP 設定之外,也可以直接使用程式來寄送。用 SMTP 設定方便的地方在於各個語言都有 SMTP 的函式庫可以用,所以設定填一填就可以寄了,不用額外再加函式庫。

要申請這個服務,要預先準備好網域,因為他是以網域為基礎。首先要新增網域,在進行新增網域的步驟時,步驟的說明會詳列出你該怎麼做來進行後續的驗證。這部份蠻簡單的,就只是去新增一個網域記錄,然後把 AWS 要求你填的資訊放進去就可以了。

在新增網域並進行驗證以後,就可以使用 SES SMTP 或是用程式去寄了。只是這時候是在 Sandbox 裡,有限制在的,不能寄太多信,寄件者跟收件者也都有限制。AWS Management console 也會提醒你,現在還在 Sandbox,如果需要提升額度或是可以寄送到外面,必須要提出申請 (有連結可以按),這邊就是照網頁說明去提出申請即可。提出申請時,AWS 會要求你回答幾個問題。這幾個問題主要是要確保 AWS 自身的立場,也就是當有人回報信件被濫用或退信時(抱怨),該怎麼去處理。

AWS 建議的作法就是要求你使用 AWS SNS ,當有退信或是抱怨時,讓 AWS 可以透過 AWS SNS 去通知你。AWS SNS 可以用郵件通知或是用 HTTP/HTTPS 去通知你的網站進行自動處理等等的。我後來是簡單的設定 AWS SNS,用郵件來通知我,等以後再來改成讓網站自動處理。

參考資料(來自AWS 文件):

NgRx

因為 NgRx 是用 Redux 的概念,所以先看 Redux

看完大致可以理解,就是 design pattern 裡講的 state pattern。大部份 Redux 例子都是搭配 React,看的還是霧煞煞,所以找 NgRx 搭配 Angular 的例子來看。

我覺得這三篇的例子蠻清楚的,很容易可以了解現有的 angular 碰到 ngrx 時,要怎麼結合。

原本 angular 的一個頁面是 component html 跟 component code ,現在加上 ngrx 以後,會使用 store 儲存狀態,寫 reducer 來處理狀態。當有事件觸發時,就使用 store.dispatch 去發送 action,reducer 在收到以後,會依據 action 來處理狀態,然後回傳狀態。這時候頁面會因為 binding ,而反映出新的狀態結果。

這三篇雖然清楚,但已經舊了,我在試驗時,就碰到兩個問題:

  1. 找不到 StoreModule.provideStore() 這個方法,這個已經改為 StoreModule.forRoot()
  2. Observable 找不到,要解決這個問題,除了得裝 rxjs 之外,還要裝 rxjs-compat 讓 rxjs 向前相容。

文章有提到 Redux DevTools 這個工具,可以從 Firefox addons/Chrome store NgRx 安裝,安裝以後,專案程式那邊也需要調整。調整的部份可以參考 @ngrx/store-devtools ,安裝好,修改 app.module.ts 之後,就可以使用了。使用的方式是先開啟專案的網址,然後再開 developer tools,這時會看到有個 Redux 分頁,試著觸發一些事件看看,這邊就會出現發送的 action 以及改變前後的狀態了。

CSRF is dead?

前幾天在 Hacker news 上看到 Scott Helme 寫的這篇 CSRF is (really) dead ,一直沒看。這兩天開始看,一開始 Scott Helme 先提,你應該先看這篇 Cross-Site Request Forgery is dead! ,再回頭來看。


我先看了第一段,心裡納悶這樣怎麼會有什麼危險呢?後來找了另外兩篇中文來看 (加快理解):

我蠻推第一篇 Huli 寫的文章,寫的很清楚。簡單的說,就是利用 cookie ,當別的網頁裡有嵌入對其他網頁的存取時,會因為 cookie 的關係而有存取權,如果網站沒有做適當的檢查,那麼使用者的資料就有可能遭到竊取或被錯誤的存取。這也是為什麼後來幾乎每套 web framework 都會有 CSRF token 的處理。

回頭來講,Scott Helme 會說 CSRF 死的原因很簡單,就是有了 SameSite cookie,在 2019 年6月以後幾乎各家都支援 SameSite cookie 了 – Can I use samesite cookie? 所以現在只要在 Set-Cookie 時,後面多加 SameSite=Strict 或 SameSite=Lax 就可以避免 CSRF 的風險了。

等到真正普及可能還要一到兩年的時間吧。

apk add 的 –virtual

Reduce Docker image sizes using Alpine 這篇學到的,add 時加上 –virtual,是暫時性的為這次加的 package 納入群組。之後若不需要這些 package,就可以在 del 時,指定這個名稱,就可以移除前次加入的 packages。

apk add --no-cache --virtual .build-deps gcc freetype-dev musl-dev
apk del .build-deps

電影流水帳(2019/07/01~2019/08/31)

sharks

The Meg

忘了是在 HBO  看到還是在東森洋片台看到,我是覺得這故事就很單純的把巨齒鯊描述成殘酷、噬血的生物,然後人類為了自衛就把它給幹掉這樣,未免也太不符合目前的保護動物潮流了吧?!

我沒全部看完,大致只看了後半段。大略是從他們去探勘,然後發現了巨齒鯊,後來好不容易逃回去鑽探平台開始。回去鑽探平台以後,大夥以為沒事了,主事者也聲稱他已經打了電話給軍隊,要他們派兵去消滅鯊魚。可是,主事者暗地裡帶了一伙人去丟炸彈,想消滅鯊魚。豈料,畫虎不成反類犬,他們失敗了,被鯊魚殺死。更糟的是,鯊魚還往人多的沙灘去了。鑽探平台的一行人隔天才發現主事者不見了,也沒聯絡軍隊,事情一整個不對勁。一伙人經過商量以後,決定自己來阻止鯊魚。他們趕緊進行準備,並且開船前往沙灘,要來阻止鯊魚。可惜來不及了,鯊魚已經開始攻擊人類。他們趕到的時候,就趕緊進行預定的計劃,進行誘殺。經過一番奮戰,終於消滅了鯊魚,事情算是圓滿落幕。

Crazy Rich Asians

故事意外的蠻勵志的,本來以為會是諷刺或是貶低亞洲人的,但並沒有。雖然故事有點八股,不過,大家都喜歡快樂結局,我也覺得故事收的不錯。裡面的演員都一時之選,演的都很好。

Nick Young 在美國認識了 Rachel Chu ,熱戀了好些日子,Nick Young 家親戚舉辦婚禮,所以找了 Nick Young 回去。Nick Young 就想女友 Rachel 前些日子嚷嚷著說要去新加坡找閨密,就邀請她一同前往,也順便帶她回去看看家人。Rachel Chu 從小在美國長大,是媽媽撫養長大的,只是媽媽從來沒跟他提過父親的事情。長大以後,在大學裡教授經濟學。Rachel 一直以為 Nick 只是個普通的上班族,到了要上飛機去新加坡那天,她才知道 Nick 不簡單,Nick 的家裡也不簡單。Rachel 雖然心裡犯嘀咕,嘴裏怪 Nick 怎麼都不說,可是並不怎麼在乎這事情。到了新加坡,兩人跟新郎新娘碰面,一同去吃飯、逛逛走走,Rachel 也去找了閨密。只是真正到了 Nick 家以後,才知道 Nick 家裡真的是超有錢。經過跟 Nick 家裡幾天的相處以後,Rachel 確認了自己並不受到歡迎,是的,Nick 的媽媽認為他們門不當戶不對。在一次對話裡,Nick 的媽媽說明了自己當初也是門不當戶不對地嫁進來,也非常努力的去學習跟適應,然後才慢慢爭取到家族的認同,可是,她並不認為 Rachel 可以,而且非常直白的告訴 Rachel,Rachel 大受打擊。

可是 Rachel 並不是一個柔弱的女子,她回頭找了好友,請好友幫忙打理全身裝扮,打算在 Nick 親戚的婚宴裡好好的證明自己。在婚宴裡,Rachel 展現出自己,證明自己跟 Nick 是郎才女貌的一對。Nick 的媽媽看到 Rachel 並沒有知難而退,就拿出之前請私家偵探調查 Rachel 家底的報告,原來媽媽隻身到美國,獨自撫養 Rachel 長大是有著不太光彩的原因的。這份報告等同於再次直白的告訴 Rachel ,你就是不配。Rachel 聽到自己母親是這樣的人,一個晴天霹靂,整個人恍恍惚惚的走出晚宴,回到好友那兒去,整個人失魂落魄了好幾天。

好友跟 Nick 輾轉找了 Rachel 的媽媽來到新加坡,Rachel 從母親口中得知了之前隻身來到美國的經過,這才明白前因後果。最後,她聯絡上 Nick 的母親,藉著放水一個牌局,明白的告訴 Nick 媽媽,今天老娘不是個不識大體的人,也不是我死纏爛打,今天是我犧牲來成全你,你之後不要忘了。說完,就跟母親走了。Nick 的媽媽回去以後,左思右想,她決定告訴 Nick ,讓他去追回 Rachel,然後就一個幸福的結局啦。

Holmes & Watson

電影不怎麼好笑,很多梗都時事梗、18禁梗,不適合小朋友看。故事大致是兩人搞笑的查案經過,最後歪打正著的找到凶手。

Contratiempo

8/11 周日晚上看了「佈局」,故事講的很棒,劇情區折離奇,後段算是反轉。到後面時,隱隱約約猜到那個律師就是死者的媽媽。

一開始是律師來找 Adrian ,Adrian 是個新創公司的年輕 CEO,看來像是陷入了困局。在簡短的相互介紹後,律師表示,你沒有告訴我詳細的經過,我沒辦法幫你,於是他開始娓娓道出事情的經過。Adrian 跟情人 Laura 一同出遊,為了閃避麋鹿,意外撞上了對向來的車子,兩人下車察看,發現對方已經死了。兩人相當緊張,經過一陣慌亂以後,Laura 說,乾脆我們佈置一下,讓人以為他是為了閃躲鹿而發生意外的吧,於是兩人開始忙了起來。事情總是不如人意,這時候來了輛車,Laura 機警的將死者推倒,偽裝成是車禍。車子駕駛善意的停下來詢問是否需要幫忙,Laura 聲稱已經找人幫忙就推託過去了。Laura 要 Adrian 開著死者的車帶死者去滅跡,自己則留在原地,設法將車開走。Adrian 開著車,開了很久,直到天黑。到了某個湖邊之後,將車子連死者一同推到湖裡去。Laura 在車子邊沒多久,很幸運的遇到了一個開著車的老人。這老人說自己是修車廠師傅,很會修這種車,就拖著車子回到老人家裡。老人幫 Laura 修車,Laura 就在老人家叨擾了好一會兒,閒聊時她突然看到照片,心裡嚇了一大跳,原來這死者就是這家人的兒子啊,但她外表假裝若無其事,趕緊開著修好的車子走了,然後就去接了 Adrian。在遇到 Adrian 時,她講了這件事情,串好供之後就回去了。後來,經過了若干日子,他們接到勒索信,說已經知道他們之前做的事情,除非給錢,要不然就揭露真相。他們跟對方約在旅館碰面,豈料在房間時,Adrian 被打昏之後,Laura 已經死在當場了,這也是 Adrian 為什麼會被控訴的原因。

律師反覆的針對疑點提出問題,Adrian 也開始針對前面所說的經過做出調整,最後 Adrian 終於透露出真相。原來一開始說的一切都是 Adrian 所編造的,棄屍是他提的,Laura 也是他殺的。Adrian 在這時接聽了一通電話,律師則把握這個機會離開了。咦?律師為什麼離開?原來律師並不是真的律師,他是 Virginia,是車禍死者的母親,他跟先生費盡心思,終於得知了所有真相,並且將 Adrian 的惡行揭露於世。

AWS S3/Glacier select

前幾天看 S3/Glacier FAQ 時,看到有 SELECT 這個功能,是去年推出的。S3/Glacier select  這功能是這樣子,你可以把 CSV/JSON/Apache Parquet 這幾種格式的檔案放到 S3/Glacier 上,然後就可以使用類似 SQL 的敘述來查詢檔案內容。

所以我們可以把不常使用的資料從資料庫移轉到 S3/Glacier 上,需要時,再使用 S3 SELECT 來查詢。這樣資料庫不需要一直擴充容量,放到 S3/Glacier 可以降低資料庫儲存的成本。

使用範例:

不過,網路上能找到的範例多半都是使用 CSV,那使用 JSON 又是如何呢?我試了以後,發現這個 JSON 格式不是我在 Python 用 json.dump() 傾印出來就搞定的。資料是陣列時,要針對每個元素去 dump,不可以是 [{}, {},…] 這樣,必須是 {} {} {} 這樣子,AWS API 才不會報錯 (參考:stackoverflow – amazon s3 – s3-select querying data on field name)。

import json

with open('output.json', 'wt') as fout:
  for obj in objs:
    json.dump(obj, fout, indent=2, ensure_ascii=True)
# 輸出結果
"""
{
  "id": 13930241}{
  "id": 13930240}
"""

vim – 查按鍵定義

Embed from Getty Images

雖說常用 vim,但是我幾乎是沒什麼在定義按鍵,都是沿用 plugin 的定義,所以用了一堆 plugin 之後,難免會遇到衝突的情況。

那麼要怎麼查按鍵的定義呢?除了可以用 grep/ag 來找 vimrc/plugin 裡的定義之外,也可以在執行 vim 以後,用 :verbose map 來查

" 我的 leader key 是 \
" 以下就是查 \gg 會執行的指令
:verbose map <leader>gg

步驟:

  1. 先按冒號 ‘:’ ,游標會移到下方,進入 last line mode
  2. 在下方輸入 verbose map <leader>gg
  3. 輸入完按 Enter,就會看到 vim 印出按鍵的定義與上次定義的位置
  4. 再按一次 Enter,就會關閉回到 Normal mode

印出的結果 (會因為你的按鍵定義而異)

n  \gg         * :EXGSearchCWordW
        上次設定: ~/exvim/vimfiles/bundle/ex-utility/autoload/ex/keymap.vim line 37