1.オープニング
2.全体マップ~1章(ソフィアへ:アルムの旅立ち)
3.戦闘マップ1~戦闘MAP1-1(アルム1)
4.全体マップ~2章(セリカの旅立ち)
5.戦闘マップ3~戦闘MAP2-1(セリカ1)
6.全体マップ~3章(解放戦争:それぞれの道)
7.全体マップ~4章(悲しみの大地)
8.戦闘マップ~最終MAP BGM(プレイヤー側)
9.エンディング1
1.オープニング
2.全体マップ~1章(ソフィアへ:アルムの旅立ち)
3.戦闘マップ1~戦闘MAP1-1(アルム1)
4.全体マップ~2章(セリカの旅立ち)
5.戦闘マップ3~戦闘MAP2-1(セリカ1)
6.全体マップ~3章(解放戦争:それぞれの道)
7.全体マップ~4章(悲しみの大地)
8.戦闘マップ~最終MAP BGM(プレイヤー側)
9.エンディング1
JBoss Nettyを使ったHelloサーバを作成してみる。
パイプラインの設計
HelloServerHandler
下流のStringDecoderから文字列を受け取り、プロトコルに沿って生成したレスポンスを返す
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
public class HelloServerHandler {
@Override
public void messageRecieved(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
// リクエストを取得する
String request = (String) e.getMessage();
// レスポンスを生成する
String response;
if (request.equals("quit")) {
response = "Bye!";
} else if (request.equals("quit")) {
response = "Hello " + request + "!";
} else {
response = "What?";
}
// レスポンスに改行コードを付加して書き込む
ChannelFuture future = e.getChannel().write(response + "\r\n");
// リクエストが"quit"の場合はチャネルを閉じる
if (request.equals("quit")) {
future.addListener(ChannelFutureListener.CLOSE);
}
}
}
JBOSS 5.1 on Ubuntu 10.04を参考に。
java-6-openjdkをSynapticからインストール
/usr/local/jbossの下にjboss-5.1.0.GA.zipを展開する。
JDKのパスが違うので下記指定。
JAVAPTH=${JAVAPTH:-"/usr/lib/jvm/java-6-openjdk/bin"}
127.0.0.1:8080にアクセス。
Javaで非同期I/Oプログラミングを行なうには、バージョン1.4から追加されたNIO(New I/O)を使用する。
NIOをラップした非同期フレームワーク「JBoss Netty」についてご紹介。
Javaで同期I/Oを行なう場合、
java.ioパッケージの
または、java.netパッケージの
を使う。
Javaで非同期I/Oを行なうには、Java1.4から実装されたjava.nioパッケージの
NIO API
を使う。
同期I/Oを使ったサーバプログラム
public class SynchronousServer {
public static void main(String[] args) throws Exception {
// スレッドプールを作成する
ExecutorService threadPool = Executors.newCachedThreadPool();
// サーバソケットを作成し、8080番ポートにバインドする
ServerSocket server = new ServerSocket(8080);
while (true) {
// クライアントの接続を受け付ける
final Socket client = server.accept();
// スレッドプールにクライアントの入出力処理を渡す
threadPool.submit(new Runnable() {
public void run() {
// メソッド本体
doSomeInputAndOutput(client);
}
});
}
}
}
シングルスレッドのままだと1度に1つのクライアントしか処理できないため、スレッドプールを使い、入出力処理をワーカスレッドに任せる。
スレッド数が1万を超えるとメモリ消費やコンテキストスイッチにパフォーマンス低下が著しく、サーバが不安定に。
同期I/Oのマルチスレッド方式がネックとなり、1台のサーバで大量の同時接続数を受け付けることが難しくなる。・・・C10K問題
非同期I/Oとイベント駆動モデル
NIOによる非同期型サーバプログラムの例
public class AsynchronousServer {
public static void main(String[] args) throws Exeption {
// サーバチャンネルを作成する
ServerSocketChannel server = ServerSocketChannel.open();
// ソケットを8080番ポートにバインドする
server.socket().bind(new InetSocketAddress(8080));
// チャネルをノンブロキングモードにする
server.configureBlocking(false);
// セレクタを作成する
Selector selector = Selector.open();
// セレクタを接続受け付け用に登録する
server.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// I/O処理可能なチャネルを選択する
selector.select();
// I/O処理可能なチャネルのキー一覧を取得する
Iterator keys = selectedKeys.iterator();
while (keys.hasNext()) {
SelectionKey key = keys.next();
// 接続可能なキーの場合
if (key.isAcceptable()) {
// クライアントを受け付ける
SocketChannel client = server.accept();
if (client != null) {
// チャネルをノンブロッキングモードにする
client.configureClocking(false);
// セレクタをクライアントからの読み込み用に登録する
client.register(selector, SelectionKey.OP_READ);
}
}
// 読み込み可能なキーの場合
if (key.isReadable()) {
// クライアントのチャネルを取得する
SocketChannel client = (SocketChannel) key.channel();
// クライアントの入出力処理を行なう
doSomeAsyncInputAndOutput(client);
}
// キーを処理済みとして削除する
keys.remove();
}
}
}
}
非同期I/Oのソケット通信速度は同期I/Oに劣る。
管理画面にアクセスするたびにWPのバージョンが上がる感じでした。。
サイトを放置するくらいだったら閉じたほうがいいんじゃない?とかとも思いましたが、最近日常に追われたり、ギターに追われたりしていておざなりになっていたWebプログラミング系のメモ系を更新してきたいと思います。
もちろん日常のことも合間に挟みつつ。
これまでこのサイトはブログ的な使い方をしておらず、固定ページを大量に生成するという作りにしていましたが、その辺も改めてページの整理やデザインの刷新も行いたいと思います。
音楽やらヲタ話はこれまで通り、ニコ動やTwitter中心で、こっちはまじめ系話アーカイブな感じにしようかなと。
1年かけて行なっていた陰陽座コピーという名のギター特訓に一区切りついたので、このサイトの更新を頑張ろうとおもいます。
サイトコンテンツの整理と作りかけのFEデータの続きを作りましょうそうしましょう。
生存報告も兼ねて。こっちは放置でしたがあっちはコンスタントに続けていました。こんなに1つのこと持続できているのは初めてかもしれません。。。気づけばYoutubeとニコ動で一番陰陽座動画を量産しておりました。あとTwitterは相変わらずな感じで。
東京来てからというものの、いろいろなことがめまぐるしくて「もーっ」て感じです。本当はちょっと前に記事を書こうとしていたんですが、WordPressアップグレードしたら投稿がおかしくなって次のバージョンアップを待ってましたという。。。やっと投稿できるようになった。。
FEは今の陰陽座シリーズが完了してからボチボチって感じです。まだまだやりたい曲はあるんですが、優先順位の問題で。
このサイトの扱う内容をどうしましょうかね。
という感じで、しばらく更新頻度落ちるものの、マイペースでやってきます。
まさかまた東京砂漠に戻ることになるとは、、、、
ということで、来月引っ越しします?。現在物件吟味中。。。
ここ1ヶ月間くらいは怒涛の忙しさになりそうです。。。主に掃除と物の整理で。。目標は70%くらいのものは処分する感じで。