aliceの技術ブログ

技術ブログ

Discord で GitHub の Pull Request 通知を受け取る

概要

GitHub で Pull Request を作成,マージなどの操作をした際に Discord で通知をしたかった. 備忘録として書き残す.

結論

GitHub と Discord の Webhooks を用いることで,Discord に通知ができた.

内容

Discordの設定

  1. 適当なサーバを作り,適当にテキストチャンネルを作成.
  2. チャンネルの編集から連携サービスを選択し,Webhook を作成を押下.
  3. Webhook URL をコピーを押下.

GitHubの設定

  1. Pull Requests を通知したい Repository で settings を開く.
  2. Webhooks を選択し,Add webhookを押下する.
  3. Payload URL に先ほどコピーした Discord の Webhook URL を貼り付け,/github を追記し,Content type を application/json に変更.
  4. Let me select individual events. を選択(適宜読み替えること,今回は PR に関する通知)
  5. 初期状態で Pushes にチェックが入っているので,解除して Pull Requests を選択.
  6. Add Webhook を押下
  7. すると,以下のような表示になる.緑のチェックマークがついていれば完了.

エラーになった場合は,上記手順を再度試す.

Discord から先に設定するとうまくいくはずである.

画像生成サービスの探求 - Microsoft Designer の Image Creatorを活用しよう

はじめに

無料で画像生成できるサービスを探していたところ,Microsoft Designer の Image Creator を見つけた.

Microsoft アカウントがあれば,だれでも無料で画像を生成できる.

生成した画像

生成した画像の一例を以下に示す.

課題

Image Creator from Designer に限った話ではないが,まだまだ表現力が足りないと感じた.

指の本数がおかしい,バランスがとれてない画像も生成されてしまう.

無料で利用できるので,何回か生成すればそこそこいい感じのが生成されるので,気にする必要はないが.

まとめ

無料で利用可能で,その上かなり高いクオリティでとても満足した. 今回はかわいい女の子の画像を生成したが,おそらく他のジャンルでも利用できると思われる.

この記事のタイトルはAIが付けた.

DockerでMySQLとNode.jsを動かす(雑)

Node.jsのためのDockerfileを用意する

ファイルの内容は少しぼかしている部分があるが、一通り動くと思う。

FROM node

ENV NODE_ENV=dev

WORKDIR /usr/src/app

COPY ./app/ .

EXPOSE 3000

CMD [ "yarn", "dev" ]

docker-compose

version: "3"

services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "rootpassword"
      MYSQL_DATABASE: "dbname"
      MYSQL_USER: "username"
      MYSQL_PASSWORD: "userpassword"
      TZ: "Asia/Tokyo"
    ports:
      - 3306:3306
    volumes:
      - db-store:/vol/mysql
    networks:
      - network-name

  api:
    image: "docker-image-name"
    container_name: "container-name"
    build:
      context: .
    ports:
      - "3000:3000"
    env_file:
      - .env
    volumes:
      - /app/:/app
    networks:
      - network-name
    depends_on:
      - db


volumes:
  db-store:
networks:
  network-name:

.envは以下のようにしている キー名は任意の名前でよい。はず

.env

PORT=3000
DB_HOST=hostname
DB_PORT=dbport
DB_USER=dbuser
DB_PASSWORD=dbpassword
DB_DATABASE=dbname

だいたいこれだけで動く

時間に余裕ができたら、詳しく書こうと思う。

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:アイドルマスターシャイニーカラーズ