Javaで作るTCPサーバ(1.5)

こんばんは。梅雨に入ったというのに、全然雨が降らないですね。天気がいいのはとりあえず洗濯物にとってはいいことですが、あんまり降らないようだと今度は夏の水不足が心配になってきます。

ところで今日は前回の続きというか補足をします。最初はノンブロッキングAPIを使う方法を書くつもりでしたが、ちょっと気が変わりました(笑)。

ブロッキングモードとノンブロッキングモード

前回も少し触れた通り、ソケット通信を扱う方法として、ブロッキングモードとノンブロッキングモードというものがあります。簡単に言えば通信をする際にいちいちブロックするのがブロッキングモード、ブロックしないのがノンブロッキングモードです。

・・・それではあまり説明になっていないのでもう少し詳しく言いましょう。ネットワーク越しにデータを読み取ろうとしたり書き込もうとしたりする場合、それ相応の遅延が発生します。その遅延時間をどうするのかという違いがブロッキングモードとノンブロッキングモードの違いです。

ブロッキングモード
読み込みや書き込みを完了するまで待ちます。つまりコード上、readやwriteのメソッドをコールすると完了するまで制御はブロックします。
ノンブロッキングモード
「今できる処理だけをする」ことを基本にします。つまりコード上、readやwriteのメソッドをコールすると今読み取れるデータのみをreadし、或は今書き込めるデータのみをwriteして、すぐに制御が戻ります。

前回 Java SE 7 においてサーバソケットを扱う方法は3通りあると言いました。クラス名でいうなら、

  • java.net.ServerSocket
  • java.nio.channels.ServerSocketChannel
  • java.nio.channels.AsynchronousServerSocketChannel

この3通りです。前回使った ServerSocket はブロッキングモードで処理をします。2番目の ServerSocketChannel はブロッキングモードとノンブロッキングモードのどちらでも処理をすることができます。加えて効率の良いChannelクラスを使って読み書きできますので、ブロッキングモードで処理したい場合であってもJDK1.4以上の環境ならば、ServerSocket より ServerSocketChannel を使用することを考えた方がよいと思います。 続きを読む Javaで作るTCPサーバ(1.5)

Scala for Java Programmers

今回の社内勉強会はScalaについてでした。

Scalaを理解すること、使ってみることは、Javaプログラマにとって様々なメリットがあります。限られた時間の中でScalaの全てを説明することはできませんが、Javaプログラマにあまり馴染みの無い概念である「関数型プログラミング」と「トレイト」について少し詳しく説明し、またコレクションの操作、並列処理モデルのアクターに触れています。

Javaで作るTCPサーバ(1)

このところ暖かい日が続いているなあと思っていたら、急に寒くなって喉の調子を悪くしました。

ところで最近、なぜかSocketからサーバを作る必要があってコードを書いたので、自分の中の整理も含め、JavaでTCPサーバを実装する方法についてまとめたいと思います。

Javaでサーバソケットを扱う

Java SE 7において、サーバソケットを扱う方法は3つあります。

  • まずはいわゆる普通のソケットAPIです。JDK1.0の時代からあるAPIで、(つまりこの旧き良きAPIは1996年から存在します) java.net.ServerSocket を使います。
  • 次に「ノンブロッキング」と呼ばれるモードで処理を行うAPIがあります。java.nio.channels パッケージにある、ServerSocketChannel と Selector を中心に使います。このAPIはJDK1.4で追加されました。
  • そして最後に、非同期で処理を行う最も新しいAPIがあります。これも java.nio.channels パッケージにある、AsynchronousServerSocketChannel を中心に使います。このAPIはJDK1.7で追加されました。

続きを読む Javaで作るTCPサーバ(1)

Getting Started with Glassfish on Heroku

新年明けましておめでとうございます。今年もよろしくお願いいたします。私は今回の年末年始のお休みの間、なるだけPCを開かないでおこうと心に決めていたのですが、前々から気になっていたHerokuを少しだけ触ってみようかな、などど思い立ってしまいました。

さて、HerokuにはJava・Ruby on Rails・Python/Djangoなど、いくつかのWebアプリケーション実行環境が用意されています。JavaのWebアプリケーションを実行するために、Herokuの公式ドキュメントではJettyを使用していますが、ここはGlassfishを動作させてみましょう。jarファイル1個で起動できるEmbedded Glassfishを使用します。

プロジェクトを作成してローカル環境で実行する

Mavenを使ってビルドを行いますので、まずはpom.xmlを作成します。packagingはwarとし、maven-war-pluginには以下のようにweb.xml不要の設定をします。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

さらに以下のdependencyを追加します。

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
</dependency>

次にGlassfishを起動するクラスを作成します。リッスンポートは環境変数から取得するように設定しています。 続きを読む Getting Started with Glassfish on Heroku

Garbage Collection for Dummies

Garbage Collection (GC) についての勉強会を行いました。その資料を公開します。

内容は以下の通りです。

  1. JVM & GC – JVMのヒープとGCの基本
    • heap in JVM
    • Garbage Collection
    • stop the world
    • Generational GC
  2. Collectors in HotSpot JVM – HotSpot JVMが備えるGCを総ざらい
    • throughput & low-latency
    • 5 Collectors
  3. Ergonomics & Tuning – エルゴノミクスとGCチューニング初めの一歩
    • Ergonomics
    • JVM options
    • command line tools

Re: Javaでのパターンマッチを考える

@kis さんのエントリ「Javaでのパターンマッチを考える」がとても興味深かったので、私も書いてみました。

ユーティリティクラスを使って解決することにしたらどうでしょう?

Scalaの記法をよく見て、なるべく似たような形になるようにクラス構造を考えました。
caseなどのキーワードに当たる部分はstaticメソッドで乗り切り、マッチした際に実行されるコードブロックはインナークラスを使って表現します。 続きを読む Re: Javaでのパターンマッチを考える

アノテーションのインスタンスを取得する

このエントリはJava Advent Calendar 2012の第19日目のエントリです。
昨日は @yoshioterada さんの「Concurrency Update (jsr166e)のご紹介」でした。
明日は @kis さんの「Javaでのパターンマッチを考える」です。

お二人に挟まれて、私は自分の少し恥ずかしい話をします。今日のテーマはアノテーションのインスタンスについてです。

事の起こり

私はある日、こういうメソッドに出くわしました。

select(Annotation...)

なるほどAnnotationクラスを引数として渡すのね、と初めは軽く考えてしまったのですが、実際にこのメソッドを呼ぼうとしたとき困りました。

最初に書いたコードはこうです。(笑

select(@Customized);

コンパイルエラーになりました。というかEclipseなので赤線が出ました。ここでアレっ?と思ったわけです。そこでコードを次のように直してみました。

select(Customized.class);

それでもやっぱり赤線が出ます。おや? メソッドが呼べない! もう大混乱です。

Annotationクラスって何でしょう

メソッドの定義がおかしいのでしょうか。いやいや、呼べないようなメソッドが定義されているはずはないので(なにしろJavaEEのAPIです)、私のコードが間違っている可能性の方が極めて高いです。頭を冷やしてよく考えてみましょう。

アノテーションでよく使うのはこういうコードですよね。

@Override
public String toString() {
     // ...
}

この@Overrideはアノテーションによる注釈付けをするときの書き方なわけです。

ではCustomized.classは・・・? 変数に代入してみるとよくわかります。

Class<Customized> type = Customized.class;

なるほど、Customized.classはCustomizedクラスを表すクラスインスタンスです。

とするとAnnotationクラスはどういった場面で登場するのでしょうか。こういうときは初心に帰って、Java docを開いてみます。java.lang.annotation.Annotationインターフェースの「使用」を見てみると、Class#getAnnotations()というメソッドの戻り値がAnnotation[]になっています。リフレクションですね。

@Customized
public class ObtainAnnotation {
     public static void main(String[] args) {
          Annotation[] annotations
               = ObtainAnnotation.class.getAnnotations();

          for (Annotation a : annotations) {
               System.out.println(a);
          }
     }
}
@Customized()

ようやく分かってきました。アノテーションによって注釈付けされた要素に付いている、実際のアノテーションを表すのがAnnotationクラスのインスタンスです。 続きを読む アノテーションのインスタンスを取得する

Programmatic CDI

このエントリはJavaEE Advent Calendar 2012 第16日目のエントリです。
昨日は @kokuzawa さんの「Point-to-Point on JMS」でした。
明日は @yumix_h さんの「JAX-RSでファイルアップロード!」です。

今日のテーマはCDI 1.0 (JSR 299: Contexts and Dependency Injection for the Java EE platform)です。特にAPIからCDIを使う方法について書き留めたいと思います。なお、動作検証はMac OS X 10.8.2 + JDK 1.7.0_05 + GlassFish 3.1.2 で行っています。

CDIの基本

まずはCDIの基本的な使い方について、簡単にまとめておきましょう。キーになるのはスコープとインジェクションポイントです。

スコープ

スコープとは、インスタンスの生存期間のことです。それぞれのアノテーションでクラス、あるいはプロデューサフィールド/メソッドをマークすることによって表します。

// Userクラスをセッションスコープとしてマーク
@SessionScoped
public class User implements Serializable {

}

予め用意されているスコープは

  • @ApplicationScoped
  • @SessionScoped
  • @ConversationScoped (with JSF)
  • @RequestScoped

の4種類です。意味は名前からだいたい想像がつくと思いますが、ConversationScopeは少し特殊かもしれませんね。これはJSFと共に使用するもので、ブラウザタブ毎に複数リクエストに渡って維持することのできるスコープです。 続きを読む Programmatic CDI

r53tools-1.0.0を公開

AWSのDNSサービスにAmazon Route 53なるものがあります。最近多数のドメインをそのAmazon Route 53へ設定しなければならないことがあったため、CLIで処理をしたくなりました。

AWSに関するCLIとしては以前s3toolsを書いていたので、割合簡単に書けることも分かっていました。そこで再び自分でCLIを書いてみました。

r53tools: Amazon Route 53 CLI

これを修正BSDライセンスで公開します。動作環境はJavaSE6.0以降です。

機能としては、ゾーンの作成/一覧・レコードの作成/一覧/削除、を備えています。ゾーンの削除はAWSのWebコンソールから実行した方が良いように思ったので、今のところ用意しませんでした。

例によってLinux/Mac用のshスクリプトしか書いていません(Windows用を書いてもテストが・・・)。s3toolsの方も機能追加しようと思いつつ出来てないですが、そのうちやります。

ところで、たいてい私は繰り返しが20程度の数になったら楽をできないか考え始めるのですが、この20って少ないんでしょうかね?

JavaOne 2012 San Francisco レポート(5日目)

ついにベールを脱いだProject Avatar。新しいWebアプリケーションの本命となれるか

2012/10/04(木):5日目でJavaOneは最終日となりました。昨日までとは打って変わって、曇りがちで少し肌寒いほどの涼しさでしたが、朝行われたCommunity KeynoteにはJavaの父、ゴスリンさんが登場! スタンディング・オベーションも出る盛り上がりでした。 続きを読む JavaOne 2012 San Francisco レポート(5日目)