Webページでのデータベース検索での、各オプションの候補の動的な絞り込み

Webサイトでのデータベース検索で、各オプションの選択肢で、あるオプションのある選択肢を選んだ時に、その選択肢の時だけに存在する他の選択肢を絞り込む(存在しないものを消す)という処理について、以前ChatGPT4に聞いたのですが、回答はDBの各テーブルにリレーション(belong toなど)を設定して、それを使ってJavaScriptで候補を絞り込むだったのですが、良く考えるとそれだと必ずDBへのアクセスが生じ、レスポンスが落ちます。なので、要は候補同士の相関をJSONで書いておいて、それをHTMLを開く時に最初に読むやり方の方がいいと思って、再度ChatGPT4に聞いたら、その考え方は正しいようです。
================

以前、あるオプションの選択肢の選択によって他のオプションの選択肢を絞り込む(限定する)処理についてお聞きしましたが、その時はきちんとDBで各オプションのリレーションを設定して、JavaScriptで処理するということでした。そのやり方だとサーバーへの問い合わせが必ず発生しレスポンスが落ちるのではないでしょうか。簡易的なやり方として、絞り込みの関係になるオプション同士の連携をJSONなどで書いておいて、それをHTMLを読み込む最初に読み込んでおいて絞り込みに使う、というやり方はどうでしょうか?
ChatGPT
はい、オプションの選択肢を事前にJSON形式で定義しておき、クライアント側で絞り込みを行う方法は、有効なアプローチの一つです。これにより、サーバーへのリクエストを減らし、レスポンスの速度を向上させることができます。以下に、その具体的な方法を示します。
1. JSONファイルの作成
まず、オプション同士の関係を定義したJSONファイルを作成します。このファイルをサーバーの静的な場所に置き、HTMLページがロードされたときに読み込むようにします。
例:options.json

json
コードをコピーする
{
“product_op_parts”: {
“1”: {
“series_names”: [1, 2, 3],
“poles”: [1, 2]
},
“2”: {
“series_names”: [2, 3],
“poles”: [2, 3]
}
},
“product_series_names”: {
“1”: {
“poles”: [1]
},
“2”: {
“poles”: [2, 3]
}
}
}
2. HTMLとJavaScriptの修正
次に、HTMLとJavaScriptを修正して、JSONファイルを読み込み、選択肢を絞り込む処理を追加します。
例:create.blade.php
html
コードをコピーする

 

<style>
/* … 既存のスタイル … */<br />
</style>
<main></main>&nbsp;
<div align=”center”><big><big><big><big>ABC株式会社</big></big></big></big></div>
<div align=”center”><big><big>ABC Co., Ltd.</big></big></div>
<form action=”{{ route(‘product_name.search’) }}” method=”POST”>@csrf
<div>
<h3>製品名検索 <small><small>Switch Product Search</small></small></h3>
各オプションをプルダウンリストから選択して、ページ下部の[検索]ボタンをクリックしてください。
Please select each option from the pull-down lists and press the search button at the bottom of the page.
<label><b>操作部種別</b> Type of Operational Parts</label>
<select name=”product_op_part_id”>
<option value=””>選択してください</option>@foreach ($product_op_parts as $product_op_part)
<option value=”{{ $product_op_part->id }}”>{{ $product_op_part-&gt;sosabu_type }}</option>@endforeach
</select>
</div>
<div><label><b>シリーズ名</b> Series Name</label>
<select name=”product_series_name_id”>
<option value=””>選択してください</option>@foreach ($product_series_names as $product_series_name)
<option value=”{{ $product_series_name->id }}”>{{ $product_series_name-&gt;series_name }}</option>@endforeach
</select></div>
<div><label><b>極数</b> Number of Poles</label>
<select name=”product_pole_id”>
<option value=””>選択してください</option>@foreach ($product_poles as $product_pole)
<option value=”{{ $product_pole->id }}”>{{ $product_pole-&gt;poles_number }}</option>@endforeach
</select></div>
<!– 他のフォーム要素 –>
<table border=”0″ width=”350″ frame=”void” rules=”none”>
<tbody>
<tr>
<td><input type=”submit” value=”検索/ Search”></td>
<td>@csrf
<button type=”submit”>選択肢のクリア/ To clear options</button></td>
</tr>
</tbody>
</table>
<script>
document.addEventListener(‘DOMContentLoaded’, function() {
let options = {};
fetch(‘/path/to/options.json’)
.then(response => response.json())
.then(data => {
options = data;
});
const opPartSelect = document.getElementById(‘product_op_part_id’);
const seriesNameSelect = document.getElementById(‘product_series_name_id’);
const poleSelect = document.getElementById(‘product_pole_id’);
opPartSelect.addEventListener(‘change’, function() {
const selectedOpPart = this.value;
updateOptions(selectedOpPart, ‘series_names’, seriesNameSelect);
updateOptions(selectedOpPart, ‘poles’, poleSelect);
});
seriesNameSelect.addEventListener(‘change’, function() {
const selectedSeriesName = this.value;
updateOptions(selectedSeriesName, ‘poles’, poleSelect);
});
function updateOptions(selectedId, relationKey, targetSelect) {
const relatedOptions = options.product_op_parts[selectedId] ? options.product_op_parts[selectedId][relationKey] : [];
Array.from(targetSelect.options).forEach(option => {
option.style.display = relatedOptions.includes(parseInt(option.value)) ? ‘block’ : ‘none’;
});
targetSelect.value = ”;
}
});
</script>

まとめ
オプションの関係性をJSONファイルで定義します。
HTMLページロード時にこのJSONファイルを読み込みます。
JavaScriptで選択されたオプションに基づいて、他のオプションの選択肢を絞り込みます。
この方法で、クライアントサイドでの処理が行われるため、サーバーへのリクエストが減少し、レスポンスの速度が向上します。

東方之珠

前の会社の上司で香港に10年くらい駐在された方から「東方之珠」という曲を教わりました。天安門事件の頃に作られ、その頃既に中国への返還が迫っていて、そういう思いを込めて作られたようです。歌詞の内容は繁体字の字幕見ていれば大体分ります。
説明は以下。中国語WikipediaのChatGPT4訳。
——アルバム『皇后大道東』の紹介文案
1984年末、中国と英国は《中英聯合声明》を締結しました。多くの香港人は1997年の返還後の香港の将来について不安を感じ、長年にわたる移民の波が始まりました。《東方之珠》はこの背景のもとで作られました。罗大佑は東西の音楽の特質を混ぜ合わせ、香港の中華と洋風が共存する特徴を表現しようと考え、中国の五音階で主旋律を作り、副旋律には西洋音楽理論の和音分解を用いました。
歌詞には広東語版と北京語版があり、創作の順番については2つの説があります。1つは1986年夏に鄭国江がレコード会社の依頼を受け、既存の北京語詞を広東語版に改編し、7月にリリースされたアルバム『啓示』に収録されたというものです。もう1つは罗大佑が1986年に香港に移住して2か月後、1987年初頭に北京語詞が誕生したというものです。
1988年、罗大佑はアジアテレビの6周年記念で、再度作詞した北京語版を歌いました。1991年、このバージョン(歌詞は同じもの)が罗大佑のアルバム『皇后大道東』に収録され、アルバムの最後の曲として収められました。

https://www.youtube.com/watch?v=2qbaqufQ4jE

ウルトラマンAの「海の虹に超獣が踊る」

ウルトラマンAの「海の虹に超獣が踊る」を観ました。ヤプール人の残骸もいい加減に無くなっている筈ですが。相も変わらず超獣は出現し続けます。今回の、何だか新マンのタッコングを思わせるような海洋生物型超獣は、タンカーを襲います。工場廃水で海が汚染され、その原因が石油だということで、タンカーを襲うという、それなりに知性がありそうな超獣です。その超獣に最初に襲われた船長の息子が、超獣の鱗を貝殻だと思い、その姉からその貝殻を1000枚集めれば父が帰ってくるという嘘を聞かされ、一所懸命に貝殻を集め…という内容です。この辺り、ヤプール人も夕子もいなくなり、惰性的に続いている感じです。

トワイライト・ゾーンの”The Old Man in the Cave”

トワイライト・ゾーンの”The Old Man in the Cave”を観ました。舞台は1974年のアメリカのある村で、そこでは20人くらいの人々が細々と暮していました。1964年に核戦争があり、その村の人達はその生き残りでした。彼らが生き延びられた理由は「洞窟の中の老人」という者からいつもメッセージをもらっていて、例えば「明日は強い雨になり、その雨にはストロンチウム90が大量に含まれているので、全ての飲料水のタンクに覆いをしろ」などです。その村には外側が真っ黒になった缶詰めや飲料の瓶が多数残されていましたが、老人によればそれは放射能に汚染されているので身体に入れれば死ぬ、と言います。そんな時、村に武装した4人の兵士がやって来て、村を彼らの管理下に置く、と言い放ちます。そして「洞窟の中の老人」を迷信だと笑い、洞窟に案内させてその入り口を手榴弾で吹っ飛ばします。しかしその奥には鋼鉄の扉があり中には入れませんでした。兵士は缶詰めが汚染されてなどいない、と言い張り自分達で食べ、飲み、村の人もそれを見てそれらを食べ始めます。一人リーダーであったゴールドスミス(この名前は通常ユダヤ系です)だけがそれを拒否します。結局兵士は洞窟のドアをゴールドスミスに開けさせ(彼だけがその方法を知っていました)、中に皆が入ると、そこにあったのは一台のコンピューターでした…兵士と村の人はコンピューターを破壊します。そして何日か後、村の大地の上は死体でいっぱいで、兵士を含め缶詰め・瓶詰めを摂った者は全員死に絶えて、ゴールドスミスだけが生き残っていました…
おそらくですが、旧約聖書の世界の暗示であり、ヤーウェの神を信じないユダヤの人が罰を受けて死に絶えた、ということのように思いました。

ウルトラマンAの「あの気球船を撃て!」

ウルトラマンAの「あの気球船を撃て!」を観ました。南がいなくなってからの北斗は判断の誤りが多くなり、今回も本当は超獣である気球が発する異常なエネルギーを気球に初めて乗った子供達の熱気だと解釈してさっさと偵察を止めてしまいます。更にはいつもの山中隊員のように、気球に乗せられた子供達がおかしくなっていっていて気球はやはり超獣だというダンの情報を信じようとしません。それどころか結局気球が超獣だと分りましたが、子供が乗っていて攻撃出来ないため、北斗はダンを気球に乗り込ませます。ダンは最初は怖がって断っていたのを「ウルトラ兄弟達に笑われるぞ」と無理矢理な説得をします。しかしTACの作戦は結局失敗し、子供達は超獣の腹の中に吸い込まれてしまいます。最後はエースが切断技で超獣の首をはねて、子供達を解放するというものです。南がいた時は北斗に対して南が意見してそれで北斗が誤りに気付くとかがありましたが、一人になった北斗はレベルが落ちている感じです。この頃おそらく視聴率も落ちていたのではと思います。

NHK杯戦囲碁 横塚力7段 対 表悠斗2段(2024年5月26日放送分)


本日のNHK杯戦の囲碁は、黒番が横塚力7段、白番が表悠斗2段の対戦です。表2段は16歳初出場です。対局は黒の実利、白の厚みで進み、AIの判定は白が有利でしたが実際には拮抗した状態が続いたように思います。右上隅から右辺にかけて劫になったのですが、白が黒が下辺を打った劫立てに受けず劫を解消しました。これに黒は下辺を渡って行っただけでしたが、もしかすると13の16に跳ね出して行くより厳しい手が成立したかもしれません。ヨセで黒は左辺上方の地の所に白から真ん中に置いていくヨセがあるのをうっかりしていたようで白に渡られ黒地が減り、ここでは白がリードしたようです。しかし黒も左上隅を劫に持ちこんで若干挽回し、結局最後まで形勢不明の勝負になりました。最後右下隅で半劫が残り、これに白が勝ったことで白の半目勝ちというきわどい勝負でした。表2段は初出場ながら良く戦いきったと思います。次は張栩9段との対戦です。

スター・トレック・TNGの”Peak Performance”

スター・トレック・TNGの”Peak Performance”を観ました。ロミュランとかフェレンギとかの関係が良くない上にボーグという新しい敵も出て来た連邦は、スターシップの艦長候補の訓練が必要だということで、ピカードとライカーがシミュレーションゲームで対戦することになります。しかしライカーが指揮するのは数十年前のハサウェイというぼろ宇宙船です。立会人として連邦からコルラミと呼ばれる参謀が派遣されて来ます。その男はストラテジェマという3Dのボードゲームの達人としても有名です。医師のプラスキは自身過剰のコルラミの鼻を折ってやろうと、データをそのゲームで対戦させますが、データは敗れ、アンドロイドながら自己反省モードに入ってしまいます。一方、ライカーはウォーフ、ラフォージュ、ウェスリーなどを自分のチームに選びます。ウェスリーは自分の学習キットに隠して反物質を持ち込み、ハサウェイは2秒間だけですがワープが出来るようになります。エンタープライズ号側はデータがピカードの説得でNo.2に戻り、対戦が始ります。ライカー側は、ロミュランが攻撃してくるという偽データをエンタープライズ号に流し、エンタープライズ号が驚いている間に攻撃し、先制点を稼ぎます。ところが次にフェレンギの宇宙船が出撃して来て、これは本物でした。エンタープライズ号はシミュレーションのため、本物の武器が使用出来ず、あっと言う間にフェレンギに制圧されてしまいます。フェレンギはハサウェイに何か貴重なものが載せられているためエンタープライズ号が攻撃しなかったと誤解し、ハサウェイを渡すように迫ります。コルラミはハサウェイを見捨てて逃げるよう主張しますが、ピカードは断ります。ライカーは、2秒間のワープをブラフに使ってその間に別のトリックを仕掛ける案を提案します。しかし疑われないようその前にエンタープライズ号の光子魚雷を撃ってくるように言います。2秒のワープの成功確率は不確かですが、ピカードとライカーはその作戦を決行します。ライカーのトリックは今度は別の連邦の宇宙船がフルシールドで攻撃準備が出来た状態で接近中という偽データをフェレンギの宇宙船に流すことでした。それは成功してフェレンギは引き上げて行きます。コルラミはライカーとピカードの高い能力を改めて認めた、という話です。余談で再度コルラミと対戦したデータが、勝たないで引き分けに持ち込む戦略を続けて、コルラミを疲れさせるという作戦に出て、ついにコルラミが試合放棄します。
今回のエピソードは、エンタープライズ号のクルーがそれぞれ持ち味を生かした活躍を見せたのが評価出来ます。

ウルトラマンAの「ウルトラの星に祈りを込めて」

ウルトラマンAの「ウルトラの星に祈りを込めて」を観ました。ウルトラ6番目の弟のダン少年は完全に常連化しています。そのダン少年が車に轢かれそうになったのを助けた少年が実は超獣人間で、北斗はその少年の力でTACアローで飛行中に目眩を起して錐もみ状態になり、危うく墜落しかけます。ここでいつものパターン通り、山中隊員が北斗がぼーっとしていたと決めつけ真相の究明を行おうとしません。この辺はダメな上司の典型みたいです。
結局ダン少年が少年→超獣人間の弱点を見つけ、それをウルトラの星に伝え、それがエースに伝わって超獣を倒すという話です。
しかし、このダン少年シリーズ、私にはまったく面白くありません。当時現役で観ていた小学生には視聴率で効果あったんでしょうか。

塩野七生の「ローマ人の物語」の「危機と克服」上・中・下

塩野七生の「ローマ人の物語」の「危機と克服」上・中・下を読了。この3巻で何と言っても驚くのは、わずか50年ちょっとで8人もの皇帝が登場すること。ネロが軍団に叛旗を翻されて自死に追い込まれた後、ガルバ(在位約7ヵ月)、オト-(在位3ヵ月)、ヴィテリウス(在位8ヵ月)の3人は特に異常で、わずか1年半で3人の皇帝、しかもローマの軍団同士が凄惨な内戦をイタリア半島の中で繰り広げます。その後を収拾したのがヴェスパシアヌスでこちらは10年の在位で寿命を全うします。その息子がティトゥスで名皇帝と言われましたが、在任中にヴェスヴィオ火山の噴火(ポンペイ最後の日)、ローマの大火、疫病と次々とトラブルが襲いその心労なのか在位期間2年で41歳の若さで病死します。そしてティトゥスの弟のドミティアヌススが跡を継ぎますが、15年間の在位の後、暗殺され、元老院に厳しかったためその業績が抹殺されます。そして五賢帝の時代になり70歳のネルヴァが1年半治めた後、トライアヌスが新皇帝になります。ということで目まぐるしい変化の時代ですが、アウグストゥスの血を引く皇帝は途絶え、その後軍閥の争いになり、その混乱を属州出身のヴェスパシアヌスが解消するという流れになります。以前「タイムトンネル」でネロの亡霊がガルバが自分の死の原因だということでその子孫に復讐するという話がありましたが、やっとガルバが誰なのかわかりました。また今訳しているヴェーバーの「ローマ土地制度史」に丁度皇帝ヴェスパシアヌスが出て来て、その形容に”divus”(神聖な、神の)が付いていますが、その理由がローマの皇帝は死んで神となる、というのがこの3巻に出て来て容易に理解出来ました。(ヴェスパシアヌスの最期の言葉が「やれやれ、可哀想な俺、神にされてしまいつつある。」だそうです。)
それから塩野七生のこのローマ史は、歴史の専門家からは不正確だという批判が多いみたいですが、私も一つ見つけました。「ソキエタース」(塩野七生はイタリア風にソチエタスと表記)を株式会社みたいなもの、と書いてますが、それは断じて違います。また「ソキエタースの社長」とも書いていますが、通常ソキエタースは対等の仲間が作る組合で「社長」的な人はいません。
その他この期間にはガリアでゲルマン民族が大反乱を起したり、ユダヤ戦争でエルサレムがティトゥスの手によって陥落し、ユダヤ人がついに自分達の神殿と故郷を失います。

家の中の蛍光灯のLED化完了!

AmazonからLED蛍光灯が昨日・今日と届き、家の中の全ての照明をLED化しました。蛍光灯のナツメ球も含めてです。ただ蛍光灯のスタンドだけは残りました。インバーター式の照明器具のをLED蛍光灯にするのは、写真のように中を開けて、インバーターをバイパスして天井からのコードがつながるコネクターの反対側に、LED蛍光灯に付属していた線を半田付けして直結しました。スイッチもバイパスしたので、片方だけ点灯させたりとかナツメ球が使えなくなりますが、元々壁スイッチでON-OFFしていて使っていなかったので問題ありません。私は半田ごてもニッパーもワイヤストリッパーも全部持っていますからこの程度の配線は問題有りませんが、一般論としてはつなぐ場所を間違えてインバーターをバイパスしていないと、最悪発火して火事になる危険性があるのでお勧めはしません。