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(マルチプレクサ)
- SelectKey
文脈
SelectableChannelをSelectorに登録。Selectorは準備ができた(ブロッキングせず処理可能な)IO処理を選択(選択操作自体はブロッキングされる)し、SelectKeyとして返す。SelectKeyからSelectableChannelを取り出しI/O処理(ブロッキングされない)を行う。必要であればSelectorに続きの処理を登録。処理の必要がなくなればSelectorから削除。
疑問
java.util.concurrentとか、最新のロック機構を使うマルチスレッド実装とシングルスレッドでマルチプレクサをつかった多重化とどちらの効率が高いのか?
RESTful Webサービス読書メモ
- 作者: Leonard Richardson,Sam Ruby,山本陽平,株式会社クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/12/21
- メディア: 単行本
- 購入: 25人 クリック: 830回
- この商品を含むブログ (168件) を見る
メモ
- ヒューマンリーダブル且つプログラマブルなWEBを標榜
- サービスはステートレスである。(スケーリングしやすい。)
- URLはリソース(リソースの抽象度はさまざま)
- リソースに対する操作はHTTPのメソッド
- GET リソースの取得
- PUT リソースの新規作成(更新)
- POST 従属リソースの作成(更新)
- DELETE リソースの削除
- セキュリティ
- その他
- HTMLのFORMは、GETとPOSTしかサポートしていない。
- RESTでのトランザクション処理が目から鱗。感動した。
- トランザクションもリソースにすればいい。
- RESTでの認証(BASIC認証+SSL)についても理解
- 認証後の状態をリソースとして発行してしまえばよい。
認証についてはやっぱりよくわからない。Authorization ヘッダを送信し続けるのでやっぱり常にSSLでの通信を続けなければならない。SSLって遅いというイメージがある。認証はSSL、識別はCookie等sessionidでその部分だけ状態を持つのが現実的だろうか?スケーリングに関してはスティッキーセッションに対応したロードバランサで同一ユーザーからのリクエストを同一サーバに振り分けるとかするしかないのだろうか。
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ビルダを使わずに、思いつきでプログラミングするのには向かない。図は水平方向グループ、垂直方向グループと、各入れ子グループの関係。矢印は追加したコンポーネントの並ぶ方向。具体例はまた後で書くことにする。
以下は混乱した時の為のまとめ
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、でしか試してないので以前のバージョンではわかりません。
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のインストールフォルダに置いてそこから起動するような設定になってしまう罠。