カテゴリー: テクノロジー

[Javascript] 元のエラーを渡せる Error Cause

ES2022 で Error に cause がオプションとして追加され、再スローするときに元のエラーを渡すことができます。

以下、MDNのドキュメントより。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause

サンプル

fetch でエラーになるサンプルを作りました。


function UserException(message, options) {
	this.message = message;
	this.name = 'UserException';
	this.cause = options.cause;
}

async function test() {
	try {
		const response1 = await fetch('http://example.co.jp/')
			.catch(err => {
				throw new UserException('fetch1回目でエラー', { cause: err });
			});
		const text1 = response1.text();

		const response2 = await fetch('http://example.co.jp/', { method: 'POST', body: text1 })
			.catch(err => {
				throw new UserException('fetch2回目でエラー', { cause: err });
			});
		return response2.json().catch(err => {
			throw new UserException('json()でエラー', { cause: err });
		});
	} catch (err) {
		throw new Error('エラーです', { cause: err } );
	}
}

test().catch(err => {
	console.log(err);
	console.log(err.cause);
})

console.log に出力された内容

fetch2回目でエラーになった場合の Devtools の表示

// Error: エラーです at test (sample:24:9)
// UserException {message: 'fetch2回目でエラー', name: 'UserException', cause: TypeError: Failed to fetch at test (sample:16:27)}

response2.json() で失敗した場合

// UserException {message: 'json()でエラー', name: 'UserException', cause: SyntaxError: Unexpected token 'T', "Text" is not valid JSON}
// SyntaxError: Unexpected token 'T', "Text" is not valid JSON

cause に渡すことで再スローされた先で簡単に元のエラーを受け取ることができました。

エラーの再スロー自体は一般的ですが、ES2022 以前には元のエラーを得る手段が標準で用意されていなかったのが不思議なくらいです。

エラー処理には悩まされることがよくあり、その場で処理することが難しい場合やまとめて処理しても問題ない場合などに使えそうです。

●●●

余談ですが、ブラウザによっては、cause とは別に stack が実装されているようですが、こちらは標準化はされなかったようです。stack という文字から Stack trace 的なものが格納されるのでしょうが、サーバーでの処理と違ってクライアント側なのでデバッグ後の消し忘れによる事故が多そうではあります。


[Solr]Admin UIでフィールドタイプの編集をできるようになった

Solr 9.1.0 から Admin UI でフィールドタイプの定義を編集ができるようになりました。
それ以前はフィールド定義の追加はできるもののフィールドタイプには手を付けることができない状態でした。

上のスナップショットは8.11.0のAdmin UIです。

9.1.0のAdmin UI。
“Manipulate Field Type” というボタンが増えています。このボタンを押すとフィールドタイプを追加するためのコマンドのテンプレートがテキストエリアとして表示されます。

プルダウンを”Delete FieldType Template”に変更したところ。
指定のフィールドタイプを削除するためのコマンドを編集できます。

プルダウンを”Replace FieldType Template”に変更したところ。
指定のフィールドタイプの定義を書き換えることができます。

従来から存在していたフィールドに対する操作が追加のみであったことを考えると、フィールドタイプに対する操作が一気に充実したことになります。

Solr 9.1.0 ではこれ以外にもAdmin UIへの機能追加がいくつかあったので、順次ご紹介していければと思います。


NFC タグの有る生活

状況に合わせてスマートフォンで一連の操作をまとめて実行したいことがあります。

たとえば就寝前にマナーモードに切り替え、目覚ましをセットしてアラームの音量を設定する、といったことです。逆に起きた後はマナーモードを解除して音量を元に戻す必要があります。
こういった、定期的に必要になる一連の操作を手作業でやるのは、特に毎日となると意外に煩わしいものです。
これを NFC タグを使って自動化することができます。

NFC タグは Amazon で10枚500円くらいのものを買って使っています。
アプリは Android の Trigger を長く使っているのですが、どうも今は公開されていないようです。同じようなことができる Tasker というアプリもあります。

NFC タグは裏がシールになっていて必要な場所に貼り付けて使えますが、なかなか強力なシールなのであえて普通の両面テープを使っています。これを家の中のあちこちに置いています。

いくつか使い途を挙げてみます。

寝室
就寝時: 目覚ましセット、マナーモード切り替え、音量調整
起床時: マナーモード解除、音量調整
Trigger は1個の NFC タグでトグル動作させられるので、就寝<>起床の切り替えを1個でまかなえます。
スマホスタンドに貼ってあるので、立て掛けるだけで就寝モードになります。

玄関
外出時: マナーモード切り替え、Wi-Fiオフ
帰宅時: マナーモード解除、Wi-Fiオン
玄関の電源スイッチの横に NFC タグを貼り付けて、タッチしています。

自宅デスク
音楽自動再生。こちらもタグを貼ったスタンドに立て掛けると音楽をランダム再生するようにしています。

NFC タグをトリガにした自動操作は自分にとって地味ながら重要な機能なので、スマホ選びの際は NFC 搭載は必須の要件になっています。


Solr で SSL を有効にする

Solr の管理画面や API へのリクエストで HTTPS を使えるようにします。

自己署名証明書作成

プライベートなネットワーク内での利用を想定して自己署名証明書を作成します。

$ cd server/etc
$ keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.p12 -storetype PKCS12 -ext SAN=DNS:localhost,IP:192.168.1.3,IP:127.0.0.1 -dname "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"
$ openssl pkcs12 -in solr-ssl.keystore.p12 -out solr-ssl.pem

keytool は JDK に含まれるツールです。
IPの部分はSolrサーバのIPアドレスを指定します。

作成した証明書を参照するように solr.in.sh を設定します。

SOLR_SSL_ENABLED=true
SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_KEY_STORE_PASSWORD=secret
SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_TRUST_STORE_PASSWORD=secret
SOLR_SSL_NEED_CLIENT_AUTH=false
SOLR_SSL_WANT_CLIENT_AUTH=false
SOLR_SSL_CHECK_PEER_NAME=true

HTTPS を使うように ZooKeeper を設定

SolrCloud での運用の場合は ZooKeeper で保持する設定を変更して Solr が HTTPS 通信を使うようにします。

$ server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd clusterprop -name urlScheme -val https

ZooKeeper 設定前に作成したコレクションの場合は以下を実行します。

$ curl 'http://localhost:8983/solr/admin/collections?action=CLUSTERPROP&name=urlScheme&val=https'

Solr起動

$ bin/solr -cloud -s example/cloud/node1 -z localhost:2181 -p 8984

動作確認

コレクションを作成して Collections API で状態を確認します。
bin/solr 等のツールは solr.in.sh の環境変数を使って HTTPS 通信してくれます。
curl での API コールの場合は pem ファイルを指定します。

$ bin/solr create -c mycollection -shards 2
$ curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://localhost:8984/solr/admin/collections?action=CLUSTERSTATUS&indent=on"
{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "cluster":{
    "collections":{
      "mycollection":{
        "pullReplicas":"0",
        "configName":"mycollection",
        "replicationFactor":"1",
        "shards":{
          "shard1":{
            "range":"80000000-ffffffff",
            "state":"active",
            "replicas":{"core_node4":{
                "core":"mycollection_shard1_replica_n2",
                "leader":"true",
                "core_node_name":"core_node4",
                "node_name":"localhost:8984_solr",
                "base_url":"https://localhost:8984/solr",
                "state":"active",
                "collection":"mycollection",
                "shard":"shard1",
                "type":"NRT",
                "force_set_state":"false"}},
            "health":"GREEN"},
          "shard2":{
            "range":"0-7fffffff",
            "state":"active",
            "replicas":{"core_node3":{
                "core":"mycollection_shard2_replica_n1",
                "leader":"true",
                "core_node_name":"core_node3",
                "node_name":"localhost:8984_solr",
                "base_url":"https://localhost:8984/solr",
                "state":"active",
                "collection":"mycollection",
                "shard":"shard2",
                "type":"NRT",
                "force_set_state":"false"}},
            "health":"GREEN"}},
        "router":{"name":"compositeId"},
        "nrtReplicas":"1",
        "tlogReplicas":"0",
        "health":"GREEN",
        "znodeVersion":4}},
    "properties":{"urlScheme":"https"},
    "live_nodes":["localhost:8984_solr"]}}

CLUSTERSTATUS の応答に含まれる内部的な URL も https になっていることが分かります。


Windows10→11にアップグレードした感想

11を使いだして一ヵ月近くになろうかというところで、現時点で特に大きな不具合もなく使えています。かなり個人的な観点ばかりですが、今の感想を書いてみようと思います。

デスクトップ画面

デスクトップの様子
Windows11のデスクトップ

タスクバーに並ぶアプリのアイコンがセンタリングされています。最初は割と戸惑いましたが、すぐ慣れました。今では、10以前の左寄せに並んでる様子に違和感を覚えます。

メモ帳

メモ帳
Win11のメモ帳
メモ帳が普通っぽい見た目になりました。フッター部に、改行コードと文字コードが表示され、メモ帳を起動したときのデフォルトがUTF-8になっていました。
気になったのが、タブ文字の幅が以前までの半角8文字分ではなさそうです。メモ帳でコードを書いた経験がある人は感慨深い気持ちになる方もいるのではないでしょうか。

システムロケールのUTF-8対応

地域の設定画面

システムロケールをUTF-8に変更可能です。変更した場合、SJIS環境で作成したZIPファイルで文字化けが起きる等の問題(といえるのか分かりませんが、踏むと悲しいトラップ)があるようです。

今の時代、UTF-8にするべきだとは思うのですが、燦然と輝く「ベータ」の文字に不安を感じて変更していません。「ベータ」が取れたら安心安全か、というと、それぞれ各人やってみないと分からないのですが…。やるならバックアップをしっかり取った上で、いつでも退転する決意を持って臨みたいものです。

タスクビュー

改善されたタスクビュー

Win + Tab キーで表示できるタスクビューが使いやすくなりました。矢印キーでデスクトップとウィンドウを切り替えられます。

10のタスクビューは、ショートカットで起動したあとの操作性があまり良くなく、何を押せばいいのか分からなくなったり、目的のウィンドウに到達できずにタスクビューが終了してしまうことがしばしばありました。

かなりの改善です。いいね!💯

ほかにも…

  • エクスプローラーのメニューがややすっきり
  • 右クリックのコンテキストメニューもすっきり。あの機能どこいった?
  • Hyper-VとVagrant、VirtualBoxは何事もなかったように仲良し

Windowsの古い部分が削ぎ落とされてきて、10から更にすっきりしたという印象です。大阪のオバちゃん風にいうならシュッとしてる。多分、そんな感じだと思います。