「TIL」に関する日記

「Today I Learned」今日学んだこと。

次>

アンパンマンDBとRector

アンパンマンDB(記事更新)

来週の放送情報。
ガレットさん着実に登場回数重ねてる?

アンパンマンナイトの情報が出たので。

Rector(Today I Learned)

Rector: Fast PHP Code Upgrades & Refactoring
PHP向けの静的解析。
エラーにはならずとも、リスクになるコードとか、きれいに書けるところなどを徹底的に見つけ出してくれます。
で、修正までしてくれる優れものなのですが、1400も修正箇所が出てきて、さすがにこれを丸投げするのは怖いなということで、--dry-runで様子を見ながら手作業で修正しています。
言うて新機能が追加されるわけでもなけりゃバグが直るわけでもないわりに修正ミスで壊れる可能性があるから労力掛けてまで頑張る必要ないかもしれんな。
古いコードの温床となってるWikiのWordPressへの移行のほうが先でいいかも。

UseLayoutRounding(Today I Learned)

FrameworkElement.UseLayoutRounding プロパティ (System.Windows) | Microsoft Learn
WPFでUI要素をピクセル境界に合わせるSnapsToDevicePixelsプロパティがうまく効いてない場所があるなーと思って調べていたら、似た役割のUseLayoutRoundingを見つけました。
SnapsToDevicePixelsは指定した要素自身をピクセル境界に合わせ、UseLayoutRoundingは子要素のレイアウトをピクセル境界に合わせるということかな。
ただ、子要素の相対位置をピクセル単位に合わせるという動作らしく、指定した要素自身がピクセル境界からずれていると意味がないようです。
だから、Windowとかの一番外側の要素に指定して、あとは余計な指定をせず継承するに任せておくという運用がいいのかな。
WPF版ふにゃでもぼやける部分があったんで、これで対策できないか試してみたいところです。

ズートピア2とResend

ズートピア2


映画『ズートピア2』公式サイト|ディズニー公式
1見てないのに2観てきました。
こういうのファインディングドリーでもやったな。
1がジュディとニックが正式にバディとなるまでの話で、2が正式にバディとなった後の話かな。
基本的ににぎやかで愉快な雰囲気を貫きつつ、仲間だからって同じようにしなくてもいいみたいなテーマ性ははっきり真剣に描いている感じでしたね。

Resend(Today I Learned)

Resend · Email for developers
開発者向けメール送信サービス。
「開発者向けメール」送信サービスじゃなくて、「開発者向け」メール送信サービスね。
今うちのサイトではけっこう古いライブラリ使ってウェブサーバー内のsendmailで送っているので、セキュリティとか機能とか到達しやすさとかを考えると、乗り換えたほうがいいんじゃないかなーとか思うんですよね。

Tably Music PlayerとFile.ReadAllLines

Tably Music Player

とりあえず、課題立てときました。

File.ReadAllLines(Today I Learned)

mifumi323/ReadAllLinesTest: .NETのFile.ReadAllLinesの最終行の扱いを確認するプログラム
普段何気なく使っているFile.ReadAllLines、最終行の改行コードの扱いが気になって、ちょっと確認してみました。
結論、最後の改行コードはあってもなくても同じ結果になる、つまり、最後に空行が発生したりはしないようです。

ドラゴンクエスト10とfnmatch

ドラゴンクエスト10(しろいコキン)

テンの日!
…は、ともかくとして。

あばれこまいぬにひばしら

  • クエスト「天地雷鳴士の式/交わらぬ水魚」をクリアした!

ちょっとずつでもクエスト進めていくよ。
今回はお使いの最後にヨイちゃんからちょっとしたご挨拶があったぐらい。

fnmatch(Today I Learned)

PHP: fnmatch - Manual
ファイル名のパターンマッチに正規表現使うのだるいなーシェルとかで使うような簡単なやつ使えないかなーとか思ってたら、ありました。

Pythonにもあるぞ!
Rubyにもあるぞ!
C言語にもあるぞ!…って、これがたぶん元祖だろうな。

どこでも使われるような当たり前の機能にはちゃんと標準ライブラリがついているんですね。
確か全く別の名前だけど.NETにもほぼ同じやつがあったはず。

ゲーム記とHTML/HTTPと8番出口

ゲーム記


せっかくなので、動画も出せるようにしてみました。
あと、タイトルの編集機能も実装。
これ頑張ろうとしたせいでNintendo Switch 2のページ今日も公開できなかったけど、削除までできたらさすがに公開に向けてちゃんと動き出せそう。

HTML/HTTP(Today I Learned)


動画表示実装してて見つけたやつ。
一気に全部ダウンロードしちゃったらページ重くなるんでvideoタグの使用に消極的だったのですが、206 Partial Contentにより最初の部分だけをダウンロードする仕組みになっていて、むしろ画像より軽いという結果になりました。

<video>: 動画埋め込み要素
videoタグのpreload属性がmetadataの場合にこのような挙動になるようで、Google Chromeの場合は初期値がこれだったようです。

videoタグのはなし - クラウドワークス エンジニアブログ
ブラウザによっては一部だけダウンロードがうまくいかないっぽい?
記事は2016年だから今は状況変わってるのかな。

8番出口

一日たってもまとまんなかったから思ったことネタバレ込みで書き連ねるよ。

  • 歩きスマホしてなきゃそもそも巻き込まれずに済んだんですよ!!!!
  • 冒頭の赤ん坊の声めちゃくちゃでかい。怒鳴る客の気分を追体験しているのか。
  • 主人公の悩みも赤ん坊関連なので追加異変にも赤ん坊にまつわるものがある。無理な人は本当に無理なやつだと思う。
  • 複数異変同時に発生するとか聞いてない!しかも特別怖いしグロいしこれも赤ん坊要素あるし!!
  • 序盤は単に理不尽な怪異という感じだったけど、だんだん主人公の心象風景みたいな異変になってくる。たまたま迷い込んだのではなく、招かれるべくして招かれた可能性あるな。
  • おじさんの掘り下げある。異変に取り込まれると自分自身が異変になってしまうのか。
  • おじさんが出会った女の人も脱出に失敗して取り込まれた人ってことで間違いないんかな。そしておじさんが取り込まれたことで異変役交代と。
  • 途中で時系列が乱れるんだけど、時間もループしてた?
  • 異変かそうじゃないのか迷う場面があるのはゲームと同じか。
  • ループの継ぎ目で異変がすっぱり途切れるの、地味に原作再現だね。
  • タイルマンとか壁男とか呼ばれてるあの異変は出ない。銀幕でダッシュするあの人見たかったんでちょっと残念。
  • もう一つの代表的な異変の洪水はパワーアップして登場。これも無理な人は無理だろうな。
  • ポスターは監視カメラ以外総差し替え。バイトのおねえさん見たかったな。
  • 喘息描写前半はしつこいぐらいだったのに後半では気配すら感じなくなった。何だったんだろう?
  • 映画全体も一つのループ。そのループを「抜け出そうとする行動の開始」で映画は終わる。皆まで語らずともわかるよな?

ドラゴンクエスト10とアンパンマン日替わり紹介botとPHPとfunyak

ドラゴンクエスト10(ァォィョッュ)

幻の海トラシュカ2025
お宝集めて大航海!「幻の海トラシュカ2025」 (2025/7/23)|目覚めし冒険者の広場
お宝集めだ!
今回はなんだか例年以上にラグがひどいみたいで、何が起きてるかわからないうちに何度も海に落ちました。
普段ならラグ読みで早めに回避したりしていたんですが、そもそもいつの間にか画面から自分がいなくなってますからね。
本当は全員分一気に行く予定でしたが、今日のところは一回だけで終わらせました。
報酬集めるならもうちょっと空いてから周回かな。

他の写真は以下から。…って程にも多くないけどさ。
写真置き場「2025/07/30」

アンパンマン日替わり紹介bot


まだ本番環境には反映してないですが、紹介botの本日の情報、短縮表記を試しています。
TwitterAPIの制限が本当に厳しくて、なるべく情報量を落とさない範囲で投稿数を減らしたいんですよね。
で、実際に同じ日付の投稿と見比べてもらえればわかると思うんですが、投稿数を2から1に圧縮できました。
効果あるんだからさっそく使おう…と言いたいところだったのですが…


画像もまとまっちゃうので、その他大勢の合成画像が異様に縦長になっちゃう!
こっちもうまく対応できてから、本番適用と行きたいところです。

PHP(Today I Learned)

文字列(という名のバイト配列)から画像を読み込む関数。
紹介botに出す画像はPNGとJPEGなんですが、将来的にはWebPも使う可能性があるので、imagecreatefrompngとかimagecreatefromjpegとかを一つ一つ使っていたらきりがないなって思ったんですよね。
これなら、ファイルをメモリに読み込むのは自前でやる必要はありますが、ファイルフォーマットは自動で判別していい感じに読み込んでくれるはずです。
とりあえずは、本当に使えるかどうかの確認からかな。

funyak

このプルリク、どうしよう。
セキュリティ上の修正なんだから、本当ならとっとと採用したいところなんですが、これ、ビルドは通るけど実際に実行するとエラーで落ちるんですよね。
動かなかったらもうセキュリティもへったくれもないわけで。
さすがに不採用というわけにもいかないから、自分でエラーをどうにかしてマージかな。

ドラゴンクエスト10とアキタラヤメル[ただの乱数表]とCSS

ドラゴンクエスト10(しろいコキン)

  • クエスト「ロード・オブ・どうぐ使い/どうぐを愛した男」をクリアした!

またほんのちょっと道具使い強くなったぞ!

りんごのゆかた

  • クエスト「七夕デート大作戦!」をクリアした!

しろいコキンも七夕イベントクリア!

他の写真は以下から。
写真置き場「2025/07/03」

アキタラヤメル[ただの乱数表]

わざわざ告知するほどでもないのでここで言いますが、ダークモード対応しました。
地味に我がサイトで初の快挙です!

CSS(Today I Learned)

@media (prefers-color-scheme: dark)
これがダークモード対応用のCSS。
メディアクエリで囲います。
CSS全文はこれ。

CSS 入れ子の使用 - CSS: カスケーディングスタイルシート | MDN
今、CSSってネストできるんですね。

prefers-color-scheme - CSS: カスケーディングスタイルシート | MDN
ダークモード対応のほうのドキュメントはこれ。

アンパンマンDBとドラゴンクエスト10とWindow: message イベント

アンパンマンDB(記事更新)

来週の放送情報。
夏にタンポポ…?
いやまだ5月か。

ドラゴンクエスト10(おきがえリポちゃん)

おきがえリポちゃん ~ 闇の大魔王ローブ ~
おきがえリポちゃん ~ 闇の大魔王ローブ ~ (2025/5/21)|目覚めし冒険者の広場
今月の貸衣装。
ゾーマのようでゾーマじゃない、ちょっとゾーマっぽい衣装です。
せっかくのゾーマイベント中なので、アレフガルドで着てみました。
ゾーマ倒す前は強制的に勇者の服に着替えさせられるので、本物ゾーマとのツーショットは無理でしたが。

他の写真は以下から。
写真置き場「2025/05/23」

Window: message イベント(Today I Learned)

Window: message イベント - Web API | MDN
GitHub CopilotのエージェントモードにJavaScript生成を任せてみたら出てきたのがこのイベント。
オブジェクト間でメッセージを授受するのに使うやつです。
そんなに込み入ってないプログラムでも便利に使えたりするんだなぁという知見。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

画像の追加とちょっとした加筆です。

WinUI3(Today I Learned)

C# WinUI 3アプリでタイトルバーのアイコンをカスタマイズする方法 – マゴトログ シュミニイキル
せっかくだからアイコンも付けるかーと思ってWindowのプロパティを調べてみたら、アイコン設定用のプロパティなんかなくて、だいぶ回りくどいことが必要でした。

var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
appWindow.SetIcon(@"Assets/icon.ico");

アイコンなんてウィンドウの基本なのになんでだよ!

WinUI3(Today I Learned)

Slider.ThumbToolTipValueConverter プロパティ (Windows.UI.Xaml.Controls) - Windows UWP applications | Microsoft Learn
MediaPlayerElementが標準で持っている再生UIに不満があったので、自前で実装してました。
再生位置を示すシークバーにはSliderを使ったのですが、Sliderに指定できるのは単一のdouble値のみ。
当然、再生位置はTimeSpanで表されるので、doubleに変換して入れてやることになります。
そうすると当然、Sliderをつまんだときに表示されるツールチップも、デフォルトのままでは小数値が表示されます。
ということで、そのツールチップの表示変換を行うのが、ThumbToolTipValueConverterです。
IValueConverterを実装したクラスのインスタンスを渡してやると、変換されます。
表示に使うだけなので、必要なのはConvertだけで、ConvertBackは未実装のままでもなんとかなります。
これも後でまとめてQiitaあたりに書いとくか。

Avalonia UIとドラゴンクエスト10

Avalonia UI(Today I Learned)

どうやらウィンドウも普通に表示できる模様。
ビューモデルから親ウィンドウを直接たどる方法が見つからなかったので、メインウィンドウのインスタンスを静的プロパティに入れる必要があったけど、もっといい方法あるのかな。

ドラゴンクエスト10(しろいコキン)

カノック

  • クエスト「よみがえる王国/生きていた男」をクリアした!

突然、かつ今更、しかも季節外れのクリスマス衣装ですが、偽グランゼドーラのクエスト進めました。

(クエスト内容ネタバレ)

ひとくいドール
ボスのひとくいドール。
ニードルマンみたいなやつですね。
襲われてた人、めちゃくちゃモブ兵士顔で「誰?」って感じだったけど、たぶん塔に潜入してた時に何かされてた兵士かな。
ダイム老の孫という設定のようで、絶望に沈んでいた偽グランゼドーラにちょっとだけ希望が戻りました。

他の写真は以下から。
写真置き場「2025/02/25」

のんびりナマライザとAvalonia UIとドラゴンクエスト10

のんびりナマライザ

.NET Frameworkのバージョンを上げるだけの単純な修正。
CI関連の機能が古すぎて動かなくなっていたので、そっちも更新しました。
さて、特に新機能も本体のバグ修正もないわけだけど、いつリリースしようか…。

Avalonia UI(Today I Learned)

Avalonia UI
.NET向けのクロスプラットフォームUIフレームワーク。
Microsoftではなく、サードパーティ製です。
WPFみたいな感覚で使える模様。

ドラゴンクエスト10(しろいコキン)

人食い火竜 煉獄火炎

  • 食人火竜スレイヤーの称号を得た!

しろいコキンも人食い火竜やっつけました!
ミフミンのときの経験から、ハンマー盗賊が相性よさそうだったので、それ中心の編成で。

人食い火竜 獄炎テンペスト
ミフミンがやられたのはこの技、獄炎テンペスト。
さすがにこれが来るとわかっていれば、近寄ればいいだけなので難なくやり過ごせたのでした。
…と思いきや、効果範囲が正反対のスーパーノヴァをその後使われて、同じ感覚で近寄ったら、密着状態で見事に燃やされてしまったのでした。
まあ、最終的に炎耐性100%の優秀なサポたちがどうにかしてくれたわけですが。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

来週の放送情報。
歴史の長いキャラで固めてきた感じですな。
食パンとジャムって一番合うのにキャラの組み合わせとしてはこれが初なんだ。

WinUI3(Today I Learned)

先日悩んでた動画スクショの件、解決しました。
CopyFrameToVideoSurface メソッドを使えばよかったのでした。
実はあの時もそのことまでは突き止めていたものの、コピー先となるIDirect3DSurfaceをどう用意すればいいのかがわからなくて詰まっていたのでした。

MediaPlayer を使ったオーディオとビデオの再生 - UWP applications | Microsoft Learn #フレーム サーバー モードでの MediaPlayer の使用

答えは結局サンプルコードの中にあったのです。
使うのはCanvasDeviceCanvasBitmapです。
WinUI3本体には入っていないので、NuGetでMicrosoft.Graphics.Win2Dを入れます。
VS2022に任せているとWinUI2用のWin2D.uwpを入れさせようとしてくるので注意です。

WinUI 3(Today I Learned)

スレッド機能の移行 - Windows apps | Microsoft Learn
WinFormsでも厄介だった非同期処理でのUI処理。
WinFormsで使ってた方法そのままは無理なので、ちょっと違う方法になります。
とはいえ、使うメソッドが変わっただけで、メソッドを一枚噛ませてやるという構造自体は変わらない模様。

ListViewBase.ScrollIntoView メソッド (Windows.UI.Xaml.Controls) - Windows UWP applications | Microsoft Learn
そんでもってこっち。
ListViewはプログラムで選択を変えても自動でそこまでスクロールしないので、同じくプログラムでスクロールさせてやる必要がありました。
とはいえ、どこまでスクロールするかを指定する必要はなく、メソッド一つでよしなにしてくれます。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

コラムから転記。
転記元の時点で文章がおかしな部分があったので、コラムともども修正しています。

WinUI 3(Today I Learned)

データ バインディングの詳細 - UWP applications | Microsoft Learn
これまで「Binding」によるバインディングしか使ってなかったけど、「x:Bind」によるバインディングも調べてみました。
「Binding」が動的に解決するのに対して、「x:Bind」は静的に解決するということ。
つまりまあ、コーディング中にもう既にどこからデータが来るのかわかっているということですな。
で、コーディング中に既に分かっているので、インテリセンスがどんどん自動的に候補とかを出してくれるし、実行中にデータを探しに行ったりしないので、動作も高速と。
「Binding」でしんどい部分があったから「x:Bind」を調べ始めたんですが、思ったよりだいぶいいですね。
もちろん、やりたいことを全部簡単に完全にできるというわけではないですが。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

コラムから転記。

WinUI3(Today I Learned)

ピッカーでファイルやフォルダーを開く - UWP applications | Microsoft Learn
Windows App SDK, WinUI3, Desktopでファイル選択ダイアログを表示する #C# - Qiita
ファイルダイアログを開く方法。
やっぱりWinUI3でもファイルの読み書きはしたいですからね。
エラーなく動かすためには気持ち悪いおまじない書かないといけないというのが残念なところ。
将来的に開発が進んで不要になったらいいけど、マイクロソフトのこれまでから考えると、普及しないまま開発が止まって立ち消えるというのもありうる…。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

Blu-rayの情報出るの待ってたんだけど、結局なさそうだったので、DVDの情報を追加。

WinUI 3(Today I Learned)


設定ファイルはどうするのかなって思って昔ながらのSettings.settings追加してみたらこの通り。
参照が足りないといわれつつも、必要な参照は候補に出ず、どうやら昔と同じ方法では動かないようです。

Recommended way of doing user settings with WindowsAppSDK 1.0? · microsoft/WindowsAppSDK · Discussion #1478
ここを見る感じ、UWPのやり方を踏襲して、Windows.Storage.ApplicationDataを使うのがいいのかな。

WinUI 3(Today I Learned)

DataGrid - Windows Community Toolkit | Microsoft Learn
ListView クラス (Microsoft.UI.Xaml.Controls) - Windows App SDK | Microsoft Learn
これまでDataGridViewとかでやっていたことをやろうと思ったら、素直に考えればDataGrid。
ただ、WinUI 3では標準機能ではなく、NuGetでライブラリとして導入する必要があります。
標準機能にあるListViewは、ヘッダ表示とかは期待できませんが、テンプレートをうまく使えば、複数列表示も可能です。
外部依存を不必要に増やすのはあまり面白くないし、いったんListViewを試してみようかな。

ドラゴンクエスト10とWinUI 3

ドラゴンクエスト10(ミフミン)

モンスターバトルロード 協力チャレンジバトル 防衛軍
モンスターバトルロード 協力チャレンジバトル (2024/9/11)|目覚めし冒険者の広場
ひとまずミフミンだけですが、一通りやってみました。
防衛軍とかパニガルムとか、通常のモンスターバトルロードとは違うバトルもありました。
ストーリーの都合上普通には挑めないパニガルムはもちろんのこと、なんとなくしんどそうで手を付けていなかった防衛軍も今回が初挑戦でした。
究極邪教司祭とフラウソンが特に強かったですね。
究極邪教司祭に関しては前半戦がぬるかったので油断もあったかと思うのですが、フラウソンに関しては、立ち回りを理解していないと生き返ったそばから殺されていく感じ。

ピコピコハンマー
そんなわけで、イベントの報酬でアイテムも交換してきました。
以前の協力チャレンジバトルには参加してなかったので、過去の交換アイテムから見た目が面白そうなのを。

他の写真は以下から。
写真置き場「2024/09/22」

WinUI 3(Today I Learned)

Windows Controls and patterns - Windows app development - Windows apps | Microsoft Learn
このあたり見ながら、レイアウト関連いろいろ試してます。
Two-pane viewは、レスポンシブデザインっぽいことをできるやつ。
Split viewは、横から別画面がにゅっと出てきて、元の画面にかぶさる(or並ぶ)やつ。
Split viewのInlineは切り替え時のアニメーションがおかしくなってるから、コンパクトサイズ0のCompactInlineで実装する必要がありそう。いずれ直るかもだけど。

それとは別になるけど、
2 ページ間でのピア ツー ピアのナビゲーション - Windows apps | Microsoft Learn
完全に別画面に切り替えるならWPFのころから使えたPageをFrameに出す感じですね。

次>