投稿

ラベル(C#)が付いた投稿を表示しています

Visual Studio 2022のぐち

Visual Studio 2022のぐちです。 これまでVisual Studio 2017を使っていたのですが、.NET6.0を使うためにVisual Studio 2022をインストールしてから約2ヶ月半。 Visual Studio 2017のときにはほとんど不具合にあったことなどないのですが、Visual Stuio 2022ではイライラすることが多い。 ・一番イラっとすることは選んでいるクラスソースが表示されないこと。 メインウインドウで複数のクラスをタブで切り替えて使うじゃないですか。でもタブ選択しても選んだソースが表示されず、タブだけが切り替わったように見えること多い。こういう時は表示されないタブを一度閉じて再度開くなどしないといけない。地味に面倒。 ・次にイラっとすることはデザイナが表示されないこと デザイナを開いたり、デザイナのタブを選んでもバックグラウンドで読み込んでいますとでていつまでもフォームデザイン画面が出ないときがある。フォームのプロパティ変更したいのにすぐに変更できないのはイラっとします。これも一度タブを閉じて再度開くと表示されることが多いのですが、デザイナの場合ちょっと時間かかるので余計にいらつくポイント。 ・保存しようとすると致命的なエラーが発生する 保存しようとするとときどき致命的なエラーが表示されて、保存できない。これはかなりイライラっとする。たまに発生する。一度でるともう絶対保存できない。唯一救いはエディタ画面はそのまま使えるので、いったん未保存のソースを別のテキストエディタにコピーしておけること。それでもリソースやプロジェクトプロパティの修正まではできない。 ・デザイナでデザインした内容がソースに反映されない。 これも時々起きるが、気づきにくくホントに頭来る。結構なボタンやテキストボックスを配置した後、コントロールを操作するコードを記述しようとして初めて気づく。デザイナに配置したはずのコントロールが未定義になる。そこで~.designer.csをコード表示してみるとデザインしたコントロールが一切反映されていない。VisualStudio2022を再立ち上げしないといけないし、デザインした内容は一切復活できない。時間をかけてデザインをすればするほど、徒労感虚無感とともに怒りがわく。 上の2つは頻発するし、下2つは致命的。 V...

C#で画面キャプチャしようとしたら遅かった原因が分かった件

イメージ
とあるゲーム…と、いうかオンラインのパチスロを打つプログラムを試しているところ。 パチスロなんだから高設定じゃないと勝てないのは普通だが、4号機時代の技術介入ができる台であれば、完ぺきに打つことができれば設定1でも100%を超える。 最近でもディスクアップなんかはどのホールでも設定1だけど、数千万回転の実践を集計すると100%をぎりぎり超えているらしい。 さて、パチスロはドラム1回転でたいてい21コマの図柄がループしているが、1分間で79.5~79.9回転程度の速度らしい。オンラインのパチスロゲームでも基本的には変わらない。 60(秒)÷79.5(回転)÷21(コマ) = 0.0359(秒/コマ)。1つの図柄をビタ押しするには35ミリ秒の勝負となる。 人間が目押しする場合は回転の間隔も体感で覚えれば、ほぼ完全目押しもできる。 自分がやろうとしているのは瞬間目押しである。余計なドラムの回転を待たずに1周目で目的のコマをビタ押ししてやろうということだ。 さてクランキー系でちょっくらやってみるかとプログラムつくってみたものの、これがどうにもうまく行かない。いや、うまく行くのだが、うまく行かない。 メインのPCは4年前に購入したPCで当時そこそこハイエンドのPCなので、性能的にはよい。このPCでコーディングして、試しに目押しさせてみるととほぼ想定のとおりに目押しできる。小役はおいといて、BIG時のリプ外しなんて完璧だ。やっとできたと思ったのに。 メインのPCは普段使いするので、パチスロでメダル稼ぎたいときは、サブのミニPCで勝手にメダル獲得しておいてほしいのだ。で、サブのミニPCにはディスプレイがつながっておらず、VNCを使ってリモートログインしている。そして、25,000円ぐらいでOSまでついているミニだが、当然性能は低いCeleron J4125。グラフィクスはIntel UHD Graphics 600だ。 性能的にイマイチでも、なんとかなるのではないかと思っていたが、やっぱりどうにもならない。やってみると、目押しが全くあっていない。遅れまくる。 なんでかとログを出力しながら確認したところ… 57:48.190 比較終了 57:48.190 画面取得開始 57:48.217 画面取得終了 57:48.217 比較終了 57:48.217 画面取得開始 57:48.25...

PlaywrightとGoogle reCAPTCHA

Playwrightは当然ロボット系のテストなので、Google reCAPTCHAに引っかかります。 なんですが、よくわかりませんが、reCAPTCHA v3をテストできるページでちょっと試してみたら意外なことが…。 まず予備知識としてreCAPTCHAにはv2とv3が今は出回っています。 v2は写真の中から「バス」を選択してくださいみたいな写真から選ぶやつ。 v3はブラウザ利用者は何もしないで判定される進化した版です。 当然v3であればユーザーは余計な選択などをしなくてもいいため、ユーザー利便性も上がりますが、導入側はボットと判断したときの処理を自前で作らなければならないという仕様です。 で、このボット判定ですが、Googleでやってくれるのはボット度合いを数値化した指数みたいなものを返してきます。 一応1.0~0.0で値が1.0に近ければより人間らしいということになります。 問題はv2と違って、v3は値をいくつの時にボットと判定するかはサイトの運営者が決めてくださいってこと。 閾値0.5ぐらいで振り分けるのが一般的なようですが、いろいろ読んでいるとボットでもないのに0.3と判断されたといった記事も見かけます。 さて、ではPlaywrightではどうかというと…。 v3のロボット閾値判定が0.7になるんですよ。上記にも書いたように0.9ぐらいなら間違いなく人間判定で、場合によっては人間の操作で0.5や0.3と判定値を返してくることすらあるらしいのに、Playwrightでアクセスしてみたら0.7って結果に…。 まじか。 ちなみにreCAPTCHA v2は音声での認証にしてMicrosoftのAzureの音声API通せば(Googleクラウドをあえて使わず)まず失敗しません。試してみたところ、Googleの無料の音声解析APIはまず聞き取ってくれません。Azureはほぼ確実に聞き取れます。 v3のほうはまあ、テストページが1つだけなので、いろんなページに移動する(各ページにreCAPTCHA APIが設置されている)場合はちゃんと0.3とか0.1になるのかもしれませんが、トップページとかお問い合わせのページにポツンと入れているだけだと、Playwrightでは通過できてしまうのかもしれません。 6/28 追記 いくつかのテストサイトで試してみましたが、0.3と判断...

マインスイーパーを自動で解いてみる

イメージ
マインスイーパーを自動で解いてみよう マインスイーパーのゲームで試す マインスイーパーをやっている様子 マインスイーパーを自動で解いてみよう 今更ながらにマインスイーパーを自動で解くプログラムを作った。 まずはマインスイーパーの問題を作るプログラム。 これは簡単。これに加えて、指定した場所から爆弾orパネルの開放する処理。 これも再帰するだけなので、簡単。 あっというま。ま、昔7行プログラムでできたぐらいだしね。 問題を作ったら、今度は問題を解くほうの処理。 自分で解いていくわけではないので、テキストで表示して解いていく過程を 見せるプログラムにした。 未開放のパネルに対し、爆弾の確率を設定する。設定した確率の内、最も低いパネルを開く。 ただそれだけ。 盤面を全体的に走査し、確実に爆弾の場所もしくは確実に爆弾ではない場所を調べる。 どちらかが見つかったら、その周囲の8マスの確率を計算し直す。 確率の計算が発生した場合は、再度盤面全体を走査する。 そして最後に爆弾の確率が最も低い基本的には確率0のパネルを開く。 それだけでもまあまあな正答率にはなる。でも、まあまあはまあまあ。 確率0のパネルがない時はそこそこの確率で爆弾を引いてしまう。 そこでさらに一工夫して、確率0が見つからない場合に 各地点の発生しうる爆弾の組み合わせを全通り試し、その結果矛盾が発生しない 全組み合わせのチェックの結果、爆弾が絶対発生する/絶対発生しえないパネルを 確定するようにする。爆弾の仮置きで矛盾がないかということね。 これらにより、まあまあの正答率はなかなかの正答率になる。 マインスイーパーのゲームで試す ある程度ロジックが問題ないレベルになったとおもわれるので、ウェブサイトのマインスイーパーで試してみる。 試したのは楽天ポイントモールのゲームセンター内のマインスイーパー。20x20のLevel5の盤面で試す。(ちなみにラクマ版ゲームセンター( https://fril.jp/games# )でも同じだしLINE版のゲームセンター( https://kantan.game/lightgame )もおなじ。) 盤面の情報などは外側から取得できる気がしなかったので、単純に画像を直接解析して、盤面情報を取得しようとした。 ところが、微妙にマス目ごと...

C#でSeleniumをやめてPlaywrightを使ってみた4

イメージ
Playwrightでもう少し試したこと 拡張機能を使いたいのにダメ? 拡張機能を使えるようにする 拡張機能が消える? 拡張機能を使うためのコード例 要素の存在チェックがしたい CountAsync()で0が返ってこない罠 要素の存在チェックの方法の結論 JavaScriptを使うときの書き方 Playwrightを使いまくって作ったアプリ Playwrightでもう少し試したこと その3でやめようと思ったが、もう少し書きたいことがあったので、書いておく。 「拡張機能」「要素の存在確認」「JavaScriptの実行」についてのメモメモ。 拡張機能を使いたいのにダメ? まずは拡張機能について。 SeleniumのときはChromeの拡張機能はそのまま使えた。 特に何も設定しなくても、立ち上げるChromeの--user-data-dirを適切に設定しておけば、そこでインストールした拡張機能はSeleniumで起動させたChromeでも普通に使えた。 しかし、Playwrightはそうはいかない。 拡張機能をインストールしようとするとこんな感じでエラーが発生。入れられない。 このメッセージが出る理由とか対処法を検索すると、プロファイル作り直せばできたとかなんとかというページばかりだったが、消してもだめ。たどりついた結果は「chrome://version」にあった。 立ち上げのオプションに「--disable-extensions」が入っている。そりゃ、だめだわ。これ外せないかとおもったけど、外す方法は分からず。 その代わり、どうやら「--disable-extensions-except」をつかって特定の拡張機能だけは使えるようにすることはできそう。とはいえ、「--disable-extensions-except」を指定するためには先に拡張機能をインストールしていなければならない。 拡張機能を使えるようにする と、いうことで、まずはコマンドプロンプトを立ち上げて、Chromeを「--user-data-dir」指定して起動する。 枠内をクリックするとソースがクリップボードにコピーされます "C:\Program Files\Google\...

C#でSeleniumをやめてPlaywrightを使ってみた3

イメージ
Playwright Inspectorで自動コード生成できるみたいよ テスト用プロジェクトの作成 pwshのインストール Playwright Inspectorの設定 実行、操作の記録 デバッグトレースを試す Inspectorの実際(追記 2022/5/10) Playwright Inspectorで自動コード生成できるみたいよ 前回 、InfoseekのトップページにログインするコードをDevToolsで頑張ってやる方法を試してみたが、もっと簡単な方法がある。 ま、当たり前かもしれないけど、自動コード生成ツールを使う方法ね。 と、いうわけで今回は Playwright Inspector の使い方のはなし。 Playwright Inspector はブラウザの操作を記録して、C#、Python、 node.jsなどのスクリプトを自動生成してくれるツール。単純にそれだけではなく、作ったコードをプログラミングプラットフォームのようにデバッグ実行も可能で、ステップトレースできてしまうという、超便利なツール。 Seleniumとかでもこういうツールあったみたいだけど、自分は全く使ってなくて、もっぱらDevToolsと比較にらめっこしていたという、超原始人でした。 と、いうことで以下の手順で試してみよう。 ・テスト用のプロジェクトを用意して、デバッグビルドする。 ・pwshのインストール ・Playwright Inspectorの設定 ・実行、操作の記録 ・デバッグトレースを試す テスト用プロジェクトの作成 テスト用のプロジェクトを用意して、デバッグビルドする。 とりあえず、ブラウザ開くだけのプロジェクトを用意する。 前回作ったものの最小限で良いけど、せっかく作ったので使えるところは使って。NuGetでMicrosoft.Playwrightをインストールしてブラウザを立ち上げるコードを書く。プロジェクト名は今回は「Playwrightテスト2」で作っている。 枠内をクリックするとソースがクリップボードにコピーされます using System; using System.Collections.Generic; using System.ComponentModel; usi...

C#でSeleniumをやめてPlaywrightを使ってみた2

イメージ
起動時タブが2つ開くのをなおす 起動時複数タブが開く設定の時の動作 ブラウザを閉じたら、アプリも終了させるようにする 新しいタブを開く、閉じる 指定したタブにフォーカスする ページのスクリーンショットを試す 自動処理を作ってみる(想定するページの動き) 自動処理を作ってみる(トップページ) 自動処理を作ってみる(ユーザーIDの入力) 自動処理を作ってみる(パスワードの入力) 自動処理を作ってみる(まとめ) 起動時タブが2つ開くのをなおす 前回 、立ち上げ時に2つタブが開き、2つ目のほうに指示したURLのページが表示されるという現象が起きた。 枠内をクリックするとソースがクリップボードにコピーされます var ページ = await ブラウザコンテキスト.NewPageAsync(); 理由は↑この行らしい。NewPageしているので、起動時にabout:blankのほかに、新しいページを開こうとしているということ。Chromeではかならず立ち上げ時に何らかのページはある。 枠内をクリックするとソースがクリップボードにコピーされます var ページ = ブラウザコンテキスト. Pages[0] ; と、いうことで、単純にPagesの配列の[0]は保証されているんではないか。 はい、うまくいきました。 起動時複数タブが開く設定の時の動作 あとは、Chromeの設定によっては最初から複数タブが開かれるときがある。 起動時の設定で、前回開いていたページを開くとか、特定のページセットを開くを設定している場合。上ではbingとか、yahooを開いたまま前回のページを開く設定で終了して、再立ち上げしてみる。 最初は、閉じる前のページ+about:blankのタブが追加されて開き、about:blankにフォーカスが当たっている状態だった。yahoo.comの読み込み終了までしばらく待ったかと思ったら、yahoo.comのタブがgoogle.comに移動した。 これは…Pages[]って左のタブから順番ではない? ページ.GotoAsync()のあとに以下を付け加えて同じ状況を再現してみる。 枠内をクリックする...

C#でSeleniumをやめてPlaywrightを使ってみた1

イメージ
Playwrightっていうのがあるらしい Visual Studio 2022のインストール テスト用のプロジェクトを作成 ブラウザを立ち上げるコード ChromiumではなくChromeで起ち上げる ユーザープロファイルを指定する Playwrightっていうのがあるらしい ブラウザの自動処理ってSeleniumでいつもやっているんだけど、別に不満もないけど、比較的新しいツールとしてPlaywrightがいいらしいときいた。 どうせ自分はSeleniumを使うといってもChromeで自動処理したいだけなんだけど、Seleniumの場合、Chromeのバージョンアップにともなって適合するバージョンのドライバをダウンロードしなきゃいけなかったりでちょっと不便。(ま、起動時にチェックして自動でダウンロードする専用クラスは自作したんだけど) で、Seleniumで自動処理しているときにときどきブラウザ自体が落ちるときがあって、これを何とかしたいと思って調べたらPlaywrightが引っかかってきた。とはいえ、ブラウザが落ちなくなるとかSeleniumより安定するという話があったわけではない。 ただただ、古くからあるSeleniumではなく2020年産の新しいツール(思想)であるPlaywrightに移行するのもよさそうだし、Microsoftが面倒みているので、将来性も悪くなさそう。 とはいえ、PlaywrightをC#で日本語で説明しているページとかも見つからない。あるのかもしれないけど。 Visual Studio 2017で手探りでやってみようとしたが、うまくいかん。なぜ失敗したかというと、.Netframework 4.8でやろうとしたから。どうも .NET Core 5.0 でないと駄目なようだが、 Visual Studio 2017では無理 。(Core のもっと下のバージョンでもいいのかもしれないが少なくとも2017のコンソールアプリプロジェクトで.NET Core 2.1を指定してもだめだった) Visual Studio 2022のインストール と、いうことでVisual Studio 2022のインストールから。 https://visualstudio.microsoft...