2023/03/29

Microsoft Rewards 4回目

 前回は2023/1/26なので2ヶ月と3日。前回3回目にも同じだったのでこれがやり続けると達成出来る期間なのかなぁ。ただ、マイクロソフトEdgeボーナスは毎日最大12ポイント。パソコン検索(90)とモバイル検索(60)もあるから、毎日達成すればもう少し短縮は出来なるのかも。デイリーストリークは234日は。365日も見えてきたかな😄

これ、毎日頑張ると日々のセットで最低30、その日によってボーナスクイズで+20なんですが、確定ではないのでカウント外にするとして、10日毎のデイリーストリークボーナスが150なので15/日として検索ボーナスが12+90+60なので合計207は確定とすると最短26日でアマゾンギフト600円なので23円/日のポイ活ですが、検索ボーナスのEdgeボーナスはあっという間の4回の検索で達成出来ますが、PCとモバイルをフルにもらうのはキツイかも。自分自身は現状がベストなのでこれを続けられる様にやっていこう😜

2023/03/26

DataGridViewでの謎

 徐々にC#でのコーディングも慣れたり、コントロールの使い方もボチボチなんだけど、以前も謎な現象がDataGridViewで逢ったんですが今回もかなり苦労した。

そもそもカラムが何とかだとSortModeはAutomaticらしい。なので、実際普通にカラムヘッダークリックすればソートされ、もう一度クリックすればソートが逆にって感じだったんです。で、その方向が表示されれば良いなって事でアイビー先生に訊ねるとAutomaticにすれば表示される的な回答で、はて、既にAutomaticでも表示されないので色々と試す。

結論として、最初から自動だと表示されてなかったとは思うが、今となっては戻すの面倒なので確認しませんが、ColumnHeaderMouseClickイベントに追加で該当カラムのヘッダーセルのSortGlyphDirectionに現在のSortOrderをセットして解決するべくコーディングしたり、そもそも、表示したいヘッダーに十分な幅が無いので広げたり、で、フォームのデザイン画面から幅いじり出したらその昔に苦労させられたバグに遭遇。いじったカラムも設定値にならないし、他のカラムもなんか変なサイズになったり、ヘッダーの高さまで変わる始末orz まあ、幅や高さをフォームのLoadイベントで全て設定する様に変更しました。で、このグリム何故かヘッダーの高さを33以上にすると表示される。32では表示されない。

private void dvg_ColumnHeaderMouseClick(Object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    DataGridViewColumn sortedColumn = dgv.Columns[e.ColumnIndex];
    sortedColumn.HeaderCell.SortGlyphDirection = dgv.SortOrder;
}

2023/03/11

WebView2のSourceプロパティ

 懸命にアイビー先生(BingのAI検索なのかな)に質問し、WebView2の実装時の再確認してました。まあ、そもそもWebView2コントロールも理解せず、C#の理解もまだまだな状態で進めてますので何が良くて何が間違ってるとかの理解が無いまま、猿真似でコーディングしてますが😅、フォームのデザインから見直しして作り直し。

ここまでポップアップする入出金時の部分をWebView2を2つ用意して、フォームに2つ並べておいたのですが、これを同じ位置に重ねておき、ポップアップ時に2つ目のVisibleをTrueにして終わったらまたFalseにしてフォームのサイズダウンをした。更にどこぞのサイトのSourceプロパティにデザイン時に設定しておくと出来ない事がある的なのが頭の片隅に残ってたので、この対処も含めフォームの根本的な作り直し。で、ついでにだらだと書いてたプロセスも子プロセスにして視認性の向上をしてみた。で、この際にここまでの間違いも発見。どこのサイトを参考に書いたかはもう覚えてないけど、

webView2.CoreWebView2.ExecuteScriptAsync($"...");
await Task.Run(async () =>;
{
    // 読み込み完了まで待機
    if (condition2.Wait(wait_time))
        timeout_err = false;
    else
        timeout_err = true;
});

としてたんですが、"Task.Run(async () =>"ではなく"Task.Run( () =>"にする。更に、ExecuteScrriptAsyncの行にもawaitをつけてみた。つまり、

await webView2.CoreWebView2.ExecuteScriptAsync($"...");
await Task.Run(() =>;
{
    // 読み込み完了まで待機
    if (condition2.Wait(wait_time))
        timeout_err = false;
    else
        timeout_err = true;
});

って感じです。で、子プロセス化する際に

private async Task<bool> Child_Process()
{
    bool timeout_err = false;
    //ここにExecuteScriptAsyncとTask.Run()を
    return timeout_err;
}

って感じに書き直しました。呼び出し側は、

Task<bool> taskChild_Process = Child_Process();
timeout_err = await taskChild_Process;
if (!timeout_err)
{
    // 続行する処理
}

としてみた。

2023/03/05

自分の技量に見合うのはWebView2のみかもorz

 AngleSharpもHttpClientも現在の自分には無理orz 何をどうしたらいいのかとか何が悪いかが見当もつかない状態なので終わりです。で、元鞘?(笑) WebView2は分かり易さは他2つとは別次元で分かり易い。BingのAI導入でグーグル先生よりも頼りになる事も多々ある😉 最悪の事態は放棄して誰かが作ったツールに乗っかるんですが、今はまだそこまでは妥協しないで進めます。

WebView2自体は悪くはないし、分かり易いです。Bing先生に質問すると的確な答えも得られたりします。って事は、まあ、ネット上にノウハウが有るんだと😁 つまり、多くの方が利用して情報提供してるんだという事ですね。

今回得た情報は選択ボックスでの指定方法ですが、

<select id="bet-basic-type" ng-model="vm.oSelectType" ng-options="oType as oType.name for oType in vm.oaType" ng-change="vm.changeType()" class="ng-pristine ng-valid ng-not-empty ng-touched" aria-invalid="false" style=""><option label="単勝" value="object:3215" selected="selected">単勝</option><option label="複勝" value="object:3216">複勝</option><option label="枠連" value="object:3217">枠連</option><option label="馬連" value="object:3218">馬連</option><option label="ワイド" value="object:3219">ワイド</option><option label="馬単" value="object:3220">馬単</option><option label="3連複" value="object:3221">3連複</option><option label="3連単" value="object:3222">3連単</option></select>

みたいに、どの選択肢なら"value='object:????'" 的な事が分かるので

document.querySelector('???').value = 'object:3215';
document.querySelector('???').dispatchEvent(new Event('change'));"

をExecuteScriptAsynciにて指定すれば良い事が分かる。

2023/02/27

記憶力の低下がね~

 若い頃はとかって話をする時点で爺確定なんだけど、まあ、還暦までもう3ヶ月切りましたので否定はしない😃 未だにC#の事を勉強(?)しながらプログラミングしてるのですが、グーグル先生に沢山教えてもらっても直ぐに忘れる。で、またググるorz まあ、そんな感じなんでここに記録してるんですが、任意の型宣言で重宝するのがタプル型。これも少し前に覚えたんですが、この「タプル」って言葉が思い出せない。タプルに説明はあるが、なかなか重宝して使っているのに記憶に残らない。

2023/02/20

データベース構造の見直し

 現在進めているデータベース設計はもう1年以上前からなんですが、当初から問題はあったんですが、先に進める為に特に手を加えずにいました。フルセットアップ(1986年辺りからなのかな)で登録内容をステータスバーに表示させる為に処理毎にApplication.DoEvent()を呼び出しているので14時間程度掛かる処理で出来上がるデータベースファイルは57ギガバイトとかの巨大なものです。これを最適化する処理は3時間弱とかだった。

先週ふとオッズ関連の作業してて、今のまま進めるのは得策じゃないと判断し、オッズ及び票数のテーブル設計を変更する事にした。これまでは開発当初利用してたコードファーストでのデータベース作成の名残で親子関係を持つテーブル構成で設計してたんですが、これがデータベースへの登録処理で大きな負担になっている事は分かっていました。更にこの親子関連のデータ項目保持の為にデータベースファイルが肥大化してるんだとの認識もしてました。
親テーブルに基本情報を持ち、子テーブルに個々の目のデータを入れる設計なので、単勝だとまあ最大18頭分のデータが子テーブルに入るんですが、三連単に至っては最大4,896個ものデータがレース毎に入る訳でこの可変なデータを1つのテーブルに収めるのが良いのか悪いのかが、データベースファイルとして基本的な事を理解してると思い判断してたんですがsqlite3を信じて決断(笑)。3日程度掛かる変更作業を夜勤明けにこなして週末のレースには挑める様に終わらせました。まあ、日曜日のレースはWIN5の1レース目の予想中に気を失って気が付いたのは夕方の全レース終了後orz まあ、フェブラリーステークスも1番人気→3番人気→4番人気の固い決着だし、WIN5も5万円台の決着なんで、当然そんな固い予想はしないので結果オーライでした😁

修正後の高速セットアップ(Application.DoEventの呼び出しは最小限に抑える)では今まで2時間程度だったのが1時間40分で済みました。出来上がったデータベースファイルは12ギガバイト程度までダイエットが出来、最適化に要する時間が7分弱とか! 色々な動作が機敏になる副作用があり、手間暇かけたかいがありました。今後はこのバージョンで開発進める事に。

2023/02/15

SQLiteでのDBNull.Value.Equals(value)

SQLiteでExecuteScalarで値を取得する際に

var value = cmd.ExecuteScalar();
if (DBNull.Value.Equals(value))
{
    // 存在しない
}
else
{
    // 存在する
}

としても上手く判定出来ない?デバッグ作業で分かったのは

if (DBNull.Value.Equals(value)
{
    // 存在しない
}
else if (value == null)
{
    // null
}
else
{
    // 存在する
}

とすると「存在しない」ではなく「null」になる。これが現在利用している環境のバグなのか仕様なのか謎だな!

追記 2023.2.16 18:25
Windows 11 Pro 22H2 ビルド 22621.1265
Visual Studio Community 2022 Ver. 17.4.4
Sysrem.Data.SQLite.Core Ver. 1.0.116

2023/02/11

やばいな~

 八方ふさがりです。自分の器量が足りないのか、webViewで程々に理解して進められてましたが、AngleSharpとHttpClientではここ数週間スタックしてますorz 自分の無能さに疲れる。

webViewでは基本的な部分は抑えられてるかと思います。どうやって調べてどうやってそれを実装するか。AngleSharpにしてもHttpClientにしても単純にサイトを読み込むのは出来るのですが、ログインさせる為の処理はまっくた進展出来ない。

どちらが最善なのかも全く比べる段階にも至らないorz それがEncordingがネックになっているのか、そもそものインターフェースが理解出来ていないのか。本当にやばいです!

2023/02/05

Encoding

 自動投票機能の実装を始めたのが昨年10月。WebView2から始めて、ここ数週間はAngleSharpで足踏みorz AngleSharpは情報が少なくてグーグル先生に訊ねてもなかなか回答が得られませんでした。もしかするとAngleSharpは鬼門で皆さん使わないからなのかもと思い始めました。

Visual Studio 2022 Community Edition 17.4.4
AngleSharp 1.0.1
AngleSharp.Js 0.15.0
jint 2.10.4

この組み合わせでどうにか動作はする事までは確認出来んですが、あくまでも開発環境として確認出来ただけでコーディング方法が本家(?)のドキュメントみてもいまいちでした。環境は常に最新バージョンでそろえればってのはAngleSharpには当てはまりませんでした。これに気付くのに1週間以上掛ったかも。

くじけた訳ではないですが、AngleSharpでの続行は断念してみました。で、Microsoft本家の機能であるHttpClientで挑んでみようと数日前からグーグル先生を質問攻め。そもそもMicrosoftの解説通りに試してもエンコーディングのエラーが出たりして躓いて、ふと、もう1年以上前にJRA-VAN提供のJVData_Struct.csクラスが上手く動かなかった事を思い出しました。あの時は"Shift_JIS"でしたが、今回は"EUC-JP"。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

を事前にしておかないと、Encording.GetEncoding().GetString()とかでエラーになったんですが、今回はresponse.Content.ReadAsStringAsync()でエンコードのエラーが出て1日悩んだ末にでした。これでやっとHttpClientでスタートラインに着けました。

2023/01/27

Microsoft Rewards 3回目

 前回2022/11/24だったので2ヶ月と3日で達成。デイリーストリークは173日。今回もぬかりなく続けられました。トータルで1,950円分のAmazonギフト券を得ました。Amazonではしょっちゅう買い物するので重宝します。継続は力なり!

2023/01/24

スクレイピング

 ここまでWebView2利用して進めてきたんですが、自分の技量が足りないのか苦労してます。単に入金処理だけでも未だに自分の思い描く動作が得られていませんorz まあ、そもそも根本的にインターネット周りのプログラミング経験がない。TCP/IPなんかのソケット通信は経験してたりしますがHTMLだとかJavaScriptなんかは基本的な事は分かります。でも、ほぼ素人レベルと同じかも。

で、先週色々と見ていて「スクレイピング」って言葉を初めて見かけ、AngleSharpでって事でグーグル先生のお世話になっております。別にネット上の情報収集したい訳じゃないので、どストライクな方法ではない気もしますが、自動ログインとかも出来そうなので情報収集しています。WebView2ではサイトがまあ見えている状態でごにょごにょして結果を得るので視覚的に分かり易いのですが、その分もっさりなのと、そのもっさりを待つプログラミングが適切に出来ていないのが原因な部分もありそうで難航してるので、少し踏み込んで行ける方法が見つかればと。

2023/01/06

複数テーブルからのデータ表示

 C#でのプログラミングもそうですが、Windowsアプリとか、プログラミング経験(言語ではBASIC,Pascal,FORTRAN,PL/I,HPL,C等)だけは長いけど(43~44年程)、プロとしてはもう30年近く前に引退し、趣味的に継続してるだけなので躓いてばかりです。個別のテーブルからのデータ表示ならDataGridViewで実装なんかもしてます。

今や悩んでいるのは大まかに3つのテーブルから日時でソートして一覧表示して観たい。なのでDataGridViewでは行毎に列の内容が異なるから使えない。あっ、まあ、主となるキーが日時なんで、そこは固定してそれ以外を大きな列に複数の情報を含むものにすれば可能かもですが見え方は微妙かなっと。内容に色付けとかして見やすくする為に表示にはRichTextBoxを使ってみようかとは決めてみた。

複数テーブルから取得したデータを格納してソート。その後にデータ種別で飾りながらRichTextBoxに書き出そうと思ってます。その格納方法で悩んでます。配列、リスト、ディクショナリーとかC#にはある感じですが、要素数が不定なので配列は不向き。リストかディクショナリーですが、ディクショナリーだとキーの重複が出来ない。なので日時でソートする上でキーは日時なんだけど、日時だけでは重複が確実に無いかは微妙かなって所が今検討中。ただ、キーを基にデータをって使い方はしないのでリストの方が適してるかな。文字列のリストとして文字列の先頭に日時を置いてソート時に使用して以降に諸々のデータを文字列として連結してRichTextBoxに書き出す時にそれなりの内容でってのがベストな気がしてきた。

もう少し検討してみます。

追記 2023.1.8 21:49
ディクショナリーで進めてます。キーはDatetimeで、バリューは3つのテーブルの必要な項目を含むクラスを定義して行けそうです😁

2023/01/04

Android-x86をVMwareの仮想マシンに入れてみた

 正月のお遊びでって事でもないが、実はこれって以前書いたPlaystation5のスクショなんかを手軽にPCに入れるって事で調べるとBlueStacksとかいうPC上のAndroidエミュレーターなのかな。これ入れてそれにPS App入れればみたいな話を見かけ、昨年暮れにBlueStacksについて調べてインストールを試みた。でも、これはそもそものインストールでインストール先変更に疑問があり中断。開発に質問のメールしたが普通に年末年始があるのか知らないが音信不通😅

で、その時に色々と調べている時に見かけたのがAndroid自体をPCにインストールって事で今回のAndroid-x86の話になる。で、早速ISOをダウンロードしてインストールしてみる。解説をグーグル先生を頼りに探して試みる。@ITの記事を参考に進めてみるが躓いた。記事を少し進んで読むとVMwareの仮想マシンのおすすめ設定なんかもあるので参考にすると良いのかも。自己流で適当に作成したら躓いたので真似してみた。で、更にインストールの説明で

  1. Advanced optionsを選択
  2. Auto_installationを選択
  3. Yesを選択
の後が問題。Reboot選択するとコマンドプロンプトになり、どうしていいのか不明。CDとかLSなんかのUnixライクなコマンドは使えるようだが全く進めない。で、ここで普通にRebootではなくRun Android-x86を選択すれば起動する。

で、更にここで日本語入力する為にPlayストアで「google」って入れてgoogle 日本語入力を探して入れるってのがねぇ。相当探しました。で、グーグル先生に確認すると既に提供止めてて今はgboardとかいうのがって話でした。

VMwareで仮想マシン立ち上げると相当待たされます。

画像貼り付けがなんか変になったけど修正方法不明orz