Open68

misc

ピン留めされたアイテム
ultimatileultimatile

分類に困った小ネタ集です.
shell周りが多いと思います.

ultimatileultimatile

CPU温度の監視(macOS)

terminal
sudo powermetrics -s smc | grep "CPU die temperature"
出力
CPU die temperature: 78.96 C

reference

comment

旧version

最初は

sudo powermetrics | grep -e "CPU die temperature"

にしてたけどproc_pidpath ***** failed(0)が出てきてウザかったので上記のcommandに変更.

awkできない

よくわかんないけど

sudo powermetrics -s smc | grep "CPU die temperature"| awk '{print $4}'

とかやって温度の数値だけ抜き出そうとしても何も出てこない.
最初のgrepはできているのに...?

#これはいける
echo "CPU die temperature: 65.67 C"| awk '{print $4}'
65.67
ultimatileultimatile

terminalの表示名を変更する

shell変数のPS1を変更するとterminalで常に表示されているuser名とかcurrrent directoryとかが表示されているのが変更できる.

default
user名@PC名 current directory %
export PS1="%C "'%% '

こうすると

表示
current directory % 

こうなる.

reference

https://eng.shibuya24.info/entry/zsh_remove_pcname_and_username

comment

zshで%をescapeするには%%.
プロンプトと言うらしい.

ultimatileultimatile

shellで小数の桁指定

(ba)shだとたぶんpythonとか使うのが一番簡単(なんだそれ)

terminal
python -c "print(f'{1.22/2:.2f}')"
0.61

zshならprintfでOK

terminal
printf "%.2f\n" $((1.22/2))
0.61

comment

bashの小数演算がめんどくさすぎる.
python version 3.6以上で使えるf-stringというのを用いている.
1.22/2.2fで表示してくださいという意味になっている.

TODO

  • formatの記法
  • shell変数${A}を含む場合,Pythonのplace holderにつかう括弧と衝突するのでなんとかしないといけない
ultimatileultimatile

小数の割り算を計算をしてから整数に変換

echo "$A/$B" | bc -l | xargs printf "%.0f"

scaleがややこしいのでbc -lにしてscale=20になるようにしている
整数にするのは"%.0f"が楽

ultimatileultimatile

画像とかの変換系

探せばすぐ出てくるけど探すのが面倒で...

pdf→png

terminal
 brew install poppler
terminal
pdftoppm {input.pdf} {output.file} -png

{output.file}は拡張子なし
https://www.cyberciti.biz/faq/how-to-convert-pdf-to-image-on-linux-command-line/

dpiの変更

-r  {value} # DPI (default: 150)
-rx {value} # 横方向のDPI (default: 150)
-ry {value} # 縦方向のDPI (default: 150)

他に使いそうなoption

-singlefile #単一page pdfを変換するときに指定すると出力されるfile名に番号がつかない

svg→png

terminal
inkscape -w 1024 -h 1024 input.svg -o output.png

https://stackoverflow.com/questions/9853325/how-to-convert-a-svg-to-a-png-with-imagemagick

ultimatileultimatile

Markdownでacuteとか

HTML用に特殊文字が用意されている.

acute

Poincaréとか
&{}acute;で{}にalphabetが入る.
Poincaréのように書く.
あるやつとないやつがある
éみたいに番号で直接指定も可能

umlaut

Schrödingerとか
&{}uml;で{}にaiueoyAIUEOYが入る.
Schrödingerのように書く.

double acute

ő

ø(空集合記号∅ではない)

o slashとかいうらしい.
Møllerとか
ø
ちなみに空集合記号∅は∅

reference

https://t.co/f4TjCGwEiY
https://www.adfreak.de/en/blog/html-umlauts-and-special-characters-entities-and-unicodes-list/

comment

番号の方はUnicodeで分かりやすい方はHTML用に用意されているものっぽい.

ultimatileultimatile

VESTAの使いかた

  • 水素結合はbondからOH結合から消せる
  • 一部の原子だけ表示するにはboundaryから
  • abc軸を表す矢印は消せる
ultimatileultimatile

空行を含めて全ての行頭に>を1つだけ挿入する

sed -i -e 's/^$/> &/' -e 's/^\([^>]\)/> \1/' your_file.text
ultimatileultimatile

Hermite行列の指数函数がunitaryになるとき係数は純虚数

Hermite行列\hat{A}に対して\mathrm{e}^{t\hat{A}}を考える(t\in\mathbb{C}).
このとき\mathrm{e}^{t\hat{A}}がunitaryであることとtが純虚数であることは同値.

まず, Herimite行列はunitary行列で対角化可能なので, \hat{A}を対角化するunitary行列\hat{V}, 実数成分を持つ対角行列\hat{D}を用いて\hat{A}=\hat{V}\hat{D}\hat{V}^\daggerと対角化できる.
この表式を用いると

\begin{aligned} \mathrm{e}^{t\hat{A}} =\sum_{k=0}^\infty\frac{t^k}{k!}\hat{A}^k &=\sum_{k=0}^\infty\frac{t^k}{k!}\hat{V}\hat{D}^k\hat{V}^\dagger\ (\because \hat{V}\hat{V}^\dagger=\hat{1})\\ &=\hat{V}\mathrm{e}^{t\hat{D}}\hat{V}^\dagger \end{aligned}

となる.

次に, \left(\mathrm{e}^{t\hat{A}}\right)^\daggerを計算する.
\hat{D}は実数成分を持つことから\hat{D}^\dagger=\hat{D}となることに注意すると

\left(\mathrm{e}^{t\hat{A}}\right)^\dagger=\hat{V}\mathrm{e}^{t^\ast\hat{D}}\hat{V}^\dagger

となる.

最後に\mathrm{e}^{t\hat{A}}\left(\mathrm{e}^{t\hat{A}}\right)^\daggerを計算する.
t\hat{D}t^\ast\hat{D}は交換することから\mathrm{e}^{t\hat{D}}\mathrm{e}^{t^\ast\hat{D}}=\mathrm{e}^{(t+t^\ast)\hat{D}}
となることに注意すると

\mathrm{e}^{t\hat{A}}\left(\mathrm{e}^{t\hat{A}}\right)^\dagger=\hat{V}\mathrm{e}^{(t+t^\ast)\hat{D}}\hat{V}^\dagger

となる.

\mathrm{e}^{t\hat{A}}がunitaryになるためには\mathrm{e}^{t\hat{A}}\left(\mathrm{e}^{t\hat{A}}\right)^\dagger=\hat{1}とならなければならない.
そのためには\mathrm{e}^{(t+t^\ast)\hat{D}}=\hat{1}, すなわち(t+t^\ast)\hat{D}=\hat{O}となればよい.
\hat{D}は一般に零行列\hat{O}ではないのでt+t^\ast=0にならなければならない.
これはtが純虚数を意味する.

ultimatileultimatile

\hat{S}\coloneqq t\hat{A}とすると,tが純虚数および\hat{A}がHermiteであることより\hat{S}^\dagger=t^\ast \hat{A}^\dagger=-t\hat{A}=-\hat{S}となり\hat{S}は反Hermiteであると言える.

ultimatileultimatile

これらの記号を含むpasswordの生成

pwgen 12 -cnysB1 -N1000| grep -E '^[a-zA-Z0-9\-\.@+$#!/_]{12}$'
ultimatileultimatile

homebrewでinstallしたときにPATHを解決しない場合がありcompile時にinclude/link optionを指定する必要がある場合がある.

  • brewの用語でkeg-onlyという
  • 例えば, LAPACK/BLASをinstallしたときにAccelerate frameworkと衝突しないようにするために発生する
  • brew info openblasとかやると見れる

OpenBLAS

LDFLAGS:  -L/opt/homebrew/opt/openblas/lib
CPPFLAGS: -I/opt/homebrew/opt/openblas/include
  • 渡すべきPATHは環境によって異なる可能性があるためPATHは適宜書き直す必要がある.
  • とにかくhomebrewの下にあるopenblas/libopenblas/includeの場所を渡せば良い.
ultimatileultimatile
For pkg-config to find openblas you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/openblas/lib/pkgconfig"
ultimatileultimatile

LAPACK

  export LDFLAGS="-L/opt/homebrew/opt/lapack/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/lapack/include"

For pkg-config to find lapack you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/lapack/lib/pkgconfig"
ultimatileultimatile

OpenMP

libomp is keg-only, which means it was not symlinked into /opt/homebrew,
because it can override GCC headers and result in broken builds.

For compilers to find libomp you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/libomp/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/libomp/include"
ultimatileultimatile

LLVM Clang

If you need to have llvm first in your PATH, run:

  echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc

For compilers to find llvm you may need to set:

  export LDFLAGS="-L/usr/local/opt/llvm/lib"
  export CPPFLAGS="-I/usr/local/opt/llvm/include"
ultimatileultimatile

Modules

To activate modules, add the following at the end of your .zshrc:

  source /opt/homebrew/opt/modules/init/zsh

You will also need to restart your terminal for this change to take effect.
ultimatileultimatile

brewで入るHPC用soft

以下全てbrew install hogeの形

# build
cmake
gcc # GNU C compiler
llvm # LLVM clang
ninja

# BLAS/LAPACK
lapack
openblas
scalapack

# MPI
open-mpi
mpich

# OpenMP
libomp

# Misc
juliaup # julia
rustup-init # rust

# package manager
conan 
spack
ultimatileultimatile

PostgreSQL

To start postgresql@14 now and restart at login:

brew services start postgresql@14

Or, if you don't want/need a background service you can just run:

/opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgresql@14
ultimatileultimatile

buildが終わったら通知する(macOS)

https://qiita.com/s2mr/items/ed10bca41ab3ee88f3db
画面横に通知カードを出す(トースト通知というらしい)
こういうやつ

BUILD_COMMAND && osascript -e 'display notification "Build finished" with title "Build"'

通知をoffにしていると表示されないのでその場合はpopup windowにする
こういうやつ

BUILD_COMMAND && osascript -e 'tell app "System Events" to display dialog "Build finished"'
ultimatileultimatile

intel macで使っていたHomebrewをM1 macでそのまま使うと不具合が出る

自分はlimaのinstallでこけた.
おそらくx86_64 or AArch64がどうとかキレられたのはこれのせいな気がする

1. Homebrewをuninstallする

NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

2. Homebrewを再installする

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

最新のcommandは以下で確認

参考文献

https://github.com/Homebrew/install

ultimatileultimatile

スパコンにninjaを入れる

前提

  • Git
  • CMake
  • sudo不可

やること

sudoなければsource build

build command

git clone https://github.com/ninja-build/ninja.git
cd ninja
cmake -Bbuild-cmake -DCMAKE_INSTALL_PREFIX=$HOME
cmake --build build-cmake
cmake --install ./build-cmake

補足

  • build-cmakeはbuild用のdirectory名なので変更して良い
  • -DCMAKE_INSTALL_PREFIX=$HOME$HOME(=loginしたときに最初にいるdirectory)にbinaryを置く設定. ~/bin/ninjaのようにinstallされる. したがって$HOMEの部分は自分がinstallしたい場所に変更して良い.

参考文献

https://qiita.com/koyukitukimino/items/4f81a159a1f63469a708

ultimatileultimatile

クリップボードに何か処理してクリップボードにコピー

pbpaste | なんか処理する | pbcopy
ultimatileultimatile

Shell: 標準出力の最初のn行を飛ばす

tail -n +[n+1]

[n+1]は実際は数値なので注意(e.g. 最初の1行を飛ばす:tail -n +2)

ultimatileultimatile

known_hostsにある鍵の消し方

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! とか出たときにknown_hostsにある鍵を消さないといけない.一応手でも消せるが

ssh-keygen -R [host name or IP address]

で消せる.

ultimatileultimatile

uname -marchの違い (macOS)

通常のterminal
$ uname -m
arm64
$ arch
arm64
Rosetta terminal
$ uname -m
x86_64
$ arch
i386
ultimatileultimatile

Z shellで読み込まれるprofile/rc filleとその順番

各dotfileにechoを入れて検証(macOSで試しただけ)

login shell (zsh --login)

.zshenv.zprofile.zshrc

非login shel l(zsh)

.zshenv.zshrc

zsh --login --norcs or zsh --norcs

--norcsを付けるとlogin shellか非login shellかに関わらず何も読み込まれない

他に.zlogin.zlogoutなどがあるが自分は使用していないのでパス.

ultimatileultimatile

水平に出力を連結~hcat的な: paste

ultimatileultimatile

fileから特定の列を最初の列に新しく追加して水平方向に連結

awk '{print $4}' list[1-4].dat | paste <(for i in $(seq -w 0.0 0.1 1.0); do echo "$i" ;done) - - - -
ultimatileultimatile

A0 posterをA4に分割して印刷する用のpdfを作成

brew install mupdf 
mutool poster -x 4 -y 4 input.pdf output.pdf
ultimatileultimatile

fish移行memo

大体ここに書いてある
https://natsukium.github.io/fish-docs-jp/index.html

.zshrc & .zprofile ~/.config/fish/config.fish

source ~/.config/fish/config.fish

変数とexport

.venv

Homebrew

同じ
eval (/opt/homebrew/bin/brew shellenv)

ultimatileultimatile

echo "${x}${y}"みたいなことがしたい場合,単にecho "$x$yでよい.文字を混ぜる場合はそこだけ二重引用符で囲めば良い:echo $x"と"$y

ultimatileultimatile

fish_remove_pathはない

そして多分今後実装もされない

$fish_user_pathsというlistにfish_add_pathで追加されたpathが入っているので消したいpathがいればそのindexを取得してset -eで消すということを自分でしないといけない.

以下のような函数

# https://github.com/fish-shell/fish-shell/issues/8604#issuecomment-1169638533 より
function remove_path
  if set -l index (contains -i "$argv" $fish_user_paths)
    set -e fish_user_paths[$index]
    echo "Removed $argv from the path"
  end
end

を定義しておけば

remove_path some_path

で消せる

https://github.com/fish-shell/fish-shell/issues/8604

ultimatileultimatile
  • functions alias_nameでalias(函数)の中身を確認できる
  • functions -nで定義されている函数一覧が出る
ultimatileultimatile

fish_add_pathの挙動

fish_add_path hogeとするとhogefish_user_pathsにprependし,fish_user_pathsPATHにprependするという挙動のよう.
以下のように一見Homebrewと関係ないpathの設定をしただけなのにHomebrewのpathが変わってしまうというのを踏んでしまった,

$ fish_add_path hoge
$ eval $(/opt/homebrew/bin/brew shellenv)
$ which brew
/opt/homebrew/bin/brew
$ eval $(/opt/homebrew/bin/brew shellenv)
$ fish_add_path hoge
$ which brew
/usr/local/bin/brew
  • eval $(/opt/homebrew/bin/brew shellenv)で評価されるもののうち,実際に関係あるのはfish_add_path --global --move --path "/opt/homebrew/bin" "/opt/homebrew/sbin";のみだと思われる.
  • 自分の場合,上記コマンド実行以前にfish_user_pathsの末尾に/usr/local/binが入っていたため,fish_add_path hogeeval $(/opt/homebrew/bin/brew shellenv)の後に実行すると/usr/local/bin/opt/homebrew/binより先に来てしまうという現象が起きていた.
ultimatileultimatile

Notion, Obsidian, Logseqの比較

Notion

  • 良いところ
    • みんな使ってる
  • 悪いところ
    • 重い
    • localなmarkdown fileが生成されない(他のtoolはhoge.mdが作成される)
    • 日本語の後に$$を入力して数式modeにしようとしても数式がrenderingされない($$の前にspaceが必要)

Obsidian

Logseq

ultimatileultimatile

依存関係導入されたがもう使われていないHomebrew formulaの削除

brew autoremove
ultimatileultimatile

iterm2

ultimatileultimatile

pane分割したときだけcurrent directoryでsessionを開始したい

Settings(+,)→Profiles→(設定したいprofileを選択)→GeneralWorking Directoryの項目でAdvanced Configurationを選択→Edit..ボタンを押してWorking Directory for New Split panesの項目でReuse previous session's directoryを選択

ultimatileultimatile

交換関係(交換子)の積の公式

[A,BC]=B[A,C]+[A,B]C
[A,BC]=B[A,C]+[A,B]C

[AB,C]=A[B,C]+[A,C]B
[AB,C]=A[B,C]+[A,C]B

[A,BCD]=BC[A,D]+B[A,C]D+[A,B]CD
[A,BCD]=BC[A,D]+B[A,C]D+[A,B]CD

[ABC,D]=AB[C,D]+A[B,D]C+[A,D]BC
[ABC,D]=AB[C,D]+A[B,D]C+[A,D]BC

[AB,CD]=A[B,C]D+AC[B,D]+[A,C]DB+C[A,D]B
[AB,CD]=A[B,C]D+AC[B,D]+[A,C]DB+C[A,D]B
A\left[B,C\right]D+AC\left[B,D\right]+\left[A,C\right]DB+C\left[A,D\right]B
ultimatileultimatile

ARM macでALAMODEのbulid

https://alamode.readthedocs.io/en/latest/install.html

必要なpackageのinstall

brew install cmake llvm fftw eigen boost open-mpi openblas spglib
  • apple clangを使う場合はllvmは不要.以下のcmake optionもclang(++)の指定部分も不要(やっても問題ない)

source codeの取得

git clone https://github.com/ttadano/alamode.git
cd alamode

cmakeの実行

cmake -Bbuild -S.  -DCMAKE_CXX_FLAGS="-O2" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSPGLIB_ROOT=/opt/homebrew/Cellar/spglib/2.5.0_1 -DFFTW3_ROOT=/opt/homebrew/Cellar/fftw/3.3.10_1
  • -DCMAKE_CXX_FLAGS から-xHOSTを外さないとcompileできないので注意.
    • Intel compilerなら大丈夫(なはず)
  • -DSPGLIB_ROOT-DFFTW3_ROOTはinstallしたversionによって変わってしまうのでbrew info fftwbrew info spglibをして確認する

buildの実行

cmake --build build
ultimatileultimatile

macのshellとGNU shellとの非互換性
macのshell toolがなんなのかよくわかってない

  1. sed-E -eoptionを使うとfilename-Eみたいな名前のback upが生える
    https://stackoverflow.com/questions/34533893/sed-command-creating-unwanted-duplicates-of-file-with-e-extension
  2. head -n-行番号が使えない→head: illegal line count -- -2
    gheadでおk
  3. sed: https://zenn.dev/ultimatile/articles/4e78c2484277cf
  4. echoの-nがわからない(/bin/sh限定)
  5. grepもoptionが違うっぽい
    https://zenn.dev/masaki_mori72/articles/cf55f180320953
ultimatileultimatile

Twitterで@をuser mentionにしない方法

U+2060 (word joiner)で@の後ろに不可視空白を入れている
ちょうど奥村先生のtweetに実際の例があるのでコピペで使える
code片の場合,コピペすると不可視空白を消さないと当然動かないのでやめた方が良いかもしれない...
https://x.com/h_okumura/status/1594861465852211200