ドラクエウォーク攻略(https://dqw.ek-pro.com/)のサイトで、能力などでこころ検索をしたいなぁ、と考えていた。
そこにドラクエウォークで新しく実装されたこころ道で、条件に合致するこころの装備が必要になったため、より一層検索が欲しくなった。

だけれども、
検索をサーバサイドではなく、クライアントサイド、JavaScriptで実装したい、
でもDBがsqlite、CSVで検索は速度がどうだろうなぁ、
と思ってていた。

色々と調べたところ、SQLiteをJavaScriptで実装してくれているらしい。
すごい。
https://github.com/sql-js/sql.js

少しバージョンが古いが、実装サンプルはこちら。
https://puarts.com/?pid=1675

戻り値を取ってくる方法は知恵袋に落ちていた。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11259553751

実際に動かしたサンプルは以下。
<html lang="ja">
<head>
<meta charset="utf-8">
 <title>DB</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.8.0/sql-wasm.min.js" integrity="sha512-VYs2RuvWreNg7oouVhZ/9bEvdPgyd5L2iCPCB8+8Qks/PHbmnc82TQOEctYoEKPveJGML8s+3NGcUEZYJrFIqg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script>
async function start() {
const sqlPromise = initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.8.0/${file}`
});
const dataPromise = fetch("/work/kensaku.db").then(res => res.arrayBuffer());
const [SQL, buf] = await Promise.all([sqlPromise, dataPromise])
const db = new SQL.Database(new Uint8Array(buf));
let query = "SELECT * FROM kokorokensaku";
let contents = db.exec(query);
console.log(contents);
console.log(contents[0].values[0][1]);
}
start();
</script>
</head>
<body>
Output is in Javascript console
</body>
</html>

ドラクエウォーク攻略 → https://dqw.ek-pro.com/ を更新したときに、以下のエラーがでた。

Experimental keys on scalar is now forbidden
スカラーの実験的なキーは現在禁止されています

PCを新しくしたのだが、その際にPerlのバージョンも新しくした為だと思われれる。


もとのコードは以下の通りで、DBにSELECTをして結果をハッシュとして取得、ハッシュのリファレンスからキーを取得する、という流れだった。
#特殊効果の説明テーブルを全件検索し、結果をハッシュとして取得、結果のハッシュからキーをすべて取得し、配列に格納する
#SQL
my $select_tokushu_setsumei = 'select * from "tokushu_kouka_setsumei"';

#SELECT実行
my $sth = $dbh->prepare($select_tokushu_setsumei);
my $rv = $sth->execute();

#結果をハッシュとして取得し、キー値を配列に格納
my $hash_tokushu_kouka_name = $sth->fetchrow_hashref();
my @array_tokushu_kouka_name = keys $hash_tokushu_kouka_name;


で、この「keys」という部分で「Experimental keys on scalar is now forbidden(スカラーの実験的なキーは現在禁止されています)」に該当していた。


https://perlzemi.com/blog/20080210120265.html
ハッシュのリファレンスを引数として渡す場合は、デリファレンスする必要があります

# すべてのキーを取得。ハッシュのリファレンスの場合。
my @keys = keys %$hash;



を参考にし(ありがとうございます)、

my @array_tokushu_kouka_name = keys %$hash_tokushu_kouka_name;

のかたちでデリファレンスすることで解決!!
Bootstrap4からBootstrap5(5.1.2)へ移行してみました。
自分のウェブサイトではそんなに手間はなかったです。


scriptタグで読み込む bootstrap.bundle.min.js を変更。



styleタグで読み込む bootstrapのcss を最新へ変更。



cssの変更(追加)。
a 要素がブラウザのデフォルトスタイルが適用、つまりアンダーラインが表示されるようになった点の修正と、
パンくずリストのスタイルが無くなった(?)点について、bootstrap4の方のcssをコピペして修正。
a {
text-decoration: none;
}
main a:hover {
text-decoration: underline;
}

.breadcrumb {
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
padding: .75rem 1rem;
margin-bottom: 1rem;
list-style: none;
background-color: #e9ecef;
border-radius: .25rem;
}




table要素に付与している.tableクラスに .table-borderless を追加(table table-borderless)。



メニューバーまわりのクラスをbootstrap5用に変換。


<button id="dqfaqCollapse" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-header" aria-controls="navbar-header" aria-expanded="false" aria-label="ナビゲーションの切替">



<button id="dqfaqCollapse" type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-header" aria-controls="navbar-header" aria-expanded="false" aria-label="ナビゲーションの切替">




<div id="navbar-header" class="collapse navbar-collapse">
<ul class="navbar-nav mr-auto w-100 nav-justified text-left">



<div id="navbar-header" class="collapse navbar-collapse justify-content-end">
<ul class="navbar-nav nav-justified text-left">



<a href="#" class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">管理メニュー</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">



<button class="btn nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">管理メニュー</button>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">


bootstrap公式(英語:https://getbootstrap.com/)と、こちらのbootstrap設置ガイドさんの、boostrap4記事がとても役にたった。
日本語(母国語)で分かりやすい資料があるのは本当にありがたいです。これを個人でやっているなら相当変態…(褒めてる)。
https://bootstrap-guide.com/components/navbar

chart.jsのレーダーチャートでは、各項の最大値を個別に設定はできない。

例えば、小学校のテストなどであれば最大値が100点で、数学80点、国語75点等と最大値が揃っているのでグラフがいい感じになるが、例えばセンター試験では英語200点、社会100点等であり、最大値を200としてしまうと、仮に社会が100点満点でもグラフ上はそこだけ凹んで見えてしまう。

解決方法としては、以下のstackoverflowに載っていた。

Set max value for each label with Chart.js
https://stackoverflow.com/questions/35975103/set-max-value-for-each-label-with-chart-js

fiddleは以下。
http://jsfiddle.net/cq1q5wuf/

コードはこんな感じ。
それぞれのツールチップを表示する前に、値をスケーリングしてから、スケーリング係数で除算している。
var scaling = [10, 10, 10, 1, 1, 1, 1];
var data = {
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
datasets: [
{
label: "My First dataset",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [5, 5, 9, 81, 56, 55, 40].map(function (e, i) {
return e * scaling[i];
})
}
]
};

var ctx = document.getElementById("myChart").getContext("2d");
var myRadarChart = new Chart(ctx).Radar(data, {
tooltipTemplate: function (valueObject) {
return valueObject.value / scaling[data.labels.indexOf(valueObject.label)];
}
});


過去記事の見直しに伴い、投稿日付がぶれています。
適宜修正しますので、日付はとりあえず無視でお願いします。

ピリオドの彼方に(http://period.ek-pro.com/)
雑文中心のブログ。

イイラボ(http://labo.ek-pro.com/)
ウェブサイトを構築するにあたっての知識を集めたウェブサイト。

ピカリンク(http://pikalink.net/)
リンク用HTMLを自動的に生成するWEBサービス。