- 木俣ロバート久の weblog

木俣ロバート久の日々の記録

単独のまとまった記事としての話題ははてなブログの木俣ロバート久の覚書に書いています

12 時頃、食事をしようと思っていたら会社から連絡があり出社

丁度いい?ので 13 日の代休を検討中

くしゃみをしたら 5 分間程度視界の端に稲妻の様なものが見えるようになった

稲妻と言うか、輝く黄色や青 "<<<" の様な形が視界の端に折れた線で現れた

これ自体は数分程度で収まったのだがその後も目に違和感が残っているし、何か眼底に問題が生じているのかも知れないのでとりあえず通院

会社近くの眼科で受診した所、異常はないとの診断結果でまずは安心だが眼球内の血管に動脈硬化があるようなので複数回同じことが起こったら内科を受診すべき眼鏡の度があってないので作り直すべき眼精疲労がたまっている様なので目薬を処方するとのこと

とりあえず痩せろと

はい

森博嗣先生の新刊、馬鹿と嘘の弓が発売されたの購入して読了

馬鹿と嘘の弓』森博嗣|講談社文芸第三出版部|講談社BOOK倶楽部

広い意味でキャラクター物のライトノベルだろうか

面白ければジャンルなど何でもいいが

面白かったので同じような作品を探したいと言う動機でのグルーピングであれば著者: 森博嗣で良いとも思う


会社近くで夕飯を摂る必要が生じたので余り混んでいないのを確認してから久しぶりにカレーハウス CoCo 壱番屋で夕食を食べた

他の客との距離その他気を使って手早く食べて出たのでおそらく大丈夫だと思うが、早くコロナの心配などせず外食できる日が来ると良いな、と思うなど

店側は対策頑張っていると思うのでこれ以上は致し方なし

この weblog の見出しの ID は正規表現で言うと [A-Z][0-9A-Z]{7} にマッチする文字列としていて script で自動生成しているが PowerShell の Get-Random の仕様は Maximum の値は含まない所を含むと勘違いしていて最大値が出ず "Z" が含まれない状態になっていた

Get-Random (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs にも Get-Random returns a value that is less than the maximum (not equal). とわざわざ書いてある

その上で、罠では

今回の場合 "Z" が含まれていなくても [A-Z][0-9A-Z]{7} にはマッチするし正しく実装されていても個々の実行結果には全ての文字は含まれておらず、シード値を固定しないと個々の実行結果の再現性もない

こう言う場合はどのようなテストを書いたらよいのだろうか

更に全ての文字が均一な確率で出現する仕様なのに "Z" だけ出現頻度が低いバグが仮にあったとしてテストすればよいだろうか

十分な回数実行して仕様通りの確率で結果が返って来ることを確認する、位しか思いつかない

それしか思いつかない以上そういうテストを書くしかないか

ごろから風邪を引いた

鼻水に始まりくしゃみ、微熱感、そして喉にきて咳が出ている

所謂季節の変わり目の風邪と思われるし、風邪を引くと扁桃腺が腫れて咳が出るのはいつものことなのだが時節側周りは気になるだろうし大変宜しくない

喉飴などを舐めて喉を炎症を極力押さえるよう努力しているが例年通りなら風邪が治った後も咳癖がついて 1 月間程度咳が出続ける

今の症状自体はただの風邪だが COVID-19 の症状がでても気付かないで放置してしまう可能性もある

大変宜しくなくどうしたものか

ちなみに職場の過度な冷房が原因だと思っているが何度温度を調整しても下げる奴がいるし上司に言っても具体的な解決策が示されもしないので諦めている

Final Fantasy XIVは公式にファイナルファンタジーXIV ファンキットとして壁紙やアイコンなどを配っているのだが一々 download するのが面倒くさいので PowerShell で downloader を作った

Invoke-WebRequest を使って URL から HTML を取得して、正規表現で画像のアドレスを抜き取り、Invoke-WebRequest を使って画像を保存する

今回は DOM を使って解析するより正規表現で a 要素に指定された画像のアドレスを抜き取った方が話が早かったのでそうした

実際には download フォルダやファイルの存在確認や連続実行してもサーバーに負荷を掛けないようなチェックを入れたが骨子部分としてはざっくり以下の通り

[String] $DownloadFolder = [Environment]::GetFolderPath('UserProfile') |
Join-Path -ChildPath 'Downloads';
[String] $uri = "https://jp.finalfantasyxiv.com/lodestone/special/fankit/desktop_wallpaper/5_0/";

(Invoke-WebRequest -Uri $uri).Content -split "`n" |
Where-Object { $_ -match '<a\s[^>]+>((ダウンロード(<br\s?/>)?[^<]*|<img\s[^>]*>)</a>|$)' } |
ForEach-Object { $_ -replace '<img\s[^>]*>', '' } |
Where-Object { $_ -match 'https://.+\.(zip|png|jpg)' } |
ForEach-Object { $_ -replace '.+"(https://[^"]+)".+', '$1' } |
Where-Object { -not [String]::IsNullOrEmpty($_) } |
ForEach-Object { Invoke-WebRequest -Uri $_ -OutFile (Join-Path -Path $DownloadFolder -ChildPath (Split-Path $_ -Leaf)); }

肝心の画像の URL 取得部分がサイト依存ではあるのだがざっくりこんな感じで色々なダウンローダーの雛形になりそう

Code 要素の内容について literal っぽい場所HTML の要素っぽい場所PowerShell の型の名前っぽい場所span 要素で markup するようにした

もともとは var 要素で変数を markup するつもりだったが、逆にこちらは実装しなかった

あるプログラミング言語のソースコードが HTML の中に書かれていたとして、それがソースコードである事を示すために code 要素で markup するのは意味があるが、その文法をマシン向けに示したいなら HTML で markup するのではなくそのプログラミング言語の解析機に渡すのが筋だし、人間向けに変数を強調して示したいなら一律に markup する必要はない、と言う結論した

HTML の装飾的 markup を行う script を大幅に書き換えた

結果、コードもかなりすっきりしたし、拡張もしやすくなったし、バグの余地も少なくなった、と思う

よき哉

で、調子に乗ってルールを追加した結果、繰り返し実行すると実行回数に比例して実行時間が掛かる症状が発生

実行する度に Text Node を細切れにしてノード数を爆発的に増やしているから、と言う原因はすぐに思い当たったが解消するためのメソッド名が思い出せず DOM 最適化などで検索して Normalize に辿り着くまでが結構時間がかかった

現時点で実行速度に不満はないが他のロジックでも要素の内容を弄ったら豆に Normalize を実行した方がいいかもしれない

ちなみに、極めて簡易な文法解析を行っている訳だが余り凝る気はない