SolrにBasic認証を設定する

Solrの管理画面やAPIへのアクセスに認証を掛けることができます。この記事ではBASIC認証を設定してみます。

SolrCloudの環境では Zookeeper の /security.json に設定ファイルを置きます。 Solrリファレンス にはユーザ:solr パスワード:SolrRocks で設定する例が載っています。

$ ./zkcli.sh -zkhost localhost:9983 -cmd put /security.json '{
"authentication":{
   "blockUnknown": true,
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
 }
}'

この後Solrの再起動でBASIC認証が有効になり、管理画面にブラウザでアクセスすると、ユーザ名とパスワードの入力を促されます。ここで solr と SolrRocks で確かにログインできます。

このままリファレンスに載っているユーザとパスワードを使い続ける訳にはいかないので、別のユーザを追加することを考えます。初めは security.json に追加の設定を記載するのかと思いましたが、パスワードをSolrが期待する形式でハッシュ化する方法が分かりませんでした。結局のところ、リファレンスに書いてある通り、APIで設定変更するしかなさそうです。

ここで、APIへのHTTPアクセスにも認証が必要となります。

新しいユーザの追加

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"solradmin":"solrpass"}}'

最初に設定した solr ユーザの削除

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["solr"]}'

追加と削除の後の security.json の内容を確認

$ server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd get /security.json
{"authentication":{
    "blockUnknown":true,
    "class":"solr.BasicAuthPlugin",
    "credentials":{"solradmin":"AkZTG0uVSAgfzB/OC+kI1tqw9aeR8pP05tpNdcnnfN8= wRKTRwEcTX5eiCgEmCfIRXdRf9zIq2/Aef/LP6ZzdIQ="},
    "":{"v":13}}}

確かに変わっています。パスワードもハッシュ化されています。

管理画面だけではなく、コマンドラインツールも認証が必要になります。

bin/post -c mycollection data.json
POSTing file data4.json (application/json) to [base]/json/docs
SimplePostTool: WARNING: Solr returned an error #401 (require authentication) for url: http://localhost:8983/solr/mycollection/update/json/docs
SimplePostTool: FATAL: Looks like Solr is secured and would not let us in. Try with another user in '-u' parameter

オプションで指定するだけなので簡単。

bin/post -u solradmin:solrpass -c mycollection data.json

昔は認証が必要な場合は Jetty 側でなんとかしていたようですが、今は Solr 側で設定できるようになっています。Solr 8.4 からは認証が設定されていない場合にはAPI経由での設定ファイルのアップロード(というかアップロードする設定の内容)に制限が付くこともあるので、この辺の設定もきちんと押さえておきたいところです。

Apacheの前にNginxを置いた際にApache側で行う設定例

サーバーは一度設定するとなかなか次に設定することがなく、設定方法を忘れてしまいます。
今回はApacheが走っているサーバーの前段としてNginxを用意した場合にするであろう設定例です。
※ファイルの場所はUbuntuの例です。他のディストリビューションの場合はパスが変わってくるので適宜読み替えてください。

Apacheの設定

ポートを80から8080へ変更します。※例ではついでにIPv4のみにしています。
/etc/apache2/ports.conf

Listen 80
Listen 127.0.0.1:8080

Apacheのアクセスログに残すIPがリモートのIPになるようremoteipモジュールを設定します。
※何も設定しないと全てNginxの走っているサーバーのIPになってしまいます。

このモジュールの設定ファイルを作成します。
/etc/apache2/mods-available/remoteip.conf

RemoteIPInternalProxy 127.0.0.1
RemoteIPHeader        X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By

モジュールと設定を有効化します。

$ sudo a2enmod remoteip

一般的にログフォーマットの設定では%hのほうがデフォルトで使われているのでこれを%aへ変更します。log_config

LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

ここまでの設定を有効化します。

$ sudo apache2ctl restart

これでApache側でリモートのIPが取得できるようになります。

お疲れさまでした。

スタイルガイドをFractalで作ってみよう!

「Fractal」とはスタイルガイドジェネレーターの一種です。複数人でwebサイトを作る際に一貫性を持ってデザインやコーディングができるようにまとめたものです。
スタイルガイドにはこの他に「sc5-styleguide」「Storybook」などがあります。

今回はFractalを使ってスタイルガイドを作成してみます。
すぐにデモを作成することができるので、比較的、簡単に導入ができるかと思います。


まずは任意の箇所にディレクトリを作成します。

mkdir fractal_test

作成したディレクトリに移動します。

cd fractal_test

プロジェクトを開始するためpackage.jsonを作成します。
「package name」などと聞かれますが、自由に入力して大丈夫です。

npm init

プロジェクトにFractalをインストールします。

npm install --save @frctl/fractal

グローバルにFractalCLIツールをインストールします。

npm i -g @frctl/fractal

Fractalのセットアップをします。
質問に答えていくと「fractal_test_01(または回答したプロジェクトタイトル名)」が表示されると思います。

fractal new fractal_test_01

「fractal_test_01」に移動し、Fractalを起動します。

cd fractal_test01/
fractal start --sync

「Fractal web UI server is running!」と表示されるので、Local URLをブラウザで表示します。

Local URL: http://localhost:3000

以下の画像のようにスタイルガイドが表示されたと思います。

これでスタイルガイドの準備ができました。
それでは、ボタンのコンポーネントを登録していきます。

「components」ディレクトリ内に「btn」ディレクトリを作成し、その中に「btn_default.hbs」を作成します。

「btn_default.hbs」の中に次のコードを記載します。

<a href="#" class="btn btn_default">Default</a>

左メニューが追加されたと思います。
btn
└Btn Default

同様に「btn_primary.hbs」「btn_success.hbs」を作成します。

btn_primary.hbs

<a href="#" class="btn btn_primary">Primary</a>

btn_success.hbs

<a href="#" class="btn btn_success">Primary</a>

同様に左メニューが追加されたと思います。
このままでは、cssが適用されてませんので、componentsディレクトリに「_preview.hbs」を作成し次のコードをコピーします。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link media="all" rel="stylesheet" href="{{ path '/css/style.css' }}">
<title>Preview Layout</title>
</head>
<body>
{{{ yield }}}
</body>
</html>

その後、「public」ディレクトリの中に「/css/style.css」を作成し、cssを記載します。

すると、スタイルが適用されたと思います。

これがFractalの基本的な使い方となります。
さらに便利な使い方がわかりましたら改めて記事にしようと思います。

公式ガイド
https://fractal.build/guide/

苺が好きすぎる今日この頃

こんにちわ。
リエです。

今日から4月ですね🌸
世の中はコロナウイルスが猛威を振るっていますが、皆様体調を崩されてはいませんでしょうか。

コロナウイルスの事もありいつも以上に体調管理に努めた結果、なんと今年は1度も風邪を引いておりません。もちろんインフルエンザにもなっていません。
予防の一環ではないですが、苺をたくさん食べているのも健康に過ごせている理由の一つなんじゃないかなと思っています。

苺は元々大好きですが、去年苺の食べ比べをしてからますます好きになり、今年に入ってからほぼ毎日苺を食べていました。洗ってすぐに食べれる手軽さもいい✨

最近は普通のスーパーでも珍しい品種の苺が売っていたりと色んな苺を手軽に食べれるようになって嬉しい限りです💕

その中で私が好きな苺ベスト5をご紹介したいと思います🍓

あまおう(福岡県)

言わずと知れた苺の王様あまおう。
「あ」かい、「ま」るい、「お」おきい、「う」まい の頭文字をとって名前をつけられたそうです。名前の通り身は大きくてジューシー。甘くて味も濃い苺です。
スーパーで手軽に買えるのも嬉しいポイント☺

いちごさん(佐賀県)

いちごさんは2018年に品種登録されたばかりのかなり新しい品種です。
かわいい名前だなとスーパーで見つけて食べたのがきっかけだったのですが、今では大好きでよく買う苺の一つです。大ぶりでみずみずしくてそれでいてやさしい甘さが特徴です。あまおう同様スーパーで手軽に買えるのもありがたいです。

淡雪(鹿児島県)

淡雪は白い苺です。白い苺の先駆けとしては「初恋の香り」という品種が有名ですが、淡雪は初恋の香りに比べるとまだ手の届きやすい価格かなという感じです。(それでも高級苺ですが)身は真っ白ではなくほんのり桜色の部分がありその見た目がかわいいのです💕味は酸味が少なく甘いです。

紅ほっぺ(静岡県)

紅ほっぺはあまおう同様、馴染みのある苺ではないでしょうか。
果実は中まで赤く酸味と甘味のバランスがいい苺だと思います。
この苺もスーパーで手軽に買えるのがいいですよね♪

古都華(奈良県)

奈良県の新しいオリジナル品種です。
割と新しい品種なので他の苺に比べると知名度はまだ低いかもしません。(私も苺の食べ比べをした時に古都華のことを知りました)
果実は硬めでしっかりとしていて上品な甘さです。
古都華はお高いので💰たまにしか食べられないご褒美苺です。


まだまだ苺はシーズンなので、引き続きたくさん食べたいと思います🍓

Laravelのエラーログに情報を追加する方法

ログの拡張

開発中であればエラーはそのまま表示されるので解決は比較的容易ですが、運用中に発生した場合はエラーログから調査するので少し時間がかかります。

エラーログにはデフォルトで発生時ログインしているuserIdが一緒に出力されエラーが発生したファイル名や行番号も出力されるので基本的にはそちらからエラーの調査は行えますが、特定のレコード時だけ発生したなどになるとそれだけでは時間がかかる時があります。

なので出力されるログの内容を拡張できないかフレームワークのソースを調べたところ

Illuminate/Foundation/Exceptions/Handler.php
にcontextと目的の関数があり

contextの関数をオーバーライドすればいい様子

以下実装例

app/Exceptions/Handler.php
/**
 * ログに記載する追加情報
 */
protected function context()
{
$context = parent::context(); try { return array_merge($context, [ // 一緒に記録したい情報 'uri' => env('REQUEST_URI'), ]); } catch (Throwable $e) { return $context; } }

以上!