[Solr]既存のコレクションに対してバックアップをリストアできるようになりました

はじめに

Solr 8.8 までは、SolrCloud で取得したバックアップをリストアするときには新しいコレクションを指定しなければならないという制限がありました。したがって、クライアントに公開するコレクション名をエイリアスで運用して、バックアップのリストア後にエイリアスを切り替えるという工夫が必要でした。

Solr 8.9 からは既存のコレクションに対してリストアできるようになりました。

バックアップ

curl 'http://localhost:8983/solr/admin/collections?action=BACKUP&name=backup1&collection=backup_test&location=/tmp/solr_backup'

backup_test というコレクションのバックアップを /tmp/solr_backup 以下に作成します。リストア時に参照するときの名前は backup1 です。

リストア(8.8 までの場合)

既存のコレクション名 backup_test を指定するとパラメータエラーとなります。

$ curl 'http://localhost:8983/solr/admin/collections?action=RESTORE&name=backup1&collection=backup_test&location=/tmp/solr_backup'
{
  "responseHeader":{
    "status":400,
    "QTime":0},
  "error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","org.apache.solr.common.SolrException"],
    "msg":"Collection 'backup_test' exists, no action taken.",
    "code":400}}

新しいコレクション名 new_backup_test を指定すると、そのコレクションが作られてからリストアされます。

$ curl 'http://localhost:8983/solr/admin/collections?action=RESTORE&name=backup1&collection=new_backup_test&location=/tmp/solr_backup'
{
  "responseHeader":{
    "status":0,
    "QTime":612},
  "success":{
    "127.0.1.1:8983_solr":{
      "responseHeader":{
        "status":0,
        "QTime":238},
      "core":"new_backup_test_shard1_replica_n1"}}}

リストア(8.9の場合)

既存のコレクション名 backup_test を指定してリストアできます。

試しに、バックアップ後にインデックスの内容を全部消去します。

$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0'
{
  "response":{"numFound":9238,"start":0,"numFoundExact":true,"docs":[]
  }}

$ curl -s 'http://localhost:8983/solr/backup_test/update?stream.body=*:*&wt=json&commit=true'
{
  "responseHeader":{
    "rf":1,
    "status":0,
    "QTime":2}}

$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0'
{
  "response":{"numFound":0,"start":0,"numFoundExact":true,"docs":[]
  }}

その後、既存のコレクション backup_test を対象にしてリストアします。8.8までとは違ってエラーになりません。

$ curl 'http://localhost:8983/solr/admin/collections?action=RESTORE&name=backup1&collection=backup_test&location=/tmp/solr_backup'
{
  "responseHeader":{
    "status":0,
    "QTime":977}}

全件検索したときの件数が元に戻りました。

$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0'
{
  "response":{"numFound":9238,"start":0,"numFoundExact":true,"docs":[]
  }}

既存のコレクションに対するリストアの仕組み

SOLR-1587 によると、使用中である可能性もある既存のコレクションに対するリストアを実現するために、Solr 8.1 で追加された Read-Only モードが使われているそうです。

  1. 指定されたコレクションを Read-Only モードにセットする
  2. コレクションの各シャードにバックアップをリストアする
  3. コレクションの Read-Only モードを解除する

決済・送金アプリ業界、血みどろの戦国時代へ

いやーエグイっすね。元々群雄割拠状態の決済・送金アプリ業界にGoogle参入(笑) まーたGAFAですか…壊れるなぁ。

事の発端は、今年2021年の7月13日に日本の会社が運営・開発する決済・送金アプリPring(プリン)をGoogleが買収を発表。

このアプリ元々メッタプス傘下で、3メガ銀行を含む50行から入出金でき、400社以上のサービスでの決済ができる超優秀アプリということもあり、そのポテンシャルが買われGoogle以外にもペイパルからも買収のお誘いがあったとか。社員12人の日本のサービスが時価総額200億円でキャッシュアウトするとかシリコンバレー感満載のシンデレラストーリーですね。(18年にみずほ銀行が買収に動いたらしいですが金額が折り合わずとのこと by日経新聞)

GoogleもGoogle Payがあるけどクレカベースなので、ATMからの現金チャージや入出金が簡単にできるPringを傘下に入れることにより決済回りの幅が広がる。Pring側としてもGoogle Mapを利用した地図ベースでの事前決済など戦略の多様化も期待できる。いやほんと末恐ろしい…

ここで有力な決済・送金アプリの戦国大名勢をみてみましょ

  • PayPay
  • LINE Pay
  • 楽天ペイ
  • メルペイ
  • d払い
  • au Pay

はい(笑) 時は正に戦国時代です。このラインナップだけでヤバいのですが、ここに桶狭間で今川義元を破った信長の如きPringが加わります。真っ赤っかwww
日経さん曰く、PayPayが中小加盟店への手数料有料化目前に買収発表で牽制を入れたとか。ほんとバチバチですね^^。また、みずほ銀行は18年の買収を見送って自前で「Jコインペイ」なるものを立ち上げたものの、メガバンク・有力地銀からも参加見送りでぴえん状態。メリケンの援助を受けた第六天魔王(Pring)と松永久秀(Jコインペイ)ぐらいの差を感じてしまいます。

お店独自の電子マネーを発行できる新機能を追加

8月24日のプレスリリースの発表でPringに新たな機能が追加される模様

送金アプリ「pring」は、プリンアプリ上で発行できる「店舗オリジナル電子マネー」を無料で発行可能とする。申込みから最短5営業日で発行できる。出典:Impress Watch – pring、お店独自の電子マネーを発行できる新機能

なお、店舗やサービスごとにオリジナルデザインにできるらしいです。伴天連から鉄砲ですかね?

日本のキャッシュレス決済はどこが抑えるのか

またまた日経さんからの引用ですが、20年度の日本国内個人消費に占めるキャッシュレス決済比率は約3割で、7~9割の韓国や中国に比べるまだまだ少ない模様。
「日本は1人当たり約10の銀行口座を持つほど金融インフラが整っているにもかかわらず、現金信仰が強い」と指摘してますが、金融インフラが整ってる贅沢な環境があるからみんな現金を使うんじゃないっすかね?日経さん。

閑話休題。とはいえ有力な大名勢のおかげでキャッシュレス環境も少しづつ整いだしてきてますので、日本もこれからキャッシュレス比率が高まることは明白。果たして日本のキャッシュレス天下はどこが制すのでしょうか。

できれば日本産のアプリとして世界に羽ばたいて欲しいな~という甘い理想は、圧倒的な資本力という現実に潰されてしまいましたが、GoogleとPringが今後どんな展開でぼくらの生活を便利にしてくれるのか楽しみですね。


ChromeでUA-CHへの移行が再開

最近、Chrome の DevTools上に、
navigator.userAgent に関する警告のようなものが表示されるようになりました。

Google Developers のブログによると Chrome のバージョンアップが行われ、
以前、COVID-19 の影響により停止していた UA-CH への移行を再開し、
userAgent の取得に関するサポートを終了するようです。

Google Developers Japan: Chrome の User-Agent 文字列削減に関する最新情報
https://developers-jp.googleblog.com/2021/06/chrome-user-agent.html

UA-CH がどういったものか分かっていなかったので実際に試してみました。

サーバーにヘッダーの設定を追加します。

add_header Accept-CH "Sec-CH-UA, Sec-CH-UA-Arch, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile";

Chrome からの一度目のアクセスでは、
SEC-CH-UA、SEC-CH-UA-MOBILE のみがブラウザから送信されました。

Chromeから送信されたヘッダー1

二度目移行のアクセスで、残りの Sec-CH-UA ヘッダも送信されるようになりました。

Chromeから送信されたヘッダー2

因みに Edge でも同様でした。

これらのヘッダが送信されるのは https 限定です。
http では送信されません。

ブログには Critical-CH のロールウトも始まったと記述がありましたが、
こちらはどういったものなのかよく分かりませんでした。

必須のクライアントヒントを送信するよう要求できるそうですが、
レスポンスヘッダーに追加しただけでは記述されているような動作にはなりませんでした。

まだ動作しないか、設定方法が全く違うのかもしれません。

しばらく情報を追っていきたいと思います。


Amazon Location Service のジオコーダを試してみた

はじめに

Amazon Location Service が6月に一般公開されました。
主な機能として以下の5つがあります。

  • 地図
  • ジオコーディング(住所や場所の名前を緯度経度に変換する)やリバースジオコーディング(緯度経度を住所に変換する)
  • 出発地から目的地までのルート計算
  • 位置情報デバイスのトラッキング
  • ジオフェンシング(設定した領域への出入りを検出する)

このうちのジオコーディングを試してみました。

ジオコーディングを AWS CLI から利用する

今回は AWS CLI からジオコーダを呼び出します。Location Service は新しいサービスなので、aws コマンドがインストール済みの場合は aws help で Location がサポートされているバージョンかどうかを確認し、サポートされていない場合は最新版にアップデートしておきます。

Place Index 作成

Place Index はジオコーダやリバースジオコーダを利用する際に必要となるリソースです。いくつかの設定項目を指定して Place Index を作成しておき、その Place Index を起点にジオコーダを呼び出す仕組みになっています。

以下のコマンドで、データソースとして Esri、料金プランとしてリクエスト数ベースを利用する Place Index を ExamplePlaceIndex という名前で呼び出せるようになります。

$ aws location \
>   create-place-index \
>   --data-source "Esri" \
>   --description "for investigation Esri" \
>   --index-name "ExamplePlaceIndex" \
>   --pricing-plan "RequestBasedUsage"

{
    "CreateTime": "2021-06-12T13:46:09.170000+00:00",
    "IndexArn": "arn:aws:geo:us-west-2:495463288701:place-index/ExamplePlaceIndex",
    "IndexName": "ExamplePlaceIndex"
}

Place Index 確認

以下のコマンドで、作成した Place Index の内容を確認できます。

$ aws location list-place-indexes
{
    "Entries": [
        {
            "CreateTime": "2021-06-12T13:46:09.170000+00:00",
            "DataSource": "Esri",
            "Description": "for investigation Esri",
            "IndexName": "ExamplePlaceIndex",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T13:46:09.170000+00:00"
        }
    ]
}

ジオコーディング

ジオコーダを利用するときは search-place-index-for-text というサブコマンドを使います。

$ aws location search-place-index-for-text \
--index-name ExamplePlaceIndex \
--text "大阪市中央区" \
--max-results 5
{
    "Results": [
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50988413000005,
                        34.681143990000066
                    ]
                },
                "Label": "大阪府大阪市中央区",
                "Municipality": "中央区",
                "Region": "大阪府"
            }
        }
    ],
    "Summary": {
        "DataSource": "Esri",
        "MaxResults": 10,
        "ResultBBox": [
            135.50988413000005,
            34.681143990000066,
            135.50988413000005,
            34.681143990000066
        ],
        "Text": "大阪市中央区"
    }
}

「大阪市中央区」の緯度経度が(34.681143990000066,135.50988413000005)であるという応答です。この座標を OpenStreetMap で表示すると、確かに大阪市中央区役所であることが確認できます。
https://www.openstreetmap.org/#map=19/34.681143990000066/135.50988413000005/

データソースとして HERE を使う Place Index 作成

Amazon Location Service ではデータソースとして EsriHERE が利用できます。ここではデータソースとして HERE を指定して、Esri のときとどのような違いがあるかを調べてみます。

$ aws location \
  create-place-index \
  --data-source "Here" \
  --description "for investigation HERE" \
  --index-name "ExamplePlaceIndexHERE" \
  --pricing-plan "RequestBasedUsage"
$ aws location list-place-indexes
{
    "Entries": [
        {
            "CreateTime": "2021-06-12T13:46:09.170000+00:00",
            "DataSource": "Esri",
            "Description": "for investigation Esri",
            "IndexName": "ExamplePlaceIndex",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T13:46:09.170000+00:00"
        },
        {
            "CreateTime": "2021-06-12T14:12:51.610000+00:00",
            "DataSource": "Here",
            "Description": "for investigation HERE",
            "IndexName": "ExamplePlaceIndexHERE",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T14:12:51.610000+00:00"
        }
    ]
}

HERE でジオコーディング

Esri のときと同じく「大阪市中央区」でジオコーディングします。

$ aws location search-place-index-for-text \
--index-name ExamplePlaceIndexHERE \
--text "大阪市中央区" \
--max-results 5 
{
    "Results": [
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50988,
                        34.68114
                    ]
                },
                "Label": "大阪府大阪市中央区",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.5014,
                        34.66891
                    ]
                },
                "Label": "大阪府大阪市中央区道頓堀1丁目6ミナミ (難波)",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "AddressNumber": "27",
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50398,
                        34.69353
                    ]
                },
                "Label": "大阪府大阪市北区中之島1丁目1-27大阪市中央公会堂",
                "Municipality": "大阪市",
                "Neighborhood": "北区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.48485,
                        34.69745
                    ]
                },
                "Label": "大阪府大阪市福島区福島7丁目4ジェイホッパーズ大阪ゲストハウス",
                "Municipality": "大阪市",
                "Neighborhood": "福島区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50791,
                        34.68903
                    ]
                },
                "Label": "大阪府大阪市中央区伏見町1丁目1ホテルブライトンシティ大阪北浜",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        }
    ],
    "Summary": {
        "DataSource": "Here",
        "MaxResults": 5,
        "ResultBBox": [
            135.48485,
            34.66891,
            135.50988,
            34.69745
        ],
        "Text": "大阪市中央区"
    }
}

sri の場合は max-results を 5 で指定していても応答は1件だけでしたが、HERE の場合は 住所が大阪市中央区でないPOIでもアグレッシブに応答しており、ジオコーダとしての性格がかなり異なることが分かります。


鳥カゴ用の台をDIYしました

こんにちは、デザイナーのはなです。

飼っている鳥のために、鳥カゴを置く用の台をDIYしました。

ちなみに今までは床にカゴを直においていました。

こちらが設計図です。

iPadのメモ帳で適当に書いたものなので、線がとてもふにゃふにゃです。

多分誰も読めないし、私にももう読めません。

材料調達

近くのホームセンターで木材や金具などを購入します。

ホームセンターでは木材カットのサービスがあるので、担当の店員さんに寸法を伝えて切ってもらいます。

少し重かったですが、なんとか自力で持って帰ることができました。

買った金具が大きすぎたのと、中段の角材の本数をもう少し増やしたかったので、次の日もう一度ホームセンターに行って買い足してきました。

この時買い足した木材をカットしてもらう際伝える寸法を間違えて、10センチ長い木材を持って帰ってきてしまったので、自分で100円均一で買ったのこぎりで切りました。

(性格の雑さが出ている

カゴを置く部分の制作

事前準備

うちの鳥さんの主食は粟などの穀物や種なのですが、食べカスを死ぬほど巻き散らかすので、囲いを付けます。

囲いの板には、鳥用ヒーターのコンセントを通すための穴を開けます。

細いのこぎりは持っていなかったので、ドリルで穴を開けまくり、力づくで半ば無理やりぶち抜きました。

その後必死にやすりをかけ、断面を滑らかにします。

木材の角に紙やすりをかけて角をとっていきます。

この作業が一番めんどくさい上、木屑が部屋中に散らばるのでかなり嫌な作業です。

塗装

部屋が狭いのでカーペットの上のものを全部どかして木材を置き、そこで作業しています

木材に塗装をします。

カゴを置く部分には、ペンてるの水性WOODジェルステインを塗りました。

三年ぐらい前に壁面収納を作ったときのあまりです。腐ってたらどうしようと思いましたが、大丈夫そうでした。

こちらは塗膜の厚みが出ないのと、布で刷り込んで塗るタイプの塗料なので、塗りやすいように組み立てる前の木材に塗ります。

二度塗りして深みを出します。

塗装が一番好きなので、ルンルンで作業します。

組み立て

閉じているところ
開いているところ

組み立ててみました。

掃除をしやすくするために、蝶番と留め具を使って前面部分の板を開けられるようにしました。

ニス

鳥が水浴びをした時に水が飛び散るので、組み立てた後に耐水性をつけるため水性ウレタンニスを塗布します。

ニス塗る紙やすりかけるニス塗る紙やすりかける の順で二度塗りをし、表面を滑らかにして拭き掃除をしやすくします。

脚部分を組み立てる

組み立て

無心で作業していたので、あまり制作過程のちゃんとした写真を撮っていませんでした

脚部分を組み立てます。

中段に物を入れられるようにしたかったのと、台の下に掃除機をかけやすいように、脚は少し高めにしました。

中段用の角材は先に取り付けると角材と角材の間が塗装しにくいため、塗装した後に組み立てます。

写真は上部を仮置きしてみたところです。

部屋が汚すぎるのでモザイクをかけています。

塗装

もっとちゃんとした写真撮っとけばよかった

組み立てた後、塗装を行います。

脚部分は、塗ると鉄っぽい質感になる黒いアイアンペイントを塗りました。

アイアンペイントは前から一度試してみたいなと思っていたので、使えてよかったです。

写真ではわかりにくいですが、普通の黒いペンキよりも高級感があってかっこいい感じに仕上がりました。

ついでにカゴを置く部分のビスにもアイアンペイントを塗りました。

塗装の途中でフローリング(賃貸)にアイアンペイントを盛大にこぼしてしまい青ざめましたが、アルコールの除菌シートで頑張って拭いたらきれいに取れました。

塗装が乾いたら、中段用の角材を取り付けていきます。

完成

上部と下部を合体させて、完成です!

閉じているところ
開いているところ
すでに食べカスがやばいので掃除しないと…

今までと景色が変わったので、最初はカゴの中で動き回ってキョロキョロしていましたが、比較的すぐ慣れたようでした。

中段には鳥の餌と、寝る時にカゴにかける毛布を収納しています。

DIYで作ったもののいいところは、ある程度なら後からカスタマイズできるところです。

そのうち側面にアイアンバー的な物をつけて、フックで物をひっかけられるようにしたいなーと思っています。

ちなみに材料を買いにホームセンターに行った時に、ついでに鳥用の新しいおもちゃを買ったのでカゴに設置してみたのですが、一切興味も示さない上ウンチだらけにされたので捨てました。