ブログ

読んで思い出す。忘れるために書く

.NET C# で画像から文字列を検出する (Google Cloud Vision API)

ゴール

Vision API に渡した画像ファイルから、特定文字列が含まれているか否かを判定する

セットアップ

初期設定・チュートリアルは「Using the Vision API with C#」が詳しい

メモ

あとで調べられるようにメモ

  • 手元の Windowsgcloud コマンドをインストールする: Cloud SDK
  • プロジェクトにパッケージを追加: dotnet add package Google.Cloud.Vision.V1 -s https://api.nuget.org/v3/index.json
  • 認証情報を保持する JSON ファイルを生成する
#
# JSON 生成とその準備
#
gcloud auth list # で <my_account>@<my_domain.com> が得られる
gcloud config list project # で <PROJECT_ID> が得られる

gcloud services enable vision.googleapis.com # サービス有効化

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
gcloud iam service-accounts keys create ~/key.json --iam-account my-vision-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

コード

gist.github.com

Links

指定ウィンドウの特定領域を画像キャプチャする

ゴール

  1. Android ゲーム用のアプリケーション (BlueStacks) ウィンドウを指定
  2. ウィンドウ中に描画されているなかの特定領域を、画像として保存する

本文 次のコード例に書かれている NativeMethods は過去記事参照のこと

gouf.hatenablog.com

コード

gist.github.com

任意の領域をキャプチャする

コード例ではウィンドウ全体のキャプチャを示したが:

  • Size, Bitmatp のサイズ指定で生成・キャプチャする画像のサイズと領域
  • X, Y の指定でウィンドウ内の座標指定

この2つを調整することで、キャプチャしたい場所を狙って画像化できるはず

Links

C# で Win32 API を呼び出す

ゴール

C# から Windows API を呼び出すことで、マウスの自動操作、キーボードの自動操作を実現する

コード

gist.github.com

上のように定義して、click(x, y) で指定座標に対してクリックすることができる

キーボード操作は単純で、直接 SendKeys.SendWait("{ENTER}") のように呼び出すことで、アクティブウィンドウに対してキー操作を送ることができる

SendWait() が使えない...?

SendKeys.SendWait() が含まれている System.Windows.Forms は、プロジェクトをコンソールアプリケーションとして作成した場合 (dotnet new console) 利用できない

GUI アプリケーションとしてプロジェクトを初期化 (dotnet new winforms) することで各種メソッドが使用可能になる

Link

ゲームの周回操作をスクリプト記述機能で省力化する (BlueStacks)

ゴール

周回要素のあるゲームアプリのプレイで、いつもの操作をちょっとラクにしたい

前提

スクリプトの記述

基本的には「待つ (wait x (ms))」「タップする (tap x y)」でだいたいの操作は賄えるはず

# ゲームリザルト画面から抜ける
wait 1000
tap  85.58 05.05

# ステージ選択画面表示まで待つ
wait 8000

# ゲーム開始ボタンを押す (1/2)
tap  89.40 91.28
wait 2000

# (タイミングずれを考慮して もう一度 押す)
tap  89.40 91.28
wait 2000

# ゲーム開始ボタンを押す (2/2)
tap  86.71 60.77
wait 1000

# (タイミングずれを考慮して もう一度 押す)
tap 86.71 60.77
wait 1000

#
# ゲーム開始時に消費するポイントが足りなかった場合の案内画面を抜ける
#
tap 86.71 60.77
wait 1000

tap  07.06 05.32

Link

よく使うコピペコードを Listary でクリップボードにコピーする

ゴール

YouTubeRSS フィード URL を知りたいことが多いので、*.bat ファイルにコードを書き、それを Listary で呼び出すことで、いつもの作業を省力化する

gouf.hatenablog.com

バッチファイル

適当な場所にバッチファイルを書いて保存する

echo ytInitialData.metadata.channelMetadataRenderer.rssUrl | clip

クリップボードにコピーしたい内容を echo してパイプで繋いで clip に渡すことで、任意の文字列をクリップボードに写せる

Listary の設定

Listary の設定画面から「キーワード」→「カスタム」と進み、次の画像のように設定する

f:id:innocent-zero:20211222193237p:plain
カスタム コマンドの設定

cmd/c オプションを渡すことで、実行後に終了してくれるようになる

Links

Q. YouTube のチャンネルページから RSS URL を取得したい

A. 開発者コンソールを開いて次のコードをコピペする

ytInitialData.metadata.channelMetadataRenderer.rssUrl

手順

  1. 適当なチャンネルにアクセスする : eg. 「獅子神レオナ/レオナちゃんねる - YouTube
  2. 開発者コンソールを開く
  3. コードを貼り付けて実行 : ytInitialData.metadata.channelMetadataRenderer.rssUrl

あとは 得られた URL を Feedly や Slack の RSS App に追加する

Link

YouTube の HTML ソースは圧縮されてるため目視での確認がむつかしかった

Docker 環境の Rails プロジェクトで RSpec を監視・実行する (fswatch)

Docker 環境であっても コンテナが気軽に増設できるなら guard-rspec を立ち上げてもいい

今回は ShellScript で何とかするパターン

ゴール

  1. docker compose up で立ち上げたコンテナ内で、rspec を実行したい
  2. ローカル環境で *_spec.rb ファイルを更新したら、そのテストを実行したい

ShellScript を書く

watch_rspec.sh, rspec.sh の2ファイルを用意

#!/bin/sh

# file: watch_rspec.sh

fswatch -0 -e ".*" -i "\.rb$" --event=Created spec | while read -d "" path; do
  clear
  ./rspec.sh $path
done
#!/bin/sh

# file: rspec.sh

set -e
target=$(echo $1 | awk -F 'my_project_root_dir/' '{print $2}')
container=app
echo $target

docker compose exec -e RAILS_ENV=test $container bundle e rspec $target

メモ

fswatch

  • -0 でヌル文字区切りでファイルパスを渡す
  • --event=Created で「ファイルが作成された」ものを絞り込んで検出する
  • -e ".*" で一旦すべてのファイルを監視対象から除外
  • -i "\.rb"Ruby ファイルのみを監視対象にする

rspec.sh

  • fswatch から渡されるファイルパスは ローカル環境のフルパスなので... awk で加工して、プロジェクトディレクトリ以降のパスを渡す

docker compose exec に渡すときにコンテナ内のファイルパス指定と等価になる

Links