電影流水帳(2019/05/27~2019/06/21)

Embed from Getty Images

Pokémon Detective Pikachu

電影的這個故事跟動畫沒什麼關係,所以有沒有看過動畫對觀賞這部電影來說,影響不大。

電影的背景是設定在一個人與神奇寶貝共存的世界,Tim 收到了一個不幸的消息,他的父親 Harry 死了,他必須到 Ryme city 處理父親遺留下來的事物。在父親的房間裡,Tim 遇到了皮卡丘,一個能與他溝通的皮卡丘,但奇妙的是,其他人都無法理解皮卡丘在說些什麼。皮卡丘也不知道為什麼自己會在 Harry 的房間裡,不過,Tim 與皮卡丘兩人在房間裡發現了一些不尋常的東西。兩人慢慢的依照這線索進行調查,並接受了富豪 Howard 的委託,在調查的過程裡,電影同時也慢慢在介紹這個神奇寶貝世界。到了最後,他們發現原來在調查過程協助他們,看似好人的 Howard 其實有他的野心,想要藉著超夢來融合人與神奇寶貝。於是 Tim 跟皮卡丘合力阻止了 Howard。

在阻止之後,Tim 透過超夢與 Howard 的監視影像才明白到,在身邊的皮卡丘其實是自己的父親 Harry。Harry 在調查過程發生意外時,皮卡丘請求超夢超夢使用他的能力,讓 Harry 的靈魂附身到自己身上,而附身的代價是遺忘,這就是為什麼皮卡丘忘了很多事情,並且也只能跟 Tim 溝通的原因。總之,Tim 跟 Harry 兩人的心結冰釋,帶來一個歡樂結局。

說實話,電影前面有點悶,我能理解故事的鋪陳有其必要性。但從後面遇到魔牆人偶開始,再加上皮卡丘的配音,故事變得活潑起來。整體來說,我覺得還不錯。

Arrival

同學推薦我看的,剛好 Netflix 上了這部,就趕緊來看。

Louise 是個語言學教授,從有外星飛行物來到地球的那天開始,她就常常有奇怪的夢境。由於 Louise 有語言學專長,之前被軍方找去幫忙,現在有外星人來訪,軍方再次找上門,希望她能跟另外一個人合作,與外星人進行溝通。來到外星人登陸的地點,她認識了 Ian,接著他們就開始試著與外星人進行溝通。

溝通一開始並不順利,雙方並不了解彼此的語言與肢體動作,Louise 以她的想法,試著教導外星人,在這過程也試著去了解對方的肢體語言。溝通真的是很重要,其他國家就不是那麼順利,在相互猜疑的情況下,情勢慢慢緊張起來,連帶也讓美軍軍方的某些人有了持疑的態度。於是這些人試著要炸死外星人,Louise 跟 Ian 差點就被炸死,還好外星人救了他們。值此同時,中國決定進行武裝攻擊,透過夢境,Louise 明白了自己的使命,打電話給中國軍方領袖,並且說服了對方不要進行武裝攻擊。後來才了解到,這些外星人是因為未來會需要地球人的幫忙,所以才來到地球,讓 Louise 等地球人能了解他們的語言與想法。Louise 透過外星人語言的啟發得到了預知的能力,她所做的夢境,其實是未來會發生的事情。夢境裡的女孩就是她的女兒,在夢境裡,她的女兒最後因疾病而死去。電影的最後,Louise 即使已經知道了未來所發生的事情,她仍然面對,與 Ian 結婚…

Deadpool 2

Wade 原本以為在上集電影結束後,可以跟 Venessa 生個孩子,過快樂的生活。可是天不從人願,一群黑幫來追殺 Wade,流彈誤殺了 Venessa,Wade 忿怒的殺了黑幫之後,難過的想死去,但你知道,死侍是死不成的。

X 戰警救回了 Wade,並試著讓他加入 X 戰警。Wade 加入 X 戰警,擔任候補的第一個任務就出了狀況。Russell 是個變種人,在孤兒院裡被虐待,因此很忿怒,造成了騷動。對,Wade 的第一個任務就是要制止 Russell ,在制止的過程裡,Wade 發現內情並不單純,結果跟 Russell 一起進了監獄。兩人被強制戴上特殊儀器,抑制了變種人的超能力,在監獄裡過的不開心,Wade 沒有超能力,整個人快掛了,就對 Russell 並不是太友善。

Cable 是個未來人,他的妻女因為 Russell 而死去,他決心回到過去阻止 Russell。所以使用時光機器回到過去,闖進監獄,打算要殺掉 Russell。在騷動裡,Wade 身上的特殊儀器掉了,就阻止了 Cable。Wade 後來逃了出去,而 Russell 來不及逃出去,留在監獄裡。監獄裡的 Russell 聽了之前 Wade 的話,結交了 Juggernaut,心態轉變為惡,並打算逃出去。

逃出的 Wade 在夢境裡看到 Venessa,Venessa 暗示他家庭的事情,Wade 轉變了心意,決定回去救出 Russell。在得知要移轉監獄的消息後,Wade 找了 Domino 等人組了 X 特攻隊進行救援。結果他們跟 Cable 打了一架,不算成功救出 Russell,不過 Russell 跟 Juggernaut 因此逃了出去。

Cable 回頭去找了 Wade,因為 Russell 跟 Juggernaut 聯手了,Juggernaut 蠻強的,Cable 打不贏。Cable 告知 Wade 為什麼要殺 Russell 的原因後,Wade 跟 Cable 交換了條件,要讓他有機會能說服 Russell 改過向善。一行人再去找了鋼人尋求協助,然後就去找 Russell 了。大打一場之後,Wade 犧牲了自己,讓 Russell 省悟。Cable 則是用掉最後一次回去未來的能量,救回 Wade,一個皆大歡喜的結局。

シン・ゴジラ

某天在第四台看到這部電影的後半段,就被吸引住了。過了沒幾天,再次看到,剛好是電影剛開始沒多久,所以就補完了。

故事蠻簡單的,哥吉拉突然出現,日本政府找了政府體系裡的能人異士,一起依據哥吉拉留下的線索,進行發想、討論。過程裡,美國也來攪局,最終找到對策,並且成功阻止了哥吉拉。

電影裡的特攝特效其實不怎麼樣,吸引我的是文戲 (會議) 的部份,很充份的體現了日本人認真的精神,同時,也在進行的過程裡,帶入了沉默的艦隊那種國與國之間諜對諜的詭譎局勢。後來在網路才看到說,電影導演是執導新世紀福音戰士動畫的庵野秀明,這就難怪也有新世紀福音戰士的感覺了。

簡略的看 Tastypie

跟 DRF 不一樣,Tastypie 以 ModelResource 為主,埋下 Resource 時,就是完整的 LIST/CREATE/UPDATE/DELETE。

Resource 的 model 不一定要是 django model,也可以是自訂的 resource:https://django-tastypie.readthedocs.io/en/latest/non_orm_data_sources.html

  • Authentication 蠻多的,Basic/ApiKey/Session/Digest/OAuth/Multi 都有,OAuth 有內建。
  • Authorization 是指定允許的動作,像是 read_list / read_detail / create_list …. 等等。
  • Serializer 跟 DRF 有點不一樣,這邊僅指輸出的格式,DRF 主要是指輸出哪些欄位。
  • Throttling 可指定一秒內能呼叫的次數
  • 有支援 Paginator 翻頁。
  • 支援 GeoDjango!! 這倒是很方便,GeoDjango 看來是值得花時間來研究的。

缺點是,github 的活躍度不是太高,上次的更新是4個月前 (2018/9)。

跟 DRF 的比較可以參考這篇:https://stackshare.io/stackups/django-rest-framework-vs-tastypie

Linux 裡也能用 MacOSX

之前是知道 VirtualBox 可以執行 MacOSX,但我一直沒試過。前幾天,在 Twitter 上看到這個專案:https://github.com/foxlet/macOS-Simple-KVM/ ,說可以用 Linux 的 KVM 來執行 MacOSX。

今天來試試看,基本上不用做太多修改,就可以順利開機起來。
這邊紀錄一下幾件遇到的情況:

  1. 不需要額外設定 Bridged network:原本以為網路需要用 Bridged,結果照著網站上的說明去設定,反而網路有問題,這會導致安裝程序無法進行。
  2. Disk utility:到安裝程式時,先選 Disk utility 去初始化之前用 qemu-img 所建立的磁碟,後續才選 Reinstall 那個項目。
  3. 安裝以後的重開機:安裝以後重開機,不要再選到安裝,要注意看一下,選到從 SystemDisk 開機那個項目 (從右邊數過來第二個)
  4. virt-manager:可以安裝 virt-manager ,會有個類似 virtualbox 的管理工具 (就只是類似,不代表一模一樣)。這邊有幾件事情要做:
    1. 安裝:sudo apt-get install virt-manager
    2. 加入 kvm 群組:sudo usermod -a -G libvirt,kvm <your_username> ,做完這步要重新開機,virt-manager 才能順利連接 QEMU/KVM。
    3. virt-manager 是在系統工具裡,中文名字是虛擬機管理員。
    4. 使用 ./make.sh –add 將機器組態匯入以後,如果有遇到不能開機的情況,可以參考這個 pull request,使用這個指令 qemu-system-x86_64 –machine help | grep q35 | cut -d” ” -f1 | egrep -oe “.*-[0-9.]+” | sort -rV | head -1 取得 machine type,修改 template.xml 以後,再用 sudo virsh define ./template.xml 去更新機器組態。
    5. 要用虛擬機管理員自行新增硬碟。

安裝以後的設定:

  1. 輸入法:不使用 CapsLock 切換輸入法,改用 ctrl-space 來切換的話,第一步是在系統偏好設定 > 鍵盤 > 輸入方式那邊,將「使用大寫鎖定鍵來切換…」的那個勾選給取消掉。然後到系統偏好設定 > 鍵盤 > 快捷鍵那邊,在左邊找到輸入方式,將右邊的兩個項目給勾選起來,這樣就可以用 ctrl+space 來切換輸入法了,長按住 ctrl,再按 space 則是切換輸入法。
  2. homebrew:就是安裝常看到的 brew 指令。

電影流水帳(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