競プロ雑記帳

WSL上におけるJuliaの環境構築

WSLの入れ方などは省略します。

Juliaの導入

バージョン管理ができるようにJuliaupを導入します(普通に導入したら、何故かVSCodeでうまくいかなかったという事情もあります)。 基本的に GitHub - JuliaLang/juliaup: Julia installer and version multiplexer これに従います。

curl -fsSL https://install.julialang.org | sh

これを実行すると、インストール方法を聞かれるので、とりあえずデフォルトでインストールします。 あとは勝手にパスを通してくれてJuliaの最新のバージョンが使えるようになっているはずです。 一応、書いてある通り . コマンドなり、 source なりを使ってファイルを読み込むか、WSLを一度終了して再起動します。

Juliaが使えるか確認するために、以下のコマンドを実行します。

julia --version

Juliaのバージョンが確認できれば大丈夫です。

VSCodeの拡張の導入

Julia - Visual Studio Marketplace これを入れるだけです。 あとは念のため、VSCodeを再起動すればうまくいくはずです。

VSCode上でWSLを使えるようにしていない場合はうまくいかないと思うので、設定してから入れてください。

ゼロからのOS自作入門(MikanOS)のday03aでカーネルの読み込みがうまくいかない

下記の本を買ってからしばらく放置していたのですが、重い腰を上げてRustでやり始めました。
zero.osdev.jp

問題

day03a 初めてのカーネルを書いて実行し、qemuで見たところ明らかに違うアドレスがRIPに表示されていました。
一応RIP前後の命令を見ましたがhltは見当たりませんでした。

原因

同じような問題は結構起きているようで、サポートのレポジトリで何件が議論されていました。

github.com
github.com

上記に書いてある通り、リンカのバージョンが新しくなって仕様が変わったため、起こるバグのようです。

解決策

リンカの問題ということが分かったので、バージョンを下げるという手もありますが、リンカのオプションを追加するだけで治すことができます。

ld.lldのドキュメントを見ると、

Specify whether two adjacent PT_LOAD segments are allowed to overlap in pages. noseparate-code (default) allows overlap. separate-code allows overlap between two executable segments, or two non-executable segments. separate-loadable-segments disallows overlap.

ld(1) - OpenBSD manual pages

のように記述があります。
従って、リンカのオプションに -z separate-loadable-segments を追加することで治すことができます。

先ほど挙げたURLのIssueに書かれているように、day04d ローダを改良するを先に書くことでも治すことができます。

Wi-Fiの設定がPublicのとき、WSL2上で一部の通信がうまくいかない


※注意: ここで紹介している解決方法は同じネットワーク上のユーザ全員を信頼できる必要があります。
茶店のような信頼できない環境では設定しないようにしてください。
何の設定をしているかわからない場合は、設定しない方がよいです。

WSL2でUbuntuを使っているのですが、apt update等がHash Sum Mismatchと出て、うまくいきませんでした。
また、VMWare等の仮想環境では問題が発生しなかったため、WSL特有の問題と考えられます。

理由を色々探しながら試しているうちに、
家だと成功して、大学のWi-Fiにつないでいるときにうまくいかないことがわかりました。
問題の原因としては、接続しているWi-Fiのプロパティでネットワーク プロファイルの種類がパブリックになっていることでした。

そこで、

  1. WSL2をシャットダウンする
  2. 設定>ネットワークとインターネット>Wi-Fi>既知のネットワークを管理 から現在使用しているネットワークを削除(削除前にプライベート設定にしておいた方がいいかも)
  3. もう一度接続して、プロファイルをプライベートにする

という手順で、Wi-Fiの設定を変更しました。

プライベートに変更して、PCを再起動するなどしてもうまくいかなかったのですが、上記の手順を踏むとうまくいきました。

学校や会社のWi-Fiを使っていて同じような症状になっている方の参考になれば幸いです。

公共のWi-Fiでプライベート設定にするべきではないので、パブリックのままうまくやる方法があれば、教えて頂けると助かります。

しばらく前はこんな問題なかったと思うんですが…
プロキシとかが関係あったりするんですかね…

Windows10(21H2)のWSL2でGPUの環境構築

Windows10でもついに使えるようになったので、WSL2のUbuntuで使えるようにしたときのメモ GUIはまだっぽいけど…

確認

windows10の21H2以降であるか確認する。 WSLのバージョンが2になっていることを確認する。

Windowsにグラフィックドライバのインストール

下記のURLにアクセスして、自分のGPUにあったドライバをインストールします。

https://developer.nvidia.com/cuda/wsl/download

WSLにCUDAのインストール

下記のURLにアクセスして書いてある通りのことをWSL上で行います。

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local

現在(2021/11/26)は以下のように書いてあったのでそれを実行しました。

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-5-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

テスト

実際に認識できているかどうかを見るために、CUDAのSampleのdeviceQueryを実行します。

cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make run

CUDAのバージョンやGPUの名前などが一致しているかなどから正しく認識できているかどうかがわかると思います。 確認を終えたら、

sudo make clean

をして、作成されたファイルを削除しておきましょう。

もちろん、

nvidia-smi

も動きます。

WSL2の環境構築

WSLをあまり使ってない理由がGPU対応してない、だけだったのが対応し始めたので、本格的にWSL使っていきたいと思います。

とはいえ、今回はGPU関連の環境構築はしません。

WSLの設定とUbuntuのインストール

省略

パッケージの更新

sudo apt update
sudo apt upgrade

日本語設定

sudo apt install language-pack-ja
sudo update-locale LC_ALL=ja_JP.UTF-8
sudo update-locale LANG=ja_JP.UTF-8

Ubuntuを再起動して設定されていることを確かめる。

タイムゾーンは最初から設定されていそうなので書かない。

しばらく設定をしていると、Warningが出てきたので

sudo locale-gen ja_JP.UTF-8 # 要らないかも?
sudo dpkg-reconfigure locales

で現れた画面で ja_JP.UTF-8 を選択する。

IPAフォントのインストール

sudo apt install fonts-ipafont

最低限の開発環境が入ってるやつのインストール

sudo apt install build-essential

Gitのリポジトリの追加

Gitの最新の安定板を入れられるようにする。

sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt upgrade

Emacsのインストールと設定

この辺りは好みがかなりあるのでそれに合わせて設定する。

sudo apt install emacs

その後、デフォルトのエディタをEmacsにするために

sudo update-alternatives --config editor

Emacsを選択する。

Python周りの設定

とりあえずPyenvとPipenvを使う。

Pyenvの設定

まず、Pyenvに必要なパッケージをインストールする。

sudo apt install libffi-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev

Pyenvのインストールをする。 大体これに従った。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src

.bashrc に以下を追記する。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

変更を反映する。

source ~/.bashrc

Pyenvを用いたPythonのインストールと設定

pyenv install --list でインストールできるPythonのバージョンを確認できる。 とりあえず 3.9.9 をインストールして標準に設定する。

pyenv install 3.9.9
pyenv global 3.9.9

Pipenvのインストール

まずpipをアップデートする。

pip install -U pip

pipenvをインストールする。

pip install pipenv

好みで export PIPENV_VENV_IN_PROJECT=true.bashrc に追記する。

TeX Liveのインストール

sudo apt install texlive-full

かなり時間がかかるので気長に待つ。

その他

何かほかに設定することがあったと思いますが、 思い出せないので思い出したら追記します。

MSYS2の初期設定

インストール

まず、下記からMSYS2をダウンロードしてインストールする。

www.msys2.org

ミラーサイトの設定

JAISTはパッケージの更新が遅いっぽい?のでパッケージのアップデート後とかに設定した方がいいかも

そのままだとダウンロードが遅いのでミラーをJAISTのものを主に使うように設定する。

/etc/pacman.d/mirrorlist.mingw32
/etc/pacman.d/mirrorlist.mingw64
/etc/pacman.d/mirrorlist.msys

これらのファイルそれぞれの一番上に、下記の日本のところをコピペする。 一番上にする理由は、上から順に実行されるようになっているため。

MSYS2国内源 · GitHub

パッケージのアップデート

ミラーの設定が終わったらターミナルを開き、

pacman -Syuu

をアップデートするものが無くなるまで何回かやる。

パッケージのインストール

必要なものをインストールしていく ここは人によってかなり異なる。

pacman -S base-devel
pacman -S msys2-devel
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-emacs
pacman -S openssh
pacman -S git
pacman -S unzip
pacman -S winpty

MSYS2のSSHが環境変数HOMEを参照してくれない

下記のことをした後に見つけたのですが、これの3つ目の解決方法のみ試していなかったのでやるべきでした... なぜか二つ目まではやってもうまくいかなかったんですが(マウントをするとできるようになるという情報も見ました)。

yanor.net

環境変数 HOME を参照してくれず、 /home を参照してしまうのであれば、最初からその場所を使うというだけのお話。 自分の場合は D:\MSYS\USER_NAMEHOME としていたので、再インストールしてインストール場所を D:\msys64\ とし、環境変数 HOMED:\msys64\USER_NAME とした。 その後、元のホームディレクトリにあったファイルやディレクトリなどを持ってきて、ホームディレクトリの場所が変わったことにより何かエラーが出ていれば解決をして終了。