「日記」に関する日記

次>

美文のキャラ倉庫と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とプルリクというより、自分で直すべき案件ですね。

アンパンマンDBとドラゴンクエスト10と美文のキャラ倉庫と日記

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

リンクにげんき100ばい!マーケットを追加しました。
公式のオンラインショップです。
DVDとかの円盤系はなくて、ぬいぐるみや雑貨とかのグッズ系が中心ですね。
絵本もあるけど原作はなくて、書籍目的なら書店のほうが良さげ。

ドラゴンクエスト10(全員)

水やり
第25回アストルティア★ハッピーくじ「アストルティア14周年お祝いくじ」 (2026/8/3更新)|目覚めし冒険者の広場
くじの結果が出たので、商品引き換えしてきました!
今回の参加賞は、水やりのしぐさです。
カメラが近付くとじょうろだけ消えるので、何か悪いことに使えそう。

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

美文のキャラ倉庫(MediaWiki)

ifという制御構造が入る以上、プログラミングなわけで、Wikiのマークアップ言語ではなくプログラミング言語のLuaで書くのが正攻法だったのです。
そうすれば、Wikiルールの余計なものが入るのも防げるのです。
…という方向で、修正中。

日記

共有ボタン、表示するようにしました。
こんな感じのHTMLになっています。

<a class="cp" href="javascript:navigator.clipboard.writeText('2026年8月3日の日記 https://tgws.plus/diary/20260803');" title="タイトルとURLをコピー">コピー</a>

まあ、昔ながらの、hrefに「javascript:」入れるやつです。
もっときれいにやる方法はもちろんあるんですが、機能しなくても困らないおまけみたいなボタンなんで、あんまりこだわる必要はないかなーと。

ドラゴンクエスト10とシェアボタン

ドラゴンクエスト10

アストルティア14周年カウントダウン
おしゃべりドラキーマのアストルティア14周年カウントダウン! (2026/7/24)|目覚めし冒険者の広場
14周年!
めでてえ!

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

ユリリスとアルベル

  • クエスト「よみがえる王国/真実に気づいた男」をクリアした!

グランゼドーラのクエスト終わらせました!
しろいコキンのときも言ったのですが、やっぱりこのカップルが気になっちゃいますねぇ。

(ボスネタバレ)

魔剣士テグラム

  • 【クエスト】「よみがえる王国/真実に気づいた男」魔剣士テグラムをはじめて倒した!

魔剣士テグラムがなんぼのもんじゃい!こっちはちゃんとダーマ神官の下で正式に転職した魔剣士ァォィョッュやぞ!!
貴様は魔剣士としても本物にはなれんのだ!

他の写真は以下から。ミフミンは変態写真を撮っていただけ。
写真置き場「2026/08/02」

シェアボタン

ページ下に表示される共有ボタンに「コピー」を追加しました。
タイトルとURLをコピーします。
アイコンはICOOON MONOさんのを使ってます。

そういえばこの日記には共有ボタン表示しない設定だったな。
検索インデックス許可するようにしたんだし、共有ボタンも解禁していいかも。

映画ちいかわ 人魚の島のひみつとヘルプページ

映画ちいかわ 人魚の島のひみつ


感想よそで書くって言ってたから…な!

ヘルプページ

試しにPHP8.5で動かしたら微妙な非推奨が出たんで修正しました。
まあ、動作自体は変わってないです。
あと、日記でのカテゴリ名、「ヘルプ」から「ヘルプページ」に変えました。

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

美文のキャラ倉庫

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

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

ドラゴンクエスト10

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

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

TGWS内部処理

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

浮き沈みランチャー2と日記とバイオハザード レクイエム

浮き沈みランチャー2

バイオ9と同じく放置しちゃってた案件。
実装は8割がた終わってたんで、動作検証して手直しして、インポートがとりあえずできるようになりました。
インポート画面はモードレスウィンドウで、いくつも同時に開けてしまってよくない(と思う)ので、そのあたりの修正も必要かなと思います。

インポートのテストをした後は原状復帰のために削除するわけなんですが、削除後すぐに画面に反映されなかったので、これも修正予定。
自動で反映されるわけじゃなかったのね。

日記


おお、昨日のYouTube配信のデータが最近の活動画面に出てる!
今日の日付になっているのは謎ですが…タイムゾーンの問題?

バイオハザード レクイエム

今日はプレイしてないんですが、過去に書いた日記を見返していたら、今なら宝石をはめ込めそうな穴の写真発見!
この場所、プレイルームだったか。
今度進めよう。

そういえば昔有料のボイスチェンジャーの無料配布貰ってたな。
実況配信やるんなら声変えてもいいかもしれない。

アンパンマンDBと日記

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

実はアンパンマンと迷子のマイマイ、いつでも見られる状況にありながら全然見てなかったんです。
見たので、キャラ追加しときました。

日記

管理画面でYouTubeの自作動画の情報も表示できるようにしました!
まあ、肝心の自作動画そのものをここんとこめっきり投稿しなくなっちゃったんですけどね。
ニコニコも一応対応しておきたいところ。
APIあったかな…。

ドラゴンクエスト10とゲーム記と日記

ドラゴンクエスト10

ラキ君優勝!
アストルティア・ナイト総選挙、結果出てました。
そして景品はヒーローパンチ。
拳で殴りつけるしぐさに漫画みたいな演出がつくやつです。

ゲーム記

画面写真置き場のシステム、もうちょっといい感じにできるようにいじってました。
Nintendo Switchとかの画面写真置き場にはこの日記に載せるための支援機能がついているのですが、バイオ9とかのページにあるやつは別システムなので支援が薄いんですよね。
それを他の画面写真置き場のシステム全般にも使えるように…の前段階として、あれこれメタデータを付けられる仕組みを実装。
この段階だけでも、画面写真置き場を量産しやすくなっています。
あとは、このメタデータを基に日記支援と繋げるだけ。

日記

過去のバイオ9の日記に、画面写真置き場のリンク付けました。
こういうことやってたおかげでバイオ9本編全然進んでないんですけどね。

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

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

  • クエスト「ガンバライオンの戦士たち/限界突破! レベル136」をクリアした!

はい無事クリア!
またしても30分かかってしまいました。

Avalonia UI

mifumi323/AvaloniaHideTitleBarSample
こんなの作ってました。
Qiitaとかにまとめなおしてもいいかもとか言ってたやつ、書くために。
まあ、このリポジトリがシンプルに結論なんですが、Qiitaのほうはちょっと文章書きます。

日記

Avaloniaタグ追加しました。
これまでの日記をまとめるのもそうだし、今後も書いていきたいので。

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

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

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

TGWS内部処理

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

アンパンマンDBと日記

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

DMM.comで収録話付きのジャケット画像が出てたので、記入しておきました。

日記

管理画面で使う分類サジェスト処理のテスト作ってました。
すでに動くとわかっているものの自動テストを改めて作り直すので、手っ取り早く実データのコピーを使いました。
で、これまで表面化していなかった潜在的な問題が発覚したので、修正しておきました。

日記


ご覧ください。今日は𝕏でつぶやく以外、何もしてません。

…なわけないんですけどね!
うちの日記にはその日やった内容を自動で取ってくる優れた機能があるんですが、GitHubにプッシュした内容をちょくちょく取りこぼすんです。
メインブランチは名前がmasterだろうとmainだろうと取ってくるようになってるはずなんだけどなァ。

mifumitterとアンパンマンDBと日記とphpLiteAdmin

mifumitter(非公開ツール)

邪魔なものを見えなくするミュート機能の強化とか、API実質停止で無意味になった機能を消すとかしてた。
自分専用だけど、むしろだからこそ、使い勝手良くしたいんですよね。

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

商品情報の記入とか、タイトルの改行ポイントの指定とかひっそりやってました。

日記

昨日のと関連してですが、リンク先の本来のタイトルとリンクテキストが食い違う場合、aタグのtitle属性に本来のタイトルを入れていたのですが、titleってそういうことに使うものだったっけ?って思っていったんやめることにしました。
ここは今のところ信念ないのでまた方針変更あるかも。

phpLiteAdmin

うちで使っているデータベースはSQLiteで、管理にはphpLiteAdminを使っています。
しかし、数年前に更新が止まっており、最新のPHPに対応していません。
ということで、こっちで勝手に修正しつつ使っています。
今回は、大昔のPHPで使われていたwhileとeachの組み合わせを、foreachに置き換えるなど。

と思ってたけど、今ソース管理のリポジトリ見に行ったら正式版になってないだけで普通に去年まで更新されてたな。

TGWSとNeoMuplとXfolioと日記

TGWS

めでたい!

ちなみに去年は年数数え間違えてました。
で、RSS修正したら、Twitter/Misskey連携が新規と誤認して、2年分一度に告知してしまいました
めでたくねーな!

NeoMupl

再生状態の表記をユーザーで変えられるように」の課題対応です。
設定画面を作って動作確認すればこの課題は完了。
次世代のアプリを作る気で入るけど時間がかかりそうなんで当面のしのぎとして役に立つはず。

Xfolio

クロスフォリオ、始めてみました。
イラスト中心のサイトっぽいんで、絵をほぼ描かない私の居場所ではなさそうな気はしますが。
そんなわけで、ファンコミュニティも今のところは無料プランだけ用意しています。
有料プラン向けの作品も用意できないですしね。
もしかしたら気が変わっていずれ有料プランを用意するかもしれませんが、ちゃんと伝えたいことは結局全体公開にしちゃうんじゃないかなーとか思っています。

日記

うちのサイトからよそのサイトへのリンクは、外部リンクとして右上矢印をつけて新規タブで開くようにしているのですが、この外部サイト判定、自分の中で基準がぶれていたので、ちょっと整理しました。
一言で言うと、ページ単位で自分の支配下にある場合は内部リンクとみなし、そうでないものは外部リンクというルールにします。
今日の日記で言うと、クロスフォリオの自分のポートフォリオページは自分の支配下にあるので内部リンク、クロスフォリオのトップページは株式会社BookLiveの支配下なので外部リンクです。
他には、GitHubの他人の立てた課題に自分がコメントをしてそのコメントへのリンクをつける場合、単位はページなので、支配者は課題作成者ということで、外部リンクになります。

日記とドラゴンクエスト10

日記


管理画面なので訪問者の皆さんにはかかわりのない話なんですが、長いこと運営していて日記の分類もやたら数が多くなってしまったので、古いのはデフォルト非表示にしました。
全表示チェックを入れたり、suggestで提案されたりすると表示されます。

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

  • エリート魔物キラーの称号を得た!

モンスター10万匹討伐らしいです。
サービス開始からずっとやっていて、「ついに」なのか、「やっと」なのか…。

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

  • クエスト「旅のお供に 超便利ツール」をクリアした!

日記に書くこと少ないし、賑やかし用に軽くクリアしときました。

アンパンマンDBと浮き沈みランチャーと日記

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

来週の放送情報。
再放送です。

浮き沈みランチャー

mifumi323/FLaunch2
新しいフレームワークの練習も兼ねてAvalonia UIで書き直してみることにしました。
このソフトの肝となるWinFormsのNotifyIconに相当するのは、Avalonia UIではTrayIconです。
とりあえず、通知領域にアイコンを表示できるところまではできました。
ちなみに、マルチプラットフォームを目指すつもりは当面ありません。

日記

カテゴリの読みが一部変だったやつを修正しました。
そういうのを検出する仕組みを作って対応しました。

Qiitaとドラゴンクエスト10と日記とアンパンマンDB

Qiita

TGWSを構成する技術1:全体的な構成
投稿しました。
まだあんまりオリジナリティも役立つ技術情報も込められていないですが、今後各種の話をするときの前提になる想定です。
だからまあ、これからですね、これから。

ドラゴンクエスト10

大型アップデート情報 バージョン7.1 (2024/7/3)|目覚めし冒険者の広場
次回のアップデート情報来てますね。
クエストスキップ機能とか、言ってみれば「お前が金を出したこのゲーム、金さえ出せば遊ばなくていいぞ」って言ってるようなものなので、ゲームクリエイター側とすれば、できれば提供したくなかった機能でしょうね。
私としては、やっぱり自分でクエストクリアしたいけど、私みたいにサボって全然進めない人にこそ有用な機能でもあるんだよなァ…複雑。

日記


この日記には、その日やったことをスムーズに思い出せるように、最近の活動を表示する機能が管理人専用で存在するのですが、Qiita投稿情報もちゃんと出てくれました!
この機能の実装はもうずいぶん前なんですが、Qiita投稿は久しぶりだったんで、ここにちゃんと出るのか心配だったんですよね。
ちなみに、雑多やキャラ倉庫の更新情報も出ます。

アンパンマンDB(システム)

機能完成まで内緒にしておくつもりだったんですが、画面写真に写ってしまったので。
サブタイトル機能を追加します。
アニメとかの「サブタイトル」とは違う概念で、ここでは、ウェブページの見出しに付加する情報のことを言います。
例えば、「ばいきんまんとマジカちゃん」というタイトルは2つ存在しますが、この2つを区別できるように話数情報を加えて、「1041話Bパート『ばいきんまんとマジカちゃん』」みたいにします。
ここで、正式名称は「ばいきんまんとマジカちゃん」のままで、「1041話Bパート『」と「』」がタイトルの隣に、しかしタイトルとは少し違うものとして、表示されるようになります。
システムとして整合性を保ちつつ、一目で区別しやすくするのが目的です。

ドラゴンクエスト10とあずきミュージアムと日記

ドラゴンクエスト10(全員)

竜王
竜王城の決戦・再演 (2024/5/9 更新)|目覚めし冒険者の広場
昔やってたイベントだけど、報酬新しいのが出てるので、やってみました。
今回は全キャラサポート仲間でやりました。
プレイヤーと行くと不測の事態が起きるし、完全に一人でやるのはほぼ無理ゲーなんで。

他の写真は以下から。ミフミンは写真撮ってない。
写真置き場「2024/05/19」

あずきミュージアム


行ってきました。
館内は写真スポットを除き撮影禁止なんで、写真は少なめです。
小豆だけに特化した展示ではなく、関連する食物や、伝搬の歴史、栽培地域の文化など、幅広く取り扱っていました。
あとは、ミュージアムレストランであずき御膳を食べたり。

日記

従来、こう言った観光系の日記は「思い出」カテゴリに入れてたんですが、思い出ではあるけどカテゴリとしてはちょっとずれてるなと思ったので、「観光」というのを作ってみました。

アンパンマンDBと日記

アンパンマンDB(システム)


善は急げで+-つけてみました。
しかしこうして見てみると、一行が長くなって折り返された時の見せ方にまだ改良の余地がありそうですね。

関係ないですが、検索のストリクトクエリもいくらか改良を考えています。
一般ユーザーにも教えている範囲では、みんなのタグの「user_tag:user_tag:○○:○○」があるんですが、最初の「user_tag:user_tag」の部分が見るからに冗長ですね。
本当は最初のトークンと次のトークンは意味が違っていて、最初が項目名、次はそれをどう扱うかというインターフェース指定なんですが、みんなのタグを含め、インターフェースを複数持つ項目はないから、実は項目ごとにインターフェースはすべて固定なのです。
なので、この冗長性を排除したいというのが一つ。
第二に、これは実用上ほぼ問題ないんですが、「○○」の部分にコロンを入れられないという地味な問題もあります。
あと、第三として、リスト項目をより細かい条件で検索できるようにするといった、純粋なグレードアップもしたいところですが、ストリクトクエリのトークン数は現状固定なので、まあまあ難しいのが現状です。
このあたり、第一の冗長性は当然廃止するとして、第二・第三の問題は、str_getcsvを使えばいい感じにトークンに分解できると思うので、これでトークン数可変で処理するようにすれば、まとめて解決できるんじゃないかと思っています。

日記

たまーに無題のまま日記投稿しちゃうことあるので、投稿前に無題チェックを入れるようにしてみました。
シンプルにJavaScriptで題を判定してconfirmしています。

次>