Mac上遇到的warning: setlocale: LC_CTYPE: cannot change locale (UTF-8)

這個問題之前遇到過幾次,每次都是透過iTerm2連接到remote linux server時跳出警告… 雖然問題不大,但昨天連到自家的機器又遇到一樣的問題時,還是決定來找一下解決方式!

這個警告主要影響的是使用者在iTerm2上的畫面顯示,只要用到UTF-8的地方會一直出現警告 !

解決方式

網路上找了一下相關的解決方式以後,大概可以分為兩種方式處理:

Server 端的解決方式

將下列的設定加入到 /etc/environment 裡面

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

Client 端的解決方式(Mac)

將下列兩行環境變數加入到使用者的 ~/.bashrc~/.zshrc(基本上看client端這邊的shell環境)

export LC_ALL=en_US.UTF-8
export LANG=US.UTF-8

我目前採用Client端的解決方式,再重新做 source ~/.zshrc以後,目前就沒在遇到問題了!

Reference:

使用sshuttle來連接不同環境下的機器

最近由於專案快上線了,所以頻繁的連接在不同的環境下的機器,或是監看機器的使用狀態;在這樣的使用情境下,之前有試著使用Socks5 + SwitchyOmega 的組合來連接,這樣的組合在只用來連接內網的dashboard時是蠻堪用的,但如果其它類型的連線就無法了。

每當要使用像是TCP連線到內網的機器(像是連資料庫之類的),就都要在先連一次VPN,然後才再連線;但連線完VPN以後,又要把SwitchyOmega的設定關閉,不然VPN +Socks5 + SwitchyOmega 的組合無法讓我連到特定的Dashboard…
這其實蠻惱人的,尤其是頻繁的切換使用VPN網路時,或是在開會過程中,又需要連到特定環境下的機器…

通常這問題大概可以使用幾種方式克服:

VPN – Partial Routing

若是使用OpenVPN的話可以在導入Profile時加入以下設定來讓client端可以自訂路由的規則。

route-nopull
route X.X.Y.Z 255.255.255.255

這邊的範例是只有往x.x.y.z 時才會經由vpn。

但這個方案的缺點是,同時間也只能連到一台OpenVPN 伺服器,所以代表同時間也只能連到同一個環境下的機器。

但優點就是所有TCP/UDP的封包都可以經由路由連接到那個環境下的機器。

SSH Tunnel Proxy

其實ssh 已經提供了一個方便的解決方案了,即是使用-L 這個flag,讓我們可以透過中介的jump/proxy server,讓我們的本地主機與遠端主機建立一個虛擬通道。

ssh -NL 5432:staging-postgres.your-domain.com user@jumper-server.your-domain.com

(使用-f 可以讓這個tunnel 在背景下執行。)

透過上面的指令,我們就可以執行下面的psql 指令來連接staging postgres這個資料庫。

psql -U postgres -d postgres -h 127.0.0.1 -p 5432

這個方案的缺點就是,如果有多台主機需要連的話,可能要設定多個Tunnel Proxy。

sshuttle

在Stackoverflow 上剛好看到了這篇文章,其中回應有提到了sshuttle 這個開源的專案可以透過ssh tunnel導流所有TCP的流量到遠端的jump server,也就是類似TCP Proxy的功能。

試了以後還蠻方便的,它底層的原理即是使用了ssh tunnel proxy,所以也是需要一台中介的ssh jump/proxy server。除此之外,它可以讓使用者用根據網段來轉送流量,所以基本可以解決原本在ssh tunnel proxy的一些不方便之處。

安裝

# For Mac
brew install sshuttle

# For ubuntu
sudo apt-get install sshuttle

使用上的基本指令

sshuttle -vr user@jumper-server.your-domain.com 10.0.0.0/8

上面這指令即是把所有往10.0.0.0/8的TCP流量都自動轉往jumper-server.your-domain.com上送…

Reference:

Asahi Linux for M1 Mac

這個Asahi Linux專案主要是想要讓M1 版本的MACs可以執行Linux,所以之後如果有相關的需求時,感覺可以來這看看是否可以用。

目前的進度來看,離正常使用應該還有段距離,希望這些類似的專案都能成功;可以想象如果可以有一台執行Linux的筆電,並且同時有M1的高效與不秏電,這個應該是許多開發者都希望有的一台電腦呀XDDD

Reference

Socks5 proxy server的設定

今天跟DK開會時,他利用些片段時間分享了他的工作環境設定,主要是關於他怎麼透過設定他的環境來同時可以連接dev, stage, production的環境。
會有這個分享主要也是因為我們在切換環境時,相對較笨拙點,都是透過連接不同的vpn server來切換到不同的環境下,但同時也只能在同時間點,只能連接到某個環境。

那就來進入主題了,他分享的方式,主要是透過在本機端建立socks5 proxy server, 將對於特定目標位址的流量,proxy到遠端預先設定好的jump server,再到對應的最終目標位址。

Step 1. 建立遠端的jump server

只要遠端的server有開啟ssh server的,就已經可以當成jump server了,而我們的stag jump server 就是這樣設定的。

Step 2. 設定 ~/.ssh/config (optional)

為了更容易的連接jump server,而不用每次都打一大串的ssh 指令,我們可以把連接jump server的相關設定寫到 ~/.ssh/config下,範例如下:

Host staging_jumper
   HostName our-jump-server.com
   IdentityFile ~/.ssh/jump-server.key
   User my-username

Step 3. 在本機端啟動socks5 server

由於剛剛在上一步有設定好連接jump server時,需要的ssh user 與 key,所以這邊可以很簡單的用下面的ssh指令啟動socks5 server

ssh -D 1081 -C -N -f staging_jumper

-D 1080 代表要將連往本機端 port 1081的流量轉送到staging_jumper上。
-f 代表要在背景執行
-C 代表要壓縮資料
-N 代表不執行任何遠端指令,通常做port forwarding 都會代入這flag

如果要關閉在背景的socks5 server,則可以用ps -aux 找出剛啟用的socks5 server pid,接著再使用kill指令去停掉正在運行的sock5 server process。

Step 4. 檢查是否有socks5 server是否有運作正常

curl --socks5 localhost:1081 http://your-staging-service.com

可以簡單透過curl 指令,來發起一個http的request到我們剛啟用的socks5 server port上。 如果成功的話,理論上會看到我們預期的html 網頁了。

Step 5. 設定SwitchyOmega

這是一個browser extension,主要是可以讓我們連接不同的網頁時,可以使用預先設定好的條件或方式來連接。
舉例來說,我們可以設定當接http://192.168.10.2:8080這個位址時,就自動透過我們預先設定好的socks5 server 與jump server 連接,此外,它還可以透過wildcard的方式來導流特定網段或特定domain 的網頁。

如以下範例

當我們啟用本機端的socks5 server以後,就可以到下面的SwitchyOmega頁面去設定代理伺服器。

之後,只需要再設定auto switch來決定哪些目標網頁要使用哪些代理伺服器就完成了

reference:

Mac shell上的快捷鍵

最近看到別人分享的一篇bash shell 快捷鍵對照縮圖以後,感覺可以稍微練一下,對平常工作應該會有不少幫助XD

後來找了一下網路上的資訊,看來Apple 的官方就有放快捷鍵對照表了,決定也順便整理一下我自己的版本:

動作快速鍵Notes
重新放置插入點將游標移至新插入點的同時按住 Option 鍵
將插入點移至該行起始處Control + A
將插入點移至該行結尾處Control + E
將插入點向前移動一個字元向右鍵
將插入點向後移動一個字元向左鍵
將插入點向前移動一個單字Option + 向右鍵我的iterm2這邊要用Control + 向右鍵
將插入點向後移動一個單字Option + 向左鍵我的iterm2這邊要用Control + 向左鍵
刪除行Control + U被刪除的整列會被複製
刪除至文字行結尾處Control + K
向前刪除至文字結尾處Option + D(已選取「使用 Option 鍵作為 Meta 鍵」時可使用)無法使用
刪除前面的一個文字Control + W這個文字會被複製起來
貼上Control+W 所複製的文字Control + Y
刪除一個字元Delete 鍵
調換兩個字元的位置Control + T目前選的字元會與前面的字元對調
https://support.apple.com/zh-tw/guide/terminal/trmlshtcts/mac

References:

透過ps與top的來找出秏費系統資源的程式

pstop都是linux 開機即有的基礎指令,最近才發現它們也可以幫我們依照消秏資源的程度來呈現目前使用率最大的程式。

ps 指令

找出前10個較秏cpu 資源的程式

-eo : 是用來指定輸出目前process 的特定欄位,並且在透過 --sort (linux)或 -r/-m (darwin)來進行排序。

linux:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu

darwin:

ps -eo pid,ppid,%mem,%cpu,comm -r | head

找出前10個較秏memory 資源的程式

linux:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

darwin:

ps -eo pid,ppid,%mem,%cpu,comm -m | head

top 指令

top 主要是透過互動式的terminal 介面來呈現目前系統的狀態,但其它也可以透過輸出模式的變更來做到與ps 指定相似的結果。
如果需要更fancy的系統狀態儀表板的話,其實可以另外安裝htop試試…

linux :

-b 代表不使用互動界面的方式出輸結果。
-o 代表用特定欄位排序

top -b -o +%MEM | head -n 10

darwin:

-stats 用來顯示輸出的欄位
-o 代表用來排序的欄位
-l 用來控制要採樣的次數,1 代表只輸出一次結果。
-n 用來控制呈現的前n

top -stats pid,cpu,mem,th,pstate,time,command -o MEM -n 10 -l 1

reference:

https://shutdown2110.blogspot.com/2018/07/linux-ps-top-cpu.html

https://www.freebsd.org/cgi/man.cgi?ps(1)

https://unix.stackexchange.com/questions/88613/how-is-it-possible-to-sort-ps-commands-cpu-field

https://superuser.com/questions/538957/print-top-output-only-once-on-mac-os-x