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から更にすっきりしたという印象です。大阪のオバちゃん風にいうならシュッとしてる。多分、そんな感じだと思います。

花粉との戦い2023

こんにちわ。
リエです。

今年もやって参りました。
花粉との戦い。
花粉皮膚炎に毎年悩まされているのですが、今年も戦いの火蓋が切って落とされました。
過去記事↓
花粉との戦い2020
https://blog.splout.co.jp/10027/

余談ですが、最近時間間隔がなく、この前社内メンバーとの打ち合わせでもう2月も中旬か全然記憶ないという会話をしていました。(正月ボケを引きずっているのかもしれません)

対策は花粉との戦い2020に記載の内容とはあまり変わっていないのですが、今年は症状が出るのが早くて初動が遅れてしまいました。
もはや戦。最小限の被害で抑えるべく日々試行錯誤しています。
昔に比べると花粉対策グッズってすごく増えましたよね。
花粉が付きにくい機能性アウターも売ってるので、今年は1着ほしいなと思っております。

去年アレルギーに効くと知って試しに飲んでいた甜茶も再開しようかな。
参考サイト
https://himitsu.wakasa.jp/contents/tian-cha/

毎年この時期はテンションが↓↓↓↓となり、顔見たくない外出たくないモードになるのですが、なぜか最近は湿疹がメイクで隠せる事に感動し朝のメイクが楽しくなりました💄
素晴らしいですね。前向きなきもち大事。

社内には花粉症のメンバーが数人いるのですが、心の友だと思っています。
花粉と戦いながらもみんなで春にお花見をしていたのがよい思い出🌸

【Visual Studio Code】VSCodeで日頃利用しているプラグインの紹介

今回は、日頃の開発やコーディングなどで利用しているVSCodeに入れているプラグインを紹介したいと思います。
プラグインを入れると作業効率が格段に上がるので、少しでも参考になれば幸いです。

Auto Close Tag

HTMLを書く際などに、閉じタグを自動で追加してくれるプラグインです。
タグの閉じ忘れで表示崩れが起きるのを未然に防いでくれます。

HTML End Tag Labels

HTMLの閉じタグの最後に「id」と「class」を表示してくれるプラグインです。
どこまでdivが囲まれているかなどを瞬時に見つけることができます。

Live Sass Compiler

Sassを利用した際に、Sassファイルを監視して自動でコンパイルまでしてくれるプラグインです。ターミナルなどで行っていたSass監視〜コンパイルまでの操作を簡単に行えるようになります。
使い方も簡単で、SCSSを開いて画面下部の「Watch Sass」をクリックするだけで監視がはじまり、保存するとコンパイルされます。

vscode-icons

VSCodeのデフォルトのファイルアイコンは正直わかりにくいです。
このプラグインを入れると、ファイルアイコンが視覚的にわかりやすいアイコンで表示されます。
アイコンテーマは、左下の歯車アイコンの[ファイルアイコンのテーマ]から、好きなテーマを選択して変更することができます。

zenkaku

コード内の全角スペースをハイライト表示して見つけやすくしてくれるプラグインです。
地味ですがたまに助けられます。お守り的な感じで入れています。

Japanese Language Pack for Visual Studio Code

もしかしたらインストール時に入っているかもしれませんが、日本語化プラグインです。
英語のUIが苦手という方は必須です。



今後も便利で日々の作業を効率的に行えそうなプラグインがあれば、どんどん入れて使ってみたいと思います。
その際はまたご紹介したいと思います。

[Solr] Tagger Handler で日本語テキストにタグ付け

前回紹介した Tagger Handler を使って日本語のテキストタグ付けを試してみました。

まずコレクション(osaka_shisetsu_tagger)を作成します。

bin/solr create -c osaka_shisetsu_tagger

スキーマを API で設定します。
indexAnalyzer と queryAnalyzer の設定を日本語の形態素解析を使うものに変更しています。
Solr リファレンスに書かれている通り、 indexAnalyzer のフィルタチェーンの最後に ConcatenateGraphFilterFactory を指定するのがミソです。

curl -X POST -H 'Content-type:application/json'  http://localhost:8983/solr/osaka_shisetsu_tagger/schema -d '{
  "add-field-type":{
    "name":"tag",
    "class":"solr.TextField",
    "postingsFormat":"FST50",
    "omitNorms":true,
    "omitTermFreqAndPositions":true,
    "indexAnalyzer":{
      "tokenizer":{
         "class":"solr.JapaneseTokenizerFactory", "mode":"search" },
      "filters":[
        {"class":"solr.JapaneseBaseFormFilterFactory"},
        {"class":"solr.JapanesePartOfSpeechStopFilterFactory", "tags":"lang/stoptags_ja.txt"},
        {"class":"solr.CJKWidthFilterFactory"},
        {"class":"solr.StopFilterFactory", "ignoreCase":"true", "words":"lang/stopwords_ja.txt"},
        {"class":"solr.JapaneseKatakanaStemFilterFactory", "minimumLength":"4"},
        {"class":"solr.LowerCaseFilterFactory"},
        {"class":"solr.ConcatenateGraphFilterFactory", "preservePositionIncrements":false }
      ]},
    "queryAnalyzer":{
      "tokenizer":{
         "class":"solr.JapaneseTokenizerFactory", "mode":"search" },
      "filters":[
        {"class":"solr.JapaneseBaseFormFilterFactory"},
        {"class":"solr.JapanesePartOfSpeechStopFilterFactory", "tags":"lang/stoptags_ja.txt"},
        {"class":"solr.CJKWidthFilterFactory"},
        {"class":"solr.StopFilterFactory", "ignoreCase":"true", "words":"lang/stopwords_ja.txt"},
        {"class":"solr.JapaneseKatakanaStemFilterFactory", "minimumLength":"4"},
        {"class":"solr.LowerCaseFilterFactory"}
      ]}
    },

  "add-field":{"name":"name", "type":"text_ja"},
  "add-field":{"name":"name_tag", "type":"tag", "stored":false },
  "add-copy-field":{"source":"name", "dest":["name_tag"]}
}'

TaggerRequestHandler の設定は英語のときと同じ。

curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/osaka_shisetsu_tagger/config -d '{
  "add-requesthandler" : {
    "name": "/tag",
    "class":"solr.TaggerRequestHandler",
    "defaults":{"field":"name_tag"}
  }
}'

タグ用のデータとして、いつもの大阪の施設情報を利用します。
以下のようなタグ区切りのデータです。

$ head -n 3 /tmp/osaka_shisetsu20140106_noheader.txt 
158	34.6164938333333	135.438210722222	http://lodosaka.hozo.jp/class/施設情報	官公庁	国の機関	住之江区	軽自動車検査協会大阪主管事務所	軽自動車検査協会大阪主管事務所	住之江区南港東3-4-62	
157	34.6190439722222	135.442191833333	http://lodosaka.hozo.jp/class/施設情報	官公庁	国の機関	住之江区	大阪陸運支局なにわ自動車検査登録事務所	大阪陸運支局なにわ自動車検査登録事務所	住之江区南港東3-1-14	
381	34.6109641111111	135.491388722222	http://lodosaka.hozo.jp/class/施設情報	官公庁	国の機関	住吉区	住吉税務署	住吉税務署	住吉区住吉2丁目17番37号	http://www.nta.go.jp/osaka/guide/zeimusho/osaka/sumiyoshi/index.htm

各レコードの1番目(ID)、2番目(緯度)、3番目(経度)、4番目(URL)、8番目(施設名)、10番目(住所)をインデックスします。
タグとして利用するのは施設名です。

bin/post -c osaka_shisetsu_tagger -type text/csv \
  -params 'optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,latitude,longitude,url,,,,name,,address,' \
  /tmp/osaka_shisetsu20140106_noheader.txt

タグ付けしてみます。

$ curl -X POST   'http://localhost:8983/solr/osaka_shisetsu_tagger/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,address&wt=json&indent=on'   -H 'Content-Type:text/plain' -d '昨日は阪急梅田駅で降りて梅田市税事務所で手続きをしました'
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "tagsCount":2,
  "tags":[{
      "startOffset":3,
      "endOffset":8,
      "ids":["5421"]},
    {
      "startOffset":12,
      "endOffset":19,
      "ids":["11486"]}],
  "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"11486",
        "name":"梅田市税事務所",
        "address":["北区梅田1-2-2-700 大阪駅前第2ビル7階"]},
      {
        "id":"5421",
        "name":"阪急梅田駅"}]
  }}

(「阪急梅田駅」の住所が無いのは元データがそうなっているからです)