2014年3月9日日曜日

IntelliJ IDEA メモ

開発環境として、IntelliJ IDEA を使っています。新しい環境に IntelliJ をインストールする際の設定や利用時のメモを記述していきます。なお、OS のバージョンは Fedora19、IntelliJ のバージョンは IDEA 13 の有償版(Ultimate Edition)を利用しています。

キーマップ

以前は Eclipse 風のキーマップに変更していましたが、以下の観点からデフォルトのキーマップにしています。
  • ググって出てくる公式の情報はデフォルトのキーマップであること
  • IntelliJ 起動時の Tips ももちろんデフォルトのキーマップであること
ここで自分好みに変えてしまうと、遅かれ早かれ既存のキーマップとバッティングし、知らず知らずのうちに上書きしてしまうことになります。以前は気にしなかったのですが、IntelliJ の記事を読んでいるうちに、いろいろ便利なショートカットがあるなあ、せっかくだし試さないのもなーと揺らいだため、現在はデフォルトに戻しています。

以下によく使うキーを列挙します。

  • ファイル検索
    • Ctrl + Shift + N
    • Shift 2 回
      • ただし自分の環境だと不安定
  • メンバ表示(Eclipse でいうアウトライン)
    • Ctrl + F12
  • ブックマーク

テンプレート

以下を参考に設定。(JUnit 実践入門風のもの)

Intellij IDEAにJUnitのLive templateを追加する

プラグイン

Eclipse に負けず劣らず、IntelliJ はプラグインが豊富に用意されています。ここでは、よく使うものを列挙します。
  • IntelliJ Configuration Server plugin
    • 複数端末にインストールされた IntelliJ の設定を同期します。
    • JetBrains アカウントが必要です。
  • FindBugs-IDEA
    • 静的バグ解析
  • lombok-intellij-plugin
    • もはや定番ともいえる lombok のプラグイン。Java Beans がすっきりするので、JPA における Entity や JSF の Backing Bean などで利用しています。

アプリケーションサーバの追加

WildFly

  1. 上部メニューの [Run]
  2. [Edit Configurations...]
  3. [+] マーク
  4. [JBoss Server]
    • 表示されていない時は、(28 more items) をクリック
  5. [Local]
  6. [Name]に適当な名前をつける
  7. [Server]タブの[Configure...]をクリック、[JBoss Home:]に WildFly のインストールディレクトリを選択
ここまででサーバの基本的な設定は完了。
アプリケーションをデプロイする場合は、
  1. [Deployment]タブを選択
  2. [+] マーク
  3. [Artifact...]
  4. デプロイするアプリケーションを選択
これで standalone ディレクトリをベースに、standalone.sh で起動する。ベースディレクトリや standalone.xml 以外のプロファイルを利用したい場合は、[Startup/Connection]タブの内容を編集する。

2014年1月31日金曜日

Entering Undertow Web server 和訳

本エントリは以下の和訳です。お手元に WildFly をぜひご用意ください。

Entering Undertow Web server

Java EE 7 のリリースへの対応と、 Web Sockets API や HTTP upgrades(例: HTTP 経由の EJB) といった先進的な機能を実現するため、WildFly の開発チームは重大な決断をしました。Apache Tomcat からフォークされた JBoss Web Server の長きにわたるコミットメントを経て、WildFly では新しい Web サーバ、その名も Undertow を基盤に据えています。

Undertow は 柔軟性に富み、高速な Java 製の Web サーバであり、J2SE New Input Output(NIO) API をベースにしています。Undertow はコンポジジョンベースのアーキテクチャを持ち、ハンドラと呼ばれる小さな単一のコンポーネントを組み合わせることで、Web サーバとして完全な機能を構築できます。これらハンドラは、Java EE Servlet 3.1 コンテナの完全な機能の実現であったり、ユーザのコード中に埋め込まれたシンプルな HTTP を処理するハンドラを実行するためにチェーンされます。

以下の図のように、ハンドラチェーンは様々な個々のハンドラからなり、最終的に Servlet レスポンスやエラー(例: リクエストされたパスが存在しない)を生成します。

Undertow Web サーバはまた、タスクを処理するためにノンブロッキング非同期ハンドラにするか、スレッドプールで管理されるブロッキングハンドラに処理を委譲するか選択できる柔軟性を持っています。

Undertow の設定内容を確認するために、設定ファイル(standalone*.xml もしくは domain.xml)を見てみましょう。そして、"undertow" サブシステムのところまで移動してください。デフォルトでは以下のようになっています。

<subsystem xmlns="urn:jboss:domain:undertow:1.0">
   <buffer-caches>
      <buffer-cache buffer-size="1024" buffers-per-region="1024" max-regions="10" name="default">
   </buffer-cache></buffer-caches>
   <server name="default-server">
      <http-listener max-post-size="10485760" name="default" socket-binding="http">
      <host alias="localhost" name="default-host">
         <location handler="welcome-content" name="/">
      </location></host>
   </http-listener></server>
   <servlet-container default-buffer-cache="default" name="default" stack-trace-on-error="local-only">
      <jsp-config>
      <persistent-sessions path="persistent-web-sessions" relative-to="jboss.server.data.dir">
   </persistent-sessions></jsp-config></servlet-container>
   <handlers>
      <file directory-listing="true" name="welcome-content" path="${jboss.home.dir}/welcome-content">
   </file></handlers>
</subsystem>

Undertow の設定のうち1つ重要な要素として Buffer Caches があります。バッファは原則として、データを書き込み及び、後で読み込むことのできるメモリのブロックです。メモリブロックは NIO Buffer オブジェクトにラップされ、メモリブロックを簡単に扱うことのできるメソッド郡を提供します。バッファを利用することの大きな利点として、物理アクセスよりも高速であることが挙げられます。
Java NIO に加え、WildFly は XNIO(http://www.jboss.org/xnio)を活用しています。XNIO は低レベル I/O レイヤを提供し、NIO API をシンプルに扱うことができるようになります。XNIO は NIO セレクタを利用することによる複雑さの解決、NIO に不足しているマルチキャストやシリアルポートのような非ソケット I/O へのサポートを提供します。また、NIO が持つ機能は全てそのまま利用できます。
Undertow を管理するために、管理コンソール上で Profile タブの Web パネルを見てください。以下のリストが含まれています。
  • Web Services: WSDL ホストやポートといった Web サービスの設定を行えます
  • Servlets: JSP の一括リロードができる開発モードを利用するかどうかの設定を行えます(デフォルト: false)
  • HTTP: HTTP コネクタの設定(例: IO リソースプールの設定)を行えます
  • Undertow Core: ハンドラとフィルタを HTTP コネクションと関連付ける設定を行えます

Web サーバのプールの設定

ここは JBoss AS 7 の設定から変わったところです。以前のバージョンでは Web サーバのスレッドプールをチューニングするために、Thread Executor を参照していました。一方 WildFly 8 では、IO サブシステム中で作成される Worker 要素を参照する必要があります。やり方を見てみましょう。左にあるメニューのツリーから Core を開いて、以下の図のように "IO" を選択してください。
メインのパネルから "Worker" パネルを選択してください。すでに "default" ワーカが存在していることがわかると思います。Add/Remove ボタンをクリックすることで、いつでも新しいワーカを作成、削除することができます。また、"Edit" リンクをクリックすることで、default ワーカのスレッド数を変更することができます。リンクをクリックすると以下のように属性を編集できます。
最初の Stack size は Web サーバのスレッドのスタックサイズです。スレッドのスタックサイズを大きくすると Web サーバはより多くのリソースを処理できます。よって、少数のユーザ向けです。Task keepalive は同じクライアントからのリクエストに対するコネクションを何秒維持するか設定できます(デフォルト: 60)。Keep-Alives を利用するとブラウザは初回リクエスト時に確立したコネクションを全てのリクエストに対して使いまわすため、通常、ページのロード時間が半減します。

Io threads  Web サーバが利用できるスレッド数です。これは Web アプリケーションが高負荷を受けるようになるにつれて増やす必要のある、チューニングすべき重要なパラメータです。Task Max Threads は同時に処理できるリクエスト数です。IO ワーカの設定が終わったら Save をクリックしてください。

ワーカの設定をしたので、Web サーバからこのワーカを参照させる必要があります。左にあるメニューのツリーから Web サブシステムを開いて HTTP を選択してください。HTTP サーバに関する見慣れない項目があり、設定することができます。
表中の "default" 要素をクリックし、Worker 要素が先ほどの IO ワーカと関連づけられていることを確認してください。ワーカを利用するためには enabled である必要があります。次に、HTTP リスナと Socket binding(左のメニューの General Configuration にある Socket Binding から、利用できるソケットバインディング設定を確認できます) を関連付ける必要があります。最後に、HTTP サーバを Java NIO Buffer Pool の実装を設定します。これについては、次のセクションで説明します。

HTTP のワーカ設定が完了すると、Web サーバのワーカスレッドの名前は [worker name]-[worker-id] という形式になります。以下の図では、ワーカの名前を "custom" と定義し、JDK に同梱されている JConsole を利用してスレッドを監視しています。

Web サーバのバッファプールの設定

すでに述べたとおり、Undertow は Java NIO API に基づいており、J2SE のプールを利用します。

バッファするためには java.nio.ByteBuffer が必要です。
バッファはオブジェクトであり、読み書き可能なデータを含みます。NIO におけるバッファオブジェクトの追加が、この新しいライブラリと元々の I/O との大きな違いです。ストリーム指向の I/O では、データの読み書きに直接ストリームオブジェクトを操作していました。NIO ライブラリでは、全てのデータは Buffers を介して操作されます。データが読み/書き込まれるとき、バッファに対して読み/書き込まれます。NIO においてデータアクセスする際は、バッファから取り出すことになります。
Undertow における IO バッファプール の設定は、以下の図のように左のメニューの Core | IO を選択し、Buffer Pools から行います。
表中の "default" 行をクリックすると、以下要素を設定できます。

Buffers per slice バッファの分割数を設定します。大きなバッファを分割して操作し、バッファ全体を処理する際のオーバヘッドを回避します。
Direct buffers バッファがダイレクトバッファとして設定されるかどうかを選択します。ダイレクトバッファは Java ヒープ外の領域に割り当てられ、バッファの存続期間中はメモリアドレスが固定されます。メモリアドレスを順番に固定することで、カーネルが安全にメモリに直接アクセスできるため、ダイレクトバッファによって I/O 操作がより効率的になります。
Buffer size java.nio.ByteBuffer のサイズを設定します。ダイレクトバッファが有効な場合、デフォルトの 16kb は最大パフォーマンスを提供するのに最適な値です(この値は Linux でのデフォルトのソケットバッファサイズと一致します)。

この記事は "WildFly 8 Book" からの引用です。この本はもっとも有名なオープンソースの Java アプリケーションサーバである JBoss WildFly(JBoss AS から改称)の実践的でわかりやすいガイドです。この本は新しくエキサイティングな WildFly の運用管理面の詳細を網羅しています。管理機能にフォーカスし、最新のアーキテクチャとパフォーマンスの変化を学べます。基本的な設定からクラスタリングや JDBC コネクティビティ、ロギングなど高度な設定まで順を追って習得できます。