電影流水帳(2022/01/01~2022/01/31)

Kristen Wiig OFFICIALLY Confirmed as Cheetah for Wonder Woman 2
Kristen Wiig
  • Godzilla vs. Kong (IMDB, Wikipedia),台譯:怪獸大戰哥吉拉。
  • Wonder Woman 1984 (IMDB, Wikipedia),台譯:神力女超人1984。

Godzilla vs. Kong

剛好在轉第四台時轉到,就一路看下去了。開始看的地方是金剛還有島上的小女孩被帶走,要被帶去地底世界拿東西。附近的哥吉拉感應到金剛,就跑過來,金剛被放出來跟哥吉拉對打,打一打,哥吉拉感應到香港那邊有更驚人的生物反應,就跑過去了。小女孩還有金剛這邊後來就去地底世界拿東西,這部份算是被設計,其實是生物科技公司想要取得東西來製造機械哥吉拉,透過金剛幫忙拿到,就撤了。

撤了之後,香港那邊的機械哥吉拉就啟動了,哥吉拉過來以後,就跟機械哥吉拉打起來。小女孩跟金剛一行人回到地表後,金剛奄奄一息,小女孩感覺到金剛快掛了,告訴科學家。科學家就用強力的發電機去電擊金剛,讓他心臟恢復跳動。恢復以後,小女孩透過手語告訴金剛,哥吉拉是善良的,機械哥吉拉是壞蛋,於是金剛就幫手哥吉拉,一起打擊機械哥吉拉。最後,聯手把機械哥吉拉幹掉了。

在這段期間,穿插了哥吉拉2-怪獸之王裡 Madison 的副線,他們透過線索查到生物科技公司不懷好意,進而到了香港。在金剛、哥吉拉與機械哥吉拉打成一團時,他們破壞了機械哥吉拉的電腦,讓金剛、哥吉拉有了反擊的機會。這部電影就是娛樂片,接續著前面的金剛骷髏島、哥吉拉、哥吉拉2-怪獸之王看下來,還算不錯。

Wonder Woman 1984

這集的寓意蠻深的,講的是人類的慾望。主軸是許願石,這顆許願石可以讓人的願望實現,但是在實現的同時,人也會失去一樣珍貴的東西,這樣珍貴的東西並不是自己可以決定了,而是由許願石決定的。

戴安娜在博物館認識了不起眼的芭芭拉,透過她,看到了這顆許願石。許願石上的拉丁文,說可以實現許願者的一個願望。戴安娜就跟芭芭拉閒聊起來,當時沒多想,心裡就說了自己希望 Steve 回來。而芭芭拉則是許願了希望自己可以跟戴安娜一樣。沒多久,戴安娜真的遇到了 Steve ,她欣喜若狂。而芭芭拉則是發現自己變得有魅力了,而且有了強大的力量。也透過此,她知道了戴安娜這個人不簡單。

失意的石油商人 Maxwell 不知道怎麼樣知道有這顆石頭,他到博物館接近芭芭拉,並且偷走了許願石。他許願,希望自己變成這顆石頭,換言之,Maxwell 有了可以幫別人實現願望的能力。他開始幫人實現願望,同時也透過這個來進行利益的交換。

戴安娜發覺了怪異之處,跟芭芭拉聯手進行調查,發現了在歷史裡,這顆許願石導致許多國家、王朝的覆滅。這些都是因為願望,在實現願望的同時會奪走許願者的珍貴事物。要阻止這一切,就必須收回自己的願望。捫心自問,這真的很難,在自己已經享受到願望所帶來的好處時,很難去放手,將願望收回。戴安娜此時也發現了這件事情,他想要把 Steve 留在身邊,但他身上也漸漸失去神力。芭芭拉更是不願意,他不想變回以前那個不被人重視的邊緣人。

戴安娜在 Steve 的鼓勵下,收回了自己的願望,Steve 消失,她哭著前去阻止 Maxwell 。跟芭芭拉打了一架,然後說服了 Maxwell 以及其他許了願望的人,收回自己的願望。

看到這邊,我就想到鋼之煉金術師所說的「等價交換」,天底下沒有平白無故掉下來的,你必須要做出交換。至於要交換些什麼,就得看自己怎麼去取捨,達到一個平衡。

ArchLinux 的 Reflector

Reflector 是一個用來更新 mirrorlist 的程式,前幾年看到的時候就用了,挺不錯的。最近想起來,但怎麼樣也找不到筆記,我想應該是沒有紀錄到吧,特別寫這篇來記著。

ArchLinux 維基的 Reflector 頁面寫的蠻清楚的,就不再贅述,下面主要紀錄我做的設定。

安裝

yay -S reflector

新增檔案:$HOME/bin/renew_mirrorlist ,這主要是方便手動更新用的。

#!/bin/bash
sudo /bin/sh -c "reflector @/etc/xdg/reflector/reflector.conf && rm -f /etc/pacman.d/mirrorlist.pacnew"

編輯檔案:/etc/xdg/reflector/reflector.conf ,這個檔案會被 reflector.service 跟 reflector.timer 使用到。

# 存到 /etc/pacman.d/mirrorlist
--save /etc/pacman.d/mirrorlist
# 只用 http 跟 https 的來源
--protocol http,https
# 從台灣、日本的伺服器來挑
--country Taiwan,Japan
# 挑最近更新的 10 個伺服器
--latest 10
# 用分數來排序
--sort score
# 最近 24 小時內同步完的伺服器
--age 24

新增檔案:/etc/pacman.d/hooks/mirrorupgrade.hook,這會在 pacman 更新 mirrorlist 時去執行。這同時也要修改 /etc/pacman.conf,把裏面 HookDir 那行的註解拿掉。

[Trigger]
Operation = Upgrade
Type = Package
Target = pacman-mirrorlist

[Action]
Description = Updating pacman-mirrorlist with reflector and removing pacnew...
When = PostTransaction
Depends = reflector
Exec = /bin/sh -c "/usr/bin/reflector @/etc/xdg/reflector/reflector.conf && rm -f /etc/pacman.d/mirrorlist.pacnew"

最後再啟用定時更新

systemctl enable reflector.timer
systemctl start reflector.timer

subprocess.check_output 小記

subprocess 是 python 一個很好用的模組,提供執行子程序的各種方式,最常用的就是執行,然後取得輸出結果。

import subprocess

try:
  cmd_output = subprocess.check_output("ls")
except subprocess.CalledProcessError as ex:
  cmd_output = ex.stdout

print("Command output:")
print(cmd_output)

接下來,因為有些指令是之前已經串好,已經加上 pipe 的了,所以會這樣用

cmd_output = subprocess.check_output("ls /usr/bin | grep python")

但你會發現 subprocess.check_output 拋出一個例外

FileNotFoundError: [Errno 2] No such file or directory: 'ls /usr/bin | grep python': 'ls /usr/bin | grep python'

這到底怎麼回事?明明就有 ls 這個執行檔?

原因很簡單,因為 subprocess.check_output 是把第一個參數視為一個檔案,所以有 pipe 的情況,他是不認可的。這時候可以加上 shell=True,讓 subprocess.check_output 知道執行第一個參數時,要先啟動 shell 來執行第一個參數裡的命令。

cmd_output = subprocess.check_output("ls /usr/bin | grep python", shell=True)

在取得輸出結果以後,cmd_output 是一個 byte 型態的變數,換言之,他不是字串。這時需要 decode 幫忙,轉換為字串:

cmd_output = cmd_output.decode('utf-8')

最後要分享的是將錯誤輸出到 null 裝置的方法,一般 bash script 裏面會用這樣的方式來將錯誤導向到 null 裝置,以避免出現不必要的輸出:

ls /usr/bin/foo 2>/dev/null

在呼叫 subprocess.check_output 時,可以帶入一個參數 stderr,而無需把 >/dev/null 寫在第一個參數裡。

cmd_output = subprocess.check_output("ls /usr/bin/foo", stderr=subprocess.DEVNULL, shell=True)

以上是自己在把 shell script 轉換為 python 時遇到的幾種狀況,因為已經遇到幾次,總是會多花一點時間回想,這次在這邊紀錄下來,以免之後又忘掉。

jc – 將指令輸出結果轉為JSON格式

分享 jc 這指令,裝了以後,可以把一些指令的輸出轉為 json,之後就可以搭配 jq 來查詢 json 裡的資料。

安裝

RHEL8 的安裝,需要直接從 jc 的 github 頁面下載 linux binary 。

Debian/Ubuntu 可以使用 apt-get install jc

ArchLinux 可以用 pacman -S jc

MacOS 可以用 brew install jc

使用

例如

 非 jq 作法用 jq
掛載點mount | awk '{print $1;}'mount | jc --mount | jq -r ".[].filesystem"
digdig example.com | awk '/ANSWER\ SECTION/ { getline; print $5; }'dig example.com | jc --dig | jq -r '.[].answer[].data'

除了 mountdig 之外,也可以解析蠻多指令的,這部份可以參照 github 網頁

參考資料:

sudoers 檔案改壞了

昨天不小心在 /etc/sudoers.d 目錄下加了個檔案,格式有問題,導致之後下 sudo 指令都會出現這樣的錯誤:

sudo: unable to initialize policy plugin

本想說要來重開機,進 single 模式來修改了,還好,找到這篇:https://unix.stackexchange.com/questions/677591/how-to-restore-a-broken-sudoers-file-without-being-able-to-use-sudo

照這篇的方法來處理,就免於重開機的命運。

方法是這樣的,先開兩個終端機視窗,都登入需要處理 sudoers 的主機,在第一個終端機視窗輸入下面指令取得當前 bash 的 pid

echo $$

在第二個終端機視窗輸入

pkttyagent --process <pid>

這個 <pid> 就是前面取得的 bash 的 pid。

再回到第一個終端機視窗,因為我是在 /etc/sudoers.d 目錄下加了一個格式錯誤的檔案,所以就刪掉就可以。

pkexec rm -f /etc/sudoers.d/user1

文章裡,是提問者把檔案擁有者改錯了,導致有問題,所以他用的是 chown 來改擁有者。

文章裡有說明為什麼可以用 pkexec 來處理,這指令其實跟 sudo 差不多,主要是用 polkit 在處理,解答的人說的很仔細。

可喜可賀,學到一個有趣的指令,也解決了一個手殘改錯的問題。

ArchLinux更新出現signature is unknown trust

今天在更新 ArchLinux 時,出現了類似這樣的錯誤,導致後續沒辦法繼續更新。

signature from "Andreas Radke andyrtr@archlinux.org" is unknown trust

本以為會像 Ubuntu 一樣,需要去 gpg server 找金鑰匯入,不過搜尋以後找到這篇:Update / pacman / keyring problem ,發現很容易就可以解決。

只要先執行下面這行,先去更新 keyring 套件即可

sudo pacman -S archlinux-keyring

RHEL8 iSCSI

target 主要提供 iSCSI 裝置,客戶端要使用這個裝置,就需要設置 iSCSI initiator。

我設置 iSCSI target 的方式主要是參考:How to Share Storage via iSCSI Target in RHEL 7/CentOS 7 還有 RHEL8 的管理存儲設備手冊裡的第七章

客戶端的設置,則是參考:How to Configure iSCSI initiator in RHEL 7/CentOS 7

iSCSI target

首先安裝 targetcli

yum install targetcli
systemctl start target
systemctl enable target
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

然後執行 targetcli ,targetcli 指令跟 bash 操作很接近,有 ls ,每個資源則用 cd 進入,操作可以用 create, delete 等,很直覺。

第一步是進入 iscsi 去建立 target

iscsi/
create

若需要使用指定的名稱,則是用

create iqn.2006-04.com.example:444

第二步是建立 backstore,這邊只建立 block storage,是告知 backstore 名稱是 block1,使用的實體裝置是 /dev/sdb

cd /backstores
block/ create name=block1 dev=/dev/sdb

第三步是建立 portal,這邊會先把預設的刪除,再重新建立。這主要是設定要 listen 的 位址跟 port。把預設的刪除掉的原因是,0.0.0.0 範圍太大。

cd /iscsi/iqn.2006-04.example:444/tpg1
delete ip_address=0.0.0.0 ip_port=3260
create 192.168.11.147

第四步是建立 lun

/iscsi/iqn.2006-04.example:444/tpg1/luns/ create /backstores/block/block1

第五步是建立 ACL

/iscsi/iqn.2006-04.example:444/tpg1/acls/ create iqn.2006-04.com.example.foo:888

最後,要重新啟動 target.service

systemctl restart target

iSCSI 客戶端

首先是安裝套件

yum install iscsi-initiator-utils -y

再來是修改設定,主要的設定檔是在 /etc/iscsi/initiatorname.iscsi

內容要填入前面所建立的 acl

InitiatorName=iqn.2006-04.com.example.foo:888

填寫完成後,重新啟動 iscsi.service

systemctl enable iscsi.service
systemctl start iscsi.service

然後去做 discovery,這個步驟會去試探指定的 IP 是否有 iscsi target,然後取得資訊存起來。

iscsiadm -m discovery -t st -p 192.168.11.147 –discover
192.168.11.147:3260,1 iqn.2006-04.com.example:444

這步驟若沒問題,可以在 /var/lib/iscsi/nodes 下找到檔案,這檔案裏面就是連線的資訊。

接下來就是登入

iscsiadm -m node -T iqn.2006-04.com.example:444 -l

這行若成功,就可以用 dmesg 查到 “Attached” 的字樣,表示已經掛載上來了。

這邊有個關鍵,就是有更動 /etc/iscsi/initiatorname.iscsi 內容的話,一定要重新啟動 iscsi.service ,否則會使用到之前的設定,導致失敗。

gcin出現Cannot open /usr/share/gcin/table/.kbm

某天點了 gcin 的 tray icon,按了裡面的「切到舊的注音鍵盤」,之後,切換到 gcin,就會出現下面的訊息

Cannot open /usr/share/gcin/table/.kbm

這超奇怪,放了好幾天,終於受不了。嘗試了以下幾個作法:

  1. 試著移除 gcin,再重新安裝 gcin,不行。
  2. 試著去複製以前的 gcin 設定,不行。

後來才在 gcin 討論區裡找到這篇:Ubuntu 14.04 gcin 安裝啟動後竟抓不到注音符號表??—->X@.kbm

只要執行以下指令,把 ~/.gcin/config 下的 phonetic-keyboard* 刪除即可

rm ~/.gcin/config/phonetic-keyboard*

果然解鈴還須繫鈴人。

電影流水帳(2021/12/01~2021/12/15)

S.H.E

聽見歌在唱

一個偏鄉學校因為人數過少,面臨關校危機,校長跟老師們期望能透過歌唱比賽,讓外界看到,進而避免關校。體育老師跟代課老師臨危受命,把學校的孩子們組成合唱團去參加比賽,故事就是在講這樣的過程。第一次的比賽結果並不理想,老師跟孩子們都很失望。後來代課老師去部落做客,聽到部落耆老的歌聲,才發現布農族的傳統合音好美,出身於部落就應該要師法部落的傳統唱法,不需要去學習外面的唱法。於是他們重新來過,跟部落耆老學習,然後募了款項,再次去參加比賽。

到了比賽當天,天公不做美,下山的道路被落石阻擋。老師不放棄,請了孩子的家長開挖土機來,利用挖土機搬運,讓孩子們通過坍塌處,趕下山去參加比賽。所幸,有趕上比賽,而這次的比賽大放異彩,評審跟觀眾們都非常驚豔,電影在此畫下了句點。蠻好看的,除了故事之外,電影也點出偏鄉部落的困境,人數稀少、師資、教學資源、沒有家長照看問題等等,這些都很值得去重視。

T-34

二次大戰期間,一些俄國軍人被德軍俘虜,德軍為了要能做戰車訓練,就讓他們去修復一輛戰車,期望在修復以後,可以做德俄的戰車演練。這群俄國人覺得這是一個好時機,就接受了這項任務,開始進行修復,在邊修復的同時,也邊規劃逃脫的計劃。這段期間,德軍是透過一個俄國護士來跟這些俄國人溝通,這個俄國護士有聽到他們的逃脫計劃,因為她也想逃走,所以她就幫忙瞞著德軍,同時也幫忙找資源。

戰車修好了,就要開始演練,這同時也是要執行逃脫計劃的時候。俄國護士幫忙去取得地圖,並以身份掩護,到外面去等待。這群俄國人就開著 T-34 坦克,開始陪著德軍演練。隨著演練的推展,德軍發現這台坦克不對勁,就開始追捕。T-34 坦克到了約定地點接走護士,看著地圖規劃逃脫路線。德軍怎麼可能善罷干休?展開大規模搜捕,後來就展開大戰。最後當然是 T-34 坦克順利回到俄國,二次大戰也結束,大家過著還不錯的日子這樣。