📦

botter のための開発環境 (Dev Containers)

2022/12/03に公開約9,400字

この記事は 仮想通貨botter Advent Calendar 2022 4 日目の記事です。

こんにちは、まちゅけん (@MtkN1XBt) です!

今回は VS Code の「Dev Containers」機能と「GitHub Codespaces」というサービスを用いて仮想通貨 bot の開発に適した環境構築の方法をご紹介していきます 🚀

✨ ソリューション

  • 🤔 bot 作りたいけどそもそも環境構築も何も分からない ...
    • ✅ 全て自動で環境を構築できる
  • 🤔 新しい開発環境を構築したいが、今の環境を壊したくない ...
    • ✅ 今の環境とは別に新しい環境を簡単に作ったり消したりできる
  • 🤔 Cloud9 のように複数の端末からアクセスしたい ...
    • ✅ どのような端末 (Windows, macOS, Web ブラウザ) からでも同様の環境にアクセスできる
  • 🤔 今の環境の Python バージョンが古い / 分析に Jupyter を使いたい / データベースを使いたい ...
    • ✅ 最新の Python 3.11 をインストール済み
    • ✅ VS Code 上の Jupyter Notebook をインストール済み
    • ✅ MongoDB をインストール済み
    • ✅ これらは全て任意のバージョンを指定したり、インストール対象から外すことが可能
  • 🤔 綺麗な Python コードを書きたい ...
    • ✅ フォーマッター (コード自動整形) とリンター (静的解析) を設定済み

この記事について

対象読者

  • VS Code を利用してコーディングをする方
  • 主に Python で bot 開発をする方 (別言語でも参考にすることは出来ます)

説明しないこと

  • bot のプログラミング
  • bot のアルゴリズム

仮想通貨 bot, botter とは

仮想通貨 bot って何 ? と辿り着いた Zenn ユーザーの方は Hoheto 氏の記事がすすめです。

https://note.com/hht/n/n61e6ecefd059
https://qiita.com/hoheto/items/299b7eef1dbb8155966f

前記事

本投稿から 1 年前 note に書いた環境構築方法の note 記事です。 クラウド上にレガシー (コンテナを使わない) な環境構築の説明となっています。

https://note.com/mtkn1/n/nbc33e765558b

はじめに

Dev Containers について

Dev Containers は Docker のコンテナ技術を利用して、予め定義した情報を元に開発環境を構築する主に VS Code の機能です。

コンテナ技術は Web の世界では広く使われており、Web アプリをコンテナ化してインターネット上に公開するといったケースで利用されています。 コンテナは作成済みのアプリケーションをいくらでも複製して動かせて、しかも軽量というのが長所です。

そのコンテナ技術の長所を活かして Microsoft が「アプリの実行だけでなくて VS Code のコーディング環境としても使えるようにしようぜ!」として作られたのが Dev Containers です。 本記事では bot 開発に適した開発コンテナ定義 を紹介してきます。

また Docker 及びコンテナの知識がなくても問題がありません。 Dev Containers は UI 上の操作だけで構築できます。 本記事で紹介した環境をカスタマイズする場合に Docker の知識が少し必要になってきます。

GitHub Codespaces について

先日無料枠が発表された GitHub のクラウド開発環境です。

https://github.co.jp/features/codespaces

Codespaces は VS Code と Dev Containers に完全対応しており、しかも 60 時間までなら無料で利用できます!

Dev Containers はローカルマシンなどでも利用できますが、 Codespaces はお手軽すぎる最強の環境 なので是非使ってみましょう✨

本記事では Codespaces の基本的な使い方を説明していきます。

事前準備

最低限 GitHub アカウントと Web ブラウザのみあれば利用できます!

  1. GitHub アカウント

GitHub アカウントは Free プランでも利用することができ、無料枠の Codespaces の利用にはクレジットカードを登録する必要すらがありません

まだ GitHub アカウントがない方は作成しておきましょう。
https://github.com/

  1. VS Code

Codespaces はローカルの VS Code から接続することが可能です。

やはり Web ブラウザから利用するよりも、動作性の良いローカルの VS Code から利用するのが良いでしょう。 もし VS Code をインストールしていなければインストールしておきましょう。

https://code.visualstudio.com/Download

  1. VS Code 拡張機能

上記の通りローカルの VS Code を接続するのに必要な拡張機能です。 クリックするだけなのでインストールしておきましょう。

https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces

開発コンテナを起動する 🚀

では実際に開発コンテナを起動して環境を展開してみましょう! Web と VS Code の 2 通りの方法を説明します。

Web

弊テンプレートリポジトリのページを開いてください。

https://github.com/MtkN1/bot-dev-container

Codespaces タブから Create codespace on main ボタンをクリックします。

これで開発環境の展開が始まるので暫く待ちましょう 🍵

Web で作成してから VS Code で開く

Web で作成したコンテナをあとから VS Code で開くことも可能です。

コンテナ名横の ... ボタンから Open in ...Open in Visual Studio Code を選択することでローカルの VS Code が接続できます。

VS Code

開発コンテナの作成から全て VS Code 上で操作することも可能です。

左下緑色「><」ボタンから Create New Codespace をクリックする。

入力欄に弊リポジトリ URL を入力する。

URL
https://github.com/MtkN1/bot-dev-container


main ブランチを選択する。

2cores, 4 GB RAM, 32 GB storage を選択する。

コンテナの構築が始めるので暫く待ちましょう 🍵

Hello Dev Container

おめでとうございます! これで bot 開発環境が構築されました 🎉

弊 Dev Containers テンプレートによって様々な機能がインストールされているのでその内容を見ていきましょう!

Python 3.11

bash
$ python -V
Python 3.11.0

ターミナルで上記コマンドを実行してみると、最新版の Python 3.11.0 がインストールされていることが確認できますね。

Python はバージョンが上がるごとに機能が増えるものの、OS に搭載されているバージョンが古かったり、OS の Python より新しいバージョンをインストールするのにやや知識が必要ですが、 Dev Containers なら簡単に最新版の環境を構築できます 🐍

Python 3.11 ではランタイムが高速化されていたりまします。
https://www.python.jp/news/wnpython311/index.html

使ってみる

  1. ファイルを開く

src/main.py に bitFlyer の BTC 価格を取得するサンプルコードが書かれたファイルがあるので開いてください。

src/main.py
import json
import urllib.request


def main():
    with urllib.request.urlopen("https://api.bitflyer.com/v1/ticker") as resp:
        data = json.load(resp)
    print(data)


if __name__ == "__main__":
    main()
  1. 実行

VS Code 右上の ▶️ ボタンで Python ファイルを実行できます。

stdout
{'product_code': 'BTC_JPY', 'state': 'RUNNING', 'timestamp': '2022-12-03T20:21:59.9', 'tick_id': 6237940, 'best_bid': 2284730.0, 'best_ask': 2285003.0, 'best_bid_size': 0.1892452, 'best_ask_size': 0.135, 'total_bid_depth': 787.95580323, 'total_ask_depth': 394.31004181, 'market_bid_size': 0.0, 'market_ask_size': 0.0, 'ltp': 2285003.0, 'volume': 2984.26432019, 'volume_by_product': 496.42557357}

しっかりと Python が実行されていることが確認できます。

Poetry

Poetry は Python の依存関係を管理するライブラリです。

https://python-poetry.org/

bot を実装するには殆どの場合様々なライブラリを利用すると思いますが、pip だけで管理していると依存関係のバージョンが不明確になったり壊れたりすることがあります。 これを明確に管理して解決するのが Poetry です。 bot を実行環境にデプロイするときも依存関係に問題があると動いてくれないので Poetry で管理するのは重要です。

覚えることが増えるのは大変かもしれませんが取り敢えずこの 2 つのコマンドだけ使えれば大丈夫です。

bash
# パッケージを追加でインストールする
poetry add <some-package>
# pyproject.toml の内容を全てインストールする (このコマンドは環境構築後に自動で実行されている)
poetry install

使ってみる

では実際にパッケージを追加してみましょう。

先ほどの src/main.py サンプルコードは標準ライブラリ urllib.request を利用したいましたが、より使いやすい requests パッケージを追加して requests で API リクエストをするようにします。 下記コードを src/main.py に上書きで貼りつけてください。

  1. パッケージの追加
bash
poetry add requests
  1. コードの上書き
src/main.py
import requests


def main():
    r = requests.get("https://api.bitflyer.com/v1/ticker")
    data = r.json()
    print(data)


if __name__ == "__main__":
    main()
  1. 実行

VS Code 右上の ▶️ ボタンで Python ファイルを実行できます。

追加された requests パッケージが利用できているのが確認できますね。

Formatter / Linter

Formatter として blackisort, Linter として flake8 を適用してあります。

コードを保存すると、改行や行の長さなどイケてない箇所と import の順序が自動で整形され、構文エラーになっている箇所が表示されます。 最初は "こっちの方が見易いのに勝手に書き換えらる!" と思うかもしれませんが、Formatter と Linter は保守性の高いコードを書くのに欠かせません。 特に black は多くの Python プロダクトで利用されているので、俺流はやめてフォーマットは black に任せてしまいましょう。

black, isort で手動フォーマットされる例 (これがコード保存時に実行されます)

Jupyter Notebook

VS Code 上で動く Jupyter Notebook です。 拡張子 .ipynb のファイルを作成するたけで利用できます。 本家の Web ブラウザ版より補完がしっかり効くので扱いやすいです。

使ってみる

src/analysis.ipynb に BTC 価格取得サンプルと同様の Notebook コードがあるので確認してみてください。

MongoDB

NoSQL データベースです。 スキーマレスなので、テーブルを作らずに bot が API で扱う JSON データを保管したりするのに便利です。

https://www.mongodb.com/ja-jp

使ってみる

Python で MongoDB を利用するために必要なパッケージはインストール済みなので試してみましょう。

  1. 実行する

src/mongo.py を実行してみてください。 同様に BTC の価格を取得しますが、それを MongoDB に格納して、格納したドキュメントを取得して表示しています。

  1. 拡張機能を確認する

このテンプレートには MongoDB の拡張機能もインストール済みです。

左から MongoDB の葉っぱアイコンをクリックして拡張機能から DB の中身を確認してみてください。

And more!

以上の機能は .devcontainer ディレクトリ配下に格納されている devcontainer.json docker-compose.yml Dockerfile によって定義されています。 他のソフトウェアを追加したりするにはちょっとした Dockerfile の知識などが必要になってきます。

開発コンテナを使うのに慣れてきたら今度は Dev Containers や Docker の書き方を覚えて、好きなソフトウェアを追加してあなた好みの環境を作りましょう!

https://code.visualstudio.com/docs/devcontainers/containers
https://docs.docker.com/engine/reference/builder/

bot を開発する

上記までの例では弊リポジトリそのまま複製して機能を試していました。 それだと名前が bot-dev-container のままなので 弊リポジトリをテンプレートとして新規作成 しましょう。

これでテンプレートを引き継いで自分の GitHub アカウントに任意の名前を付けてリポジトリを作成することができます!

このテンプレートでは 1 リポジトリ = 1 bot として管理する構成になっています。 src/main.py のファイルを bot のメインファイルとして使用しましょう。

この開発環境を使ってガンガン bot をコーディングしちゃいましょう 🚀

Codespaces を節約する

こまめに Codespaces を停止して無料枠の時間を節約しましょう 💸

左したの緑色「><」ボタンから Stop Current Codespace を選択する。

おわりに

以上、Dev Containers と GitHub Codespaces を活用した bot の開発環境構築の方法でした!

自分のテンプレートリポジトリは Python 開発の設定ノウハウをまとめ込んだようなものなのでそのまま使ってもいいのですが、Dockerfile などが分かれば是非カスタムしたりして使ってみてください 😎

GitHub Codespaces はホント神サービスだと思うので無料枠は取り敢えず使っちゃって、気に入ったら課金しましょう。

Dev Containers に関しては Codespaces でなくともローカルでも利用できるので、費用を抑え叩ければローカルに環境を作っても良いかもしれません。 ローカルの場合は Docker Desktop などが必要になってきますが、解説記事も多いと思うので適宜探してみてください。

「実行環境」について

Codespaces での開発環境の紹介をしましたが、実はこれだと 「開発」はできても「実行」させておくことはできません 。 Codespaces は切断後コンテナが止まるので、bot をバックグラウンドで動かしたとしても停止していまいます。 そもそも動かし続けていたら無料枠を食いつぶしてしまいます。

なので bot を動作させ続けるには開発したソースコードを別のサーバーにデプロイする必要があります。 このベストプラクティスについてはまた別の機会に解説しようかと思います 🐳


本記事の疑問や指摘があればお気軽にコメント欄か、以下 SNS までどうぞ!

Twitter のフォローよろしくお願いします 🙇‍♂️
https://twitter.com/MtkN1XBt

botter 向けの OSS ライブラリ pybotters も Star よろしくお願いします 🙇‍♂️
https://github.com/MtkN1/pybotters

Discord もご参加ください 🙇‍♂️
https://discord.com/invite/CxuWSX9U69

Zenn のスキやバッジも頂けると励みなります 🙇‍♂️
https://zenn.dev/mtkn1

最後まで読んで頂きありがとうございました 😊

Discussion

ログインするとコメントできます