macOS数値計算用環境構築覚書

# はじめに
MacBook Proを拾ったので数値計算用途の環境構築を行います.
ほとんど個人的な忘備録です.
(2019/12/26 [似たような記事](http://taklab-blog.blogspot.com/2019/12/macos-catalina-10152.html)が見つかった...)
詳しくはそれぞれのlink先を参照してください.

<!-- 実行時にOSの言語設定が英語だったので用語が英語になってますが適宜日本語に読み替えてください(Downloads→ダウンロード, Preferences→設定など). -->

やることは

- diskの初期化
- editor (Visual Studio Code) のinstall
- 開発環境の設定 (何を入れるかは目次を見てください)
- 執筆環境の設定 ($\LaTeX$)
- 日本語入力設定
- sshの設定

です (随時更新).

# 実行環境
macOS Mojave 10.14.3 

# diskの初期化
前の持ち主の設定が残っていたのでdiskを初期化してOSを入れ直します.
まず, OSを(再)起動して起動画面が出る前から<kbd>⌘</kbd> + <kbd>r</kbd>を押し続けOS utilityを起動します.
disk utilityを選択し, 更にdiskを初期化を選択します. 
diskのformatが終わったらdisk utilityを終了しOSの再installを選択しOSを入れ直します.
OSが入ったらOS utilityを終了し, OSを起動します. 

http://vdeep.net/initialize-mac#Mac-2

OSの設定を諸々行うことになりますが, このときApple IDを作成していなければ作成します. 
Xcodeをinstallする際にApple IDが必要になります.


# 最初の一歩 (Terminalの起動)
ほとんどの作業をTerminal上で行います.
Desktop右上の虫眼鏡を押して`Terminal`で検索すると見つかります.

# editor (Visual Studio Code) のinstall
editorのVisual Studio Code (以下VScode) をinstallします.
[公式website](https://code.visualstudio.com/docs/?dv=osx)から落とします.

落としたVisual Studio Code.appをApplications folderにdrug & dropします.
これをやらないと次に行うTerminalからVScodeを起動するための設定を何度もやる羽目になります.

TerminalからVScodeを起動するための設定を行います.
VScodeを起動し, <kbd>F1</kbd>でcommand paletteを起動します.
`Shell Command: Install 'code' command in PATH command.`を選択します.
Terminalを再起動すれば`code`でVScodeが起動します.

https://code.visualstudio.com/docs/setup/mac

# 開発環境の設定
<!-- (Julia, C++, Fortran, Python (Anaconda), Lapack, make, cmake)-->
<!--
macOSのpackage managerであるHomebrewやGCCは統合開発環境Xcode経由で入れることになるのでまずXcodeを入れます.
-->

## Xcode
これでBLAS/LAPACKが入ります.

App storeとdeveloper pageから入手する方法があるようです.
App store経由だとApple IDの詳細情報入力が面倒だったのでdeveloper pageから入手します.
[developer page](https://developer.apple.com/download/more/?name=Xcode)をApple IDを入力して開きます.
downloadしたいversionのXcodeを選択し.xipをdownloadします.
.xipを展開して出てきたXcode.appをdownloadsからapplicationsに移動します.

https://fukatsu.tech/install-xcode


## Command Line Tools for Xcode (Clang, Git, Make)
C++ compilerなど開発に必要なものはだいたいこれで入ります[^1].

<!-- fortranはflangかgfortran入れる-->

[^1]: ちなみにこれとXcodeでC++ compiler, Make, Git, CBLAS/CLAPACKが揃うので[ITensor](https://itensor.org/docs.cgi?vers=cppv3&page=install)をinstallする環境が整います. 

Terminalで`xcode-select --install`を実行します.

https://qiita.com/motofumi/items/0f2e7ae1b852f118fe95

なお, これで`gcc`なども使えますが, 実際はClangが呼ばれるようです.

https://qiita.com/kuboshu83/items/265264551193da079ad2

## Homebrew (要Command Line Tools for Xcode)
package manager. 
Terminalで以下を実行します.

<!-- TeXを入れるときに使います. -->

```bash:Terminal
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

https://brew.sh/index_ja.html

## CMake
Homebrewで入ります.
`brew install cmake`

## Fortran (GCC)
Homebrewで入ります[^2].
`brew install gcc`
[^2]: なおLLVM C(++) complierであるClangに対応する, [Flang](https://github.com/flang-compiler/flang)というLLVM Fortran compilerもあります.

## Python3 (Anaconda)
Homebrewで入ります.
pyenv経由でAnacondaを入れます. Terminalで以下を実行します.

```bash:Terminal
brew install pyenv
#pyenvのpathを通します.
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
pyenv install anaconda3-2019.10
#全てのdirectoryでこのanacondaを使う設定を行います.
pyenv global anaconda3-2019.10
```

https://qiita.com/aical/items/2d066801a7464a676994

今後新しいversionが出た場合や, 古いversionをinstallしたい場合は`pyenv install -l`でinstall可能なversionを確認してください.

[公式website](https://www.anaconda.com/distribution/#macos)から落として入れることも可能です.

https://weblabo.oscasierra.net/python-anaconda-install-macos/

自分がPythonを導入するのはMatplotlibを用いた描画目的であるため, Pythonをmainで開発を行う場合は他の環境管理softwareもご検討ください.

https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd

## Python3 (Rye)
正直何が一番良いのかよくわかりませんが, Python projectの管理にRyeを使い始めました.
project directory毎にpython環境を作り直すので個人的には管理しやすいです.

```bash:Terminal
# ryeのinstall
brew install rye
```

もしくは

```bash:Terminal
# ryeのinstall
curl -sSf https://rye-up.com/get | bash
```

使い方などは[公式website](https://rye-up.com)などを参考にしてください.

## Julia
juliaupはJuliaのversion管理をしてくれます.
```bash:Terminal
brew install juliaup
```

※2023/08/09 最新binaryのinstallからjuliaupのinstallに変更しました.


# 執筆環境の設定 (LaTeX)
MacTeXを入れるとTeX Liveを含めて必要なものは大体入ると思います.

https://texwiki.texjp.org/?MacTeX

https://doratex.hatenablog.jp/entry/20190502/1556775026

以下を実行します.

```bash:Terminal
brew install --cask mactex
#最新版に更新
sudo tlmgr update --self --all
sudo tlmgr paper a4
```

GUI applicationがいらない場合は`brew install --cask mactex`の代わりに`brew install --cask mactex-no-gui`とします.

```bash:Terminal
brew install --cask mactex-no-gui
#最新版に更新
sudo tlmgr update --self --all
sudo tlmgr paper a4
```

なお, `tlmgr`はTeX Liveのpackage managerです.
`command not found`になった場合はpathの設定が反映されていませんので, `echo $PATH`などで`/Library/TeX/texbin/`にpathが通っているか確認してください[^3].
[^3]: installerがpathを通すと思うのでPATH変数は書き換わっているはずなのですが, いつ反映されるかよく分かりませんでした. 自分は最初`tlmgr`を起動できなったのでpathを自分で通さないといけないのかと思い, 時間があるときにやろうとしばらく放置していました. しかし, いつの間にやらpathが通っており, 追加操作しないまま`tlmgr`が起動するようになってしまいました...

## VScodeでTeX documentがformatされない場合の対処法

Mojave特有の問題があるようです.

```bash:Terminal
brew install perl
brew install cpanm
cpanm Log::Log4perl Log::Dispatch::File YAML::Tiny File::HomeDir Unicode::GCString
```

このcommandだけでは動かない可能性がありますので詳細は以下を参考にしてください.

https://qiita.com/khys/items/332c3a3f34a82acf7a7a


# 日本語入力設定
入力sourceに日本語を追加します.
System PreferencesからKeyboardのInput Sourcesを選択します.
+を押して日本語を追加します. 必要であれば各種設定を行います.
例えば, <kbd>Caps Lock</kbd>にローマ字入力onに切り替えを割り当てることなどができます.

https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10267/6.2.1/mac/10.14

# sshの設定 (公開鍵認証)
自分のserver環境が全て公開鍵認証なので公開鍵認証のみ記載しています.
## 鍵の作成

```bash:Terminal
mkdir ~/.ssh #なければ
ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/id_rsa
```

passphraseの設定は任意ですが, 設定が推奨されています.
`"hoge@example.com"`の部分はcommentなので好きなように変更可能です.

https://qiita.com/belion_freee/items/a447e34a6c08588d4597

これでserverに公開鍵を置きさえすればsshできるはずです[^4].

```bash:Terminal
ssh hoge@example.com
```

[^4]: port番号が必要な場合など接続に必要なoptionはserverによって異なると思いますので管理者の方などにご確認ください.

sshには様々な設定があります. optionによる指定も可能ですが`~/.ssh/config`に設定を記載するのが一般的です.

```bash:~/.ssh/config
Host *
TCPKeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 5
#ssh-agent用
ForwardAgent yes
```

`ForwardAgent`は後述のssh-agent用ですので使わない方は消しても問題ありません.
設定について詳しく知りたい方は[こちら](https://koejima.com/archives/583/)を御覧ください.
## addressの入力を省略する
addressの入力が面倒な場合, 以下のように`~/.ssh/config`を設定すれば`ssh example`の形で接続することが出来ます.

```bash:~/.ssh/config
 Host          example
 HostName      example.com
 User          hoge
```

`Host`に接続名, `Hostname`にdomain名, `User`にuser名を記載します. 
これは例として挙げている`ssh hoge@example.com`と同じことになります.

## 公開鍵を接続先で使い分ける
鍵を接続先で使い分ける場合, `~/.ssh/config`で鍵の指定を行います.
例えば`hoge@example.com`に接続するときには`~/.ssh/ide_rsa_example`を使いたい場合, 以下のように`~/.ssh/config`に設定を記載します.

```bash:~/.ssh/config
 Host          example
 HostName      example.com
 User          hoge
 IdentityFile ~/.ssh/id_rsa_hoge
 IdentitiesOnly yes
```

他にもport番号が必要な場合は`Port xxxx`を追加とかありますが他の設定は[こちら](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)などを御覧ください.

## 多段接続の設定
login serverを経由して目的のserverにloginする場合があります. 
例として`hoge@login.com`を経由して`hoge@example.com`にloginする, というような状況を想定します. 
その場合, まず`ssh hoge@login.com`して, その後`ssh hoge@example.com`するようなことになります. 
しかし毎回2回sshするのは面倒ですので`~/.ssh/config`を以下のように設定します.

```bash:~/.ssh/config
 Host example
 Hostname example.com
 User hoge
 ProxyCommand   ssh -CW %h:%p login

 Host login
 Hostname login.com
 User hoge
```

これで`ssh example`で所望のserverまでloginができます.

### ssh-agentの設定
多段接続の場合, 上記の設定でsshの回数は減らせてもpassphraseを入力する回数は減らせないため何度も入力する必要があり面倒です.
まず`~/.ssh/config`に

```bash:~/.ssh/config
Host *
ForwardAgent yes
```

を追加します.

次に秘密鍵を登録します:

```bash:Terminal
ssh-add -K
```

これでdefaultの秘密鍵が登録されます. 鍵を指定したい場合は

```bash:Terminal
ssh-add ~/.ssh/id_rsa
```

としてください. これでpassphrase入力が省略されるようになるはずです[^5].

<!-- リンク切れ:https://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf -->

<!-- 同じ作者っぽい記事を見つけたけど内容同じか...? -->

<!-- https://blog.ishmz.com/post/ssh-agent%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/ -->


[^5]: 多段認証の場合でなくてもssh-agentは利用可能です.

## 言語設定をなんとかする
sshでloginすると`/usr/bin/manpath: can't set the locale; make sure $LC_* and $LANG are correct`とか怒られました.

実害はなかったので放置していたら

```sh
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
```

と怒られ出力がうまく動かない事態が発生してしまいました.

~~とりあえずmacが悪い.~~
macのlocale設定をsshで一緒にserverに送っているのが原因みたいなので
`etc/ssh/ssh_config`[^6]の`SendEnv LANG LC_*`をcomment outします.

https://qiita.com/bump_of_kiharu/items/86ceb65e09049959bc90

[^6]: OSのversionによって居場所が違いそうです.

# その他
## Terminalを<kbd>ctrl</kbd>+<kbd>d</kbd>(あるいは`exit`)で閉じる
TerminalのPreferences→ShellのWhen the shell exitsを変更します.

https://ocs.hatenadiary.org/entry/20111010/1318209350

## gnu-sedを使う
`sed -z`を使いたくなった場合などはmacOSの場合はinstallが必要です[^7].
実行commandは`gsed`になります.

```sh:Terminal
brew install gnu-sed 
```

https://qiita.com/akameco/items/804970cd6655e69cc537

### その他のGNU系のcommandが欲しいとき
[ここ](https://qiita.com/eumesy/items/3bb39fc783c8d4863c5f#3-gnulinux-%E7%89%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%B8%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88)にbrewのcommandが記載されています.

例えば, `seq (gseq)`が欲しい場合は

```sh:Terminal
brew install coreutils
```

です.

[^7]: [gnu-sedを`sed`としてinstallする`--with-default-names`は使えなくなったようです.](https://discourse.brew.sh/t/why-was-with-default-names-removed/4405)