oTreeのインストール

# oTreeとは
**オンライン上で実験を行うためのツールで、Pythonで実装されたWebアプリケーションフレームワークのDjangoをベースとしています。現在の最新バージョンは、v5.10.2 (2022/12/05)です。**
## oTreeの情報が少ない(特に日本語での情報)
oTreeはHerokuでの稼働を強く推奨しており、自前のサーバー上で動かすために必要な情報が断片化している現状があります。また、公式ドキュメントは存在しているものの、内容が薄かったことから自前でoTreeサーバーの起動に成功したときの情報をまとめています。
インストール手順として、「Windows」版と「Ubuntu」版を記載しています。


# oTreeの新規インストールと設定
:::note info
Windows利用者向けです(Ubuntu版は下にあります)
:::

基本的に、PythonをMicrosoftストアor公式サイトからダウンロード＆インストールして、ライブラリーを取得することで、oTreeの事前準備が完了します。
詳しい手順は公式ドキュメントが参考になるのでそちらをご覧ください。(丸投げ)

https://otree.readthedocs.io/ja/latest/install-windows.html#install-windows

**ここで気を付ける必要があるのは、Onedriveを利用している場合です。**
OneDriveは、同期タイミングによってファイルが重複したり、破損したりすることがあるため、oTreeのプロジェクトフォルダを置かないように注意しましょう。

:::note warn
ここからUbuntu向けになります
:::

### 以下の手順でインストールできます
Ubuntu版では基本的にコマンド操作となるので、抵抗のある人はHerokuとかでラクしてください。ちなみに、PostgreSQLの公式サイトに書いてあるクイックスタートの通りにインストールしようとするとエラーが発生したのですが、Repository keyをsudo apt-key addでインポートすることで問題なくインストールできます。この記事を書いている時点では、PostgreSQLの新しいバージョンとしてpostgresql-14が公開されていましたので、こちらを利用します。

```bash:新規にoTreeをインストールする場合
sudo apt-get update && apt-get upgrade -y
sudo apt-get install python3 python3-pip libpq-dev vim 
pip install --upgrade pip
pip install -U otree psycopg2

#ここからはDB
sudo apt install curl ca-certificates gnupg
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt-get update
sudo apt-get install postgresql
sudo -u postgres -i
createuser --createdb --username=postgres --pwprompt limiteduser
##パスワードの設定を要求されるので設定する(1)##
psql
>CREATE DATABASE otree_db;
>\q


#最後に環境設定
export OTREE_ADMIN_PASSWORD=test  #←oTreeの管理用パスワードを設定
export DATABASE_URL=postgres://limiteduser:(1)で設定したパスワードを入力@localhost/otree_db
export OTREE_AUTH_LEVEL=STUDY
export OTREE_PRODUCTION=1
```
### 追記
oTreeドキュメントではpostgres://postgres@localhost/django_dbが例示されていますが、必要以上に権限があるとセキュリティ的に良くないので、新しく権限を絞ったユーザーを作成し利用した方が安全です。

## oTreeが利用するDBのリセットを行い、データベースエンジンをsqliteからpostgresqlに切り替える。
DATABASE_URLにpostgresの接続先を設定しているので、データベースを一度リセットしましょう。
途中でデータを消去しても良い？と尋ねられますが、ｙで進めて大丈夫です。次に、正常に稼働するかを確認するため、ポート8000でサーバーを起動します。FirefoxやEdgeなどのブラウザからlocalhost:8000で接続できていれば確認OKです。

```python
otree resetdb -y
otree prodserver 8000 or otree devserver
```

## 環境変数の永続化設定
この状態でも使えますが、ログアウトしたら環境変数が消えてしまうので、永続化するための設定をします。
環境変数は、グローバル設定にしておくことで設定忘れを防止します。(.profileに設定しても良いです)

```
sudo vim /etc/profile
##一番下にexport~を追加する##

    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

export OTREE_ADMIN_PASSWORD=test　#←oTreeの管理用パスワードを設定
export DATABASE_URL=postgres://limiteduser:(1)で設定したパスワードを入力@localhost/django_db
export OTREE_AUTH_LEVEL=STUDY
export OTREE_PRODUCTION=1
```

# 最後に
#### インストール中に困ること
インストール中にこんな画面が出るとパニックになるかもしれませんが、ライブラリーが足りていないだけなので、sudo apt-get install libpq-devで解決します。
```python:psycopg2インストール中のエラー表示
      In file included from psycopg/adapter_asis.c:28:
      ./psycopg/psycopg.h:36:10: fatal error: libpq-fe.h: No such file or directory
         36 | #include <libpq-fe.h>
            |          ^~~~~~~~~~~~
      compilation terminated.
      
      It appears you are missing some prerequisite to build the package from source.
      
      You may install a binary package by installing 'psycopg2-binary' from PyPI.
      If you want to install psycopg2 from source, please install the packages
      required for the build and try again.
      
      For further information please check the 'doc/src/install.rst' file (also at
      <https://www.psycopg.org/docs/install.html>).
      
      error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
```

### Ubuntu22.04LTSでのkeyインポートについて
apt-key addコマンドを実行するとこんな警告が表示されます。将来的にapt-key addが廃止されるという案内ですが、今のところコマンドが使えるので、放置で良いと思います。
```bash:apt-key addの後
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
```

### 変更点がたくさん
2022年に入ってからもoTreeに色々と変更が加えられているので、自分なりに現時点でのまとめを作ってみました。
主な変更点は以下の通り。
・models.pyとpages.pyが統合されて「＿init＿.py」に
・進行状況によって使い分けていたplayer.payoff, self.payoff, self.player.payoffの3つが「player.payoff」1つに統合された
・アプリの作成で生成されるフォルダの構造が変化(templatesフォルダが無くなった)
・アプリフォルダ内にあるHTMLに{% extends "global/Page.html" %}と{% load otree %}を設置することが不要に
・アプリフォルダ内にあるHTMLで使用する{{ formfields }}や{{ next_button }}などのテンプレートタグに「%」をつける必要がなくなった
・＿init＿.pyで定義するClassの中にある「Constants」が、略して「C」だけになっている [class Constants(BaseConstants) → class C(BaseConstants) ]
・ライブラリの読み込みを記述するときに、from otree.api import Currency as c, currency_rangeやfrom otree.api import Page, WaitPageとしていたものがfrom otree.api import *だけで済むように
・class C(BaseConstants):で定義するものが「大文字」に変更 [name_in_url → NAME_IN_URL ]

まだまだ変更点があるのですが、書いているときりが無いのでここまでにしておきます。下のリンクに詳しい変更点が書かれているので、ぜひ読んでみてください。

https://www.otree.org/newformat.html

印象としては、全体的に簡素化しようとしている感じですかね。
バージョンが違うと動かない部分もあるので気をつけたいところです。

# 参考サイト

https://otree.readthedocs.io/ja/latest/server/ubuntu.html

https://otreecb.netlify.app/reference/ubuntu_server_setup.html

https://wiki.postgresql.org/wiki/Apt