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。

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

電影流水帳(2019/03/07~2019/03/23)

Embed from Getty Images

Deadpool

之前其實看過幾次播出,但都不是完整版的,這次是在飛機上看完。有動作,也有笑料,挺不錯的。

一開始採取倒敘的形式,從刺殺行動帶到之前為什麼會有 Deadpool 的出現。Deadpool 本名是 Wade,特種部隊退伍,愛上 Venessa ,就在要結婚前夕,發現自己已經癌症末期。為了不拖累 Venessa ,Wade 接受了陌生人的實驗邀約。這個實驗是試著以各種方式折磨人來試著讓人得到特殊能力,Wade 被 Ajax 折磨了好一陣子以後,得到了特殊的能力,但是也因此毀了容。Wade 回去想找 Venessa ,卻發現自己的臉太恐怖,不敢相認。他決定報復 Ajax ,就去鬧了 Ajax 所有的點。直到後來,Ajax 發現 Wade 沒死,就綁了 Venessa。而 Wade 找了 X-Man 的 Colossus 跟 Warhead 幫忙去救 Venessa ,順便打 Ajax 跟 Angel Dust ,最後經過大戰,打贏了,救回 Venessa,從此過著快樂的日子。

John Wick: Chapter 2

動作依舊刺激、緊湊,但有點乏了,覺得沒有第一集來的好看。

本來 John 是要退休了,卻為了還 Santino D’Antonio 的人情債,他只得再次到義大利出任務,殺 Santino 的姊姊。出完任務回來,卻被 Santino 出賣,他只好找以前在 The Matrix 的搭檔 Morphis 幫派頭頭 Bowery King 合作,來擊殺 Santino。沿路追,沿路殺,最後追 Santino 追到 Continental Hotel ,照理說,到了飯店是不能開殺戒的,但 John 就還是開了殺戒,Santino 被擊斃。John 也因為這件事情而被開除會員身份,飯店的主人 Winston 看在以前的份上,給了他一些時間,讓他逃走,留下第三集的伏筆。

Widows

一群男人去搶劫,結果卻死光了,留下了沈重的生活擔子給自己的女人。主謀 Harry 的遺孀 Veronica 取得了自己男人留下的筆記本,決定集結其他的女人 Linda、Alice 等,一起來幹一票,解決沈重的擔子。原本以為就只是那種類似「瞞天過海」的故事,但是我錯了。首先,這群男人搶的對象有問題,這個對象是一個議員的候選人 Manning,這次出來跟當地的議員世家 Mulligan 進行競爭,競爭的相當激烈。他們就是受到 Mulligan 的指使才去搶劫的。再來,這群男人真的都死了嗎?出人意料的,並不是都死了,主謀 Harry 還活著,而且帶出了意外的真相。隨著準備搶劫的過程,慢慢鉤勒出整件事情的樣貌,也讓這些女人們慢慢的成長。最後,這些女人順利的進行了搶案,了結掉是是非非,而 Mulligan 意外的當選了。結局有點平淡,沒有意想中的超級大快人心的感覺,只有一點點。

Captain Marvel

我是覺得這大致跟美國隊長一樣,很一般的交代起源的故事。女主角由 Brie Larson 來演真的是很適合,希望後續的故事能跟美國隊長一樣,帶出不一樣的局面。看完電影當天晚上在 HBO 看到金剛骷髏島,赫然發現 Samuel Jackson 跟 Brie Larson 早在驚奇隊長前就合作了,難怪他們倆在驚奇隊長裡的演出這麼合拍 😀

Vers 一開始在 Kree 受訓,後來跟著團隊去出任務。這場任務不是很順利,Vers 被 Skrulls 抓住,在 Skrulls 探視 Vers 記憶時,意外讓 Vers 想起了以前的事情。Vers 逃出了 Skrulls 的太空船,並掉到了地球。到了地球以後,Vers 遇到了神盾局的 Nick,在地球的遭遇讓 Vers 慢慢想起了以前的事情,並且了解了 Skrulls 並不是壞人。原來 Vers 本名是 Carol ,是個空軍飛行員,在參與一項任務時,意外吸收了宇宙魔方的力量而昏迷,並且被前來追殺 Skrulls 的 Yon-Rogg 帶回 Kree。知道了真相的 Carol ,決定幫助 Skrulls ,於是跟地球的好友們與 Skrulls 聯合起來擊退前來地球的 Kree 人。最後,Carol 為了幫助 Skrulls 找到新的居住環境而離開地球,留下 BBCall 機給 Nick,讓他能在地球危險時呼叫她。

電影流水帳(2019/03/02~2019/03/06)

Embed from Getty Images
  • Защитники (IMDB, Wikipedia),英譯:Guardians,台譯:守護者聯盟。
  • The Adventures of Tintin (IMDB, Wikipedia),台譯:丁丁歷險記。
  • Sanctum (IMDB, Wikipedia),台譯:3D驚天洞地。
  • オリエント急行殺人事件 (IMDB, Wikipedia),台譯:東方快車謀殺案。

Защитники

守護者聯盟,簡單說就是俄羅斯版的復仇者聯盟,之前看預告,覺得應該挺不錯的。實際看了之後,過場卡卡的,不流暢,故事也講的挺破碎的,不容易讓人了解前因後果,挺失望的。

故事大致就是有個超能者回來打算征服俄羅斯,特務組織就找回當初的超能者們,要打敗這個超能者。在找回這些超能者的經過頗不順利,所以花費了一番功夫。導演試著想帶出這些超能者的故事,一方面又想要講述打敗反派超能者的故事,結果就是卡卡的。最後還是打敗了反派超能者,讓俄羅斯恢復平靜。超能者們各自離開,回到自己過去的生活。

The Adventures of Tintin

轉台的時候意外轉到,剛好又是開始,就決定繼續看下去了。整體的感覺很像是印地安納的冒險,只是主角換成丁丁跟狗狗。故事蠻有意思的,動畫也製作的很好。

丁丁在市場裡遇到奇怪的人,意外的買到了精美的帆船,只是卻有人跟他開了高價,想要買下這帆船。丁丁不賣,想不到卻因此被捲入了奇怪的事件。隨著帆船被偷走,丁丁拿著意外落下的字條開始進行調查,然後他循著線索找到了帆船所在的宅邸跟該家族的後人。透過這個船長,慢慢挖掘出了帆船的祕密。經過一番冒險之後,終於將壞人繩之以法,並且也找到了寶藏。

Sanctum

本來以為是恐怖片,結果不是,主要是講洞穴冒險的故事,挺好看的。

一個富翁 Carl 僱用了一組人去新幾內亞的一個露天的很大的鐘乳洞探險,這組人是由 Frank 帶領的,已經探了洞穴一段時日,但雨季就要來了,再不趕快,就要等雨季過後才能繼續。富翁這天跟女友 Victoria 一同過去探視,也下去洞穴裏面。

就在這個時候,洞穴裡發生了意外。Frank 跟 Judes 發現了通往新系統的洞穴,可是卻因為沒多帶氧氣瓶,Judes 淹死了,只有 Frank 回來。剛跟 Carl 一起來到洞穴底部的 Josh 不捨 Judes,跟父親 Frank 吵了起來。其他人勸住了 Frank 跟 Josh,先休息。想不到休息完,天氣說變就變,開始下起大雨,Frank 等人急忙撤退,可是卻因為大水而沒辦法出去。Frank 只好帶著眾人往沒多久之前發現的洞前進,期望找到出路。

在 Frank 的領軍之下,慢慢往洞穴深處探勘,有的人不聽建議而死去,有的人因病而死去,有的人則是私自逃跑,總之,Frank 跟 Josh 在過程中,相互的理解彼此,突破了父子之前的隔閡。不過可惜的是 Frank 被 Carl 捅了而死去,Carl 也掛了,只有 Josh 順利的找到出路。

オリエント急行殺人事件

日版的東方快車謀殺案,故事就不多寫了,基本上就是地點改成日本,從九州發車到東京,天氣也是下著大雪,也是有個名偵探在車上。殺人事件發生之後,偵探在詢問完車廂裡每個人之後,解開謎底,這部份幾乎是原來小說的內容。後半部相當有趣,是編劇自行腦補發揮出來的,主要講案子的前因以及如何成事的經過。看完以後,仔細想想,這個謀殺事件要能成事,還真的是有相當的難度。個人覺得是還不錯,就是前後兩段加起來的片長還蠻長的,話說,這部嚴格來說也不算是電影,而是加長版的電視電影。

Alternative NTP – Chrony

前幾天看到的 NTP 軟體 – Chrony:

安裝很簡單,Ubuntu 14.04 以後的版本都包進去了:sudo apt-get install chrony

設定檔在 /etc/chrony/chrony.conf ,基本上不用去更動。主要的設定是 pool 或 server 開頭的那幾行,主要是描述要跟哪台 NTP 伺服器同步,Ubuntu 16.04 預設是寫pool 2.debian.pool.ntp.org offline iburst 。

在 AWS 環境裡,可以把該行改成 server 169.254.169.123 prefer iburst ,直接跟 AWS 的 NTP 伺服器同步。要跟 Ubuntu NTP 伺服器同步,可以改成 pool ntp.ubuntu.com offline iburst

使用方法也很簡單:

  • 看 NTP 伺服器來源:chronyc sources -v
  • 看目前同步狀態:chronyc tracking
  • 看目前的活動:chronyc activity

所以現在就不用 ntp/ntpdate 了。