電影流水帳(2020/01/01~2020/01/15)

轉眼就是2020年,流水帳開張啦!

Spider-Man: Far From Home

我覺得這集的節奏比較鬆散,沒那麼緊湊,沒上一集來的好看。但特效跟該加的梗還是很有誠意,該有的都有了。

前面簡單交代了因為彈指消失而回來的學生的處境,然後 Peter 就跟同學們去歐洲玩。這次 Peter 去歐洲玩,有件很重要的事情,就是跟 MJ 告白,為了告白,他計劃了好久。總之,一行人就出發了。

正所謂,無心插柳柳橙汁,Peter 的好友,Ned 反而莫名其妙的跟隔壁座的女同學熱戀起來了。Peter 旅途不是很順利,不時遇到奇怪的元素眾,神盾局局長也來亂,請他跟 Mysterio 一起處理元素眾的事情。

邊處理元素眾的過程裡,Peter 跟 Mysterio 熟悉起來,進而 Peter 有了想把 Tony 給他的智慧眼鏡交給 Mysterio 的想法,然後就真的交給他了。Peter 交給 Mysterio 以後,也準備跟 MJ 告白。在跟 MJ 告白時,才發現是表錯情,MJ 一直想說的是,「你就是蜘蛛人吧」,而 Peter 一直以為是 MJ 對他有意思,

總之,在表錯情的最後,MJ 拿出一個投射器,照出了之前元素眾的樣子,Peter 意識到自己可能犯了大錯。於是,Peter 跟 MJ 試著去彌補這件事情,過程中才揭露出 Mysterio 是之前史塔克企業的員工,自己的全息投影被 Tony 講的一文不值,他很怒,才聯合之前史塔克企業的員工們一起策畫出這起事件,讓自己能夠成為超級英雄,從而取得利益。最後,Peter 跟 Mysterio 展開一場激戰,取回 Tony 的智慧眼鏡,並且揭露了 Mysterio。

信長協奏曲

電影是日劇的總結跟延伸,所以在一些劇情交代上就簡單的帶過去,不多做著墨。

三郎從現代回到日本戰國時代,遇到了織田信長,信長發現三郎跟自己長的非常相似,就請託他代替體弱多病的自己。想不到,織田家因為信長(三郎)的活躍,而有了一統日本的機會。

故事大致是從第三次信長包圍網開始,一邊交代信長目前的困境,一邊交代人物之間的關係。明智光秀是織田信長本人;秀吉小時候因為幼時信長而家破人亡,對信長有一份怨恨。而三郎的人格特質卻讓原本有反心的明智光秀以及眾家臣們信服。

接著就交代為什麼明智光秀要反信長,簡單的說,就是秀吉掌握了光秀的痛處,要脅光秀殺死在本能寺的信長。光秀不得已放火燒本能寺,但卻讓信長(三郎)快走,趕來的秀吉跟光秀(真信長)說明了自己的怨忿之後,光秀非常驚訝也感到非常抱歉,跟秀吉談判說,請讓信長能統一日本,讓日本能和平,但秀吉不聽,殺了光秀。秀吉聲稱光秀逃了出去,光秀的面孔跟信長一模一樣,所以逃走的三郎只能頂替光秀的身份。三郎和勢弱的光秀軍隊,名義上又不能用信長的名字,跟秀吉一戰的結果,三郎戰敗,被秀吉逮了。三郎在秀吉面前高喊著不要忘了要讓日本和平之後就被斬首。不過三郎並沒有死,而是回到了現在。之後,有點嘴炮的說三郎的理想影響了當時追隨信長的人,然後讓日本安然的到現在。

看完去查了漫畫的資料,發現漫畫好像還沒收尾耶,不過電影這樣收尾算是不錯的了。小栗旬真的很有他個人魅力,一人分飾兩角,都能夠恰如其分;然後飾演秀吉的山田孝之也很厲害,把那種陰沉跟冷酷表現的很好;這兩個人是我印象比較深刻的。

Django開發者常犯的7個錯誤

從這篇 7 common mistakes that django developers make 整理出來的

  • Reinventing the wheel
    • 儘量找人家已經寫好的 package 來用,不要沒事自己在那邊重新刻
  • Monolith application structure
    • 要切 app ,該切就切。
    • 我自己目前有比較 confuse 的是,有用到其他 app 的東西時,該怎麼降低耦合度,又能使用方便,這中間去找到一個平衡點。這邊要等以後再來慢慢想怎麼做會更好了。
  • Writing fat representations and thin models
    • View 不要寫太多邏輯
    • 把邏輯抽到 module 或是 model 裡,讓邏輯統一,才能儘量重複使用。
  • Too many queries per view, or unoptimized queries
    • 一個 view 有太多資料庫查詢或是沒有將查詢最佳化,這個會導致速度變慢。
    • 我建議這邊同時可以考慮儘量使用 cache ,來減輕資料庫負擔。
  • Redundant model fields
    • 思考是不是要有真實的資料庫欄位,思考是不是可以使用 property 來做到同樣的事情。
  • Not adding indexes on models
    • 常用來查詢的欄位 (放在 filter 裡的) 記得加 index :db_index=True,該加就加。
  • Inconsistent data validation
    • model 的檢查跟 form 的檢查要一致。

用 go 的 docker image 來建置 go 專案

指令蠻簡單的,而且可以指定用 go 的哪個版本來進行建置。

# 先切到你的專案目錄下
cd "$WORKSPACE"

# 執行 docker run
docker run --rm -e GOBIN=/usr/src/myapp -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.6 bash -c make
  • –rm 表示執行完就把 container 刪掉
  • -e GOBIN=/usr/src/myapp 是設定環境變數,GOBIN 這環境變數是指編譯好的執行檔所放的位置
  • -v “$PWD”:/usr/src/myapp 表示把當前的目錄掛載到 container 裡的 /usr/src/app
  • -w /usr/src/myapp 表示把工作目錄指定到 /usr/src/myapp
  • golang:1.6 這是表示要使用 golang 1.6 這版,其他版本可以參考 dockerhub
  • bash -c make 是指用 bash 來執行 make,要用 bash 的原因是大部份 Makefile 都是假設用 bash,用其他 shell 會很容易踩到雷。

dockerhub 上有更多說明。

查程式連網速度

之前家裡 wordpress 速度慢慢的,看了 PHP slow log ,發現是使用 libcurl 去外面抓資料時慢。後來用 SSH 連上去在命令列下使用 curl 試試,第一次會慢慢的,之後就比較正常了。

那,為什麼 curl 會慢?上網找了,有在 StackOverflow 上找到一個方法可以顯示 curl 在各階段處理時所花費的時間。先在 $HOME 下新增一個 .curlrc ,然後把下面內容貼進去

-w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttransfer: %{time_starttransfer} | total: %{time_total} | size: %{size_download}\n"

再去執行 curl ,輸出結果後面就會出現 curl 所花費的時間

dnslookup: 0.253 | connect: 0.264 | appconnect: 0.773 | pretransfer: 0.773 | starttransfer: 0.809 | total: 0.809 | size: 6665

那個時候,我連網速度慢的主因是 dnslookup 慢,所以就根據這點,去做調整。至於這個調整,就又是另外一個故事了。

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

  • Frozen 2 (IMDB, Wikipedia),台譯:冰雪奇緣2。
  • Hanna (IMDB, Wikipedia),台譯:少女殺手的奇幻旅程。
  • Men in Black: International (IMDB, Wikipedia),台譯:MIB星際戰警:跨國行動。

Frozen 2

衝著 1 ,看 2 能不能延續 1 的精彩,我自己看完是覺得普普,沒有 1 來的那麼驚豔,而且 MV 的部份有點太過頭了。

Elsa 已經當了女王,可是卻時時聽到遠方的呼喚,也時常想起小時候母親講的故事。Elsa 為了艾倫戴爾和平,忍住不出去冒險。不過,你不去找麻煩,麻煩卻會來找你,艾倫戴爾遭受了奇妙力量的攻擊。Elsa 感應到是從遠方來的,於是她決定去看看,Anna, Kristoff, Olaf 也跟著一起去。

去到了北方的迷霧森林,遇到了會魔法的民族-北烏卓以及昔日的侍衛們,Elsa 跟 Anna 與他們談話後,才明白自己的母親來自這裡。在當時,發生了奇怪的事情,艾倫戴爾王國來到這裡跟他們締約,並修築了水壩。在慶功宴的時候,發生了屠殺。一場戰役後,Elsa 跟 Anna 的父親逃回了艾倫戴爾,並且結婚,生下 Elsa 跟 Anna,而森林則從此壟上迷霧。Elsa 跟 Anna 試圖想找到答案,於是往更北方的阿托哈蘭前進。

Elsa 費盡千辛萬苦到了阿托哈蘭,從記憶之河裡看到了真相。在當時,艾倫戴爾幫忙蓋水壩其實是不安好心,所以在慶功宴當天,就發動了屠殺。Elsa 跟 Anna 的父親則是被北烏卓的伊杜娜所救,後來結婚生子,而這也正是 Elsa 會魔法的原因。但 Elsa 在看到真相後,也被冰住了,只能捎信告訴妹妹 Anna。Anna 得知真相後,說服了留在魔法森林的侍衛,趕緊去破壞水壩,他們利用土靈破壞了水壩。在水壩破壞後,Elsa 也隨之解封,所以她趕緊趕回艾倫戴爾,拯救了城市。然後再回到森林,與眾人會合。

跟 Anna 商量以後,決定由 Anna 繼任艾倫戴爾的女王,而 Elsa 則留在魔法森林這邊,成為北烏卓的女王。最終,兩個民族順利的在數年之後,以隔代傳承的形式達成和解。

Hanna

我是衝著這個女主角去看這部電影的,女主角 Saoirse Ronan 在 The Grand Budapest Hotel 的演出實在是太有趣。這部電影是她之前的作品,看完以後,我覺得是普普。

Hanna 從小跟著父親 Erik 在冰天雪地裡生活,父親持續的教導他攻擊的技巧與知識。直到有一天,父親拿出一個裝置,問她,你準備好去外面的世界了嗎?準備好了,就按下按鈕。她想了許久,然後下定決心按下去。父女倆就此分道揚鑣,並講好到預定的地點集合。

按鈕其實是一個無線電發射器,按下之後,就會發出訊號,被 CIA 追蹤。CIA 的 Marissa 長期在追蹤 Erik,這一天收到了訊號,於是她進行佈署,要追捕 Erik 與 Hanna。Hanna 在前往目的地,遇到了一個有趣的家庭,他從他們身上開始慢慢認知這個世界的不同。同時,他也持續的在應付 Marissa 的追殺。在這個旅程中,事件的真相也慢慢的浮現出來。Hanna 是透過基因改造而培育出來的嬰兒,Erik 是個特務,與 Hanna 的媽媽參與了這個計劃,但後來因為 Hanna 的媽媽還是割捨不下,就跟 Erik 逃離了。Marissa 是計劃負責人,他不能就這樣讓 Erik 他們逃走,只能痛下殺手。後來發生了事故,Hanna 的媽媽死去,Erik 帶著 Hanna 逃到冰天雪地裡。

最終 Marissa 追蹤到了 Hanna 跟 Erik ,展開一場對決。Marissa 跟 Erik 都死去,Hanna 則順利活了下來,故事就到此結束。

Men in Black: International

男女主角也是雷神索爾三的男女主角,也因為雷神索爾三,所以才想看看這片能否跟雷神索爾三一樣出色。不過很可惜,沒有到那麼好看,只能說是中上。

Molly 小時候遇過外星人,也看到 MIB,所以非常想要成為 MIB。長大之後,好不容易找到了 MIB ,並且以其特質影響了 Agent O ,讓 Agent O 決定培訓他成為 MIB。Molly 成為了 MIB Agent M 之後,就被 Agent O 派去倫敦出差,說是要找出內鬼。

歐洲分部的英雄人物是 High T 跟 Agent H,他們聯手去巴黎鐵塔 (舊有的蟲洞通道)阻止蜂星人,後來 T 成為歐洲分部的頭頭,而 Agent H 仍然是 Agent H。Agent M 來到歐洲之後,被 T 指派跟 Agent H 去保護外星貴族 Vungus 。但殺手實在太厲害,再加上 Agent H 的漫不經心,Vungus 被殺害了。在臨死前,Vungus 把一個東西交給了 Agent M。整個歐洲分部就為了這個東西翻天覆地了,這個東西其實是個威力強大的武器,所以眾多人馬爭奪。在爭奪的過程裡,武器到了 T 的手上,同時,真相也慢慢被挖掘出來。對,看到這邊,觀眾也該猜到了,T 已經被蜂星人操控。T 跟 Agent H 在巴黎鐵塔時,並沒有成功阻止蜂星人,相反的,蜂星人操控了 T,並且用光照了 Agent H,Agent H 因此沒有了這段記憶。Agent M 就跟 Agent H 一同前往巴黎鐵塔阻止 T,最終成功的阻止了蜂星人。此時,趕來巴黎的 Agent O 任命 Agent H 為歐洲總部的頭頭,並且若有似無的埋下伏筆。

電影流水帳(2019/10/01~2019/11/30)

  • Baby Driver (IMDB, Wikipedia),台譯:玩命再劫。
  • Ghost in the Shell Arise: Border 2 – Ghost Whisper (IMDB, Wikipedia),台譯:攻殼機動隊-靈魂密語。
  • P風暴 (IMDB, Wikipedia)。
  • Star Wars: The Last Jedi (IMDB, Wikipedia),台譯:STAR WARS:最後的絕地武士。

Baby Driver

這部電影是看了網路上影評之後,決定要看的,剛好 Netflix 上有,就找個時間,把這部電影看完了。Kevin Spacey 飾演專門策劃搶案的教授,有他的電影,大概不會太差。看完以後,的確覺得導演導的很好,節奏緊湊,沒有冷場。

Baby 是個後天聽力有問題的年輕人,他開車技術很棒,在不好的因緣巧合下,他遇到了 Doc,Doc 後來都找他當搶案的車手。幾次搶案下來,Baby 慢慢還清欠 Doc 的債務,終於,到了還清的時候。Doc 告訴他,以後不會再找他了。Baby 心裡也放下一顆大石頭,畢竟這種不法的勾當,總是怕出事,一旦出事就糟了。

不當車手以後的第一天,Baby 照慣例去速食店用餐,他遇到了 Debora,一個令他動心的女子。幾次見面後,Baby 已經陷入愛河。Baby 帶了 Decora 去吃飯,本來以為不會再遇見 Doc 的 Baby,竟然遇到 Doc,Doc 再次找了 Baby 去合作搶案。Baby 原本不願意,但 Doc 用養父 Joseph 跟 Debora 來威脅 Baby,Baby 不得已只好答應。這次的行動並不是很順利,搶案跟預期的不一樣,但還是搶到東西了。但之後的分贓整個亂了套,他們一起拿了東西要去銷給 Doc 的警察朋友,可是 Bats 的疑心太重,反倒跟對方火拼起來。Bats 的女友 Darling 因為這場槍戰而死了,Buddy / Bats / Baby 三人開始火拼起來。拼鬥到最後,Doc 幫了 Baby 一把,Baby 跟 Debora 想逃出去,但後來還是被警方阻截,Baby 放棄逃走,束手就擒。後面以走馬燈帶過 Baby 牢裡的經歷以及 Debora 的等待,故事以 Baby 順利出獄而結束。

Ghost in the Shell Arise: Border 2 – Ghost Whisper

這集講的是捏造的記憶,有個軍人在一次事件之後,就被捕入獄,接受法院調查。但實際發生的事情跟他的供詞、記憶卻對不上,他一直以為自己是作對的事情,所以試圖與其他也被捏造記憶的同伙在暗地裡運作著。少佐介入調查以後,慢慢發現了有捏造記憶的事情,所以先製作解毒程式,幫他的同伙們恢復了因為病毒而被捏造的記憶,然後再處理那個軍人。最後事情水落石出了,恢復了平靜,整件事情可能跟高層有關係,這就得等後續的故事再做交代了。

不過,如果記憶是可以被病毒侵入而改變,那麼,還有什麼是可以信賴的呢?

P 風暴

查了維基百科,才知道這部電影是今年上映的,只是怎麼那麼快衛視電影台就有得看了呢?會想看這部電影是因為這部系列作之前的作品還不錯,也想看看古天樂跟張智霖。大抵來說,跟前作相比算是持平,還可以。

這集主要是陸志廉要查行賄懲教人員的事情,進牢裡去臥底,所以幾乎都是在演牢裡調查的經過,故事最後就是順利解決案件這樣。

Star Wars: The Last Jedi

終於在 Netflix 上等到這部,說真的,從看完到現在,其實沒留下什麼深刻的印象或是意猶未盡的回憶。

延續上集,Rey 去找了 Luke學藝,可是 Luke 因為過去 Kylo Ren 的經歷而不肯教導她。後來 Luke 才跟 Rey 說,本來 Kylo 是跟著他學習絕地武士功夫的,可是因為感受到 Kylo Ren 的邪惡本質而決定要殺了他。就要要動手的那一刻,Luke 猶豫了,Kylo Ren 因而逃走。也由於此,Luke 不想要教導 Rey。但 Rey 終究還是打動了 Luke,讓 Luke 傳授她絕地武士的技藝。

這段其實是個羅生門,Rey 跟 Kylo 因為原力連結的關係有心電感應,Rey 直接問了 Kylo 那天的事情,那天 Kylo 說是因為 Luke 想殺他,他才逃走,轉到黑暗面去。聽起來,兩方都是真話。

Rey 後來被捉到帝國軍,跟 Kylo 聯手幹掉了皇帝史諾克。Rey 試著感召 Kylo ,但 Kylo 不受影響,取代了史諾克,成為帝國軍的統領。Kylo 不顧媽媽仍是反抗軍的統領,決心消滅反抗軍,於是進行追擊。反抗軍試圖逃離,但是帝國軍有著追蹤裝置,反抗軍根本無力擺脫。反抗軍的 Poe / Finn / Rose 試著去破壞那個追蹤裝置,但卻徒勞無功。反抗軍的主要船艦仍然被摧毀了,殘餘的人搭著船艦逃到了一個星球上,前腳才剛到,後腳帝國軍就跟上了,眼看反抗軍就要全滅了。這時候 Luke 突然出現,震攝了帝國軍,Kylo 很氣,覺得我們這麼強大的武器怎麼會打不倒一個血肉之軀,於是跑出去跟 Luke 大戰了一場。原來 Luke 是用他的原力分身來到這個星球掩護反抗軍逃走,這時候 Rey 也來到這星球幫忙。最終,反抗軍順利逃離,Luke 在用完原力後,也溘然而逝。

解析 User agent

應該是有可以解析 User Agent 以取得瀏覽器的版本、作業系統等資訊的函式庫吧,然後就找到了 python-user-agents

安裝

pip install ua-parser user-agents

使用很簡單,把 User agent 丟進 parse 去就可以了。

from user_agents import parse

x = parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36')

print(str(x))
# PC / Linux / Chrome 78.0.3904

print(x.browser)
# Browser(family='Chrome', version=(78, 0, 3904), version_string='78.0.3904')

print(x.device)
# Device(family='Other', brand=None, model=None)

print(x.os)
# OperatingSystem(family='Linux', version=(), version_string='')

# 有這些方法/屬性可用:'_is_android_tablet', '_is_blackberry_touch_capable_device', 'browser', 'device', 'is_bot', 'is_email_client', 'is_mobile', 'is_pc', 'is_tablet', 'is_touch_capable', 'os', 'ua_string'

從 IP 取得 Country / City / 經緯度

使用的環境是 Ubuntu 16.04 + Django 2.2,先處理 geoip 資料庫。

sudo apt-get install geoipupdate

安裝完以後先填設定,編輯 /etc/GeoIP.conf ,這邊要注意 geoipupdate 版本,2.5 之前的話,AccountID 要改成 UserId,EditionIDs 要改成 ProductIds ,Ubuntu 16.04 用的是 2.5 之前的版本:

# The following AccountID and LicenseKey are required placeholders.
# For geoipupdate versions earlier than 2.5.0, use UserId here instead of AccountID.
# AccountID 0
UserId 0
LicenseKey 000000000000


# Include one or more of the following edition IDs:
# * GeoLite2-City - GeoLite 2 City
# * GeoLite2-Country - GeoLite2 Country
# For geoipupdate versions earlier than 2.5.0, use ProductIds here instead of EditionIDs.
# EditionIDs GeoLite2-City GeoLite2-Country
ProductIds GeoLite2-City GeoLite2-Country

執行 sudo -H geoipupdate,檔案會下載到 /var/lib/GeoIP

接著在 Django 環境下安裝 geoip2

pip install geoip2

然後先在 shell 裡試試看:python manage.py shell

from django.contrib.gis.geoip2 import GeoIP2
g = GeoIP2('/var/lib/GeoIP')  # 將路徑指過去
print(g.country('59.120.21.9'))
print(g.city('59.120.21.9'))
print(g.lat_lon('59.120.21.9'))

一般來說,用 city(“your_ip”) 就可以拿到足夠的資訊了

{'city': 'Taipei',
 'continent_code': 'AS',
 'continent_name': 'Asia',
 'country_code': 'TW',
 'country_name': 'Taiwan',
 'dma_code': None,
 'latitude': 25.0478,
 'longitude': 121.5318,
 'postal_code': None,
 'region': 'TPE',
 'time_zone': 'Asia/Taipei'}

參考資料

如何寫 Git commit message

主要是看 How to Write a Git Commit Message 這篇文章的紀錄,這篇文章是 2014 年的文,我可能有看過,印象中之前有看過介紹原則跟工具的文章。之前的印象,第一行要明確、簡單,不要太長。有細項,從第三行寫起,用 markdown 語法。

這篇一開始先講為什麼,作者不囉唆,直接要你看自己的 git log –oneline 輸出,看自己覺得 OK 不 OK。所以可讀性很重要,可以很快的看懂,那麼就可以不用費心再去看裏面改了什麼。

主要有7個原則:

  1. Separate subject from body with a blank line :第一行寫主旨,第三行開始寫內容。
  2. Limit the subject line to 50 characters :主旨不要超過 50 個字元
  3. Capitalize the subject line :主旨的第一個字元大寫
  4. Do not end the subject line with a period :主旨不要有句點
  5. Use the imperative mood in the subject line :主旨要用祈使句,就動詞+名詞
  6. Wrap the body at 72 characters :內容的每行不要超過 72 的字元
  7. Use the body to explain what and why vs. how :內容要儘可能描述做了什麼、為什麼這樣做跟如何做。

棄用 yaourt,改用 yay

原來 archlinux 的 yaourt 已經過時了,我參考這篇 Yaourt is Dead! Use These Alternatives for AUR in Arch Linux,換成 yay,用法跟 yaourt 差不多。最新的 AUR 替代品可以參考 Archlinux 維基:AUR_helpers ,只是官方不建議使用這些工具,還是希望大家熟悉手動建置套件的程序。

先移除 yaourt

$ sudo pacman -Rn yaourt package-query

再參考 yay 的安裝說明來安裝

git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

用法跟 yaourt 差不多

# 更新套件列表並更新目前已經安裝的套件 (包含 AUR)
yay -Syu
# 安裝套件
yay -S foo
# 尋找套件
yay -Ss foo
# 取得遠端套件資訊
yay -Si foo
# 目前系統套件狀況
yay -P --stats

搞定以後,參考 yay -P –stats 的建議,移除了 aur 沒在維護的套件。最後跟 yaourt 說聲再見,謝謝 yaourt 過去幾年的照顧。