AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Ruby のメモリ消費量が増える?

bugs.ruby-lang.org

へー、と思いながら見ていた。

Ruby 3.1.5, Ruby 3.2.3 あたりが出たときに修正されるのかな? という感じだったので注意しておきましょう。

(まさにどっちのバージョンも本番運用しているけど、以前のバージョンと比較できる環境がないのでメモリ使用量が増大しているかはわからないのだった

macOS 環境の ColdFusion 2023 (JRE17) で jmxremote ができなかった

jmxremote

java の引数に指定する、いわゆるこういうやつ。

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.registry.ssl=false

これが掲題の通り、 macOS 環境の ColdFusion 2023 (JRE17) で動作しなかった。

今ってデフォルトで有効化されてんじゃないの?

確認する限りだと Java 8 あたりでデフォルト有効化されているっぽかった。

docs.oracle.com

docs.oracle.com

とはいえ以下のような記事もあり、過去には ColdFusion 付属の JRE 環境でも jmxremote が動いている模様は観測されていた。

serverfault.com

boncode.blogspot.com

動かなかった理由

わからん。

jvm.config ファイルを直接編集したり、 ColdFusion Administrator の JavaJVM 項目から変更してみたりしたけど、結局バンドルされている JRE では動作させることができなかった。

結局どうした

掲題の通り macOS 環境で、なおかつ anyenv を利用していたので、 jenv をインストールしてから brewopenjdk@17 パッケージをインストールして、 ColdFusion を配置したディレクトリ以下で jenv local openjdk64-17.0.8.1 などしたあと、 ColdFusion が利用する Java を入れ替えた。

cfassociates.samuraiz.co.jp

手順

備忘録として雑に記載しておく。

❯ anyenv install jenv
❯ exec $SHELL -l
❯ brew install openjdk@17
❯ jenv enable-plugin exportexec $SHELL -l
❯ sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk
❯ echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
❯ jenv add `/usr/libexec/java_home -v "17"`cd ~/Workspace/ColdFusion_2023_WWEJ_macos
❯ jenv local openjdk64-17.0.8.1

この後 ColdFusion Administrator なり jvm.config ファイルなりから Java へのパスを書き換えて ColdFusion プロセスを再起動すれば設定される。

〜などを使うとうまく読み取ってくれないので pwd でフルパスを表示させておくと良い

ちなみにシンボリックリンクを貼るトコは brew でインストール時に表示されるが、忘れた場合は brew info すると教えてくれるので活用しよう。

❯ brew info openjdk@17
==> openjdk@17: stable 17.0.8.1 (bottled) [keg-only]
Development kit for the Java programming language
https://openjdk.java.net/
/opt/homebrew/Cellar/openjdk@17/17.0.8.1 (635 files, 305MB)
  Poured from bottle using the formulae.brew.sh API on 2023-10-16 at 18:25:37
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/openjdk@17.rb
License: GPL-2.0-only with Classpath-exception-2.0
==> Dependencies
Build: autoconf ✘, pkg-config ✔
Required: giflib ✔, harfbuzz ✘, jpeg-turbo ✔, libpng ✔, little-cms2 ✔
==> Requirements
Build: Xcode (on macOS)==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

openjdk@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have openjdk@17 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk@17 you may need to set:
  export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"
==> Analytics
install: 30,027 (30 days), 91,023 (90 days), 185,024 (365 days)
install-on-request: 20,494 (30 days), 61,393 (90 days), 109,428 (365 days)
build-error: 106 (30 days)

openjdk への切替後

改めて jmxremote 周りの記述を jvm 設定として投入する。

結局これを設定して何がしたかったか、というと、VisualVM などで JVM メトリクスをウォッチしたかった。

無事取得できた

ある処理がデータ取得・整形など走ったりしていてめちゃくちゃ重く、なおかつ集計対象として時間軸に比例して増えるテーブルをフルスキャンする仕様で、直接 JVM 側にアタッチしたかったという所から始まったのだけど、めちゃくちゃ時間がかかってしまった。 次はリファクタリングだ……。

というわけで jmxremote がなんか動かねえんだけど! という人はバンドルされている Oracle JRE から OpenJDK などに変更してみてください。 ちなみにこれ本番系では推奨されない (動作保証環境から逸脱する) のは当然なので、開発や検証などの環境にとどめておきましょう。

git(hub) の revert

Github には revert ボタンがあるのでカジュアルに使いがちだけど、 compare で差分 0 になるのなんでなんだろう、と思っていたら同じような悩みの人はいるのだった。

ja.stackoverflow.com

結局のところ、 revert を指定するコミットで含まれるファイルに、より後のコミットで変更があれば差分が出てくるという理解でよさそう。

revert は打ち消しというより無効化

git-scm.com

man を読んでもいまいちわからねえし、日本語ドキュメントでは打ち消しと表現されるけど、個人的には revert は無効化であると思う。

指定したコミットに含まれる変更内容をすべて無効とする。 なので、同じ内容の変更をもう一度 push しても、 Github などの画面上で差分が出ないという理解だ。

feature ブランチを作らず (main|staging|develop|master) に直接 push してしまった!

revert したいモチベーション、おそらく初期に罹患するのはこのあたりだと思う。

で、とりあえず Github 上から revert して PR 出して merge すると、該当ブランチの HEAD から消えるので「よかったよかった」となり、再度 feature ブランチを作成して、同様の修正を push する。 そうすると差分が出ずに「ナ、ナンデ!?」となる。

ここで取るべきは、 revert の revert と言われるやつである。 まあ直感的に分かりづらいのだけど、 revert した内容とまったく同一の内容を復活させるには revert しかない、と思っておけば良い。

なのでこの場合、feature ブランチに push すべきなのは、個々のファイルではなく revert したコミットを再度 revert する、というコミットだ。

コンフリクト

revert というか歴史修正系でよくあるのが、 conflict するのが嫌でやりたくない、というやつ。 わかるんだけどそれはお前の罪なのでやれ。 どうすれば良いかわかんなかったら、修正内容をまとめて git おじさんかおばさんに頭を下げるしか無い。

万能の解決方法はないのだ。

いや僕もこのあたりは「git は (SVN など先発とは違って) 頭がいい」という説明をよくされたので、いわゆる merge の際の挙動がすごいのだと思っていた。 実際はそうではない。 そうではないのだ……!

つらい。

自分で書いていて

よくわからなくなってきた。 備忘録みたいな記事のつもりだったのに。

参考

qiita.com

zenn.dev

Branch Protection Rule

とりあえず PullRequest 必須にしておいて直接 push されないようにして置けば最低限いいかな、という感じ。

Branch name pattern

[main,develop]*

tech.motoki-watanabe.net

ちなみに上記の条件だと、予想外のブランチが引っかかることがある (実際引っかかった)。

作業ブランチの大本 (main や develop など) 単独で保護する、とかでも全然作業回っているので、あえて上記のように複数設定する必要はなさそう。

備考

大正義クラスメソッドくんも「個別にルールを作れ……」と言っています。

dev.classmethod.jp

Protect matching branches

とりあえず PR 必須にする

zenn.dev

homebrew でインストールした httpd の使いかた

Docker 化できないフレームワークを使うハメになっているので、久しぶりにシステムワイドで色々入れている。

インストール

❯ brew install httpd

プロセス操作

起動
❯ brew services start httpd
停止
❯ brew services stop httpd
ステータス確認
❯ brew services info httpd

ドキュメントルート

  • /opt/homebrew/var/www

デフォルトポート

コンフィグファイル

The default ports have been set in /opt/homebrew/etc/httpd/httpd.conf to 8080 and in /opt/homebrew/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.

❯ gls /opt/homebrew/etc/httpd/
total 100K
drwxr-xr-x  7 donbulinux admin 224 11 23  2022 .
drwxrwxr-x 25 donbulinux admin 800  9 22 19:10 ..
drwxr-xr-x 15 donbulinux admin 480  2  3  2023 extra
-rw-r--r--  1 donbulinux admin 21K 10  2 18:38 httpd.conf
-rw-r--r--  1 donbulinux admin 13K 10  2 18:38 magic
-rw-r--r--  1 donbulinux admin 60K 10  2 18:38 mime.types
drwxr-xr-x  4 donbulinux admin 128 11 23  2022 original
http
  • /opt/homebrew/etc/httpd/httpd.conf
https
  • /opt/homebrew/etc/httpd/extra/httpd-ssl.conf

AmazonLinux2 とかそのあたりに Noto フォントを入れる、 fontconfig で

SVG を PDF 出力する必要があるんだけど、 SVG にアウトライン化されていない日本語テキストが存在していて「こいつはどうすれば……?」となっていた。

続きを読む