snapshot testingのライブラリを書いた #go

書いた。github.com なぜ書いたか snapshot testingのライブラリを使ってライブラリを作ろうとしていたが いまいち使い勝手が合わなかったので、機能を落としたものを作った。試したのは以下の2つだが、goldieのほうが挙動としては近かったが 使い方には合わ…

AWS SQSの代替として使える elasticmq の公式dockerイメージでqueueを起動時に作る方法

elasticmqの公式dockerイメージでqueueを起動時に作成する方法を紹介します。 動作は、softwaremill/elasticmq:0.15.7で確認しました。 TL;DR 環境変数JAVA_OPTSに "-Dconfig.override_with_env_vars=true" を追加する CONFIG_FORCE_queues<your-queue-name>fifoに "false" を</your-queue-name>…

goでJavaのクラスファイルのパーサを書いた

そういえば、書いたことがないなぁと思って、Javaのクラスファイルのパーサを書きました。 Java SE 15のJVM Specification だけを見ながら フルスペックのクラスファイルのパーサを書きました。 書いたけど、パース出来るだけで pretty printが出来たり、な…

Javaでcloud profilerを使ってpprofフォーマットのプロファイルデータをローカルに出力する

cloud profilerにはローカルに、pb.gzフォーマットでプロファイルデータを出力する機能がある。 このファイルは、pprofのprotocol bufferをgzip圧縮したものだ。 やり方は以下のような形でagentに -cprof_profile_filename パラメータを渡して下さい。パラメ…

OpenJDKのJavaのコンパイラは標準ライブラリのシンボルデータを別途持っていて --release でビルドした時はそのデータが使われるようだ

Spotbugsのビルドを弄ろうとしていて気になったので調べてみた。 以下のように、--releaseと-source/-target を使った時で挙動が違う。 まずはじめにSpotbugsの話になるが、Spotbugsにはツールの特性上、テストケースとしてJavaファイルを中に溜め込んでいる…

Gradle 6.7 で リリースされる Toolchain support for JVM projects を試してみる

Gradle 6.7 (現在 6.7 rc-3がリリースされています) から導入される Toolchain support for JVM projects という機能を試してみます。 この機能で何が出来るのかというと Gradle を動かすJVMとコンパイルやテストで使うJVMを簡単に分離することが出来るよう…

Windowless moving percentileをgoで実装してみる

Windowless moving percentileとは指数平滑移動平均(Exponential moving average)をベースにしたパーセンタイル値の予測方法で 名前の通り、windowlessということで、windowなしにパーセンタイルの予測が可能で、メモリ効率や計算効率が良い。 windowとは、…

EC2インスタンスの秘密鍵の管理から開放される ssos (ssh-setup-over-ssm) をリリースした

EC2インスタンスに入りたい時ってたまにないですか? EC2インスタンスのsshの秘密鍵の管理をどうしよう、とか EC2インスタンスのユーザの管理をどうしよう、とか悩みますよね。 今回リリースした、ssos (ssh-setup-over-ssm) を使えば EC2インスタンスを使い…

Docker/KubernetesにおけるNode.js: ヒープサイズがcgroupのlimitを見て決められるようになるのは v12.7.0から

仕事で気になって調べたので書いておきます。Node.jsは v12.7.0以降じゃないと cgroupのmemory limitを見てくれません。 つまり、v12.7.0より前のバージョンのNode.jsでは、ヒープメモリの容量を設定するオプション `--max-old-space-size`を使う必要があり…

vue + composition-api + typescript + jest + eslintのリポジトリをセットアップした

リポジトリは下。 github.com 最近 Vue追ってなかったので、Vueの大きなアップデートを見ていた。 で、気になったのが下のようなツール周りの変化を知りたいなぁと思って サンプルリポジトリを構築した。 VueはちゃんとTypeScriptで構築した記憶がなかったの…

Spring Bootのデフォルトのヘルスチェック全てを無効にする

デフォルトで設定されるヘルスチェックを無効にしたい場合があると思います。 例えば、セッションストアとして使っているredisが落ちた場合にredisを使っていないエンドポイントがあるので サービスとしては落ちて欲しくない、というケースです。 その場合は…

SRVレコードを使ってgoでサービスディスカバリ経由で内部通信を行ってみた雑感

試してみた結果、厳しい気持ちになった。 なお、今回試した結果はgoの標準ライブラリの挙動をベースにしているので その他通信ライブラリ、ランタイムでの挙動を保証するものではないので注意されたし。 結論としては、可用性の高いLoad Balancerというもの…

goでmigrationをsingle binaryで提供する

goといえば、シングルバイナリだと思うんですが Databaseのマイグレーションはどのように適用していますでしょうか? 今回はgoでマイグレーションをシングルバイナリで適用する方法を考えてみたのでここに書いておきます。 はじめに 僕はJavaのWebフレームワ…

CIでAmazon ECRにDockerイメージをpushするときのプラクティス

ECRにpushするとき、皆さんはどうやってECRの認証をしていますか? 大体の人が、aws cliをインストールして認証しているのではないかと思っています。 今回はAmazon ECRへPushする仕事があったので、一から見直してみた結果をここにまとめておきます。 いく…

emc v0.0.2をリリースしました

以下で書いたJVMのメモリ設定をアプリケーションのjarファイルから自動で計算してくれるツールです。 progret.hatenadiary.com v0.0.2をリリースしました。 リリースされた機能は以下の一つです。 [experimental] ラムダ式をクラスファイル数にカウントする …

GradleのBOMの機能を使う場合、依存関係のバージョンを古いバージョンで上書きすることはできない

これはGradle 5.0, 5.1, 5.2, 6.1.1で再現しています。 間のバージョンでは再現しないかもしれません。 BOMによって依存関係のバージョンを管理してる際に enforcedPlatformを使ってないのにも関わらず、プロジェクトで個別に依存関係の上書きができる場合と…

cloudfoundry/java-buildpack-memory-calculatorをベースに自動でクラスファイルを数えてJVMのメモリ周りのオプションを吐いてくれるツールをGoで再実装した

これは出落ち感があるんですが 既にmaking/memory-calculator-cnbというものがあり UberJarやディレクトリに入ってるクラスファイルを再帰的に、cloudfoundry/java-buildpack-memory-calculatorを使ってJVMオプションを吐いてくれます。 というわけで、今回…

Go言語でつくるインタプリタを読み終わった

Go言語でつくるインタプリタを読んで 実際に動くインタプリタを書いたので記事として残しておく。 感想 ここ1週間半程度、この本を読んでいた。 気分転換に楽しい本でも読もうと思って Go言語でつくるインタプリタを開いた。 写経しながら読んだが、良い本…

latestタグのままdocker imageを本番運用してどうなったか

latestタグや書き換えるためのタグ(develop, stagingなど)を使って、本番で運用するのはやめましょう。 コンテナイメージのキャッシュ状況やリリースフローによっては予期しない形で 予期しないバージョンが本番で起動する可能性があります。 本記事では、…

JUnit JupiterのAutomatic Extension Detectionを使って簡単にテストのログにコンテキストを付与する

今回使った実装を使えば、どういうテストで実行された処理なのかが明確に分かるようになります。 使い方です。 class MdcExtensionTest { @Test public void test() { assertThat(MDC.get("test.displayName")).isNotNull(); assertThat(MDC.get("test.id"))…

Quarkusに入っているQuteというテンプレートエンジン単体で使ってみる

QuarkusにはQuteというテンプレートエンジンが入っています。 今回は、これをQuarkusじゃないプロジェクトで使ってみます。 使ったバージョンは1.1.1.Final です。 quarkus.io 今回のコードは以下のリポジトリにおいてあります。 github.com quarkus-sandbox…

java.lang.reflect.Proxyで生成されるバイトコードをファイルに出力する方法

いつから実装されたのか分からないが ファイルに出力する方法があったので書いておく。 やり方としては以下のパラメータを渡すだけ -Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true を引数で渡すだけ(※) 実際に動作確認をしたのは以下のJava。 他の環…

morganでアクセスログを書き込みつつ、書き込み先を自前のロガーに変える #Node.js

Node.jsのサーバーでアクセスログ出してますか? morganを使って吐きましょう。 今回紹介するのはNuxt.jsで使う場合のものですが expressとかでも似たようなコードで対応できるはずです。 morganの書き込み先を自前のロガーに書き換える 毎回morganの関数を…

Node.jsでwinstonを使ってログをJSONで出力する

こうします。 const winston = require("winston") const logger = winston.createLogger({ level: "info", format: winston.format.combine( winston.format.timestamp(), winston.format.splat(), winston.format.json() ), defaultMeta: { service: "my-a…

console.logをlogger.infoに置き換えてくれるeslint-pluginを書いた

Node.jsのアプリケーションのログをJSONログに変えたいが、全部自分で置き換えるのは面倒なので console.logからロガーを使ったコードに書き換えてくれるeslint-pluginを書きました。www.npmjs.com 以下のようなコードを自動で置き換えます。 // エラーとし…

DatadogのAutoDiscovery機能を使ってPrometheusのエンドポイントを叩いてメトリクスをDatadogに送る

DatadogのAutoDiscovery機能があるのを知ったので試してみたよ、という記事です。 今回は簡単に設定を試すために docker-composeを使って試してみました。 はじめに Spring BootのActuatorエンドポイントには Prometheus向けのフォーマットでメトリクスを公…

コネクションのIDを割り振ってMDCにputする

本番でのご使用はご注意ください。 あとJDBCドライバ固定のコードになっているので注意してください。 タイトル通りなんですがコネクションのIDを割り振ってMDCにputするコードを書いたので ここに書いておきます。 なぜこんな物を書いたかというと コネクシ…

MyBatis経由で実行するSQLにリクエストID入れてみる。ダーティハックだけど。

MyBatis経由で実行される全てのSQLに対して SQLコメントを追加したい気持ちになったので 簡単にどうやるのかを書いておく。 stackoverflowにも質問を書いたけど ググってたら思いついてしまった。(ほぼコピペだけど) ちなみにリフレクションでこじ開けるの…

AWS X-Rayを有効にしてLambdaで実行した場合に `X-Amzn-Trace-Id` はどこからやってくるのか

調べたのでメモしておく。 結論: 環境変数から取ってきている。 node での使用例を見ると 以下のような形で利用できる模様 // これでAWSの呼び出しがX-Rayに記録される var AWS = AWSXRay.captureAWS(require('aws-sdk')); これをソースコードから追ってみる…

JavaユーザならCode FormatterにはSpotlessがオススメ

CIでフォーマッタ掛けてフォーマットのチェックしてますか? プロジェクトでフォーマットがある程度統一されていると落ち着きませんか? コードフォーマッタで悩んでいる、という人にオススメのツールとして Spotless というツールを紹介します。 記事の構成…