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

知らんけど。 – 今更ChatGPT

花粉症がいつまで続くんだろうと毎年考えているマエダです。

おかげさまで忙しくさせていただいております。
そんな中、ChatGPTに全然触れられていないことに今更恐怖を感じました。

LINEでChatGPTといえば、「AIチャットくん」。
https://picon-inc.com/ai-chat
※ おしゃれ・・

10周遅れくらいでためしにLINEボットを作成してみました。
(1) ChatGPTにLINEボットの作り方を聞いてみたもののよくわからず公式サイトで確認。https://developers.line.biz/ja/docs/messaging-api/building-bot/
(2) webhookを動かすruby + sinatra動作環境を準備。
(3) API公開から一月以上も経つとなんでも揃ってるので組み合わせるだけ。
https://github.com/line/line-bot-sdk-ruby
https://github.com/alexrudall/ruby-openai

そうこうしているうちにはじめてのLINE bot 「知らんけど。」が爆誕しました。
shirankedo

特徴としては、会話をすると漏れなくイライラしてきます。

やっぱりEAST END×YURI世代としては、関西弁にしたくなりますよね。
知らんけど。


QEMUの仮想マシンのディスク領域を拡大する

はじめに

開発環境の一部を仮想マシンの Linux デスクトップで運用しています。Virt Manager で GUI で管理しているもので、中身は QEMU の VM イメージです。使っているうちに最初に確保したディスクサイズでは足りなくなってきたので拡大しました。

仮想マシンのディスク領域拡大

最初に仮想マシンを作って OS をインストールするときに LVM にしていたなら、後から仮想ディスクを追加して LVM ボリュームに追加するだけで良かったのですが、この仮想マシンは LVM にはしていませんでした。

そこで、仮想ディスクのまま拡大する方法を調べたところ、libvirt には便利なツールが揃っていて、思っていたよりも簡単にディスク領域を拡大できることが分かりました。ある意味、仮想ディスク追加→LVMボリュームに追加→resize2fsの手順よりも簡単です。

手順の概要は以下の通りです。

  1. 新しいサイズの仮想ディスクを作成
  2. virt-resizeコマンドで元の仮想ディスクの内容を新しい仮想ディスクへコピー

qemu-img resize してから仮想ディスクを仮にマウントして resize2fs する方法もありますが、virt-resize コマンドを使う方が簡単です。

まず対象仮想ディスクのパーティション構成を確認します。全体として20GBのディスクで、ルートパーティションが12GBであることが分かります。

# virt-filesystems --long --parts --blkdevs -h -a debian10.qcow2
Name       Type       MBR  Size  Parent
/dev/sda1  partition  83   12G   /dev/sda
/dev/sda2  partition  05   1.0K  /dev/sda
/dev/sda5  partition  82   8.0G  /dev/sda
/dev/sda   device     -    20G   -

新しく40GBの仮想ディスクを作成します。

# qemu-img create -f qcow2 -o preallocation=metadata debian10.20230425.qcow2 40G

元のディスクの内容を、新しいディスクにコピーします。この際に、拡張するパーティションとしてルートパーティションを指定します。

virt-resize --expand /dev/sda1 debian10.qcow2 debian10.20230425.qcow2

コピーが完了したら、新しい仮想ディスクのパーティション構成を確認します。
全体として40GB、ルートパーティションが32GBに増えたことが分かります。

# virt-filesystems --long --parts --blkdevs -h -a debian10.20230425.qcow2
Name       Type       MBR  Size  Parent
/dev/sda1  partition  83   32G   /dev/sda
/dev/sda2  partition  05   1.0K  /dev/sda
/dev/sda5  partition  82   8.0G  /dev/sda
/dev/sda   device     -    40G   -

最後にファイル名を付け直して Virt Manager から起動すれば、ディスクサイズが拡大された状態で仮想マシンを起動できます。

# mv debian10.qcow2 debian10.qcow2.bak
# mv debian10.20230425.qcow2 debian10.qcow2

[Solr]Jaegarと連携させて分散検索処理を追跡する

はじめに

Solr を Jaeger と連携させて分散検索処理を追跡することができます。
https://solr.apache.org/guide/solr/latest/deployment-guide/distributed-tracing.html

Jaeger は分散トレーシングのツールです。
SolrCloud で複数のノードによる分散インデックス・分散検索を利用するときに、どのノードからどのノードへどんなリクエストが送られたか、どのノードでどの処理にどのくらい時間が掛かったかを追跡でき、これらの情報をパフォーマンスの改善などに利用できます。

Jaegerの起動

Jaegerのバイナリをダウンロードサイトからダウンロードして展開し、以下のコマンドを実行します。

./jaeger-all-in-one --collector.zipkin.host-port=:9411

JaegerTracerConfiguratorの設定

solr.xml に以下を追加します。

  <tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator"/>

それ以外のパラメータは Solr 起動時に環境変数で渡します。

bin/solr start -cloud -p 8983 -Denable.packages=true -Dsolr.modules=jaegertracer-configurator -DJAEGER_SAMPLER_TYPE=const -DJAEGER_SAMPLER_PARAM=1

プロダクション環境で全クエリを追跡したくはないときは JAEGER_SAMPLER_TYPE に probabilistic などを指定します。今回は動作確認なので const を指定して全部を対象としています。
JAEGER_SAMPLER_PARAM=1を指定しないとサンプリングが実行されません。

クエリの実行と追跡結果の表示

この実験のために2レプリカずつの2シャードのコレクションを作成しました。準備が整ったら Solr Admin UI で何かクエリを実行してから Jaeger UI ( http://localhost:16686/ )にアクセスします。
以下は追跡結果のタイムライン表示の例です。

2023-03-19 12:37:01.732 INFO  (qtp487416600-120) [c:test s:shard2 r:core_node7 x:test_shard2_replica_n4] o.a.s.c.S.Request webapp=/solr path=/select params={df=_text_&distrib=false&fl=id&fl=score&shards.purpose=16388&start=0&fsv=true&q.op=OR&shard.url=http://localhost:8983/solr/test_shard2_replica_n4/|http://localhost:8983/solr/test_shard2_replica_n5/&rows=10&rid=localhost-6&version=2&q=*:*&omitHeader=false&NOW=1679229421713&isShard=true&wt=javabin&useParams=&_=1678885506788} hits=4562 status=0 QTime=11
2023-03-19 12:37:01.733 INFO  (qtp487416600-15) [c:test s:shard1 r:core_node6 x:test_shard1_replica_n2] o.a.s.c.S.Request webapp=/solr path=/select params={df=_text_&distrib=false&fl=id&fl=score&shards.purpose=16388&start=0&fsv=true&q.op=OR&shard.url=http://localhost:8983/solr/test_shard1_replica_n2/|http://localhost:8983/solr/test_shard1_replica_n1/&rows=10&rid=localhost-6&version=2&q=*:*&omitHeader=false&NOW=1679229421713&isShard=true&wt=javabin&useParams=&_=1678885506788} hits=4676 status=0 QTime=8
2023-03-19 12:37:01.753 INFO  (qtp487416600-120) [c:test s:shard1 r:core_node6 x:test_shard1_replica_n2] o.a.s.c.S.Request webapp=/solr path=/select params={df=_text_&distrib=false&shards.purpose=64&q.op=OR&shard.url=http://localhost:8983/solr/test_shard1_replica_n2/|http://localhost:8983/solr/test_shard1_replica_n1/&rows=10&rid=localhost-6&version=2&q=*:*&omitHeader=false&NOW=1679229421713&ids=22,11,12,24,13,14,15,16,20,10&isShard=true&wt=javabin&useParams=&_=1678885506788} status=0 QTime=1

それぞれのリクエストは上記のログに対応しています。
shard1 と shard2 に id だけを取得するリクエストを並行して投げて、その後、得られた id のリストを統合して結果作成用のリクエストを投げていることが分かります。


[Solr]ChatGPTにスキーマを作らせてみた

Solrによる検索環境を構築するにあたって、スキーマの設定ファイルを作るところは意外と面倒です。
その部分を試しに ChatGTP に手伝ってもらいました。

以下の内容で依頼しました。

Apache Solr で以下の文書のインデックスを作成します。デフォルトのスキーマ設定にスキーマAPIを使って必要な設定を追加するための JSON ファイルを作成してください。
インデックス対象の文書は以下の形式の JSON ファイルで与えられます。
[{“id”:”10″,”type”:”官公庁”,”area”:”住之江区”,”name”:”軽自動車検査協会大阪主管事務所”,”address”:”住之江区南港東3-4-62″,”address_p”:”34.6164938333333,135.438210722222″},
{“id”:”11″,”type”:”官公庁”,”area”:”住之江区”,”name”:”大阪陸運支局なにわ自動車検査登録事務所”,”address”:”住之江区南港東3-1-14″,”address_p”:”34.6190439722222,135.442191833333″}]

インデックス対象は、いつもの大阪の施設情報です。具体例として与えたのは2レコード分だけですが、以下のように適切なスキーマを作ってくれました。

以下は、Apache Solr でこの JSON ファイルをインデックスするためのスキーマ定義の例です。この例は、id、type、area、name、address、address_p の6つのフィールドをインデックスすることを想定しています。

{
  "add-field": [
    {
      "name": "id",
      "type": "string",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    },
    {
      "name": "type",
      "type": "string",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    },
    {
      "name": "area",
      "type": "string",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    },
    {
      "name": "name",
      "type": "text_general",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    },
    {
      "name": "address",
      "type": "text_general",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    },
    {
      "name": "address_p",
      "type": "location_rpt",
      "indexed": true,
      "stored": true,
      "required": true,
      "multiValued": false
    }
  ]
}

このスキーマ定義によって、以下のようにインデックスを作成することができます。

  1. Apache Solrの管理画面にアクセスします。
  2. 左側のメニューから「コアの作成」をクリックして、新しいコアを作成します。
  3. 新しいコアの名前を入力し、「コアを作成する」をクリックします。
  4. 新しいコアの管理画面に移動し、「スキーマ」をクリックします。
  5. 「スキーマ」のページで、「スキーマAPI」をクリックし、「スキーマ定義の追加」をクリックします。
  6. 上記のスキーマ定義をコピーして、「スキーマ定義の追加」のテキストボックスに貼り付けます。
  7. 「送信」をクリックしてスキーマを追加します。
  8. 左側のメニューから「ドキュメント」をクリックして、新しいドキュメントを追加します。
  9. 新しいドキュメントのJSON形式のデータを入力し、「追加」をクリックしてインデックスを作成します。
  10. インデックスが作成されたことを確認するために、左側のメニューから「クエリ」をクリックして、クエリを実行して結果を確認します。

短い文字列には string、 長めの文字列には text_general、緯度経度には location_rpt とデータの内容に合わせてフィールドタイプを選んでくれているように見えます。 address_pという名前がヒントになったかもしれないので hoge にして試してみましたが、やはり location_rpt になりました。

このようにインデックス作成までの準備の部分を AI に手伝ってもらえると、いろいろと楽になりそうです。


セキュリティキーを使ってパスキーを体験する

はじめに

前回の記事では、認証器として指紋認証付きのスマートフォンを利用してパスキーによる認証を体験しました。その後、Google が販売する FIDO セキュリティキーである Titan Security Key を購入したので、そちらを使うパターンのパスキー認証を試してみました。

PCでのパスキー登録と認証

今回も WebAuthn.io のデモページを利用させてもらいます。

まず登録です。セキュリティキーをUSBポートに挿しておきます。

ユーザ名を入力して”Register”を押し、パスキーの作成方法として「USBセキュリティキー」を選択します。

セキュリティキーをタップします。

登録完了です。物理的に接続されている分、スマートフォンを利用する場合に比べてステップが少なくて済みます。

次に認証。

ユーザ名を入力して”Authenticate”を押し、セキュリティキーをタップします。

認証成功です。
ユーザ登録を実行したPC以外でも、セキュリティキーを挿しさえすれば、非常にスムーズにログインできます。

スマートフォンでのパスキー認証

スマートフォンで認証を行う場合はセキュリティキーを NFC デバイスとして利用します。

ユーザ名を入力して”Authenticate”を押します。

セキュリティキー使用の確認画面が出るので「開始」を押します。

「NFCでセキュリティキーを使用する」を選択します。

セキュリティキーをスマートフォンのNFC読み取り箇所に当てます。

正しく読み取れたら認証完了。

おわりに

PCでは認証器としてスマートフォンを使うよりもセキュリティキーを使う方が、全体的に手順が簡略に済みます。
ただ、スマートフォン自体で認証を実行するときにはスマートフォン自体の生体認証を使う方が楽なのは間違いないです。一つのアカウントで一つの認証器でしか登録できないということはないので、両方で登録しておいて状況に応じて使い分けるのが便利かなと思います。