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

ChatGPTに残り物で作れるレシピについて聞いてみた

自炊生活をしていると使い切れなかった調味料や、買い置きしてしまった食材を冷蔵庫奥に眠らせてしまうことが多々あります。
気づいた頃には賞味期限がとっくに過ぎていて泣く泣く捨てることも…。

そんな残り物を有効活用できるレシピがないかChatGPTに聞いてみました。

ChatGPTとは?

ChatGPTは、OpenAIが開発した人工知能で、人間のように自然な言葉でコミュニケーションができます。大量の文章を学習し、高い精度で文章生成や応答を行うことができます。

上記文章もChatGPTに「ChatGPTとは何かについて簡単に要約して」と質問して生成された文章です。文章がとても自然で驚かされます。

では本題のレシピについて、今回は鍋の残り物を使ったレシピについて聞いていきたいと思います。

Q. 大根、にんじん、オクラ、ウインナー、料理酒を使ったレシピを教えてください。

A.「大根、にんじん、オクラ、ウインナー、料理酒」を使ったレシピとしては、「煮物」がおすすめです。下記がそのレシピになります。

【材料】

大根 1/2本

にんじん 1/2本

オクラ 5本

ウインナー 2本

料理酒 大さじ2

水 400ml

しょうゆ 小さじ1

砂糖 小さじ1/2

【作り方】大根とにんじんは皮をむき、1.5cm幅の輪切りにする。オクラはヘタを取り、斜め半分に切る。ウインナーは斜めに切る。鍋に大根、にんじん、オクラ、ウインナー、料理酒、水を入れ、中火で煮る。大根に竹串がスッと通るくらい柔らかくなったら、しょうゆと砂糖を加え、さらに煮て味をなじませる。器に盛り、お好みで七味唐辛子をかける。ぜひお試しください!

かんたんに作れそうなレシピの提案がありましたが、煮物が好きではないので別の提案をしてもらうことにしました。

Q. 煮物が好きではないので、別のレシピはありますか?

A.そうですね、では「大根、にんじん、オクラ、ウインナー、料理酒」を使ったサラダのレシピをご紹介します。

【材料】

大根 1/2本
にんじん 1/2本
オクラ 5本
ウインナー 2本
しょうゆ 大さじ1
酢 大さじ1
砂糖 大さじ1/2
料理酒 大さじ2
ごま油 大さじ1
【作り方】

大根とにんじんは皮をむき、千切りにする。
オクラはヘタを取り、斜め半分に切る。
ウインナーは斜めに切る。
ボウルに大根、にんじん、オクラ、ウインナーを入れる。
別のボウルに、しょうゆ、酢、砂糖、料理酒、ごま油を混ぜてドレッシングを作る。
作ったドレッシングを野菜にかけ、混ぜ合わせる。
器に盛り付けて、お好みでごまをかける。
ぜひお試しください!

ヘルシーで美味しそうです!

ただ残念ながら酢が家になかったので、再度質問してみました。

Q.酢がない場合はどうすればいいですか?

A.酢がない場合でも、代用することができる材料があります。以下に代用方法をいくつかご紹介します。

レモン汁
酸味があるレモン汁を少量加えることで、酢の代用ができます。酢と同じ分量で使い、味を調整しながら加えてください

ヤクルト
ヤクルトに含まれる乳酸菌が酢酸を生成するため、酢の代用になります。適量を加えて味を調整してください。

ワイン
白ワインや赤ワインを少量加えることで、酢の代用ができます。酢と同じ分量で使い、味を調整しながら加えてください。

以上の代用方法を試してみてください。ただし、代用方法によっては味に若干の変化が出ることがありますので、お好みで調整してください。

代用品の提案までしてくれました。
レモン汁は家にあったので、やっと作れそうです。
ただヤクルト、ワインで代用できるのかはにわかに信じ難いです。。
※しれっと嘘が紛れ込んでる場合もあるので、鵜呑みにするのは要注意!

まとめ

料理のバリエーションが少なく、ついいつも同じメニューを作ってしまいがちでしたが、ChatGPTのおかげで料理のバリエーションが増えそうです。
「今日、何作ろう」と迷った時はChatGPTに聞いてみるのはいかがでしょうか。
https://openai.com/blog/chatgpt

ネコ型配膳ロボットを見かけて

コロナが始まってから帰省していなかったので、家族集まりも兼ねて久しぶりに妹の赤ちゃんに会いに行きました。

その際に、ガストでお昼を食べたのですが、そこで見たのはネコ型配膳ロボット。

配膳ロボット

もう日常にロボットが溶け込んでいることに少し驚きました。周りを見渡してみると、小さな子供に好かれている様子で、親しみやすいフォルムが良いように思います。個人的には、飲食店ではご飯が食べられればそれで良いので拒否感はありませんでした。ただ、人手不足解消という点では、ロボットの導入は良いと思います。

日本の子供の人口は右肩下がりで、今まで行われた政府の施策も考えると、今後も上昇することはないと思います。人員不足解消のためには、今後のこういったロボットの導入が必要になってくるんだろうなと思いました。

久しぶりに会いにいった赤ちゃんは成長したので、最初のほうはずっと母親の後ろに隠れて泣き出しそうになっていましたが、帰る頃には少し触れ合えるぐらいにはなりました。たかいたかいをして喜んでいた頃が少し懐かしいと思いつつも、今後の成長も楽しみです。

知らんけど。 – 今更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 のリストを統合して結果作成用のリクエストを投げていることが分かります。