星期五, 7月 24, 2020

電影流水帳(2020/06/21~2020/06/30)

August 18th, 2010 | Scott Pilgrim Vs. The World European Premiere
  • Gemini Man (IMDB, Wikipedia),台譯:雙子殺手。
  • Jumanji: the next level (IMDB, Wikipedia),台譯:野蠻遊戲-全面晉級。

Gemini Man

雙子殺手,記得是去年上映的片,蠻快就在第四台上片了,我忘了是哪一台,猜想可能是疫情的關係。劇情還不錯,不過說要有什麼印象深刻的,就說不出來。

Henry 是個殺手,嗯,應該算吧,是幫國安局出不可告人的任務的。Henry 在一次任務以後,決定退下來,想要好好過生活。但是呢,國安局不放過他,派了人去監視他,並且打算將他滅口。Henry 當然沒想那麼多,也不知情。他去港口租船釣魚,在售票口遇到 Danny ,一個漂亮又風趣的女孩子,誰不動心呢?聊了幾句,確認彼此好感之後,就約了晚上吃飯。

Henry 出海釣魚,是要跟以前的好友聯絡,聊了好一陣子,好友透漏了國安局可能會派人來對付他,Henry 記住了。Henry 離開之後沒多久,他的好友就被國安局滅口了。Henry 晚上跟 Danny 吃飯,聊了幾句,Henry 就問了 Danny ,你是誰派來的?Danny 有點吃驚,看 Henry 其實沒惡意,就乾脆地說出了自己的出身跟來意,兩人反而聊開了。Henry 送 Danny 回家,Danny 發現家裡怪怪的,於是拿出了槍,準備禦敵。就在鬼影幢幢之際,Henry 闖了進來,表明這些人是來追殺他的。兩方立刻知道,除了監視Henry的人 (Danny)之外,還有另外一股勢力,兩人就開始邊打邊逃了。

然後我去處理了一些事情,隔了一陣子才回來接著看。兩人已經遇到那個以 Henry 基因製造出來的年輕人 Junior 了,他們也搞清楚了大致的事情經過,並且設計了 Junior ,告訴了他真相。最終是三人聯手去對付大魔王 Clay,並且解決了他。末了,Henry 跟 Danny 過著退休生活,Junior 到學校念書,去過他以前沒有經歷過的生活。

Jumanji: The next level

我個人覺得,不一樣的角色扮演,衍生出不一樣的趣事,我覺得編劇這一手相當不錯。新秀演員 Awkwafina ,加上老牌演員:Danny DeVito, Danny Glover ,的確也激盪出不少有趣的事情。但我仍然覺得這集續差了,沒有前集來的好看。

在上次的經歷之後,四人在現實生活成了好朋友,定期聯絡,但 Spencer 陷入了情感與社群的焦慮,他覺得自己不夠好,也不適合跟 Martha 在一起,就疏遠了 Martha。這次聖誕節從紐約回到家裡,Spencer 得跟爺爺住在一起,隔天本來是要跟其他三人碰面的,但 Spencer 左思右想,覺得應該回到遊戲裡去當 Dr. Xander,想拾回那時的感覺。於是他組裝了之前留下的遊戲機,於是就進到遊戲裡了。

隔天,其他三人,Martha, Fridge, Bethany 碰面聊了幾句以後,想說怎麼 Spencer 還沒來,打了電話也沒人接,就決定到他家裡看看。到 Spencer 家,正巧 Spencer 爺爺多年沒見、已經翻臉的朋友(Milo)來找 Spencer 爺爺(Eddie),Eddie 跟 Milo 小吵了一下,三人打過照面後,分別去找 Spencer ,找了好一會,才在地下室找到遊戲機。三人心想,事情大條了,看來得再進去野蠻遊戲裡救他出來。Fridge 不太樂意,他覺得很不爽,但在 Martha 跟 Bethany 感召下決定還是進去。不過這次有些不一樣了,Bethany 沒進去,Martha、Bethany、Eddie 跟 Milo 進去了。進去以後的角色除了Martha仍然是Ruby之外,其他人的角色都不一樣了。

一行人就跟上集一樣,邊解任務,邊尋找 Spencer 。在尋找的過程裡,Eddie 跟 Milo 化解了多年來的心結,當初 Milo 拆夥餐館,是因為覺得錢賺夠了,要好好享受生活,就把餐館轉手賣掉了。但他沒想到 Eddie 的樂趣就是在餐館工作,一拆夥,反倒惹怒了 Eddie,這一氣就氣了好幾年。Spencer 也化解了新裡的對愛情與工作的焦慮,他明白了 Martha 的想法,也讓自己恢復了跟 Dr. Xander 一樣的勇氣。

在外面的 Bethany 沒進遊戲裡,她心急如焚,趕緊去找了之前的機師 Jefferson,請他幫忙修復遊戲機,一起進去遊戲裡。一群人總算是會合了,他們也透過奇妙顏色的湖水把角色換了回來,接著打敗大魔王,結束了這個遊戲。

故事的最後,揭露了 Milo 去找 Eddie 的原因,大夥要離開遊戲,但 Milo 想要留下來,因為 Milo 得了絕症快死了,所以想留在遊戲裡。大夥尊重 Milo 想法,就離開了遊戲,大概就這樣子。
嗯,寫到這邊,我想我大概知道為什麼我覺得沒有前集來的好看了,因為導演想講的事情太多了,角色也有點太多,每個人都要有戲,導致劇情有點冗長,節奏也鬆散,沒有那種緊湊感,真的是蠻可惜的。

星期五, 7月 17, 2020

git config 的 includeIf

在推特上看到 @WanCW 的推文,才知道 git config 有 includeIf ,所以來研究一下怎麼用。
先看 git config 的說明:https://git-scm.com/docs/git-config ,用法蠻簡單的。

這邊先做假設情境

  • 使用者家目錄是 /home/user ,也就是 HOME=/home/user
  • $HOME/CompanyProjects 是公司專案目錄,而公司的 git server 是 gitlab.com
  • $HOME/SideProjects 是自己的專案目錄,自己的 git server 也是 gitlab.com
  • 公司用的 ssh key 在 $HOME/.ssh/company.pem
  • 自己用的 ssh key 在 $HOME/.ssh/id_rsa

為了避免使用者名稱、email 跟 SSH key 混用,這時候 git config 該怎麼設定呢?

首先在 $HOME 下建立 .gitconfig.d 目錄,在裡面放入 company.inc 與 side.inc,這兩個檔案的內容,在後面會提到。

先編輯 $HOME/.gitconfig 

; include if $GIT_DIR is under /home/user/CompanyProjects/
[includeIf “gitdir:/home/user/CompanyProjects/"]
    path = /home/user/.gitconfig.d/company.inc

; include if $GIT_DIR is under /home/user/SideProjects/
[includeIf “gitdir:/home/user/SideProjects/"]
    path = /home/user/.gitconfig.d/side.inc

再來是 company.inc 與 side.inc

; $HOME/.gitconfig.d/company.inc
[user]
    email = user@company.com
    name = user(company)

[core]
    sshcommand=ssh -i /home/user/.ssh/company.pem
; $HOME/.gitconfig.d/side.inc
[user]
    email = user@example.com
    name = user


在這樣設定之後,當切換到 $HOME/CompanyProjects 目錄下任一個專案目錄時,git 會使用 company.inc 裡的設定;切換到 $HOME/SideProjects 目錄下任一個專案目錄時,git 會使用 side.inc 裡的設定。

那也可以針對個別專案去設定,假設 $HOME/CompanyProjects/ProjectA 目錄會用到不一樣的,那就在 .gitconfig 加入

[includeIf “gitdir:~/CompanyProjects/ProjectA/“]
    path = ~/.gitconfig.d/projecta.inc

然後在 $HOME/.gitconfig.d 下新增 projecta.inc 即可。

星期三, 7月 15, 2020

電影流水帳(2020/06/11~2020/06/20)

Sigourney Weaver

Galaxy Quest

之前有看電影神搜的介紹,再加上有喜愛的石內卜 (Alan Rickman) 跟 Sigourney Weaver 演出,再加上又剛好在 HBO 看到,就順著從中間的地方看完了。

故事就一群演影集的演員被外星人捉走,那外星人為什麼捉他們,原因很簡單,因為他們演的影集就是講太空冒險故事的。外星人看了他們演的影集,以為他們就是真的星際艦隊,有能力、有勇氣,可以幫助他們對抗壞蛋。演員們在知道這種情況之後,知道外星人誤會他們了,可是外星人又非常仰慕他們,只好不上不下的配合著演下去。只是事情這樣下去不行,早晚會被外星人知道他們只是個演員。在受到壞蛋外星人持續進逼的威脅後,這些演員們也開始轉換了自己的想法,想要好好的幫助這些老實的外星人。當你真的把自己當作是英勇的星際艦隊之後,做出來的也就跟英勇的星際艦隊一樣了。到了後來,外星人知道了他們只是演員,演員們也坦承不諱,但演員跟外星人仍然相互幫助,一起打敗了壞蛋外星人。

有時候人缺的就是相信自己,在不相信的情況下,就會被自己困住。這些演員們原本只是逢場作戲,到了後來,認為自己是可以辦的到的,於是他們就真的辦到了。我的老同學說,我是個自我否定很強的人,是的,的確算是,我的確會懷疑自己有沒有這個能力可以做到。現在也算是慢慢能淡然處之,該做些什麼就去做,該嘗試什麼就去嘗試,這樣才能真正知道能不能做到。

दंगल

在電影台看好幾次了,這次總算是完整看完,很讓人感動的故事。

爸爸過往是個摔角選手,得獎紀錄輝煌,但因為家庭因素,決定放棄摔角事業,回歸家庭。本來想生個兒子來承繼摔角,但往往事與願違,跟太太生了四個女兒。就在心灰意冷的時候,一次女兒的打架事件,讓他發現了兩個女兒吉塔跟巴比塔的天賦,於是跟太太講好,要花一年的時間來訓練看看,如果不行,就放她們回去唸書,不再摔角。吉塔跟巴比塔很不樂意接受這樣的訓練,在學校被同學笑,鄰居也笑他們家怎麼會讓女兒練摔角呢?讓吉塔跟巴比塔轉變念頭的,是一個同學的婚禮,他們的同學也才十幾歲,就被嫁出去了。她哭著跟吉塔跟巴比塔說,「我很羨慕你們,你們的父親選擇了一條可以讓你們未來可以自由選擇的路,像我,就沒得選。」吉塔跟巴比塔這下才明白父親的苦心,於是轉了個念頭,認真接受父親的訓練。

在父親有心栽柳,而柳樹 (吉塔跟巴比塔) 又爭氣的情況下,一邊訓練,一邊以賽代訓,吉塔跟巴比塔漸漸打出了名氣。甚至打進了大學,參加了學校的摔角隊。吉塔上了外地的學校後,迷失了自己的方向,跟父親起了衝突。在參加校際比賽時也因為沒有認真練習而沒拿到好成績。後來,妹妹巴比塔也跟著上了大學,吉塔才因為妹妹巴比塔跟父親和解。爸爸也離開,住到學校附近,就近指導吉塔,吉塔重新找回方向,慢慢也有了好成績。

很快就到了大英帝國運動會,吉塔跟巴比塔也代表國家參加了摔角比賽。巴比塔沒懸念的,拿到冠軍,吉塔則是在四強賽遇到了勁敵,父親預先看過對手比賽影片,指導了吉塔,順利進入決賽。吉塔的教練卻因此眼紅,在決賽當天,找人隔離了吉塔的父親。吉塔陷入苦戰,比賽快結束的時候,吉塔想起了父親的教誨,「爸爸不能時刻都能來就你,你要靠自己。」,並且想出對策,巧妙的誘敵,並使出後背摔,漂亮地拿下分數,取得優勝。

我從電影學到兩件事情,第一件事情,就是你必須要時刻充實自己,讓自己可以站到一個能做出好選擇的位置。也許,隨遇而安是比較輕鬆的選擇,但是在事情來的時候,往往會驚慌,甚至後悔自己之前沒有好好的做好準備。第二件事情就是,無論在什麼緊急的情況,保持冷靜與理智,才是致勝的關鍵所在。

星期五, 7月 10, 2020

typescript 的 dirname/basename

node 是有一個 path 的 package,但這個 package 會依賴 process 來取得平台環境,以決定要用 win32 或是 posix 來處理路徑。

但我其實只是要簡單的取得父路徑跟從路徑取出檔案或目錄名稱,不需要這樣麻煩。上網找到這篇:Javascript functions for basename and dirname 。它的實作是使用 regular expression 來處理,所以傳回的並不是單純的字串,而是一個陣列 RegExMatchArray 。參考 MDN 的 String.prototype.match() 來做調整,簡單的說,陣列的第一個元素就是處理的結果,所以只要先判斷傳回值是否為  null ,然後再傳回第一個元素即可。

// Typescript
/**
 * 取得父路徑
 */
export function dirname(path: string): string {
  let newPath = '';
  // 找符合 '/aaa/bbb/ccc/' 的字串
  const regExMatchArray = path.match(/.*\//);
  // 沒有找到,傳回 '/'
  if (regExMatchArray === null ) {
    newPath = '/';
  }
  else {
    // 有找到
    newPath = regExMatchArray[0];
    // 看最後字元是否為 '/',是的話,就移除。
    if (newPath.endsWith('/')) {
      newPath = newPath.substring(0, newPath.length - 1);
    }
    // 最後結果的長度為0,加上 '/'
    if (newPath.length === 0) {
      newPath = '/';
    }
  }
  return newPath;
}

/**
 * 取得檔名或目錄名
 */
export function basename(path: string): string {
  // 把 '/' (含)之前的字元都替換成空字串
  return path.replace(/.*\//, '');
}

星期二, 7月 07, 2020

如何在 systemd 裡啟用 rc.local

以前用 sysv 或 upstart 時,很方便,想要在開機時跑一些指令,又懶得寫啟動 sysv init script 或 upstart job 時,就寫在 rc.local 裡就好。現在幾乎各大 Linux 發行版本都改用 systemd 了,那 systemd 又該怎麼做呢?印象中之前查過兩三次了,這次再查,決定還是記錄一下好了。

主要參考這篇:How to Enable /etc/rc.local with Systemd – LinuxBabe

第一步,新增 /etc/rc.local ,然後把要執行的指令放到裡面去,並且用 chmod +x /etc/rc.local 加上執行權限。

第二步,新增 /etc/systemd/system/rc-local.service

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

第三步,啟用這個服務

sudo systemctl enable rc-local