Anacondaの有償化に伴いminiconda+conda-forgeでの運用を考えてみた

#はじめに
[こちらの記事](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc) でご存じの方も多いと思うが、商用利用(定義については後述)における Anacondaリポジトリの利用が有償化されたようである。
回避策として、[こちらの記事] (https://qiita.com/c60evaporator/items/ba41cef4b37465c39948)にもあるように、pyenv等をつかえばよいのではないかという話もあるが、ケモインフォマティシャンが良く使うRDKitは実質condaでしか配布されていないため、condaを使わざるを得ない状況である。
最初の記事によれば、miniconda+conda-forgeの運用であれば影響は受けなさそうとのこと。そこで、今回、miniconda+conda-forgeで運用を考えてみた。

# 情報整理
まずは変更されたAnconda Individual Editionの[Terms of Service](https://www.anaconda.com/terms-of-service)を確認する。

```To avoid confusion, “commercial activities” are any use of the Repository which is NOT:```の後に、商用利用外の定義が記載されてり、これ以外は全て商用利用と定義する旨記載されている。

良く分からないのが対象のリポジトリの範囲である。Anacondaには、Thrid-Partyのリポジトリも数多くあり、我らがRDkitもconda-forgeから利用できる。これらも対象なのかどうか、このTOSからでははっきりしない。

そこでさらに情報を得るべく、conda-forgeのブログを見てみると以下に重要な情報があった。
https://conda-forge.org/blog/posts/2020-11-20-anaconda-tos/
上にはっきりと "The TOS change does **not apply to conda-forge , nor to other channels hosted on anaconda.org** "と書かれている。

ということから、anacondaの"default"のチャネルを使わなければよさそうだ。

#miniconda+conda-forge による運用対処編
minicondaはすでにインストールされている前提とする。

## condaのチャネルの設定からdefaultsチャネルを削除
まずは、anacondaの"default"のチャネルを使わないよう設定する。

```
%conda config --remove channels defaults  
%conda config --show channels
 channels:
 - conda-forge
```

channesからdefaultsが消えていればOKだ。
この状態でpytnon3.7の仮想環境を作り、activateして以下のようにscikit-learnの古いバージョンを指定してインストールしようとしても、conda-forgeにそのバージョンがないため、インストールはされないはずだ。

```
conda install scikit-learn===0.19
```

これは正しい動作である。最も、defaultsチャネルにしかない古いバージョンを使いたい場合、conda-forgeでは対応できないので、他の手段で対応する必要がある。

一方で、install時に```-c```オプションで明示的にチャネルをconda-forgeに指定した場合、以下のようにdefaultsチャネル(pkgs/main)のものが勝手に含まれてしまう。condaの設定からdefaultsチャネルを削除していた場合もこの動作になるため、**注意が必要**だ。

```
conda install scikit-learn===0.19 -c conda-forge

<中略>

The following NEW packages will be INSTALLED:

  blas               pkgs/main/win-64::blas-1.0-mkl
  icc_rt             pkgs/main/win-64::icc_rt-2019.0.0-h0cc432a_1
  intel-openmp       conda-forge/win-64::intel-openmp-2020.3-h57928b3_311
  mkl                pkgs/main/win-64::mkl-2018.0.3-1
  numpy              pkgs/main/win-64::numpy-1.11.3-py37h53ece5f_11
  numpy-base         pkgs/main/win-64::numpy-base-1.11.3-py37h8128ebf_11
  scikit-learn       pkgs/main/win-64::scikit-learn-0.19.2-py37heebcf9a_0
  scipy              pkgs/main/win-64::scipy-1.1.0-py37hc28095f_0
  tbb                conda-forge/win-64::tbb-2020.2-h2d74725_3
  tbb4py             conda-forge/win-64::tbb4py-2020.2-py37h8c56517_3

```

conda-forge以外のチャネルからもインストールする場合は、```-c```を指定することもあるだろうからこれでは困る。そこで、```-c```　オプションでチャネルを指定する場合は、```--override-channels```オプションも合わせて指定するとよい。

```
conda install scikit-learn===0.19 -c conda-forge --override-channels
```

この指定により、```defaults```チャネルや、```.condarc```に記載したチャネルを検索しないようにすることができる。

## まとめ
以上をまとめると、以下のようになる。

- condaのチャネルの設定からdefaultsチャネルを削除する。
- インストール時に```-c```オプションを指定する時は、勝手にdefaultsまたは.condarcに登録したチャネルが検索されないよう、```--override-channels```オプションを併用する。
- インストール するかどうかの確認の画面でyを入力するときに、defaultsチャネルのものが混じってないか目視で確認する(これ地味に大事ですね）

Hava a good miniconda & conda-forge life !


#おわりに
- RDKitについては、昔、頑張って検証した記事 [RDKitをWindows環境でビルドする](https://qiita.com/kimisyo/items/5a651eb84c5111ab5bdc) のように自力でビルドするか、miniforgeプロジェクトに期待している。
- 普段何気なく使っているconda-forgeとかについて、もう少し理解を深める必要がある。勉強がてらgithubに作成した自分のライブラリをconda-forgeに登録してみても面白い。
- この記事で記載している内容は、一個人の見解であり、一切の責任を負いません。

# 参考
- [Anaconda パッケージリポジトリが「大規模な」商用利用では有償になっていた](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc) 
- [Anacondaが有償化されて困っている人に贈る、Pythonのパッケージ管理] (https://qiita.com/c60evaporator/items/ba41cef4b37465c39948)