Javaからepollを使いたい。開発日誌さて、やりたいことはepollをJNAから使うってことだが、いかんせん、JNA初心者には学ぶことがおおい。そもそもバインドしたい構造体をみてみる。((__packed__));最初は"union"を見逃していたため、後に苦労したが、この構造体のバインドは以下の順番で処理した。(はてな文法のため括弧ひとつ多い)5つ目のpackedされたデータのマッピングは情報がなかなか見つからなかったのでここについて書くことにする。__attribute__(((__packed__)))って?CPUは現在、モバイル機器を除いて、64bitCPUが主流だ。プログラマが考えなければいけないのは、主にレジスタ、パイプライン、キャッシュなどであるが、これらがすべて64bit単位で動く。Cコンパイラはある構造体をコンパイルするときに、CPUからアクセスしやすいように、構造体のアラインメントを行う。これは、CPUからアクセスする単位である8バイトの先頭にデータがくるように、すべてのデータをそろえた方が、アクセス効率が良く、全体的にパフォーマンスがあがるからだ。このため、8バイトの乗数未満のデータはすべて8バイト単位に整列させられる。構造体のネストや配列化がおこる場合、このアラインメントはメモリ効率を落としてしまう。CPUキャッシュはサイズが小さいため、なるべく多くの情報をのせた方がいい。したがって、コンパイラはすべてのソフトウェアを対象に性能をあげるためにアラインメントをおこなうが、パフォーマンスクリティカルなソフトウェア(カーネルなど)は、キャッシュサイズを意識したプログラミングが行われる。__attribute__(((__packed__)))は、この最適化を行うための指示で、コンパイラによるアラインメントを抑止する。上のepoll_data_tは実際は12バイトのデータを持つが16バイトにアラインメントされるところを、最小の12バイトで作る。__attribute__(((__packed__)))のmappingJNAで構造体をマッピングするとき、デフォルトではアラインメントは勝手にプラットフォームにあわせて行われる。このアラインメントの種類をかえるメソッドが、Structure.setAlignTypeである。従って、以下のようにバインドする。}Structure.ALIGN_NONEはアライメントなし。今回はStructure.GNU_Cでも良い。11:50JNAではまる、その2。__attribute__((__packed__))のマッピングをする。Tweet広告を非表示にするもっと読むコメントを書く2014-02-22JNAではまる。Javaからepollを使いたい。Access2時間ほどはまった。Accessのことである。ネイティブなライブラリ関数をJavaから呼び出すための仕組みで、libffiを使って実装されている。@ITページのサンプルに、以下のような構造体のバインドが載っている。/*部署番号*/}非常に簡単である。私の以下のようにepollの構造体をバインドした。}そして、テストで、この構造体をnewする。EpollEvent();すると、こうだ。public)実際には、それぞれのフィールドにpublicが必要になる。エラーメッセージにもろ正解が書いてあるんだが、JNAはおろか、Javaさえよく理解していない私には、このメッセージに気づくまでに時間がかかった。以下のサイトをみて、メッセージの意味に気づく。http://www.eshayne.com/jnaex/example04.htmlなるほど。publicついてるね。最終的にはこういう形に落ち着きそう。}追記:上のバインディングはまだ未完成だった。JNAではまる、その2。__attribute__((__packed__))のマッピングをする。18:58JNAではまる。Javaからepollを使いたい。Editionを読んでいる。仕事で使い始めて半年。Editionを読む気になって読み進めているのが、想像以上に面白い。2、3、6章を読み終えた。Javaの深いところ、とはいわないが、言語的にこう書くのがモダンである(しかしEJ2がでたのは遠い昔の2008年だが)、というような項目がつらつらと書いてあり、Cあがりの私には新鮮である。pattern全盛のころ(2006年頃)にGoF本を読んでた私には、たとえば、開始早々でてくる「Singletonはenumを使え」の時点で既に新鮮である。JavaでSingletonを書くためには、getInstanceだろ、と刷り込みがおこっているためだ。Builderの実装にも惚れた。patternと呼ばれる書き方であったようだ。patternと呼ばれており、既に古きものになっていたらしい。たしかに、Argumentが多い場合はBuilderが良い。returnでBuilderを返すあたりも、Javascriptっぽくかけるので好きだ、いや、モダンだ(StringBuilderのappendの羅列を見たあたりで、なにかしらreturnする書き方に改めたが)。@SuppressWarningをつけろとやたらいってくるIDEを無視し続けていたが、なぜ警告してくるかも明記してある。Reflectionが便利だという話は知っていたが、実際に使ってみて、その威力は明らかになったし、JUnitのアノテーションを自分で実装できる例題がありつつ、最後には「しかしAnotation拡張は使うべからず」との、なんとも残念な結びにも、共感できる。Javaなんぞ、、、と思っていたが、もっと早く読んでいれば良かった。2書を超えるものではないにしても、Java界隈ではじめて出会えた良書である。これも半年のJavaのコーディングの中で、なかなか思うようにコードを書けないことに悩んだ末に読んだからの感動なのかもしれない。Kindle版この商品を含むブログを見る追記:ちなみに、他の良書も調べてみると、以下のリンクが良さげ。codeと既読本も入っており、他の本も読んでみようと思う。Editionを読んでいる。Tweet広告を非表示にするもっと読むコメントを書く2013-12-10Go言語、ビルド編。様々な新言語がひしめいてきた2013年。4年前の登場から、話題性が高かったGO言語だが、久々に触ってみた。buildになってる。'6g'とか、アーキテクチャにあわせたコンパイラがいくつもついてきた、リリース当初。それでもgofmtとか、新時代を予兆させるツールはついていたものの、ライブラリ周りがあまりに揃っておらず、実用にはやはり遠いと感じたあのころ。Makefileをかくのか、、うーん、たしかに、モダンとは云いがたいなぁ、なんて思ってました。toolsという充実のツール郡がついてる。buildも、そのひとつ。toolsが前提とするビルド環境をさす。pathへのパスを指定する。pathの構成を以下に示す。pathは、基本的に三つのディレクトリで構成される。Go言語のtarballを解凍したら、まさしくこの基本構成となっていることに気づくだろう。pathで開発、ビルドすることを前提としている。srcここには、ソールファイルがおかれる。Javaなどと同じく、名前空間でディレクトリが別れている。mysoftというプログラムを書いているとし、mysoftのなかには、foo、barという2種類のパッケージを実装しているとしよう。src/mysoft/barという3つのディレクトリ以下に、ソースファイルをおいておく。pkgここには、依存する外部パッケージを置く。.aなどの静的ライブラリがおかれるのもここ。binできたてのバイナリがここにのる。pathでビルドされることを前提とする。ここで注意点は、標準ライブラリなどもpkgにはいってないと使えないことである。そのため、Go言語のtarballを解凍したディレクトリ(標準ライブラリとかある)+自分のソフトウェアのディレクトリがGOPATHにはいってる必要がある。GOPATH=$GOPATH:$MYSOFTDIRと、GOPATHに、標準のGoディレクトリと、自身のソフトウェアディレクトリをいれてやる必要がある。mysoftで、おけ。ちなみに、最近のGoだと、GOROOTと、GOPATHは同じディレクトリにできないので、注意。22:53Go言語、ビルド編。Tweet広告を非表示にするもっと読むコメントを書く2013-12-05Gitでサブディレクトリのみをマージする。filter-branchで。あるサブディレクトリだけブランチ間でマージしたい。方法はあるが、以下の方法をとった。