讓 docker daemon可以給別台電腦存取

docker 官方並不建議使用這方法,但還是有文件:Configure where the docker daemon listens for connections

不建議的原因很簡單,安全性。docker daemon 是用 root 權限在執行,而 docker 又沒有這方面的安全機制去處理帳號驗證,自然不建議這樣使用。 目前的主流是使用 kubernetes,另外,docker 最新的版本是有提出 docker context,利用 context 可以管理多種連接方式,其中一種連線方式是走 ssh ,會比較安全。

目前我只是想方便的操作虛擬機,所以可以不需要太考慮安全性問題。

編輯 systemd unit:sudo systemctl edit docker.service,把下面幾行貼進去

[Service] 
ExecStart= 
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 

讓 systemd 重新載入設定: sudo systemctl daemon-reload

重啟動: sudo systemctl restart docker

檢查: sudo netstat -lntp | grep dockerd

在別台電腦上,先設置環境變數:export DOCKER_HOST=tcp://your_docker_host:2375 , 然後用 docker 指令就可以存取該台 docker 主機了。

用 redoc 來顯示OpenAPI規格文件

之前有找過怎樣輸出 OpenAPI 規格為文件,有試過 swagger-codegen 先轉成 HTML 再轉 PDF,但其實效果不好,也一直沒找到滿意的。

今天再來找一次,找到 redoc,依照 github 網站上的說明來作,用 redoc 提供的 docker image 就可以跑起 API 文件的 Live 網站,效果挺好的。

docker run -p 8081:80 --rm -v $(pwd)/api.yml:/usr/share/nginx/html/api.yml -e SPEC_URL=api.yml redocly/redoc

網站上還有提到一個 redoc-cli,說明說可以 bundle 成一個靜態HTML文件。有 homebrew ,就想說 homebrew 會不會有這個 formula,找了以後,發現是沒有,只好認命的用 npm 來裝

npm install npx npm install redoc-cli 

裝 npx 是為了可以方便的呼叫 node module 裡的指令來用,這部份的使用說明可以參考這篇:Introducing npx: an npm package runner 。 裝好以後,就可以使用了:

npx redoc-cli bundle api.yml 

輸出的檔案固定是 redoc-static.html,用瀏覽器開啟就可以了。

筆記:Queries, Part 1: Common SQL Queries Converted for Firebase

依照 Queries, Part 1: Common SQL Queries Converted for Firebase 來練習

  • By ID ,路徑指定好就可以了 firebase.database().ref(‘/messages/’ + messageID).once(‘value’, function(snap) { … });
  • WHERE, 除了路徑之外,還要指定 orderByKey() 或 orderByChild(),然後再用 startAt/endAt
    • orderByKey 是依照 key 的值:firebase.database().ref(‘/messages’).orderByKey().startAt(‘user001’).endAt(‘user010’).once(‘value’, function(snap) { … });
    • orderByChild 是依照子節點的值:firebase.database().ref(‘/messages’).orderByChild(’email’).startAt(‘user001@example.com’).endAt(‘user010@example.com’).once(‘value’, function(snap) {…});
    • 用 orderByChild 時,要在規則裡加上 .indexOn ,否則會有警告,警告的大意是說加indexOn 後,效能會比較好。
  • LIMIT,加 limitToFirst(10) 或 limitToLast(10)
    • 可以跟前面提到的 startAt / endAt 結合:firebase.database().ref(‘/messages’).orderByChild(’email’).startAt(‘user001@example.com‘).endAt(‘user010@example.com‘).limitToFirst(10).once(‘value’, function(snap) {…});
    • limitToLast 就是指定後面幾筆

筆記:firebase functions – realtime database

閱讀的文件:https://firebase.google.com/docs/functions/database-events

可以寫這些事件的處理常式

  • onWrite() 資料被建立、更新或刪除時,會觸發
  • onCreate() 資料被建立時,會觸發
  • onUpdate() 資料被更新時,會觸發
  • onDelete() 資料被刪除時,會觸發

可以只針對指定的路徑,對,也因為事件資料同時包含舊的跟新的,資料量有限制,資料量大的時候要針對個別路徑拆開來寫處理常式。

可以用參數,例如 ref(‘foo/{bar}’)  ,那麼存取 foo/hello 或 foo/firebase 時,都會觸發常式對 foo/ 寫入,像下面

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

會觸發兩次常式,一次是 foo/hello ,一次是 foo/firebase從 EventContext.params 可以用 bar 這個 key 去拿到 hello 或 firebase
範例

 
// 當有訊息加到 /messages/:pushId/original 時,執行這常式。 
// 這常式會把指定路徑下的值,轉為大寫,再放到 /messages/:pushId/uppercase 
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original') 
    .onCreate((snapshot, context) => {  // snapshot 是 DataSnapshot ,context 是 EventContext 
      // 先取得寫入的值 
      const original = snapshot.val(); 
      console.log('Uppercasing', context.params.pushId, original); 
      const uppercase = original.toUpperCase(); 
      // 把資料寫到 "uppercase" sibling 然後回傳 Promise 
      // snapshot.ref.parent -> /messages/:pushId 
      // snapshot.ref.parent.child('uppercase') -> /messages/:pushId/uppercase 
      return snapshot.ref.parent.child('uppercase').set(uppercase); 
    }); 

用 EventContext 的 auth / authType 就可以取得 authentication 資訊 (這邊我有點迷糊了,為啥 authType 可以是 ADMIN / USER ??

onWrite 的時候,是用 change, context change 是 Change,提供了 before/after property 可以存取寫之前/之後的值 。

筆記:以適合的 HTML 屬性增強輸入 2FA 的體驗

來源:HTML attributes to improve your users’ two factor authentication experience

TL;DR

  1. type 維持在 text
  2. inputmode 改為 numeric,這樣可以在手機平台上出現數字鍵盤,而不是完整的鍵盤
  3. pattern 設為 [0-9]* ,可以確保輸入的文字是數字
  4. autocomplete 設為 one-time-code ,是可以確定自動完成的部份是「一次性的密碼」,之前以為只有 “off” ,其他可以用的數值可以參考這篇
<input
  type="text"
  name="token"
  id="token"
  inputmode="numeric"
  pattern="[0-9]*"
  autocomplete="one-time-code"
/>

筆記:Best practics for firebase realtime database development

文章出處:Best practics for firebase realtime database development

以下只是摘要,詳細內容還是請看原文。

  • 好好的讀 SDK 文件。
  • 不太需要定 schema,不表示不需要用腦,要有效率的使用,仍然需要好好的規劃。
  • 支援管道要選好
    • Slack: 社群導向的自助討論,不適合回報問題。
    • Support Form: 主要的官方支援,The “official” support venue. Report “something is down” here. Feature requests likely to get a canned “we’ll consider it, but no promises” response.
    • Google Groups: 主要是成員討論,Active involvement by the core team with the usual caveats about turnaround time in group-oriented mail systems. Best place for highly technical discussions about app internals and “weird” issues.
    • StackOverflow: 疑難雜症,Slow/unpredictable response times but best place for backup reference material. If you’ve read a Q&A on StackOverflow, you know the type of question that’s best to post there, too.
  • 該用兩個 reference 就用,不要想說用他們共通的父節點來存取,這樣沒有比較省。If you need to reference an object from two different places, take two refs to it.
  • 不要用 array
  • 沒有日期,請用 timestamp
  • 請知道 firebase realtime database 能做什麼,不要用他來做他不適合做的事情。
  • set 跟 update 不一樣,主要差異是在於 key 存在與否的處理。
  • firebaseui 很好用。

電影流水帳(2020/02/21~2020/02/29)

Linda Edna Cardellini ,飾演 Hunter Killer 裡的美國國家安全局高級分析師。
  • 使徒行者2:諜影行動 (IMDB, Wikipedia)。
  • ほんのうじホテル (IMDB, Wikipedia),台譯:本能寺大飯店。
  • Hunt for the Wilderpeople (IMDB, Wikipedia),台譯:神鬼嚎野人。
  • Hunter Killer (IMDB, Wikipedia),台譯:潛艦獵殺令。

使徒行者2:諜影行動

不小心轉台轉到,發現挺不錯的,大約是從片子開播後半小時開始看。很經典的香港警匪動作片,是古天樂、吳振宇跟張家輝三人聯合主演。故事角色是延續上一集,但故事本身是獨立的,所以沒看過上一集沒什麼影響。

香港警方追查到一件牽涉到暗網的案子,收押了姚可儀,發現警方內部可能有黑警。於是葉國帆、程滔、井進賢等人開始進行追查,在調查的過程裡,卻慢慢揭露出程滔與井進賢的過去,也勾出一個跨國拐擄兒童的犯罪集團。

程滔跟井進賢小時候是好朋友,可是有一天兩人被犯罪集團帶走,井進賢犧牲了自己,救了程滔,井進賢因此進了犯罪集團,被犯罪集團訓練,並進入警隊,慢慢當上警司。而程滔很感念井進賢的恩情,為了想找到井進賢,也進了警隊。井進賢並不想被犯罪集團控制,他試圖想擺脫,可是犯罪集團緊迫盯人,殺了他的妻子,脅迫他不得再反抗。景進賢為了年幼的女兒,只能聽命於犯罪集團。

姚可儀是獨立記者,也是 CIA 特務,他為了找到自己的妹妹,穿梭於菲律賓紅燈區。後來他找到自己的妹妹了,但妹妹已經死了。為了復仇,他決心找出這個擄人的犯罪集團。幾次追查下來,他跟同事已經駭進了犯罪集團的電腦,但還來不及下載更多資訊,只能先加密犯罪集團的資料庫。犯罪集團無法解鎖,只能追殺姚可儀以及他的同事,想取得他們的加密金鑰,以解開被加密的資料庫。

幾次交手下來,程滔跟井進賢敬愛的葉國帆死了,也為了救出井進賢的女兒,程滔跟井進賢進行聯手,來對抗犯罪集團。最終在西班牙的大戰之後,終於消滅了犯罪集團。

ほんのうじホテル

逛 Netflix 時,被簡介以及凌賴遙吸引,就看了。

繭子在失業後,沒什麼人生的目標,男友恭一趁虛而入來求婚,就決定要結婚了。在結婚前,先跟恭一回去京都,參加恭一父親與母親的金婚。繭子來到京都以後,恭一很忙,沒什麼時間陪伴繭子,原本預定的飯店說沒房間,所以繭子找到了本能寺大飯店投宿。跟櫃台辦理完入住手續後,繭子搭乘電梯上樓,要到房間去,想不到打開門,卻到了 1581 年,遇到蘭丸。進而認識了信長。經過幾次的時空穿梭,繭子喚起了信長的笑容,讓他想起初衷,而信長也讓繭子重新面對、追求自己的人生目標,而不是就這麼隨波逐流。除了信長之外,恭一的父親也是讓繭子轉變念頭的一個重要原因。恭一的父母結褵即將五十年,原本打算在金婚的時候退休,一起好好過生活,可是恭一母親卻得了癌症過世。由於金婚的宴客場地已經早就準備好,恭一父親沒有取消,還是照預定的進行。在典禮時,宣佈說不再開料亭,決定回歸當初跟太太開店的初衷,開個簡單、便宜又大碗的食堂來照顧附近的學生。

繭子原本很猶豫要不要跟信長說本能寺之變的事情,在經過心裡一番掙扎以後,決定還是告訴信長。原本以為信長會召集軍隊,進而改變歷史,可是信長並沒有。繭子最後一次回去時,本能寺已經發生大火,繭子問信長,為什麼不試著改變歷史,信長只問了,你帶來的照片就是你所處的時代嗎?繭子說是。信長就只是單純的希望未來是個和平的世界,而未來看來就是如此了。所以,信長坦然的接受了。

繭子回到現在以後,恭一跟繭子把事情講清楚,取消了婚約,繭子也認清了自己不能再逃避,要自己去找出屬於自己的人生目標跟道路。

Hunt for the Wilderpeople

記得是去年還前年看超粒方介紹電影時,看到的,他說很有意思,所以就列到片單裡了。最近 Netflix 上了這部電影,就趕緊看看。

Ricky 是個十三歲的少年,在各處寄宿家庭流浪,他到處闖禍,到後來,沒有家庭願意收留他。直到來到了位於深山的 Bella 家裡,一開始的第一個晚上,Ricky 就逃走了,但 Ricky 是路癡,繞了一晚,根本沒離家多遠,很快就被 Bella 找到了。Bella 跟他說,你想逃家可以,但先回去吃個早餐吧。Ricky 很訝異於 Bella 的寬容,回去吃完早餐,跟 Bella 聊聊,相處了一段時間以後,Ricky 發現自己不想逃跑了,他決定留在這裡。過沒幾天,Bella 還為他過了生日,送給他一隻狗,Ricky 超開心的。

好景不常,過了幾天,Bella 突然就死了。一起同住的 Hector 跟 Ricky 都很難過,送走 Bella 以後,不認識字的 Hector 收到兒福機構的信,他請 Ricky 念,信件的大意是這樣的,「Hector 你好,我們要接走 Richy 了。」Hector 其實蠻樂意的,他並不想照顧 Ricky,可是 Ricky 就不樂意了,他不想回去過著那種被踢來踢去的生活。Ricky 想留下,就試著假死,把假人放到穀倉裡,放火燒了穀倉。Ricky 就帶著狗,逃到森林裡去了。可是啊,鄉親,野外求生沒那麼簡單的。還不到一天,Ricky 就吃完帶在身上的存糧,又冷又餓,他睡在荒野,想說自己可能要死了。隔天早上起來,就看到了 Hector,Hector 看到他真的是又好氣又好笑。對話之中,Ricky 激怒了 Hector,Hector 想衝過去抓住 Ricky,卻因此弄傷了腳踝,兩人只好言歸於好,待在原地生活。

來接 Ricky 的兒福機構來到 Bella 的家,看到燒毀的穀倉以及空無一人的房子,發出了通緝令,並且派出大批人馬到森林追捕 Hector 跟 Ricky。Hector 本身就很擅長野外求生,腳傷恢復到一定程度後,就帶著 Ricky 在廣大的森林裡邊遊蕩過生活,跟兒福機構玩捉迷藏。直到有一天,他們在一個小屋遇到三個獵人,這三個獵人因為通緝令,就想逮住 Hector,一番爭執以後,Hector 跟 Ricky 兩人逃走,也因此跟這三人結下樑子。後來又在另外一個小屋發現了一個瀕死的人,Hector 要 Ricky 去山下求援,他留在這邊照顧。Ricky 下山以後,認識了一個可愛女孩,請他幫忙聯繫救護人員去山上救援。女孩和她父親跟 Ricky 成為朋友,並留他下來吃飯,可是 Ricky 在吃完飯以後,不小心睡著了。隔天早上 Ricky 起來,心想糟糕了,趕緊請女孩帶他回到森林那邊。Ricky 回到小屋,就看到已經有救護人員去救護那個人了。而 Hector 則不知去向,所幸後來還是遇到。

在森林遊蕩好一陣子以後,又遇到 Phycho Sam ,Phycho Sam 是個好人,就是怪怪的。他動了 Ricky 的手機,導致兒福機構的人包圍了他們。Hector 跟 Ricky 用了 Sam 的車,衝出重圍。開車逃了好一陣子,還是沒辦法逃掉,兩人最終被逮。兩人都上了法院,Ricky 還只是個少年,從輕量刑,被之前遇到的女孩父親所收留,而 Hector 則進了監獄。一年以後,Hector 出獄了,到了老人之家,Ricky 去找了他,告訴他,現在在女孩父親的農場那邊,那邊還有缺人,問他想不想繼續一起生活。Hector 想了想,說之前跟你一起在森林遊蕩的日子還不賴,而且這邊生活超無聊,就一起吧。於是兩人到了女孩父親的農場,繼續一起生活。

故事真的蠻不錯的,很溫馨,也很有趣。電影裡有不少熟面孔,第一個是 Hector,我細看才看出來,他就是在侏羅紀公園裡帶著兩個孩子逃跑的那個教授。第二個是為 Bella 主持告別式的牧師,他就是導演啊,同時也是雷神索爾三的導演。第三個是 Phycho Sam,他是 Jumanji – Welcome to the Jungle 一進遊戲時,為主角解說的那個 NPC 。最後一個是 Ricky ,他有演死侍2裡那個很會用火的男孩。   

Hunter Killer

這部電影我真的花了好多次才看完,每次都是在 Fox movie 看到,每次都會因為某些事情而中斷只看到一部分,這次,終於看到最後。這部電影的故事真的很不錯,電影也拍的很好,節奏、氣氛都很棒。

故事大致是美國軍艦在俄國海灣那邊發生了衝突,美國派軍艦過去調查。但這次的事件,其實是國防部長想要掌權而指使的,目的是為了把總統引到軍事基地去。總統來到軍事基地後,就被軟禁了。美國情報局同時也掌握了這項情資,跟軍方合作,派出了特遣小隊去近距離蒐集進一步的資訊。美國軍艦來到衝突現場後,艦長發現事情並不單純,現場有美國潛艦跟俄國潛艦的殘骸,殘骸看起來不像是互相對戰,俄國潛艦看起來還有人活著,就派出救援小組去救人。救起了人以後,雙方本來還有點劍拔弩張,但艦長認為,在事情還沒調查清楚之前,不應該把他們當作敵人,就遏止了副艦長等手下。艦長在俄國人稍微休息後跟他對談,才知道他是俄國潛艦的艦長。談話裡,他除了好言相勸要相互合作外,也慎重的說明當前的情況,這場衝突不單純,而且美國絕對沒有先動手。

到了俄國的特遣小隊到了軍事基地,竊聽到這一切都是國防部長的陰謀,美國指揮部那邊就決定要把俄國總統救出來。首先,告訴特遣小隊要去救人,一方面也告訴美國潛艦要去接人。美國潛艦透過那個俄國艦長的幫忙,順利穿過滿佈雷達、水雷的俄國水域。特遣小隊也透過總統保鑣的幫忙,救出總統,也順利的把人送到潛艦。潛艦帶著俄國總統要逃離時,被俄國軍艦察覺,在艦長下令不還擊的情況下,被逼到絕路。

這時候換美國國防部長暴跳如雷了,因為他認為如果俄國國防部長惡人先告狀的話,世界就會認為美國製造衝突,還把俄國總統擄走。可惜,俄國國防部長沒那麼聰明。潛艦艦長也透過俄國艦長的幫忙對軍艦廣播,說明一切都是俄國國防部長的陰謀,只是軍艦也半信半疑,不敢輕舉妄動。就在雙方僵持不下的時候,俄國國防部長下令發射飛彈攻擊潛艦,眼看美國潛艦就要被炸掉了。令人意外的事情發生了,俄國軍艦發射防空火炮將飛彈打下來,美國軍艦安然無事,同時也發射飛彈攻擊了俄國國防部長所在的大樓。

最後,俄國總統以及俄國艦長回到俄國,一場可能演變為世界大戰的衝突消弭於無形。