電影流水帳(2019/04/15~2019/05/26)

Embed from Getty Images
  • The World’s End (IMDB, Wikipedia),台譯:醉後末日。
  • Avengers: Endgame (IMDB, Wikipedia),台譯:復仇者聯盟四-終局之戰。
  • Pirates of the Caribbean: Dead Men Tell No Tales (IMDB, Wikipedia),台譯:加勒比海盜-神鬼奇航:死無對證。
  • Pirates of the Caribbean: On Stranger Tides (IMDB, Wikipedia),台譯:加勒比海盗-神鬼奇航:幽靈海。

The World’s End

Gary 一直惦記著在畢業那天沒完成的願望,畢業那天,他跟其他四個死黨打算喝遍鎮上十二個酒吧,在喝的過程裡,發生了許多事情,只是他們並沒有喝到最後。幾個死黨也因為這天的事情,互不聯絡了好幾年。Gary 之後過的並不如意,工作不順利,也有了酗酒的習慣。他一直想著如果當初喝完這十二間酒吧,之後的事情會不會變得不一樣。直到這天的戒酒互助會,他在裏面聽到一句話,他決心找過去的好友一直去挑戰這十二間酒吧,完成他心裡的願望,彌補遺憾。

Gary 費了很大功夫,才說服他的四個好友一起回去挑戰。回到這小鎮開始挑戰以後,他們覺得這小鎮變得怪怪的了,只是這種感覺隱隱約約的,不知道是太久沒回來的關係還是真的怪怪的。隨著挑戰的進行,他們確定了小鎮真的怪怪的,同時他們也慢慢化開心結。喝到後面幾間的時候,他們確定了小鎮的人們被外星人慢慢的替換掉,本來是打算喝到最後一間酒吧「世界末日」之後,再偷偷離去。但是外星人發現了他們知道了,試著要跟他們談判,不過,他們義無反顧的拒絕了。於是展開一場追逐戰,追逐戰的最後,Gary 、Andy 跟 Sam 逃出小鎮。小鎮爆炸了,而這爆炸將地球的所有電磁設備都摧毀了,地球回到黑暗時代。

Avengers: Endgame

這篇很尷尬,看完不能馬上寫,所以拖了很久才敢寫。

接續之前復仇者聯盟三的劇情,薩諾斯消滅了宇宙一半的人,然後他去養老了。在太空漂流的鋼鐵人與涅布拉被驚奇隊長給推回地球去,回去的鋼鐵人跟剩下的成員們吵了一會就跟小辣椒走了。剩下的成員們找到薩諾斯之後,跑去找他算帳,看能不能拿回無限寶石救回被消滅的人,結果,薩諾斯拿無限寶石消滅了無限寶石。這下沒戲唱了,生氣的索爾砍了薩諾斯。

失望的復仇者成員們回到地球,想要做點什麼,卻又沒辦法做什麼,沈浸在無力感之中。五年很快的過去了,未來看似仍然沒有希望。舊金山的某處倉庫裡,有輛看來熟悉的車子,老鼠在車子的後車廂活動時,觸動了某項儀器的開關,蟻人史考特橫空出世。在蟻人與黃蜂女電影的彩蛋裡,史考特被困在量子領域,現在才出現。史考特出了倉庫以後,在外面溜轉了一圈,他心裡想,「薩諾斯讓這世界已經變得不一樣了啊,那我的女兒呢?」他趕緊去看了紀念碑,碑上沒有女兒的名字 (話說這紀念碑是很多沒錯,但是一個碑上能刻多少人?同名同姓又有多少人?),於是他趕往之前女兒的住處。按了門鈴,來應門的是個婷婷玉立的少女,「啊~女兒都長這麼大了!」,「啊~是爸爸!」兩人緊緊的抱住。史考特了解狀況之後,突然想到了重要的事情,告別女兒之後,匆匆趕往復仇者聯盟總部。

在復仇者聯盟裡,史考特跟美國隊長與黑寡婦交代了前因後果,認為量子領域可以帶他們回到特定的時間點,改變時空。於是他們去找了專家,東尼史考特,試著請他幫忙。但東尼認為這可不是時間旅行電影,不太可能這樣子做,美國隊長等人只好離去,轉而尋求浩客幫忙。美國隊長等人找到浩克,浩克並不是量子領域的專家,他還是答應幫忙,不過實驗並不順利。

東尼雖然拒絕了他們,但心裡一直掛念著這個點子,並且試著做摹擬與推算,然後發現了這是個可行的點子。在跟小辣椒商量以後,他決定還是幫這個忙,於是他前往復仇者聯盟總部。果然在東尼幫忙之下,他們順利的完成可以在量子領域裡指引方向的儀器,並且擬定了計劃,要分成三組人,到不同的時間與地點去借回無限寶石。在計劃的進行中,發生了不少故事。這裏面最讓我感動的是東尼遇到他父親以及美國隊長再次見到卡特的那段,東尼再次遇到他父親,其實是有點不知所措的,不過聊起了對孩子的期許,就開始有話聊了。東尼從父親的口中知道,對他一向嚴厲的父親其實是很愛他的,在交流裡,他也分享了他自己對於孩子的想法。

計劃大致上是順利的,不過仍然有無法預期的部份,像是黑寡婦的犧牲,以及遇到薩諾斯。無限寶石已經取回,浩克以他強壯的身體使用了無限手套,回復了之前被消滅的另一半人。可是在那個時空點的薩諾斯利用了涅布拉也來到這個時空,為了無限手套,復仇者聯盟與薩諾斯展開大戰。經過一番精彩的打鬥之後,東尼使用了無限手套,消滅了薩諾斯等人,可是東尼沒有浩克強壯的身體,承受不了使用無限手套的後果而死去,最後就在失去東尼的哀傷中結束。

Pirates of the Caribbean: Dead Men Tell No Tales

在幽靈海之後,故事試著延續之前第三集的故事。

Henry 是前三集男女主角 Will 跟 Elizabeth 的兒子,Henry 知道自己父親犧牲而被詛咒纏身,必須得永世當飛翔荷蘭人號的船長。為了破除這個詛咒,他開始尋找波賽頓的三叉戟。在尋找的過程裡,他找到 Carina 與 Jack Sparrow ,並與他們合作。經過一番冒險之後,終於他們找到了三叉戟,並且破除了詛咒。Will 跟 Elizabeth 終於能重新在一起,而 Henry 也跟 Karina 在一起,一個皆大歡喜的結局。

在維基百科條目裡看到最後 Will 與 Elizabeth 同床時,有看到人影,同時發現地上有藤壺的痕跡,這似乎是表明了有第六集的可能。

Pirates of the Caribbean: On Stranger Tides

這故事是個新的開始,大致是在講 Angelica 要 Jack 幫忙尋找青春之泉,來讓她父親-黑鬍子能延續生命。不過最後 Jack 想讓 Angelica 看清她父親的真面目,弄出兩個杯子讓黑鬍子選擇,結果黑鬍子選擇錯誤,喝下了錯誤的青春之泉而死去。

比較讓我印象深刻的是那幕美人魚的戲碼,我搞不清楚傳教士到底怎麼了。為了取得人魚的眼淚,黑鬍子一行人在人魚灣獵捕兇惡的人魚,經過一番亂戰之後,好不容易撿到一條美人魚,一行人帶著這條人魚前往青春之泉。在路上,傳教士對人魚動了情,並幫助她。而之後 Angelica 利用了人魚對傳教士的感情,取得了眼淚。後來在青春之泉的三方會戰時,傳教士受了重傷,他找到趁亂逃脫的人魚,人魚帶走了傳教士。我以為傳教士是被人魚帶走並被殺死了,但維基百科裡說是被人魚帶走救治,所以到底是?

celery 無法 inspect

環境:

  • Celery 4.2.1
  • Broker backend: RabbitMQ
  • Result backend: Redis

想使用 celery inspect 來查 memory leak 問題,但是 celery inspect 時,都會出現 Error: No nodes replied within time constraint. 的訊息。

察看 log 以後,確定當 celery log 出現 warning,connection reset by peer 時,celery status 就會出現 “Error: No nodes replied within time constraint.” ,在這個同時,rabbitmq server log 也會出現 Missed heartbeats from client, timeout: 20s 的 ERROR ,有看過以下 issues,但沒幫助

後來找到這篇 rabbitmq报Heartbeat missing with heartbeat = 60 seconds ,參考內容把 celery 的 broker_heartbeat 設定改為 0,避免 RabbitMQ 做 heartbeat 的檢查。看來就解決了。

原理的解說可以參考這篇:Detecting Dead TCP Connections with Heartbeats and TCP Keepalives 大致上是說,RabbitMQ 有連線 heartbeat,當 client 沒回應的時候,RabbitMQ 會主動斷掉。而這個 heartbeat 是可以透過 client 在初始化連線時去設定的,所以調整 celery 設定,請 RabbitMQ 不要做 heartbeat 檢查就可以了。

Flutter 二三事

這兩天試驗 flutter 時,查找到的一些東西,大致上還蠻順利的。

安裝 flutter

照官方文件 (Linux install) 來進行安裝,大致沒什麼問題。

我碰到的問題是,執行 flutter doctor 以後有 Android license status unknown. 的問題。可是 Android SDK 也裝了,應該是要可以才對。

後來自行去執行 Android SDK 裡的 sdkmanager 以後,才知道是因為無法執行 sdkmanager 而導致 flutter doctor 檢查失敗。我檢查了一下 java 的版本,目前使用的是 java 11,而 Android 還不支援 java 11,所以改安裝 openjdk-8-jdk 以後,再執行 flutter doctor –android-licenses 就可以了。

RenderFlex overflowed

這個是因為 Layout 固定 (StackOverflow),鍵盤出現,會蓋住輸入框,flutter 很貼心的出現這個 warning ,提醒要改用可以 Scroll 的 View我是改用 SingleChildScrollView:https://api.flutter.dev/flutter/widgets/SingleChildScrollView-class.html

退出 app

有查到這個退出 app ,說可以用 exit(0),也可以用

import 'package:flutter/services.dart';
// ...
SystemChannels.platform.invokeMethod('SystemNavigator.pop');

但有人說 SystemNavigator.pop 只適用於 Android。

講 Layout 的

其他

Django jsonfield

Django 有提供 jsonfield,但只能用在 postgresql 上,有另外一個專案 django-mysql 提供了可以用在 MySQL 上的 jsonfield。是的,就目前來說,並沒有一個通用的 jsonfield。惟一能找到的,就這個 django-jsonfielddjango-jsonfield 的網站上也有特別提到這件事情,並且說 django-jsonfield 只繼續維護,不再開發,因此不建議使用這個專案。但是就跨資料庫來說,目前好像也就這個專案可用。

我有想過要依照 DATABASE 設定來區分要使用哪個 jsonfield,但仔細想想,這最大的問題可能會出在 Migration,因為 Migration 裡會直接引用 jsonfield 。migration 裡沒辦法讀取到 django settings ,也就沒辦法做到動態的處理。不過,可能還是要試試看才知道行不行。

MySQL 到底有沒有 case sensitive ?

公司的程式有人回報說,在搜尋電子郵件時,沒有區分大小寫 (case insensitive),我心裡想,雖然電子郵件並沒有嚴格區分大小寫,但我應該沒有特別做這件事,照理說,是要有區分大小寫才是,於是我開始看程式碼去找是不是 Django 等框架/函式庫自動加上了。

不過我找了好一陣子都沒找到,看來應該不是程式的問題。既然不是程式問題,那就可能是資料庫問題了,我在開發環境的 SQLite 裡用 SELECT SQL 查詢,有區分大小寫;生產環境是用 MySQL,我改在 MySQL shell 用 SELECT SQL 來查詢。結果,真的是資料庫設定問題,上網搜尋,才確定真的是 MySQL 問題:

簡單的說,是 collation 問題,所以解決方法也算是簡單,一個方法是改變 collation,看是要資料庫整個改,還是個別 table/column 去改;一個方法則是改 column data type。

MySQL 手冊對 collation 的說明是這樣的 (連結),只要後綴是 _cs 的或是 _bin 的,都是 case-sensitive 的。改 collation ,可以先使用 SHOW COLLATION WHERE COLLATION LIKE “%_cs” 來找,但 utf8 是沒有後綴名為 _cs 的 collation,只能使用 utf8_bin 。找到合適的 collation 後,要改指定 column data type ,可以使用 ALTER TABLE documents__document CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

以 Django 來說,當然最好是一開始在建立資料庫時,就指定好 charset 跟 collation,之後的作法就是自己寫 Migration 執行自訂的 SQL 來變更指定欄位的 data type 了。

電影流水帳(2019/04/01~2019/04/14)

Embed from Getty Images
  • The Bourne Identity (IMDB, Wikipedia),台譯:神鬼認證。
  • The Bourne Supremacy (IMDB, Wikipedia),台譯:神鬼認證-神鬼疑雲。
  • The Bourne Ultimatum (IMDB, Wikipedia),台譯:神鬼認證:最後通牒。

這篇放在草稿裡,放了很久,劇情差不多都快忘光了,靠著維基百科才回想起來。

The Bourne Identity

讓 Matt Damon 成為動作明星的代表作,故事緊湊,動作也寫實,場景都在歐洲取景,很好看。

Jason 哥被漁船從海上撈起來,醒了以後,發現自己什麼都不記得。靠著藏在身上的訊息,去瑞士銀行取出保險箱裡的東西,發現自己的身份…很多,暫時就先用了 Jason Bourne 當作自己的名字。值此同時,CIA 在銀行安插的人也通報了 CIA,CIA 高層相當的驚訝,懷疑 Jason 回來的動機,決定展開追殺。Jason 以前的訓練讓他感覺到危機,開始逃跑。在路上遇到了 Marie,請她幫忙。兩人開始逃跑,Jason 也在一連串的追殺中,慢慢回憶起自己的過去,並且知道了自己為什麼被追殺。最後,Jason 幹掉了之前負責自己這個任務,也是想幹掉自己的長官,然後去找了 Marie。

The Bourne Supremacy

這一集裡,Marie 被賜死了。線索還是指向上集的絆腳石計劃,絆腳石計劃裡有個事件跟俄羅斯政客有關係,CIA 高層也在調查 Jason 的事情,這些事情導致了 Marie 死去。Jason 不開心,決定回去搞清楚狀況。經過一番交手,Jason 跟 CIA 的 Pamela 算是達成某種程度的默契,Pamela 解決了 CIA 內部的問題,而 Jason 也暫時得以脫身,不被追殺。

The Bourne Ultimatum

這一集是一個結尾,Jason 找回自己的過去。

雖然 Jason 沒有惡意,但 CIA 仍然認為 Jason 是個威脅,持續的追蹤著他。而 Jason 在報紙上看到一篇關於自己的報導,認為這個記者可能有內線,才能進行有這樣深度的報導。於是 Jason 去找了記者,並且知道了這個內線是誰。這個內線是 CIA 裡的高層,並且經手過 Jason 的黑薔薇計劃。Jason 動身去找他,在過程裡遇到之前的熟人 Nicky 。不過 CIA 相當的心狠手辣,炸死了這個內線,Jason 在爆炸現場的碎片中找到 CIA。Jason 決定前往 CIA 大樓,這邊的故事接到前集最後的場景,Jason 利用 Pamela 將要追殺自己的人都引誘到別的地方,自己進去取得黑薔薇計劃的文件。在文件上提到了特別行動訓練中心的位置,Jason 前往那兒,並得知了自己所有的過去。在這同時,Pamela 也取得黑薔薇計劃的文件,送交給記者,揭發 CIA 的黑暗面。最後,Jason 從訓練中心頂樓跳入紐約東河,生死未卜。

Serveo.net

網址:https://serveo.net/
找 ngrok alternative 時,找到這個用 ssh 指令就可以破牆,挺方便的。

例子1

Port forwarding

在 A 電腦裡輸入

ssh -R 80:localhost:3000 serveo.net

按下 yes,會拿到一個類似 https://talis.serveo.net 的網址,當從另外一台電腦連到此網址時,會連接到 A 電腦的 port 3000

P.S. 

  1. 要拿到不一樣的網址,就帶 username,例如:ssh -R 80:localhost:8888 foo@serveo.net
  2. localhost 可以替換為其他電腦,例如 192.168.1.1

例子2

ssh port forwarding

在 A 電腦裡有 SSH server,然後輸入

ssh -R myalias:22:localhost:22 serveo.net

接著在其他電腦有 ssh client 的電腦裡輸入

ssh -o ProxyCommand="ssh -W myalias:22 serveo.net" user@myalias

就可以連接到 A 電腦的 SSH server

P.S.

  1. OpenSSH client 7.3 以後可以用 -J 參數:ssh -J serveo.net user@myalias

用 autossh 自動重連

事前預備

  1. sudo adduser –system –group –disabled-password autossh
  2. sudo chsh –shell /bin/false autossh
  3. 預先使用 autossh ,執行過一次 autossh 指令

autossh + upstart

# /etc/init/autossh.conf
# http://logan.tw/posts/2014/12/15/autossh-and-ubuntu-upstart-daemon/
description "autossh daemon for ssh tunnel"
start on net-device-up IFACE=br0 # 此處需因應網路裝置來調整為 eth0, eth1 ...
stop on runlevel [01S6]

setuid autossh
respawn
respawn limit 5 60
script
#export AUTOSSH_FIRST_POLL=30
#export AUTOSSH_GATETIME=0
#export AUTOSSH_POLL=60
autossh -M 0 -R pokemon22:22:localhost:22 serveo.net
end script

autossh + systemd

# /etc/systemd/system/autossh.service
# https://gist.github.com/thomasfr/9707568
[Unit]Description=Keeps a tunnel to 'serveo.net' open
After=network-online.target

[Service]
User=autossh
# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# LOCALPORT:IP_ON_EXAMPLE_COM:PORT_ON_EXAMPLE_COM
# ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 -l autossh remote.example.com -L 7474:127.0.0.1:7474 -i /home/autossh/.ssh/id_rsa
ExecStart=/usr/bin/autossh -M 0 -R pokemon22:22:localhost:22 serveo.net

[Install]
WantedBy=multi-user.target

s3proxy

網址:https://github.com/gaul/s3proxy
可以在本機端測試 S3,而不需要去開 S3 bucket 跟弄 AWS credential ,s3proxy 提供了跟 S3 一樣的 API 介面。

boto3 可以用,用法參考這邊:https://github.com/gaul/s3proxy/wiki/Client-compatibility-list

# Python3 + boto3 example
session = boto3.session.Session(aws_access_key_id='identity',
                                aws_secret_access_key='credential')
config = boto3.session.Config(s3={'addressing_style': 'path'})
# low level S3 client
client = session.client('s3', endpoint_url='http://localhost:60080',
                        config=config)
# S3 resource object
resource = session.resource('s3', endpoint_url='http://localhost:60080',
                            config=config)

用 docker 快速啟動

mkdir -p /tmp/data
docker run --publish 60080:80 -v /tmp/data:/data --env S3PROXY_AUTHORIZATION=none andrewgaul/s3proxy

django-storage 的話,應該是要改設定裡的 AWS_S3_ENDPOINT_URL

電影流水帳(2019/03/24~2019/03/31)

Embed from Getty Images
  • War for the Planet of the Apes (IMDB, Wikipedia),台譯:猩球崛起:終極決戰。
  • Isn’t It Romantic (IMDB, Wikipedia),台譯:好不浪漫。
  • 斉木楠雄の Ψ 難 (IMDB, Wikipedia),台譯:齊木楠雄的災難。

War for the Planet of the Apes

在轉台時,意外轉到「猩球崛起:終極決戰」,故事已經過半,本來是想要轉台的,但是被 Caesar 跟 McCullough 對談,要求給猩猩們食物跟水的那場戲給吸引,然後就看完了。

前面的故事大致可以推測出來,Caesar 帶著猩猩們去跟 McCullough 求和,卻反被囚禁,並且被 McCullough 脅迫要蓋城牆以對抗 McCullough 的敵人。這場戲裡,McCullough 緩緩道出自己的過往,是因為自己的兒子感染了病毒無法說話,整個人經歷了許多轉折,為了避免影響其他人,他忍痛殺死了自己的兒子,以避免感染。軍隊裡有其他人也感染了,McCullough 也因此跟原本的同袍切割。

Caesar 本來被折磨到失去信心,可是他在外面的朋友與一個小女孩回來找他,他決定重新振作起來,要拯救他的同胞。在經過努力之後,他們終於成功脫逃。諷刺的是,後來 Caesar 想回去殺了 McCullough 時,卻發現 McCullough 也感染了跟他兒子一樣的病毒,無法言語,Caesar 因此放下心裡的怨恨。McCullough 一方失去主帥,再加上敵人來襲,整個無法抵抗,McCullough 的敵人迎接了勝利,可是勝利是短暫的。爆炸引發了大雪崩,一瞬間的時間,一整群軍隊就被瓦解,放眼望去,只剩下雪白的大地。Caesar 與他的族人們順利逃離,遷徙到氣候溫暖、有水有食物的地方,只是 Caesar 之前逃離時受了重傷,此時再也撐不下去,簡單交代事情後就死去了。

Isn’t It Romantic

莫名其妙的被 Netflix 下的 Rebel Wilson 照片跟劇情簡介吸引了,整體來說,還不錯,結局並不八股,有點出人意料。

Natalie 是個建築師,平時在事務所裡並不被重視,甚至被當作咖啡小妹使喚。某天在地鐵站被搶,爭執之下撞到柱子,暈了過去。Natalie 醒來以後,發現自己置身於愛情歌舞電影裡,整個莫名其妙。經過奇妙的遭遇以後,她找到自己的人生目標並且調整了自己的處世態度,然後她醒了。回到現實世界以後,Natalie 應用自己在夢裡所學到的,開始了不一樣的人生。

斉木楠雄の Ψ 難

因為之前看過動畫,Netflix 剛好又上了真人電影,就來看一下跟動畫差在哪。整體來說,我覺得還蠻接近的,該抓到的韻味都有抓到,蠻好笑的。真要說缺點,大概就是動畫都是短短的劇情,電影必須要把這些短短的劇情串起來,在過場時,難免會有點不順暢。

故事主要是以 OK 學園祭為主體,再加上主要人物的介紹,大概就這樣。最讓我佩服的就是橋本環奈,她的表現突破美少女形象,真的很佩服她可以在漂漂亮亮的下一秒做出那麼逗趣的表情。

django stronghold

網址:https://github.com/mgrouchy/django-stronghold

這個 package 蠻好玩的,django 預設的 view 都是 public 的,得加上 LoginRequired decorator 或繼承 LoginRequiredMixin 才能限制只有使用者能用,但 stronghold 是反過來,在 middleware 加上 LoginRequiredMiddleware,強制所有的 view 都是 LoginRequired,只有加上 public decorator 或繼承 StrongholdPublicMixin 的才是 public。

對一個都需要驗證後才能使用的系統,這倒是方便許多。