「TGWS内部処理」に関する日記

次>

美文のキャラ倉庫とkawax/niconicoと日記

美文のキャラ倉庫

基本データ表示のためのLuaスクリプトほぼできた!
どうせサイトを公開したらスクリプトも全体公開になるのでソースコード置いときます。

(長いから折りたたむよ)

Module:BasicData

local p = {}

function p.process(frame)
    local args = frame:getParent().args
    local result = p.generate(args)

    return frame:preprocess(result)
end

function p.generate(args)
    local string_utils = require('Module:StringUtils')
    
    local fields = {
        { key = 'ふりがな', val = args['ふりがな'] },
        { key = '正式名称', val = args['正式名称'] },
        { key = 'フルネーム', val = args['フルネーム'] },
        { key = '英字表記', val = args['英字表記'] },
        { key = '他の名前', val = args['他の名前'] },
        { key = '公式サイト', val = args['公式サイト'] },
        { key = '登場作品', val = args['登場作品'] },
        { key = '種族', val = args['種族'] },
        { key = '性別', val = args['性別'] },
        { key = '年齢', val = args['年齢'] },
        { key = '大きさ', val = args['大きさ'] },
        { key = '一人称', val = args['一人称'] },
        { key = '二人称', val = args['二人称'] },
    }
    
    local info_rows = {}
    local cargo_rows = {}

    for _, field in ipairs(fields) do
        -- 値が存在し、空文字列でない場合のみ行を生成
        if field.val and field.val ~= '' then
            local key = field.key
            local value = field.val
            if key == 'ふりがな' then
                local sortkey = string_utils.sortkey(value)
                table.insert(cargo_rows, string.format('Furigana = %s', value))
                table.insert(cargo_rows, string.format('FuriganaSort = %s', sortkey))
                if args['表示用ふりがな'] and args['表示用ふりがな'] ~= '' then
                    value = args['表示用ふりがな']
                end
                value = string.format('%s{{DEFAULTSORT:%s}}', value, sortkey)
            elseif key == '登場作品' then
                local titles = mw.text.split(value, '、', true)
                local converted_titles = {}
                for _, title in ipairs(titles) do
                    if title == 'ふにゃ(ゲーム)' then
                        table.insert(converted_titles, '[[ふにゃ(ゲーム)|ふにゃ]][[Category:登場作品:ふにゃ]]')
                    else
                        table.insert(converted_titles, string.format('[[%s]][[Category:登場作品:%s]]', title, title))
                    end
                end
                value = table.concat(converted_titles, '、')
            elseif key == '種族' then
                local kinds = mw.text.split(value, '、', true)
                local converted_kinds = {}
                for _, kind in ipairs(kinds) do
                    table.insert(converted_kinds, string.format('[[%s]][[Category:種族:%s]]', kind, kind))
                end
                value = table.concat(converted_kinds, '、')
            elseif key == '性別' then
                value = string.format('%s[[Category:性別:%s]]', value, value)
            end
            table.insert(info_rows, string.format('<tr><th>%s</th><td>%s</td></tr>', key, value))
        end
    end


    local result = ""
    
    if next(info_rows) then
        result = string.format("%s<table class=\"wikitable\">%s</table>", result, table.concat(info_rows, ""))
    end
    
    if next(cargo_rows) then
        result = string.format("%s{{#cargo_store:_table = BasicData|%s}}", result, table.concat(cargo_rows, "|"))
    end

    return result
end

return p

Module:StringUtils

local p = {}

function p.sortkey(furigana)
    if furigana == "" then return "" end

    local sortkey_table = {
        {"が", "か"}, {"ぎ", "き"}, {"ぐ", "く"}, {"げ", "け"}, {"ご", "こ"},
        {"ざ", "さ"}, {"じ", "し"}, {"ず", "す"}, {"ぜ", "せ"}, {"ぞ", "そ"},
        {"だ", "た"}, {"ぢ", "ち"}, {"づ", "つ"}, {"で", "て"}, {"ど", "と"},
        {"ば", "は"}, {"び", "ひ"}, {"ぶ", "ふ"}, {"べ", "へ"}, {"ぼ", "ほ"},
        {"ぱ", "は"}, {"ぴ", "ひ"}, {"ぷ", "ふ"}, {"ぺ", "へ"}, {"ぽ", "ほ"},
        {"ゔ", "う"},
        {"ぁ", "あ"}, {"ぃ", "い"}, {"ぅ", "う"}, {"ぇ", "え"}, {"ぉ", "お"},
        {"ゃ", "や"}, {"ゅ", "ゆ"}, {"ょ", "よ"}, {"っ", "つ"}, {"ゎ", "わ"},
        {"あー", "ああ"}, {"いー", "いい"}, {"うー", "うう"}, {"えー", "ええ"}, {"おー", "おお"},
        {"かー", "かあ"}, {"きー", "きい"}, {"くー", "くう"}, {"けー", "けえ"}, {"こー", "こお"},
        {"さー", "さあ"}, {"しー", "しい"}, {"すー", "すう"}, {"せー", "せえ"}, {"そー", "そお"},
        {"たー", "たあ"}, {"ちー", "ちい"}, {"つー", "つう"}, {"てー", "てえ"}, {"とー", "とお"},
        {"なー", "なあ"}, {"にー", "にい"}, {"ぬー", "ぬう"}, {"ねー", "ねえ"}, {"のー", "のお"},
        {"はー", "はあ"}, {"ひー", "ひい"}, {"ふー", "ふう"}, {"へー", "へえ"}, {"ほー", "ほお"},
        {"まー", "まあ"}, {"みー", "みい"}, {"むー", "むう"}, {"めー", "めえ"}, {"もー", "もお"},
        {"やー", "やあ"},                   {"ゆー", "ゆう"},                   {"よー", "よお"},
        {"らー", "らあ"}, {"りー", "りい"}, {"るー", "るう"}, {"れー", "れえ"}, {"ろー", "ろお"},
        {"わー", "わあ"}, {"ゐー", "ゐい"},                   {"ゑー", "ゑえ"}, {"をー", "をお"},
    }

    for i, v in pairs(sortkey_table) do
        local from = v[1]
        local to = v[2]
        furigana = string.gsub(furigana, from, to)
    end
    
    return furigana
end

return p

まあ、おおむね引数で渡された項目を表に表示して、一部項目に特殊対応を入れている程度です。
ソートキー生成は、アンパンマンDB用にPHPで作っていたものをLuaに移植したもの。
文字列連結を繰り返すと遅くなるらしいので、ある程度はテーブルやstring.formatを使って連結を減らしています。
どこまで効果あるのか知らないですけどね。

欲を言えば、年齢や大きさも特殊対応入れたい。
昔作ったC#用単位・数値変換クラスをLuaに移植して、年齢順一覧とか大きさ順一覧とか作りたいんですよね。
ただ、ここで欲張ると公開がさらに先になっちゃいますからね。

kawax/niconico(TGWS内部処理)

PHPのバージョンを8.5に上げたいとか言ってましたが、思わぬところで問題が出ました。

kawax/niconico: ニコニコ動画API

ニコニコ動画の情報取得に使ってるこのライブラリ、誤動作とか致命的なエラーはないんですが、PHP8.4でDEPRECATEDが出るようになったのです。
場所を修正方法は把握していて、niconico/src/Search/Query.phpの16行目と、同29行目のパラメータです。
これが、null許可しないと明示されているのに初期値null扱いされているので、将来のバージョンでエラーにするから今のうちに直しとけよという警告を出してくれているというわけです。
昔のバージョンでは、null許可すると明示しなくても初期値nullにしておけば、暗黙的にnull許可扱いにしてくれていたんですが、それをやめることになったんですね。
だから、修正方針としては以下のように、型指定に「?」を付けて、null許可を明示します。

-    public function __construct(array $query = null)
+    public function __construct(?array $query = null)
-    public static function create(array $query = null): static
+    public static function create(?array $query = null): static

…というIssueとプルリクを明日出しとこう。そうしよう。

日記

さっきDIFFっぽいもの書きましたが、DIFFとしてのシンタックスハイライトは入れていません。
「```diff-php」とやればPHPのDIFFが出ると期待したんですが、コードブロック機能が壊れてしまいました。
なので、今は「```php」として、普通のPHPコード扱いでシンタックスハイライトを入れています。
今使っているシンタックスハイライトがDIFFに対応しているのかはわからないのですが、コードブロック機能が壊れるのは避けたほうがよさそうな気がします。
このコードブロック機能は私が作ったTgwsMarkの機能なんで、Issueとプルリクというより、自分で直すべき案件ですね。

TGWS内部処理

修正分はアップしたけど、まだDEPRECATEDが出てくる。
こういうのは放っておくと後で面倒な問題を起こすので、一つ一つ修正していこう。

ちいかわの感想はある程度書けてきたけど、初見感想に飢えている人がいる場所があるのでそっちで、なっ。

アンパンマンDBとドラゴンクエスト10と美文のキャラ倉庫とTGWS内部処理

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

来週の放送情報。
SLマンとコキンちゃんは昔順序逆のやつがあったらしい。

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

あぶない浴衣
[DQXショップ] おきがえリポちゃん ~ あぶない浴衣 ~ (2026/7/22)|目覚めし冒険者の広場
いつもの月例貸衣装。
浴衣の片側が大きくはだけてインナーが丸出しになっている服。
ちなみに男はインナーなしなので片乳丸出しです。

あぶない浴衣
うーん、確かにこれは危ない男…。

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

美文のキャラ倉庫

モジュールを読み込んでくれない問題、XMLからモジュールをインポートしてたんですが、そこでのモデルとフォーマットの指定が通常の記事と同じだったので、モジュールじゃなくて記事扱いされていたのでした。
移行用プログラムを修正してScribuntoとして取り込まれるように修正しました。
そしてもう一つ、Luaの実行用バイナリに実行権限がついていなかったのも一因でした。
Windowsめぇ…。

TGWS内部処理

とりあえず、致命的な問題はなさそうなので、PHP8.4に上げてみました。
うーん、事前調査で出なかったDEPRECATEDがいっぱい出てたぞ…。

美文のキャラ倉庫とTGWS内部処理とドラゴンクエスト10

美文のキャラ倉庫

ScribuntoでLua書いてるけど、そもそもモジュールを読み込んでくれない!
何か操作が必要なのか?

TGWS内部処理

ともあれ、古いコードが残りすぎていたPukiWikiは完全に脱したので、PHPのバージョン上げ作業。
今のところ問題はなさそう。
8.4に無事上がったら、もうストッパーになるコンテンツはないので、エラーを見ながら8.5まで早々に上げる予定。

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

鉄鬼軍王キラゴルド

  • 鉄鬼軍王スレイヤーの称号を得た!

ミフミンも問題なく勝利!
今回はストームカイザー入りでやったんですが、都合のいい耐性のサポが見当たらなかったんで、ほぼ無策パーティーで特攻することに。
せっかくなのでミフミンも愉快なポーズでゴールドアストロンしたかったけど、キラゴルドさん全然こっち狙ってくれなかった!

ヘルクラウダー
またしてもついでにしばかれるヘルクラウダーさん。

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

美文のキャラ倉庫とドラゴンクエスト10とTGWS内部処理

美文のキャラ倉庫

WordPress側の微妙な調整も終わって、PukiWiki→WordPressへの移行は完全に完了!
ということで、PukiWikiは閉鎖して、現キャラ倉庫にリダイレクトするようにしておきました。

こっからはMediaWikiへの移行の挑戦。
頑張るけど無理そうならWordPressのまま運用します。

ドラゴンクエスト10

フィネトカのオルゴール妖精の光
ウェルカムギフト、全部集まってたので交換してきました。

あと、ハッピーくじも一通り購入。

TGWS内部処理

この日記もですが、これまで検索エンジン拒否していたいくつかのコンテンツを許可に切り替えました。
古い日記はちょっとリスキーな部分があるので拒否のままにしていますけどね。

TGWS内部処理とAmazonストアフロント

TGWS内部処理

コードの整理などやってた。
ただまあ、そろそろ効果薄くなって作業した感以外に得るものが無くなってる感じ。

Amazonストアフロント

トップページにストアフロントへのリンク追加しました。

アンパンマンDBとTGWS内部処理

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

#映画アンパンマンあるある」を追加しました。

TGWS内部処理

バイオ9以外のページにも画像の新システム入れました。
余計なタグが付いちゃってたとか、たまにキャッシュ生成失敗してずっとエラーファイル返し続けるみたいな問題を見つけたので、そのあたりは修正しています。

AmazonストアフロントとTGWS内部処理

Amazonストアフロント

みふみのすとあのAmazonページ
データ入れ終わった!
今度はゲーム記から遊んだゲームのストアも作っていいかも。

TGWS内部処理

手元の環境でバイオ9のページに適用してみて、いい感じ、特に速度上昇が目覚ましかったんで、明日当たりに本番反映しようと思います。
てか、ゲーム本編もちゃんとやっときたいな。

アンパンマンDBとTGWS内部処理

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

来週の放送情報。
去年の映画のテレビ放送前半です!

TGWS内部処理

画像ページをいい感じにするやつ、だいたい出来上がり。
もうちょっとテストコード増やして、バイオ9のページから適用していこうかと思っています。

TGWS内部処理とアンパンマンDBとGitHub Copilot

TGWS内部処理

バイオ9の画像ページみたいに、たくさんある画像をいい感じに一覧表示する機能の、もっといい感じにやるやつ実装中。
ユーザー側からはあまり意識しないかと思いますが、URLが内部形式むき出しになっていたり、ページを最初に表示したときは表示しない画像も一気に生成するから重くなっていたりして、微妙だったんですよね。
なので、URLをすっきりした形に整理したり、必要な画像だけ作るようにしたり、ついでに画像形式をJPEGより高効率なWEBPにしたりしています。
いやあ、他でもないバイオ9の画像が、4K画像大量表示だから重いんですよね。

アンパンマンDB(アイディア)

トップページにもアフィリエイト入れようかなとか考え中。
別に生活が変わるほど売り上げがあるわけじゃないけど、売り上げが少なすぎるとAPI止められる可能性があるんですよね。
ただ、今でもトップページはかなりごちゃついているので、必ずやると決めているわけでもないです。

GitHub Copilot


記事執筆ではなくネタ出しのほうにAIを使うという案。
そもそも何書くか決まらないというのが一番困りますからね。

アンパンマンDBとTGWS内部処理とRPG Developer Bakin Demo

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

情報提供の反映。

さらっと名前が公開されていたので。

TGWS内部処理

とりあえず、昨日対応した分はアップしました。
動作は何も変わっていません…と言いたいところですが、別件で仕様を厳格化した部分があるので、不正な入力に対しては強くなってるはず。

RPG Developer Bakin Demo


体験版、期限が昨年に切れたはずなのになぜか使えたので、またちょっと触ってました。
ちょうど今セール中で、買ってもいいかなーという気持ちがちょっと湧いてるんですよね。
正直言うと、先日のRPG-Coboが(起動できなかったというのもあるのですが)やりたいこととちょっとずれてる気がして、それよりはBakinのほうが近そうと思ったのです。

ちなみに、期限切れに関しては、保存ができないという制限が加わっていました。
今回体験版で確かめたかった坂の挙動については、だいたい分かった気がします。
まあ、買うかどうかはまだ決めてないけど、やるなら自分のキャラたちの住むところ作ってあげたいですね。

ドラゴンクエスト10とTGWS内部処理

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

達人トリスト案内係ラファーヌ素材屋ルヒオ

  • クエスト「約束の迷い子」をクリアした!

新エテーネの最後のクエストクリアした!
結局最初の山のやつ以外全然わかんなかったんでヒント見ちゃった。
まあ、ゲーム内のですけどね。

シュキエル
最後だと思ったら新しいクエスト出た!
今度は大変じゃなさそうだけど、とりあえず後日やろう。

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

TGWS内部処理

昨日アップデートしたやつ反映するなど。

浮き沈みランチャー2とTGWS内部処理

浮き沈みランチャー2

インポート機能の準備段階として、インポートメニューを2つに分けました。
1からスタートメニューからの2種類予定してますからね。
まだコミットはしていませんが、1からインポートのほうは8割がたできているつもりです。

TGWS内部処理

ライブラリのセキュリティ関連のアップデートとかしてました。

TGWS内部処理

寝正月!

…とか言ってたらSQLインジェクション的な試みがまあまあ来ていたので、せっかくなのでセキュリティ周り見直してました。
一応攻撃自体は成功してなさそう。
とりあえず投稿数制限必要だなーって思ったんで、ちょっとそのあたり対応しました。

アンパンマンDBとTGWS内部処理

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

来週の放送情報。
成虫ゴロンゴロの前でにこやかに笑う姉妹…どういう状況だ?

TGWS内部処理

HTMLのややこしいやつやるために自動テストから作るなど。
あと、日記の統計がPHPのバージョン違いで動いてなかったので修正とか。

TGWS内部処理

アンパンマンDBのキャッシュ処理をさらに安定化させたとか、古い関数使ってるところを新しいのに置き換えたとか、使わなくなった機能を非推奨にしたとか、地味な調整やってました。
もっと華々しい新機能とかも作りたいんだけどね。

ちなみに機能を非推奨にした時点で、その機能の自動テストを先に消しちゃうので、テストカバレッジは下がります。

TGWS内部処理とRPG Developer Bakinと星のカービィディスカバリー

TGWS内部処理

データベースバックアップ、動いてました。
ただ、今回は一発で成功してしまったため、リトライ機構の確認はできませんでした。
失敗時のリトライ機構で失敗するという可能性は依然として残っていますが、正常系が正常に動作している以上、少なくとも悪くなっていることはないでしょう。

RPG Developer Bakin

Steamで10% OFF:RPG Developer Bakin
正式版発売されてました。
ただまあ、今はゲームを作れるような状況じゃないので、今は買いじゃないかなぁ。

星のカービィディスカバリー


ゲームを遊ぶような状況ではあるかもーー!?

というわけで、追加コンテンツのスターリーワールド買いました。
今のところ最初の面だけ触ってます。
まあ、まだ安心と信頼のカービィの3Dゲームのバリエーションという感じです。
BGMがラスボスのときに聞いたようなコーラスが目立つものになっていて、美しさ・楽しさの中に不穏さも感じます。
スターリーを集めて怪しいやつを封印するのが目的だそうだけど、封印成功しちゃったらラスボス不在になるよなぁ…。

ドラゴンクエスト10とTGWS内部処理

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

大型アップデート情報 バージョン7.5 (2025/8/27 更新)|目覚めし冒険者の広場
大型アップデートだ!!
なので…

きまぐれ猫ドレス
おきがえリポちゃん ~ きまぐれ猫ドレス ~ (2025/8/26)|目覚めし冒険者の広場
新要素はさておいて、今月の貸衣装。
猫的なドレスです。

きまぐれ猫ドレス
猫的な衣装なので、猫的なしぐさをやってみようとリベリオダンスをしてみたら、尻尾が消えてしまいました。
うーんきまぐれ。

きまぐれ猫ドレス
胸周りにボディラインがくっきり浮き出る服装で、一部ではボディペイントのようだと言われたりしたそうですが、プクリポだと浮き出るラインが特にないのでいつも通り普通に服に見えてくれます。
ついでに、プクリポだと元の耳もすごく目立つので、ボディラインの代わりに4耳が際立ちます。

きまぐれ猫ドレス
他の種族だと尻尾はお尻の上部から出る感じなんですが、プクリポだと完全に背中から生えてますね。
そしてやはり際立つ4耳。

TGWS内部処理

データベースのバックアップ、毎日深夜に動かすようになっているんですが、微妙に不安定で、時々落ちるんですよね。
ということで、リトライの仕組みを入れてみました。
処理に使っているPHP自体が何らかの外部要因でいきなり落ちてしまうので、PHPを呼び出すシェルスクリプト側で対応しています。

TGWS内部処理とPHP

TGWS内部処理

更新履歴ページのRSSはずいぶん前にURL変更していたんですが、各ページからのリンクがずいぶん長いこと古いURLのままだったので、修正しました。
あわせて、ずいぶん長いこと残っていたけど使われていなかったスタイルシートとかリダイレクトとかも整理しました。

PHP

DateTime関連で不思議なものを見つけたのでちょっと記事書いてます。

浮き沈みランチャーとアンパンマン日替わり紹介bot

浮き沈みランチャー

リリースしました。
こっちもマイナーバージョン2桁到達。
まだ課題が2つ(#31#34)ほど残ってるけど、これはAvalonia UI版に回してもいいかもですね。

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

完全に内部動作の話なんですが、このbot用のデータって、紹介内容とセットで、前回同じものを紹介したときにどんな文面だったかも覚えているんですよね。
過去に紹介したことがあるけど文面が変更されているなら優先的に再紹介する…というのを想定して、そんなものを用意していました。
しかし、運用と全然噛み合ってないシステムだったので、過去の文面に関係なく、未紹介だけを優先するように、昔に修正を加えました。
その修正からかなり時間がたったのですが、いまだに過去文面を持ち続けているので、過去文面をもう使わない・持たないようにするためのさらなる修正中です。
修正しなくても今のシステムは問題なく動くんですが、こういう古くていらなくなったものは今後の開発の邪魔になるのでね…。

次>