こんにゃくの勉強記

プログラミング好きなとある大学生の勉強メモ的な、日記的なものです

【conda】conda 環境の複製方法

はじめに

あるサーバーに作られた conda 環境を他のサーバーに複製する場面があったため、やり方を調べていました。

複製方法

conda 環境の複製方法には3種類あるようです

  1. conda envconda create を用いる方法
  2. conda listconda create を用いる方法
  3. conca create --clone を用いる方法

1, 2 は別のデバイスに複製する際にも使うことができますが、3は同一デバイス内への複製にしか使えないのではないかと思います。

しかし、同一デバイス内に複製するなら3が一番簡単そうです。

別のデバイスに複製するなら1, 同じデバイスに複製するなら3がいいのではないかと思っています。

1. conda envconda create を用いる方法

conda 環境の情報を yaml ファイルに書き出して複製する方法です。

公式ドキュメントの Exporting the environment.yml file に情報が載っています。

手順は以下の通りです。

まず、複製したい conda 環境を activate します。

conda activate 複製したい環境名

次に、conda 環境の情報を yaml ファイルに出力します。

conda env export > 出力ファイル名.yaml

もしくは、activate せずとも、以下のように -n オプションを用いて複製したい conda 環境を指定することもできます。

conda env export -n 環境名 > 出力ファイル名.yaml

複製先デバイスで次のコマンドを叩けば、yaml ファイルから conda 環境を作成できます。

conda env create -n 環境名 -f 出力ファイル名.yaml

プラットフォームを跨いだ複製の場合は、export の際に --from-history フラグをつけるとよいです。

すると、インストールされているすべてのパッケージではなく、明示的にインストールしたパッケージのみを出力してくれます。

これにより、互換性のない依存先パッケージが yaml ファイルに出力されることを防ぎ、複数プラットフォームで動作するようにすることができます。

2. conda listconda create を用いる方法

conda でインストールしたパッケージ一覧をテキストファイルに書き出すことで複製する方法です。

公式ドキュメントの Building identical conda environments に情報が載っています。

注意点として、同一のプラットフォーム(OS)での複製しかサポートされていません。異なるプラットフォームへの複製では、conda環境が動作しない可能性があります。

また、pip など conda 以外を用いてインストールしたパッケージは出力に含まれないため、注意してください。

手順は以下の通りです。

1.と同様、複製した conda 環境を activate または -n オプションで指定します。

次のいずれかのコマンドを用いて、conda 環境の情報をテキストファイルに出力します。

conda list [-n 環境名] --explicit > 出力ファイル名.txt
conda list [-n 環境名] --export > 出力ファイル名.txt

--explicit--export では出力ファイルの形式が異なりますが、どちらの場合でも同じように、新しい環境の作成に用いることができます。

そして、複製先デバイスで 1. と同じく次のコマンドを叩くことで、複製元と同様の環境を作成することができます。

conda create -n 環境名 -f 出力ファイル名.txt

余談ですが、create ではなく install を用いると、既存の環境に 出力ファイル名.txt の元となった環境のパッケージをインストールすることもできます。

conda install -n 環境名 -f 出力ファイル名.txt

3. conca create --clone を用いる方法

クローンを作成することで、同一デバイス上に conda 環境を複製することもできます。

公式ドキュメントの Cloning an environment に手順が載っています。

コマンドは以下の通りです。

conda create -n 複製先の環境名 --clone 複製元の環境名

各コマンドの使い方

conda create, conda env export, conda list, conda install コマンドの公式ドキュメントを貼っておきます。

終わりに

多様な複製方法があり、面白かったです。

conda と pip を併用している場合に、どうやって複製するのかや、複製して本当に動くのかなどが気になります...

とりあえず併用はしていませんし、セオリーは知ることができたと思うので、もし併用している環境に出会ったらそのときに頑張ります。

参考

【VSCode】再インストールした際の設定(自分用メモ)

はじめに

OS を再インストールしたら色々なものが消えてしまったため、全てインストールし直しています。 せっかくなので、何をどのように設定したのか、自分用にメモを残します。 ここでは VSCode について、記録しています。

環境

環境は次の通りです。

macOS Sonoma ver.14.4.1
Apple M2 Chip
Homebrew 4.2.17
zsh 5.9

インストール

公式サイトのトップページからでも、公式サイトの Mac でのセットアップについてのページからでもインストールできます。

後者では、Installation のセクションの Download Visual Studio Code for macOS. の部分のリンクをクリックするとインストールされます。

code コマンドの有効化

Mac でのセットアップについてのページの方に書いてあるのですが、macOS では、ターミナルで code コマンドを使うにはそのための設定を行う必要があります。

ターミナルから VSCode を起動できるため非常に便利なのですが、自動で導入はされないのですよね。

~/.bash_profile~/.zprofile を直接編集する方法と、VSCode のコマンドパレットを使う方法があるのですが、私は後者で行いました。

公式サイトの通りに設定します。

Cmd+Shift+P でコマンドパレットを立ち上げ、shell command と入力します。

すると、Shell Command: Install 'code' command in PATH という選択肢が出てくるため、選びます。

管理者権限を求められるため、パスワードを入力すると設定が完了するかと思います。

コマンドの具体例はこちらに載っています。

設定の復元

VSCode では、複数端末で設定を同期させることができます。

過去に設定の同期の設定を行なっていれば、新しい端末の導入時や再インストール時にも以前と同じ設定を復元することができます。

VSCode を起動し、左下の方の歯車マークをクリックします。

Turn on Setting Sync を選択し、画面の指示に従って Microsoft または GitHub アカウントでログインします。

ログイン完了後、すぐに設定の同期が始まるはずです。

公式ドキュメント にも画像付きでやり方が載っています。

参考

【git / gh / Oh My Zsh】Mac でのインストールから補完の設定まで(自分用メモ)

はじめに

バックアップをとらずに OS を再インストールしたため、全てが消えてしまいました。

この機会に、インストールしたものの種類や方法を全てメモすることにしました。

まずは Git / GitHub からです。

環境

環境は次の通りです。

macOS Sonoma ver.14.4.1
Apple M2 Chip
Homebrew 4.2.17
zsh 5.9

パッケージの管理には Homebrew を用いています。

インストール

gh

まずは gh をインストールします。

brew install gh

インストールが完了したら、ログインします。

gh auth login

ログイン時に選んだ選択肢は次の通りです。

  1. What account do you want to log into?: GitHub.com
  2. What is your preferred protocol for Git operations on this host?: HTTPS
  3. Authenticate Git with your GitHub credentials?: Yes
  4. How would you like to authenticate GitHub CLI?: Login with a web browser

このように選択すると、ターミナル上に8桁ほどの認証コードが表示されます。

Enter キーを押すとブラウザが開き、GitHub の認証画面が表示されるため、そこに認証コードを入力すればログインが完了します。

これで、GitHub CLI が使用できるようになります。

gh のインストール時に git もインストールされるようで、gh をインストールしただけで git コマンドも使用できるようになっていました。

試しに、適当なプライベート GitHub リポジトリを clone すると、無事に clone されました。

便利設定

git/gh コマンドの補完

git コマンド補完(公式の方法)

結局私は Oh My Zsh というフレームワークで補完を行うことにしたのですが、公式の紹介している方法も見つけたため、書き残しておきます。

「git 補完」で調べると色々な方法がヒットして、どれを使えばいいのかわからなくなるのですが、公式ドキュメントの方法だと一発で成功しました。

~/.zshrc に次の1行を追加します。

autoload -Uz compinit && compinit

~/.zshrc を再読み込みすれば、git コマンドに補完が効くようになります。

そういえば Git の公式ドキュメントを見に行ったことがほぼなかった気がします。これからは積極的に見に行こうと思いました。

Oh My Zsh

先ほど紹介した方法が載っている Git 公式のページでも紹介されている、Oh My Zsh というフレームワークを導入します。

Oh My ZshZsh をカスタマイズ/管理するためのプラグインで、git や gh など、さまざまなコマンドの補完が充実しています。

git プラグインはデフォルトで入っており、Oh My Zsh をインストールするだけで使うことができます。

Oh My Zsh 公式リポジトリを見ながらインストールしていきます。

まずは、curl などを使い Oh My Zsh をインストールします。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

すると、今までの ~/.zshrc~/.zshrc.pre-oh-my-zsh という名前に置き換えられ、新しく Oh My Zsh によって ~/.zshrc が生成されます。

引き継ぎたい設定がある場合は、~/.zshrc.pre-oh-my-zsh から ~/.zshrc に移しましょう。

私は Pyenv や pipx の設定を移しました。

次に、プラグインの設定を行います。

導入したいプラグインを、~/.zshrc に以下のように記述します。

ここでは、git と gh だけ記述しておきます。

plugins=(
    git 
    gh
)

他に使用したいプラグインがある場合は、公式リポジトリの plugins フォルダから探せるようです。

プラグインはコンマでなく空白(スペースやタブ、改行など)で区切る必要があるため、気をつけてください。

インストールして頂けばわかるかと思うのですが、非常に使い勝手が良さそうです。もっと早く知りたかった...

終わりに

今回初めて Oh My Zsh の存在を知ったのですが、git や gh に限らず本当に色々なプラグインを追加できそうです。

Git の補完方法は情報があまりまとまっておらず、設定する難易度が高いイメージがありました。

Zsh 限定にはなりそうですが、このような使い勝手のいいフレームワークを見つけることができて本当に嬉しいです。

git / gh コマンドとその補完を無事にインストールできてよかったです。

参考

【Haskell】$ と . の違いについて

はじめに

Haskell を勉強中なのですが、($) と (.) の使い分けで少し混乱しました。というもの、読んでいた入門書で、($) と (.) が置き換え可能そうな例が載っていたからです。

置き換え可能なのか、私が勘違いしているだけなのかわからなかったため、調べていました。

前提

($) について

($) :: (a -> b) -> a -> b
f $ x = f x
  • ($) 演算子についてわかりやすく説明している記事を見つけました

qiita.com

(.) について

  • (.) の正式名称は調べても出てこないのですが、あえて呼ぶなら「関数合成演算子」のようになるようです
  • その名の通り、関数合成に使われます
  • 定義は以下の通り
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)

置き換え可能な例

例えば、以下のような例で引っかかりました。以下の2つのコードは、両方とも180を返し、同じ挙動をしているように見えます

product $ map (*3) $ zipWith max [1,2] [4,5]
product . map (*3) $ zipWith max [1,2] [4,5]

結論

結論は、「置き換え可能なことも多い」「($) と (.) の定義を考えれば、置き換えられる場合とそうでない場合が見分けられるようになる」だと思います

以下の記事が詳しくてわかりやすかったです。幾つもの具体例を挙げて説明してくださっており、「置き換えられる場合」と「置き換えられない場合」の違いに気づくことができました。私が説明し直すよりわかりやすいかと思うので、同じところで詰まった方は、是非以下の記事を読んでみてください。「($)のNGケース」と「(.)のNGケース」のセクションに、置き換えられない場合の理由が載っています

qiita.com

結局は、($) と (.) 自身やその前後の関数の型で不整合が起きてエラーが出るため置き換えられない、という当たり前の結論になりそうです

終わりに

「置き換えられそうだ」という直感が部分的には合っていたことがわかってよかったです。しかし、直感のままだと置き換えられない場合の理由を説明できないため、綺麗に整理して説明してくださっている記事に出会えて助かりました

【勉強日記】Haskell (1) - 勉強方法・環境構築 -

はじめに

今まで Python はじめ、オブジェクト指向や手続き型の言語ばかり触ってきました。他の書き方も知りたいと思ったため、Haskell を勉強することにしました。

勉強方法

まずは「すごいHaskellたのしく学ぼう!」という有名な本を読んでいこうと思います。

その後は演習として何か動くものを作りたいと思っているのですが、何を作るかは未定です。「Haskell入門 関数型プログラミング言語の基礎と実践」という本の第9, 10章でそれぞれコマンドラインツールと Web アプリの演習ができるようなので、気になっています。

shop.ohmsha.co.jp

gihyo.jp

環境構築

次の Zenn の記事を参考に構築しました。

zenn.dev

環境は

macOS Sonoma 14.2
zsh

で、叩いたコマンドは、

% curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
% source ~/.zshrc

です。GHCup をインストールした後、.zshrc を再読み込みする必要があります。

終わりに

Haskell に対してもっと取っ掛かりづらい印象があったため、「すごいHaskellたのしく学ぼう!」を読んでいて、Haskell の読みやすさやこの本の面白さに驚きました。 まだ最初の方しか読めていないので、早く読み進めたいです。

【R】legend(凡例)だけ出力する

はじめに

R でグラフを描画していたのですが、legend(凡例)だけ出力したい、という場面がありました。 検索ワードが悪かったようで、答えに辿り着くのに少し時間がかかったため、メモとして残しておきます。

方法

以下の Stack Overflow の方法をそのまま使いました。 ggplot2 - How can I create a legend without a plot in R? - Stack Overflow

空のグラフを描画して、その凡例として出力したい凡例を設定すればいいようです。

コード例:

出力:

出力された画像

このままだと余白や画像サイズが不自然なので、png()par() を使用して諸々のサイズを調整するといいと思います。

終わりに

最初は、"R export only legend" のように「legend だけを別ファイルに保存する」ことを意識した検索ワードを使っていたのですが、出てくるのは ggplot を使った例ばかりで、R の組み込みの legend 関数を使った例は全然出てきませんでした。 "R plot only legend" で検索するとようやく引用元の Stack Overflow の記事が出てきました... R に使い慣れていないからわからなかっただけで、よく使われている手法だったりするのでしょうか。とりあえず出力ができてよかったです。

【勉強日記】Bash入門

はじめに

シェルスクリプトの書き方が1ミリも分からなかったので、「シェルスクリプト 文法」で検索してみるなどしていました。 if 文や for 文すら書き方がよく分からないんですよね...シェルスクリプト。 人の書いたシェルスクリプトを読もうにも、何をしているのか挙動が全く分からない部分も多く、「雰囲気で概要を把握する」ことすらできませんでした。

そのため、きちんと情報のまとまったサイトで、一通り文法を押さえておいた方がいいなという結論に至り、勉強することにしました。

読んだ記事

以下の記事がわかりやすかったです。 C# の文法を把握する際にもお世話になったサイトです。

www.tohoho-web.com

この記事を一通り読むだけで、私の見るようなシェルスクリプトで使われている構文はすべて網羅されていると思いますし、スクリプトを書きながら参照する先としても十分です。 このサイトだけでは分からない内容があれば別のサイトを見に行きますが、基本的にはこのサイトだけで大体解決できそうです。

終わりに

Python や Docker などの、普段ターミナルで実行するコマンドをまとめて実行するシェルスクリプトくらいしか書いたことも読んだこともなかったため、それ以外のコマンドに関する勉強にもなりました。 便利そうですし、構文の雰囲気を把握できたので、もしかしたら今後何かの作業の自動化や効率化に使うかもしれません。