aliceの技術ブログ

技術ブログ

DockerでMySQLを利用してみたら思いのほか便利だった。

DockerでMySQLを利用してみたら思いのほか便利だった件

環境

  • Windows10 64bit Home
  • Docker Desktop
  • Docker version 24.0.7
  • MySQL Workbench

dockerでMySQLを扱う

dockerにmysqlのイメージをインストールする。 インストールコマンドは以下の通り。 docker pull mysql

docker-compose.ymlを記述する。

version: "3"

services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: <password>
      MYSQL_DATABASE: "testDB"
      MYSQL_USER: <username>
      MYSQL_PASSWORD: <user_password>
      TZ: "Asia/Tokyo"
    ports:
      - 13306:3306
    volumes:
      - db-store:/vol/mysql

volumes:
  db-store:

基本的にはdockerの公式サイトの通り。

MYSQL_ROOT_PASSWORDはrootのパスワードを設定します。

MYSQL_USER, MYSQL_PASSWORDはユーザ名およびユーザパスワードを設定します。

portsは13306:3306を指定しています。

docker側は3306で、ホストOS(Windows)側は13306にしています。

別プロセスで3306を利用しているため、3306を指定すると競合してしまうためです。

volumesはデータの永続化をするために設定しています。

db-storeは任意の名前を指定できます。

/vol/mysql部分は任意のディレクトリの絶対パスを記述することができます。

docker-compose.ymlがあるディレクトリで docker-compose up -d を実行します。

コンテナが作成されるので、Docker Desktopで確認します。 正常に完了していれば、以下のようになっていると思います。

あとはホストOS側でSQLクライアントソフトウェア等を利用して接続するだけです。

接続情報は以下の内容です。

Hostname: 127.0.0.1
Port: 13306
Username: <username>
Password: <user_password>
Default Schema: testDB

Username, Passwordはdocker-compose.ymlのMYSQL_USERとMYSQL_PASSWORDに対応します。

Default SchemaはMYSQL_DATABASEに対応します。

これでSQLの実行が可能になります。

最後に

ブログのデザイン変えてみました。

少しコードが見辛い気もしますが、しばらくはこのデザインでいきます。

Princess API (matsurihi.meさん)をPythonで気軽に扱えるWrapperを書いた話

Princess APIについての説明

ミリシタ*1APIです。
以下、引用とサイトのリンクになります。

夢の世界へご招待なのです
ー プリンセス・アラモード
Public RESTful Application Programming Interface Series.
開発者向けの API を提供しています。

api.matsurihi.me

※ ミリシタの他にもデレステ*2シャニマス*3APIの提供がありますが、今回はミリシタのみのAPIを扱います。

ライブラリの利用法について

PyPiにはまだ登録していません。

GitHub https://github.com/sekine-1113/princess-api-wrapper

利用する際は

pip install git+https://github.com/sekine-1113/princess-api-wrapper.git

上記コマンドを入力することで使えるようになるかと思います。

ある程度ドキュメントは書いたつもりなので、恐らく大丈夫かと思いますが。
以下のように使うことができます。

from princessAPI import (
    API,
    Lang,
    IdolType,
    CardRarity,
    ExType,
    EventType,
)



api = API()
cards = api.get_cards(idolId=30, rarity=CardRarity.SSR, exType=ExType.SHS)
print(cards[0]["name"])

event_id = "192"

result = api.get_event_ranking_border_point(event_id)
print(result.keys())

result = api.get_event_ranking_border_point(event_id, ETag="a3ac39e6fe30e22df7544cfd818edc02")  # using ETag
print(result.keys())

APIクラスの引数として

cache, host, lang, use_etag, retry_count, retry_delay, user_agent, timeout

があります。

引数名 実引数
cache cacheクラスを継承したcacheを利用できます。
デフォルトはStaticCacheクラス(TTLCacheベース)です。
host 基本変更する必要はありません。デフォルトは'api.matsurihi.me'です。
lang 日本語以外を利用したい場合に使います。その場合consts.Langクラスを使います。
use_etag ETagを利用したい場合に使います。
デフォルトはFalseですが、一部メソッドの引数にETagが設定された場合はこれに関わらずETagを利用することが可能です。
retry_count エラー発生時に何回リトライするかを指定します。デフォルトは1です。
retry_delay エラー発生時に何秒待機するかを指定します。デフォルトは0です。
user_agent ユーザーエージェントを設定します。指定がない場合は、生成されます。
timeout タイムアウトの秒数を指定します。デフォルトは60です。

イベント関連の一部メソッドに引数ETagがありますが、ETagがある場合とない場合の挙動が少し変わります。

# ETagがない場合
dict_keys(['eventPoint', 'highScore', 'loungePoint', 'idolPoint'])
# ETagがある場合
dict_keys(['ETag', 'response'])

ETagがある場合はETagIf-None-Matchの値が、responseに従来のレスポンスが入ります。

get_idolメソッドやget_cardメソッドなど一部レスポンスは配列になる場合があります。

設計する上で工夫した点

サーバに負荷をかけにくくするため、Cacheを用いました。
HTTPステータスコードによるエラーハンドリング。
拡張性の意識。
ソースコードのドキュメント化。
ライブラリ化

まとめ

だれも読まないだろうということをいいことに工夫した点すごく雑に書いてしまった // 後で修正する

もし使う際は、提供者や情報元の方々に迷惑が掛からぬよう、自己責任でお願いいたします。

気が向いたらミリシタ以外のAPIのラッパーも書きますたぶん。

今回はこのへんで。

*1:アイドルマスターミリオンライブ!シアターデイズというアプリ

*2:アイドルマスターシンデレラガールズスターライトステージ

*3:アイドルマスターシャイニーカラーズ