クラウドのメリット・デメリット
クラウドは2つの種類に分類できる。
パブリッククラウド
→ 不特定多数が利用可能
プライベートクラウド
→ ミッションクリティカルな特定の事業が利用可能(銀行、病院、電気、電話)
クラウドでのメリット
・プロビジョニング
1.リソースの動的な割当が可能
→ 初期見積もりの負荷低減、ピーク時と通常稼働時で使用
リソース割合が異なる場合に有効活用できる。
・バックアップ
1.高稼働率を実現し、バックアップが必要性なくなる(厳密には必要)
・フェイルオーバー
1.高稼働率でほぼ必要がなくなってくる。
・レプリケーション
1.高稼働率でほぼ必要がなくなってくる。(用途によっては必要)
・物理的なサーバー管理コストの低減(セキュリティ設備も含む)
・サーバー管理者の負荷低減(不要説)
・新リース会計基準で複雑化する会計処理が不要
・ストレージを共有することで横断的なデータマイニングが行いやすい。
・仮想化
→OS等のバージョン互換の影響が緩和される。
クラウドでのデメリット
・システム単位での最適化が難しい。
→ リソース以外の最適化を特定システムのために施すのは難しい。
・失業者が増える
1.ネットワーク以外のインフラ担当者の行き先がなくなる。(人件費の削減にはなる)
クラウドでの課題
・クラウドを構成する端末のOS等ミドルウェアのバージョンアップ作業と互換性調査
・ウイルスソフトの稼働・運用方法
・ダイレクトメール等、印刷物との連携方法(外部委託だと発生する問題)
ORACLEはOS市場→JVM市場→DB市場→プログラミング言語市場(Java)→OpenOffice市場を席巻中!
これで、ORACLEはMSと肩を並べるラインナップになって来たな。
MSより優位な点はオープンソースと製品との組み合わせ。
組み合わせが自由にできるってことでコンサルティング提案はやりやすい。
重要なところは製品で、そこまで重要でないところはオープンソースで、
どちらにしろ、トータルサポートで安心感を得られ、さらにサポートをベンダー単位で契約することもなくORACLEとの1社契約でよいので費用が抑えられる。緊急時電話連絡も1社宛に1本でいいから運用も楽。
実はクラウド流行の兆しが見えている中、一番得しているのはDB市場ではなくJVM市場を得たことだ。MSはJVMのライセンス剥奪されてるし。
どうでもいいけども2009年は日食がありましたねぇ。
そろそろ、呼び出しコストが無視できなくなってきた。
今の不況下ではコストと品質と納期を考慮すると、システム開発における手法の選択肢が少なくなってきている。
システム構築という機能があったとして
それを実現するためのメソッドが下記とする。
1.要件定義
2. 設計
3. 製造
4.テスト
で、1から順に呼び出して行くのだが、1から2を呼ぶためにはそれなりの引数を渡す処理を記述しないといけない。また、2から3を呼ぶ為にも同じように引数を渡す処理をしないといけない。引数を渡す処理というのは記述することも手間だが、ちゃんと順番通りに渡さないと機能しないため、メソッド引数の順番についても調査を要する。
上記のように、呼び出しコストが納期と品質を圧迫しており、これを軽減するためには最適化しかない。
最適化はくり返し処理の圧縮としてフレームワークの導入、不要な手続き(一部の検印等)としてデッドコード削除、2、3、4のメソッドを1に含有するインライン展開などがあげられる。
最適化を実施するためには1から4を縦断的にかつ深く知っていなければならず、そのような性能が良いコンパイラが必要になる。逆にただのおかざりPMは最適化できずコストも納期も品質も満たせないシステム構築となってしまうのは仕方が無い。
システム開発の品質というのは実はユーザー満足度が大部分を占めている。極端に言うとユーザーが満足すればバグがあっても良いのである。実際はそういうケースはあまりないが。
そこでユーザーが満足するためのシステム構築を下記のような関数で表してみる。
X^3 + X - 2 = 0
ユーザーが理想とする結果が1だとするとそれを満たす為のXを算出する、解が無い場合でもそれを近似するXを算出することが最終的にユーザー満足度の向上に貢献できる。
上記の関数における解の一つは1であるが、この1を求める為にどのような方法をとるかというのがシステム開発手法の選択となるのである。
ウォーターフォールの場合は下流に行けば行くほど上流でのミスの影響が大きい、つまり、上流において徹底的にシステム構築のイメージを具体化する必要がある。具体化の為、つまり論理的に漏れが無いように分析を行う必要があるだろう、それはX^3+X-2に対して因数分解を行い、解を求めることになる。
3次関数の因数分解は理解されてるのだろうか? これが3次ならよいが、さらに4次、5次となってきたときはもっと大変になる。ただ、奇麗に因数分解できた場合は
きっちりとユーザーの満足度を満たす解を1度で得られるだろう。
アジャイルの場合は最初にこのX^3+X-2に対し任意のXを代入してみる。
そして、得られた数から、より結果1に近づくためのXを考え、修正したXを入れこんでいき、これを何度も繰り返し最終的に結果1を得られるXを特定するという方法だ。
ウォーターフォールもアジャイルも解を得るためには時間がかかる可能性を含んでいる。しかし、ウォーターフォールは因数分解が解けないと結果が出せないが、アジャイルであるならば、解けなくてもそれなりに近い値を出す事ができる。
システムは長くメンテナンスしていくものだと考えれば、とりあえず近似でアウトプットしておき、その後もちょっとずつ改善していけば良い。その場合に、因数分解に時間をかけるのか、それとも任意のXにおけるパターン網羅(ノウハウの蓄積)に時間をかけるほうが良いのか自ずと見えてくる。この、ノウハウの蓄積をもっと有用に使う事を今後のアジャイルが進化するポイントになると私は考えている。
そして任意のXを代入して値を得る為のアジャイルには仕様を理解でき、近似解を満たすXを提案でき、プロトタイプのプログラムを構築できるような縦断的知識が求められる。
HashMapが終わった瞬間。
下記の様にするとjava.lang.StackOverflowErrorが発生する。
Map m = new HashMap(); m.put(m, "1"); //←この瞬間、この”m”は終了した。 //エラー m.put("", "1"); //これもエラー m.remove(m); //これもエラー m.containsKey("1");
これがHashtableだと起きない。
Map m = new Hashtable(); m.put(m, "1"); m.put("", "1"); m.remove(m); m.containsKey("1");
たとえば、あるプログラムにおいて内部的にHashMapを使ってるとする。
それを取得して、取得したHashMapにそのHashMap自身を格納してやるだけでそのプログラムを終わらせる事ができます。・・・・なんてことは意味ないし危険なのでやめましょう。ちなみにシリアライズしたものは問題ないです。
この場合はMapの実装の中身をいちいちHashtableかHashMapかを確認した後で、Mapに対する操作を記述しなければなりません。ポリモーフィズムは変更に強くて、インターフェースだけ知っていればいいはずなのにわざわざ実装を調べないといけないのはどういうことなんですか!?
単に、HashMapの実装が悪いだけ!?
JPAのアノテーションとBean Validationのアノテーションでアジャイルが加速する。
今までは、テーブル設計をしてからEntityを作成(自動生成含む)する方向だったんだけども、JavaではJPAアノテーションとBean Validationのアノテーションを利用してEntityから先に作成(自動生成含む)することができるようになった。まぁ今でもマイグレーションみたいなのはあるけども、それはあくまでも変更前のテーブル定義ありきなので。
これで、ちょっとしたシステムをつくるときにとりあえずEntity作ってごにょごにょ
やれば良い。
データの格納場所はEntity作った後で、RDBだろうが、KVSだろうが、ファイルだろうがなんでも選び放題。
ってことで、とりあえず、JPAとBean ValidationのアノテーションからCREATE文作成するツールを誰か作らないかな。
できれば、JAXBも対応してほしい。
Webサービス利用とかだったらこういう流れ。
XSD → JAXB → Bean → アノテーション追加(JPA,BV) → Entity → CREATE生成 → テーブル作成
来年のJavaOne
http://java.dzone.com/news/javaone-lives
一回も行ったことないけども来年も開催されるような流れでうれしい限りだ。