予測不可能な決定系

決定論的なのに予測が不可能……つまり, そういうことだよ

vim と WSL 上の Docker で C# プログラムを作成して Github で公開するまで

以前 Bitbucket に公開していた Project Euler を解いたコードがしばらく触っていないうちになくなっていたので1, これを機に新規で環境を用意して Github 上に公開しようとした際の備忘録.

環境は Windows 上の vim で terminal に WSL を使った C# 環境. vim の terminal で WSL を使い docker コマンドが使えることが前提.

WSL から Docker コンテナの dotnet コマンドを使えるようにする

Microsoft の公式イメージ を使って dotnet コマンドを使えるようにする. ついでに .bashrc に

dotnet='docker run --rm -v $PWD:/app -w /app mcr.microsoft.com/dotnet/sdk dotnet'

エイリアスを追加して以下のコマンドだけでサンプルプログラムなどの実行を確認できるようにする.

dotnet run

Project Euler 1問目の解答コードを C# で書く

作業ディレクトリに移動して

dotnet new console

でテンプレートを作成して Project Euler の1問目をとりあえず解いてみる. 使用した vim の環境はひとまず vim-lsp-settingsC# 用の Language Server を用意して自動補完ができるようにしたのと, caw.vimでコメントのオン・オフをトグルできるようにしたくらい.

ひとまず最低限のコードを書いて問題なく正解を出力できることを確認.

git リポジトリの作成

次に何も考えずに

git init

としてリポジトリを初期化したが, よく考えるとこの時にできるデフォルトのブランチ名は master である. 今後のことを考えるとデフォルトでできるブランチ名を main にしておいたほうがいいかもしれない2. 途中で何故かエラーで git 操作(status や add や諸々)ができなくなったが一度親ディレクトリに移動すると解決した. もしかしたら途中でディレクトリの名前か何かを変更したのかもしれない. 調べてすぐに解決したから良かったけど.

stackoverflow.com

あとは

dotnet new gitignore

で .gitignore を作成し, vim の swap ファイルも無視するように記載.

dotnet コマンドでできる .gitignore だと自分の環境の場合過剰すぎるけど, このファイルに関してはそれでも問題ないと判断.

ここまでで commit してローカルの作業は一旦完了し, リモートの準備をして push すればいいだけ(のはずだった).

Githubリポジトリを作成

Github 上で新規にリポジトリを作成して, ローカルでリモートリポジトリとして登録する3. ここで Github で2段階認証の設定をしていなかったことを思い出して2段階認証の設定をした. ただし, 2段階認証にすると push 等のコマンドラインでの操作時のパスワードによる認証の方法が変更される.

docs.github.com

そこで SSH キーによる認証に切り替えるべくローカルで鍵を作成する. ただし, この時に Windows 側のディレクトリで鍵を作成するとパーミッションが意図したものにはならないので Linux 側のディレクトリで作成する必要がある. これについては以下を参考に解決した.

qiita.com

それ以外で鍵の作成方法や Github への登録方法は以下を参考にするとよい.

docs.github.com

ここまでで認証自体は通るようになったがこの段階だとローカルのブランチ名が master なのでこのまま push するとリモートで main(デフォルト)と master の2つのブランチができることになる. これは本意ではないので今度はローカルのブランチの名前を main に変更してから push する必要がある. そしてローカルのブランチ名を main に変更しても今度はリモートリポジトリにあるライセンスファイルや README ファイルがないので一度 pull する必要がある. ここで単に

git pull origin main

とすると別のエラーになる.

考えてもみればローカルリポジトリとリモートリポジトリはそれぞれ別に作成された関連付けのないリポジトリなので, 単純にマージしようとしても出来ないのが当然であるべき. なので, 以下を参考に

git merge --allow-unrelated-histories origin/main

とすることで強制的に同期させる.

qiita.com

ここまできてようやく

git push origin main

でローカルに作成したコード一式を Githubリポジトリに push して公開することができた.

感想とまとめ

今回公開したリポジトリは以下になる.

github.com

今後の反省としては予めローカルで作成するリポジトリの名前も main に変更しておくとか

chiroru-memo.hatenablog.com

そもそも最初に Github 上でリポジトリを作成してクローンしてから作業するのが混乱が少なそう. 想定されるシナリオはローカルで何かコードを書いていて途中でリポジトリの作成と公開をしたくなった場合は, リポジトリをローカルで作成せずに最初に Github 上で作成してから clone してローカルのファイルを add なり push なりをするのが良さそう. つまりこの場合は自分で git init と打つ必要はなさそう.

解いていくうちに vim 上の環境をより良くしたくなったり(たぶんスニペットとか欲しくなる), 解答を改良したくなったり, 別の言語で解きたくなったりした際に新規でリポジトリを作成することがあるだろから, その時は今回踏んだエラー等に気をつけながら進めたいものです.


  1. たぶん Mercurial で管理していて何もせずに2020年8月を迎えたのだと思う https://bitbucket.org/blog/sunsetting-mercurial-support-in-bitbucket

  2. https://github.blog/2020-07-27-highlights-from-git-2-28/

  3. git remote add origin [REMOTE_URL]