C#使ってWindowをキャプチャしたり、マウスイベントを送信したりする

背景

 カァーッ、ゲームのボット作りてぇナァーッ

ソースコード

 GitHubで公開してます。こちら。

https://github.com/kokeiro001/Kagamitsuki

できること

  • 任意のウィンドウをキャプチャし、Bitmapインスタンスとして取得できる
    • キャプチャ対象によっては他のウィンドウに隠れていても取得できる
  • 任意のウィンドウに対し、マウスイベントを送信できる
    • クリック、マウスカーソルの移動のみサポート

ざっくりとした使い方

 GitHubリポジトリのSampleConsoleApp見れば何となく分かると思います。

 これ。

https://github.com/kokeiro001/Kagamitsuki/blob/master/Kagamitsuki.SampleConsoleApp/Program.cs

WindowCapture

 ウィンドウキャプチャするやつです。キャプチャ対象のウィンドウハンドルを渡す必要があります。

 サンプルプロジェクトではWindowNativeHelper.GetWindowsメソッドを使ってます。System.Diagnostics.Process.GetProcessesメソッドを使って絞り込むことも出来ます。お好みで。

 その後はCaptureメソッド呼べばキャプチャ画像が取得できます。終わり。

 コンストラクタにキャプチャ範囲を渡すことで、ウィンドウの特定の範囲のみキャプチャすることが出来ます。大体の場合はウィンドウのタイトルバーとか不要で、ゲームの範囲だけ必要なのでいい感じに調整してくださいな。

VirtualMouse

 ウィンドウに対してマウスのイベント送信するやつです。こいつも送信先対象のウィンドウハンドルを渡す必要があります。

 生成したあとはClickメソッドとかMoveメソッド呼べば動きます。終わり。

 こいつもWindowCaptureと同じく、クリック座標の原点を指定できます。無指定のままだとタイトルバー込の位置指定になっちゃいますが、任意の位置を指定することでゲームの範囲に集中することが出来ます。

 ClickメソッドにはClickAsyncも用意してます。Clickメソッドはマウスボタン押す→ボタン離すが一瞬で行われます。マジで一瞬で。これで問題ないプログラムならそれでいいんですが、場合によってはボタン押して、0.2秒待って、ボタン離すみたいな動作が必要なことがあります。そういうときにAsync版使ってください。離すまでにディレイかけられます。

今後の課題、現状の問題点

 描画順の都合、描画方法の違いの都合のため、キャプチャできるウィンドウとキャプチャ出来ないウィンドウとが存在します。

 ブラウザ毎に下記のような違いがあります。

  • Firefoxはウィンドウが他のウィンドウに隠れていてもキャプチャできます。神。マウスイベントも送信できます。神。
  • InternetExprolerは他のウィンドウに隠れているところは他のウィンドウごとキャプチャしちゃいます。
  • Chromeは真っ黒です。キャプチャできません。

 とりあえずKagamitsuki使ってブラウザのキャプチャ、操作したい場合はFirefox系一択です。Firefoxは派生ブラウザ多く、その大体が本家同様の挙動を示すので好みのを使ってくださいな。

後記

 OpenCvSharpとかと組み合わせることで、ちょっぴり賢いゲームのボットなんかも作れます。やったね。

 ブログ投稿時点で既に8年くらい前のコードになりますが、マインスイーパーを自動で解かせてたやつがこちら。

https://github.com/kokeiro001/AutoMinesweeperSolver

 Windows7マインスイーパー向けのハードコードが多いので、Windows10だと動かないでぇす。

 ココから必要な部分だけ引っこ抜いてきたのがKagamitsukiです。

 今後作るボット次第でマウスホイールとかドラッグのサポート増えてくと思います。今後作るボット次第。

Raspberry Pi3上でDockerを用いて.NET Core2.0のコンソールアプリケーションを実行する方法の紹介

Raspberry Pi3上でDockerを用いて.NET Core2.0のコンソールアプリケーションを実行する方法の紹介

 資料少なくて辛かったのでまとめます。

 .NET CoreをLinux上で動かす方法についてはMSが詳しく解説してくれていますUbuntuCentOSなどの主要なOSについてはパッケージ管理システムを用いてサクッとインストールできるようになっているのですが、raspbianについては記載されていません。raspbianはdebian派生なのでdebian向けの資料を漁ればさくっと行けるかと考えてましたが、CPUアーキテクチャがx64を対象にした資料ばかりで難儀しました。

 最終的にDocker Imageを作成して実行環境を整えることが出来ました。本記事ではそのDocker Imageの使い方とDockerfile作成にあたって参考になった情報の紹介をします。

 なお、本記事で手に入るのはランタイム環境のみです。dotnet buildやdotnet restoreといった開発向け機能は利用できるようになりません。予め別環境でアプリケーションをビルドしておく必要がありますので注意してください。

対象読者

  • Raspberry Pi上で.Net Core2.0 Previewを動かしたいって人
  • それもDockerで!って人
  • OSとしてraspbianを利用している人(Ubuntuを含むdebian派生なら大体参考になるはず)
  • docker初心者。全コマンド、全オプションの解説まではしてませんが、忘備録兼ねてそこそこ詳しく書いてます。

早速見ていきましょう。

続きを読む

Twitterアカウントに電話番号を登録する際、TwitterからSMSを受信せずに登録する方法

 Twitterアカウントに電話番号を登録する際、SMSを受信せずに登録する方法を紹介します。

 電話番号を登録する場合、基本的には次のような流れで登録を行います。

  1. 登録したい電話番号をTwitterに入力する
  2. Twitterから認証コードが記載されたSMSが送られてくる
  3. 認証コードを入力
  4. 登録完了!ヤッター!

 私もこの方法で登録しようとしたのですが、どうにもTwitterからのSMSを受信することが出来ませんでした。 そんな場合はケータイキャリアのSMS受信設定を調整するといいよ!という記事が見つかりますが、 自分なりに設定を変更しても受信することが出来ませんでした(GoogleとかAmazonからは受け取れてるしな!)。

 そんな中、Twitter宛にSMSを送信するだけで電話番号を登録できる方法を見つけたので紹介します。

続きを読む

第5回 関西DB勉強会に参加してきましたって話

第5回 関西DB勉強会に参加してきましたって話

kansaidbstudy.connpass.com

5/20(土)はこれ行ってきました。

DB関係で初めて知ったことだとかをメモしておきます。

続きを読む

Azure Functionsを使ってGitLabのWebhookをDiscordに通知するようにしたって話

Azure Functionsを使ってGitLabのWebhookをDiscordに通知するようにしたって話

 生存報告を兼ねて。引っ越しました。

背景、もともとの運用

 しあわせの国での開発は、GitLab.comで発生したイベントを、Discordに表示させる運用をしてます。

 誰かがブランチをプッシュしたら、こんな感じのメッセージが流れてきます。

f:id:kokeiro0_00:20170430171732p:plain  アイコンと口調がちょっとイラッとするのが特徴です。

 開発メンバーの中にはgit使ってない人もいます。そういった人にも作業進捗が見えるようにしたい!というのが俺の建前で、 実際は誰かが作業していることを目に見せることで「俺もやらねば」と煽るのが目的で作成。

 Issueの操作などの、ブランチのプッシュ以外も通知されます。最近はあまりIssueはあんまり使ってないけど。

 これまではRaspberry Piにボットを住まわせて、GitLabからの通知を拾わせてました。 が、引っ越し先に光回線が引かれておらず、回線工事することとなりました。 工事待ちの間はSoftBank Airってのが貸出されてインターネットそのものは利用できるんですが、無線機ってこともあって機能制限がキツイ。

SoftBank Air における機能制限のお知らせ | インターネット | ソフトバンク

ご利用いただけない機能
・ポート転送

影響を受ける可能性がある利用形態
・外部向けサーバーとしての利用、外部からのリモートアクセスの一部
・外部からIPアドレスを指定してアクセスを必要とするもの

 Raspberry Piのボットに待ち受けさせるの無理やん!引越し前と同じ運用は難しそう。。。 というわけで、自宅のRaspberry Piを経由せずにGitLabの通知を拾うシステムを作ろうと思い立ちました。

続きを読む

2016年にやったことと2017年にやりたいこと

2016年にやったことと2017年にやりたいこと

2016年にやったこと

 とっくに2016年終わってるけど書く。

同人ゲーム制作活動

 ほぼ1年間、しあわせの国というサークルで、同人ゲーム制作を行った。2016年1月に出来たばかりのサークル。構成は大学時代からの顔見知り4名+α。私はプログラマーとして活動していました。

 ベータ版のUnityをガシガシ使ったり、造詣の浅かったUniRxに触れたり、開発を楽にするためのチャットボットを作成したり。同人ではガンガン最新バージョン使って失敗できるのがいいですね。仕事だとリスク考えて動かないと行けない場面でも「とりあえずヤッてみよ~」で手を出せるのが良い。いろいろ失敗して経験値増えたんで、適当な場面でアウトプットしていきたい。

 無事解散せず、C91にゲームを頒布することが出来ました。

 すでに次回コミケに向けて動くことになっとる。頑張る。

転職

 3月に転職した。ゲーム会社 to ゲーム会社。職業もプログラマーのまま。

 転職後も転職サービスに登録しっぱなしにしてたのだが、思いの外良い経験になった。登録したままにしておくと、求人メールやら求人チャットが届く届く。転職したばっかだから殆どの求人は無視してたんだけど「君のソースコード/SNS見たよ~。軽く話してみない?」みたいな、一歩踏み込んで俺に興味持ってくれたところには積極的に話を聞きに行った。現場の生の話を聞けるのは良い経験になった。今の今使ってるツール、今の今使ってる技術ってのを直接聞けた。知らないツール/技術を多く知る切っ掛けとなった。雑誌なり勉強会なり適当なブログの購読なり、様々な方法で広く知識を集めていこうと思った。

2017年にやりたいこと

 年始というほど年始じゃないけど、今年やりたいことやら。

プログラムの設計について学ぶ

 ザックリとした目標だが、学ぶ。

 GitHubとかで他人のソースコードを漁ったりフレームワーク触ったりなんだりして、経験だけは積んできた。とはいえ、体系だった学習をしてきたわけじゃないので、大部分が我流になってる。と思う。そんな気がする。

 クソみたいなコードを書いて、1ヶ月後に後悔するって場面を減らしていきたい。

 当面は適当な書籍を見繕って読み砕いていく。詰まったら人に聞いたり、ライブラリやらフレームワークを読み漁っていく。

スポーツジム通う

 体力の衰えを感じる。俺もアラサー・・・

 駅から帰ってくる途中にジムあるんで、仕事帰りに週1~2回を目安に通う。

 (そのうちOpenAI Gymにも通いたいと思っている)

買いたいもの買う

 いっぱいあるんだけど、金が足りない。

 その時々の優先度に合わせて、少しずつ消化していきたい。

  • Surface Pro:勉強会でのメモ取りは未だにアナログorスマホって状況から卒業したい。
  • HoloLens:二次元キャラ出したい。
  • Oculus/Oculus Touch:二次元キャラと遊びたい。
  • Pixel:日本発売はよ。

ブログ活動を継続する

 月1回を目標に何か書く。プログラミングでもアニメでも財布を落とした話でもなんでも。Twitterのような短文形式じゃなく、まとまった文量をアウトプットしていく癖をつけたい。

 昨年はUnityベータ版一通り触ったり、Discord/Twitter/Slackのボット作ったり、GoogleAPIいろいろ叩いたり、Docker触ったり、C#7動かしてみたり、コミケ出たり、機械学習に手を出したり、Webクローラー回したり、ラズパイ上でMono動かしてみたり、勉強会参加したり、サーバーレスアーキテクチャに手を出してみたり。ブログに書けることはたくさんある。んだけど、記事に起こすのが面倒で更新してなかった状態。どこからかモチベを引き出す術を身につければ、いい感じに書ける気はする。

.NET Fringe Japan 2016参加してきました。そのチビっとした感想郡。

.NET Fringe Japan 2016に参加してきました。一週間くらい前に。

dotnetfringe-japan.connpass.com

セッションに関する内容は俺俺要約と、リンクを張る程度に留め、ザックリとした感想をポツポツと書いていきます。資料自体は全部ココにあります

そもそも.NET Fringe とは?

dotnetfringe.org

An atypical conference for open-source .NET developers.

.NET開発者のための型にはまらない自由なカンファレンス、的なニュアンスかの?

GitHubPagesで公式サイト動いてたから、イベントに関する説明文探してみたけど思うように結果は得られず。ま、要は.NETのイベント。いじょ。

FSharp Deep じゃない Dive

途中から参加。イベントを知ったのが前日で、はキャンセル待ち状態での。繰り上がりで参加できる連絡きてからパパっと移動したンだけど。。。

F#は眺めたことはあるけど、書いたことはない。一行も。

F#の学び方が割りと印象的だった。 ちょっと古めの和書でOK。和書全然新しいの出てこないらしいけど、F#2.0の知識でも大部分カバーできるらしい。

F#は関数もシリアライズできるって点も印象的だった。 資料には載ってないけど、口頭でチラッと情報が出た。 どゆこと?シリアライズってデータをゴニョゴニョするもんじゃないの?

関数もデータっちゃあデータなんだろうけど。 ちらっと調べてみたけどイマイチ分からんかった。 ちな、理屈も利用場面もさっぱり分かってない。 俺が持ってる「シリアライズ」の定義が世間とずれてるのかもしれない。

何にせよ、そういうパラダイム持ってなかったんで刺激になった。

「はじめにお読みください」な C# 言語機能の作り方 - 機能は用法・用量を守って正しく追加してください

C#コンパイラーをちょこっといじる話。怖い。

と見せかけて、実際のセッションでは1行しかいじらない。

  • 言語作ることの大変さとか
  • roslynリポジトリの歩き方とか
  • 言語いじらなくともVisualStudioの拡張機能でカバーできる範囲とか

提案する際は社会人らしく提案しましょう、まる。って感じだった。 issueってポンポン立ってる状態なんだなぁ。

Azure Storage Partition Internals

パーティションの話。

そもそもサーバーのパーティション周りを弄ったことも調べたこともなかったため、さっぱり分からなかった。。。 サーバーサイドのスケーラビリティに関わる機会が生まれたら、再度スライドを見ることになりそう。

Xamarinソースクエスト

Xamarin/Mono周辺がオープンソースなった。ソースコード読んだり弄ったりするためのコツやら注意点やらのセッション。資料スライドは英語だけど、実際のセッションでは日本語で話してもらったので、理解はスルスルと。

触る機会そのものは少なそう。バグっぽい挙動を踏み抜いたときに見返す事になりそう。

makeを3回実行すると動くようになる、というのが印象的でした、まる。

MessagePack for CLIとそこから学ぶ.NETのマルチプラットフォーム対応

「一般的なシリアライザーの構成要素」ってのが印象的だった。本腰入れて作る機会は無い気がするけど、遊びがてら触るときはこの構成にしようと思う。

リフレクションが必要な箇所をマルチプラットフォーム対応するのは大変そうだなぁと思いました、まる。

週末OSSやるんだったら、好きな分野やると良いよってのも印象的でした。好きな分野ってのは、あまり重ならないものらしい。メジャーどころは強キャラだらけでモチベ維持が大変だったりとか。

完璧を求めたりせず、好きなものを好きな通りにやるのが長続きさせるのに重要なのかも。

What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの原理原則

  • 世界で使われるもの作れると名刺代わりになる
  • ライブラリの大きさは関係ない
  • 外に出すためのパッケージングで得られる経験値は貴重
  • OSSは出した瞬間が旬。あとは萎んでいくのが普通
  • 使ってもらうにはコードだけで終わらず、ドキュメントもサポートも外部アプリとの連携も大切
  • 「設定より規約」よりコンパイラがルールを伝えてくれる方がいい
  • APIユーザビリティ設計についてはこの本がオススメ

丁寧にパッケージングする大切さを知った。ポツポツと出していこうと思う。

Beachhead implements new opcode on CLR JIT

.NET Core Runtimeを拡張子、自作オペコードを追加する闇のセッション。手探りでソースをいじってた感が伝わってきました。怖かった。

「最終的にILに自作オペコードを呼び出す処理を実装する必要あるよな?まさかIL吐き出すところまで作るんか?」とビビってたけど、流石に違った。

  1. ほぼ空のコンソールプログラムをコンパイルして
  2. idlasm使って逆コンパイルして
  3. 出てきたIL直弄りして(!?)
  4. ILを再びアセンブリに戻す

という流れだった。怖いぞ。

これも資料は英語だけど、セッションそのものは日本語で行われました。 デモ実演も行われました。

お話としてはスゴイ面白かったけど、自分で直接触る機会は無いでしょう。ないでしょう。

.NET Core とマルチ プラットフォーム Deep Dive

どのようにマルチプラットフォーム対応しているのかというセッション。直前の闇セッションと、MessagePackのマルチプラットフォーム対応のセッションと関連が深く、いろいろ知識を補完できるいい流れだった。

開発/コンパイル時と配布時とで参照先を見えないところで切り替える、みたいな話だった(理解怪しい)。

マルチプラットフォーム対応のライブラリを作る際に見返すと良さそう。

全体を通して

皆さんお疲れ様でした。とても楽しかったです。

長かった。実に長かった。20:20までかかった。

私は遅れての参加だったけど、フルで参加してる人は10時間以上も踏ん張ってたことになる。懇親会で更に遅くまでって人もいるだろうし、運営者に至っては朝もっと早くから動いてたわけだろうし。ホンマありがとうございました。

今回は前日に知っていろいろ焦った。広く情報を仕入れ、前もって予定立てれるようにしよう。