健康診断で見つかったピロリ菌の除菌と検査

前回の健康診断でピロリ菌に感染しているのがわかったのでピロリ除菌を行いました。

朝と夜にお薬を飲むだけ・・・だけどつい忘れそうになります。薬の入ってる紙に日付を書く欄があったので飲む前に記載することでなんとか飲み逃すことなく薬は飲み切りました。薬を飲んでる最中はいつも行ってるスーパーの特定の弁当が塩辛く感じてコロナで味覚障害とか聞いていたので少し戦々恐々としていましたが単純にピロリ菌除菌の薬自体の副作用が出ただけのようです。

その4週間後に除菌判定の検査。これは袋に息を入れるだけなので検査自体は特に負担のかかるものはなかったです。さらに1週間後にようやく除菌判定の検査結果を聞きに病院に向かい結果は良好!除菌できていました!!1度目の除菌で除菌できない場合があると聞いてたので1回目で済んだのは本当によかった。ただ3ヶ月後に今度は便での検査があるのでそれが済んだらようやく本当に除菌完了です。

発病してからの治療より余裕のあるうちに予防をという点でシステム開発と同じですね!

SolrのCirtcuit Breakerは具体的に何を見ているのか

はじめに

前回紹介した Circuit Breaker には MemoryCircuitBreaker と CPUCircuitBreaker の2種類があります。それぞれメモリとCPUの使い過ぎに対応しているのだなと何となくは想像が付きますが、具体的にはシステムの何を参照しているのかを調べてみました。

MemoryCircuitBreaker

リファレンスによると、JVMのヒープ使用率が設定値を超えると503を返すと書かれています。MemoryCircuitBreaker の実装をみると、取得しているのは ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() でした。これは現在のヒープ使用量をByteで返すものです。

一方、設定ではヒープの使用率を記述するので、比較するには使用率か使用量かのどちらかに変換して合わせる必要があります。
ソースを確認すると、MemoryCircuitBreaker のコンストラクタで memThreashold を読み込んだときに、ヒープの最大値 * memThreshold / 100 で閾値となるメモリ使用量を計算しておき、MemoryMXBean から取得したメモリ使用量がその値を超えたらリクエストを拒否するという実装になっていました。

CPUCircuitBreaker

CPUCircuitBreaker で監視しているのは ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverate() なので OS から取得するロードアベレージです。設定するのはCPU使用率なので、こちらも何らかの変換をしているのかと思いきや、何とソースコードではCPU使用率の閾値(%)とロードアベレージ(0以上の数値、CPUの数にもよるが通常はせいぜい10未満)を直接比較していました。

これだと使用率のつもりで75などと設定しても全く引っ掛からないのはずで不思議に思って調べてみたところ、どうやらバグのようで JIRA に Issue が作られていました。

CPU circuit breaker needs to use CPU utilization, not Unix load average

タイトルそのまんまですね。
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverate() の代わりに ManagementFactory.getOperatingSystemMXBean().getSystemCPULoad() (0.0-0.1の間のCPU使用率)を使うことが提案されており、近いうちに修正されることと思います。

Solr 8.7で追加されたCircuit Breaker機能

はじめに

Solr 8.7 に Circuit Breaker 機能が追加されました。
いわゆるブレーカーは一定以上の電流が流れたときに回路を遮断する仕組みです。Solr においては想定を超える負荷が掛かったときにサーバが落ちる前にリクエストの受付を停める仕組みになっています。

設定方法

Solr 8.7 に付属の solrconfig.xml には Circuit Breaker 関係の設定が追加されています。説明のコメント部分を除くと以下のような内容です。

    <circuitBreakers enabled="true">
      <!--
       <memBreaker enabled="true" threshold="75"/>
      -->
      <!--
       <cpuBreaker enabled="true" threshold="75"/>
      -->
    </circuitBreakers>

circuitBreakers 要素の enabled 属性が true のときだけ Circuit Breaker 機能が有効になります。
他の部分はコメントを外して設定を有効にすれば良いのかと思ったのですが、リファレンスにはちょっと違うことが書いてあります。リファレンスによると、JVMのヒープ使用率ベースの Circuit Breaker の設定は以下の2項目です。

<str name="memEnabled">true</str>
<str name="memThreshold">75</str>

また、CPU使用率ベースの Circuit Breaker の設定は以下の通りと記載されています。

<str name="cpuEnabled">true</str>
<str name="cpuThreshold">75</str>

CircuitBreakerManager.java を確認すると以下のような読み込み処理があるので、solrconfig.xml ではなくリファレンスの記述の方が正しいようです。

      if (args != null) {
        cpuCBEnabled = Boolean.parseBoolean(args._getStr("cpuEnabled", "false"));
        memCBEnabled = Boolean.parseBoolean(args._getStr("memEnabled", "false"));
        memCBThreshold = Integer.parseInt(args._getStr("memThreshold", "100"));
        cpuCBThreshold = Integer.parseInt(args._getStr("cpuThreshold", "100"));
      }

以下は SearchHandler で circuitBreakerManager によるチェックを実行している箇所です。チェックに引っ掛かると SolrQueryResponse オブジェクト(rsp)に SERVICE_UNAVAILABLE をセットして終了していることが分かります。

    if (req.getCore().getCircuitBreakerManager().isEnabled()) {
      List trippedCircuitBreakers;

      if (timer != null) {
        RTimerTree subt = timer.sub("circuitbreaker");
        rb.setTimer(subt);

        CircuitBreakerManager circuitBreakerManager = req.getCore().getCircuitBreakerManager();
        trippedCircuitBreakers = circuitBreakerManager.checkTripped();

        rb.getTimer().stop();
      } else {
        CircuitBreakerManager circuitBreakerManager = req.getCore().getCircuitBreakerManager();
        trippedCircuitBreakers = circuitBreakerManager.checkTripped();
      }

      if (trippedCircuitBreakers != null) {
        String errorMessage = CircuitBreakerManager.toErrorMessage(trippedCircuitBreakers);
        rsp.add(STATUS, FAILURE);
        rsp.setException(new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Circuit Breakers tripped " + errorMessage));
        return;
      }
    }

おわりに

Circuit Breaker 機能は地味ながら、安定運用のためには便利な機能といえます。今後監視項目をプラグインできるようになる可能性もあり、要注目です。

炭酸水メーカーを買ったらQOLが少し上がった

はじめに

甘い飲み物があまり得意ではないので、冷たい飲み物はもっぱらお茶か炭酸水です。
炭酸水は無糖でフレーバー無しのものを好んでいます。たまにすだち果汁を割って飲むこともあります。

炭酸水を家庭に常備しておく上で難しいのは、開封してしばらく経つと炭酸が抜けてしまうところです。大きいサイズのものを買って何日もかけて飲むというやり方ができません。よって、暑い時期にちょいちょい炭酸水を飲む生活をしていると、500mlのペットボトルで溢れかえることになります。

捨てるのも面倒だし、何より無駄なゴミをいっぱい出してるなあという気持ちになって精神衛生上あまりよくありません。
そこで炭酸水メーカーを我が家に導入してみました。

炭酸水メーカー

その名の通り、家で炭酸水を作るための機械です。電気は使わないので厳密には家電製品ではありませんが、家電量販店で購入できます。
本体に炭酸ガスのボンベを取り付けて使います。ガスが無くなったら空のボンベと交換で新しいボンベを購入します。ボンベも家電量販店で取り扱っているので交換の手間はそんなにありません。ただ、高圧のガスが入ったボンベなのでそれなりに取り扱い注意になっているようで、ボンベ購入時には住所・氏名を書かされたりします。

使い方は簡単で、専用のボトルを取り付けた状態でボタンをカチッと押し込むと1回分の炭酸ガスが噴き出して炭酸水ができます。1回で最大850ml作れます。強い炭酸が作りたければボタンを押す回数を増やすようにマニュアルには書かれていますが、1回押せば強炭酸を謳う市販の製品と同程度の強さになります。

メリット

いろいろと楽

厳密な比較でなくて申し訳ありませんが、炭酸水メーカーで作った850mlの炭酸水は500mlのペットボトル2本分の感覚で消費しています。何プッシュでボンベが空になるのかこまめに記録してみたところ42回だったので、ペットボトルにすれば84本分になります。

あのスーパーで炭酸水特売だから買い置きしておこうとか、溜まったペットボトル捨てなきゃとか、そういう細かな面倒事をすっとばして、飲みたいときにすぐ作って飲めるというのは圧倒的に楽です。

安い

炭酸ガスのボトル1本と500mlペットボトル84本を比較すると

  • 炭酸ガスボンベ1本 2200円
  • ペットボトル(1本50円として)84本 4200円

ちょうど2000円の差です。炭酸水メーカー本体約1万円(ボンベ1本付)の初期費用のことを考えるとボンベ4回交換でチャラになるので、長く使うほどお得になるのは間違いないところです。

まとめ

電気使わなくてコンパクトなので置き場所に困らない、値段とか買い置きとか気にせず飲みたいときに飲める、ゴミが出ない、そしてなによりちゃんとおいしい、ということで大変お気に入りです。

ZOZOGLASSで肌の色を診断してみた

こんにちわ。
リエです。

予約注文していたことをすっかり忘れていたZOZOGLASS
この前ポストに投函されていました。
〜ZOZOGLASSとは〜
ZOZOGLASSは肌の色を計測して、似合うファンデーションの色をおすすめしてくれるサービス。

ファンデーションの色はいつもコスメカウンターでBAさんに見てもらって選んでいますが、今はコロナ禍でタッチアップが禁止だしそもそもコスメカウンターにも中々行けないので、お家でファンデーションの色選びできたらいいなと思います。(上から目線ごめんなさい)

計測方法は簡単。
メイクを落として髪を止めて明るい場所で専用のアプリで計測するだけ。

さっそくスッピン時に明るい場所で計測。
診断結果は以下。

ちなみにパーソナルカラーも診断してくれます。

ん、ちょっとまって。
私のパーソナルカラーはイエベのはずだが?ブルベって初めてだなぁとググると8割の人がパーソナルカラーがブルベ夏になるという記事を多数発見。(気になる人はググってね)

ZOZOGLASSの計測結果は参考程度にということで。
ファンデーションの色選びはやっぱり自分の目で見て決めたいなと思いました。

パーソナルカラーについては、最近はメイクでもファッションでもパーソナルカラーをベースに考えるのが主流となっていますが、私はパーソナルカラーは参考にはするけどそれに囚われるのは嫌なので、自分に似合う色を知りつつ自分の好きな色をうまく取り入れていけたらいいなと思っております。