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


2023/01/03

VMware Workstation 17 Player

 新年早々元日に新バージョンがリリースされているのは発見。インストールまではしたんですが、仮想マシンの作成なんかは時間が取れずに先程からトライ中。まあ、当然の事ながら仮想マシンに入れるOSの選択肢に「Windows11 x64」があり以前書いたおまじないは不要です。ただ、動きはもっさりしてるので、その辺りのおまじないは相変わらず必要かもなのでOSインストール後にしてみます。インストールには正味30分程度で完了するのは有難いです。何時の頃のWindowsか忘れましたが普通に1時間以上掛かるのに何度かインストールし直しとかねぇ。もう、苦行でしかなかったです。

以前にも気が付いてはいましたが、Windowsをインストールして個人用に設定するにはマイクロソフトのアカウントでログインが必要です。普段使いのPC用にクリーンインストールのし直しとかなら良いんですが、仮想マシンは諸々のテストなんかで使いたい。それが実マシンにも反映される事を前回仮想マシン構築後にお試しソフトのインストールとかした時です。仮想マシンに入れたソフトが実マシンにも勝手に入って来て、何だ?ってなりました😅

仮想マシンのみばえ

まあ、取敢えず今回も仮想マシンはフルハイビジョンにしてみました。いや、これ、今作ってるアプリが一般的にどう見えるのかのテストにも必要なんで前から用意しようと。


2023/01/02

43NANO75JPAにBluetoothワイヤレスイヤホンのペアリング

 昨年9月にPCモニター用に購入して快適に使ってましたが、Bluetoothのワイヤレスイヤホンのペアリングが出来ずにアマプラの視聴では態々PC起動してPCにワイヤレスイヤホンをペアリングして視聴してました。昨年の大晦日に再度ペアリングに挑んでみました。

結果から書くとまあ普通に出来ました。まあ、取説とかそもそもあまり見なくなり自力で何とか使う努力する習慣からテレビの[設定]→[詳細設定]→[機器設定]→[外部デバイス]から[Bluetoothコントローラーの接続]するんだと決めつけて何度かしてたんです。で、ふと画面見ながら、そこに並ぶデバイスは全てテレビへの入力デバイスでテレビからの出力デバイスじゃない事にやっと気が付き、[設定]→[スピーカー設定]→[Bluetoothデバイス]がある事に気が付き、そこからペアリングすれば問題なくペアリングが出来ました😂

まあ、当たり前な気もしますが、ほんの少し違う見方でメニュー辿っていたので何で出来ないのか苦労しました。これで、アマプラの映画はPC無しで節電にもなるのでやれやれです。

KeyPreviewはあるがMousePreviewが無い

 元日はだらだらと生産的な作業はせずのんびりと過ごしました。が、今日からは気合入れて挑んでます。マウスの[進む][戻る]ボタン対応をアプリに実装する処理を考えてました。フォームのMouseDownイベントハンドラ追加しても、フォーム上のコントロールが置かれている場所では先にコントールのイベントに行くらしくフォールのイベントハンドラには飛んでこない。グーグル先生に聞くともう10年以上前から多くの方が悩んでるのが分かる。しかも、具体的な解決策はねぇ~orz

フォーム上に配置した全てのコントロールにイベントハンドラ追加すれば問題は解決するんだと思うが当然多くの方はスマートな方法ではないと判断して苦労している模様。まあ、そんな事はMSは関知せずかな。まあ、実装においてそれで実現しておけばしのげるのは確かかと。

private void RedirectMouseDown(object sender, MouseEventArgs e)
{
    Control control = (Control)sender;
    Point screenPoint = control.PointToScreen(new Point(e.X, e.Y));
    Point formPoint = PointToClient(screenPoint);
    MouseEventArgs args = new MouseEventArgs(e.Button, e.Clicks,formPoint.X, formPoint.Y, e.Delta);
    OnMouseDown(args);
}
これを定義しておいてフォームのLoadイベント内で
foreach (Control control in Controls)
{
    control.MouseDown += RedirectMouseDown;
}
ってすれば、まあ、取敢えず機能するっぽい。

追記 2023.1.3 10:39
新年早々甘かったorz 上記のControlsコレクションにはコンテナタイプのコントロールだと内部の物には適応されないです。なので再帰的に全てのコントロールを取得するメソッドを用意してイベントハンドラを追加する必要がありました。

private Control[] GetAllControls(Control tc)
{
    ArrayList al = new ArrayList();
    foreach (Control c in tc.Controls)
    {
        al.Add(c);
        al.AddRange(GetAllControls(c));
    }
    return (Control[])al.ToArray(typeof(Control));
}
としてフォームのLoadでは
Control[] allControls = GetAllControls(this);
foreach (Control control in allControls)
と修正する。