トワイライト・ゾーンの”Uncle Simon”

トワイライト・ゾーンの”Uncle Simon”を観ました。サイモンの姪のバーバラはサイモンのただ一人の肉親で唯一の遺産継承者です。バーバラはサイモンを25年間も支えて来ましたが、サイモンは性格が最低で、毎日バーバラのことを馬鹿にして様々な呼び方でののしり続けます。ある日サイモンは階段から落ちて背骨を折ります。バーバラはサイモンの助けてくれ、という叫びを無視し、サイモンは死にます。サイモンの遺産相続で弁護士がやって来て、バーバラが相続する条件として、元の屋敷に留まり実験室の「it」を世話することとなっていました。弁護士とバーバラが実験室に入るとそこにはロボット(「禁断の惑星」のロビー)がいました。最初はたどたどしく喋っていたロボットですが、段々と慣れてくるとしゃべり方がサイモンそのままになり、サイモンそのままにバーバラを罵ります。バーバラはロボットを一度倒して壊そうとしましたが、数日後復活し、杖をついてますますサイモンそのものになりました。バーバラの受難の日々はサイモンの死後も続いていきます…
ロビーのおもちゃは”One for the Angels”で登場していましたので、2回目の登場です。もう1回登場するエピソードがあるみたいです。

ウルトラマンAの「ゾフィーの贈りもの」

ウルトラマンAの「ゾフィーの贈りもの」を観ました。夢の中で超獣に襲われるとおねしょをする子供が、その夢の場所を突き止め、実際に行ってみると本当にそこに超獣が出現します。しかし北斗はその子の言うことを信じず嘘つきと決めつけます。それを突然夜空に出現したゾフィーにたしなめられ、それが「贈りもの」かと思ったらまだ続きがありました。結局その超獣と戦うことになったエースが湖の中に落ちると、実はエースは水の中が非常に苦手であった、と宇宙空間を自由に飛び回るウルトラヒーローにあるまじき弱点です。苦戦するエースにゾフィーが湖の水を一時的に吸い取る装置を発動させた、というのが「贈りもの」でした。しかしゾフィーを出せばいいというものでもないと思いますが、この辺り、本当に脚本の質が低いです。何かと言うと「ウルトラ6番目の弟」がストーリーにからみますが、まったく面白くありません。

製品検索ページの実装ほぼ終了

会社のWebサイト用の製品検索ページの実装がほぼ終わりました。後はデータの登録だけ。(ってこれが結構大変ですが)
今回、完全な分業で、データベースの登録、検索画面の作成等は私がLaravel/phpを使ってやりました。データベース関係はphpMyAdminもフルに使っています。そしてその後の細かな機能(選択状態クリア、検索結果画面に品名コピーボタン追加、検索件数表示、検索待ちの時にカーソルをグルグルに変える、選択候補の絞り込み、等々)は全てChatGPT4oにJavaScriptで書かせ、そっちは私は1行も書いていません。ともかくLaravelのphpのソースを渡して、「この機能追加して」で済むので、タイピングの手間、JavaScriptの書き方の調査だけでも大変な省力化です。おそらくベタに私が全部書いたら10倍の時間がかかったと思います。
ただChatGPT4oもちょっと抜けている所があって、新しい機能を追加すると前の機能が動かなくなるというのが多発しました。なのでソースは毎回渡した方が結果はいいようでした。

JavaScript: 動的な選択候補の絞り込み(2)

取り敢えず、スイッチの操作部種別を選んだら、それに対応する極数の候補を動的に絞り込むというJavaScriptのコードをChatGPT4oに作らせ動きました。最初は絞り込みの対応関係をJSONで書いてそれを読み込ませようとしたのですが、上手く動かないので結局元のHTML(blade)ファイルの中に書込む形になりました。あまり綺麗ではありませんが。しかしなかなか大変。書店でJavaScriptの本を何冊か立ち読みしてみましたが、現在選択されている候補を取得するとか、逆に候補を設定するとかはありましたが、動的な絞り込みまで載っている本は見つけられませんでした。
=========================================
<script>
document.addEventListener(‘DOMContentLoaded’, function() {
const switchOpPartSelect = document.querySelector(‘select[name=”switch_op_part_id”]’);
const switchPoleSelect = document.querySelector(‘select[name=”switch_pole_id”]’);

const allPoleOptions = [
@foreach ($switch_poles as $switch_pole)
{ id: “{{ $switch_pole->id }}”, text: “{{ $switch_pole->poles_number }}” },
@endforeach
];

switchOpPartSelect.addEventListener(‘change’, function() {
const selectedOpPartId = parseInt(this.value);
let filteredPoleOptions = [{ id: “1”, text: “-” }];

if ([2, 3, 5, 6].includes(selectedOpPartId)) {
filteredPoleOptions = filteredPoleOptions.concat(allPoleOptions.filter(option => [11, 12, 13, 14].includes(parseInt(option.id))));
} else if (selectedOpPartId === 4) {
filteredPoleOptions = filteredPoleOptions.concat(allPoleOptions.filter(option => [11, 12].includes(parseInt(option.id))));
} else if (selectedOpPartId === 7) {
filteredPoleOptions = [{ id: “1”, text: “-” }].concat(allPoleOptions);
} else {
filteredPoleOptions = [{ id: “1”, text: “-” }].concat(allPoleOptions);
}

switchPoleSelect.innerHTML = ”;
filteredPoleOptions.forEach(option => {
const newOption = document.createElement(‘option’);
newOption.value = option.id;
newOption.textContent = option.text;
switchPoleSelect.appendChild(newOption);
});
});

document.querySelector(‘form’).addEventListener(‘submit’, function() {
showLoadingMessage();
});

window.resetForm = function() {
document.querySelectorAll(‘select’).forEach(select => {
select.selectedIndex = 0;
});
document.querySelector(‘input[name=”type_name”]’).value = ”;

switchPoleSelect.innerHTML = ”;
[{ id: “1”, text: “-” }].concat(allPoleOptions).forEach(option => {
const newOption = document.createElement(‘option’);
newOption.value = option.id;
newOption.textContent = option.text;
switchPoleSelect.appendChild(newOption);
});
}
});

function showLoadingMessage() {
document.getElementById(‘loading-message’).style.display = ‘block’;
document.body.classList.add(‘loading’);
}
</script>

スター・トレック・TNGの”Shades of Gray”

スター・トレック・TNGの”Shades of Gray”を観ました。ライカーがある惑星で何かの細菌に感染し、それは転送装置のフィルターでも除去出来ず、ライカーはエンタープライズ号でポラスキーの治療を受けます。その細菌みたいなのはライカーの神経を徐々に化石化していきます。
それが脳に達すればライカーは死にます。ポラスキーはその細菌の脳への攻撃が始ってライカーが意識を失ったのを、脳に直接電極を刺して刺激することでその細菌の攻撃を食い止めようとしました。しかしその刺激がライカーに安らぎとかエロチックな感情を与えると何かの脳内ホルモンが分泌され、それが逆効果で細菌の攻撃を加速することが分りました。それでポラスキーはその逆に恐怖とか悲しみの感情を与えると細菌を弱めることを発見します。しかしそういう刺激のせいでライカーは過去の恐怖のシーンや悲しいシーンを何度も夢で見ることになります。結局細菌をやっつけるパターンが分り、ライカーは回復して目出度しですが、要するにこのエピソードは予算が無い時の常套手段である過去のシーンを使い回すためのエピソードで、誉める所がありません。シーズン2はシーズン1より短くなっていますが、ライターのストライキがあったようです。

NHK杯戦囲碁 林漢傑8段 対 広瀬優一7段(2024年6月2日放送分)


本日のNHK杯戦の囲碁は、黒番が林漢傑8段、白番が広瀬優一7段の対戦です。両者攻めよりシノギの棋風ということで戦いにならずにヨセ勝負かと思いきやいきなり序盤に左辺で攻め合いになりました。この攻め合いは白が勝ちましたが、黒も左上隅に食い込むことが出来ました。その後も下辺での戦いになった時に、白が4の17にコスミ付けて行き、ここからの戦いがまた激しくなりました。黒は白1子を取らずにどんどん上に延びて行く手が成立し、この辺り白は少し誤算があったように思います。しかし黒が白の攻めに転じてからどこかで間違え、中央が劫になり劫は黒が勝ったのですが、白はその代償で黒の下辺の地になだれ込み、同時に左下隅の黒に利かせつつ先手で活きたため、ここで形勢は白に傾きました。最後は白が黒の模様になだれ込もうとしたのを黒が根元から切断しました。しかし白は右下隅で犠打を打ち、その後黒の包囲網を上手く脅かしながら中央で連絡し、そうなると右辺上方の黒に眼が無く連絡する手を後手で打たなければならない、ということでここで黒の投了となりました。

JavaScriptのフレームワーク

まがりなりにも、Laravel/PHPを使ったWebアプリの開発が最低レベルながら出来るようになり、次はインタラクティブ性向上のためJavaScriptのコードを書くという段階で、一応こんな本をポチってみました。今作っているレベルのものにはフレームワークは不要と思いますが、何かの時に役立つかもしれないと思って。
まあ生成AIが全部コード書いてくれる時代に、この手の自学自習は時代遅れなのかもしれませんが、最低限ボケ防止ぐらいにはなると思います。

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枚集めれば父が帰ってくるという嘘を聞かされ、一所懸命に貝殻を集め…という内容です。この辺り、ヤプール人も夕子もいなくなり、惰性的に続いている感じです。