LUUPしてみた

日々、世の中の状況が変わってきてますが相変わらずのマイペースでいきましょう。
マエダです。

RIDE YOUR CITY – 街じゅうに好きがみつかる-
『LUUP』https://luup.sc/

みなさまご存知でしょうか。
ちょっとの移動がとってもラクになるシェア電動キックボードサービス。
※ TBS系列「がっちりマンデー」で見たやつやん。

大阪市内では東西の移動が徒歩・バス・タクシー以外でちょっとしにくくてレンタサイクルサービスを利用していたんですがついに大阪市内にもLUUPが来てました。

今年の4月にはリリース出てたのに視野の狭い僕はこんな近くに展開されていたなんて全く気づいてませんでした。
https://luup.sc/news/2021-04-02-osaka/


■ 使い方

かんたんなので割愛させていただきます。

注意点としては「LUUP全然使ったことあるぜ!」みたいな顔して意気揚々とQRコードスキャンしたら運転免許証画像アップロードと交通に関するテストを受けてねとあったので、登校前にイチャイチャしながらトークしている高校生カップルを横目に必死におじさんが設定登録をする時間もUXのひとつでしたね。

■ 感想

「チャリでええやん。」いや愛知県出身としては「ケッタでええが。」
と思うところもありますが、自転車と違う都会的な移動手段を選択している自分に酔えます。
おじさんなので年齢的に気恥ずかしさを覚えつつ、たたの移動を『たのしい』ものに変えてくれる。
そんな体験ができました。

一通の道路やちょっと怖くなったら押して徒歩もできるので今度はもっと精神的に余裕をもって街じゅうに好きを見つけてみます。

交通ルールを守って安全にたのしみましょう。

[Solr]更新の際に _route_ パラメータは指定しない方が良い

今回は小ネタです。

SolrCloud でとある検証をしているときに不思議な現象に気付きました。

ドキュメント1を追加
→ 全件検索でドキュメント1がヒットする
→ ドキュメント2を追加
→ 全件検索でドキュメント2だけがヒットする
→ ドキュメント3を追加
→ 全件検索でドキュメント3だけがヒットする
→ …

要するに、新しいドキュメントを追加するとそれ以前のドキュメントが消えるという現象です。

いろいろ試すうちに、あるスクリプトを使って更新した場合にこの現象が発生し、別のスクリプトでは発生しないことが分かりました。2つのスクリプトを比較することで、問題が起こる方では update の際に _route_ パラメータを指定していることが分かりました。

コレクションを CREATE するときに _route_ パラメータを指定していれば update のときに _route_ を指定する必要はありませんが、どのフィールド値でルーティングしているのかが分かりやすいように明示的に _route_ を書いたのが仇となったようです。

ログを見ても _route_ パラメータ有りの場合と無しの場合とで目立った違いは無く、どうしてこうなるのかを調べるにはソースを深く追っかけてみるしかなさそうです。

【Solr】検索結果のグループ化(Collapse and Expand)

以前、グループ検索の手段として Result Grouping を紹介しました。
もう一つの手段として Collapse and Expand があります。 Collapse を辞書で引くと「つぶれる」とか「崩れる」とか出てきて少しイメージのしにくい言葉ですが、たとえばファイルビューアで言うと

↓これが Collapse している状態

↓これが Expand している状態

と捉えると分かりやすいかと思います。

Solr における検索結果の Collapse とは特定のフィールドの値に基づいて検索結果をグループ分けし、各グループの代表ドキュメントを出力することであり、Expand とは Collapse で作られた各グループに属するドキュメントを選択して出力することです。

Collapsing は CollapsingQParser で実装されており、フィルタクエリで指定します。以下は大阪の施設情報を施設タイプ(typeフィールド)でグルーピングするクエリ例です。

$ curl http://localhost:8983/solr/osaka_shisetsu/select -d 'q=*:*&rows=3&omitHeader=true&fq={!collapse field=type}'
{
  "response":{"numFound":13,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"10",
        "type":"官公庁",
        "area":"住之江区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":["住之江区南港東3-4-62"],
        "address_p":"34.6164938333333,135.438210722222",
        "_version_":1695487381634809856},
      {
        "id":"311",
        "type":"学校・保育所",
        "area":"住之江区",
        "name":"大和幼稚園",
        "address":["大阪市住之江区北島3-3-11"],
        "address_p":"34.6013536388888,135.478355305555",
        "_version_":1695487381872836611},
      {
        "id":"1356",
        "type":"公園・スポーツ",
        "area":"住之江区",
        "name":"住之江公園プール",
        "address":["住之江区南加賀屋1住之江公園内"],
        "address_p":"34.6118221111111,135.473814305555",
        "_version_":1695487382023831552}]
  }}

各グループ5件ずつのドキュメントが欲しい、といった場合には expand=true を指定します。以下は、typeフィールドでグループ化して、各グループ2件ずつのドキュメントを取得するクエリ例です。

$ curl --user solr:SolrRocks http://localhost:8983/solr/osaka_shisetsu/select -d 'q=*:*&rows=3&omitHeader=true&fq={!collapse field=type}&expand=true&expand.rows=2'
{
  "response":{"numFound":13,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"10",
        "type":"官公庁",
        "area":"住之江区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":["住之江区南港東3-4-62"],
        "address_p":"34.6164938333333,135.438210722222",
        "_version_":1695487381634809856},
      {
        "id":"311",
        "type":"学校・保育所",
        "area":"住之江区",
        "name":"大和幼稚園",
        "address":["大阪市住之江区北島3-3-11"],
        "address_p":"34.6013536388888,135.478355305555",
        "_version_":1695487381872836611},
      {
        "id":"1356",
        "type":"公園・スポーツ",
        "area":"住之江区",
        "name":"住之江公園プール",
        "address":["住之江区南加賀屋1住之江公園内"],
        "address_p":"34.6118221111111,135.473814305555",
        "_version_":1695487382023831552}]
  },
  "expanded":{
    "公園・スポーツ":{"numFound":1089,"start":0,"numFoundExact":true,"docs":[
        {
          "id":"1357",
          "type":"公園・スポーツ",
          "area":"住之江区",
          "name":"住之江公園野球場",
          "address":["住之江区南加賀屋1住之江公園内"],
          "address_p":"34.6116668611111,135.475586222222",
          "_version_":1695487382023831553},
        {
          "id":"1358",
          "type":"公園・スポーツ",
          "area":"住之江区",
          "name":"住之江公園多目的広場",
          "address":["住之江区南加賀屋1住之江公園内"],
          "address_p":"34.6105608055555,135.475235888888",
          "_version_":1695487382023831554}]
    },
    "学校・保育所":{"numFound":1044,"start":0,"numFoundExact":true,"docs":[
        {
          "id":"312",
          "type":"学校・保育所",
          "area":"住吉区",
          "name":"大阪市立墨江幼稚園",
          "address":["住吉区墨江2丁目3番17号"],
          "address_p":"34.6077390555555,135.496024694444",
          "_version_":1695487381872836612},
        {
          "id":"313",
          "type":"学校・保育所",
          "area":"住之江区",
          "name":"加賀幼稚園",
          "address":["大阪市住之江区中加賀屋4-4-22"],
          "address_p":"34.6140463611111,135.478756833333",
          "_version_":1695487381872836613}]
    },
    "官公庁":{"numFound":300,"start":0,"numFoundExact":true,"docs":[
        {
          "id":"11",
          "type":"官公庁",
          "area":"住之江区",
          "name":"大阪陸運支局なにわ自動車検査登録事務所",
          "address":["住之江区南港東3-1-14"],
          "address_p":"34.6190439722222,135.442191833333",
          "_version_":1695487381820407808},
        {
          "id":"12",
          "type":"官公庁",
          "area":"住吉区",
          "name":"住吉税務署",
          "address":["住吉区住吉2丁目17番37号"],
          "address_p":"34.6109641111111,135.491388722222",
          "_version_":1695487381821456384}]
    }}}

この結果を使えば、まさに先程ファイルビューアの例で示したような検索結果の表示が実現できることが分かります。

SCSSの@importは廃止の問題!@useへの乗り換えについて

SCSSの@importルールが2022年10月頃に廃止予定のようです。

この@importは別sassファイルを読み込む便利なルールため、色んな所で使っていると思います。
廃止されるため@importの代わりに@useを使う必要があります。
@useはカプセル化されているため使う場合はどのファイルから読み込むか指定する(名前空間をつけて呼び出す)必要があります。
今までのようにファイルを読み込むだけでは変数やmixinなどは使えません。
書き変え方は下記のイメージです。
@import を使った場合
@import "base/variable";
@import "module/mixin";

.item {
  color: $baseFontColor;
  @include border;
}

@use を使った場合

@use "base/variable";
@use "module/mixin";

.item {
  color: variable.$baseFontColor;
  @include mixin.border;
}

おおまかな書き換えのイメージは下記になります。

1.@importを@useに書き換えます。

2.読み込んだファイルの使用したい変数やmixinは [ファイル名].[変数名] のように書きます。

@useを使うメリットの一つとして「2つのファイルを読み込んで、同じ変数名だった場合、それぞれ別の変数として使える」というのもあります。

現状@import を使っているところを書き換えるのはなかなか大変だとおもうのですが、@useを使うメリットも色々あるので少しずつ慣れていければと思っています。

jpsコマンドでSolrプロセスが表示されない

はじめに

あるとき、最近の Solr は jsp でプロセスが表示されないことに気づきました。Solr 5 の頃は表示されていた記憶があります。気になったので原因を調べてみました。

過去のSolrでは表示される

手元にある過去のバージョンの Solr を起動して試してみました。start.jar が Solr のプロセスです。

Solr 5.5.5

$ jps -l
12315 sun.tools.jps.Jps
12077 start.jar

Solr 7.5.0

$ jps -l
12550 start.jar
12668 sun.tools.jps.Jps

Solr 8.1.0

$ jps -l
13052 sun.tools.jps.Jps

Solr 8 あたりでこの変化が起こったようです。

jps で Java プロセスが表示される仕組み

jpsはJavaプロセスが起動するときに作成される /tmp/hsperfdata_USERNAME/PID というファイルの情報を利用して表示されます。たとえば java1 ユーザが起動した PID 13542 のプロセスがあれば /tmp/hsperfdata_java1/13542 というファイルになります。

hsperfdata ファイルは jps に限らず、jstat など Java のツール群で共通して使われるものです。上では /tmp と書きましたが、 システムプロパティ java.io.tmpdir で指定される作業ディレクトリ上に作られます。

jps が Java プロセスを見失うのはどういう場合か

java.io.tmpdir が変更された場合

この場合、java プロセスが作る hsperfdata ファイルの場所が jps の想定する場所と異なるために jps からは見つけられなくなります。

hsperfdata ファイルが作成されなくなる起動オプションが指定された場合

そもそも hsperfdata が作られなければ jps からは見つけられません。 hsperfdata ファイル生成を抑制するオプションとして、 -XX:-UsePerfData や -XX:+PerfDisableSharedMem があります。

Solr 起動時の java コマンドの起動オプション

-XX:+PerfDisableSharedMem が指定されていました。

$ ./solr start -V -p 8984
Using Solr root directory: /home/java1/fsw/solr-8.9.0
Using Java: /home/java1/.sdkman/candidates/java/current/bin/java
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment 18.9 (build 11.0.6+10)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.6+10, mixed mode)

Starting Solr using the following settings:
    JAVA            = /home/java1/.sdkman/candidates/java/current/bin/java
    SOLR_SERVER_DIR = /home/java1/fsw/solr-8.9.0/server
    SOLR_HOME       = /home/java1/fsw/solr-8.9.0/server/solr
    SOLR_HOST       = 
    SOLR_PORT       = 8984
    STOP_PORT       = 7984
    JAVA_MEM_OPTS   = -Xms512m -Xmx512m
    GC_TUNE         = -XX:+UseG1GC -XX:+PerfDisableSharedMem -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=250 -XX:+UseLargePages -XX:+AlwaysPreTouch -XX:+ExplicitGCInvokesConcurrent
    GC_LOG_OPTS     = -Xlog:gc*:file=/home/java1/fsw/solr-8.9.0/server/logs/solr_gc.log:time,uptime:filecount=9,filesize=20M
    SOLR_TIMEZONE   = UTC
    SOLR_OPTS       = -Xss256k


Waiting up to 180 seconds to see Solr running on port 8984 [|]  
Started Solr server on port 8984 (pid=15099). Happy searching!

試しに solr 起動スクリプトで -XX:+PerfDisableSharedMem を指定している箇所をコメントアウトしてみると、起動後に jps で Solr 8.9.0 のプロセスが表示されるようになりました。