AWS Lambda と Log4j2 で困った話

TD;TR maven-shade-plugin がハマりどころ 結構新しい問題だった AIも使いよう 何が起きたのか? 久し振りに、 AWS Lambda を触ったんです。 AWS EventBridge と組み合わせて、簡易なバッチとして動かそうと。 で、実際に Lambda Function を FatJARにしてデプロイしたら、あれ? log4j2.xml のパースに失敗して、起動できない??? ローカルでは動くのに…。 まず、 pom.xml に log4j2 の BOM を設定 <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>2.23.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 依存関係に log4j-slf4j2-impl と aws-lambda-java-log4j2 を足す。 <!-- Logging--> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> </dependency> log4j2.xml は、公式にある、一番シンプルなもの1 を置く。 そうすれば slf4j → aws-lambda-java-log4j2 → log4j2 で行けるよね?? って思ってたら、上記の如く、起動しないのです。 結局のところ これは、自分で検索したりしてもダメっぽいな…、と思ったので、Windows11付属のAIアシスタント、Copilotに質問したのですが、要領を得ない解答で少々困ってしまって。 ハレーションを起こさなかっただけマシかもですが。
Read full post gblog_arrow_right

RancherDesktopが "Error: wsl.exe exited with code 429496729" で起動できなくて困った話

TR;TD WSLのディストリビューションを消すだけで解決するよ 先達には感謝ですね 何が起きたのか? ある日、PCを再起動したら、RancherDesktopがエラーで起動しなくて。 Error: wsl.exe exited with code 4294967295 こう言うのは、PCを再起動すれば、概ね解決…、しない! 解決策 でも、先に踏んで解決して下さった方がいたんです! 【Docker】Windows10でRancher Desktopを起動するとエラーになる #kubernetes - Qiita Error Starting Rancher-desktop on Win10 with wsl error · Issue #2256 · rancher-sandbox/rancher-desktop で、自分で試して分かったんですけど、結局、WSLのディストリビューションを消すだけで解決しましたね。 RancherDesktopを終了させる WSLのディストリビューションを確認後、それを消し、WSLをシャットダウン > wsl -l -v * rancher-desktop Stopped 2 * rancher-desktop-data Stopped 2 > wsl --unregister rancher-desktop > wsl --unregister rancher-desktop-data > wsl --shutdown その後、RancherDesktop再起動 これで解決しました。 ただ、Dockerイメージをpullする時のレイヤーのキャッシュとか全部消えちゃうんで、再度コンテナを立ち上げる時は時間がかかりますね。 結局のところ 「少しのことにも、先達はあらまほしき事なり」1 とは昔からの伝えでしたよね。 徒然草第52段 ↩︎

2024年9月 Daggerでバッチを作りたいだけだった

https://github.com/halflite/batch-daggar-example 作りました。 単に標準出力にログを出すだけですが…。 実は「Daggerでバッチプログラム」って全然サンプルないんですよ。 Daggerって、Android用のフレームワークだと思われているのかもしれませんが…。 依存ライブラリ Maven設定 DaggerとJakarta EE 結局のところ 依存ライブラリ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ---------------------< batch.daggar.example:batch >--------------------- [INFO] Building batch 1.0.0 [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- dependency:3.6.1:tree (default-cli) @ batch --- [INFO] batch.daggar.example:batch:jar:1.0.0 [INFO] +- com.google.dagger:dagger:jar:2.52:compile [INFO] | +- jakarta.inject:jakarta.inject-api:jar:2.0.1:compile [INFO] | \- javax.inject:javax.inject:jar:1:compile [INFO] +- org.apache.geronimo.config:geronimo-config-impl:jar:1.2.3:compile [INFO] | \- org.eclipse.microprofile.config:microprofile-config-api:jar:1.4:compile [INFO] +- org.apache.logging.log4j:log4j-slf4j2-impl:jar:2.23.1:compile [INFO] | +- org.apache.logging.log4j:log4j-api:jar:2.23.1:compile [INFO] | +- org.
Read full post gblog_arrow_right

2024年8月 Javaプログラミングで "Hello World" を出したいだけだった

前回、2021年6月 Javaプログラミングで “Hello World” を出したいだけだった の続き。 と言うか、自分で何かしらの結果を出したいですしね。 開発環境は、 VSCode と Rancher Desktop だけでやってみます。 自分で作ってみた 結構面倒くさいポイントその1 Guice-Servlet初期化 結構面倒くさいポイントその2 FreemarkerServlet のパッケージ 結構面倒くさいポイントその3 FreemarkerServlet の設定値 結構面倒くさいポイントその4 java.util.logging(jul) 〆の感想 自分で作ってみた halflite/guice-freemarker-servlet: Guice / Freemarker / Servlet で、自分で作ってみました。結構面倒くさい! これに関しては、幾つかの縛りがあります。 例えば「“Hello World"を出せるくらいの小さいアプリを…」と言われた時、大抵下記のような前提が言外にあると思っても良いでしょう。 コンパイル&ビルドに迷いたくないよね 立ち上げるのには、それなりの速さが欲しいよね 当然、仮想化が前提にあるよね それなりにDI出来るコンテナ欲しいよね 設定値をDI出来る仕組み欲しいよね HTMLテンプレートも欲しいよね APIとして使うことを考えてJSONも出力して欲しいよね ログを統一的に出す機構が欲しいよね (所謂) The Twelve-Factor App ですよね。 そこら辺を踏まえた上での、自分が考えるアーキテクチャは以下です。 コンパイル&ビルドは Maven サーバーは Jetty Embedded DIは Guice/Guice-Servletに従う 設定値の取得は Apache Geronimo/MicroProfile Config HTMLテンプレートは(多分)一番シンプルな FreeMarker JSON出力は、一番軽量で早い Gson ログは Slf4j/Log4j2 JavaでWebアプリケーションで避けて通れないのが、Java EE -> Jakarta EE への移行でしょう。 あれ、単にパッケージを変えただけでも大概OKなんですが、それでもソース書き換えて再ビルドは、相当きついかもですよ。
Read full post gblog_arrow_right

続:Java NIO2 で一時ファイルを作成、処理後に削除

前回の修正版です public void doSomething() { try { Path tempFilePath = Files.createTempFile("id", ".tmp"); try (Writer writer = Files.newBufferedWriter(tempFilePath)) { // do something. // 終わった後に一時ファイルを削除したい } } catch (IOException e) { // ログとか出したり、または、別の例外再スロー } } 前回書いた Files.newBufferedWriter(tempFilePath, StandardOpenOption.DELETE_ON_CLOSE) って、OSや権限で効かない場合もある、って知りました。 って言うか、自分で地雷を踏んでしまったんですけどね。 で、簡易的な解決だと、以下のようにしたら良いと思います。 public void doSomething() { try { Path tempFilePath = Files.createTempFile("id", ".tmp"); try (Closeable closeable = () -> Files.deleteIfExists(tempFilePath); Writer writer = Files.newBufferedWriter(tempFilePath)) { // do something. } } catch (IOException e) { // ログとか出したり、または、別の例外再スロー } } Closeable の匿名クラスを作って、try-with-resources 構文の中で、一時ファイルを削除する、と言う処理ですね。 Java 17 で書きましたが、 Java SE 8 でも動くと思います。

2024年 Javaベースのバッチを作るなら その2 プロジェクトを作る

前回、2024年 Javaベースのバッチを作るなら その1 環境と初期設定 の続き。 開発環境は、 VSCode と Rancher Desktop だけでやってみます。 プロジェクトを作る 依存ライブラリを追加 実行クラス プロジェクトを作る まずバージョン確認 > mvn --version Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae) Maven home: /usr/share/maven Java version: 21.0.3, vendor: Amazon.com Inc., runtime: /usr/lib/jvm/java-21-amazon-corretto Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.15.146.1-microsoft-standard-wsl2", arch: "amd64", family: "unix" 初期プロジェクト作成 1 mvn archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false \ -DartifactId=csvbatch \ -DgroupId=app \ -Dpackage=csvbatch.app このようなプロジェクトが作られます。 . |-- LICENSE |-- README.md `-- csvbatch |-- pom.
Read full post gblog_arrow_right

2024年 Javaベースのバッチを作るなら その1 環境と初期設定

前回、2020年 Javaベースのバッチを作るなら の続き。 Windows11での開発だと、これが今のところ、自分なりに、まぁまぁ良い手順かな、と言うのを書きます。 要件として、「DBから昨日のデータ取ってきて、CSVに変換、メールで管理者に送信」を想定しています。 Rancher Desktop をインストール、起動 1 Visual Studio Code と その拡張 Remote Container をインストール リモートの Git で新規リポジトリを作成 チェックアウト 2 Visual Studio Codeでフォルダーを開く .devcontainer と言うフォルダーを作る 配下に3ファイル作る Dockerfile devcontainer.json docker-compose.yml . |-- .devcontainer | |-- Dockerfile | |-- devcontainer.json | `-- docker-compose.yml |-- .gitignore |-- LICENSE `-- README.md .devcontainer/Dockerfile 3 # Amazon Corretto with Java 21 / Debian 12 FROM maven:3.9-amazoncorretto-21-debian-bookworm RUN apt update && apt -y install git && \ unlink /etc/localtime && \ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime .
Read full post gblog_arrow_right

Docker/VSCode/Hugo/Bitbucket/Netlifyでブログを書く技術

音楽ブログ を数年書いているのですが、安いWindows11環境で、以下のような技術スタックで書いています。 前回 の続編です。 要点 秘密鍵/公開鍵は難しいけど、頑張って! netlify.toml がハマりどころ 環境 Rancher Desktop で Docker/仮想環境を作る Visual Studio Code (所謂)“VSCode” を使って Markdown で書く Bitbucket にコミット/プッシュ Netlify で公開 これ、一回慣れてしまうと簡単なんですけど、それまでが四苦八苦だったので、備忘録代わりに書いておきます。 VSCode をインストール Git for Windows も、事前にインストールしておきましょう 拡張機能 日本語拡張 と Dev Containers は必須でしょうね。 Rancher Desktop/WSL2 をインストール Rancher Desktop をインストールする際、最近はWSL2/Ubuntuが自動で入るみたいですね Bitbucketで、とりあえずリポジトリを作ってCloneする プライベートリボジトリで作るのが良いでしょう ローカルにクローンします。 これがプロジェクトになります。 公開/秘密の鍵ペアを作り、Bitbucketに公開鍵を登録する WSL2の中身はUbuntuなので、ターミナルから、Ubuntuを選び、以下で鍵ペアが作れるのではないでしょうか ユーザー名はC:Users配下の、自分のディレクトリを参照して下さい bitbucketに公開鍵を登録するのは、公式手順に従うのが良いでしょう Windows で個人用 SSH キーをセットアップする | Bitbucket Cloud | アトラシアン サポート sudo ssh-keygen ls -la /root/.ssh/ # 公開鍵を表示 sudo cat /root/.
Read full post gblog_arrow_right

pom.xmlでEclipseの設定を定義する

Eclipseの設定を pom.xml に記述します。 Java17 / Maven 3.9.6 を想定しています。 文字コードはUTF-8、改行コードはLFになるように設定しています。 外部のライブラリのソースとJavadocも、ローカルにダウンロードするように設定しています。 <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.10</version> <configuration> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> <additionalConfig> <file> <name>.settings/org.eclipse.core.resources.prefs</name> <content> <![CDATA[eclipse.preferences.version=1${line.separator}encoding/<project>=${project.build.sourceEncoding}${line.separator}]]> </content> </file> <file> <name>.settings/org.eclipse.core.runtime.prefs</name> <content> <![CDATA[eclipse.preferences.version=1${line.separator}line.separator=\n${line.separator}]]> </content> </file> </additionalConfig> </configuration> </plugin> </plugins> </build> 上記を pom.xml を書き足して、以下のようにコマンドでEclipse設定ファイルを作り直します。 mvn eclipse:clean eclipse:eclipse 大抵のEclipseの設定にはm2eが入っているでしょうし、m2eでEclipse設定ファイルを更新するのもありでしょう。 まだまだ現役なEclipseとMaven、ついつい設定忘れがちなので、書き残してみました。1 2020/05/04 MavenでEclipseプロジェクトを更新した際に、ソースコードの文字コードをUTF-8にする に、加筆修正して、再度公開しました。 ↩︎

ブログのデザインを変えました

このブログはHugoで構築しているんです。 Hugo の良いところは、「テンプレートと描写エンジンが別れている」でしょうか。 でも、それはタテマエ。 テンプレートが、かなりエンジンに依存しているんですね。 作ってメンテされていないHugoのテンプレートは死屍累々、GitHubは、もう恐竜の墓場以下の存在です。 結局、数年毎に、テンプレートを置き換えて、都度都度のデザインの良いものにする。 これがベストプラクティスなのかもしれません。 今回、使ったのはGeekblog まぁまぁ、設定も素直ですし良いのではないでしょうか? Favicon覚え書き。 ジェネレーターで基本を作る Favicon Generator - Text to Favicon - favicon.io フォント Kaisei Tokumin - Google Fonts Font Color #FFFFFF Background Color #209CEE ダウンロードしたzipファイルを解凍 themes/hugo-geekblog/static/favicon に favicon.ico favicon-16x16.png favicon-32x32.png をコピー themes/hugo-geekblog/layouts/partials/head/favicons.htmlを修正 <link rel="icon" type="image/x-icon" href="{{ "favicon/favicon.ico" | relURL }}" />