2026年1月19日月曜日

theHunter: Call of the Wild をやってみた

 前置きです。

何年も前からSteam版もEpic版(これは貰い物ですが)も本体+αは持ってはいたのですが、ずっと"やらない理由"を見つけては積み続けていました。

動物に加害どころか殺害する目的のゲームなどいかがなものか、食べもしないの(ヘミングウェイやサマセット・モームの作品などでも殺すだけ、ついでできれば皮をはぐってだけってのが露骨に描写されていている場面があるよう)に殺害した動物に申し訳が立つのか、とかせっかく自分に言い聞かせて何年も抑制していたのに・・・(Falloutとか人間やグールに殺害するゲームはやってるんですけどね!)。(実際にこのゲームをやってみると食材として狩猟するといったミッションはDLCの一部にありましたがたいていは害獣駆除としての殺害が主目的の狩猟が一般的なシチュエーションでした)

しかし、いつの間にか日本語対応をしていることを知り、昨年末のウィンターセールを前に新DLC発売に伴う本体89%OFFセールを知ってしまい、これはウィンターセールになればもっと下がるなあ、と下種な思惑からついに Hunting Starter Bundle というワンちゃんとかバギーとかテントとかセットになってるバンドルを購入してプレイを開始してしまいました。

結局、steamのウィンターセール(本体が90%OFFになっていました)が始まってすぐに存在しているすべてのバンドルを含め、コスメを除いた単品DLCも含めて大人買いしてしまいました。

やっぱりというか、想定通りにはまってしまいました。

気づいたら三桁時間超えてました。(起動したまま調べものしてる時間も多いですが。。。)

とはいえまだ買って一か月ちょいです。まだまだ初心者です。

私なりにいろいろ調べたり先達のご意見を調べたりしましたが、どうも初心者でもこれから始める方に伝えられることがあると思うに至りました。

徒然草52段にも「少しのことにも、先達あらまほしき事なり」とかありますが、どうもあのDLCは必須だのこれはゴミだの極論が跋扈しているようです。

バンドルは買いましたが私はどのゲームでも最初はデフォルト構成でプレイを開始する癖があるので本体だけである程度プレイしました。そこで先達でも何でもありませんが、この記事を起こした次第です。

本題です。

このゲームは「倫理的な狩猟」という美辞麗句を唱えつつ、裏腹に背徳的な楽しみを追求するゲームです。

DLCでもその点に触れるミッションが用意されており、ただヒャッハーするだけになりがちなゲーム性に一味加える試みを行っています。

次にゲームの難易度ですが、リアルを売りにしているもののデフォルト設定では「VATSがないFallout4」より簡単です。

最近通った動物の足跡が遠方からでもきらきら光って見えますし、動物のフンや餌場や寝床も同様に輝いて表示されます。しかも動物の足跡から走っていたか歩いていたかなどの情報も得られるので追跡が容易です。さらに遠方から双眼鏡で動物をマークすると輪郭線が岩や樹木の背後の入っても一定時間表示されてしまうという念の入れようです。

ただ、これらの表示はオプションでOFFにすることができますが、すると今度はリアルでは得られたはずのにおいや樹木に傷をつけたり尿でのマーキングが実装されていないといった別の意味でのハードモードになります。

マップの難易度もマップによって大きく異なります。まずは本体付属のヒルシュフェルデン保護区とレイトン湖水地方の二マップですが、とかく動物がいないだの難しいだのという評判が多いようです。さらにはDLCを買わせるために難しくしているんだという趣旨もネット上で多く見かけます。

私は全くそう思いません。ほんとにプレイしてるのかな?と思います。

まだこんなにアマチュアなのですが、この両マップは初心者から上級者までを楽しませる工夫がしっかりと作りこまれている良マップだと思いました。今でもそう思います。

動物がいないという非難も不当だと思います。試しにファストトラベルしてみてください。アウトポストにファストトラベルした直後に表示される動物のおびえたとか逃走したとかいう音が聞こえないことのほうが珍しいほど動物がいることがわかります。

私はひたすら追跡するのが好きなタイプなので足跡を見つけたら追うマラソンを勝手にはじめますが、そんなしゃらくさいことはしたくない、動物が見つからない、とお嘆きの方は呼び笛(コーラー)を使ってみてるとよいと思います。最初からノロジカやオジロジカ、キツネやコヨーテ用など、デフォルトのマップに多く生息する動物に対応した呼び寄せるための道具がインベントリに入っています。

動物を求めて走り回っているときに警告の鳴き声が聞こえたらすぐにしゃがんで、対応する動物の呼び笛を使ってみてください。特にシカ類はびっくりするほど素直に向こうからこっちに向かってきてくれます。あまりにもかわいらしい挙動なので加害を自粛したくなるほどです(が殺害するのがハンターの責務ですよね、せめて即死させるように努力したいと思います)

そのうち慣れてくるとクマだのヘラジカだのヨーロッパバイソンだの自動車の重量を凌駕するような動物も相手どれるようになります。

さて。狩猟につかう銃器、といっても主にライフルです。

クマだのヘラジカだのは思い切って大型なので対応クラス7-9の銃器を使ってりゃいいだろって部類ですが、実はラスボス感があるのはヒルシュフェルデン保護区のアカシカじゃないでしょうか(レイトン湖水地方のアメリカアカシカはクラス7です)。

最初から所有しているレンジャー.243が対応クラスが2-6とあまりに有能で、これで何でもやってしまおうと思いがちです。アカシカでも仕留められるじゃん!とか調子に乗ると絶望させられる、ある意味このクラスの体力お化けといった趣があります。

もちろん、レンジャー.243で仕留められるのは事実ですが、確かに難しいのです。

そこで、.270 ハンツマンという銃を最初から持っているので、これを使うとびっくりするほどアカシカさんが身近になります。これがまたレンジャー同様に実に銃弾がまっすぐ飛ぶので、長距離狙撃も容易です。

このように、対応クラス内であっても向き不向きがあるよということがわかるようにできていると思います。

ライフル以外にも弓、拳銃、ショットガンがありますが、拳銃は高クラスの獲物に対応できますし、弓とショットガンはアナウサギとカナダガンに使うと便利です。ただ、ショットガンの実包で初期から保有する散弾のバックショットはノロジカなどにしっかりと寄れるようにプレイヤースキルが上がるまでは使うのは難しいと思いますが、この段階までくればおそらくDLC購入が視野に入っているほど楽しんでいることと思います。

いろいろ述べました。

結論です。

本体だけでも十分楽しいです!

必須のDLCはこれこれだから買えという先達のいうことはある程度正しいのかもしれませんが、縷々述べましたように、DLCなしでもかなり遊べます。

そこで気に入ってしまったら、それこそDLCマップのみならず、買ったDLCマップのアウトポストを開放するのを楽にするATV、脚立に座るだけでステルスが馬鹿みたいに簡単になってアウトポストも増設できるテントのDLC、暗視装置付きのDLC、血痕を追いかけてくれたり仕留めた鳥を持ってきたりしてくれるわんこのDLC、なんだかよくわからんがすごい銃のDLC、どこでも獲物を呼び寄せる電子コーラーとかフィーダーとかのDLC、あれもこれもで結局全部買いしたくなるほどお財布を直撃されてしまうかもしれません。

しかし、これらはあれば便利という部類で必須というわけではないのがこのゲームの面白いところだと思います。そこに感銘を受けたため、ここに駄文を呈した次第です。

以上、ここまでお読みいただきありがとうございました。

2025年9月24日水曜日

LibreHardwareMonitor(0.9.4)さんがWindows Defenderさんにのけ者にされるようになりました

 今回も恥ずかしい記録です。

結論だけ先に書きますと、2025/9/24現在、ソースコードでは問題は解決しています。

ただし、0.9.4より新しい版はバイナリでは配布されていないため、LibreHardwareMonitorのソースコードからビルドする必要があります。

結論は以上です。

以下は恥の記録です。

さて、LibreHardwareMonitorさんとWindows Defenderさんにはいつも大変お世話になっております。

先日の2025年9月23日のWindows Defenderの定義体の更新以降、突如として2024年11月から全く手を加えていないLibreHardwareMonitor 0.9.4さんを指さして急に指弾するようになってしまいました。

まず始めはLibreHardwareMonitor.sysがVulnerableDriver:WinNT/Winring0.Gだから削除したよ、というメッセージから始まりました。

半可通なわたくしはWinring0という文字列だけ見てわかった気になりました。

WindowsというOSでは、ハードウェアの情報を得るためのドライバがカーネル空間で動作する必要があり、それはRing0という最上位の特権で動作しているということを承知していたからです。LibreHardwareMonitor さんはまさにRing0という特権を用いたハードウェアの情報を収集するツールですので必要不可欠な機能です。

ですが、カーネルへの攻撃への絶好の橋頭堡になるので、マイクロソフト社さんとしては自社で管理できないRing0で動作するドライバが憎くてたまらないのはよくわかりますが、なぜ急にいまさらWindows Defenderさんが問題視したのかよくわかりませんでした。

そこで、これはたま~に、しかしまれではない誤検知かしら?とおもって、まずはWindows Defenderさんに落ち着いてもらうように「Windows セキュリティ」の設定画面からLibreHardwareMonitor さんのVulnerableDriver:WinNT/Winring0.Gのブロックを許可して再起動してみました。

そして再起動すると、今度はWindows DefenderさんがLibreHardwareMonitor.sysに対して Trojan:Win32/Vigorf.Aだと主張し始めました。

うーん。「Trojan:Win32/Vigorf.A」って誤判定の時にやたらと見かけるのですが・・・Winring0.Gを許可したら今度は別件でトロイの木馬だっていうのは少々ただ事ではない気がします。

まあとにかく、LibreHardwareMonitorさんは実績もあるし余人をもって代えがたいかけがえのないプログラムなのでLibreHardwareMonitorさんがインストールされているフォルダを丸ごと無視してくれるようにWindows Defenderさんにお願い(設定)しました。

すると、今度はさらに、 C:\Windows\SystemTemp\ というフォルダにできるテンポラリファイルがTrojan:Win32/Vigorf.Aだと主張し、排除し始めました。

このテンポラリファイルはおそらくLibreHardwareMonitorさんが起動時にLibreHardwareMonitor.sysを自動生成してインストールする際に生成されるものと見受けられました。

ただし、それでもLibreHardwareMonitorさんそのものは動作するのですが、毎度毎度脅威を検出したといわれてはログが汚染されて意味を成しません。

本当の脅威に遭遇した場合にオオカミ少年のおとぎ話のごとく無視してしまう可能性を考えるとこれは実に好ましくありません。

だからといって、C:\Windows\SystemTemp\を監視対象から除くなんてことをしたら、それこそセキュリティリスクどころの話ではなくて Windows Defender さんにいてもらわなくたって結構です、と言っているようなものです。とてもうべなえません。

これは困ったことになりました。

ダメもとでgithubのLibreHardwareMonitorさんのサイトにバージョンが上がってないかな~?と、見に行ってみるとやっぱりまだ0.9.4のままでした。

仕方ない・・・とにかく毎回LibreHardwareMonitor.sysを自動生成させばないように改造をしよう・・・と思ってソースを見てみると・・・そこにはごく最近の修正として Swap WinRing0 to PawnIO #1857 とのコミットコメントが。

あらっ?

LibreHardwareMonitorさんはRing0層にアクセスするためのライブラリとして、WinRing0.sys(の64bit版)を採用していて、それをわざわざPawnIO.sysに変えたってことのように読めます。

ここまでわかればさすがの鈍いわたくしもよくわかりました。

LibreHardwareMonitor.sysの実態はWinRing0.sysだったのですね。

WinRing0.sysで検索するとあっさり原因が判明しました。いろんな記事に影響を受けるプロジェクトにLibreHardwareMonitorがあるとあっちこっちに記述されています。
新しいWinRing0.sysならば問題はないのですが、古いWinRing0.sysには脆弱性が発見されていたそうでして、その版を使用していたようです。

Windows Defenderさんは誤検知でもなんでもなく、きちんと脆弱なプロセスを指摘くださっていたのでした。

そして、LibreHardwareMonitorの開発者の皆様は先日対応してくれていたわけでした。

結果として、Windows Defenderさんに加えた除外指定はすべて排除でき、相変わらずWMI対応の、まさしく余人をもって代えがたいLibreHardwareMonitorさんを使い続けることができることとなりました。

原因が分かっただけでなく、自分で何もしなくてもすでに対策されていて、しかもそれがほんとに最近だったという運の良さにほくほくしながら、こうしてまた一つ、恥ずかしい記録を残すことになりました。

以上、恥の記録でした。

こんなことに二時間もかかってしまい、自分の生産性の低さにほとほと呆れます。

ここまでお読みいただき、誠にありがとうございました。

2025年6月3日火曜日

Steam版SagradaのXUnity.AutoTranslatorを用いた日本語化手順

 美しいステンドグラスを作るボードゲームのサグラダ(Sagrada)、DireWolf さんがPC版を販売しています。

長いこと積みゲーでしたがなぜか気が向いてプレイしてみると結構面白かったのですが、残念なことに日本語化されていません。折角ですから PC版のSagrada を XUnity.AutoTranslator で翻訳してもらうことにしました。

ちょっとややこしかったので手順をメモします。

本記事の記述時点の前提は次の通りです。

  • ゲームクライアントバージョン:  steam版 1.4.4.652 (ゲーム内で設定画面を開くと画面下に表示されます)
  • BepInEx: IL2CPP版 6.0.0-pre.2
  • XUnity.AutoTranslator: BepInEx-IL2CPP版 5.4.5

適用するとこんな感じになります。(2025年6月現在)

サンプル画像

Windows版への適用を箇条書きで記録します。(他OS版はwin-x64をmacosと読み替えればよさそうですが検証していません。ごめんなさい)

  1. GitHubよりBepInEx-Unity.IL2CPP-win-x64-6.0.0-pre.2.zipをダウンロードします(もちろん、git cloneしてビルドしても構いません)。
  2. Sagradaがインストールされているフォルダ(Sagrada.exeがあるディレクトリです)にBepInEx-Unity.IL2CPP-win-x64-6.0.0-pre.2.zipの中身をすべて展開します。
    Sagrada.exeがあるフォルダと同じ場所に以下のフォルダまたはファイルが存在する状態になります。
    • 📂BepInEx (フォルダ)
    • 📂dotnet (フォルダ)
    • .doorstop_version (ファイル)
    • changelog.txt (ファイル)
    • doorstop_config.ini (ファイル)
    • winhttp.dll (ファイル)

  3. 一度Sagrada.exeを起動します。
    Steamクライアントから起動しても直接起動しても構いません。
    起動すると黒いウィンドが開いて何やら表示されますが、やがてゲームが起動するはずです。
    正常に起動することを確認したら、ゲームを終了して 📂BepInEx フォルダの中に LogOutput.log および ErrorLog.log という名前のファイルが生成されていることを確認してください。
    正常に起動しなかったり、LogOutput.log および ErrorLog.log のいずれも生成されていない場合はBepInEx-Unity.IL2CPPを正しく展開できていない可能性があります。
  4. GitHubより今度はXUnity.AutoTranslator-BepInEx-IL2CPP-5.4.5.zipおよびTMP_Font_AssetBundles_2025-05-12.7zをダウンロード(またはビルド)します。
    • XUnity.AutoTranslator-BepInEx-IL2CPP-5.4.5.zipファイルの中身は📂BepInExとなっています。
      すでに存在している📂BepInExフォルダを上書きしてください(macosでfinderを利用する場合は置換されてしまうのでフォルダの上書きはしないでください)
    • TMP_Font_AssetBundles_2025-05-12.7z の中身のうち、arialuni_sdf_u2018というファイルを Sagrada.exeがあるディレクトリに展開してください。
  5. 一度 Sagrada.exe を起動し、正常に起動出来たら終了してください。これもSteamクライアントから起動しても直接起動しても構いません。
    この際、先ほどの手順3と違って表示される画面およびLogOutput.logファイルにエラーが出力されますが、この段階では無視してください。
  6. 📂BepInExフォルダの中に📂configというフォルダができているはずです。
    その中にAutoTranslatorConfig.iniというファイルが生成されていますので開き、以下の変更を行ってください(4か所)。
    • [General]セクション
      • Language=en を ja に変更
      • FromLanguage=ja を en に変更
    • [Behaviour]セクション
      • OverrideFontTextMeshPro=(空欄) を 右辺値にarialuni_sdf_u2018を記述
      • FallbackFontTextMeshPro=(空欄) を 右辺値にarialuni_sdf_u2018を記述
以上の手順で、冒頭でお示しした画像の状態になります。

いうまでもありませんが、OverrideFontTextMeshProで指定しているのはフォントファイルなので、arialuni_sdf_u2018でなくともいいのですが、TMP_Font_AssetBundles内では最も豆腐(文字化け)がありませんでした。

以上、ここまでお読みいただきありがとうございました。

2025年2月13日木曜日

西門豹さんの事績を無償版Copilotさんに聞いてみました

 AIさん、すごいですよね。びっくりするほど的確な助言をいただけることもしばしばあります。

一方、時折、というか、私の主観ではたいてい無茶苦茶なことを言い出すので、居酒屋でたまたま居合わせた隣の席のおっさんの発言程度の可用性しかないのが玉に瑕です。

さて、西門豹という人は紀元前の中国の(曹丕の魏のもっと前の)魏という国の役人で、晋(司馬氏ではなく春秋時代の姫氏の)が趙・魏・韓に分裂する頃の人です。

曹操も淫祠邪教の禁で有名ですが、この西門豹ははるか昔に強権によらないで淫祠邪教を信じる人たちを弾圧するわけでもなくして、それで甘い汁を吸っていた階層を除いて迷信を根絶してしまったり、魏が戦国七雄となる国力を蓄えるやら、圃場整備やら、あれやこれやで歴史に残るどころか神格化されてしまうような恐るべき政治手腕を発揮した人物でした。

なんかたまたまその西門豹を思い出したので、記憶を補強してみようかと戯れに事績をCopilotさんに聞いてみました。

あなたの発言
西門豹の事績を詳しく教えてください。

Copilot の発言
西門豹(せいもんひょう)は、中国の戦国時代の武将で、斉の将軍です。彼は紀元前300年頃に活躍し、特に「斉の五大夫」の一人として知られています。西門豹は、その勇敢さと戦術の才能で有名でした。

彼の主な事績には以下のようなものがあります:
秦との戦い: 西門豹は秦との戦いで多くの戦功を挙げました。特に、紀元前284年には秦の将軍である白起と戦い、多くの戦果を上げました。

軍事改革: 西門豹は軍事改革を行い、斉の軍隊を強化しました。彼は新しい戦術を導入し、兵士の訓練を徹底しました。

城の防衛: 西門豹は多くの城を防衛し、敵の侵攻を阻止しました。その中でも、彼が防衛に成功した城々は多く、斉の領土を守るために重要な役割を果たしました。

西門豹はその功績により、斉の王から高い評価を受けました。彼の名は後世に残り、中国の歴史において重要な人物として認識されています。

他に知りたいことがあれば、教えてくださいね。

実はこの回答群、これ全部嘘っぱちです。
「彼の名は後世に残り、中国の歴史において重要な人物として認識されています。」だけは正確ですが、それ以外は全部でたらめです。びっくりしました。

このあと、いろいろ聞いてみましたが変なことばかり言います。
ただ、そんな変な回答ですが一貫してCopilotさんは史記や戦国策が典拠だと言い張っておいででした。

そこで根本的な問いを発してみましたところ、もっと謎が深まります。

あなたの発言
史記や戦国策には斉の将軍だった西門豹という人物は記載されていません。

Copilot の発言
あなたの指摘は正しいです。西門豹は『史記』や『戦国策』には登場しません。彼は、実際には戦国時代の韓の宰相であり、魏の邯鄲の県令として知られています。水害対策のために「河伯娶妻」という儀式を止めさせたことや、邯鄲の灌漑工事を指導したことで有名です。間違った情報を提供してしまい、申し訳ありませんでした。これからも正確な情報を提供するよう努めますので、引き続きよろしくお願いします。何か他に知りたいことがあれば、どうぞお知らせください。

あちゃー。魏の邯鄲の県令はその通りなのですが、韓の宰相とか言い始めました。

もうちょっと聞いてみると・・・

あなたの発言
誰と間違えましたか?

Copilot の発言
西門豹は実際には斉の将軍ではなく、魏の将軍でした。彼は戦国時代の人物で、特に「魏公子傳」に登場します。おそらく史記や戦国策での記載ミスかもしれませんね。

他に気になる歴史上の人物や出来事はありますか?

韓の宰相はどこかに消え失せ、さらにはついに自分が典拠にしていたはずの史記などの文献が間違ってるということになりました。

お金払えばちゃんとした答えが聞けるのかしら。
無償版Copilotの中のAIさんは専門が偏っているようですので、お聞きする分野は吟味したほうがよさそうです。

2024年11月18日月曜日

SSD MSI S270 960GB における smartmontools から見える Total_LBAs_Written の単位はいったい何なのか?

 サーバ(Linux)のシステムとホームディレクトリのパーティション用に購入したSSD、MSI S270 960GB。5年保証付きなのに激安でした。

購入してから2806時間を経過したので、そろそろTBWが気になるお年頃です。

早速smartmontoolsでもって累計書き込み時間を見てみました。

smartctl -A の結果は

ID# ATTRIBUTE_NAME          FLAG     (略) RAW_VALUE
9 Power_On_Hours 0x0012 (略) 2806
(略) 241 Total_LBAs_Written 0x0012 (略) 467

467ってなんじゃい!!

RAW VALUEは生値ってくらいなのでメーカー毎にまちまちです。smartmontoolsを使う際の単位不明あるあるケースですね。

ということで単位が何なのか調べてみました。

といってもたいしてやることはありませんでした。

smartctl -l devstat で見てみると

Device Statistics (GP Log 0x04)
Page Offset Size Value Flags Description
0x01 0x010 4 2806 --- Power-on Hours (略) 0x01 0x018 6 981352770 --- Logical Sectors Written 0x01 0x028 6 4076567750 --- Logical Sectors Read

しっかりと論理セクタ書き込み回数が取得できましたので、論理セクタサイズは smartctl -a で取得すると512バイトということだったので、

981352770 * 512 ÷ 1024 ÷ 1024 ÷ 1024 = 467.9... となりました。

従いまして、MSI S270におけるTotal_LBAs_Writtenは、LBAsとはありますが実際には単純に「書き込み済み総ギガバイト数」でした。

いや、GiBだからギビバイトというべきでしょうか。

面白いですね。ストレージの容量はGB(1,000,000,000)単位なのに書き込みデータ量はGiB(1,073,741,824)単位なんですねえ。

だから何だといわれても困るのですが。。。営業と技術の部門間の考え方の乖離が垣間見える気がします。

個人的には20世紀から連綿と狂ったようにストレージへの書き込みアクセスを抑止するために最悪でもtmpfsを無理やり利用するなど散々苦労してきたことがここで目に見えて感無量です。

以上、ここまでお読みいただいてありがとうございました。

phpで文字列としての「\\n」以外の「\n」だけをLF文字(0x0A)に変換する方法

 キャリッジリターン(CR)の文字コード(0x0D)やラインフィード(LF)の文字コード(0x0A)から文字列としての"\r", "\n"に変換するのは特に問題はないと思います。

問題は逆方向で、\nという文字列をLFという文字に変換したいとき、str_replace('\\n',"\n",$text)みたいにやるとやっぱ恥ずかしいですよね。

\\nという文字列で、エスケープしたつもりのデータが埋もれているかもしれません。
\\nという文字列のつもりが0x5C(\),0x0A(LF)になってしまっては悲しいです。

そこで、とりあえず以下のようにするのはいかがでしょう。

  $text= preg_replace( '/(?<!\\\\)\\\\n/', "\n", $text );  

\マークだらけでうんざりしますね。phpで正規表現を扱う者への呪いです。

何がしたいのかというと、$text変数内に\\nという文字列でなく、\nという文字列があったらLF文字(0x0a)に変換するという祈りを込めています。

(?<!\\\\) というのは否定後読みといって\\\\というパターンがない場合にマッチします。phpでは\\\\というパターン\という「文字」にマッチします。呪いでしょう?

ついでに、\\\\nは\\\nと同じ意味を持ちます。まさに呪いです。

以上は前記事でデータベースをmysqlからsqlite3に移行した際に得たネタです。

何が恥ずかしいと言いますと、phpをたまに触って正規表現を使用するたびに\\\\のことをすっかり忘れているからです。

そこで、恥ずかしながら記録として残しておきたいと思います。とりあえずはデータベースのデータ内ではエスケープ文字としての\を特別扱いする必要はないので、この程度で申し訳ございません。

くだらない駄文をお読みいただいてありがとうございました。

mysqlからsqlite3に移行してみた際の恥ずかしい備忘録

 はるか昔(最古のデータの作成日時が1999年...)に使用していた関係で惰性で使い続けてきたmysqlでしたが、もう長いこと読み出しこそ頻繁にあるもののデータの更新はもはや月に数件というほど減少し、ちょっと大げさになっちゃったね、お役御免かな、と思っていました。

最近、CentOS7からUbuntu24に移行した際にPCから.net用のコネクタでリモート接続していたプログラムが動かなくなって、再ビルドしようとしたらvisual studio2022用では.net用のコネクタが使えなくて、見切りを付けました。

その後、最近時間ができたので、どうせならmysqlから一気にsqlite3に移行させてみることにしました。

その際の恥ずかしい作業録です。

・CREATE TABLEの UNIQUE KEY 句は KEY がいらない

KEYという文字列を削除するだけでした。

・CREATE TABLEでインデックスを作成するKEY句がない

前項とややこしいですが、mysqlのKEY句はテーブル作成時に同時にインデックスを張れます。
で、sqliteではCREATE TABLE時にはインデックスのカラムを指定できないので、テーブル作成後にCREATE INDEX文で作成する必要がありました。

・NOW()関数がない

CURRENT_TIMESTAMPに置き換えました。

そしたら・・・次の項目の問題がありました。

・sqlite3の日付関連はすべてUTC

問答無用でUTCなので潔いです。
そういえば十年以上前にある仕事で使ったときになんかあったような気が・・・。ちっとも覚えていませんでした。

既にあるデータをUTCにするのも手ですが、手抜きでCREATE TABLEでカラムのDEFAULT値に DATETIME( 'now', 'localtime' )とかやってみたら叱られました。

早速Google検索経由で先達にお伺いしたところ、仕様だアキラメロというページが最上位に出てくるのですが、さらにお伺いを立てると、かっこでくくってあげて、(DATETIME( 'now', 'localtime' ))とするとオッケーだとのありがたいお言葉で無事解決できました。ありがとうございます!

・mysqlではテキストデータではCRは\r,LFは\nと格納されるが、sqlite3ではもろそのままの文字コードで格納される。

なるほど~。って感じですね。

対策は、ちょっと長くなってしまったので、別の記事にしました。

概要としては、これまでに作成されたmysql形式に合わせてphp側(手始めに移行しているテーブルは自作のやっつけphpアプリで利用するためのテーブルなので)でキャリッジリターン(0x0a)とラインフィード(0x0d)をそれぞれ文字列としての\r, \nに相互に変換することにしました。

・sqlite3 には INSERT INTO ... SET 構文がない

これはむしろmysql方言ですね。なくても仕方がありません。

トリガーでのINSERT文でSET構文を使っていたのですが、むやみにUPSERTとか方言だらけの機能は使わないでおきたいので、標準的なSQLに書き換えるだけにしておきました。

・sqlite3にはVACUUMが必要

postgresqlを思い出すバキューム。カーがつくと途端に香しくなる不思議な言葉です。

でも、更新が月に数回なデータベースにVACUUMなんかいるわけがありません。どうしても必要なら手動でやればいいので、無視することにしました。

・複数クライアントからの同時更新ができない

最近はできるらしいのですが、特にテストをしてみようとは思いません。それが重要ならmysqlから移行する必要がありません。

万が一バッティングしたら「モウイチドヤレヨ」光線を発射して運用でカバーする予定です。

・RAND()関数がない

RANDOM()関数ならありました。

とりあえず、この程度でテスト運用を開始して、当分様子を見る予定です。

何か恥ずかしいことが起きたら、喜んで記事にしたいので起きてくれることを祈りつつ、こんな記事をお読みいただきまして、心からお詫びを申し上げる次第です。