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