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を使って試してみました。 2022/09/29追記: 本記事の内容は少し古くなっています。 本記事では、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 というツールを紹介します。 記事の構成…

関数呼び出しの実引数にリテラルをコメント無しで使った場合に警告するLinterを書いてみた #go

以下のリンク先にuberのgoのコーディングスタイルのガイドがあるのですが そこにあるルールに基づいたエラーを吐くLinterを書いてみました。 github.com よく見ると元のルールとは微妙に違うような気がします。 "foo"という文字列を渡してるけど、Goodではそ…

そーだい本、「失敗から学ぶRDBの正しい歩き方」を読みました

「そーだい本」こと、曽根壮大さんが書かれた「失敗から学ぶRDBの正しい歩き方」を読みました。 読み終えたので感想を書いてみます。 gihyo.jp 感想 感想を書く前に、まずは書籍紹介を引用してみます。 「データベースがよく落ちる」「前任者が残したテーブ…

無職になりました

9月末で無職になりました。 正社員として地方からフルリモートで働ける・雇っていただける会社を探しています。 直近のお仕事では、Java/Spring Bootを使ったAWS ECS上で動くアプリケーションの開発や TerraformやAnsibleを使った運用に関わってきました。ま…

運用とログ

アラート起因で調べるベースの運用とログの話を書いておく。 状況確認 状況確認は大事。ひとまず初動で原因が分かると嬉しいので ざっくり状況確認。 ログを読む エラーログを読む なにも出てなかったらWARNを読む メトリクスを見る 5xxエラーを見る どのサ…

Amazon Linux 2にBCCを入れて、Pythonのメソッド実行のトレースをしてみる

今回はBCC(BPF Compiler Collection)のツールを使って Pythonのメソッド実行のトレースをやってみます。 今回の記事の流れは以下のとおりです。 Amazon Linux 2を立ててBCCのインストールをする 検証のためのコードを準備する 実際にメソッドの呼び出しを…

AWS CDKを使ってAWS LambdaにAPI Gateway経由で呼び出す口を用意する

Lambdaを使ってAPIをホストしたい時、何使いますか? AWS CDK、おすすめです。 実際のコード Lambda Functionを中心として、Lambda Functionに関連付けを紐付けるだけで API Gatewayなりのリソースが作成される。 #!/usr/bin/env node import 'source-map-su…

Goの型付きnilで死んだ話

これはどういう結果になるか、分かりますか? package main import ( "fmt" "bytes" ) func Buffer() *bytes.Buffer { return nil } func main() { b := Buffer() fmt.Printf("%T %v", b, b) } こうなります。 型無しnilになって欲しい気持ちだった。 結局、…

DNSの送受信をtcpdumpで見る

apt update && apt install -y tcpdump dnsutils tcpdump -X -n -vv dst port 53 or src port 53 & # dig すればなんか出るはず dig yahoo.co.jp tcpdumpで真面目に見たのは初めてなので ↓を見ながら調べた。 tcpdumpチートシート - Qoosky 28バイトはヘッダ…

2019/07/26 KCL v2周りの話

KCLv2の話 移行はこの辺読んで。Kinesis Client Library 1.x から 2.x への移行 - Amazon Kinesis Data Streams localstackではKinesis Client Library v2はテスト出来ない 内部で使っているkinesaliteでは、新しいAPIがサポートされていない Kinesis Client…

Armeriaで始めるDNSのSRV Recordを使った クライアントサイドロードバランシング

今回は、Armeriaを使って、DNSのSRV Recordを使ったクライアントサイドロードバランシングをやってみました。 ソースコードはこのリポジトリにおいています。 クライアントサイドロードバランシングの必要性については以下の記事を読むと良いかもしれません…

JUnit 5 でどこが変わったのか

JUnit5 でどこが変わったのか、今いるチームの開発メンバや、JUnit5ざっくり知りたい人向けに書いておきます。 この記事では以下の内容について書いていきます。 なぜ移行するか どこが変わったか まとめ なぜ移行するのか なぜ移行するかを簡単に説明してお…

内部で使っているライブラリを JUnit 5 (jupiter) に 移行した

この記事では、JUnit5への移行を行うと共に どういう書き換えをしたかを書いておきます。 以下の内容で書いていきます。 今回移行したプロジェクトの前提 どういう方法で移行するか PMDのアップデート junit 4系の依存を完全に外す junit-jupiterの依存とテ…

Checkstyle 8.13からClassFanOutComplexityでカウントされる対象が増えて死んだ話

以下のリリースノートにこんな記述がありました。 checkstyle.org ClassFanOutComplexity: count complexity base annotations/extends/implements/methods params. Author: kazachka #4092 annotation, extends, implementsで使われているクラスもClassFanO…

ThreadPoolExecutorを拡張してスレッドプールを使いつつもMDCを引き回すようなExecutorを作ってみる

今、Java並行処理プログラミング読んでいて ThreadPoolExecutorというかAbstractExecutorServiceのnewTaskForというメソッドを知ったので 使ってみます。 今回の記事では、ThreadPoolExecutorを拡張して MDC、Mapped Diagnostic Contextを引き渡しながら、タ…