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

[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 のとき同様に検索結果の情報を取り出せることが分かります。

ImageMagickでPDFを高解像度なPNGに

PDFファイルをImageMagickで画像に変換します。

ポイントは解像度指定です。

拡張子はPNG以外でも問題ありません。

$ convert -density 350 -units PixelsPerInch origin.pdf converted.png

density により解像度の指定が可能です。

ここでは350を指定していますが、600や1200を指定するとその値になります。

PDFからPNGに変換した画像 (original size 7000×3938)

ネット上には画像への変換ツールも数多くありますが、内容によっては利用が憚られることもあるかと思います。

高解像度画像への変換もお手軽に。

PDFの関連記事

AIで国旗を作ってみました!

こんにちは。開発担当のマットです。
実は、私が旗オタクです。なぜかわかりませんが、小さい時から国旗のことを気に入って、家にいくつかの旗を飾っています。

ところで、AIに頼んだら各国の旗をなんとか面白く再構想できるではないかと思いまして…
この記事でやりたいと思います!

国旗を作るには

国の旗は国民を象徴するものです。要素を適当に選んではいけませんね。
どの国でも、国民が好む色やシンボルがあるかと思いますので、まずはその情報をAIに尋ねてみます。

なんとなくですが、日本語で質問をすると、各国のデータにちょっとした偏見が出ると思いますので、英語で質問をすることにしました。
なお、ChatGPT がかなり長い文面を返すことが多いので、短めな 10 ワード以内な回答をお願いしてみました。



日本の場合、赤, 白, 黒が一番人気だそうです。
黒はちょっと想定外ですが・・・赤と白は確かにそういう気がしますね。
(日の丸だけではなく、日本に「紅白」のテーマなものが多いですね。)

そして、日本を象徴するシンボルが 桜、富士山、鯉 のようです。
これは確かに命中していると思いますね。

この情報を使って、画像生成 AI に旗作りを頼みました。
今回、使わせていただきましたのは Craiyon という 画像生成 AI です。

A flag design in the colors Red, White, Black with the symbols of Cherry Blossom (Sakura), Mount Fuji, Koi Fish.

のプロンプトを使って、生成してみたら、以下の9枚の画像が生成されました。

その中から「旗っぽい」ものを選んで、旗っぽい比率で切り取ったら…

確かに・・・日本らしい国旗を作れました (笑)。

他にも・・・

せっかくなので、他の国も作ってみました〜
全部、以下に並べますが、どの旗はどの国か、当ててみてください。

★答え (タップで表示されます)
中国 オーストラリア インド
イギリス エジプト カナダ
イタリア メキシコ フランス
ロシア 韓国 アメリカ
ブラジル ウクライナ ドイツ


全部わかりましたでしょうか?
いくつかわかりにくいものもあるかと思いますが、その国のイメージ通りなものもありますね。

まとめ

最近、AI の画像生成も、AIの会話も急激に進化してきています。
この新しいツールで、色んな人が色んなことができるようになりました。

数年前だったら、このような画像をつくることは絶対にできませんでしたけど、今は楽に、何十枚も簡単に生成することはできます。

世界の皆さんが、この新しい AI で、何を作るかを楽しみにしています。

Markdownドキュメントをコマンドラインで読む

Markdown のドキュメントをコマンドラインで読みたいことがあります。
自分で書いているときはエディタのプレビューやブラウザの拡張を使えば良いのですが、たとえば github のプロジェクトを clone してきて README.md を読むような場合にはコマンドでさっと読める手段があると便利です。

初め markdown2html とか md2html みたいな名前で探したのですが、Debian パッケージとしては見つからず。結局のところ、markdown というそのまんまの名前のパッケージが見つかりました。

sudo apt install markdown

使い方は簡単で、ファイル名を指定してコマンドを起動すると標準出力にHTMLが出力されます。パイプで繋いでやればテキストブラウザで表示できます。

markdown README.md | lynx -stdin

以下の画像は Solr の s3-repository モジュールに付属の README.md を markdown で変換してから lynx で表示したものです。

こんな感じでさくっと閲覧できます。