WiresharkのプラグインをMacでビルドする
Cで書かれたWiresharkのプラグインをMacでビルドしたときのメモ。
手順
準備
Wiresharkをインストールする
% brew install wireshark --cask
インストールしたWiresharkと同じバージョンのソースコードをダウンロードする(今回は3.4.5)
% git clone https://github.com/wireshark/wireshark -b wireshark-3.4.5
ビルドに必要なライブラリをインストールする
% wireshark/tools/macos-setup-brew.sh
プラグインのソースコードをダウンロードする(今回はrsocketのプラグインを使う)
% git clone https://github.com/rsocket/rsocket-wireshark
ビルド
プラグインのソースコードをWiresharkのソースコードの中に置く
% mv rsocket-wireshark wireshark/plugins/epan/rsocket
CMakeListsCustom.txt
を作成する
% cd wireshark/ % vi CMakeListsCustom.txt
CMakeListsCustom.txt
にこの一行を追加して、カスタムプラグインのsrc dirを設定する
set(CUSTOM_PLUGIN_SRC_DIR plugins/epan/rsocket)
Wiresharkをビルドする
% mkdir build/
% cd build/
% cmake ..
% make
ビルドが成功すると、build/run/Wireshark.app/Contents/PlugIns/wireshark/3-4/epan/
にプラグインの.soファイルが生成されるので、この.soファイルをインストールしたWiresharkのPluginsフォルダにコピーする
% cp run/Wireshark.app/Contents/PlugIns/wireshark/3-4/epan/rsocket.so /Applications/Wireshark.app/Contents/PlugIns/wireshark/3-4/epan/
Wiresharkの設定
(インストールした)Wiresharkを起動後、「Analyze」-> 「Decode As...」の画面で追加したプラグインを設定すると、プラグインが適用される
参考
https://www.wireshark.org/docs/wsdg_html/#ChSetupUNIXBuildEnvironmentSetup
https://www.wireshark.org/docs/wsug_html_chunked/ChPluginFolders.html
Maven/Gradleでdependencyのupdateをチェックする
MavenまたはGradleでdependencyのupdateをチェックしたいときの備忘録。
% mvn versions:display-dependency-updates
- Gradle
Gradleの場合はgradle-versions-pluginsを使用する。
% ./gradlew dependencyUpdates -Drevision=release
GradleでJava 13のプレビュー機能を試す
GradleでJava 13のプレビュー機能を試したときのメモ。
Gradleは6.0以降を使用する。
Gradle 6.0 Release Notes
ソースコード
build.gradle
--enable-previewを設定する
plugins { id 'java' id 'application' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = JavaVersion.VERSION_13 repositories { mavenCentral() } tasks.withType(JavaCompile) { options.compilerArgs += ['--enable-preview'] } test { jvmArgs = ['--enable-preview'] } run { jvmArgs = ['--enable-preview'] } mainClassName = 'com.example.Main'
Main.java
今回はText BlocksとSwitch Expressionsを試す
JEP 368: Text Blocks (Second Preview)
JEP 361: Switch Expressions
package com.example; public class Main { public static void main(String... args) { String message = """ AAA BBB CCC """; System.out.println(message); System.out.println(isWeekend(DayOfWeek.FRIDAY)); System.out.println(isWeekend(DayOfWeek.SUNDAY)); } private static boolean isWeekend(DayOfWeek day) { return switch (day) { case SATURDAY, SUNDAY -> true; case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false; }; } }
実行結果
% ./gradlew run > Task :run AAA BBB CCC false true BUILD SUCCESSFUL in 470ms
Java 14でNullPointerExceptionの詳細エラーメッセージを表示する
Java 14でNullPointerExceptionの詳細エラーメッセージを表示したいときのメモ。
※追記
Java 15からShowCodeDetailsInExceptionMessages
はデフォルトで有効になった。
https://bugs.openjdk.java.net/browse/JDK-8233014
Demo
Java 14をインストール後、ShowCodeDetailsInExceptionMessages
を有効にしてJShellを起動する
- SDKMANを使う場合
% sdk install java 14.0.0-open % sdk use java 14.0.0-open % jshell -R-XX:+ShowCodeDetailsInExceptionMessages
- dockerを使う場合
% docker run --rm -it openjdk:14.0.2-jdk jshell -R-XX:+ShowCodeDetailsInExceptionMessages
jshell> String message = null message ==> null jshell> System.out.println(message.length()) | Exception java.lang.NullPointerException: Cannot invoke "String.length()" because "REPL.$JShell$11.message" is null | at (#2:1) jshell> /exit | Goodbye
docker-hiveでHive JDBCを試す
Dockerを使ってHive JDBCを試したときのメモ。
準備
ソースコード
build.gradle
plugins { id 'java' id 'application' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() } dependencies { implementation 'org.apache.hive:hive-jdbc:2.3.6' } mainClassName = 'com.example.Main'
Main.java
package com.example; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default"); Statement stmt = con.createStatement(); try (con; stmt) { stmt.execute("CREATE TABLE IF NOT EXISTS table1 (id int, name string)"); stmt.executeUpdate("INSERT INTO table1 VALUES(1, 'user1')"); stmt.executeUpdate("INSERT INTO table1 VALUES(2, 'user2')"); stmt.executeUpdate("INSERT INTO table1 VALUES(3, 'user3')"); ResultSet res = stmt.executeQuery("SELECT * FROM table1"); while (res.next()) { System.out.println(res.getInt(1) + ", " + res.getString(2)); } } } }
docker-hive
今回はHive 2.3を試すため、2.3.2-postgresql-metastoreのブランチをダウンロードする。
% git clone https://github.com/big-data-europe/docker-hive -b 2.3.2-postgresql-metastore
https://github.com/big-data-europe/docker-hive
確認
HiveServer2を起動後、デモアプリを起動する。
% cd docker-hive
% docker-compose up -d
Docker ComposeでMongoDBのReplica Setを使う
Docker ComposeでMongoDBのReplica Setを試したときのメモ。
準備
docker-compose.yml
version: '3' services: mongo01: image: mongo:4.4 command: mongod --replSet rs1 --bind_ip_all ports: - "27017:27017" mongo02: image: mongo:4.4 command: mongod --replSet rs1 --bind_ip_all ports: - "27018:27017" mongo03: image: mongo:4.4 command: mongod --replSet rs1 --bind_ip_all ports: - "27019:27017"
手順
ホスト(Mac)の/etc/hosts
に以下を登録する。
127.0.0.1 mongo01 mongo02 mongo03
Docker ComposeでMongoDBを起動する。
% docker-compose up -d
Replica Setを設定する。
% mongo --port 27017 > rs.initiate({ _id: "rs1", members: [ {_id: 0, host: "mongo01:27017"}, {_id: 1, host: "mongo02:27017"}, {_id: 2, host: "mongo03:27017"} ] })
動作確認
% mongo --host rs1/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019 MongoDB shell version v4.4.3 connecting to: mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/?compressors=disabled&gssapiServiceName=mongodb&replicaSet=rs1
参考
Springfox SwaggerでCSRF tokenを送信する
Spring SecurityのCSRFを有効にしている状態で、SpringfoxのSwagger上でPOST等のメソッドを実行したいときのメモ。
そのままでは試せないが、以下のようなCSRF tokenがを返すエンドポイントを作れば、POST等のメソッドも実行できる。
ソースコード
plugins { id 'org.springframework.boot' version '2.4.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.springfox:springfox-boot-starter:3.0.0' ... }
@Profile("dev") @RestController public class CsrfController { @GetMapping("/csrf") public CsrfToken csrf(CsrfToken token) { return token; } }
springfox 3.0.0からはこの設定が必要。
@Bean public SecurityConfiguration securityConfiguration() { return SecurityConfigurationBuilder.builder() .enableCsrfSupport(true) .build(); }