在某個推文上看到的網站 – Compiler Explorer https://godbolt.org/,但我忘了來源。
網站打開以後,左邊貼程式碼,右邊會即時顯示出編譯後的低階語言,支援蠻多語言的。這對想搞清楚底層怎麼處理的開發者來說很方便,可以透過這個網站即時的看到結果,進而調校程式碼。
Just thinking more…
在某個推文上看到的網站 – Compiler Explorer https://godbolt.org/,但我忘了來源。
網站打開以後,左邊貼程式碼,右邊會即時顯示出編譯後的低階語言,支援蠻多語言的。這對想搞清楚底層怎麼處理的開發者來說很方便,可以透過這個網站即時的看到結果,進而調校程式碼。
在使用 vagrant 架設 CentOS 環境時,yum 安裝套件出現 Failed to download metadata for repo 'AppStream' 的錯誤。
本來以為是有打錯字什麼的,後來發現沒啥問題,就請 Google 幫忙找找看,就找到這篇:Failed to download metadata for repo ‘AppStream’ [CentOS]
看完以後,簡單整理如下:
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
這邊是使用 sed 指令來做替換,不確定指令做什麼的話,可以直接用 vim 或熟悉的文字編輯器打開 /etc/yum.repos.d 目錄下所有以 CentOS-* 開頭的所有檔案,做兩項變更:
這樣修改以後,就可以執行 yum 了。
一般程序在使用過多記憶體時,就會被 Kernel 結束掉,在 Kernel 裡的負責這工作的就是 OOM Killer 。
如果想要把這功能關掉,可以用 sysctl 來作。
sudo -s sysctl -w vm.oom-kill=0
那要啟用,就是用
sudo -s sysctl -w vm.oom-kill=1
一般預設是啟用的。
另外一個設定是當出現 OOM 時,Kernel 要不要 Panic
這可以藉由察看 /proc/vm/oom_kill 的內容,得知此設定有沒有啟用。
cat /proc/sys/vm/panic_on_oom
要啟用,可以直接把 1 寫到這檔案裡。
echo "1" | sudo tee /proc/sys/vm_panic_on_oom
要關閉,就是寫 0
除了啟用跟關閉之外,還可以做一點細部的控制,就是 vm_overcommit_memory 。先說明 overcommit 的意思,當程序跟 kernel 申請記憶體時,kernel 通常是允許,因為不會立刻就使用,這樣就有機會可以執行更多程序,這就是 overcommit 過度使用。
這個值是 0 的時候,表示過度使用記憶體時的處理是由 kernel 自己決定,這也是預設值。
用 1 ,表示 kernel 永遠都可以過度使用,這設定有點危險,因為會有機會導致 OOM;2 表示不會使用超過指定的比率。
那就可以針對個別程序去做調整,OOM killer 在處理時,會去參考程序的 oom_score 來決定是砍不砍,所以可以調整 oom_score_adj 數值來影響 oom_score。
比如我們希望 pid 是 3813 的程序可以不要被 OOM killer 砍掉,就可以這樣調整
echo "-100" | sudo tee /proc/3813/oom_score_adj
或者是在 systemd service 裡加入
[Service]
OOMScoreAdjust=-100
這個設定在一般情況下不太會被用到,基本上用預設設定就可以。主要還是用在系統調校或是正式環境時,才會去動到。
想查詢用哪個 DNS 伺服器比較快,之前是查到用 namebench,但這專案沒在維護了,自行編譯使用,又遇到些問題,乾脆就放棄。
後來有看到 diadiag 這個套件,就想說來用看看。
在 Ubuntu 裡,用 apt 就可以安裝。
sudo apt install dnsdiag
dnsdiag 套件裏面有3個工具
dnsping 是測試連到 DNS 伺服器的時間。
dnstraceroute 是列出到 DNS 伺服器的路由,透過這個可以看 DNS 查詢到底有沒有繞路。
dnseval 是本文重點,也就是可以針對各個 DNS 伺服器去做評估,看哪個比較快。
首先要新增一個文字檔,命名為 public-dns-servers.txt,裏面放 DNS 伺服器的 IP。
1.1.1.1
8.8.8.8
168.95.1.1
94.140.14.14
61.31.1.1
然後執行
dnseval -f public-dns-servers.txt www.facebook.com
就可以看到結果了。
server avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags response
--------------------------------------------------------------------------------------------------------------------
1.1.1.1 9.471 9.167 9.659 0.219 %20 3599 QR -- -- RD RA -- -- NOERROR
8.8.8.8 10.621 8.588 13.036 1.961 %12 1002 QR -- -- RD RA -- -- NOERROR
168.95.1.1 9.119 9.119 9.119 0.000 %50 2648 QR -- -- RD RA -- -- NOERROR
94.140.14.14 0.000 0.000 0.000 0.000 %100 N/A -- -- -- -- -- -- -- No Response
61.31.1.1 8.215 8.132 8.298 0.118 %33 1366 QR -- -- RD RA -- -- NOERROR
好了,有了這工具,就可以找出最適合的 DNS 伺服器了。
Ubuntu 22.04 的 Firefox 變成 snap 軟體套件了,依據之前的經驗,這樣會卡到輸入法。果不其然,升級到 22.04 以後,Firefox 無法輸入中文。(我使用的是 gcin )
好在 Mozilla team 有推 debian package 的套件庫,依照這篇:How to Install Firefox as a .Deb on Ubuntu 22.04 (Not a Snap) 來進行,很容易就可以換回 debian package 版的 Firefox
方法如下:
步驟1,移除 snap 版的 firefox
sudo snap remove firefox
步驟2,增加 Mozilla team 的 PPA
sudo add-apt-repository ppa:mozillateam/ppa
步驟3,調整 apt 的設定,新增 /etc/apt/preferences.d/mozilla-firefox 檔案,內容貼上以下內容
Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001
再新增 /etc/apt/apt.conf.d/51unattended-upgrades-firefox ,內容貼上以下內容
Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";
最後,就可以用 apt 安裝 firefox 了
sudo apt install firefox
這方法的風險在於 Mozilla team 不知道會維護多久,但就先這樣用吧。
韓國電影,故事蠻妙的。男主角崔亨旭是個殺手,在浴室踩到肥皂跌倒而喪失了記憶,因為鑰匙的關係,意外跟另外一個男子尹在誠交換了身份。崔亨旭透過探索住處以及附近的人們,慢慢了解了自己是什麼樣的人。而尹在誠卻因為進入了崔亨旭的住處而愛上了崔亨旭的目標恩珠。
崔亨旭慢慢的找回了自己的記憶,想起了自己的身份以及工作是什麼。尹在誠卻是發現崔亨旭可能是殺手,要殺害恩珠。經過一番曲折,崔亨旭跟在誠還有恩珠說明了自己並非真的殺手,而是協助這些看似被殺掉的人隱藏身份。所以就講好,一起演一場戲,讓委託崔亨旭殺人的這些人以為恩珠真的死了。最後,就是皆大歡喜,尹在誠跟恩珠走到一起,而崔亨旭也放棄了殺手的身份,跟當初因為自己失憶而照顧自己的一家人生活在一起。
大年初二晚上看了雲南蟲谷,之前看小說時,覺得還蠻不錯的,抱有一份期待。哪知道還看不到一半,就開始吐嘈了。看完以後,我覺得並不好看。莫名其妙的冒險,故弄玄虛的瞎子還有看似正氣凜然的長篇大道理,反正就是要上去那個獻王墓。導演把電影拍的跟連續劇一樣,但是電影的時間不夠,沒辦法把故事講的完整,於是就爛尾了。
在進行備份或者是複製大檔的時候,通常會想知道進度,但這通常需要指令本身有處理這塊,例如 rsync,否則一般是沒進度的。
那麼,有方法可以做到這件事情嗎?有的,就是使用 pv 這個指令。
安裝 pv 很簡單,在 Debian/Ubuntu 裡,用 apt 就可以安裝。
sudo apt install pv
在 RHEL/CentOS 裡,需要加入 EPEL 這個 repository (安裝方法:sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm )
再使用 yum 安裝即可
sudo yum install pv
看了參考資料的文章以後,我個人的理解是這樣子的,第一種使用方法,是把檔案當作參數,pv 會讀取檔案,然後輸出到 stdout,pv 就是依照檔案的長度來做進度顯示。直接來看看幾個例子
例1:複製大檔
pv big-file > /tmp/big-file
例2:壓縮大檔
pv big-file | bzip2 > /tmp/big-file.bz2
例3:用 tar 來備份,這邊的 -p –timer –rate –bytes 是因應不知道檔案大小所加上去的設定,這邊也可以看到 pv 可以接收 stdin 的資料,顯示進度,然後再寫到 stdout。
tar -czf - ./Downloads/ | (pv -p --timer --rate --bytes > backup.tgz)
例4:同時看多個處理動作的狀況
pv -cN raw file | gzip | pv -cN gzip > file.gz
例5:備份跟還原整顆磁碟
pv -EE /dev/sda > disk-image.img
pv disk-image.img > /dev/sda
例6:複製目錄
rsync -avr --progress Downloads /mnt
等等,不是說好用 pv 嗎?對,你沒看錯,用 rsync,不要用 pv 去串了,這樣比較清楚。
在 Linux 裡要切換 java,可以使用 update-alternative --config java
在 MacOS 裡,要用 /usr/libexec/java_home 。
MacOS 本身就有帶一包 java ,是 OpenJDK,所以在要切換之前,得先說一下,怎麼安裝其他版本的 java 。要安裝其他版本的 java,用 homebrew 的話,是很簡單的。
要安裝 oracle-jdk,就用
brew search oracle-jdk
要安裝 adoptopenjdk,就用
brew tap adoptopenjdk/openjdk
brew install adoptopenjdk8
要知道裝了哪些 jdk,可以用
/usr/libexec/java_home -V
這行指令會列出所有安裝的 Java ,從這邊可以取得版本號碼跟名稱。
知道版本以後,要使用指定版本的 Java ,可以用切換 PATH 的方式來處理
export JAVA_HOME=$(/usr/lib_exec/java_home -v <your_java_version>)
export PATH=${JAVA_HOME}/bin:${PATH}
github 會針對套件去做安全檢核並發出通知或是 pull request,如果本地端想要做這件事,該怎麼做呢?
剛好前幾天看到這篇:How to find third-party vulnerabilities in your Python code ,文章裡就介紹了 pip-audit 這個工具。使用這個工具,就可以對使用的套件來做安全檢核,並給予建議。
安裝方法很簡單,用 pip 安裝就可以
pip install --upgrade pip-audit pip
安裝完成後,就可以使用 pip-audit 指令了。
要對使用的套件檢查,可以用
pip-audit -r requirements.txt
檢查需要花一段時間,檢查後的結果大致會類似這樣子:
Found 1 known vulnerability in 1 package
Name Version ID Fix Versions
------- ------- -------------- ------------
urllib3 1.25.11 PYSEC-2021-108 1.26.5
你會看到有幾個已知漏洞,套件的名稱跟修正的版本。
若要即時的修正,pip-audit 也可以做修正。
pip-audit --fix
要注意的是,這個修正只是幫你安裝已經沒有漏洞的版本,requirements.txt 裡還是要自己去修正。
後續思考:
之前在用 c# 時,可以使用 reflection 來查找類別可以使用的方法或屬性,甚至是函式庫裡有什麼類別、函式可以使用。在 Python 可以用 inspect 模組來達成這件事情:How to list all functions in a Python module?
例如要列出模組裡所有的函式,可以這樣用:
from inspect import getmembers, isfunction
from somemodule import foo
print(getmembers(foo, isfunction))
或是要找出名字裡有 castle 的成員,像是函式、類別等等的:
import inspect
import example
for name, data in inspect.getmembers(example):
if 'castle' not in name:
continue
print('{} : {!r}'.format(name, data))
或是要找類別名稱是 XXXManager 的類別:
import inspect
import example
for name, data in inspect.getmembers(example, inspect.isclass):
if name.endswith('Manager'):
print('{} : {!r}'.format(name, data))
要撈 docstring 也可以,更多的用法可以參考 PyMOTW: inspect — Inspect Live Objects
Python 網站上的文件:inspect – Inspect Live Objects