続 梅体験専門店「蝶矢」に行ってみた

以前に投稿したブログの中で、特別な梅酒と名高い「蝶矢 限定熟成」をついに開封したのでレポしていこうと思います。
梅体験専門店「蝶矢」に行ってみた

蝶矢 限定熟成開封の儀

  

かっこいい見た目。。
ぱっと見、色もかなり濃くて凝縮されている感と、何かで割らないと体温が一気に上がってしまいそうなくらい色々濃い。
実際に飲んでみたところ、見た目通りの印象。
割らずに飲むと激濃でした!
危険を察知しソーダ割りに変更したのですが、香りもよくて梅感たっぷりで美味しかったです。
プレミアム感も相まってほわほわでした。

そんな蝶矢 限定熟成のお供はお米でした。
この日は青天の霹靂というお米。
甘くて美味しいし、レトルトパックで売っているのも衝撃。

今日紹介した蝶矢 限定熟成は、梅体験専門店蝶矢の京都店と鎌倉店で購入できますよ〜。
各店舗1日限定5本の販売みたいです。
購入した日からそろそろ1年なのでまた行かねば。。
https://choyaume.jp/

WebAssemblyを使ってブラウザでRubyを動かす

WebAssemblyによりJavaScript以外のプログラミング言語で書かれたコードをブラウザ上で動かす道が広く開かれました。現時点ではRustが使われることが多いようですが、RubyやPythonなどのスクリプト言語を利用する手段も整ってきています。たとえばRubyはバージョン3.2からWebAssembly上で動くようになりました。
WebAssembly 上で動くようにコンパイルされたRubyインタープリターがruby.wasmで、そのruby.wasm 上でRubyのコードが動きます。

ブラウザ上でRubyを動かすのは非常に簡単です。以下はruby.wasmのサイトのQuick Exampleです。

<html>
  <script src="https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@2.1.0/dist/browser.script.iife.js"></script>
  <script type="text/ruby">
    puts "Hello, world!"
  </script>
</html>

これをexample.htmlとして保存し、同じディレクトリでRubyのhttpdを起動します。

ruby -run -e httpd .

ブラウザで以下にアクセスします。

http://localhost:8080/example.html

注意しないといけないのは、puts の実行結果がそのままブラウザ上で表示されるわけではないことです。デベロッパーツールを開いてコンソールを見ると”Hello, world!”が出力されていることがわかります。

ブラウザ上に表示するためにはDOMを操作する必要があります。RubyからはJSパッケージを使ってJavaScriptを通じてDOMを操作できます。

<html>
  <script src="https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@2.1.0/dist/browser.script.iife.js"></script>
  <script type="text/ruby">
    require "js"
    document = JS.global[:document]
    body = document[:body]
    button = document.getElementById("b1")
    button.addEventListener("click") do |e|
      div = document.getElementById("d1")
      div[:innerText] = "Hello, World""
    end
  </script>

  <button id="b1">Say Hello</button>
  <div id="d1"></div>
</html>

ボタンを押すとその下に”Hello, World!”と出力されます。

Slackのブックマークと後で読む機能が便利です

仕事でSlackを使っているのですが流れてくるメッセージが多くてメンション付きのものだったり後で読もうとしたものだったりを忘れることはありませんか?
そんな時に便利なのがブックマークする、後で読むの機能です。

基本的には作業の記録などはプロジェクト管理ツールのチケット管理でやっていますがチケットに記載するほどのことではないやりとりやTODOとして保持していたり返信待ちに使ったりと後で忘れないようにするのに便利です。

使い方は簡単で対象のメッセージのメニューから「ブックマークする」を押すだけで後で読むに追加されます。後は画像にある「後で」を押すことでブックマークしたものが一覧で表示されます。読んだ後や対応した後は「完了にする」または「後で」から外すで外せば綺麗に無くなります。

注意点として課金していない場合は長期間経つとブックマークしたメッセージ自体が消えてしまったりするのでそういった場合は別途自分宛に記載しなおしたりメモに残したりが必要です。

メールでも受信トレイを同じような扱いで運用しています。
読み逃しや返信忘れ、予定など現状の対応が必要なものを残したままにしているので作業忘れは少ないです。
ただ迷惑メールや作業メールなどに埋もれると困るので随時フィルターを駆使してやっているので少し手間はかかります。

仕事の進め方、ツールの使い方は人それぞれだと思いますがそれなりに長くこのやり方で運用していますが忘れてしまうことがかなり減っているのでおすすめです。

仕事でSlackを使っているのですが流れてくるメッセージが多くてメンション付きのものだったり後で読もうとしたものだったりを忘れることはありませんか?
そんな時に便利なのがブックマークする、後で読むの機能です。

基本的には作業の記録などはプロジェクト管理ツールのチケット管理でやっていますがチケットに記載するほどのことではないやりとりやTODOとして保持していたり返信待ちに使ったりと後で忘れないようにするのに便利です。

使い方は簡単で対象のメッセージのメニューから「ブックマークする」を押すだけで後で読むに追加されます。後は画像にある「後で」を押すことでブックマークしたものが一覧で表示されます。読んだ後や対応した後は「完了にする」または「後で」から外すで外せば綺麗に無くなります。

注意点として課金していない場合は長期間経つとブックマークしたメッセージ自体が消えてしまったりするのでそういった場合は別途自分宛に記載しなおしたりメモに残したりが必要です。

メールでも受信トレイを同じような扱いで運用しています。
読み逃しや返信忘れ、予定など現状の対応が必要なものを残したままにしているので作業忘れは少ないです。
ただ迷惑メールや作業メールなどに埋もれると困るので随時フィルターを駆使してやっているので少し手間はかかります。

仕事の進め方、ツールの使い方は人それぞれだと思いますがそれなりに長くこのやり方で運用していますが忘れてしまうことがかなり減っているのでおすすめです。

[AWS]ALBのルーティングアルゴリズム

ALBのターゲットグループ配下のインスタンスにどのようにリクエストを振り分けるかのアルゴリズム(ルーティングアルゴリズム)は複数用意されていて、ターゲットグループごとに設定できるようになっています。
ALBのルーティングアルゴリズムは長らくラウンドロビンだけでしたが、後に最小未処理リクエスト、更にその後に加重ランダムが追加されました。

ラウンドロビン

多くの場合ではデフォルトのラウンドロビンでうまくいきます。ラウンドロビンはターゲットグループ内のターゲットを順番に選択してリクエストを割り当てます。すべてのターゲットに均等にリクエストを割り当てる手法であり、各インスタンスの能力が同等でタスクの処理の重さも同じくらいであるときに利用されます。

最小未処理リクエスト(Least Outstanding Requests: LOR)

処理中のリクエストが最も少ないターゲットを選択します。
リクエストの種類ごとの処理の複雑さにばらつきが有る場合、ラウンドロビンでは特定のターゲットに負荷の高いリクエストが集中することが起こりえます。最小未処理リクエストはいわば一番暇なターゲットにリクエストを割り当ててる手法であり、特定のターゲットに負荷が集中してしまうことを防げます。

また、ターゲットの処理能力が均一でない場合にラウンドロビンでは最も処理能力の低いターゲットの負荷が問題になりますが、この場合も最小未処理リクエストを採用すればうまく対応できます。

荷重ランダム(Weighted Random)

Automatic Target Weights (ATW) を利用するときに選択します。
加重ランダムを選択すると「異常緩和をオンにする」という設定項目が表示されるようになります。異常緩和をオンにすると(500エラーを頻繁に応答するなど)異常と判定されたターゲットへのリクエスト割り当てを徐々に減らしていきます。ターゲットの状態が回復したと判定されると逆にリクエストの割り当てを徐々に戻します。

余談ですが

以前最小未処理リクエストの採用を検討したことがありましたが、とある理由でうまくいきませんでした。

そのサービスでは、アプリケーションサーバで処理するリクエストの中で特定の1種類でだけCPUを集中的に利用するケースがあり、そのようなリクエストがたまたま1台のサーバに集中するとCPU利用率が100%に達してしまうことがありました。

まさに最小未処理リクエストの出番のように見えました。しかし、そのタイプのリクエストでは重めの処理を exec で別プロセスとして起動してリクエスト自体は即座に応答するという作りになっていたため、未処理リクエストとしては扱えないことが分かって断念しました。(キューを使って処理を外出しにすることになりました)

未処理リクエストとしてカウントされる基準が重要、というお話でした。

[Solr] 検索結果をCBORで出力する

Solr 9.3 から Response Writer で CBOR がサポートされました。
CBOR は MessagePack の後継とも言われるオブジェクト・シリアライズ・フォーマットです。データモデルは JSON がベースになっており、シンプルかつコンパクトにデータのやり取りができます。

Solr の検索結果を CBOR で出力するには、パラメータで wt=cbor を指定するだけです。
Solr のチュートリアル用の techproducts データを対象に、同じ検索結果を JSON で出力した場合とでファイルサイズの違いを比べてみます。

$ curl -s 'http://localhost:8983/solr/techproducts/select?indent=true&q.op=OR&q=*%3A*&wt=cbor' --output result_cbor
$ curl -s 'http://localhost:8983/solr/techproducts/select?indent=true&q.op=OR&q=*%3A*&wt=cbor' --output result_cbor
$ ls -l result*
-rw-r--r-- 1 splout splout 2772 10月 28 20:13 result_cbor
-rw-r--r-- 1 splout splout 5166 10月 28 20:13 result_json

CBOR は JSON に比べると半分近くのサイズになっています。

cbor2 モジュールを使って CBOR のバイナリファイルを python で読み込んでみます。

$ python3
>>> import cbor2
>>> f = open('result_cbor', 'rb')
>>> dic = cbor2.loads(f.read())
>>> dic['responseHeader']
{'zkConnected': True, 'status': 0, 'QTime': 12, 'params': {'q': '*:*', 'indent': 'true', 'q.op': 'OR', 'wt': 'cbor'}}
>>> dic['response']['numFound']
52
>>> dic['response']['docs'][0]
{'id': '0812521390', 'cat': ['book'], 'name': 'The Black Company', 'price': 6.989999771118164, 'price_c': '6.99,USD', 'inStock': False, 'author': 'Glen Cook', 'author_s': 'Glen Cook', 'series_t': 'The Chronicles of The Black Company', 'sequence_i': 1, 'genre_s': 'fantasy', '_version_': 1780827206570737664, 'price_c____l_ns': 699, 'name_exact': 'The Black Company'}

cbor2.loads で dictionary として読み込まれ、JSON のとき同様に検索結果の情報を取り出せることが分かります。