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...」の画面で追加したプラグインを設定すると、プラグインが適用される

f:id:hirakida29:20210325101755p:plain f:id:hirakida29:20210325121056p:plain

参考

https://www.wireshark.org/docs/wsdg_html/#ChSetupUNIXBuildEnvironmentSetup
https://www.wireshark.org/docs/wsug_html_chunked/ChPluginFolders.html

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();
}

参考