botter のための開発環境 (Dev Containers)
この記事は 仮想通貨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 氏の記事がすすめです。
前記事
本投稿から 1 年前 note に書いた環境構築方法の note 記事です。 クラウド上にレガシー (コンテナを使わない) な環境構築の説明となっています。
はじめに
Dev Containers について
Dev Containers は Docker のコンテナ技術を利用して、予め定義した情報を元に開発環境を構築する主に VS Code の機能です。
コンテナ技術は Web の世界では広く使われており、Web アプリをコンテナ化してインターネット上に公開するといったケースで利用されています。 コンテナは作成済みのアプリケーションをいくらでも複製して動かせて、しかも軽量というのが長所です。
そのコンテナ技術の長所を活かして Microsoft が「アプリの実行だけでなくて VS Code のコーディング環境としても使えるようにしようぜ!」として作られたのが Dev Containers です。 本記事では bot 開発に適した開発コンテナ定義 を紹介してきます。
また Docker 及びコンテナの知識がなくても問題がありません。 Dev Containers は UI 上の操作だけで構築できます。 本記事で紹介した環境をカスタマイズする場合に Docker の知識が少し必要になってきます。
GitHub Codespaces について
先日無料枠が発表された GitHub のクラウド開発環境です。
Codespaces は VS Code と Dev Containers に完全対応しており、しかも 60 時間までなら無料で利用できます!
Dev Containers はローカルマシンなどでも利用できますが、 Codespaces はお手軽すぎる最強の環境 なので是非使ってみましょう✨
本記事では Codespaces の基本的な使い方を説明していきます。
事前準備
最低限 GitHub アカウントと Web ブラウザのみあれば利用できます!
- GitHub アカウント
GitHub アカウントは Free プランでも利用することができ、無料枠の Codespaces の利用にはクレジットカードを登録する必要すらがありません。
まだ GitHub アカウントがない方は作成しておきましょう。
- VS Code
Codespaces はローカルの VS Code から接続することが可能です。
やはり Web ブラウザから利用するよりも、動作性の良いローカルの VS Code から利用するのが良いでしょう。 もし VS Code をインストールしていなければインストールしておきましょう。
- VS Code 拡張機能
上記の通りローカルの VS Code を接続するのに必要な拡張機能です。 クリックするだけなのでインストールしておきましょう。
開発コンテナを起動する 🚀
では実際に開発コンテナを起動して環境を展開してみましょう! Web と VS Code の 2 通りの方法を説明します。
Web
弊テンプレートリポジトリのページを開いてください。
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 を入力する。
https://github.com/MtkN1/bot-dev-container
main
ブランチを選択する。
2cores, 4 GB RAM, 32 GB storage
を選択する。
コンテナの構築が始めるので暫く待ちましょう 🍵
Hello Dev Container
おめでとうございます! これで bot 開発環境が構築されました 🎉
弊 Dev Containers テンプレートによって様々な機能がインストールされているのでその内容を見ていきましょう!
Python 3.11
$ python -V
Python 3.11.0
ターミナルで上記コマンドを実行してみると、最新版の Python 3.11.0 がインストールされていることが確認できますね。
Python はバージョンが上がるごとに機能が増えるものの、OS に搭載されているバージョンが古かったり、OS の Python より新しいバージョンをインストールするのにやや知識が必要ですが、 Dev Containers なら簡単に最新版の環境を構築できます 🐍
Python 3.11 ではランタイムが高速化されていたりまします。
使ってみる
- ファイルを開く
src/main.py
に bitFlyer の BTC 価格を取得するサンプルコードが書かれたファイルがあるので開いてください。
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()
- 実行
VS Code 右上の ▶️ ボタンで Python ファイルを実行できます。
{'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 の依存関係を管理するライブラリです。
bot を実装するには殆どの場合様々なライブラリを利用すると思いますが、pip だけで管理していると依存関係のバージョンが不明確になったり壊れたりすることがあります。 これを明確に管理して解決するのが Poetry です。 bot を実行環境にデプロイするときも依存関係に問題があると動いてくれないので Poetry で管理するのは重要です。
覚えることが増えるのは大変かもしれませんが取り敢えずこの 2 つのコマンドだけ使えれば大丈夫です。
# パッケージを追加でインストールする
poetry add <some-package>
# pyproject.toml の内容を全てインストールする (このコマンドは環境構築後に自動で実行されている)
poetry install
使ってみる
では実際にパッケージを追加してみましょう。
先ほどの src/main.py
サンプルコードは標準ライブラリ urllib.request
を利用したいましたが、より使いやすい requests
パッケージを追加して requests で API リクエストをするようにします。 下記コードを src/main.py
に上書きで貼りつけてください。
- パッケージの追加
poetry add requests
- コードの上書き
import requests
def main():
r = requests.get("https://api.bitflyer.com/v1/ticker")
data = r.json()
print(data)
if __name__ == "__main__":
main()
- 実行
VS Code 右上の ▶️ ボタンで Python ファイルを実行できます。
追加された requests パッケージが利用できているのが確認できますね。
Formatter / Linter
Formatter として black と isort, 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 データを保管したりするのに便利です。
使ってみる
Python で MongoDB を利用するために必要なパッケージはインストール済みなので試してみましょう。
- 実行する
src/mongo.py
を実行してみてください。 同様に BTC の価格を取得しますが、それを MongoDB に格納して、格納したドキュメントを取得して表示しています。
- 拡張機能を確認する
このテンプレートには MongoDB の拡張機能もインストール済みです。
左から MongoDB の葉っぱアイコンをクリックして拡張機能から DB の中身を確認してみてください。
And more!
以上の機能は .devcontainer
ディレクトリ配下に格納されている devcontainer.json
docker-compose.yml
Dockerfile
によって定義されています。 他のソフトウェアを追加したりするにはちょっとした Dockerfile の知識などが必要になってきます。
開発コンテナを使うのに慣れてきたら今度は Dev Containers や Docker の書き方を覚えて、好きなソフトウェアを追加してあなた好みの環境を作りましょう!
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 のフォローよろしくお願いします 🙇♂️
botter 向けの OSS ライブラリ pybotters も Star よろしくお願いします 🙇♂️
Discord もご参加ください 🙇♂️
Zenn のスキやバッジも頂けると励みなります 🙇♂️
最後まで読んで頂きありがとうございました 😊
Discussion