ようへいの日々精進XP

よかろうもん

2021 年 01 月 24 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃってプランクレーニング 4 種盛り x 3 セット)
  • 今日もエアロバイク 40min (負荷 8)

読書

今日は本を読む時間を作れなかった。

レアジョブ

今日の指摘事項。

「ジョギングに行く」と言いたかったんだけど...

You said: I go _to_ jogging.

Correct: I go jogging.

go to だと、後に場所が来ることになるので、「私はジョギング (という場所) に行く」と恥ずかしげもなく言っていたことなる... 「ジョギングをしに行く」という場合には、I go jogging となる。例えば、テニスをしに行くの場合には I go playing tennis となる。

「彼は彼のクラスメイトと飲みに行きます」と言いたかったんだけど...

You said: He drinks his classmate.

Better: He goes drinking with his classmates.

「私は毎週土曜日にゴミを出します」と言いたかったんだけど...

Q: How often do you take out the trash?
You said: I take the trash every Sunday.

Correct: I take *out the* trash every Sunday.

take out the trash がなかなか出てこない...

とにかく、全般的に文法が駄目。

夕飯

RabbitMQ

この土日は、RabbitMQ を触っていた。

当初、以下の記事のサンプルコードを参考に、キューに溜まったメッセージの出し入れの雰囲気を試した。

www.cloudamqp.com

下図のように publisher (producer) がキューに Exchange を介してメッセージを放り込んで、consumer がメッセージを取り出すだけんだけど、ちょっと違和感があった。

https://www.cloudamqp.com/blog/2015-05-19-part2-1-rabbitmq-for-beginners_example-and-sample-code-ruby.html

ちょっとした違和感というのは、consumer を起動すると、キューの中のメッセージが一気に無くなってしまうということ。自分の乏しい認識だと、consumer はキューから 1 件ずつメッセージを取り出して、メッセージの受信が完了したら、キューの中のメッセージが削除される... だったんだけど。

ということで、試行錯誤していたら Bunny::Queue#subscribe:manual_ack というオプションを有効にすることで、自分の認識通りの挙動となることを確認した。:manual_ack という名の如く、メッセージの受信処理が完了したことを RabbitMQ に教えてあげる為に ch.ack(delivery_info.delivery_tag) こんな感じで ack を送って上げる必要がある。

# サンプルを参考にしたコード
require "bunny"

conn = Bunny.new 'amqp://rabbitmq-server'
conn.start

def processing(message)
  puts "### Handling processing for ..."
  puts message
  sleep 5
  puts "### processing done"
end

puts "Processing Start..."
begin
  ch = conn.create_channel
  # ch.prefetch(1)
  q = ch.queue("examplequeue1", :durable => true)
  
  q.subscribe(:block => true) do |delivery_info, properties, payload|
    processing(payload)
  end
  sleep 10 while true
rescue Interrupt => _
  conn.close
end

# :manual_ack を有効にしたコード
require "bunny"

conn = Bunny.new 'amqp://rabbitmq-server'
conn.start

... 略 ...

puts "Processing Start..."
begin
  ch = conn.create_channel
  ch.prefetch(1) # キューから 1 件ずつメッセージを取り出す
  q = ch.queue("examplequeue1", :durable => true)
  
  q.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
    processing(payload)
    ch.ack(delivery_info.delivery_tag)
  end
  sleep 10 while true
rescue Interrupt => _
  conn.close
end

ということで、学びの多い週末でした。

rubybunny.info

www.rabbitmq.com