2024/02/23(金)Ruby XMLRPCでdokuwikiのAPIをコールするとエラー

2024/02/23 18:52
最近機会があってdokuwikiを触っている。
DBを使わないので遅いが、その分設置場所の選択肢が多い。
PHPが使えるフリーサーバーがいくつかあるので、小さいチーム作業や情報公開用途であれば扱いやすいと思う。

さて、dokuwikiは標準でXML-RPCによるAPIを備えているのだが、Rubyからコールしようとしてハマった。

このサンプル通り、
xmlrpc:clients:devel:xmlrpc:clients [DokuWiki]
require 'xmlrpc/client'

server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084)
result = server.call("dokuwiki.getVersion")
pp result
としてコールしても、
XML-RPC server accepts XML requests only.
が返ってきてしまう。

環境は、
・dokuwiki: Release 2024-02-06a "Kaos"
・PHP: 7.4
・Ruby: 2.7
HTTPサーバは問わない。

調査。

・RubyのXMLRPCはリクエストのContent-Typeに"text/xml;charset=UTF-8"がセットされる。
・dokuwikiのXML-RPC APIは"application/xml"か"text/xml"だけを受け付ける。これはcharsetがあるのもダメっぽい?

うーん、リクエストにcharsetはあっても良いはずなので、dokuwiki側のコードがかなり変か何かを読み飛ばしてるかもしれない。

とりあえず、RubyのXMLRPCはhttp_header_extraをセットすることでヘッダーを上書きできる。
コレを使って、以下にすれば動く。
require 'xmlrpc/client'

server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084)
server.http_header_extra = {"Content-Type" => "text/xml"}
result = server.call("dokuwiki.getVersion")
pp result

2023/11/28(火)SDHCカードは壊れる(特にRaspberryPiのものは)

2023/11/28 23:07 PC(全般)
SDカード類はこれまで致命的に壊れた経験がなかったのだが、ここきて立て続けに壊れたのでちょっとメモ。
原因別に3つくらいあるっぽいが、よくわからないことも含めて記載しておく。

・物理的故障
チップ内の接触・接続や端子の損傷。
SDカード形状だと内部問題は起きづらそうだが、microSDカードだと曲げに弱く問題を起こしそう。
認識が怪しくなってきたりしたら要警戒。

・チップ寿命
チップに書き込む度にチップの寿命を消耗する。
温度や放射線ももちろん影響はする。
ファイルの読み書きが遅い・エラーが発生するとなったら要警戒。

・管理領域損傷
SDカードの管理を行っている領域の損傷…と書かれているものを良く見かけるのだがどの領域かわからない。
ここからは推測。
SDカードは著作権保護(CPRM)用の特殊管理領域(ユーザが読み書きできない)、記憶領域(ユーザが読み書きできる)に分かれる。
記憶領域内の先頭部分に、MBRやGPT用のセクタがあるはずでそこが読めなくなったり書き込み不良になると死。
CPRM領域に不良が起きた場合はちょっとよくわからないが、もしかしたらカードごと死ぬのかもしれない。
もしくはCPRM領域と記憶領域をMBRのさらに上のMBRのようなものがフラッシュメモリ内に有るのかもしれない。
チップコントローラのプログラム等は流石にSoC内に積んでると思う…多分。
ファイルリストが読めない・容量が間違って表示される・安定しないなどになったら要警戒。
発覚直後にOSで認識すらできなくなるケースも。
チップ寿命の特殊ケースということで一旦は理解する。

ざっと調べた限りSDカードでもウェアレベリングはしているとのことだが、
SSDのように大きめなメモリや強書き込み耐性のチップをキャッシュとすることが難しい。
ウェアレベリングがFATや写真データ記録を前提にしたアルゴリズムになってる可能性も有るとのこと。
ext4だと死にやすいとかは有るかもしれない。

最近Raspberry Pi Zero Wで使っていたmicroSDHCカードがOSで認識できなくなったので、これだったろうか。
ただ、コントローラが生きてれば認識くらいすると思うのだが…

また、そもそも
Raspberry Piは本当に壊れやすいのか
あたりにもあるようにRasPiも一般的なLinuxと同様に、電源をポンポン入れたり切ったりしては駄目とのこと。

ただ、この記事のNGケースはファイル単位の問題のようでより深刻な問題の発生原因は不明。

まとめと、今後の方針。
SDカード特にmicroSDカード形状のものは、
・同じフラッシュメモリをベースとしていてもSSDよりも壊れやすい。HDDよりも壊れやすいと言って良いかも
・壊れ方は様々だが、突然OSからの認識ができなくなるケースも頭に入れておく
・本来OSを入れるような用途に使うべきではない
・RasPiで使う場合はイメージを取っておくのとできるだけSDカードに書きに行かないような設定を行う
・容量には余裕を見る。50%以上空き容量がある状態を常用とする。
・バックアップは当たり前
・なくなって困るデータを入れない
・壊れたら即諦める。使い捨てと心得る
・古いものはどんどん廃棄。アクセスできなくなって入ってるデータがわからないのは最悪
・OSから認識しないような状態がなぜ発生するのかは結局よく分からなかった

なお、SDカード廃棄時は中身が読める場合は一応KillDiskでゼロフィル。
その上で、ペンチやニッパーで物理破壊して廃棄するので良さそう。

2023/10/22(日)ディスクのワイプあれこれ

2023/10/22 26:57 PC(全般)
HDD廃棄時のデータ削除ルールはDoDが有名だが、SSD時代に合わせて少し知識をアップデートしたい。
加えて、使っていたソフトがバギーだったことにも気づいたので、何年か使える定番の方法を決めたい。

▼削除時の機器構成
ノートPCにUSB HDDスタンドをつなぎ、HDDを挿す。
この状態で削除したい。
削除対象はPATA, SATA(SSD/HDD), できればM.2 SSDのやり方も定まると嬉しい。
このため、削除ソフトなりOSなりがHDDをきちんと認識してくれる必要が有る。

▼削除方法
JEITAの、
「パソコンの廃棄・譲渡時におけるハードディスク上のデータ消去に関する留意事項」
や、
消去方式「米国国防総省方式(DoD 5220.22-M)」 と今日におけるその利用について知っておくべきこと
などを確認。

まとめると、
・現在はDoDではなく、NISTのサニタイズ基準を標準として捉える人が多い
・データの削除には3段階(Clear/Purge/Destroy)の基準があり、このうちClearを目指すなら複数回の消去は効果が薄い。0クリア1回で十分
・複数回書き込むようなDoD Shortを適用するくらいなら、消磁など物理的な手段でPurge以上を選択肢として検討するべし
とのこと。

・HDD
ゼロフィルでClear。
データ密度が高い現代のHDDにおいては、一度ゼロフィルすると読み出すことはかなり困難なようだ。
データ密度のボーダーは15GBで、それ以上なら複数回書き込みはおまじないレベルっぽい。
それ以上を求めるなら、おとなしく消磁装置か物理破壊装置に送る。
(物理破壊装置に送る場合でもできればゼロフィルはしておくべき)

正直ddでも良いのだろうが、「デバイス名を間違えたら死」のリスクはできればGUIで回避したいという気持ちが有る。

・SSD
Secure EraseができればそれでPurgeが実現できている。
Secure EraseがないとSSDの原理上消去保証が大変だが、無いやつは最初から買わない方針で。

▼これまでHDD消去に使っていたソフト
Minitool Partition Wizard9 Free Edition (以下PW9)

パーティション操作の機能が豊富で、ワイプなどツールもたくさん備えている。
10以降はGPTとMBRの変換など一部機能がFree版から消えたため、9を愛用していた。
こいつだとUSB HDDもそこそこきちんと認識してくれる。

が、どうもこいつのワイプは信用出来ない。
何度か試していて、以下の事象が発生した。
・ワイプ処理を開始してもすぐに処理が戻ってくることがある(明らかにワイプが出来ていない)
・ワイプ処理を開始後、対象のディスクのアクセスランプが点灯しないことがある(おそらくワイプが出来ていない)
・ワイプでDoD Shortを選択したときにやたらと速い。
具体的には、MHT2040AT(40GB)を使用しての実験で、
ゼロフィル:37m50s
DoD short:36m40s
であった(DoD Shortを行っていない可能性が高い)

あまりにもあまりなので信用できないと判断する。

Minitool以外にもオールインワンのパーティション操作ツール(Paragon/EaseUS/AOMEI等)があるのだが、
個人的にこれらは共通のOEMかPartedMagicを元にしたツールだと思っている。

PW9が怪しいとなると、PWの新版・有料版、あるいは他社のツールもなんとなく信用し難い。
もちろん有料版もありなのだが、この手のツールは基本的にマイナーバージョンレベルのアップグレードも書い直しになる。
なかなかどれをと決めるのが難しい。

▼結論
HDDはゼロフィルで消す。
ソフトはKillDisk Freeware Versionを使用する。

気になるなら2回ゼロフィル。
どうしてもDoD shortをやりたいなら、KillDiskの有料版を購入。

PW9のような複合ツールのワイプはおまけであることが多く、「確実に消した」がどうもスッキリしなさそう。
単機能のKillDiskは証明書の発行機能等があることからもわかるように、そこの信頼性が高い。

また、何回か使ってみたが、下記の機能が気に入った。
・2台同時にワイプできる
・ワイプ完了後に所要時間を表示できる
・Free版でもUSB機器の認識が早くて正確

DoD Shortとかをやりたいなら有料版(4kくらい?)に手を出せば良さそう。

SSDはSecure Eraseで消す。
Windows上でTxBenchからSecure Eraseが使える。
このとき、SATA接続だとセキュリティロックされてSecure Eraseが送れないことが多い。
USBにつないで実行する。

心配なら、前提条件のノートPCに繋いで~を逸脱してしまうが、加えてマザーボードのSecure Eraseで消す。

NVMeとか条件で制約がないかはちょっとまだ試せていない。
一旦方針だけ決めておくが、実践時にまた課題が出てくるかも。

実は、KillDiskで10kくらいのバージョンにはSecure Eraseがついている。
これを買って1つのソリューションで綺麗さっぱりしてしまう手もありそう。

2023/10/22(日)Ext2Fsdは使うべきではない

2023/10/22 25:53 PC(全般)
メモ。

ext2~4をWindowsでマウントできるソフトとして、有名所でExt2Fsdというソフトがある。
実際これでうまくアクセスできるケースは有るのだが、上手く行かないケースがあまりに厳しいので覚書としてメモ。

今回、Linuxで使用していたHDDからデータを抽出する必要があり、
これを導入して計3回Windows10環境でマウントを行った。

対象はext3のパーティションを含むHDDで、USB HDDケースで接続した。

1回目→マウントできファイルの一覧が返ってくるがアクセスできない。そのうちエクスプローラが無反応になりすべての操作を受け付けなくなったためPC再起動
2回目→マウントでき、ファイルのリードは正常動作。
3回目→マウントできたがファイルの一覧が返ってこない。そのうちエクスプローラが無反応になりすべての操作を受け付けなくなったためPC再起動。無反応となっていたタイミングで、「マウントしようとしていたHDDのみならず、ありとあらゆるディスクライトでデータが0x00に化ける」現象が発生していた。

怖くてとても使えない。
マウントしようとしたHDDだけならまだわかるのだが全ディスク巻き込むのが相当きつい。
USB経由でアクセスしたのが悪さしている可能性は高そうだが、、、

1回目の事象を検知した段階で、2回目も3回目もメインPCでやるべきではなかった。
猛省。

2022/08/28(日)AutoIt!で動きが変

2022/08/28 20:31 PC(全般)
AutoIt!で作成したスクリプトで特定のアプリケーションに対し、
・Runで起動しないが、ShellExecuteだと起動する
・ControlGetTextで内容を取れるが、ControlSetTextで内容をセットできない
といった現象が発生。

原因は対象のEXEに、
「管理者としてこのプログラムを実行する」
チェックが入っていたから。

controlsettext not working - AutoIt General Help and Support - AutoIt Forums

UACの影響っぽい。

スクリプトの先頭に、
#RequireAdmin
を追加してやると問題解決した。

なるほどだけど、気づきにくいなあ。

2022/06/20(月)久々にプログラミングフォント調べた

2022/06/20 25:32
最近良いプログラミングフォントが色々でてきているようなのでさらってみた。

2013年後半のプログラミングフォント事情 - 色々日記(ざ・めも)
以来。

今回の結論は、
・Ricty(もしくはRicty Diminished)使って不満がなければRicty
・Rictyのアンチエイリアスに不満がある場合は、PlemolJP
となった。

ただ、PlemolJP作者のフォントとはどれも素晴らしく、
HackGen
PlemolJP
Firge
UDEV Gothic JPDOC
の4つについては合うものを選べば良いと思う。

状況変化した内容をつらつら書いていく。

■Windowsのレンダリング
Win10になったときかWin10内でのupdateかで標準アンチエイリアス~ClearTypeがある程度改善したように感じる。
加えて高解像度モニタの普及とDirectWrite周りを調整できるソフトが増えたことで、以前ほど不満に感じるシーンが減った。

ただ、やはりまだWindowsのレンダリングはいまいちだと思う。

■フォント
ここ3年くらいで、ライセンスがゆるく品質の良いフォントが公開されている。
Google Fontsがハブになっているようだ。

・源ノ角ゴシック(Source Han Sans or Noto Sans)
・IBM Plex Sans JP
・BIZ UDGothic

あたりが品質も高く収録文字も多そう。
特に、モリサワのBIZ UDGothicがOpen Font Licenseで追加されたのは衝撃だった。

源ノ角ゴシックは様々な派生フォント(源真, 源柔, 源暎, Nasu, ...)を生み出しているので、
BIZ UDGothicもそうなっていきそうで楽しみ。

CJKオール対応の更紗なんてのもあるし、なんとなく中国パワーにひきずられてCJK対応が進んだ感じがする。
合成フォントの選択肢がとても増えた。

RictyはRictyでヒンティング追加されたりして少し進化。

少なくともライセンス的にかなり黒かったMeiryoKEを選択しなければいけない状況はないと思う。
世のフォント作者に感謝。

FontLinkもソフト側でできるものも多いし(秀丸ですらできる!)、もうやらなくていいのではないか。

なお、ソフト側でフォント合成する場合もフォントの幅や高さの問題で下端・右端が切れるリスクがあるのは同じ。

■求めるフォント
選択肢が増えたので、贅沢な話だが自分のほしいフォントを整理。

[必須]
・等幅
・英数字は全角の1/2
・文字はしっかり分離していてほしい。特に<=, ==が合体しないでほしい(リガチャは論外)
・破断は最小限(Hackはgの線をかなり省略するがちょっと嫌)
・|は分離してほしくない
・iの下部の右曲がりは嫌(lの下部の右曲がりはOK。どちらでもあり)
・標準アンチエイリアス・アンチエイリアスなしいずれでも視認性が高い
・記号△▲▼■□○◎●・←↓↑→系は全角で描画されてほしい
・文字の下端・右端が欠けてほしくない(合成フォントでは切れがち)
・フォントサイズでの表示乱れは最小限(特にWindowsの場合10.5ptの鬼門がある)

[ベター]
・文字の区別は極力ついてほしい。特に1とlと|は極力。
・英数字・日本語を混ぜ書き前提。バランスに違和感がないと嬉しい
・全角と半角に同じ文字がある場合、できるだけ似たような字体でかつ全角・半角の判別がつくのが理想
・比較・演算記号-=*/<>はできるだけ上下中央に揃っていてほしい
・0はスラッシュのほうが嬉しいが、ドットも許容。Oとは区別がついてほしい。

まずRictyが頭に浮かぶ… いやもうドンピシャRictyなのだが、あやつはアンチエイリアスが今一つだった。
というわけでさらってみる。

■今回試したやつ
個人的趣味に合うかどうか。
めちゃくちゃ私見で判定。
△Firge: 若干-=<>の上下位置が一致しないのが気になる。全体的に文字を破線にしがち(gとか&とか)
✕HackGen: |が分かれるのが気になる。iの下部が右曲がりなのが好みでない。<=>がややくっついて見えるのが嫌。10.5ptアンチエイリアスなしだと(){}が対称に見えない
△PlemolJP: {}がかなり強い曲線で作られてる。ややばとぱ(濁点・半濁点)が見分けづらい。#が線切断表記。0がドット
△UDEV Gothic JPDOC: {}が上下対象でない。ややばとぱ(濁点・半濁点)が見分けづらい。英数字が縦長の印象。半角qで目が滑りやすい。4が少し気持ち悪い
△Ricty Diminished: アンチエイリアスがシビア。=とか横線がボケやすい。M+側も比較的アンチエイリアスに弱い。非アンチエイリアス、10.5ptのときにsなどの上部がInconsolataとかより汚い(上辺にドット?が出る)
✕M+ 1M: *が上付きなのが嫌。半角英数(特に数字)の幅が狭すぎる。9.5ptとかで数字の高さがズレる。
✕Migu 1M: M+と同様
✕Myrica M:  |が分かれるのが気になる。日本語がやや細い。{}が上下対象でない。10.5ptとかで全角jがiに見えたりする。他にも下端が切れる文字がある
✕源暎ゴシック M: *が上付きになるのが嫌。<=>が完全にくっついてしまう。
✕戸越等幅: 「ば」など濁音が見づらい。全体的に潰れてしまう傾向があり、調整ができてない気がする。
✕更紗Gothic: fixedを使用する。ややばとぱ(濁点・半濁点)が見分けづらい。*が上付きになる。■○などが半角。右端が切れる。更紗で使ってるIosevkaはカスタマイズできるらしく、可能性を感じる。
✕Roboto J: ヒンティングありの方を使ったほうが良さそう。(){}の見分けが付きづらい。日本語の上下が目立ってガタつく
✕Ocami: 記号系(→とか)が半角。ばとぱがみわけづらい。
✕Cica: 記号系(→とか)が半角
✕VLゴシック: サイズによって、=の上下の太さが一致しない。
✕utatane: ==がわずかに合体気味。アンチエイリアス下での英数字の視認性が今ひとつ。
✕源暎モノコード: アンチエイリアスなしで、線の太さに安定感がない。フォントサイズ変更していると、()の左右で幅が違っていたり、縦の線だけ太くなっていたり。9ptで==が合体する。
✕Nasu M:非アンチエイリアス10.5ptで ==が合体気味。非アンチエイリアス下での英数字の視認性が今ひとつ
✕源ノ角ゴシック Code JP: 非アンチエイリアスだと:と;、,と.の区別が厳しい。
Firge, HackGen, PlemolJP, UDEV Gothic JPDOCの作者さん同じなのすごいなー

この4つは不具合っぽい挙動をすることが少なく、非アンチエイリアス・アンチエイリアス問わず素直。

字形としては、
UDEV Gothic JPDOC
が一番趣味に合うけど、英数字が縦に長過ぎるのかコードを読むときに目が滑りやすい。

PlemolJPは0がスラッシュでないのだが、どんな用途でも70~80点ある感じ。

アンチエイリアス環境下に限ったら丸になるやつもたくさんありそう。
作る側(特にMacユーザ)からしたらそんなの気にしてるやついねーよって感じだと思う。

改めて思ったのは字形もだけど、フォントつくる人の腕に依るところが大きい。
HackGen作者たわら氏の仕事が素晴らしい気がするし、ソース公開されてるから自力でフォント作る気があるなら4フォントのスクリプト全部読めばある程度合成フォント作るときの課題理解も進みそう(作れるとは言ってない)。

今後もどんどんフォント出てきそうなので期待。

2022/05/14(土)debianをbuster(10.x)→bullseye(11.x)にアップグレード(zabbixネタ多し)

2022/05/14 17:49
自宅のdebianをbuster(10.x)からbullseye(11.x)にアップグレードした。

その際のメモ。
zabbix関連の対応が中心。

基本手順

第4章 Debian 10 (buster) からのアップグレード
基本的には公式手順に従う。
#apt update
#apt upgrade --without-new-pkgs
#apt full-upgrade
#apt autoremove
いつも通りsudoは適宜補完で。

システム再起動

システム再起動をかけておく。
カーネル自作の頃はここで結構トラブル起きていたが、今回は何も無し。

ログ周り諸々チェックして特に問題なさそう。

Rubyライブラリインストール

Rubyのバージョンが2.7に上がったのでgemでサービス運用に必要なライブラリを入れ直しておく。
twitterとhttpclientの2つ。
#gem install twitter httpclient
パッケージで入れてるサービスのPHPやPerlライブラリはdebianのパッケージに任せてて、
Rubyのライブラリは未だにgem管理というのはなんだかへんてこな感じがする……

が、自作サービスなのでAPTで依存性判断させるのめんどくさいし、
bundler管理するまでもないし今のところこの手順忘れなければいいかな。

sources.list更新

# apt-get update
すると、
無視:3 http://security.debian.org stable/updates InRelease
エラー:4 http://security.debian.org stable/updates Release
  404  Not Found [IP: 151.101.230.132 80]
E: リポジトリ http://security.debian.org stable/updates Release には Release ファイルがありません。
N: このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。
N: リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。
と出る。
security.debian.orgのパスが変わったっぽいので対応しておく。
これはupgradeと無関係に直しておくべきもの。
# diff sources.list.20220512 sources.list
14,15c14,15
< deb http://security.debian.org/ stable/updates main contrib non-free
< deb-src http://security.debian.org/ stable/updates main contrib non-free
---
> deb http://security.debian.org/ stable-security/updates main contrib non-free
> deb-src http://security.debian.org/ stable-security/updates main contrib non-free
公式だとstable-securityじゃなくbuster-securityを推奨しているようだが、横着したいのでstable-securityで。
apt-get updateしてエラーの解消を確認。

[参考]
security.debian.org 'does not have a Release file' on with Debian Docker images - Server Fault

zabbix4→5関連

毎度zabbix関係に手間がかかる感じ。
色々でていたのでこの際まとめてきれいにする。

databaseアップグレードに失敗する

zabbixにアクセスすると下記表示。
The Zabbix database version does not match current requirements. Your database version: 4030046. Required version: 5000000. Please contact your system administrator.
/var/log/zabbix-server/zabbix_server.log
上では、起動時の
starting automatic database upgrade
の途中(93%くらい)で、
 17096:20220513:102638.403 completed 92% of database upgrade
 17096:20220513:102638.548 completed 93% of database upgrade
 17096:20220513:102638.762 [Z3005] query failed: [1118] Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
[alter table `hosts` add `discover` integer default '0' not null]
 17096:20220513:102638.763 database upgrade failed
 17207:20220513:102809.948 Starting Zabbix Server. Zabbix 5.0.8 (revision d3c78f993a).
とでてくる。

列が追加できないらしい。
mysql上でzabbix DBにつないでhostsテーブルのフォーマットを変えていく。
MariaDB [zabbix]> alter table hosts row_format=dynamic;
media_typeテーブルも同様。直す。
 16412:20220513:101210.637 [Z3005] query failed: [1118] Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
[alter table `media_type` add `event_menu_name` varchar(255) default '' not null]
MariaDB [zabbix]> alter table media_type row_format=dynamic;
zabbixを再起動すると、database upgradeは成功してzabbixの画面は開くようになった。

なお、
innodb_strict_mode = 0
で対応する説があるが、これはNG(データロスするか、実際にデータいじってるときにエラーが出るか)の認識。

[参考]
CentOS7で動いているZabbix4.0をZabbix5.0にアップグレードしてついでにNginxで動かす - 気まぐれ

エラーを消す

まだ、/var/log/zabbix-server/zabbix_server.logにここらへんの警告が出るので消していく。
 17207:20220513:102810.696 Zabbix supports only "utf8_bin" collation. Database "zabbix" has default collation "utf8_general_ci"
 17207:20220513:102810.723 character set name or collation name that is not supported by Zabbix found in 421 column(s) of database "zabbix"
 17207:20220513:102810.723 only character set "utf8" and collation "utf8_bin" should be used in database
 17207:20220513:102810.759 database is not upgraded to use double precision values
各tableのcollate直す。
正式手順は、
2 Repairing Zabbix database character set and collation
のようだけど、面倒であれば下記流しても良さそうだった。
MariaDB [zabbix]> ALTER TABLE acknowledges CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE actions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE alerts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE application_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE application_prototype CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE application_template CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE applications CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE auditlog CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE auditlog_details CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE autoreg_host CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE conditions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE config CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE config_autoreg_tls CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_condition CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_condition_group CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_condition_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_condition_tagpair CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_condition_tagvalue CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE corr_operation CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE correlation CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dashboard CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dashboard_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dashboard_usrgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dbversion CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dchecks CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dhosts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE drules CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE dservices CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE escalations CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE event_recovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE event_suppress CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE event_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE events CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE expressions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE functions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE globalmacro CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE globalvars CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE graph_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE graph_theme CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE graphs CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE graphs_items CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE group_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE group_prototype CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE history CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE history_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE history_str CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE history_text CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE history_uint CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE host_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE host_inventory CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE host_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE hostmacro CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE hosts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE hosts_groups CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE hosts_templates CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE housekeeper CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE hstgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httpstep CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httpstep_field CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httpstepitem CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httptest CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httptest_field CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE httptestitem CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE icon_map CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE icon_mapping CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE ids CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE images CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE interface CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE interface_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE interface_snmp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE item_application_prototype CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE item_condition CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE item_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE item_preproc CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE item_rtdata CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE items CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE items_applications CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_macro_path CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_condition CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_opdiscover CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_operation CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_ophistory CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_opinventory CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_opperiod CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_opseverity CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_opstatus CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_optag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_optemplate CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE lld_override_optrends CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE maintenance_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE maintenances CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE maintenances_groups CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE maintenances_hosts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE maintenances_windows CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE mappings CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE media CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE media_type CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE media_type_message CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE media_type_param CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE module CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opcommand CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opcommand_grp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opcommand_hst CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opconditions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE operations CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opgroup CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opinventory CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opmessage CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opmessage_grp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE opmessage_usr CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE optemplate CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE problem CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE problem_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE profiles CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE proxy_autoreg_host CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE proxy_dhistory CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE proxy_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE regexps CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE rights CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE screen_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE screen_usrgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE screens CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE screens_items CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE scripts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE service_alarms CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE services CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE services_links CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE services_times CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sessions CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE slides CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE slideshow_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE slideshow_usrgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE slideshows CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_element_trigger CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_element_url CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_shape CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_url CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmap_usrgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmaps CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmaps_elements CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmaps_link_triggers CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE sysmaps_links CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE tag_filter CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_acknowledge CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_check_now CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_close_problem CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_data CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_remote_command CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_remote_command_result CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE task_result CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE timeperiods CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE trends CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE trends_uint CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE trigger_depends CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE trigger_discovery CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE trigger_tag CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE triggers CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE users_groups CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE usrgrp CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE valuemaps CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE widget CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
MariaDB [zabbix]> ALTER TABLE widget_field CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
DBのdefault collate直す。
MariaDB [(none)]> ALTER DATABASE zabbix DEFAULT COLLATE utf8_bin;
倍精度周りのdefault値直す。
MariaDB [zabbix]> ALTER TABLE trends
	MODIFY value_min DOUBLE PRECISION DEFAULT '0.0000' NOT NULL,
	MODIFY value_avg DOUBLE PRECISION DEFAULT '0.0000' NOT NULL,
	MODIFY value_max DOUBLE PRECISION DEFAULT '0.0000' NOT NULL;
MariaDB [zabbix]> ALTER TABLE history MODIFY value DOUBLE PRECISION DEFAULT '0.0000' NOT NULL;
SQLはここに掲載されている。
https://git.zabbix.com/projects/ZBX/repos/zabbix/raw/database/mysql/double.sql

大体↓に書いてある! ありがたい。
[参考]
Zabbix5.0にアップデートした後にでるトラブルの対処法

PHP関連オプション

zabbixの画面に下記4つ警告が出ているので直す。
PHPの"post_max_size"オプション	8M	PHPのpostサイズの最小値は16Mです("post_max_size"設定オプション)。
PHPの"max_execution_time"オプション	30	PHPスクリプトの実行時間の最小値は300です ("max_execution_time"設定オプション)。
PHPの"max_input_time"オプション	60	PHPスクリプトの入力パース時間の最小値は300です("max_input_time"設定オプション)。
PHPの"date.timezone"オプション	不明	PHPのタイムゾーンが設定されていません ("date.timezone"設定パラメータ)。

/etc/apache2/sites-enabled/zabbix.conf
の、
<Directory "/usr/share/zabbix">
内に下記追記。
# diff zabbix.conf.20220513 zabbix.conf
11a12,15
>     php_value post_max_size 16M
>     php_value max_execution_time 300
>     php_value max_input_time 300
>     php_value date.timezone Asia/Tokyo
とりあえずこれできれいになった。
アップグレード終わり!

2022/02/12(土)春M(SpringM)で「0による浮動小数点数除算」

2022/02/12 25:22 PC(全般)
春M(SpringM)で特定のファイルに対して以下の操作をした時に、「0による浮動小数点数除算」とダイアログが出ることがある。
[対象操作]
・ファイル削除
・コンテキストメニュー呼び出し

一度ダイアログが出てしまうと、プロセスがファイルハンドルを掴みっぱなしになってしまうようで、
SpringMのプロセスを削除するまでそのファイルは操作ができない。

うかつに操作しに行くと、そのプロセスがハングすることもある。

発生するファイルの条件を調べたところ、字幕付きのmp4ファイルで何らかの理由で字幕streamがデータ無しになっている場合に発生するようだ。

ffprobeで調べるとこんな感じ。
$ ffprobe.exe -select_streams s -show_streams -loglevel error "***.mp4"

[STREAM]
index=2
codec_name=mov_text
codec_long_name=MOV text
profile=unknown
codec_type=subtitle
codec_time_base=0/1
codec_tag_string=tx3g
codec_tag=0x67337874
width=704
height=396
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/1000000
start_pts=0
start_time=0.000000
duration_ts=0
duration=0.000000
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=1
nb_read_frames=N/A
nb_read_packets=N/A

~ 省略 ~
[/STREAM]
これで、duration_ts=0になっているファイルが発生条件ぽい。
字幕でなくてもvideoやaudioがduration_ts=0の場合もおそらく発生すると思われる(そのようなファイルが手元にないので未検証)。

とりあえず、オリジナルのmp4を破壊してよいのであればdurationが0のストリームを破棄してやれば良いようだ。
上記の場合はvideoとaudio残して、字幕だけ削るので、
$ ffmpeg.exe -i input.mp4 -c:v copy -c:a copy output.mp4
とか。

どのストリームを残すかはソース次第で。

このファイルは問題なく操作できた。

Delphiは外部DLL呼び出しの例外に対してセンシティブだというのは聞いたことがある気がするので、
それが関係しているかもしれない。

2021/12/31(金)Windowsのウィンドウ再配置問題を切替器で打開する

2021/12/31 16:47 PC(全般)

概要

よく知られている問題として、Windowsにはウィンドウの再配置問題がある。

HDMI・DisplayPortでモニタを接続している際に、モニタの電源を切ったりケーブルの挿抜を行うとOS側がこれを検知する。
この時、マルチディスプレイ(拡張)で使用している場合は、接続が生きている側のモニタにウィンドウが再配置されてしまう。

この問題を切替器で解決したので下記にあらましを記載する。

問題の内容

上でケーブルの挿抜と書いたが、物理的なスイッチ(あるいは相当)を行う切替器でも発生する。
ソース1,2とモニタを繋げている切替器で、ソース1&モニタ→ソース2&モニタと切り替えた場合ソース1側では挿抜検知となる。

この問題PnPの仕様としてはごく自然だが、日常的にはこの仕様が邪魔になることが多い。

初めてモニタを繋いだ時・構成を変えた時には有用だが、接続モニタの切り替えや電源OFFを日常的に行う運用をする場合はかなり煩わしいことになる。

特に、資料閲覧や動画視聴などいずれかのディスプレイのウィンドウ配置を決めて使用しているユーザにとってはかなり痛い。
こういった用途の場合、左右のディスプレイの解像度や縦横配置を揃えていない場合も多く、再配置によるウィンドウの乱れ方が大きい。

OS側

Windowsには現状この問題の挙動を変える方法が存在していない認識。
WindowsのInside Previewにこの問題のパッチが来ているという話があるが、完全な機能ではないと言われている。リリース時期も(リリースされるかも)不明。

PersistentWindows, MonitorKeeperなどウィンドウの位置を記憶・復帰するツールは多数あるが、アプリケーションごとの仕様・使い方・権限などの違いにより完璧な動作は難しい。
ヒューリスティック的な挙動にならざるを得ない。

モニタ側

さて、この問題はOS側以外にモニタ・ドライバの作りや設定によって挙動がある程度変わる。

モニタでは、EIZOのモニタはこの問題に対応するためにCompatible Modeというモードを備えている。
EIZO以外に明示的にこの機能を謳っているモニタは発見できていない。

この設定を変えるとモニタの電源を切った際にモニタ側が切断信号をOS側に送らなくなる。
電源を切るケースについてはモニタを選ぶことで対応可能である(EV2495で確認)。

ただし、EIZOはこういったOSDの機能では優秀なものの、パネル周りはピンキリで価格も割高。
EV2495についてもオレンジや水色でかなり不快な縦線が見えるパネルが使用されていたりする(EV2456から継続している問題なので、EV2456 縦縞などで検索するとサンプルがでてくる)。

モニタの選択肢があまりに少ないのは辛いので、できればモニタに依存しない対応方法にしたい。

グラボ側

グラフィックボード(おそらくドライバの作り)も影響するようだ。

私の場合、今年の8月にRadeon HD6450からRyzen 5700Gの内蔵GPUに変更した。
同じRadeon系列であるにも関わらず、HD6450では発生しなかった再配置問題が5700Gだと発生するように。
しかもHDMI・DisplayPort問わず発生する。

体験する前までこの問題はDisplayPort限定と認識していたため、かなり想定外だった。

実質同一チップメーカーでも発生するしないがある上、グラボの機能として有無を探すのがすごく難しい。

グラボでなんとかするのもつらそうなので、グラボに依存しない対応方法にしたい。

課題と制約

あわせて、モニタの接続周りでいくつか課題を抱えていたのでそれもいっぺんに解決してしまいたい。

・ゲーム機をつなぎたいがモニタ側にHDMI端子が足りない
・モニタ側の接続切り替え操作が機種によっては操作しづらいので簡単に操作できるようにしたい。最近のモニタではボタンが背面にあるものすらある。
・リモートワークをする機会が多く、私用PCと業務PC(ノート)をいずれもモニタに繋ぐ。素早く切り替えられるようにしたい。

構成的な制約は以下の通り。

・モニタは2枚(Display1~2)。一旦ともにWUXGA横配置とする。機種・解像度・縦横配置は自由に変更可能にしたい。

・PC1(私用PC)。2枚のディスプレイにつなぎ、メイン・拡張で使用。絶対に再配置されたくない。ほぼサーバなので恒常的に起動状態。

・PC2(業務PC)。ノート。2枚のディスプレイにつなぎ、メイン・拡張で使用。本体モニタは使用しない。業務時間中は再配置されたくない。業務が終われば電源OFF・ケーブル取り外しで、業務開始時に再配置されるのは特に問題ない。

・Switch。Switchにこだわらずゲーム機など、モニタ1枚を使用するHDMI機器を最大2台くらい繋げられると理想。

つまりソースが5~6本、シンクが2本。これを上手く接続したい。

対応手段

課題を整理すると、PCとモニタの間になにか問題を解決するための仲介役が必須になるようだ。

EDID保持・固定などで調べるといくつか製品が見つかる。

大まかに2系統あるようだ。

・アダプタ(ドングル):HDMI->HDMIかDP->DP。HDMIのソース側の電源で動く。
アダプタの機能として、モニタ側の電源OFFをソース側に伝えない。モニタのEDIDを学習してそれをソース側に伝える、もしくは設定した固定EDIDをソース側に伝える。製品ごとの固定EDIDを持つものも(この場合、モニタの解像度ごとにアダプタが必要)。
amazonで売っている製品名不明のものや、同人ハードのDPHPDMAなど。

・切替器:HDMIのものが多くDPのものは少なかったり高かったり。外部電源が必要。
切替器の機能として、モニタ側の電源OFFをソース側に伝えない。モニタのEDIDを学習してそれをソース側に伝える、もしくは設定した固定EDIDをソース側に伝える。
TESmartの切替器など。

これを組み合わせて問題を何とかする。

実構成

いろいろ考えた挙げ句、TESmartの切替器を軸に以下の構成に落ち着いた。

 +----------+             +----------+
 | Display1 |             | Display2 |
 +----+-----+             +----+-----+
      |                        |
      +-------+           +----+
              |           |
         +----+-----------+---+          +----------+
         |  OUT1        OUT2  |          |          |
         |                    |          |      +---+------------+
         |  TESmart           |          |      |  OUT1          |
         |   TES-HMA0402A1U   |          |      |                |
         |                    |          |      |  SANWA SUPPLY  |
         | IN1  IN2  IN3  IN4 |          |      |   SW-HD31ML    |
         +--+----+----+----+--+          |      |                |
            |    |    |    |             |      | IN1  IN2  IN3  |
   +--------+    |    |    +-------------+      +--+----+--------+
   |             |    +-+                          |    |
   |    +--------+--+   |                          |    +--------+
   |    | BENFEI    |   |                          |             |
   |    |  DP->HDMI |   |    +------------+    +---+--------+    |
   |    +---+-------+   |    | Plugable   +----+ PCduoduo   |    |
   |        |           |    |  UGA-4KDP  | DP |  DP->HDMI  |    |
   |        |DP         |    +-+----------+    +------------+    |
   |        |           |      | USB                             |
+--+--------+---+    +--+------+-----+                           |
| HDMI     DP   |    | HDMI   USB    |                      +----+-----+
|               |    |               |                      | Nintendo |
|      PC1      |    |  PC2(Laptop)  |                      |  Switch  |
|               |    |               |                      +----------+
+---------------+    +---------------+

以下に、接続している機器についての詳細を記載する。

TESmart TES-HMA0402A1U
4入力2出力のHDMI切替器。切替器の電源が生きている間は切断信号をソース側に伝達しない。OUTにつないだモニタ側のEDIDを記憶し、IN側によしなに流してくれるようだ。細かい挙動を突き詰めていないが不満に感じるポイントがない。切り替えはモニタ側でやるより早いケースが多いと思う。物理ボタンはOUTに対してIN1~4をローテーションで切り替えるボタンが2つ(OUT1, OUT2用)。物理ボタンだと一発で指定ソースを選べないが、リモコンが付属しておりそちらではソースを直接指定できる。6入力だったら最高だった。現状のゲーム機器等のコネクタを考えるとDPではなくHDMI切替器である必要がある。

BENFEI DP->HDMIアダプタ
amazonで売っている安売りのDisplayPort→HDMI変換アダプタ。製品名不明で、別ブランドから同じ形のものがたくさん出ている。かなりの曲者で、3台入手したうち2台はPlugable UGA-4KDPからの変換に使うとNo Monitor 640x480固定になってしまう(EDIDが取れない?)。インピーダンスがばらついてるとか、チップが変わったとかそういうもののような気がする。PC1のDisplayPortにつなぐ分にはいずれも問題なかった。
この手の変換アダプタは国内サプライメーカーで販売しているものも中身同じだったりして、金を出せば失敗しないかというとなんとも言えないのが辛い。

Plugable UGA-4kDP
もともとモニタに空いているポートがDisplayPortしかなかったのでこれを使用していた。新構成でも流用。

DisplayLinkのチップを使用しており、挙動はやや怪しい(たまに止まる)。
DisplayLinkは製品の質でユーザからの不満が多い印象もあるが、現状USB単独でモニタを増やせる機器(チップ)自体があまり選択肢がない。その中ではPnPでドライバが入るのでDisplayLinkの信用度はけっこうある。

PCduoduo DP->HDMIアダプタ
amazonで売っている安売りのDisplayPort→HDMI変換アダプタ。製品名不明で、別ブランドから同じ形のものがいくつか出ている。BENFEIで2連続失敗したので購入。こいつはPlugableにつないでも問題なかった(EDIDをちゃんと取れた)。

SANWA SUPPLY SW-HD31ML
以前から使っていた切替器。TESmart切替器と合わせて、6入力を実現するために使用。IN切り替えがローテーションではなく直接ボタンでやれるのが良い。内部的には物理切替器とほぼ同じなので、この切替器につないだ機器は再配置問題が発生し得る。一緒に使う可能性がない機器の組み合わせ、もしくはモニタ1枚を使用する機器をつなぐ。

ついでにHDMIケーブルをすべて、細い割に不具合もなさそうなELECOMのCAC-HD14USシリーズで統一。

ケーブルの取り回しも楽になって(本数は増えたが)楽になった。

結果

メリット

・再配置問題を気にせずにモニタの電源を切れる。

・モニタの切り替えで本体操作不要。リモコンですばやく楽に。どのように切り替えても、PC1では再配置問題は発生しない。

・HDMIを軸に統一したので配線の考え方がシンプルに。HDMIに変換してHDMIで配線すればよい。ケーブルの流用が効くし、取り回しも楽。

・これからは、モニタはHDMI一口あれば何を買っても大丈夫。モニタ購入時に端子の個数・形状を気にしなくてよい。またウィンドウ再配置問題の対応(EIZOのCompatible Mode相当)も気にしなくてよい。

・これからは、PC1用のグラボはHDMIもしくはHDMIに変換できるコネクタ(DVIかDisplayPort)が計2個あれば何を買っても大丈夫。グラボ購入時にウィンドウ再配置問題を気にしなくてよい。

デメリット・課題

・ケーブルが増えた

・SW-HD31MLにつないでいる機器は再配置問題が発生しうる。今の用途だと回避しなくても不満がないが、回避したいとなるとTESmart切替器2台以上の組み合わせか50k以上する業務用機器になるかも

・TESmart切替器の消費電力(測っていない)

・TESmart切替器が単一障害点になってしまうので、今後故障時に同等製品がないと(あるいはやたらと高くなってたりすると)死ぬ。

余談

そのうちUSB-C(DP Alt)だらけになってしまいそうな気がするが、Windows側がなんとかしないとデイジーチェーンだろうが何だろうがこの問題は改善しない(はず)。

しばらくこの構成でつなぎつつ、OS側が何とかしてくれるのを期待したい。
結局、OS側ではなんともならずDP時代にはTESmartのDP切替器を使ってそうな気もする。

2021/09/19(日)pycronが動かない

2021/09/19 25:39 PC(全般)
Windowsのタスクスケジューラにどうも馴染めないので、pycronというWindows用cron実装ソフトを利用している。

システムをクリーンインストールした際に、pycronが動かなくなってしまったのでその解決方法についてメモ。

なお、かなり古いソフトで公式サイトも消失している。
同名のソフトやライブラリもあって検索がまともに機能しない。
なかなかに厳しい。

問題は、pycronを標準のc:\Program Files (x86)\pycronなどにインストールした場合に発生する。
サービスとして起動したpycronが一切のタスクを実行しない。

原因はpycronサービスがcron設定ファイルcrontab.txtを読めていないから。
これはWindowsのVirtualStore機能でハマりが発生している。

pycronは、付属のcrontab.txt Editor(GUIのcrontab編集ツール)でcrontab.txtを作ったり、スクリプトのテスト実行ができる。
便利なのだが、これが問題を起こす。

crontab.txt Editorを非管理者権限で動かして設定を保存すると、自動的にWindowsのVirtualStore機能が働き、

C:\Users\********\AppData\Local\VirtualStore\Program Files (x86)\pycron

にcrontab.txtを出力する。

しかし、pycronはデフォルトで、pycron.exeと同一ディレクトリにcrontab.txtが存在する想定で動く。

サービスとして動くpycron.exeはローカルシステムアカウント(SYSTEM)で動くため、
c:\Program Files (x86)\pycron\crontab.txt
を直接読みに行き、crontab.txtが存在しないので動かないという事象になる。

混乱を招くポイントとして、非管理者権限で動かしたファイラーなどからは、
c:\Program Files (x86)\pycron
の中身は、実際のディレクトリ内容にVirtualStoreディレクトリの内容を上書きしたような状態で表示される。
同一名ファイルが有る場合でも、VirtualStore側が優先ということ。

ログファイルについても、crontab.txt Editorでテスト実行をするとまずVirtualStore側にpycron.logが出力される。
サービスのpycron.exeはc:\Program Files (x86)\pycron\pycron.logを出力するので、
手順と閲覧方法によってはVirtualStore側に隠されてしまってサービスのログファイルが見えないことになったりする。

なお、管理者権限で動かしたプログラムからは、素のc:\Program Files (x86)\pycronの内容が見える。

解決手段は下記どれか。
a) Program Files (x86)以外にインストールする
b) crontab.txt Editorを管理者権限で実行して、c:\Program Files (x86)\pycronにcrontab.txtを出力する
c) pycron.cfgを書いて、VirtualStore側のcrontab.txtを読むようにする
d) crontab.txtを手動でVirtualStore側からc:\Program Files (x86)\pycronにコピー

ただ、a)以外は、crontab.txt Editorの実行権限を間違えるたびにトラブルになりそうなのがなんとも嫌。
なので、a)案を採用した。

タスクスケジューラはcronと比べUIや設定オプションの煩雑さの割に、スケジュールの細かいコントロールができないのが不満。
WSLを使えばよいのだろうが、こっちはこっちでHyper-Vとサードパーティ仮想化ソフトの共存が難しい問題がある。
VMWareやVirtualBox資産が結構あるので切り替えが難しい。

ここらへんあと2,3年の技術進化で共存なり寄せなりスッキリできるようになるんじゃないかと期待してるけど、
今のところはpycronで凌ぐ方向で。
OK キャンセル 確認 その他