金曜日, 6月 26, 2009

【Reflex iText】 パフォーマンス測定でわかったAmazon EC2の真の実力とレイテンシー このエントリーを含むはてなブックマーク


 Amazon EC2の高スペックなマシン(c1.xlarge)にReflex iTextのインスタンスを載せてパフォーマンスを測定してみた。c1.xlargeは、Opteron 1.0-1.2GHz相当20Unit分、Memoryは7Gあり、Celelon 2.2Ghz、512Mの約10倍のパフォーマンスだった。
 Reflex iTextのスループットは、(予想通り)20個のJettyを起動して並列実行させたときに最大を示し、1Jettyあたり20ページ作成で133ページ/秒を出した。

 PDF生成パフォーマンステスト


* 20プロバイダ*20ページだと133ページ/s
* Total 3秒
* テンプレートHTMLは51Kb*20回取得
* エンティティXMLを300Kb*20個分割して取得
* 20プロバイダ*5ページで1秒なのでHTMLとXMLの転送コストはほとんどないと考えられる

* 1プロバイダ*400Pだと10ページ/s
* Total 40秒
* テンプレートHTMLは51Kb*1回取得
* エンティティXML 6Mbを1個取得




 また、Google App Engineを間に置くことでレイテンシーを50%も改善できることがわかった。100件のPDF(1.5Mb)の生成10秒、転送12秒の合計22秒かかるが、GAEを介した場合、なんと16秒で取得できる。これは転送時間を半分にする計算である。
 もともとGAEは近くのサーバが選択されるため①、④は高速であることはわかっていた。また、EC2とGAE間も非常に高速であることから、このようなレイテンシー改善になったのである。(CloudFrontはいらない?)




木曜日, 6月 25, 2009

【Reflex iText】 QRコード生成サービス このエントリーを含むはてなブックマーク

QRコードを作成してpngとして返すサービスをMorph AppSpaceのテストサーバに置いている。Reflex iTextの一機能なので、例によって、テンプレートとエンティティは外部から与えることで生成する。テンプレートなどはDropboxに置いている。

http://pdfservice.morphexchange.com/image/qrcode.png?template=http://dl.getdropbox.com/u/200214/qrcodepngsample.html&entity=http://dl.getdropbox.com/u/200214/qrcode.xml

使い方は以下のとおり。


  • QRコードのPNG出力機能

  • 属性
    • value: QRコードに表示する値
    • height: 高さ
    • width: 幅
    • version: 型番(シンボルの大きさ)。0~10を指定。
    • errorcorrectionlevel: 誤り訂正レベル。L, M, Q, Hのいずれかを指定。
      • レベルL - コード語の約7%が復元可能
      • レベルM - コード語の約15%が復元可能
      • レベルQ - コード語の約25%が復元可能
      • レベルH - コード語の約30%が復元可能
    • cellsize: セルのサイズ(pixel)。1~4を指定。
    • margin: 余白(pixel) 。0~32を指定。
  • HTMLテンプレートとXMLエンティティ
  • 水曜日, 6月 24, 2009

    【Google App Engine】 PDF出力ができたっぽい このエントリーを含むはてなブックマーク


     こちらに書いたとおり、Reflex itextをGAE上で構築することを考えていたが、java.awt.*パッケージが使えないことで断念していた。
     ところが、昨日出たパッチを当てるとちゃんと動くではないか。これでGAEでもPDF出せるようになる。なんとすばらしい!ただ、グラフや図形などはちゃんと試していないのでReflex iTextがそのまま動くかどうかはまだなんともいえない。これから調査して報告したい。

     既存の2つのPDFをマージするデモ (GAE上でグラフやバーコードを作成しているわけではないので注意)
     

    火曜日, 6月 23, 2009

    【クラウドコンピューティング】 ビジネスを変える8つの方法 このエントリーを含むはてなブックマーク



    クラウドコンピューティングがビジネスを変える8つの方法

    という記事で特に1番と2番と6番がすばらしいと思ったので抜粋する。

    1.新世代の製品とサービスを作り上げる。


    クラウドコンピューティングの経済は、革新的な企業がこれまでは不可能だった製品を作り出すことや、競合相手よりもずっと安い製品(あるいは単にずっと収益性の高い製品)を作り出すことを可能にする。クラウドコンピューティングのこの側面は軍拡競争であり、このチャンスが得られるのは短期間に過ぎない。これは、一度その利点が効果的であることが証明されれば、競合相手がクラウドコンピューティングの経済的な利点を自社の製品に組み込むことは、比較的短期間でできるためだ。興味深いのは、手が出せないほど大量のコンピューティングパワーや規模、あるいはまったく新しいビジネスモデル(前述のオープンサプライチェーンやグローバルSOAなど)を必要としたり、既存の技術的な制約やコストパフォーマンスの制約によって実装不可能だったビジネス上のアイデアが、実現可能になったことだ。ストレージ、処理能力、テクノロジーの進歩は、これまで不可能だったイノベーションを可能にするが(たとえば高速インターネットはYouTubeを可能にした)、クラウドコンピューティングはそれらのチャンスを非常に手が届きやすいものにしてくれる。賢い企業は、すぐにこれに気づくだろう。


    2.ITサービス提供者との間での、新しい軽い形のリアルタイムな協力関係やアウトソーシングが可能になる。
    従来の形によるITサービスのアウトソースを経験している企業ならば、これがどういったものかをすでに理解しているだろう。アウトソーシングを行うと、これまで社内にあったものの大部分が、他のどこかに置かれ、何かを変えるのは困難になる。しかし、従来のITのアウトソーシングとは違い、クラウドコンピューティングは、これまでのアウトソースではほとんどの場合不可能だった敏捷性と管理可能性を与えてくれる。クラウドサービスベンダーが気に食わなければ、長期契約を結んでいるのでない限り、ITアウトソース事業者よりはずっと簡単にベンダーを変えることができる。実際、多くのクラウドコンピューティングの関係は、単なる月末にキャンセルが可能な契約と、法人宛ての請求書だけのものだ。多くの企業にとっては、この条件は今よりもいいものであり、すべてを社内でまかなう場合や、アウトソース事業者との関係を結んでいる場合よりも、はるかに多くの選択肢を与えてくれる。


    6.事業部門によるITのセルフサービス。
    多くのクラウドソリューションは、特にSaaSに関連している場合は、IT部門が関与する必要が少なくなってきている。今後出てくる多くのクラウドコンピューティングソリューションは、ビジネスユーザーが完全にセルフサービスで導入することができるようになるだろう。McKendrick氏が述べているように、これは多くのシナリオがより小さいものになり、数も増えて、IT需要のロングテールをカバーするものになるだろうことの前触れでもある。



    もちろん、いいところもあれば悪いところもある。以下はそれを示した図である。

    いいところと悪いところ(Pros and Cons)


     はっきりさせておくが、マイナーなアプリケーションのいわゆる「先端的」なコンピューティングや、必要不可欠ではないビジネスシステムに関してさえ、クラウドコンピューティングの導入には、まだ答えの分かっていない問題や、特有の課題があることが分かっている。その中でも目立った問題には、クラウドに保存される企業データのセキュリティ、クラウドプラットフォームベンダーへのロックインのリスク、他人が運営・管理しているクラウド資源にはコントロールができないこと、信頼性の問題などがある。




    実際の議論


     先日のクラウド研究会のMLで、まず、S氏が上記1.に関連する意見を述べてくれた。


     小さな会社のポジションが、一番Amazonなどを利用して、日本で伸びるべきだと思っています。
    日本で、クラウドだけをやるためにマシンを1000台購入し、ユーザーを募る、なんて例えば無理な話で、やはり他の主業務で投入したマシンを生かしてクラウドを、というスタイルでないと無理でしょう、
    という意味でXXXクラウドなどというのが日本で成功するとは思っていないわけです。

    例えば、日本の中小企業を生かす意味では、Amazon EC2の上でEDIを行うとかが一番ですね。


     また、ビジネスを提供する立場としての私の意見は次のとおり。


    私が強調したいのは、なんというか、クラウドでビジネスするというより、 ビジネスするならクラウド?という感じです。つまり、サービスを作ってGAEでプロバイドするけれども、Powerd by GAE を知らしめることより、サービス自身のスケーラビリティやアベイラビリティを強調することの方が大事なんじゃないかと。


     これに対して、F氏は、信頼性について指摘する。


     確かにクラウドのスケーラビリティやアベイラビリティは商用サービスを運営する上では大きなメリットだと思いますし、これに低コストが加われば「ビジネスするならクラウド?」は説得力はあるでしょう。

    でも、パブリック・クラウド上で商用サービスを運営するリスクも存在するわけで、特にサービス事業者を規制する国内法との整合性といった点が僕は気になってます。Above the Clouds でも10の課題のうちの Data Confidentiality and Auditabilityでこの問題に言及していますが、その記述はヨーロッパの各国がアメリカのクラウド・サービスを利用する場合の話しか書いてない。その対策も「EU域内にもデータセンタがあるから、そこだけで運営すればいい」という日本人には「え?」と思うような内容だったりします。

    つまり現時点では日本国内からのパブリック・クラウド利用にはこの手のリスクがどれくらい存在するのか、まだあまり明らかになってない。そういう状態で「小規模な事業者はクラウドがお勧め!」って言っちゃうのはどうなのかな?というのが僕の懸念です。小規模事業者は当然資金力もないので商用サービスのシステム構築した後に「国内法に違反するのでサービスできない」てなことになると、すぐさま倒産しかねないですもんね。


     これに対して私の回答。


    > 特にサービス事業者を規制する国内法との整合性といった点が僕は気になってます。

    おっしゃるとおりだと思います。
    今まで使っていた海外のホスティングもクラウドも同じようなもんだと考えていました。
    国内法についてはよく調べないといけないですね。

    > 商用サービスのシステム構築した後に「国内法に違反するのでサービスできない」
    > てなことになると、すぐさま倒産しかねないですもんね。

     国内法以外でも弊社が潰れてサービスできなくなる可能性はたしかにありますね。
    お客様が既に弊社のサービスを利用されていて、弊社がサービス運営できなくなった場合には、ちょっと言いにくいのですが、サービスそのものをお客様にお譲りすることになると思います。(;^_^A
     これで少なくとも、AmazonやGoogleが潰れないかぎりサービス継続できます、と回答するようにしています。お譲りするといっても、インスタンスのコピーを渡すのと、クレジットカード名義が変わるぐらいですかね。私たちが所有、管理するものは本当に少ないんです。また、引き続き運用管理をお願いといわれた場合には個々に対応していくつもりです。まあ、ちょっとあぶなっかしいかもしれませんが、そのあたりのリスクも含めて低料金でご提供させていただくことにしています。最終的にはお客様にご判断いただくしかないですね。


    S氏にもフォローいただく。


     >> サービス事業者を規制する国内法

    なんて今存在しないですよね。変な規制法は作らないように我々も動くべきだと思います。
    日本として鎖国したいなら違いますが。
    サーバーの場所が日本以外にある会社なんて一杯あるわけですし、インターネット経由での情報交換のセキュリティー確保以上の問題は、利用者の自己責任が大きいというのが、基本原則なのでしょう。 いずれにしても、SSLの使用以上に、クラウド内に格納されるデータの安全性(つまりクラウド運営会社も知ることの出来ないKeyで暗号化)を確保したいという思いが強いのは事実でしょう。


     とにかく、ビジネスは今はじまったばかりだ。利用契約の形態も含めて試行錯誤的に進んでいるのが現状である。AmazonEC2やGoogle App Engineの利用契約などは、必ずしも弊社を通すという必要もなく、お客様が直接契約するなど、やり方はいろいろあるとは思っている。

    月曜日, 6月 22, 2009

    【雑記】 ギークとスーツの喧嘩 このエントリーを含むはてなブックマーク


     梅田望夫がオープンソースを語っても残念でない理由

     私にはギークとスーツ(というより文化人)の喧嘩に見える。いかに正論をふりかざしても、変なのは我々ギークなんだから、そこんとこもっと踏まえて挑まないと、イタいめに合うことになる。文化人との議論は子供と大人の喧嘩より話にならん。「いやいや、そういう話じゃなくて」と反論したいのは梅田さんの方だと思う。そこをぐっと我慢してるのはさすが文化人。
     naoyaさんも指摘してるけど、梅田さんはオープンソースの技術的な話をしてるんじゃないよね。バザール的協業という話が本質であって、ずれてしまったのは、どうみてもギークのせいだね。むしろオープンソースを実践しているギークこそ、バザール的協業の意味を声を大にしていうべきとろだと思うけど、残念なことに、それがなかなか世の中に伝わらない。ギークは不幸にも、普通の人に伝えるのは下手だから、梅田さんのような方はとても大切になってくる。梅田さんはコードは書かないけど、自分たちが実践している行動とその意味を代弁してくれている。元々変である存在のギークをまっとうなものとして扱い、世間に通訳してくれる、これほどすごい代弁者は他にいないって、絶対。

     一方のひがさんは、これまたガツンといえるところ。いいよねえ。これまでの実績からいって日本のOSSの第一人者であるのは間違いない。だから、これだけ大きな反応があったのだろうよ。私なんかがいったところで相手にもされないのは明らかだしね。

     でもやっぱり世間の広さでいえば梅田さんの方に軍配があがると思う。ギーク以外の普通の人たちは98%の大多数を占めるから、たとえギークが2万人の支持を得られたとしても、98万人の普通の人たちは( ゚д゚)ポカーン 状態なわけですよ。だから、もっと普通の人の支持を得るためには、梅田さんのような通訳が必要になってくるわけ。その通訳された結果に対して、若干不備というか、意訳があったとしても、目くじらたてて怒ったりする必要はない。また、本当に理解してないだろコイツとか思って、いちいち反応する必要もない。なぜなら全く違う人種の人なんだから。

     ところで、最近の梅田さんは日本のギークに対して失望しているようだけど、私もこの閉塞感を、なんとかしたいなあと思っている。また、はてなに対してものすごくポテンシャルを感じているけど、最近はちょっと物足りないなあとも感じている。
     例えば、OSSで大規模システムを作れる技術があるんだから、サービスだけじゃなくて、真剣にクラウド事業をやるべきだと思う。日本発クラウド事業は富士通さんが真剣に取り組み始めたけど、はてなさんも頑張れるだけのポジションにいるのは明らかだ。クラウド事業はサーバだけじゃなくて、インフラ技術が一番大事で、そのあたりが得意なところは限られている。
     もしやるんだったら日本のギーク全員がはてなを支持すると思うし、トップの一人である梅田さんをリスペクトするだろうよ。今回の件は、閉塞感もあって相対的にお二人の影響力が低下してのも一因じゃないかな。もっと建設的な議論ができるといいのになあ。

    日曜日, 6月 21, 2009

    【クラウドコンピューティング】 IT輪廻とイノベーション このエントリーを含むはてなブックマーク


    集中、分散を繰り返すITの輪廻

     Azureに代表されるようなクラウドOSにおいては、P2PやGridといった主要な技術要素はクラウドOSの中に隠蔽されていてユーザには見えない。これは、サービスを提供するだけというクラウドOSの結実により、もっと大きな視点での集中がおきたことになる。
     クラウドOSに代表される現在の大きな集中への動きは、中島丈夫氏のIT輪廻の話にあてはめると納得がいく。IT輪廻に関しては、IBMerであれば耳タコ状態ではあるが、知らない方も多いと思うので、ここであらためて紹介したいと思う。(中島氏は尊敬するIBMきっての慧眼の持ち主。現在は退職されている。)
     ただし、この記事は2006年10月16日のもので多少古い。また当時のIBMはSOAを推進する立場であったことも付け加えておく。話の本質を理解しないまま、SOAに大失敗している今の現状だけをとらえて、これだめじゃんとかって思わないでもらいたい。

    新しい時代を迎えるITインフラ技術 -Web2.0を中心として-

    (2006年10月16日)

    これまでのシステム(コンピュータ・ネットワーク技術と社会・経済的文脈から創り出される情報システム)の歴史は、集中から分散へという流れの中で発展してきたこと、そしてそれぞれの極においては、「メーンフレーム中心」、「パソコン中心」、「インターネット中心」、「ビジネス中心」という特性が見られてきたことを指摘されました。
    そして、現在の「ビジネス中心」の特性においては、SOA(Service Oriented Architeture)を構築することによって、ビジネスとITを統合する形の発展が重要とされることを強調されました。
    こうした文脈において、これまで重要とされてきた「作る」、「買う」、「使う」といったDimensionに付け加えて、新たに「組合わす」という側面が加わるというご指摘は、サービス提供者と利用者の間に立つ仲介者(Mediator)の役割が重要になるというご指摘と合わせて、Web2.0へとつながるものであることを 示唆されました。

    社会進化の文脈の中で、オープンソースで皆がつながるという意義の重大性や、POA(Participate Oriented Architecture)というネットワークの開放性・外部性をもたらす概念の重要性を指摘された



    (関連)IT進化の軌跡



    SOAの反省とクラウドのイノベーション


     イノベーションとは、発明、発見、ビジネス、社会価値が合わさって展開されていくものである。前置きでいったように、結局、エンドユーザにSOAやGridを吹聴するだけでは、イノベーションが起きることはなかった。エンドユーザの方としては、ITベンダーには騙されないぞというよりかは、多くはわけわからんという感じだったと思う。SkypeなどP2Pの利用は一部であったものの、ことSOAに関しては、( ゚д゚)ポカーン 状態であり、それでいったい何ができるのか、理解されないまま終わったような感じだ。ITベンダーの方は、SOA!SOA!という掛け声をかけるのに一生懸命で、結局踊らされたのはITベンダー自身だったかもしれないとさえ思える。つまるところ、SOAに関しては、ビジネス、社会価値のポテンシャルはあるものの、活用という難問をエンドユーザに押し付ける形となっているのが問題であったと私は思う。

    一方、クラウドでは、利用者から見れば、サービスの提供という具体的な結果だけがもたらされる。クラウド内部では、ScalabilityやAvailabilityをもたらす技術、Fabricを形成する能力といった技術要素は隠蔽されているが、これは開発者から見ても同様で、単にRESTFulなAPIが用意されているのみで非常に易しい環境が提供されている。こういったことからも、クラウドが「サービス提供者と利用者の間に立つ仲介者(Mediator)の役割」として十分に機能することは容易に想像できる。そして、難しいところはすべて雲の上にお任せして、必要なものを必要なときに利用すればいいというような、シンプルなモデルへと変えることができるようになった。これはクラウドのイノベーションといえるだろう。

    クラウドは破壊的なイノベーションか

     クラウドが破壊的なイノベーションであるという話をちらほら耳にする。以下のつぶやきにはそれが端的に現れている。


    yusukef ・・ BASEトランザクションやCAP定理とかのファンダメンタル理解しないまま、フレームワークがあるからといってGAE/Jのアプリを設計&実装して大失敗して、クラウドだめじゃんとかって言わないでね


     これまでの手法が全く通用しないからという理由で破壊的であると決め付けるのは短絡的である。エンティティとURIが大事という、Reflexの設計思想は、RESTfulな設計に触発されたものだが、そのベースはWebサービスに遡る2004年頃の着想である。Reflexは流行っていないし、フレームワークが多くの人に利用されているわけではないが、RESTfulな設計という意味では共通するものがある。例えば、この頃、世界中の多くの開発者が同じようにインスピレーションを得て、2006年頃にはよく似たプロダクトが登場することになった。まず、IBMのsMashがReflexに非常によく似たものだったし、(関連記事)また、ReflexがGAEのJDOと親和性が高いのは設計思想が同じだからである。そして、Azureも同様の思想のもとでRESTfulなデータストレージを提供している。これは本当にビューティフルだなあと思う。Windows Azure ストレージサービス

     ここで、少々苦言をいいたい。

     クラウドが破壊的であると感じている人は、2004年頃に何を考えていたかを思い出すといいだろう。RDBが君臨している時代に、オブジェクト指向やRESTfulな設計に思いを馳せることは難しかったかもしれない。なので、あまり強くはいえないけれども、2006年になってもなお盲目的にEoDに邁進するコミュニティを見て、私なりに危機感を感じていたことは事実であった。

    楽をするために苦労を厭わない人たち - Seasarカンファレンス(秋)

    思考停止に陥っていたJavaに対して、一方のXML開発者はまだましだった。

    XML開発者の日


    まあ、過去のことは過去のこと。大切なのは現在、そして未来である。ほれいわんこっちゃないと私からいわれないよう、めげずに頑張りましょう!

    金曜日, 6月 19, 2009

    【雑記】 個の力、チームの力。私が会社をやって思うこと このエントリーを含むはてなブックマーク



     今回もクラウド研究会MLの私の発言から。

    江島さんのところのLingrも、発想はすばらしいものでしたが、コスト構造に問題あって閉じられるそうです。
     http://japan.cnet.com/blog/kenn/2009/05/01/entry_27022150/
    はてなさんがOSSだけで大規模システムを構築されて、おおっ!と思いましたけど、多分、これからはOSSだけでも厳しい時代になるんだと思います。

    こうなってくると必然的に私のような立場はGAEを「絶対的なもの」として妄信することになります。
    Lingrもクラウドであれば、もう少し延命していたかもしれません。わかりませんけど。



    これに対して、首藤さんは、人件費など別の指摘をされるとともに、これからの組織、個人について触れられた。

    数打ちゃ当たる、というか、数打たないと当たらない種類の取り組みなので。

    LUNARR も同様で、
    高須賀さんが 5/27 に IPAX2009 で御講演の中で
    「(ある種の) 事業をやるのに会社は要らない」
    とおっしゃってたというのは、そういうことだと理解してます。

    世界目指すベンチャー、既存のフレームを崩壊させよ--IPAXでLUNARR高須賀氏が講演
    http://v.japan.cnet.com/news/article/story/0,2000067548,20393976,00.htm

    「これまでスタートアップというと、会社を作って、優秀な人材をフルタイ
    ムで雇って立ち上げてきたが、現状では『事務所なんてスターバックスで
    いい』という動きになっている」(高須賀氏)


    同日午後のパネルで、僕は、
    知識産業というか何というか、ある種の領域では、
    個人のネットワークで動く部分が今後もどんどん広がっていく、っていう
    主張というか観測を述べました。

    個人ネットワークの時代へ
    http://www.shudo.net/publications/IPAX2009-panel/

    僕が「個人がすごく empower されてる」と言ったことに対して、
    ある方が「高須賀さんも午前中同じことを言ってた」と教えてくれました。



     たしかに、首藤さんのおっしゃるように、「個人がすごく empower されてる」のは、まちがいない。これを踏まえつつ、私はこう発言した。

     東大なのに「だって、プログラミングすきなんだもーん」といって、大手に就職しないOさんみたいな人、他にいるかもしれないでしょ。(安い給料ではきてくれないとは思いますけど、そこをなんとかしようよ。)

    私は敢えて、ワーキングプアな環境に身を置くことで自由を得て、好きかってなことをやっているわけなんです。(社員も同じですが、なにか?)

    私の場合、実は、サラリーマン時代も今とあまり変わらなかったりします。昔のIBMは懐が深かったなあ。

    それから、丸山宏さんの記事、http://japan.cnet.com/blog/maruyama/2009/06/08/entry_27022885/
    「スコットランドの歌姫」はいいですね。

    個人の力は増してきているかもしれませんが、それをどうやって社会と結び付けていくか。
    今のWebだけだと、ちょっと心もとない感じはしています。


     これをちょっと補足する。

     経済的にも精神的にも、個人は元来、弱いものである。理屈上は無限の可能性があるが、実際には出来ることは限られている。江島さんは、「今から思えば1人でできた仕事であった。4人は多すぎた」とおっしゃっているが、たぶん、1人では無理だろう。

     私も一人で会社を始めたものの、すぐに滅入ってしまうことが多かった。その一番の原因は不安からくるものだった。やはり、少なくとも2人、理想的には3~4人のチームで会社をやるのがいいと私は思う。それから、1+1=2ではなく、まちがいなく3以上の力になる。組織の力とはそういうものだ。
     ということで、3~4人が必要と考えると人件費が問題となるが、ここが一番努力すべきところ。そもそも、5000万/年は払いすぎだし、もらいすぎ。私から言わせれば、誰かに投資してもらったお金で人を雇おうという根性がまず甘い。自己資本でやると本当に雇うべき人が誰なのか、よくわかるものだ。

     また、ベンチャーは、「夢と自由」をひきかえに、敢えてワーキングプアーを選択する覚悟が必要であって、それは代表である自分自身も例外ではないはずである。そんな条件に合う人はなかなかいないかもしれない。でも見つけなければ何も始まらない。

     弊社は幸いにもスタッフに恵まれている。私以外に、プログラマー2名、デザイナー1名、経理1名と、決して高給ではないが皆非常に優秀である。

     狭いマンションを事務所としているが、ここにいるのは常時2名ぐらいで、あとはリモート環境でボイスチャットとGoogle Appsを使って仕事をしている。いわゆる、バーチャルオフィス。
    リモート環境で仕事しているのは、デザイナーとプログラマーの2人。デザイナーは私の甥っ子でまだ20才である。会社のホームページを作ってもらったが全部彼の手作りである。
     
     もう一人はプログラマーで主婦だ。生まれたての赤ちゃんを抱きながらボイスチャットに応対している。彼女はReflex iTextの担当。そして、週に一回毎月曜日にMTGをもち、全員が集まるようにしている。
     こんな感じで、極力コストを抑えて仕事をする努力をしている。

     それでも、今回のような不況がくると厳しい。

     今後は、クラウドの特性を最大限に生かしたサービスを開発して、多くのものを早く提供しなければならない。また、インターネット環境を最大限に活用して極力自動化することで、どこまでビジネスを完結できるか、これが一番のポイントになると考えている。

    木曜日, 6月 18, 2009

    【Google App Engine】 1アプリでもスケールするか このエントリーを含むはてなブックマーク



     負荷分散や高可用性のためにクラスタを構築する苦労がまったく不要なのがGAEのすごいところ。本当にそうなのか、モヤモヤしていたのでMLに聞いてみた。


    もしわかる方がいれば教えていただきたいのですが、1つのアプリケーションに対してリクエストが増えてきたときに、AppMasterから新たにデプロイされて、複数のAppServerによって並列に処理されるようになっているんでしょうか、それとも、1つのアプリケーションは1AppServerのキャパまでしか対応できないんでしょうか。

    「多数のアプリを同時に収容し、アプリ間の隔離性を確保する」

    ところまでは理解しているのですが、1アプリのスケーラビリティについて確認したかったもので、質問させていただきました。


    いろいろな方の回答があったのだが、そのなかでも実際の挙動に触れていて、一番信憑性がありそうなのは以下のポストだった。まあ、実際に確認するのはちょと難しそうだが、GAEでプロバイドすることでスケーラビリティが確保されることは確かなようである。

    メーリングリストより

    このあたりの話は

    http://groups.google.com/group/google-appengine/browse_thread/thread/2e65d8bc50f6bfd9/e6187c2f6052d6aa?show_docid=e6187c2f6052d6aa&pli=1

    が参考になると思います。

    簡単にまとめると、自分が作ったGAEアプリケーションに高負荷試験を仕掛けたけど、全然スケールしないじゃないか、と言っている人に対して、「GAEは通常の利用のされ方に関してスケールするようにできている」として、少しずつ負荷を上げていかないとだめだよーんという説明が書かれています。

    また、

    On 6月18日, 午後12:19, Atusi Nakamura wrote:
    > ある時点で、アクセスの急増が予想されるのであれば、1時間以上
    > 前から自分で負荷を与え続けて処理能力を増やしておくと良いかもしれな
    > いと言われました。

    に関してですが、ひとつのソースから負荷を与えつづけても、DOSアタックとして認識されてしまい、処理能力は増えないのではないかという話も書かれています。実際このスレッドの最後の記事は、「ゆっくり負荷を上げているけど、やっぱりだめだよー」という内容になっています。

    # これに関して誰もコメントを付けていませんが。

    --
    toh


    【Google App Engine】 Google App Engineのtips集 このエントリーを含むはてなブックマーク


     すばらしいサイトを発見。一から勉強したい方におすすめ。
     Google App Engineのtips集

    【クラウドコンピューティング】 エンタープライズへの移行シナリオ このエントリーを含むはてなブックマーク


    M先生がメーリングリストで、クラウドの「楽観的」シナリオを述べられている。
    全文いい内容なので転記します。


    議論が、収束しそうですので、問題提起。

    >> ですからエンタープライズ分野の情報サービスの
    >> クラウドへの移行はなかなか進まないんじゃありませんかね?
    >
    > ええ、進まないと思います。エンタープライズは無理でしょう。

    本当でしょうか?

    僕は、クラウドの本当のインパクトは、エンタープライズがパブリック・クラウ
    ドを使い始めたときに起きると思っています。もちろん、今すぐに、それが起き
    るとは思っていません。来年から、変化が始まるのではないかと。始まりの始ま
    りです。それは、同時に、従来型のシステムの終わりの始まりです。

    もっとも、一気に勝負がつくとも思っていなくて、散発的な前哨戦からはじまっ
    て、いくつかの激しい局地戦があって、戦線が拡大していくというようなイメー
    ジです。基本的には、設備更新のサイクルが一巡する4-5年先、二巡する8-10年
    先が、勝負の節目になるはずです。あるいは、次の15年が必要かもしれません。

    僕らは、実は、同じような経験をしていています。メイン・フレームとUNIXを中
    心としたオープン系のシステムの対抗の歴史が、まさにそうだったと思います。

    今回は、パブリック・クラウドとプライベート・サーバの対抗が、UNIXとメイン
    フレームの対抗と、同じような「タイムスケール」で進むのではという話をして
    みたいと思います。今年の話でも、来年の話でもなく、一定の時間をかけて、し
    かし確実に変化が進むだろうという、「長めの時間軸」での予測です。

    この前「UNIXの思い出とCloud OS」(タイトル勝手に変えられましたが)という
    原稿を書いていたのですが、僕らがUNIXを始めた30年前には、それがエンタープ
    ライズで使えるようになるとは、誰も考えていませんでした。

    それが、約20年前に、Sunが起業し、SybaseやOracleがUNIX上のデータベースを
    商品化します。その少し前に、PCが生まれ、マイクロソフトがPC上のOSで成功を
    収めます。現在のIT業界のメインプレーヤは、この時期に生まれています。彼ら
    の成功の過程は、基本的には、それまでのメインフレームの牙城が崩れる過程と
    表裏一体です。

    もちろんメインフレームは生き残っていますし、COBOLだっていまだに元気で
    す。ただ、それは、残存としてですね。(社会経済的には、こうした残存物を
    「ウクラード」と呼びます) ウクラードは残っているものの、この対抗は、基
    本的には、「一定」の勝負がついたように、僕は思っています。

    エンタープライズのコンピュータといえば、メインフレームしかなかった時代は
    終わりました。といって、メインフレームの旗手だったIBMがいなくなったかと
    いうとそうじゃないですね。それは、IBMが賢明にも、オープンシステムへのレ
    ンジを意識的に広げたからです。もっとも、UNIVACとかHoneywellとか、ちょっ
    と記憶があいまいなのですが)いくつかのメインフレーマは、姿を消しました。
    業界二位だったDECも、なぜか事業に失敗します。大変動があったんです。

    僕は、現在のパブリック・クラウド vs プライベート・サーバの対抗も、同じよ
    うな推移をたどると思っています。20年前のSunやOracleやマイクロソフトに、
    メインフレーマは脅威を感じたでしょうか? 多分、ノーです。15年前はどうで
    しょう? まだ、現在のような流れは明確ではなかったと思います。10年前は、
    前哨戦の時期が終わり、局所的な激戦が戦われます。Internet、Javaが登場し、
    サーバーサイドの流れが強まります。

    大事なことは、攻める側・守る側の立場は、会社レベルで言えば、固定的なもの
    ではないし、当初の戦力の違いは、技術革新によって、新しい兵器が投入される
    ことで、大きく変わります。10年-20年のスパンで考えれば、クラウドでも、同
    じことが、きっと起こります。

    あまり正しい比較ではないのですが、GoogleやAmazonやSalesforceは、当時の新
    興勢力としての、Sun,Oracle,Microsoftに対応するし、従来の立場を転換するこ
    とで、オープン系の勝利に貢献したIBMの役割を、今のマイクロソフトが果たそ
    うとしているように見えます。

    基本的には、システムの変化は、産業循環の長い周期の中で議論しないといけな
    いと思っています。「エンタープライズ分野の情報サービスのクラウドへの移行
    はなかなか進まない」「エンタープライズは無理でしょう。」というのは、現状
    の認識としては、正しいでしょう。でも、それはショート・レンジの認識です。
    この現状が、この先も続くとは、僕は思っていません。

    むしろ、技術論よりは、営業の立場に立つと、両者の戦いが、どう進んでいくの
    かがよく見えてくると思います。

    現時点では、Amazonを除いては、パブリックなクラウドを利用したシステムの提
    案は、難しいです。売るものがないのですから。ここでは、「エンタープライズ
    は無理」というのは、正しいのです。

    来年は、どうでしょう。ちらほら、商用化されたパブリック・クラウドを部分的
    に利用した提案が、出てくるでしょうね。対抗陣営としては、営業レベルでは、
    「エンタープライズでは無理」というセールス・トークが、重要になります。ク
    ラウドに懐疑的なイデオローグは、今より、重用されるでしょう。多分、大勢と
    しては、そちらが優勢でしょう。

    さ来年は、どうでしょう。きっと、二年もあれば、模様眺めしていたり、パブ
    リック・クラウドを批判していた人たちの一部は、クラウドでもプレゼンスを示
    さなければと考え始めるでしょう。でも、大勢としては、現状維持勢力が強いで
    しょうね。ただ、営業での激しい戦いを反映して、セールスとしては、不安をあ
    おるだけでは営業が出来ないと、価格でも対抗しようとするでしょう。でも、そ
    れは、ボディ・ブロウのように、自分のビジネスにきいてくるはずです。クラウ
    ド側では、その時点での最適な、組み合わせを提案の中心にするようになるで
    しょう。

    まあ、このあたりでやめておきましょう。これぐらいが、僕の一番、「楽観的」
    なシナリオです。

    水曜日, 6月 17, 2009

    【雑記】 JavaがGAEで復権しそうだけどLLの方がいい このエントリーを含むはてなブックマーク


     嬉しいことに、連想配列からXMLに変換するJavaScriptが海外のQ/Aサイトで参照されている。

    www.experts-exchange.com
    abel:
    But this is perhaps simpler: http://www.virtual-tech.net/resources/json2xml.html. It contains a small JavaScript snippet (yes, I know you use Java), that shows how to parse the JSON code into XML. See the source of that page (the popup shows only the output).

    avernet:
    2) http://www.virtual-tech.net/resources/json2xml.html

    This is some very simple (= good!) code that uses Prototype. I don't fancy Prototype, but maybe will run with the idea. (I would have preferred a more robust, server-side solution to this.)


     日本語なのによく見つけたなあ、というのはさておき、これがJavaだったら、こんなふうに海外で見つけられることもなかっただろうとも思う。そもそもシンプルに書けないしね。まあ、気持ちの問題が大だけど。

    以下は下請けでいやな思いをしたときの愚痴メモ。


     Javaには、短く、エレガントに書く発想というか、そういう文化はないよね。単純に書くとチープだと思われてバカにされるし、むしろ不必要なスレッド処理とかやって無駄に長い方がすげーと思われるでしょ。だって、このプロジェクトなんてステップ単価ですよ。正規表現で書いた部分まで書き直させられたら、心折れるっつーの。


     一方、LLの代表であるRubyはというと、(ThoughtWorksでのRuby あおうさ@日記より)

     我々の強みは、典型的なIT企業では引き込めないような非常に有能な人たちを雇用しているという点だ。 Rubyには、あまり有能ではない開発者をエラーから守るよりも、 有能な開発者がさらにうまく物事を成し遂げられる環境のほうがよいという哲学がある。 Rubyのような環境を使うことで、我々の開発者たちは真の価値を生み出す能力を与えられているのである。


     これ、すっごくわかる。

     私の感覚では、アセンブラ<<C<Java<<LL、の順で、生産性は断然LLの勝ちです。それから生産性以上に大事なのは、rubyのような「真の価値を生み出す」こと。先の私のJavaSciptコードは、たった14行しかないんですよ。たぶん、rubyも同じように書けると思うし、そう書きたくなるような文化なわけでしょ。こないだの、Tokyo Cloud Developers Meetup で「何でJavaなんか使うんですか」と聞いていた方がおられたけど、それは、とても正しい質問。私もああ、GAEはやっぱりPythonがいいかもね、と思うときがある。

     Javaは昔から悪運が強くて、AppletでダメになりかけたときにServletで復活した。元々生産性が低かったんだけど、Eclipseのおかげでなんとか開発できるようになった。StrutsやDIで辟易してWeb2.0全盛期にLLに走った人も多かった。Javaは言語仕様的にダメダメで、もう寿命は尽きているんだけど、今はGAEとAndroidで延命しそうな感じになっている。

     え?何で私がJavaやってるかって?そりゃ、ビジネスのためですよ。ビジネス。というのは冗談で、強いて言えば、パフォーマンスとセキュリティだね。少なくとも開発生産性ではない、絶対に。そのあたりはGoogleも同じ考えだと思うよ。



    <関連>
    最も初心者向けの言語はJava or PHP?
    Javaが本領を発揮する場面とは
    僕とTAKE-DOS、ちょっとだけJava批判

    火曜日, 6月 16, 2009

    【クラウドコンピューティング】 パブリッククラウドとビジネスモデル このエントリーを含むはてなブックマーク


     昨日、クラウド研究会のメーリングリストのなかで面白い議論を見つけた。これは、public cloudとprivate cloudの違いという感じの話から始まった。私は、クラウドのバズワード化に拍車をかけている現状、つまり、ITベンダー各社がこぞってクラウド対応を発表していて、何が本質で、何をクラウドと呼べばいいのか分からなくなってきた状態を整理するという意味で面白いと思った。(でも最後は不都合があって、もうしないと宣言されてしまったのだが・・)

    技術要素について:M先生

     パブリック・クラウドには、これまでのサーバ技術にはなかった、次のような新しい技術的な内実があります。

    ・Scalability
    ・Availability
    ・Databaseとの一体化
    ・BASE Transaction
    ・Fabricを形成する能力

    ビジネスモデル、ユーティリティーコンピューティングについて:Sさん


     元IBMのS氏は、「H/Wベンダー、S/Wベンダーそして色々な思惑のある連中が共通する利益追求目的で唱えたのがプライベート・クラウドでしょう」と言い切る。

     BlueWorksの発表も、結局は高価なソフトウェアを購入してもらうためのBaitでしか有り得ないわけですが、OSSで広がった安価なソフトウェア(でも大丈夫なんだという)の現実は、クラウドの登場によって、ハードもソフトも買わなくていいんだという、さらに過激な世界が、ユーザーに受け入れられていくというインパクトです。
     ミドルウェア・ベンダーのビジネス・モデルは、高機能なミドルを開発し、高価な値付けで売って開発費を回収し、利益も出すというものですが、そのライセンス販売の仕組みに大きな影響を与えていくのがAmazonであり、Googleです。この二つを、AmazonやGoogleはIntegrateして、別の解決策があるよ、と示したわけです。

    ビジネスモデル、コストについて:私


     publicクラウドを見たときに、敢えて技術要素には触れないで強調すべきことがあるとしたら、次の2点になるんじゃないかと。

    1) ネット上でビジネスが完結している点。クレジットカードさえあれば、誰でもすぐにでも利用できる。

     これは私たちも目指すところなんですが、すべて自動化するという、ネットをこれほど活用するビジネスのやりかたには、ほんと驚かされます。営業がいるわけでもなく、SEが使い方をコーチするわけでもなく、エンドユーザ(今のところ開発者主体ではあるけれども)が勝手に申し込んで自由に使えるような環境を提供している。ネットのもつポテンシャルの大きさという意味で、私自身、まだ認識が甘いのかなあと、思い知らされますね。

    2) べらぼうに安い点

     宣伝で申し訳ありません。先日、弊社のホームページ(http://www.virtual-tech.net/)をGAEに立てたのですが、その際にかかった費用は、独自ドメイン代の950円/年だけでした。Blogの広告収入が少なく見積もって3000円/年はありますから、なんと黒字になっちゃうんです。
     もちろん、制作費はかかりますよ。でも、全部手作りなので人件費で換算して数万円ぐらいです。安いレンタルサーバに置くより速いし、なんといってもタダなのはいいですね。零細企業の私たちにピッタリのモデルです。なんでこんなに安くできるのか不思議なんですが、一番大きな理由が、たぶん、本業で余ったリソースを提供しているからなんだろうと私は考えています。Googleの本業は検索エンジンでAmazonはECですよね。Googleはコンテナ型データセンターでPUEが1.21なんていう話もクラウド大全にはありましたけど、電力効率なども含めた低い運用コスト以上に、余ったリソースの貸し出しは大きい要素なんだろうと。こんな真似ができるところって限られていますよね。


     実は、1)については、私自身、重要性に気づいたのは、つい最近のことである。きっかけは、先週の金曜日に、Androidをもって、ある社長(ブログ)を尋ねていったときのこと。今後のビジネスモデルについて提案させていただいたのだが、一言で「甘い」と一蹴されてしまったのだ。たしかになんとなく自分でも他力本願というか、ライセンシーをお願いされた方も、ビジネスが付いてこなきゃ意味がないわけで、普通に営業をやって、仕事を請け負う従来のビジネスモデルとなんら変わりのない。営業やサポートの人数も限られている。そもそも、「どうやって売っていくんだ」ということである。

     ところが、もし、ネット上でビジネスが完結できれば、この問題は解決する。アフィリエイトだってあるし、PayPalだってある。PayPal は、個人(サービス提供者)でも契約や長期間のコミットを必要とせず、利用した分だけ支払う手頃な額の取引手数料を支払うだけでクレジットカード支払を受け入れることができる。自分自身、Blogをやって、ネットのもつポテンシャルの大きさを感じているにもかかわらず、このビジネスモデルを何でやろうとしないのか・・・・、いろいろ反省しなきゃと思った次第である。まあ、AmazonやGoogleのようにやれると思い込んでいる自分に、今度は「信用」という厚い壁に潰されることになるだろうと、思わんでもないが。

    <追記> Fさんが紹介してくれた翻訳版、これいいですね。=>Above the Clouds: A Berkeley View of Cloud Computing

    土曜日, 6月 13, 2009

    【お知らせ】 バーチャルテクノロジーはお蔭様で6周年 このエントリーを含むはてなブックマーク


     2003年6月13日に生まれた弊社は今年で6周年を迎えました。これまでなんとかやってこられたのも、お客様、パートナー様、社員の皆さんが支えてくれたおかげです。心から感謝申し上げます。
     さて、6周年を記念して、ホームページとBlogをリニューアルをいたしました。今後とも、バーチャルテクノロジーをよろしくお願い致します。

    月曜日, 6月 01, 2009

    【Google App Engine】 JDOから直接SOAP、ATOM。それからDeep Copy このエントリーを含むはてなブックマーク


     Reflexを使ってJDOからSOAPに変換するサンプルとATOMに変換するサンプルを作ってみた。これらは Reflex Core Samples(2005年作成)をGAEに移植したものだ。

    reflexworks




     O/Rマッパに慣れている方は不思議に思うかもしれないが、ReflexではEntityの構造がXMLの構造になるため、DXOのような詰め替えが必要なく、またマッピング用定義ファイル等も必要ない。
     下図は実際の保存イメージである。SOAPやATOMのデータはReflexによりJDO Entityに変換され、1Entityが1TableのようなイメージでDatastoreに保存される。Entityはオブジェクトの形で保存されるが、各Entityは別々に管理されており、Tableのようにカラムとバリューによる表のイメージとなっていることがわかる。Entityどうしの関係は別途Keyによって紐ずけられているので別々に管理されていても大丈夫なのである。



    Reflex Core Samplesを移植するにあたって、Reflex Core本体にも手を入れたので補足したいと思う。

    com.google.appengine.api.datastore.Text型をサポート


     Datastoreに保存する際に、String型では500文字以上扱えないため、大きなサイズのものを扱う場合はText型を使用する必要がある。JDOにStringで定義していたプロパティをTextにすると大きなサイズでも保存できるようになる。ただしIndexは付かないので注意が必要である。サンプルではAtomのContentでTextを使用している。

    同じスキーマのEntityを異なるものとして扱う

     実際に、ATOM Sampleを見ていただくとわかるが、Feed要素の子要素にはAuthorとEntryがあり、かつ、Entryの子要素にも同じスキーマのAuthorがある。AuthorはFeed要素の子要素、つまり、「1対多」の関係が既に定義されているので、Entry要素の子要素としては定義することができない。そこで、複数のパッケージ名を同じ名前空間に指定できるようにして、同じクラス名であってもパッケージ名が異なれば違う要素として扱えるようにした。例えば、List<foo>.SampleとList<bar>.Sampleは異なるEntityとして区別される。こうすることで、Datastoreには異なるEntityとして保存されるようになる。これは同じスキーマのテーブルを2つ持つことと同じような意味である。
     
    EntityのDeep Copy

    上記のように同じスキーマの複数のEntityがあると、すべてのプロパティをコピーできるようなDeep Copy機能が欲しくなる。
     同じスキーマであれば以下のようにすることでDeep Copyが簡単にできる。


    // entryのAuthorをfeedのAuthorにDeepCopy
    IResourceMapper mapper = new ResourceMapper("jp.reflexworks.atom.entry");
    IResourceMapper mapper2 = new ResourceMapper("jp.reflexworks.atom.feed");
    jp.reflexworks.atom.feed.Author author3 = (jp.reflexworks.atom.feed.Author) mapper2.fromXML(mapper.toXML(author));



    <関連>

    Entityとトランザクション
    JDOから直接JSON、XML
    AXIS2のデータバインディング能力
    AJAX CRUDサンプルとJDO代替ライブラリ
    Pagingをどうやって実現するか
    RESTfulアプリのCRUDサンプル -Servlet編-
    RESTfulアプリのCRUDサンプル -Modeling編-

    火曜日, 5月 26, 2009

    【Google App Engine】 開発で嵌らないためのTIPS このエントリーを含むはてなブックマーク


    1.Eclipseでプロジェクト名を変更した場合は作業ディレクトリも変更する



    2.Systemプロパティはappengine-web.xmlに記述する



    3.DataNucleus Enhancerでエンハンスされているか常に気にしておく



    4.LocalのDataStoreは掃除する



    5.Localでは実行できるのにサーバにDeployできない場合はサーバのデータをClean upする



    6.Logを参照することでサーバ上の動作確認をする

    土曜日, 5月 23, 2009

    【Google App Engine】 JDOから直接JSON、XML このエントリーを含むはてなブックマーク


    GAEに対応したReflex Coreを公開

      Entityとトランザクションでも触れたが、GAE対応したReflex Resource Mapperを公開したいと思う。Reflex Resource Mapperは、XML/JSON⇔JavaBeanのバインディングツールで、JDOと直接マッピングできる点がウリだ。デモサイトを見てもらうとわかるが、ブラウザからJSONを受け取ってJDOに変換してDatastoreに直接保存できる。この処理は以下の2行で書ける。


     loginnew = (Login) mapper.fromJSON(req.getParameter("json"));
    JdoUtils.insert(loginnew);


     デモではJSONを受け取っているが、mapper.fromXML()とすることで同じ構造をしたXMLも受け取れる。
     設定も簡単で、4つのjarファイルをGAEのアプリケーションに追加するだけですぐに使うことができる。また、特別な設定ファイルなどは必要ない。

    Reflex Core Sample
    デモサイト
    SVN (Google code)

     Reflexでは、RESTfulな新3層アーキテクチャや、APIをやめデータ構造に着目するなどでも説明しているとおり、Entityの設計に重きを置き、その構造のままEntityをCRUD(HTTPでGET/POST/PUT/DELETE)するといったRESTfulな設計を目指す。また、これを容易にするために、reflexentityeditorといったツールや、トランザクション処理に対応したReflexContainerなどを準備している。

    JDO設計における注意点


     私も嵌ったが親子関係をもつJDOの設計には注意が必要である。以下のようにBeanは基本的にEmbededでない限り、@PersistenceCapableと@PrimaryKeyの定義が必要である。(これは”おまじない”と思った方がいい)


    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class Content {
    ・・・
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    ・・・
    }


    さらに、1対多の場合は、子(Content)に親(Login)のプロパティを定義する必要がある。

    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class Content {
    ・・・
    @Persistent
    private Login login;
    ・・・
    }

    <関連情報>

    JDO problem with owned one-to-many relationships and superclasses


    同一型の子Entityを持つと、子Entityの判断がつかない


    GAE対応する際に苦労した点


     ReflexをGAEに対応させるためにやったことは次のとおり。

     1.Making XStream compatible with the Google App Engineを参考に、NoClassDefFoundErrorやExceptionInInitializerErrorをcatchして握りつぶす行を追加。
    try {
    registerConverter(new PropertiesConverter(), PRIORITY_NORMAL);
    } catch (NoClassDefFoundError e) {
    } catch (ExceptionInInitializerError e) {
    }
     2.sun.reflect.ReflectionFactoryを使ったクラスSun14ReflectionProvider.javaからPureJavaReflectionProvider.javaを使うように変更
     3.一旦、JDOに保存されたものを取り出すと、java.util.ArrayListオブジェクトがorg.datanucleus.sco.backed.Listに勝手に変わるのでinstance ofが使えない。これはクラス名を指定することで使えるように修正した。


    <関連>
    JDOから直接SOAP、ATOM。それからDeep Copy
    AJAX CRUDサンプルとJDO代替ライブラリ
    Pagingをどうやって実現するか
    RESTfulアプリのCRUDサンプル -Servlet編-
    RESTfulアプリのCRUDサンプル -Modeling編-

    金曜日, 5月 22, 2009

    【Reflex】 段階的にScale可能なPDFサービス このエントリーを含むはてなブックマーク


     最近、Amazonのクラウドサービスがすごい。Amazonクラウド、大規模データをHDD郵送で受け入れなんて、Amazonならではの強みを生かしたサービスといえよう。特に目をひいたのは、Amazon CloudWatch(インスタンス監視サービス)、Amazon Elastic Loadbalancer(ロードバランサー), Amazon AutoScaling(自動スケールアウト機構)などの機能で、これらを利用することで、負荷に応じて自動でマシンを起動する、AutoScalingという仕組みを作れるようになる。
     ということで、Reflex itextとAutoScalingを使って、Scalable PDF Serviceというものを構築することにした。





     前面にGAEを置いてバックエンドのEC2にディスパッチしている。GAEでデータの作成およびキャッシュ機能を持たせることにすることで、余分な負荷をなくすことができ、また懸案のレイテンシーも問題にならずにすむ。Amazon EC2は北米と欧州にあるので、どうしても「もっさり感」が出てしまうがGAEであればサクサクとレスポンスが返ってくる。GAEは制約が多くて使いづらい面も多いが、EC2と組み合わせることで、それぞれの強みを生かした非常によいサービスを提供できるようになる。

     ( Reflex itextも当初はGAE上で構築することを考えていたが、java.awt.*パッケージが使えないことで断念した。No Graphics?

    月曜日, 5月 11, 2009

    【Google App Engine】 BigTableのJDBCラッパー jiql このエントリーを含むはてなブックマーク


    GAE/JでSQLをどうしても使いたい方に朗報。jiqlというものを使えば、jdbc clientとしてBigTableに実際に保存されたデータにアクセスできるようになる。



    これを使えるようにするには、jiqlのページから、jiql.jarとjiql.jspをダウンロードして、GAEアプリケーションに配置すればよい。それぞれ、WEB-INF/lib/の下と、./に置く。
    ただし、jiql.jspにはBugがあり、jspコンパイル時にエラーとなるため、以下のように修正する。(try catchのスコープ外でString sql=""を定義する)

     jiql testpage

    jiql testpageでは、hostやuser、password、datasourcenameを入れる箇所があるが、とりあえず何も入れないで、exampleのsqlを入れてqueryボタンを押すだけで実行結果が見れる。

    ただ、JOINが使えないのを見ればわかるように、まだクラウドでSQLを使うのは無理があるように思う。将来使えるようになったとしても、トランザクションやパフォーマンスのことを考慮すると、結局クラウドの作法に立ち戻るはめになるだろう。個人的には、トランザクションプロセッシングを司るアプリからはSQLを無理に使うべきでないと思うし、使ったところで結局はO/Rマッパが必要となるので嬉しくない。
     SQLが真価を発揮するのは情報系データベースである。これは別システムとして立てることで、クラウドからデータを受け渡すようにすればよいと思う。



    ・・・
    ResultSet result = null;

    Connection Conn = null;


    String status = "";
    String url = "jdbc:jiql://local";
    String host = "";
    String password = "";
    String user = "";
    String dsName = "";
    String sql ="";

    if (request.getParameter("query") != null){

    try{
    sql = request.getParameter("sql");
    if (sql == null || sql.length() < 1)
    throw new SQLException("Please Enter a valid SQL Statement!");

    Properties props = new Properties();
    props.put("user",user);
    props.put("password",password);

    Class clazz = Class.forName("org.jiql.jdbc.Driver");
    Driver driver = (Driver) clazz.newInstance();

    Conn = driver.connect(url,props);


    Statement Stmt = Conn.createStatement();
    Stmt.execute(sql);
    result = Stmt.getResultSet();
    status = sql + "
    SQL COMPLETED SUCESSFULLY";
    }catch (Exception ex){
    status = "" + sql + "
    SQL FAILED " + ex.toString() + "
    ";
    ex.printStackTrace(response.getWriter());

    }
    //Conn.close();
    }
    ・・・
    以下同じ

    土曜日, 4月 25, 2009

    【Google App Engine】 Entityとトランザクション このエントリーを含むはてなブックマーク


    Entity設計について

     GAEではEntityというモデルを定義してJDOを使ってデータを永続化する。Entityはオブジェクトモデルであり画面など実際の業務アプリケーションや外部インターフェースなどを直感的に表現できるという点で優れている。しかし、階層型ということもあり、リレーショナルなモデルとはあまり馴染まない。もしかしたら、これまでRDB的な設計を中心にやってこられた方にとっては苦痛さえ感じるかもしれない。Entityをうまく設計するためには、ひとまずRDB的な頭をリセットしてオブジェクト的な発想をすることをおすすめする。一度慣れてしまうと誰でも簡単にサクサク作れるようになるだろう。逆に、RDBの呪縛から開放されOOに覚醒してしまうともう後には戻れないので注意が必要である。RDBって不要じゃん?とか、これからの時代はOOでKey/Valueだ!などと思うようになれば覚醒した証拠だ。だがこのモデルがRDBにとって代われるかというとそうではない。特に運用面を考えると全く使い物にならないだろう。データ操作はSQLとは比べ物にならないぐらい酷いので、完全移行はそれほど甘くはないと心得ておくべきだ。現時点のクラウドはあくまでXTP(eXtreme Transaction Processing)基盤として考え、RDBはデータウェアハウスなど裏で動く情報系システム用として考えるとよいと思う。モノシリックなアプリはRDBで動作するがあくまで正はRDBであるとする。(このようなハイブリッド方式は、Reflex BDBでも採用している)

     オブジェクトモデルを使ってEntityを設計する方法については実はReflexも同じである。ReflexはGAEが出る前から存在するフレームワークであり、決して真似して作ったたわけではないが、偶然にも非常に似た考え方で設計できるものとなった。具体的には、ZEROからRESTfulアプリを作成を見ていただくと分かるのだが、週報アプリ画面から実際にEntityを作成しながら開発している。


     1.画面のモックアップを作る
     2.モデリングを行い画面のEntity(Model)を作成する
     3.テーブルのEntityを作成する(DAO)
     4.Entityのインスタンスを作成する


     また、Entityはマインドマップなどを使って直感的に生成できる利点もある。下図はReflex表現(画面左)を使ってEntityを定義してマインドマップを生成した様子である。
     Reflex表現さえ作成できればマインドマップを作成できるし、Entityのソースも自動生成できる。Reflex表現は、今流行りのドメイン特化言語のようなものだが非常にシンプルな表現でEntityを作成できることが特長である。Reflex表現の詳細は、Reflex Entity Editorを見てもらえればわかるが、要は、要素の型と多重度、および親子関係を定義するだけである。



    ReflexとJDOの共存

     JDOのEntityとReflexのEntityは同じ構造をもてる。例えば、上のマインドマップで、one-to-manyを示すものはReportとactivityであるが、これはReportクラスのListプロパティとしてactivityを定義したものとなる。これはJDOもReflexも全く同じ。Entity定義におけるJDOとReflexの違いは、JDOはデータの永続化のために使うマーカとして、@PrimaryKeyや@Persistentなどアノテーションを使うのに対し、Relfexは主にXMLやJSONなどの出力対象をpublicにするなど、CoC(設定より規約)に基づく考え方で生成することである。(詳細=>reflexcore)CoCは規約を覚える必要があり敷居を高くしているがReflex Entity Editorなどの自動生成ツールがそれを補っている。
     また、偶然の産物であるが、両者はお互いに干渉しないため、永続化と外部インターフェースを1つのクラスのなかで表現できるというメリットが生まれている。

    Entity Groupsとトランザクション


     GAEでは、全てのentityはentity groupに所属しており、entity group単位でトランザクションを実行できる。先ほどのReportとactivityの例のように親子関係をもっているものは、同じentity groupとみなされ同一トランザクションのもとに扱うことができる。以下の例は1対多の関係を持ったEntityの場合であるが、1対1の場合についてもListの代わりに単独のクラス名になるだけで同様に考えることができる。(追記:親子関係については嵌りやすいので注意=>JDOから直接JSON、XML

    Owned_One_to_Many_Relationships


    import java.util.List;

    // ...
      @Persistent
      private List contactInfoSets;



    また、子から親へのパス(双方向パス)をつけたいときは、@Persistent(mappedBy ="employee")のように、子のキーを示すアノテーションを親のクラスに追記すればよい。


    import java.util.List;

    // ...
      @Persistent(mappedBy = "employee")
      private List contactInfoSets;


     トランザクションは、以下のように、PersistenceManager(シングルトン)を使いpm.currentTransaction()を呼び出すことで、txコンテキストを取得する。tx.begin();でトランザクションが開始、tx.commit();でコミット、tx.rollback();でロールバックとなる。以下の例では、tx.begin();で開始、ClubMembersのインスタンスをキー”k12345"で取得して、インスタンスのカウントを足した後、pm.makePersistent(members);で永続化、tx.commit();でコミットしている。


    import javax.jdo.Transaction;

    import ClubMembers;  // not shown

    // ...
        // PersistenceManager pm = ...;

        Transaction tx = pm.currentTransaction();

        try {
          tx.begin();
      
          ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
          members.incrementCounterBy(1);
          pm.makePersistent(members);
      
          tx.commit();
        } finally {
          if (tx.isActive()) {
            tx.rollback();
          }
        }



     これは楽観的ロックの仕組みであり、tx.begin();の後でもロックがかかっているわけではないので注意が必要だ。つまり、他のプロセスが同じインスタンス”k12345"を読むことができるが、使用中の場合は、java.util.ConcurrentModificationExceptionが発生し、JDOはJDODataStoreExceptionかJDOExceptionをスローする。また、JDOは1回しかトランザクション処理を行わないため、何回か繰り返し実行してコミットできたら抜けるように、アプリケーション側(以下参照)でフォローしてあげなければならない。
    ちなみに、同一トランザクション内で複数のentity groupを更新しようとしても、JDOFatalUserExceptionが発生してコミットできないようになっている。

    What Can Be Done In a Transaction


     for (int i = 0; i < NUM_RETRIES; i++) {
          pm.currentTransaction().begin();

          ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
          members.incrementCounterBy(1);

          try {
            pm.currentTransaction().commit();
            break;

          } catch (JDOCanRetryException ex) {
            if (i == (NUM_RETRIES - 1)) {
              throw ex;
            }
          }
        }



    関係を持たない複数のEntityのトランザクション

     関係を持たない複数のEntityをEntity groupとすることで1つのトランザクションとして実行できるようになる。それは、以下のように、keyBuilder.addChild()を使って、一方のEntityのキー生成を他方のキー生成と結合させることで行う。
     
    Creating Entities With Entity Groups

    import javax.jdo.annotations.IdentityType;
    import javax.jdo.annotations.IdGeneratorStrategy;
    import javax.jdo.annotations.PersistenceCapable;
    import javax.jdo.annotations.Persistent;
    import javax.jdo.annotations.PrimaryKey;
    import com.google.appengine.api.datastore.Key;
    import com.google.appengine.api.datastore.KeyFactory;

    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class AccountInfo {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Key key;

      public void setKey(Key key) {
        this.key = key;
      }
    }

    // ...
        KeyFactory.Builder keyBuilder = new KeyFactory.Builder(Customer.class.getSimpleName(), "custid985135");

        // AccountInfoのキー生成をCustomerのキー生成と結合させる
        keyBuilder.addChild(AccountInfo.class.getSimpleName(), "acctidX142516");
        Key key = keyBuilder.getKey();

        AccountInfo acct = new AccountInfo();
        acct.setKey(key);
        pm.makePersistent(acct);


    また、Entity group内の親キーにアクセスするには、以下のようなアノテーションを追記すればよい。


    // ...
      @Persistent
      @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
      private Key customerKey;


    ちなみに、関係を持たない複数のEntityを、Entity Groupとして定義すると、分散ネットワークの同じ場所に格納される。これは、あるトランザクションで遠くにあるentityが関係すると大量のネットワーク通信が発生し性能が落ちてしまうのを避ける目的がある。Entityがあちこちのサーバに散らばってしまうのはまずい。

    ただ、What Can Be Done In a Transaction

    Every entity belongs to an entity group, a set of one or more entities that can be manipulated in a single transaction. Entity group relationships tell App Engine to store several entities in the same part of the distributed network.


    によれば、分散ネットワークの同じ場所とあるだけで、それがBigTableの同一row(行)なのかTabletなのか、あるいは、その両方でもないのか、不明である。(昨日のクラウド研究会でGregor Hohpeさんは、EntityはRow単位で、いろんなところに格納されるといっていたような気がする。資料=>ProgrammingCloud

    BigTableの行(row)


     1.名前は、任意の文字
     2.1行のデータへのアクセスは、atomicである
     3.行は、データを格納する際に、自動的に作成される
     4.行は辞書式順序で並べられている
     5.通常、行は1台または数台のマシン上に、辞書式順序の近い順番にまとめられる


    BigTableのTablets


     1.大きなテーブルは、行の境界で、タブレットに分割される
     2.タブレットは行の連続する範囲を維持する
     3.クライアントは、局所性を達成するために、行のキーを選択できる
     4.1つのタブレットあたりの100MB~200MBが目処


    総括

     1.Entity設計はオブジェクト設計を元にする必要がある。また、ドメイン特化言語を利用することで生産性向上を期待できる。

     2.BigTableなどBASEを元にしたGoogleの基盤技術を使うGAEであるが、トランザクションの機能を使うことでConsistency(整合性)が保証されるアプリケーションを組むことができる。ただし、1UOW(Unit Of Work)= Entity Groupとなる。
     
     今でもモヤモヤしているのは、Entity Groupの粒度をどうすればいいかという点。かなり強引だけどSCAに当てはめて考えてみる。Entity GroupはSCAでいうところのComponentに相当するのだろうが、さらにCompositeで括ったときのトランザクションがどうなるかわからない。今の流れからして、2phase commitはやるべきではない、ということにはなりそうだが。



    <関連>
    JDOから直接JSON、XML
    JDOから直接SOAP、ATOM。それからDeep Copy
    AJAX CRUDサンプルとJDO代替ライブラリ
    Pagingをどうやって実現するか
    RESTfulアプリのCRUDサンプル -Servlet編-
    RESTfulアプリのCRUDサンプル -Modeling編-
    Entityとトランザクション2

    木曜日, 4月 23, 2009

    【クラウドコンピューティング】 RDBをクラウドに載せるべきか このエントリーを含むはてなブックマーク


    グーグルはリレーショナルデータベースをクラウドに乗せるかというおもしろい記事を見つけた。ビジネスアプリケーションを載せてもらうことを本気で考えているのであればAzureのようにGoogleもRDBを載せるんじゃないかと。

    コメント欄には次のようにあった。

    RDBを実装するということが、ACID対応バッチリなミッションクリティカルなデータをホストするということであれば、それはやらないんじゃないかという気がします。


    それに対して、

    これ、異なる二つの方向性が同時に考えられる話だと思います。

    「クラウド」の概念は漠然としていますが、方向として

    1.ひとつのサーバーに載らないほどの超巨大データテーブルを、分散コンピューターで扱う
    2.互いは独立した個別DBを仮想化されたサーバー環境でホストする

    前者は、BigTable など、Googleの方向性で、処理場のキーは、個別操作での並列製を失わないためのMap/Reduce 的な仕組み
    後者は実は、可用性に配慮しつつ増大するサーバーパワーを背景にパーティショニングを進め、ホスティングコストを低減させること。つまり、ディスクリートなDBの集合を単一環境で複数走らせて並列性を上げること。

    おそらく、Azure で考えられているのは、後者の方向なので、一貫性などへの処理も個別には局在化できることで、実装にそれほど困難はないとおもいます。
    また、ビジネスで必要とされるDBはかつては巨大とされたものでも、高々テラバイトです。単一サーバーに収まらないサイズではありません。また、局所分散環境(マルチコア)での、性能のリニアさを向上させる Transactional Memory などの技術も出てきています。

    一方、超巨大テーブルでの一貫性処理に関しては、レイテンシーという大きな壁があり、並列性を大きく低下させる可能性があります。また、ニーズもそれほど明らかではありません。

    おそらく、両者は組み合わされて使われるのではないかと思います。この観点から言えばGoogleが実装することにもそれほどの困難さは無いと思います。



    すばらしい意見なのだが後者の論理には重要な点が見過ごされているのではないかと感じる。
    それは以下の4点だ。

     1.ビジネスアプリが動作する条件としてハイエンドなマシン(マルチコア構成でメモリも十分なもの)が要求されていたとするとクラウド側でも単一サーバーとして同等以上の能力を用意する必要があるのではないか。
     2.マルチコアのサチュレーションを考慮するとTransactional Memory を使っても向上に限界があるのではないか。また、(特にアプリの)アーキテクチャー変更が必要になるのではないか。
     3.組み合わせて使用した場合、BigTableでの一貫性処理に関するレイテンシーの壁は、その上で動作するRDBも免れないのではないか。
     4.そもそも、ムーアの法則が成り立たなくなった現在において「可用性に配慮しつつ増大するサーバーパワー」なんて幻想なんじゃなかろうか。

    「互いは独立した個別DBを仮想化されたサーバー環境でホストする」ことは別に難しい技術ではないが、高々とはいえテラバイトのデータをVMを使って簡単にはホスティングできないだろう。これまでのビジネスアプリは、Scale-upによるアーキテクチャのもとで進化してきた。少なくともVMの1区画は、これまで単一サーバーで出していたパフォーマンスと同等以上の能力が必要となるのではないか。そうなると高価なサーバ構成をとらざるを得なくなる。安価なサーバを使うためには、Scale-outアーキテクチャへの変更が必要となるが、「ACID対応バッチリなミッションクリティカルなデータをホストする」ためのRDBを使っている限りScale-Out変更は望めない。
     たしかにビジネスアプリにとってRDBは非常に重要である。しかしクラウドに載せるのは簡単ではないだろうと私は思う。


    火曜日, 4月 21, 2009

    【クラウドコンピューティング】 Scaleするかどうか、それが問題だ このエントリーを含むはてなブックマーク


    エンドユーザにとってクラウドデータベースで嬉しいことは何もない?


     クラウド時代のデータベースという記事には、「戯れ言を垂れ流してみます」といいつつ、本質的なことが書かれている。

    key-value型のインスタンス群に対して集合操作ってのは、例えばJoSQLみたいなのもあって、いやいやそもそもデータ量がねって話に対して、でもGAEってクォータきつくないっけ?(これもよく分かってないんですけど、調査不足で書いちゃって申し訳ないです)ってことを考えると、 BigTableが使えるって言ってもほんとの意味で大量データをブン回せるわけでもないのかな、とか、いやそもそも集合操作無用でござるっていうなら、 HTMLのフォームをPOSTされたらそのままテキストファイルとして保存しちゃってLucene頑張れってほうが良くね? とか、そもそも何だよその「明細」ってスキーマ(クラスでもテーブルでもエンティティでも呼び名はどーでもいいけどさ)はよぉ、とか色々と思うのです。


    クラウドデータベースといえばBigTableでkey/valueである。たしかに、エンドユーザからみれば、実際のところクォータがきつく大量データが使えるわけでもない。JOINすらままならないkey/value操作で何かよいことがあるわけでもない。クラウドデータベースって一体何が嬉しいのか、まったくもってわからない、となる。

    Google側のメリット


     ところが、クラウドを提供する側であるgoogleの視点で考えると話はがらっと変わってくる。大幅な運用コスト削減のため、googleは、マシンの台数やN/W、ハードディスク容量などの物理リソース各ユーザごとに管理することはしない。1つの論理的な大規模なマシンを管理するだけである。そしてそれをエンドユーザに開放し、彼ら自身の手によるリソースの割り当てを可能にしている。

    なぜBASEなのか


     このような論理的に大規模なマシンに必要なのはBASEを元にしたScale-outの仕組み。これまでのデータベースのプログラミングは小規模なACIDの世界で十分であったが、クラウドのプログラミングではBASEという別の世界で動作する。BASEは分散処理技術を元にしたScaleする世界の概念である。
     Googleは、つまり、ScaleさせたいからACIDをやめてBASEにした。それがBigTableでありkey/valueになってしまう理由である。

    BASEについて、M先生曰く。


    Cloud上のデータベースでは、従来のACID ConsistencyをBASE Consistencyに切り替えようという話があります。ACIDは、たいていの人知っていると思いますが、BASEは、Basically Available, Soft state, Eventually consistentの略ですね。

    eBayのDan Pritchettという人の、BASE -- An ASID Alternative という論文です。

    彼、面白いです。理論的だけど実践的で。

    頭固くしていると、BASEは、「Basicallyが気に食わない」とか、「Softってなんだ」とか、「Eventuallyじゃどうしようもない」と、Initialごとに反発しそうですが、多分、BASE概念、重要です。

    ACIDが理想的で、BASEは、何か欠けているものと考えるのは、おそらく間違いです。古典論が、量子論をなかなか受け入れなかったのも、それが統計的にしか未来を予言できないことが、心理的な障壁になりました。

    ACIDは、小規模システムの局所的な原理で、Scaleしません。BASEは、大規模システムの原理です。局所的には、ACIDの成り立っている領域を、大域的に接続していくと、システム全体としてはBASEなシステムが出来上がると考えればいいんじゃないのかしら。


    ACIDを諦めるというトレードオフ


     ではなぜ、小規模システムのACID原理が大規模システムに通用しないのか。それは、「それぞれの段階を通り抜ける際、我々は、何かを失う」とした、「複雑さにおける基本的な飛躍」に答えを見出すことができる。ScalabilityとAvailabilityのP18

     CORBAの失敗は単なるインターオペラビリティの問題だけではなかった。もしそうであるならSOAPで成功しているはずである。密結合のモデルをそのままインターネットに適用しようとしたことが失敗の原因であったのだ。同様のことがクラウドでもいえる。インターネットのような大規模システムでは「信頼できないマルチマシン」を前提とした新たな原理を適用しなければならないのである。

     信頼できないマルチ・マシンたちへ:誰を信ずることが出来るか分からない難しい状況の中で、我々は信頼を失う。


    なぜScale-Outしなければならないのか


     クラウドデータベースは、先に述べたように、ユーザから見たときは、自由にJOINできないなど、時代に逆行しているかのような機能の少なさや不便さを感じてしまう。その不便さに耐え切れず、エンドユーザの強い要求に屈したのがMSのAzureである。結局、エンドユーザの人数分のSQLServerを用意すればいいじゃん、ということをやってしまうのだろうが、そうなると管理運用コストがかさばってくるのは明らかだ。まあ、これはこれでScaleするといえなくもないが、客のデータセンターをMSのクラウドに移動しただけと実質的にはかわらない。

    なぜScale-Outしなければならないのか。その第一の理由は、大規模なデータを扱う際にも、パフォーマンスが落ちないないからである。

     エンドユーザには完全なSQLを提供しつつ、内部的にはBASEだなんてものを出してきたら話は別だ。そりゃすごいことだが、「複雑さにおける基本的な飛躍」でも説明したように、これはとても難しいと思う。SQLは最高なんだけれども、ACIDである限りScaleしない。ACIDシステムを使っている限り、データ量増大に起因するパフォーマンス劣化に対しての抜本的な解決策はないと今は考えられているので、増え続ける顧客データに対して、いつまでも耐えられるものではない。
     (2年前に構築したECサイトも実際問題としてデータ量に起因するパフォーマンス劣化を起こしている。どんなにデータ量が増えても未来永劫サクサク動くシステムはできないものか。それが私がクラウドに魅せられる要素のひとつである)

     これに対してGoogleでは、ある一定量以上になると課金されるものの、基本はBigTableであるからスケーラビリティはまったく問題ない。アプリも同様に我慢してGQLを使う限りにおいては理論的に無限の顧客データに対応でき、パフォーマンスを落とさずにスケールできる。
     ただし、我慢しきれずにGAE上にDerbyなどのJavaRDBを載せてしまうと、せっかくのスケーラビリティは崩れ、AzureSDSのSQLServerと同様の問題に直面することだろう。パフォーマンスに問題ないからといって安易にRDB化するのは問題を抱えてしまうことになるので要注意である。パフォーマンスに問題がなく、かつ、データ量がそれほどない場合に限り、JavaRDBを使うという選択肢も使えると思うが、いずれにしても何とかGQLを使って頑張るべきだと私は思う。

    第二の理由は、前記事でも述べたように、コストメリットであると思う。BASEによる大規模システムを、コモディティサーバ、OSS、広告モデルといった組み合わせによって実現できるとしたら圧倒的にコスト的に有利である。
    大規模なシステムであればあるほどコストメリットは大きくなって競争力がつく。電力などを含めコスト削減努力を極限までやったところでないと生き残れないのだろう。

     エンドユーザにとってみたら、コンピュータリソースをタダ同然のように利用できるのだからとても幸せなことである。将来はクラウドも、電気やガス、水道といったインフラと同じように、蛇口をひねればすぐ使えるぐらいの手頃なインフラになっていくかもしれない。

    月曜日, 4月 20, 2009

    【Google App Engine】 RewriteServletを使ったBloggerカスタムドメイン移行 このエントリーを含むはてなブックマーク


     GoogleAppEngine for Javaの調査もかねて、RewriteServletというものを作ったので公開する。このアプリはHelloWorldよりちょっとだけ長いが、GAEアプリとして最初に作るものとしてはちょうどよいサンプルになったと思う。ソースや作り方は以下の資料にある。GAEforJavaのチュートリアルになるように作成してみた。

    資料=>ダウンロード

    追記:2009/5/1
    web.xmlに修正があります。資料P12


     1) /feeds/posts/defaultや/feeds/posts/default?alt=rssをrewrite対象にする。
     2) targetの最後の/を取る
     3) skipの最後の/を取る


    金曜日, 4月 17, 2009

    【クラウドコンピューティング】 弱者連合とスケーラビリティ このエントリーを含むはてなブックマーク


     年初にクラウド予想2009をやった。これはだれでも容易に予想できる内容ではあるのだが、3ヶ月経った今では、「1)コストダウンは急速に進む」、「4)大手ITベンダはクラウドの大合唱」は言わずもがなとなった。
     コストダウンに関しては、Amazon S3は昨年11月に値下げして以降、一括支払いでさらに値下げSimpleDBを使えば6ヶ月間無料になるという話があり、その急激な値下げには驚かされるところとなった。
     「大手ITベンダはクラウドの大合唱」は予想通り自社製品のクラウド化が進んでいる。具体的な中身は、SunによるSun Open Cloud Platformの発表や、国内ではKDDI クラウドサーバサービスの発表があった。またIBMやCISCOなどによる、Open Cloud Manifestoなどの標準化の話も出てきた。
     そして、「5)OracleやMSは自己矛盾には陥らないが苦戦する」予想は、MSがAzureでかなり善戦しそうな感じを受けるもののSDSでの混乱ぶりがニュースとなっており今後どうなっていくか注目である。<関連>Azureに思うこと

     概してクラウドはコンサルがミソクソな話をしだしていることもあってバズワード化に拍車がかかっているのは否めないところである。だが、ここでクラウドの特長であるスケーラビリティの観点から話を整理すると重要なポイントが見えてくる。

     先日、ある大手ITベンダーのクラウド製品/サービスの説明があった。そのサービスがスケーラブルかどうかの質問が挙がったが、担当者はスケールアウトはしないがスケールすると答えていた。VM技術はつかうものの必要に応じてハイエンドの製品も使う。これは自社製品を無尽蔵に並べるサービスを提供することを意味していた。まあ、スケールアウトしなければ困るような大規模トランザクションなんてそうないだろうからそれでもいいのだろう。

     しかし、その話とスケールアウトしない話は別である。スケールアウトしないがスケールするというのはコストを無視した考えである。お金にいとめをつけないからクラウドでよろしくなんていう太っ腹な企業は別にして、コンシューマ相手では、このご時勢もあって相当な低価格でないと競争に生き残れないだろう。そして、それはタダ同然のレベルだと思う。

     先日、Google App EngineのJava対応が発表された。これを受けて、makers-hubという試みもはじまっている。「製造業向けネットサービスは無料に出来るんです。」だそうだ。

     こういったなかで生き残れるのは、GoogleやAmazonといった2強と、日本では、はてなぐらいじゃなかろうか。彼らに共通するのは、コモディティサーバを束ねてスケールアウトできる技術をもっているということ、それから、広告モデルという別の収入源をもっていること。コモディティサーバとOSS、広告モデルが競争力の源泉。とにかくお金をかけないでサービスを運用する技術とノウハウは大変なものである。そういう意味で、SQLServerを並べる戦略に転換したMSのAzureの競争力には疑問が残る。その運用コストは決して安くはないだろうから、しばらくは太っ腹を相手にしながら、スケールアウト技術を開発して競争力をつける戦略なのだろう。MSでさえ競争力に疑問が残るのだから他のベンダはなおさら厳しそうである。Open Cloud Manifestoが弱者連合と揶揄されるのはわかる気がする。しかし、新規の顧客開拓は厳しい一方で既存顧客の囲みこみは成功するとは思う。クラウド要求に応えられない大手ITベンダーはもっと苦戦すると思われるので、何かしら出さざるを得ない状況なんだろう。先の担当者が、「GoogleやAmazonとは真っ向勝負する気はない」といっていたのが印象的だった。

    金曜日, 4月 10, 2009

    【クラウドコンピューティング】 AzureSDSに思うこと このエントリーを含むはてなブックマーク



    先月MIX09で発表されたAzure SDSが物議をかもしている。実際に参加されたM先生のメールにはこうある。


    昨年のPDCでは、まず、Partition Keyを必須とするSDSを提供して、その後に順次、Relational型をサポートをするというロードマップを持っていたのですが、今回は、まったく逆に、最初に、SDSとして、クラウド上のRelationalデータベースを出してから、その後に、Partitionの特徴を追加するというように、大きく路線を修正しました。


    たしかに、ホームページにもAzure SDSはSQL Serverをベースにしていると書いてある。

    Microsoft® SQL Data Services (SDS) is a cloud-based relational database platform built on SQL Server® technologies.


    一方、今までのSDSの中核だったWindows Azure Storageは、ACEモデルの、EntityがProperty BagでKey/ValueベースのTableである。

    なぜ2つのアーキテクチャーが存在するのか。ゼータの鼓動。SQL Data Servicesにみるクラウドデータストレージの現実解によれば、次のように説明されている。


    誤解を恐れず簡単に説明するならば、Azure Storage Servicesがいわゆるクラウド的なアーキテクチャであり、SDSは従来のRDBMS的なインタフェースを提供する役割を担っている。<中略>従来のソフトウェア資産を活かしながら、最終的に完全なクラウド対応でスケーラビリティのメリットを享受するステップとして、SDSを利用したクラウド側の運用に移行できることは、ユーザー企業にとっても、ソフトウェアベンダーにとっても現実的な落としどころではないだろうか。


    先生も次のようにおっしゃっている。


    概して好意的で歓迎していた人いわく、「今までの資産と開発技術が、そのまま、クラウドで使える」 確かに、Azureのしたたかなところは、そのOn Premiseとの共存や、開発者のスキルの温存といった現実主義にあったわけで、データ・モデルの部分だけが、大きな飛躍を含んでいたわけですので、こうした反応が出てくることは、理解できないわけではありません。


    現実主義・・・私はここにMSの文化を強く感じてしまう。ちょっと話がずれてしまうかもしれないが、IBMと繰り広げたOS戦争でも同じことが起きていたように思う。OS2はWin3.1互換モードなどを搭載していたが重いOSにPC側の性能がついていかず敗北した。実はNTもほぼ同じ問題を抱えていたが、Win3.1、Win95などでユーザをつなぎとめつつNTの改善を図り、やっとWin2000で移行に成功したのである。

    Windows NT系(wikipediaより抜粋)


    しかし、初期のWindowsは見た目はGUIではあったが内部的にはMS-DOSを土台とし、また16ビットのメモリの壁、マルチタスクの不完全さ、ネットワーク機能の欠落など課題が山積していた。
    ビル・ゲイツは一から作り直すことを決断し、<中略>サブシステムで致命的な問題が起きてもクラッシュと呼ばれるシステム全体の破綻を起こさない、当時のPCで動作するOSとしては画期的なシステムであった。
    <中略>
    当初は重いOSにPC側の性能がついていかず、デスクトップ用の業務用OSの後継にしようというマイクロソフトの目論みは失敗した。
    しかし、NT 3.1、NT 3.5に続いて発表した NT 3.51において、時をほぼ同じくしてリリースしたWindows 95をクライアントとしたサーバOSとしての性格を強調するマーケティングを行い、NetWareの牙城であったNOSの市場に足場を確保することに成功した。
    バージョンアップを重ねる際にマイクロカーネル概念の一部を放棄してWin32サブシステムやグラフィクス・デバイスドライバの論理層などをカーネル空間に展開してスループットを向上するなど、重いオペレーティングシステムという汚名を払拭する為のいくつもの改修が行われた。
    <中略>
    その後もマイクロソフトはデスクトップ用の業務用OSの後継としても売り込みを図るが、一部のITプロフェッショナルを除いては市場に浸透せず、2000年にリリースしたWindows 2000に於いてようやくデスクトップOSとしても市場に認められることとなった。
    Windows 2000が認められたのは、Windows 9xシリーズのプラグアンドプレイやACPI等の電源管理機能、USBへの対応などユーザビリティの高い機能を実装したことと、この頃にはハードウェアの性能がNT系OSの重さを問題としない(つまり重たくない)レベルにまで向上していたことによると考えられる。
    Windows 2000は業務用のデスクトップOSとして歓迎されたが、一般家庭向けの市場でNT系OSが普及するのは次のWindows XPまで待つことになる。


     16ビットOSから32ビットOSへの移行は実に10年近くかかっている。このようにアーキテクチャーの変更が伴う移行は長い月日を必要とする。これはクライアントOSに限らずクラウドも同様だと私は思う。

     話を戻して、なぜSQLServerが求められるか。

     ホストを中心としたプロプライエタリな世界を開放してくれたのは、RDBの成功にあったといっても過言ではない。RDB中心のアーキテクチャーは90年代初期のダウンサイジング以降インターネット時代の今に至るまで変わっていない。その間すべてのアプリケーションはRDBを中心に作られている。実はホスト時代のストレージはRDBではなくkey/valueに近いものであったのだが、そこからRDBへのアーキテクチャーの変更が可能だったのは、パラダイムシフトによりUNIXやWindowsといったオープン系OSにまるごと変わってしまったからである。ホストからのデータ移行もそれほど問題にはならなかった。
     
     Azureの事例をみてもわかるように、今後、key/valueへの移行が進むとしても、クラウドデータにおけるUIを担うのはやはりSQLだろうと思う。ACEモデルに限ったことではないがSQLより優れた操作性をもった言語を開発することはとても難しい。またSQLには既存の多くの開発者スキルもある。スケールできるという理由だけでRDBをkey/valueに移行するとは到底思えない。

     となると、内部的なアーキテクチャーはkey/valueでインターフェースがSQLになるのが理想なのだろう。Azure SDSが今後どのように進化していくのか、楽しみである。


    金曜日, 3月 13, 2009

    【クラウドコンピューティング】 Key/Valueストア Reflex BDBの発表 このエントリーを含むはてなブックマーク


    クラウド研究会の面々を中心に、先日Key/Value研究会というのが開催されたらしい。企画の大田さんたちはもう雲の上の存在になりつつあるのかな。

    「キー・バリュー型データストア」開発者が大集合した夜

    このKey/Valueデータストアだが、弊社もかねてからReflexを拡張して、Berkeley DB JavaEditionを使ったフレームワークを作っていた。それで先日やっとOracle社と販売契約を結ぶことができたので発表したいと思う。本来、BDBはPDAなどへの組込利用を想定されているものらしく、クラウドに応用したいといってきたところは弊社が初めてだそうだ。ライセンス体系など見直さなければならなかったようで契約までに4ヶ月かかってしまった。

    さて、このソリューションの概要は次の絵の通りであるが、ポイントを説明すると、

    1)Key/Value方式のデータストアを採用
     データストアとしてKey/Value方式のBDBを採用している。1ライセンスあればどんなにインスタンスを増やしても料金はかからない。

    2)Scale-Outモデルのクラウドサービス機能
     データストアにはResourceMapperを介してWebサービスでアクセスできる。
     インスタンスは動的に追加、削除が可能である(<=これはまだ研究中)

    3)ハイブリッド方式
     バックエンドのRDBと非同期で接続されている。(基本更新の必要のない参照レコードがRDBに送られる。これらは情報系として使用されることを想定している)



    なぜこのようなものを提案するのかについては次回以降詳しく説明していきたいと思う。

    このようなソリューションに興味がある方はぜひご連絡ください。


    水曜日, 3月 11, 2009

    【クラウドコンピューティング】 A Berkeley View of Cloud Computing このエントリーを含むはてなブックマーク


    クラウドのメーリングリストに流れていた。頑張って後で読もう。

    Above the Clouds: A Berkeley View of Cloud Computing

    日曜日, 3月 01, 2009

    【クラウドコンピューティング】 ScalabilityとAvailability このエントリーを含むはてなブックマーク


     丸レク第四回目の資料がUpされている。

    ScalabilityとAvailability

     Cloud = Scalability + Availability の定義に大賛成。

    日曜日, 1月 25, 2009

    【雑記】 Yes, we can このエントリーを含むはてなブックマーク


     オバマ大統領の就任演説に感動。(1/24)オバマ新大統領の就任演説内容(全文)
     

    我々はこの国の偉大さを再確認するとき、偉大さが決して当然のことではないと理解している。それは働いて得たものでなくてはならない。我々の旅路は近道や妥協であったことはない。憶病者や、勤労より娯楽を好み、富と名声の喜びだけを求める者の旅路だったこともない。むしろリスクをとり、行動し、物を作り出す人々が繁栄と自由への長いでこぼこ道を導いてきてくれたのだ。その中には高名な人もいるが、多くは無名の働く男女だ。

     彼らは私たちのためにわずかな所持品をかばんにしまい、海洋を旅し、新しい生活を探してくれた。

     彼らは私たちのために工場で汗を流して働き、西部を開拓し、むち打ちに耐え、硬い大地を耕してくれた。

     彼らは私たちのために(独立戦争の)コンコード、(南北戦争の)ゲティスバーグ、(第二次大戦の)ノルマンディー、(ベトナム戦争の)ケサンのようなところで戦い、命を落とした。

     これらの男女は私たちがよりよい暮らしを送れるよう何度も何度も苦闘し、犠牲を払い、手が腫れるまで働いてくれた。彼らの目に映る米国は、1人ひとりの大望の集積もさらに大きいものだった。生まれや富や党派の違いを超越した国だった。

     これが今日も我々が続けている旅だ。
    <中略>
    今日から我々は立ち上がり、ほこりを振り払い、米国を再生する作業をもう一度始めなくてはならない。

     なぜなら、どこを見てもなすべき仕事がある。経済の現状は大胆で迅速な行動を求めている。新しい雇用を創造するだけでなく、成長の新しい基盤を築くために我々は行動する。


     史上最低のバカ大統領のせいで歪んでしまった世界。もういちど原点に返ることで再生していかなければならない。どこを見てもなすべき仕事がたくさんある。私たちもマネーゲームや将来を心配することばかり時間を使うのではなく、「なすべき仕事」を見つけて、そこで働いて得たものを大切にしなければならない。我々の旅路は近道や妥協ではない。むしろリスクをとり、行動し、物を作り出すこと。そして、できると信じること。

     話はかわって、今日優勝した朝青龍。左ひじを痛めて進退のかかった場所での優勝を誰が予想できただろうか。
     もし初日の稀勢の里戦で負けていたら引退していたかもしれない場所だった。
     朝青龍の気迫は並大抵のものではない。場所全体の雰囲気を一変させるものすごい気迫。初日から絶対に負けられないという強い気持ちがオーラとなって溢れ出ていた。そしてそれが他を圧倒していたからこそ優勝できたのだと思う。

     できないと思ったら何もできない。できるという強い気持ちが不可能を可能にする。

     Yes,we can

    とりあえず、今のプロジェクトメンバーへのメッセージ。

    火曜日, 1月 20, 2009

    【雑記】 コモディティかイノベーションか このエントリーを含むはてなブックマーク



    IBM 技術理事 中島丈夫が語る「IBMテクノロジー戦略」 - Japan

    中島さんの話のなかで「コモディティ VS イノベーション」が気になったので一言。

    過去において、また現在もなお莫大な費用をかけてイノベーションに取り組む企業はIBMぐらいである。もちろんJCMベンダーにはそんな真似はできない。

    IBMはこれまでイノベーションリーダーであった。JCMなどはIBMが発明したものを真似するだけでよかった時代もあった。しかし、最近は研究開発が実らず空回りしているような感じをうける。

    IBMも一企業なのでコモディティに敏感になろうとするのはわかる。また、イノベーションのような顧客が少ないところでの商売のあり方に疑問を感じているのもわかる。しかし、イノベーションに取り組まないIBMなんて想像できない。

    寂しいけれど今のイノベーションリーダーは明らかにGoogleである。
    GoogleにあってIBMにないもの、それはイノベーションに対する貪欲さかな。

    <関連>
    失敗しないことがよいことか

    日曜日, 1月 18, 2009

    【雑記】 性善説と無責任 このエントリーを含むはてなブックマーク



    性善説というと聞こえはよいが、この業界は時に性善説が災いをもたらすことがある。
    性善説、性悪説とは以下のような考え方をいう。

    性善説
    (人の本性は善であり)人を信じるべきだという考え方
    性悪説
    (人の本性は悪であり)人は疑ってかかるべきだという考え方


    性善説と性悪説のよくある誤解によれば、そもそもこれが誤解であるそうだが、私は他に適切な言葉を知らないので誤解のまま使うこととする。

    私は以下のようなケースで性善説が災いしていると感じている。


    1)設計書には間違いがない
    2)ちゃんとプログラムを作れば正しく動く
    3)ちゃんと管理すれば間違いは起こらない


    問題は、ちゃんと動かなかったときにどうするか、ということなのだが、それを考えようと言い出すと途端にK.Y扱いされるので困ったものである。

    ちゃんとやるだろうことを私も含めて皆が信じている。そしてシステムはちゃんとやれば動くはずである。もし動かなければ動くまで責任もってやるっていってる。なのに、それのどこが悪いのか?

    私に言わせれば、「動かない場合のことをちゃんと考えないのが悪い」ということであるが、どうもうまく伝わらない。

    ちゃんと動かすことを考えるのだから、動かない場合のことなんて今は考えられないことはよく分かる。ちゃんと動けばそれが杞憂に終わり、そして時間をかけて考えた「動かない場合のこと」は無駄になることになることも分かる。それでも、自分の力でできない可能性が少しでもある場合には、できない場合の対応策は考えるべきである。私はそれを考えない人は無責任に見えて仕方がない。

    できない場合の対応策を考えてもらえない場合は、とりあえず、「何が起きても私は知らないからね。」とか、「その日は出張だから絶対にヘルプできないよ」ということで自己防衛することにしている。さらに、「私はうまくいかない方に賭ける」といって脅すことさえある。別に失敗する原因を知っているわけでも確信しているわけではないのだが、システムというのは大抵動かないもので、逆にシステムがちゃんと動いているのは奇跡のなせる業であり、たまたま動いているにすぎないと思っているぐらいがちょうどよい。(これは自分自身の経験に基づくものである)

    しかし、性善説の輩は失敗することを全く考えない。

    そして、案の上、失敗して私に泣きつく。
    「ごめんなさい。私が間違いでした。だから何とかしてください」

    私は君を何とかしたい。

    月曜日, 1月 12, 2009

    【クラウドコンピューティング】 クラウド予想2009 このエントリーを含むはてなブックマーク



    久しぶりによい記事を読んだ。

    クラウド型ストレージ「Amazon S3」は安いか?

    クラウド・コンピューティングバトル2009


    <私なりのクラウド予想2009>

    1)コストダウンは急速に進む

    実はS3はそれほど安くない。しかし、私は楽観的に考えている。Google、MSなどクラウドプレーヤーの大競争が始まればコストダウンは急速に進むだろう。

    2)Google Appsの一人勝ちだが一般的には広がらない

    セキュリティは技術以外の問題もあり簡単に解決できないので、多くの企業がGoogle Appsに群がることはない。Microsoft Online Servicesは健闘するがGoogle Appsには太刀打ちできない。Notesやサイボウズなどからの移行はあまりない。

    3)クラウドを利用したWebサービスは多く登場する

    去年ブレークしたDropboxやMorph Appspaceなどのように、Amazon S3を利用したサービスが多く登場するだろう。そして最初は無料。
    企業ではアプリケーションの2次キャッシュやデータバックアップ場所として利用されていくだろう。

    4)大手ITベンダはクラウドの大合唱

    毎度のことだが自分たちの製品をクラウド対応とか言い出す。コンサルがミソクソな話をしだす。

    5)OracleやMSは自己矛盾には陥らないが苦戦する

    「マイクロソフトやOracleにとって、自社の収益を共食いせずに従来の顧客とSaaSの顧客の双方を取り込むことは難しい」といわれるが私はそうは思わない。新規の顧客開拓は両者にとっては厳しいが、クラウドをやることで既存顧客の囲みこみは成功するだろう。やらない大手ITベンダーはもっと苦戦する。>IBM

    日曜日, 1月 11, 2009

    【JavaScript】 ISO8601日時をパースする正規表現。ついでにJavaも このエントリーを含むはてなブックマーク



    "2002-06-17T09:25:43.4670000+01:00" のようなフォーマットのISO8601日時をDateにして返す関数はJavaScriptでは以下のようになる。正規表現を使ってマッチした()の1つ目が$1、2つ目が$2・・・7つめが$7に入る。(replace()関数外のためRegExp.$7のように参照している)


    // http://www.merlyn.demon.co.uk/js-date3.htm#XML
    function parseISO8601(isodatetime) {

       var newdate = isodatetime.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/,'$1/$2/$3 $4 GMT');
       newdate = Date.parse(newdate) + 1000*RegExp.$5;
       var k = +1;
       newdate -= k * Date.parse('1970/01/01 '+RegExp.$7+' GMT') * (RegExp.$6+'1');
       return new Date(newdate);

    }



    ちなみにJavaではこんな感じ、


       protected Object fromString(String str) {

          try {

             // Date/Time ISO8601 TIME ZONE FORMAT 2006-02-10T10:00Z.
             // slow but,thread safe

             SimpleDateFormat isoformat = new SimpleDateFormat(
                   "yyyy-MM-dd'T'HH:mm:ssZZ");
             return isoformat.parse(str);

          } catch (ParseException e) {
             // try with next formatter
          }

       }

       protected String toString(Object obj) {
          SimpleDateFormat isoformat = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ssZZ");
          return isoformat.format(obj);
       }



    Javaの正規表現


    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class Iso8601 {

    /**
    * ISO8601日時を正規表現で分解して取得する
    */

    public static void main(String[] args) {

    Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T([0-9:]*)([.0-9]*)(.)(.*)");
    Matcher matcher = pattern.matcher("2002-06-17T09:25:43.4670000+01:00");

    if (matcher.find()) {
    System.out.println("ALL:"+matcher.group(0));

    System.out.println("YY:"+matcher.group(1));
    System.out.println("MM:"+matcher.group(2));
    System.out.println("DD:"+matcher.group(3));

    System.out.println("TIME:"+matcher.group(4));
    System.out.println("msec:"+matcher.group(5));

    System.out.println("+-:"+matcher.group(6));
    System.out.println("TZ:"+matcher.group(7));

    }
    }

    }


    水曜日, 1月 07, 2009

    【JavaScript】 高速化プロジェクト その2 このエントリーを含むはてなブックマーク


     先の投稿からずいぶん時間が経ってしまったが続編「その2」を書いてみる。

    まず、問題となったものがどんなアプリかであるが、これは下図のように、スプレッドシートのような動作をするJavaScriptアプリで、サーバから必要なデータを初期表示の際にいっぺんに取ってきて、あとはブラウザ環境だけで動作するというものであった。タブを押すと別の画面が表示されるがサーバへのアクセスはない。表示されているタブの中に複数のテーブルがあり値を入力変更できる。しかし、値を変化させると隠れている他のタブの値まで影響するので、計算が多岐にわたって遅くなってしまう。これにはいくつか問題となるコーディングがなされていた。



    問題となっていた部分を改善して効果があった順に挙げると以下となる。

    1)イベントリスナーの多用をやめる
    2)DOMへの直接参照をやめる
    3)数値計算の誤差は最後にまるめる

    1)イベントリスナーの多用をやめる

     図を見てもわかるように、入力域は1テーブルで約50で、それが4~5あるのだから、合計約200~300の入力域になる。これら一つ一つにイベントを登録してしまうと、とっても遅くなる。これで悩んでいたころに、JUIというイベントがあって、JavaScriptいろいろ、個人的にOpenID そこでma.laさんが、DEMOを披露してくれて、DOM操作の高速化についていろいろ教えてくれた。懇談会ではイベントリスナーは1つというようなことをおっしゃっていたが、DEMOでは、on click で実装したおられたので真似してみた。これは非常に効果があった。

    2)DOMへの直接参照をやめる

     サーバサイドのオーソドックスな手法だと、テーブル内の入力域に表示される初期値はサーバ側でのHTML生成時にセットされることになる。初期表示だけであればいいのだが、今回のアプリのように、その値を基にして再計算するような場合には、すべての値に対してDOM参照が発生することになる。これがとても遅いのだ。そこで、思い切ってHTML動的生成はやめ、代わりにJSONを動的に出力する機能と、静的なHTMLを出力する機能に別けてもらうようにした。JSONを動的に出力する機能といっても別に難しいことを要求したわけではなく、HTML動的生成でHTMLタグを全部削除してJSONタグを書いてもらっただけである。また、静的なHTMLについてはWebサーバに置いてもらっただけである。
     原理としては、一旦JSONをデータとして受け取り、表示の際にJavaScriptで静的HTMLの入力域に代入するということをしているが一瞬で書き換わるため以前のアプリと何ら変わらないように見える。以降、値に変更があった際には、JSONの値を元に再計算を行い、静的HTMLの入力域に代入すればよい。こうすることで、再計算中はDOMへの参照がなくなり、非常に高速になった。
    とはいえ、計算後に全表示したのでは大きなテーブルでは遅くなってしまうので、DOM参照のためのリンクを持つようにした。(現時点では、この部分が一番遅くなってしまっている。何かいいアイデアはないものか・・)
     ついでにいうと、このJSONオブジェクトのことを私たちはEntityと呼び、再計算のためのBlogicを呼び出すパラメータとして使用している。Blogicは、揮発性(ステートレス)であり、Entityを元に計算した結果のEntityを返すことしかしない。一方、Controlerへの呼び出しでもEntityをパラメータとして与えているが、これはサーバへの登録や参照機能を呼び出す際に使用している。(参考)3分で分かる設計の話
     また、高速化とは関係ないが、Blogicをステートレスとすることで、分業という副産物を手に入れることができた。単体テストも機械的に行えることができ、JavaScriptを複数人でシステマチックに開発できるという事例にできた。

    3)数値計算の誤差は最後にまるめる

     JavaScriptの数値計算には誤差が含まれることをご存知だろうか。演算誤差とは
    これを真に受けてしまうと演算を自前関数でやらなければならなくなる。実際に旧アプリではそうやっていたのだが当然ながら非常に遅くなってしまっていた。一つ一つの計算では誤差が発生するが、今回のアプリのように、実際に表示させる最後に丸めることでOKである場合がほとんどだろう。例えば、最終表示部分での丸めが小数点1桁で2桁目以降を四捨五入するとなっていた場合に、JavaScriptの演算誤差である小数点以下15桁が影響するには、どれだけの計算回数が必要かを検証してみればよいことである。影響ないことが検証できれば自前関数など破棄してNativeのまま使おう。

     以上が主な高速化のポイントであったが、他にもカーソル移動時の高速化(参考)TABキーで移動後にFocus、Select などがある。
     また、ワンソースマルチビューを実現する でも述べたが、以下のようにViewを表示するレイヤを機能で分けるという設計も非常に有効であった。例えば、Validatorで入力チェック、Attributeで表示桁や色、エラー処理などである。




    1.Templateを選択する機能
    - page id(xxxx.html#001)で指定
    2.サーバからEntityを取得しBlogicを実行する
    - Entityをチェックしてエラーコードをセットする。その後はAttributeによってエラーが表示される
    - エラーがなければBlogicを実行する
    3.静的なtemplateの上に動的なEntityをマッピングする。その際、Attributeにより値をフォーマットする(カンマを付けたり色を付けるなど)
    4.データ入力時にvalidatorを実行する
    5.(エラーが含まれていなければ)Entityをサーバに送信する

     一つだけ注意すべきことがある。それは、Entityへのデータ入力点(この場合、サーバから取得した時点とキー入力の時点)におけるエラーチェックを厳密にすることだ。キー入力の時点では、Validatorとして古くからJavaScriptは一般的に使用されてきたが、サーバから読込んだ時点というのは意外な方も多いだろう。この設計では、ここをチェックしないとハングする場合もあるので要注意だ。


    <関連>

    高速化プロジェクト その1

    日曜日, 1月 04, 2009

    【雑記】 工数と期間の関係を知る、それから適材適所 このエントリーを含むはてなブックマーク


    短納期、低予算をどうやって解決していくかという問題にいつも悩ませられる。

    弊社には請負の仕事を年間30%しかやらないという30%ポリシーがある。
    特にお客様メンバーの一員として働く派遣は基本的にはやらないのだが、それは請負型が生産的でないからという理由が一番大きい。まず、お客様は無理難題を平気で主張してくる。いつまでたっても仕様がFIXしないので、議論や調整で疲弊してしまいモチベーションが下がる。そこで、生産性向上のための提案をやっていくのだが、まず受け入れてくれない。そのうち提案にも疲れて、しょうがなく言われたことをそのまま作りはじめる。そして一度作ったものはなるべく変更したくないので変更管理を始めて後工程に廻そうとするのだが、納期が迫ってくると、何とか先にやってくれと泣きつかれてデスマーチとなる。

    こういう環境でエレガントなコードや斬新なアイデアはあまり生まれてこない。
    たとえお客様への納品物が完成したとしても我々には何も残らない。
    これは時間をお金に換える考え方であり、あまり生産的ではない。

    弊社はより生産的なソフトウェアやWebサービスのビジネスにシフトしたいと考えているのだが、少なくとも30%は請負の仕事をやらなくてはならないのが今の現状である。なので、どうやってデスマーチを防ぐかという点に注力して、この手の開発案件に取り組むようにしている。

     目標は、いかに無駄な労力をかけずに、不幸な人を出さずに終われるかということ。チームとしてストレスなく仕事をやり遂げ、もう二度と一緒にやりたくないという人が出てこないようにすること。品質はクリアーできれば及第点でよい。<=これが請負の悪いところかもしれないが、酷い環境で酷使されている現状を考えると、これでよいと自分は納得している。

     抑えるべきポイントは以下の2つである。

    1.工数見積もりを信用しない

    お客様の見積もりと期間には根拠がないことが多い。
    人と月は可換ではないことは明らかである。人と月は可換ではない
    3人で6ヶ月かかる仕事が,18人で1ヶ月で終わるわけではない
    「一人の子供を産むのに妊婦一人で約10ヶ月かかります.では同じ一人の子供を産むのに妊婦10人がかりだと何ヶ月かかるでしょうか?」もちろん,これの答は1ヶ月ではない.
     先日、Akamai主催の会で聞いた大槻先生の話のなかで、「人月に対して人と月は交換できない」という興味深いものがあった。
     これは妊婦の話を数式まで落とし込んだものだ。

     開発期間 = C × (工数)^D




     お客様は納期が迫るときまって人を増やせというが、そのくせ予算はない。
    どれくらいの期間でどれだけ可能なのか、自分たちであらためて見積もりを作成することが肝要である。また、工数に応じて最適な開発期間が存在することを、しっかり認識しておくべきである。

    2.適材適所

      人には様々なタイプがある。コードを書くのが得意な人、人と調整するのがうまい人、淡々と業務をこなしていく人。私は順に、Geek、Suit、Sweeperと名づけて、彼らに専門的に業務に取り組むように指示する。これら3つのスペシャリストがシステム開発で重要な役割(ロール)を果たす。どのロールが欠けても不都合になる。特にSweeperが見落としがちで、ビルドやテスト、リファクタリング、ドキュメンテーションなど、開発で必要な雑用を淡々とやりこなす。この作業はGeekやSuitは嫌がってやらないから、いてくれると本当に助かる人たちである。彼らがいないとGeekやSuitのフラストが大きくなっていく。

     適材は揃えたが適所を誤ると元も子もない。Geekがお客と調整をやっても効果は望めないし、その逆もしかりである。自分の得意とする作業に集中させてあげることが全体の生産性を高める鍵となる。それからコミュニケーション。Geekとそれ以外の人々との間には何か深い溝があり、コミュニケーションが図れない場合が多い。私は、時間とお金、労力と効果の関係、それから経緯をよく理解しないまま、素朴な発想をそのまま主張するGeekが悪いとは思っていない。先日読んだ革新的ソフトウェア企業の作り方にも書いてあったが、変なのは間違いなく我々Geekの方ではあるが、それをうまく通訳し、価値を伝えるべきはSuitの方だと考えている。

     最後に、弊社のロゴマークの意味を付けて締めくくるとする。




    木曜日, 1月 01, 2009

    初笑い このエントリーを含むはてなブックマーク


    新年あけましておめでとうございます。

    再出発した昨年は、優秀な社員に支えられながら、なんとか目標を達成することができました。本当にありがとうございます。

    今年は100年に一度のなんとか、とよくいわれておりますが、この逆境をチャンスととらえ、さらに発展できるように頑張ってまいりますので、よろしくお願いします。

    さて、正月を田舎で過ごしている私だが、ここで初笑いネタを披露します。

    「父母漫才」

    何かとトロい親父に向かって「のび太」という私。
    父は、それをいうなら「プニュ」だろという。(<=ポニョの勘違い)
    それを聞いた母はすかさず、「バカ違う。ポニョニョンたい。」(<=ポニョの勘違い)

    ボケてる父に真顔でつっこむ母のボケが一番面白かった。
    TVの漫才よりおもしろいや。

    今年もよろしくお願いします。

    水曜日, 12月 31, 2008

    【クラウドコンピューティング】 5年後のIT市場 このエントリーを含むはてなブックマーク



    クラウドが5年後にIT市場の4割に、上流シフトできないベンダーは消える

    日本IBMの中島丈夫エグゼクティブ・テクニカル・アドバイザー(技術理事)は、クラウドをもう少し過激に見ている。
    「クラウドは現在、IT業界や企業のIT部門が開発したり構築・運用している業務ソフトやITインフラ環境のすべてを収容し代替するパラダイムシフトとなり得る。
    クラウドでデータセンターが産業化、工場化すると、ソリューション提供とかシステム構築などの業界用語は死語になる。顧客の欲しい“最終製品” がクラウドから出荷されるからだ」


    IBMの中島理事は昔から過激だ。私が中島さんからe-DataCenterの話を聞いたのは10年以上前のこと。
     新しいものをプロデュースすることは本当に難しい。
    Webサービス、SaaS、クラウドと、世の中はそのとおりに進化してきた。中島さんから未来の姿を教えてもらいながら何もできていない自分がもどかしい。
    でもあきらめずに、着実に、頑張るしかない。(ちなみに中島理事は私をハマスのように過激だという)

    火曜日, 12月 30, 2008

    【雑記】 3分で分かる設計の話 このエントリーを含むはてなブックマーク



     外部設計で重要なのは項目の整理。画面->テーブル->I/Fの順番で見ていく。項目の整理で必要なことは名前と型と多重度の定義。ただし長さの定義は内部設計でやってもOK。
     内部設計で重要なのはロジック。主にControlとBlogicが実装できるかどうか考えていく。ウォークスルーをやって項目の抜けや矛盾を見つけ出し不都合があれば外部設計で定義したI/Fを修正する。(ここで修正作業が起きることを懸念してはいけない。修正はおそらく最後の局面まで発生するだろう)
     Modelはdataとblogicに分かれる。(ドメインモデルではこれが一つになる一方、Controlの定義が曖昧になる)blogicでは外部参照をなくし揮発性(ステートレス)とすることが重要。
     テストはUT、IT、STの順番で行う。UTは内部設計書を元にチェックするテスト。ITは外部設計書、STはユースケースを元にチェックする。

    <関連>
    MVCモデルは進化する
    ドメインモデル貧血症、サービスと振る舞いについて

    日曜日, 12月 28, 2008

    【雑記】 著作権について このエントリーを含むはてなブックマーク


     今日の日経新聞に出ていた「歌詞は盗作」認めずという記事が面白かったので一言。
    問題となったのは、CHEMISTRYの「約束の場所」のなかの「夢は時間を裏切らない 時間も夢を決して裏切らない」という部分で、銀河鉄道999の「時間は夢を裏切らない 夢も時間を裏切ってはならない」という表現からの盗作ではないかということ。漫画家の松本零士さんは作詞した槙原敬之さんが電話で参考にしたことを認めたとも主張していた。

    結局、「歌詞と漫画の表現は相似も大きく、漫画に依存しているとは断定できない」、「槙原さんが電話で認めたとも認定できない」との理由で、槙原さんに軍配が上がった。

    この話のポイントは、著作権が相対的独占権(あるいは排他権)であること。
    特許権や意匠権のような絶対的独占権ではない。すなわち、既存の著作物Aと同一の著作物Bが作成された場合であっても、著作物Bが既存の著作物Aに依拠することなく独立して創作されたものであれば、両著作物の創作や公表の先後にかかわらず、著作物Aの著作権の効力は、著作物Bの利用行為に及ばない。・・wikipedia


    つまり、明らかに盗作だと思える表現でも盗んだことが立証されなければ有罪とはならないということ。「槙原さんが電話で認めたかどうか」が勝敗の分かれ目だったのだろう。

    ソフトウェアの著作権についても同様の考え方ができる。

    オリジナルのソースを入手してcopyrightのコメントをすげかえてもNGだし、コピーしたことがわからないように変数名やコメントを変えてもNG。
    ただし、結果的に同じものができたと主張できれば、全く同じものでもOKとなる。

    特許などと違い、結果的に同じものができても著作権侵害にはならないがオリジナルのソースを見て作った(=盗作)のであれば侵害となる。

    木曜日, 12月 11, 2008

    【Reflex】 MorphとDropBoxでクラウドPDFサービスを実現 このエントリーを含むはてなブックマーク




     Reflex itextの機能説明にもDEMOをのせているが、これはMorph Appspaceで動いているサービスである。デプロイは簡単で、以下のようにjarを実行するだけである。

    java -jar morph-deploy.jar --user hoge --password piyo --config morph_deploy.properties pdfservice.war
    Uploading the code...
    Creating new appspace version...
    Deploying the application...
    Deploy Done.

    For more information on the status of this deployment, you
    can view the Deployment Logs by clicking 'Manage' located
    on your subscription widget and by clicking the Logs tab.

    In this same page, you can also view your Production logs
    and Scheduled task logs.

    ** transaction commit **


    さらに、Dropboxを使うことで、データもサービスもクラウドで提供できる。これが無料だからすばらしい。ちなみに、Morph AppSpaceもDropBoxも裏ではAmazon S3が動いている。

    以下のリンクをクリックするとPDFが生成される。実行


    http://pdfservice.morphexchange.com/?template=http://dl.getdropbox.com/u/200214/pagesample.html&entity=http://dl.getdropbox.com/u/200214/pagelist.xml


    自分のパソコンのDropBox publicフォルダに、pagesample.htmlと、pagelist.xmlを置いて、あとは、これらのリンクをPDFサービスに渡してあげるだけだ。

    グラフも出せるが文字化けする。海外のサービスだからしかたないところかな。実行

    http://pdfservice.morphexchange.com/?template=http://dl.getdropbox.com/u/200214/areachartsample.html&entity=http://dl.getdropbox.com/u/200214/stocklist.xml


    セキュリティの考慮点は暗号化とアクセス制御の2つ。
    httpsで暗号化、アクセス制御はDropBoxのグループフォルダの考え方がヒントになると思っている。

    クラウドで安全にPDF文書化ができたらWebEDIに応用できる。PDFに署名できたら取引は全部Webだけ、ということになるかもしれない。エンドユーザはサーバもストレージも用意する必要がない。Gmailのように過去のデータもすべてクラウドが保管する。

    クラウドの可能性を考えると、とてもわくわくするなあ。



    関連: 最初は無料が流行?Morph AppSpaceとdropbox

    月曜日, 11月 17, 2008

    【本日の嵌り】 Outputstreamをメモリにキャッシュ このエントリーを含むはてなブックマーク


     今作成しているWebアプリは画像生成処理の際に一時保管用としてテンポラリファイルに出力している。それがセキュリティ対策のためファイルへの書き出しが禁止されてしまった。さあ、どうしよう。
     幸い画像のファイルサイズも小さく出力後は消しても構わないのでメモリをテンポラリファイル代わりにして書き出せばよさそうである。そこで以下のようなOutputstreamをメモリにキャッシュするものを作成した。画像作成時にファイル名の代わりにキーを指定して書き出して出力時にキーを元に読み出せばよい。サーブレットなどマルチスレッドに対応するには、ファイル名にスレッド番号をつけてやればよい。

    これで解決。


    金曜日, 11月 14, 2008

    【Reflex】 なぜAkamaiと組んだのか このエントリーを含むはてなブックマーク


    非常に単純な理由である。
     
     Reflex iTextはデータとテンプレートを与えることでPDFを生成する。PDF生成処理は重くサーバリソースを圧迫するため、クラウド・コンピューティング・サービスを利用するのは理にかなっているからだ。
     
     また、AkamaiがGoogleやAmazonなどと異なるのはネットワークのクラウドであるということ。特にAmazonは日本にサーバを置いていないためレイテンシーが問題となる。Akamaiであれば心配する必要がない。

    「インターネット・エッジに置いたサーバー群でクラウドを加速化」、アカマイがアライアンスを設立

     「クラウド・コンピューティング・サービスを提供する他の企業は、データ・センター内の設備のスケール・アウトを進めている。ところが、インターネット側のスケール・アウトを実施する企業はあまりない。アカマイはそこを狙っていく。グーグルやアマゾンのクラウドを巨大な発電所に例えると、送電線と変電所の役割を果たすのがアカマイだ」(アカマイ日本法人の小俣修一社長)






    水曜日, 11月 12, 2008

    【Reflex】 アカマイ様とのアライアンスとReflex iTextの発表 このエントリーを含むはてなブックマーク


     アカマイ様と弊社は、Reflex iTextのサービスについてのアライアンスを結び、本日プレスリリースした。

    アカマイ、精鋭ソフトウェア開発会社とアライアンスを結成

     また、Reflex iTextのドキュメントを以下にUpしているので興味がある方はぜひ参照してみてください。
    Reflex iText Overview

    ポイントは、以下の2点です。

    1)Akamai様がグローバルに展開した膨大なコンピューティング環境にPDF出力エンジンを分散配置することでシステム負荷軽減を図れる。

    2)トランザクションによる従量課金となるため、使った分だけのコストしか発生しない。PDFサーバにかける初期投資を低く抑えることができる。

    月曜日, 11月 10, 2008

    【JavaScript】 高速化プロジェクト その1 このエントリーを含むはてなブックマーク


     先日、ある家電大手ECサイトのレスポンスが極端に低下するという事故が起きた。すぐに復旧できなかったところを見ると設計に何らかの問題があったのかもしれない。ECサイトにおけるレスポンス低下は致命的である。また、完成後のプログラムのパフォーマンスチューニングは難しい。サービスインしてから発覚したのでは取り返しがつかなくなることもあるので、設計の段階でよく考える必要がある。

    今年の春頃のことだが、あるプロジェクトでJavaScriptのパフォーマンスが極端に遅くなるのを何とかしてほしいという相談を受けた。

     AJAXブーム以降、大規模な業務アプリケーションでもJavaScriptはよく使われるようになってきたが、多用するとパフォーマンス低下の心配が出てくる。これは特にDOM操作の多いアプリで起こりがちである。今回のプロジェクトでも、ベンチマーク結果によるとDOM操作に問題があるアプリであることがわかった。とりあえず、アプリの修正は行わないで以下のような対処療法をやってみた。


    1.prototype.jsライブラリ改善

        ・HTMLファイル内のparentをいじる参考
        ・$()にcacheを持たせる参考
        ・prototype.jsファイルのサイズ縮小参考

     初期表示にかかる時間を計ったところ、9秒強(サーバ経由だと17-18秒) => 書き換え後8秒強(サーバ経由だと16-17秒)

    2.変数格納

    ・for文の.lengthを一旦変数に格納

         初期表示にかかる時間を計ったところ、変化なし

    3.jsファイルの圧縮

    ・他のjsファイルの圧縮もしてみたが、まったくと言っていいほど変わらなかった。



     対処療法ではまったくといっていいほど効果がなかった。しょうがなく設計からやりなおしてスクラップ&ビルドすることにした。結果は以下のように、初期ロードで倍のスピードとなり、また瞬時にタブ移動やページ移動ができるようになった。それでも初期ロードに時間がかかっているのは、DOMのリンク生成とサーバにおける検索処理時間が短縮できなかったことが原因である。DOMのリンク生成についてはどうしても時間がかかってしまうが、遅いのは最初だけなのでお客様にはなんとか納得してもらうことができた。
     どのようにしてこれだけの高速化ができたのか、詳細については「高速化プロジェクト その2」以降で説明したい。

    旧アプリ(Core2 2.0GHz、メモリ2GB) 単位ms

    初期ロードタブ移動ページ移動
    APPL117.94.16.8
    APPL212.54.03.8
    APPL318.85.76.5
    APPL411.31.42.3


    新アプリ(Core2 2.0GHz、メモリ2GB) 単位ms

    初期ロードタブ移動ページ移動
    APPL18.90.10.1
    APPL26.10.10.1
    APPL315.50.60.1
    APPL43.10.10.1


    <関連>
    高速化プロジェクト その2

     
    © 2006-2015 Virtual Technology
    当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。