New I/Oについてのメモ

いろいろと調査中。とりあえずのメモ。詳しいことは後日書く予定

  • 既存java.ioパッケージの補完
  • プリミティブ型のバッファ郡を定義
    • ヒープ外のメモリをアロケート可能(アロケートのコストは高い)
  • ノンブロッキングI/Oのためのインターフェースがある(マルチプレクサ
    • シングルスレッドでも多重I/Oを効率的に処理できる。

基本構成要素

  • Channel
  • Buffer
文脈

Channelで外部リソース(ソケット、ファイル等)に接続し、Bufferへのリード、Bufferから外部リソースへのWriteをおこなう。

    • 外部リソースからread=Bufferへのput
    • 外部リソースへのwrite=Bufferからのget

ノンブロッキングI/Oの構成要素

文脈

SelectableChannelをSelectorに登録。Selectorは準備ができた(ブロッキングせず処理可能な)IO処理を選択(選択操作自体はブロッキングされる)し、SelectKeyとして返す。SelectKeyからSelectableChannelを取り出しI/O処理(ブロッキングされない)を行う。必要であればSelectorに続きの処理を登録。処理の必要がなくなればSelectorから削除。

疑問

java.util.concurrentとか、最新のロック機構を使うマルチスレッド実装とシングルスレッドでマルチプレクサをつかった多重化とどちらの効率が高いのか?

RESTful Webサービス読書メモ

RESTful Webサービス

RESTful Webサービス

メモ

  • ヒューマンリーダブル且つプログラマブルなWEBを標榜
  • サービスはステートレスである。(スケーリングしやすい。)
  • URLはリソース(リソースの抽象度はさまざま
  • リソースに対する操作はHTTPのメソッド
    • GET リソースの取得
    • PUT リソースの新規作成(更新)
    • POST 従属リソースの作成(更新)
    • DELETE リソースの削除
  • セキュリティ
    • Cookie,sessionidは使わない(ステートレス性を保つため)
    • SSLBASIC認証を推奨
  • その他
    • HTMLのFORMは、GETとPOSTしかサポートしていない。
  • RESTでのトランザクション処理が目から鱗。感動した。

  • RESTでの認証(BASIC認証+SSL)についても理解
    • 認証後の状態をリソースとして発行してしまえばよい。


認証についてはやっぱりよくわからない。Authorization ヘッダを送信し続けるのでやっぱり常にSSLでの通信を続けなければならない。SSLって遅いというイメージがある。認証はSSL、識別はCookie等sessionidでその部分だけ状態を持つのが現実的だろうか?スケーリングに関してはスティッキーセッションに対応したロードバランサで同一ユーザーからのリクエストを同一サーバに振り分けるとかするしかないのだろうか。

感想

状態(ステート)をリソース(URI)として発行してしまえばステートレスじゃね?という発想が目から鱗だった。
GJと言わざるをえない。

#訳もよかったです。

GroupLayoutの考え方2

http://d.hatena.ne.jp/jawagenjin/20080126/1201345648で書いたGroupLayoutの考え方の具体例。
ポイントは、水平方向のレイアウトを管理するHorizontalGroupは、水平方向のアライン(右詰めか、左詰め)を管理し、垂直方向のレイアウトを管理するVerticalGroupは垂直方向のアライン(ベースライン、センター)を管理するということ。

GroupLayout layout = new GroupLayout(this.getContentPane());
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//水平方向のレイアウト
layout.setHorizontalGroup(layout.createSequentialGroup()
   .addGroup(layout.createParallelGroup(Alignment.TRAILING)
      .addComponent(labelA)
      .addComponent(labelB))
   .addGroup(layout.createParallelGroup(Alignment.LEADING)
      .addComponent(buttonA)
      .addComponent(buttonB)));
//垂直方向のレイアウト
layout.setVerticalGroup(layout.createSequentialGroup()
   .addGroup(layout.createParallelGroup(Alignment.BASELINE)
      .addComponent(labelA)
      .addComponent(buttonA))
   .addGroup(layout.createParallelGroup(Alignment.BASELINE)
      .addComponent(labelB)
      .addComponent(buttonB)));

#こうやって書いてみると案外直感的かもしれない

GroupLayoutの考え方1


NetBeansとかGUIビルダでレイアウトする為に作られて、Java SE 6から標準クラスライブラリの仲間入りをしたSwingのレイアウトマネージャ"GroupLayout"だが、手でコーディングしようとするともうほとんど頭の体操に近い状態で、難しいので自分がわかるようにメモしとく。
まず、"GroupLayout"では、水平方向のレイアウト(HorizontalGroup)と垂直方向のレイアウト(VerticalGroup)を別々に定義する必要がある。さらにそれぞれのグループに順次グループ(SequentialGroup)と、平行グループ(ParallelGroup)を入れ子にする事ができる。この入れ子にするときに、垂直方向のレイアウトと水平方向のレイアウトどちらを定義しているかによって、コンポーネントの追加方向が変わるので画面のイメージ図を書いて書くコンポーネントの配置(あのコンポーネントの端っこはこのコンポーネントの端とそろえるとか、そういうの)をイメージ化しておかないと、書きながらレイアウトを考えるのは困難。GUIビルダを使わずに、思いつきでプログラミングするのには向かない。図は水平方向グループ、垂直方向グループと、各入れ子グループの関係。矢印は追加したコンポーネントの並ぶ方向具体例はまた後で書くことにする。

以下は混乱した時の為のまとめ

  • 水平方向のレイアウトと垂直方向のレイアウトを別々に定義
  • 順次グループ(SequentialGroup)と平行グループ(ParallelGroup)を入れ子にできる。
  • 水平方向のレイアウトを定義しているとき
  • 垂直方向のレイアウト(VerticalGroup)を定義しているとき

eclipse europaへのjreの埋め込み

プロジェクトによって使うJREが違う事は最近多々ある(個人プロジェクトは最新のJREで、仕事はまだJRE1.4が多いのかも)ので、環境変数JAVA_HOME,PATHとか、システムの公開JREの設定に頼ってeclipseを起動しようとすると、JREのバージョンの違いからトラブルになったりする。

なので。最近はディスク容量に物を言わせて、プロジェクトごとに専用のeclipseをインストールして、プロジェクトごとに完全に独立した環境を維持するようにしている。

さらに、そのeclipseごとにそのeclipseを起動するためのjreを固定化できないかなぁと思ってたら、JDKをインストールすると配下のディレクトリにjreディレクトリがインストールされてて、そのjreディレクトリをeclipseのインストールディレクトリにコピペするだけで、eclipseが勝手にそのjreを使ってくれるようになる事を最近知ったのでやってみた。

cmdとかbat作って"-vm"オプションで指定すればいいじゃないかと言う意見もありそうだけど、eclipseのインストールフォルダ内部にjreを突っ込んでいれば、PCを変えたり、別のメンバーにeclipseの開発環境ごと配布するのも簡単で、PCの環境にも影響を受けないのが激しく便利。おすすめです。

方法

[jdkインストールディレクトリ]
├─bin
└─jre <-- このディレクトリをコピー

[eclipseのzipを解凍したディレクトリ]
│eclipse.exeとか
└─jre <-- ここなるように貼り付け

よい点

  • 別のPC、別の環境への配布が簡単
  • プロジェクトごとの環境を維持しやすい

#europa、でしか試してないので以前のバージョンではわかりません。

RESTFullなウェブサービスのユーザー認証ってどうやるんだろう?

SSL+ベーシック認証で行うというのが今のところ唯一の解みたいだけど。ステートレス性を犠牲にせずにユーザー認証/識別を行うとなると、毎回やるのか?オーバーヘッド大きくないのか?とかいろんな疑問がわいてくる。

あと、認証時だけじゃなくて、そのあとのリクエストでのユーザー識別とか。最近のサイトはSSL使うのってほとんどログイン認証時だけで、その後は通常のhttp通信してるだけだと思うのだが、RESTはステートレスなので、Cookie等でsessionidを飛ばすやり方ではユーザーの識別はできないなぁ。どうするんだろう。

elipseへのjre埋め込み+ヒープ設定

http://d.hatena.ne.jp/jawagenjin/20080117/1200545621で書いた起動に失敗するエラーの回避とhttp://d.hatena.ne.jp/jawagenjin/20080125/1201223939で書いたjreの埋め込みをあわせると、結局-vmオプションで、eclipse内部のjre\bin\javaw.exeを指定したバッチファイルを作ってeclipseのインストールフォルダに置いてそこから起動するような設定になってしまう罠。