eyecatch
Sat, Apr 16, 2016

Pcap4J in Kotlin

Groovyに続いて、KotlinでPcap4Jを使ってパケットキャプチャしてみた。 KotlinからでもPcap4Jちゃんと動くよということを実証するのが主な目的。 また、今後JavaなアプリはKotlinで書こうかと思っているので、その予習も兼ねている。 (adsbygoogle = window.adsbygoogle || []).push({}); Kotlinとは KotlinはJVM言語、つまりJavaのバイトコードにコンパイルされてJavaの実行環境で動くプログラミング言語のひとつ。 IntelliJ IDEAで有名なJetBrains社によってOSSとして開発されている。 2011年に生まれた新しめな言語で、2016/2/17にv1がリリースされ、主にAndroidアプリの開発用として注目されている。 「実用的」であることを売りにしていて、つまり少ない学習コストで導入でき、既存のJavaコードやMavenなどのツールとの相互運用性を持つとされている。 IntelliJ IDEA、Android Studio、Eclipseといった主要なIDEのサポートもあり、開発環境は整っている。 v1以降の後方互換性の維持も表明されていて、長期サポートが必要な製品開発にも堪える。 さらに、厳格な静的型付けやNullable/Non-Null型などにより安全性を確保しつつ、型推論やラムダ式などで生産性を高めている。 Javaのバイトコードだけでなく、JavaScriptを生成するバックエンドを持っているのも大きな特徴。 ユースケースがよく分からないが。 GitHubにホストされているKotlinプロジェクトは、2016/4/15現在、全体の 0.1% (3493⁄3215549) しかない。 v1のリリースは結構注目を集めたので、この割合は今後増えていくと期待される。 Kotlinのインストール チュートリアルに従えば、IDEやテキストエディタ+コマンドラインの環境を整えてHello Worldを書いて実行するところまで簡単にできる。 筆者はEclipse(Mars)とコマンドラインの環境をWindows 7上で作った。 Kotlinのバージョンは1.0.1-2。 コマンドラインについては、GitHub Releasesからアーカイブをダウンロードして、適当なところに展開してbinフォルダにパスを通すだけ。 前提となるJavaについては、環境変数JAVA_HOMEを設定するか、javaコマンドにパスを通せばいい模様。 因みにKotlinの書き方は、Kotlin Koansという例題集をオンラインのIDEで解きながらを学ぶことができる。 パケットキャプチャ with Pcap4J in Java Pcap4Jでパケットキャプチャするコードを普通にJavaで書くと以下の様になる。 (Groovyの時のと一緒。) これを実行すると、パケットキャプチャするネットワークインターフェースを選択し、5つのパケットをキャプチャしてタイムスタンプと共にコンソールに表示する。 パケットキャプチャ with Pcap4J in Kotlin 上記処理をKotlinで書くと以下の様になる。 メインクラスはGroovy同様書かなくていいが、main関数は必要。 型推論があってとても楽。 ラムダ式、補間文字列(String interpolation)、名前付き引数といったモダンめな機能は普通に使える。 (名前付き引数はJavaで書いたメソッドをKotlinから呼ぶときは使えない。) オープンクラスを実現する機能であるExtensionsをPcapHandleに使ってみた。 なんだか便利そう。 Nullable/Non-Null型がすごい。言語仕様でNullPointerExceptionが発生しないように守ってくれる。 例えばfilterは宣言の時点では初期化文でnullが入る可能性があるのでNullableなStringという型に推論されるが、filter?.letというNullチェックをするメソッドに渡したブロック内では自動でNon-NullなStringにキャストされ、filter.lengthを安全に評価できるようになっている。 Nullチェックをしないでfilter.lengthと書くとコンパイルエラーになる。すごい。 けどJavaのコードから返ってくるオブジェクトは普通、プラットフォーム型というものになり、このNullセーフな仕組みが働かない。 これに対してはNull可能性アノテーションを使えば幸せになれるらしい。 さらに、上記コードには表れていないが、キャストも安全になっている模様。(cf. スマートキャスト、セーフキャスト) Kotlinは基本コンパイラ言語なので、上記コードを実行するには以下ようなコマンドで一旦コンパイルする必要がある。 kotlinc -cp pcap4j-core.jar Pcap4jLoop.kt