日曜日, 4月 25, 2010

【Google App Engine】 Shin1Ogawa Nightから高速化テクまで このエントリーを含むはてなブックマーク


 普通にできることを何でこんなに苦労せにゃならんのか、制約がきつすぎるんじゃボケ~、とかいいながら、毎日毎日GAEの問題にへこまされて、ああ、とっても憂鬱な気分。今日はGAE Nightだけど、正直、GAEのことなんか考えたくないなあ。雨も降っているし。まあ、あれだね。GAEを使うヤシは、はっきりいってバカだね。みんな、Googleに騙されていることに早く気づこうよ。
 でも今日はshin1ogawa ja nightだし、teradaは楽しみにしているし、まあいいか、みたいな感じで出席。このやる気のなさが最近の私である。

魔法使い~shin1ogawa


 mavenを使った開発(gaejsimplequickstart)が便利そうなのと、面倒に思えるtestが意外と簡単に行えるということがわかったのは収穫だった。

 しかし、ライブコーディングをあんなに完璧にやってこなせるshin1ogawaははっきりいってすごいね。実際にやってみるとわかるけど、ライブコーディングはとっても難しいものなんだよ。私は単なるデモだって失敗することが多いというのに・・・、これではGAEの開発が簡単に見えてしまうではないか。

 テストの話題が少ないとおっしゃっていたが、自分にあてはめてちょっと考えてみた。
GAEの開発は特に、まだ機能レベルの検証というか、試行錯誤的にトライ&エラーをやることが多くて、システマチックにテストできないのが今の現状だと思う。テストするまでもなく、うまく動かない(あるいは極端に遅い)という現象に直面してしまって、それを解決するために、膨大な時間をかけて調査や試行錯誤を繰り返すという感じになってしまう。特にパフォーマンスは大事なので、そのためにEntityを何度も作り直したりしていると、サービスのAPIでさえ固められない。

 でもテストドリブンな開発は、品質を考えるうえで重要だと思うので、ある段階で取り入れる必要はあるとは思っている。

高速化テク


 AJAX化

 shin1ogawaもいっていたが、AJAX化は非常に重要だと思う。それから、JSPは基本使わず、セッションも使わないようにする。具体的には、appengine-web.xmlに下記を追加する。

<sessions-enabled>false</sessions-enabled>
(参考:AppEngineでsessionを有効にしていると遅くなる

セッションの代替については、JavaScriptでCookieに保存するか、Client-side Storageを使うのがいいと思う。
 AJAXを使えば、くるくるインジケータで、レスポンスの遅さを誤魔化せる(?)し、エラーハンドリングも楽ちんになる。メーリングリストのケースのように、ごくまれに起こるタイムアウトエラーの対処などにも、AJAXでリトライ実行してあげればよい。というか、エラーが出る前提で考えるべきで、佐藤さんもおっしゃっているように、リトライやスキップ等のロジックを書いておくのがお勧めである。

 Entity設計

 石井さんのSlim3 事例報告 運送コスト見積もりシステム mixcargoのチューニングの話は重要だと思った。
  一つ目は、Index爆発を起こさないよう、Entityの設計をシンプルにすること。また、DataStoreにおけるSelectを単純なものにし、InMemoryでfilterInMemory、sortInMemoryを実行すること。
  二つ目は、INSERTにおけるQuotaの上限が2500件/分(課金上げても上限は増やせない)なので、Entityの数を減らしてGETをがんばるという話。

 それから、Datastore書込については、ashigeruさん情報によると、TQを介さないより介したほうが2割程度PUTは速くなるとのこと。リモート実行におけるレイテンシの影響かもしれない。

 funyamoraさんのチューニングでは、複数のプロパティをBlobにまとめるということまでやっておられた。これはかなり速そうだ。

 静的コンテンツ

 静的ファイルとリソース ファイルによれば、<static-files>を追加することで、静的ファイルが専用のサーバー(フロントエンド?)のキャッシュから提供されるようになる。


<static-files>
<include path="/**.png"/>
<exclude path="/data/**.png"/>
</static-files>



 静的ファイルについては、jsやcssなどは複数個に分けず、なるべく1ファイルにした方が速いらしい。また、ブラウザキャッシュなども有効に使うとよい。

 funyamoraさんによれば、静的ファイルはServletから直接出力させた方が速いとのこと。(専用サーバキャッシュと比べてどれくらい速いかは検証が必要である。) 
 
 Spin up
 
 よく知られているが、appengine-web.xmlに<precompilation-enabled>を追加することでDeploy時にプリコンパイルしてくれるのでSpin upに有効。また、GAE/J、起動時間(spin up時間)短縮の試行錯誤によると、クラスローディングを減らすのが有効らしい。


<precompilation-enabled>true</precompilation-enabled>


 funyamoraさんによれば、以下をやることで時間短縮できたとのこと。


* Servletは複数に分けるのではなく1つにする
* ブランクのプロジェクトの方がSpin upが速かった(中身を軽くした方がよい(?))
* JSPを使わない


全体の感想



 shin1ogawaさんのプレゼンススキル、皆さんの積極的な濃い発言など、ajnは相当高いレベルになってきたなというのが全体の印象である。また、インパクトのある具体的な事例が出始めたのも大きい。
 帰り際、「なぜそんなにGAEにこだわるの?」と聞く輩に「制約があるから燃えるのさ」といって目をギラギラさせている自分がいた。

木曜日, 4月 08, 2010

【雑記】 限られた時間を有意義につかおう。そのためには・・ このエントリーを含むはてなブックマーク


お古の技術で潰した世界進出のチャンス. 5年以上の無駄を乗り超えられるかより


ホメオトシスのスレッドにも書いていますように(↑)、小生はこの10年間、ほぼ一人で日本市場のItanium翼賛体制に反攻してきました。そして小生の危憂が愈々顕在化してしまった。
ですから、それ見たことか!、と心が弾むかなと思っていた筈が、そうはならないのが悲しい。
悪い結果が予想通りになっても、耳を貸さなかった連中には、唯、虚しさを感じるだけです。
でも、ITの風景としては締めておかなければなりません。ステークホルダーに反省を促したい。
何故何回もこんな事を繰り返すのだろう。


 中島さんの話を理解するには、このビデオを見るのが一番はやい。
 Utilizationを上げることが重要というメッセージが含まれているが、これは、「1.3.2 の機能強化に見る方向性、それから議論のまとめ」で述べた資源の最適化と同じ意味である。(これは最近わかったこと)

 未来を予想できる慧眼の持ち主はなかなかいない。
 未来が予想できたとしても何か大きなビジネスチャンスを得られるわけではないのだが、少なくとも無駄なことに時間とお金をかけなくてすむ。限られた時間のなかでは、有意義なことにだけ時間とお金を費やすことが重要だと思う。
 
 そのためにも、これからはもっと素直に話を聞くことにしよう。(ほんとかよっていわれそうだけど)

火曜日, 4月 06, 2010

【Google App Engine】 開発環境で失敗するのにプロダクション環境で成功する件 このエントリーを含むはてなブックマーク


 先日、GDataAPI を非同期に実行するライブラリを公開したのだが、これを作っているときに不思議な現象に出くわしたのでメモっておく。


 * 開発環境ではちゃんと動くのにプロダクション環境では動かない。

  原因 => HTTPヘッダの判断をcase-sensitiveにしていたから。開発環境では、HTTPヘッダ Content-Type で返すが、プロダクション環境は content-type で返す。(o≧3≦o)


 これはまあ、100歩譲って許してもいいけど、問題は以下のケース。


 * プロダクション環境で動くのに開発環境では動かない

  原因 => problem in dev environment using PUT with java.net.HttpURLConnectionにあるように、PUTメソッドを発行すると、「Entity enclosing requests cannot be redirected without user intervention」が発生してエラーとなる。解決策は、commmons-httpclient-3.0のEntityEnclosingMethod.javaを修正して、lib/impl/appengine-api-stubs.jarに組み込めとのこと。(そんなん、やってられるかよ)
 GDataAPIを使ってコンテンツ登録に失敗している方がいたら、とりあえず、プロダクション環境でも試してみることをおすすめする。



 今後はプロダクション環境が私のテスト環境となる予定である。( ̄ー+ ̄) 

(参考) 開発環境ではちゃんと動くのにプロダクション環境では動かない 文字コード編



* 文字コードでハマったら、以下のコードを、appengine-web.xmlに追加してみる。


 <property name="file.encoding" value="UTF-8"/>
 <property name="DEFAULT_ENCODING" value="UTF-8"/>



HTMLには、


 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 </head>



responseには、


resp.setCharacterEncoding("UTF-8");



requestには、


 req.setCharacterEncoding("UTF-8");



 を追加してみる。

土曜日, 3月 27, 2010

【Google App Engine】 1.3.2の機能強化に見る方向性、それから議論のまとめ このエントリーを含むはてなブックマーク


App Engine 1.3.2の目についたところ

1.3.2では、URLFetchやTaskQueueの強化がはかられた(非同期URLFetchは1.3.1で対応済)
MLより

- URLFetch API - We’ve expanded the number of ports you can access with
the URLFetch API. You can now access ports 80-90, 440-450, and 1024-65535.
- Mail API - We’ve expanded the allowed mail attachments to include
common document extensions including .doc, .ppt, and .xls.
- Task Queue API - We’ve increased the maximum total Task Queue refill
rate to 50 per second.


 一方で、エンドユーザに対しては同期的な仕組みを、バックエンドについては実行時間の延長が計画されている。GAEでは、効率よく資源活用しながら、同時に必要なものは充実させていく方針のようである。


http://code.google.com/appengine/docs/roadmap.html

Features on Deck

- SSL for third-party domains
- Background servers capable of running for longer than 30s
- Ability to reserve instances to reduce application loading overhead
- Ability to select different availability vs. latency options for
Datastore
- Support for mapping operations across datasets
- Datastore dump and restore facility
- Raise request/response size limits for some APIs
- Improved monitoring and alerting of application serving
- Support for Browser Push (Comet) communication
- Built-in support for OAuth & OpenID



 特に、Spin up問題を解決する件(Ability to reserve instances to reduce application loading overhead)については、ココにあるように、かなり自信もあるようだ。(Googleの真骨頂!?)


Keeping reserved instances has been added to our public roadmap:

http://code.google.com/appengine/docs/roadmap.html

As far as spinning up
additional instances, there are probably a few good solutions here. We'll be
best off collecting feedback when we ship reserved instances on which
solution works best.


また、MapReduceのような並列実行の仕組みを導入して大規模処理を可能にする予定があるらしい。(参照


30 sec execution limitation only to web requests or to all requests ?

Yes, queued tasks and scheduled tasks have an execution time limit as
well. You'll want to break your large tasks into smaller pieces. We've
committed to map/reduce support to help make this easier on our
roadmap for a future release.


クラウドの最大の特長は全体最適化


以上をふまえて、また、先日の中島さんとの議論を通じて感じたことをまとめてみる。(御丁寧に、また返事をいただいた。反省:思考はもっと自由に. カオスの奇跡を求めて多様性に飛翔すべし

GAEでは、 Datastore、Memcache、TaskQueueなど、リソースへのアクセスがすべてNW経由となるのが基本である。疎結合・ステートレスという特長を活かしてスケーラブルにする。だが、WebServicesのAPI(RESTあるいはProtocol Buffers)となるので、この時点でBASEが必然的に導入されることになる。

重要なのは、リソースの占有時間を縮小することで全体最適化をはかること。
資源の有効活用では、物理的なリソース占有時間の短縮を図ることと、アプリの静的な配置から動的な配置(Spin up/down)をオンデマンドで実現することで対応する。


・scalabilityやスループットの高さよりも、すべてのアプリをpartition-tolerantに書くよう強制して巨大インフラに細粒度で集約し、桁違いの全体最適を実現できることが重要と思う。でないと大規模サービス以外はあまり必要ない
NoSQLとかKVS(App EngineやNoSQLはスケーラブルだからエラいのではない)


リソース占有時間に関しては、GAEには有名な、30秒(WebRequest)、10秒(TaskQueue起動)、5秒(URLFetch)、5分(インスタンス生存期間)といったタイムアウトルールがあるが、非同期コールが導入されたことで、アプリへの実質的な制限は緩和される。(アプリからみると実質的に同期と同じ扱いにできる)物理的なリソースの占有時間を短縮するという意味では、Spin up/downや非同期コールの目的は同じである。このあたりは、できるだけ相手に干渉しないという非協調性(楽観的ロックなど)と同じ発想のように思う。(参照
また、MapReduceではTaskを細かくすることで並列実行度を上げているように、Taskを小さくすることで、リソース利用効率は上がる。
ただし、MapReduceは何でもかんでも並列実行できるわけではないし、BASEトランザクションの不完全さは開発コストとして跳ね返ってくるので、注意が必要である。

BASEなどの不完全な部分をソフトウェア技術により補うというのがGoogleの方針なのだが、開発や運用コスト、パフォーマンス、セキュリティなどのトレードオフとはうまく付き合う必要がある。

例えば、外部システムと内部システムの中間領域(厳密には内部システムの範疇、GAEでいうところのGlobal)において、エンドユーザに対して隠蔽するようなフレームワークが重要になってくる。中間領域には、MemcachedといったDHT(分散ハッシュテーブル)と、Queueing Systemがある。(GAEでいえば、MemcacheとTaskQueue)この中間領域のフレームワークにNFRを実装してBASEを隠蔽する。ミッションクリティカルなシステムの Consistencyを満たすようなACID環境をエンドユーザに提供できればよい。

なお、同期型アプリケーションが必要な部分は限定的なので全体アーキテクチャーとはせず、要件に応じてパフォーマンスを優先する(BASE)のか整合性を優先する(ACID)のかを判断する。(そういう意味ではEventually Consistencyのオプションが選択できるのは嬉しいはず)

中島さんとの議論を通じて、「クラウド・プラットフォームの不特定大量のプロセッサー資源をエラスティック(柔軟)にプロビジョニング(配置)して効率よく資源活用することが最大の効果であり、全体の最適化によりコスト削減を実現する仕組みが重要(参照)」ということを改めて認識させられた次第である。

<関連>
Scale OutアンチテーゼとeCloud構想:質問
Scale OutアンチテーゼとeCloud構想
Scale OutアンチテーゼとeCloud構想:中島の考え
Scale OutアンチテーゼとeCloud構想:中島の考えを読んで
Scale-outアンチテーゼ 思いついた反論、というか疑問
竹嵜さんの疑問に対するお答え
ホメオトシスぎるお答え
反省:思考はもっと自由に. カオスの奇跡を求めて多様性に飛翔すべし

金曜日, 3月 26, 2010

【Google App Engine】 GDataAPIを非同期に実行するライブラリ このエントリーを含むはてなブックマーク


 App Engine 1.3.1からJavaでも非同期URLFetchが使えるようになって、これまで悩まされ続けていた5秒タイムアウト問題が解消されつつある。

 非同期URLFetchは以下のような感じ。

非同期URLFetchのサンプル


import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.urlfetch.HTTPHeader;
import com.google.appengine.api.urlfetch.HTTPResponse;
import com.google.appengine.api.urlfetch.URLFetchService;
import com.google.appengine.api.urlfetch.URLFetchServiceFactory;

public class URLFetchServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException {
    URL url = new URL("http://www.virtual-tech.net/");
    URLFetchService service = URLFetchServiceFactory.getURLFetchService();
    // FetchOptions.Builder. fetchOptions = new FetchOptions();
    // HTTPRequest freq = new HTTPRequest(url, method);
    // Future asyncHttpResp = service.fetchAsync(freq);
    Future asyncHttpResp = service.fetchAsync(url);
    resp.getWriter().println("async fetch");
    try {
      HTTPResponse httpResp = asyncHttpResp.get();
      resp.getWriter().println(
          "content : " + httpResp.getContent());
      for (HTTPHeader header : httpResp.getHeaders()) {
        resp.getWriter().println(
            header.getName() + ": " + header.getValue());
      }
    } catch (InterruptedException e) {
      resp.getWriter().println(e);
    } catch (ExecutionException e) {
      resp.getWriter().println(e);
    }
  }
}



Asynchronous GData API


 せっかくなので、GData APIを非同期実行できるようなパッチを作ってみた。

 これは、5秒を超えて使えると思う。Google Docsで全文検索とか、Google Appsと連携とか、これまで紹介したような外部連携アプリを(やっと)本格的に作れるようになった。

ソース:
gdataclientpatch

 使い方は簡単で、GoogleGDataRequest.javaとHTTPGDataRequest.javaとMediaService.javaを自分のアプリに置くだけ。(パッケージ名は変えないで)

 jarについては、gdata client libにもいくつか入れているが、必要であれば、GData APIの最新版(http://gdata-java-client.googlecode.com/files/gdata-src.java-1.41.1.zip)をダウンロードして必要なjarを入れてほしい。

注意点


 1. AppEngine内でnewできるDocServiceは同時に一つだけとなる。 <= APPNAMEパラメータ(下の例では"Google Service")を適当に変えることで複数のインスタンスを保持できた。スレッドセーフか!?
 2. GoogleDocsにはアクセス制限が存在し、1つのIPから同時に接続できるのは10程度である。アカウントを複数に別けても増えることはない。フロントエンドがリクエストIPを見てるっぽい。
 3. privateでは認証が必要になるが以下のようにリトライしないとうまく取れない。

<追記>
getRequestStream()に一部不具合があったので修正しています。≧‐≦(2010/3/30)




  DocsService service = null;
  for (int r = 0; r < Constants.NUM_RETRIES; r++) {
   try {
    service = new DocsService("Google Service");
    service.setUserCredentials(email, password);
    logger.warning("login OK!");
    return service;

   } catch (ServiceException e) {
    logger.warning(""+e.getStackTrace());
    
    if (r == (Constants.NUM_RETRIES - 1)) {
     return null;
    }
    sleep(Constants.SLEEP_MILL_SECOND);
   }
  }
  return null;





月曜日, 3月 22, 2010

【クラウドコンピューティング】 ホメオトシスぎるお答え このエントリーを含むはてなブックマーク


 ラ・マンチャ通信に、竹嵜さんの疑問に対するお答えを書いていただいた。いつもいつもリップサービスありがとうございます。アプライアンスについては誤解していたようなのでよく読んで勉強しておきます。

 1点だけ、気になるところがあったので、ここに挙げておきます。


 BASEトランザクションのイデオロギーには、オートノミック・コンピューティングに似た、理論信奉による全自動化追求の危険な匂いがします。
本来、セッション型が重要な部分を占めるようなビジネスのトランザクショナルなプロセスまで、理論化・自動化出来ると考えている節が垣間見えます。


これに対する私の返事(メール)の抜粋。


トランザクショナルなプロセスをトランザクションシステムにできるような、中間領域(外部システムと内部システムの間)があるのではないか、ということを最近発見?しました。中間領域には、MemcachedといったDHT(分散ハッシュテーブル)と、Queueing Systemがあります。実は、Google App Engineもそうですが、Windows Azureも同様のアーキテクチャーをしています。

私の考えでは、中間領域は厳密には内部システムの範疇ですが、エンドユーザに対しては隠蔽するのが重要になってくるのではないかと。

この中間領域のミドルウェアにNFRを実装してBASEを隠蔽する。そうすることで、エンドユーザにACID環境を提供できればよいのかなと思います。もちろん、それがミッションクリティカルなシステムのConsistencyを満たせればの話ですが、ACIDというからには満たせるんじゃないかなあと。

また、RDB(特にSQL)の運用コストなどの別のメリットも当然あって、スケーラビリティというだけで、RDBを簡単に放棄するわけにはいかないのはよくわかっています。
 その点、MSのSQL Azureは現実的な解で、既存の.Netシステムをほとんど変更なしに、Azureに移行できたという話もあります。

ただ、API化が進む昨今のアプリケーションのスタイルでは、コンポーネント化とWebサービス(REST)により抽象化や隠蔽が進んだことで、RDBとKVSとでそれほど大きく違わないという事実もあります。アプリケーションは元来OOで設計しており、RDB使用時にはO/Rマッパを通じてアクセスしています。

もしオンライントランザクションをKVSにできれば、同時にScalabilityも手に入れることができます。

ここは適材適所で考え、オンライントランザクションはKVS、情報分析や意思決定などではDWHといったように、使い分けるのがベストかなと個人的には考えています。


ちなみに、中間領域におけるConsistency実現の具体例は、GAEのSlim3実装がある。また、CassandraのConsistencyの実装など(READにおけるQUORUM)を見てもわかるように、KVSそのものもConsistencyが強化されてきている。Consistencyとは直接関係はないが、SEDAは要チェックだ。

<関連>
スケールするかどうか、それが問題だ
RDBをクラウドに載せるべきか

金曜日, 3月 12, 2010

【クラウドコンピューティング】 Scale-outアンチテーゼ 思いついた反論、というか疑問 このエントリーを含むはてなブックマーク


 Scale OutアンチテーゼとeCloud構想
 Scale OutアンチテーゼとeCloud構想:中島の考え
 RDMA実装で明らかになってきたクラウド時代の新データモデル
 
この話、反論を思いついたら書きますといっておいて放置していた。
中島さんは一言でも反論しようもんなら100倍になって返ってくることで恐れられているが、萎縮してたからではなく今は単に忙しいのだ。でも反論すると後で怖いので疑問ということにしておきます。

中島さん自身、10年くらい前に、e-Datacenterの話の関連で、マルチテナントのSaaSモデルを予言されていたので、今のPublicクラウドには異論はないのだと思う。
今回のお話を聞く限りでは、Publicクラウドは肯定されているが、それをそのままPrivateクラウドに適用することがだめといっておられるように思う。要は、NFRの作りこみがナンセンスであることと、CPUの高い処理能力が今後も見込めるということ。これは私もある程度納得できる話である。

ただ、アプライアンス志向については、何となく私でもイメージできたものの、もう少しPrivateクラウドの標準化の重要性が認知されてこないと一般の人にはまだ馬の耳に念仏かもしれないとは思う。社内の資源をデータセンターに集約してガバナンスをきかせる、そのためには標準化が重要であるという話は出てきてはいる(プライベートクラウドを構築した大手国内企業、その理由と利点を語る)が、中島さんの話を理解するには、もっと踏み込まなければならないと思う。

この考えをさらに発展させると、NW設備なども集約した1アプライアンスが、データセンター1個分ぐらいのインパクトをもつということになる。でもこのイメージが、果たしてどれくらいの人に受け入れられるかは全くわからない。昔、e-Datacenterの話を聞いたときもそうだったが、私はさっぱりわからず拒絶反応を起こしかけた。そう、この世の中にないものをイメージしろっていわれても拒絶反応を起こすのが普通なのだ。
 そのときは何もわかってないけど、とりあえずわかったふりしておくのが無難と考え、そして、10年たって流行りだすと、知ったかぶってウンチクをしゃべりだすというのが(私を含め)大多数の人の行動でもある。
 でも現実を直視すると、今の私はどうやって飯を食べていくかが問題で、10年後なんて、そんとき考えりゃいいじゃんというのも本音。誰かが投資してくれて10年間飯食わしてくれるなら話は別だが、体育会系のノリでガチンコできるわけがない。10年後はもしかしたら、HWアプライアンスのウンチクをいっているかもしれないけど。

ということで、本題に移る。

3つの疑問



疑問1 結局、CPU単体の能力は無視できないじゃないか

 大規模なデータ処理をマルチコアで走らせた場合、16コア以上ではスピードが減少するということが、IBM名誉フェローのFran Allen氏の昨日3月10日に行われた日本の情報処理学会創立50周年記念全国大会の招待講演
で紹介された。
 たしかに、Intel QPIで懸案だったレイテンシを解決できるのかもしれない。それは、AT互換機の黎明期に登場したローカルバス以上のショックはあるとは思うけれども、リニアに無限にスケールしていく話ではないように思う。(わかりませんけど)

一般にアーキテクチャは、計算ユニットとデータストア、この2つのあいだにあるバンド幅、レイテンシといったものを解決するためにあります。そしてここにパフォーマンスのバリアがあるのです。マシンの性能をより向上させていくには、こうしたバリアを乗り越えていくことが必要です。そしてこうしたバリアを乗り越えるためにキャッシュなどのデータをやりとりをするために多くの資源がつぎ込まれていきました。
計算ユニットをもっとストレージの中に分散して入れていく、というモデルがあるのかもしれません。
そして性能向上のための並列処理はこれ以上ハードウェアではできないのです。この道具をどう使うのか、それはソフトウェアにまかせられているのです。
・・・
最後に、この講義に非常に関連しているニュースを紹介しましょう。大規模なデータ処理をマルチコアで走らせた場合にどうなるか、という最新の研究です。
これによると、16コア以上ではスピードが減少するというのです。そしてこうしたマルチコアのCPUは市場に登場します。
これを解決するための答えは私にはありません。おそらくマルチコア時代にのこの問題を解決するには、デザインを見直し、アルゴリズムを再考する必要があるのでしょう。


疑問2 同期的処理が必要なのは部分的なのになぜ全体アーキテクチャが必要か

 以下はECの概要図(下)で実際に私が構築したものである。点線から上の段がインターネットの外部システム。真ん中が社内の受注システム。さらに点線の下が社外の外部システムと社内の基幹システムである。真ん中の点線の丸には、受注、在庫、出荷、販売の各サブシステムがあるが、それらは実質的には1つのシステムであり同期的に連携していた。外部システムであるYahooや楽天サイトからの受注データの入力、および、配送システム、会計システムへの出力については非同期のバッチにて行っていた。

 これは、受付時の在庫引当など、お互いに連動しあう部分のデータにおいては同期的な処理が必要だったが、会計処理など時間が過ぎて〆められた部分のデータにおいては、非同期的な処理で十分だったということ。同期的な部分はせいぜい直近の3か月分で、それ以外の3ヶ月以前のものは同期処理は必要ない。データの割合からいえば1対9。大部分が非同期処理で可能なものであった。何がいいたいかというと、本当に同期処理が必要な部分というのは極めて少ないということ。



 さらに受注処理のなかでも、商品検索、カート機能、在庫引当機能は、下図のように、それぞれ設計のスタンス(観点)が異なり、本当に同期処理が必要なのは在庫引当機能だけであったことも付け加えておく。



 外部システム連携では、例外的なエラーデータが含まれることも多いので、大量のデータをFTPなどで一旦受け付けておいて、エラーがあった行だけを送り返すといった感じで処理が進む。これは一種のEventually Consistencyである。
 このシステムでは、Yahoo、楽天からの受注取込時におけるエラーデータ修正処理(出荷日にお届けできないなど)。配送業者へのデータ送信時におけるエラーデータ修正処理(配送不能地域など)などがあった。これらはほとんどがコールセンターオペレータによるお客様(ゴメンナサイ)対応になってしまっていた。
 このように、外部システム連携では不確実性があるため、必要であれば人手を介してエラー修正することは、ある程度覚悟しなければならないと思われる。

 この事例はECという特殊なものなので、企業システムのすべてにあてはまるものじゃないとは思うが、一般的に外部システム連携に関しては、疎結合・非同期処理で十分なのではないか。
 それから、外部システムの境界は、社内外という意味だけではないことも付け加えておきたい。社内の2つの異なるシステムがそうかもしれないし、同一システム内のコンポーネントをサービス化してもそうなるかもしれない。(ECシステムの場合は、受注と在庫が別々のサービスとして立っていた)
 同様に、プライベートクラウドにおいてパワフルなコンピュータリソースが登場したとしても、複数のVMに区切って様々なサービスを立てる場合においては、同様の話になってしまうと思う。その場合、サブシステム間の連携は非同期と割り切るしかない。

 ちょっと話がそれるが、一般的なWebスケールのAPI(WebServices)は、外部システム連携の不確実性を考慮して提供しなければならないため、結果としてシンプルなRESTが流行ることになったと思う。Webスケールとは外部システムの集合と考えてよい。WS-*がサブシステム間の同期処理を念頭に置いているのに対し、RESTは基本ステートレス(非同期)である。WebスケールのAPIは、不確実性を想定していないとうまく機能しないし、同期的な処理にはなじまない。同期ではステートフルな実装が強要されるが、それは時間とリソースの束縛を意味する。もちろん、WSDLでインターオペラビリティが確保できるなんて話は幻想であることはいうまでもない。

疑問3 BASEトランザクションはそんなにダメなのか


 前述のECシステムにおいて、受注、在庫は同期的に連携していたといったが、実はこれはWebサービス連携であった。私はどうしても2つのコンポーネントに別けたかった。というか、在庫は第二フェーズの機能なのでそうせざるを得なかった。それで、どのようにしたかというと補償トランザクションで連携することにした。その結果、 補償トランザクションの悪夢のような話になった。ほれ、いわんこっちゃない、といわれそうだが、一方でコンポーネント化やサービス化のメリットも大変大きかったので、これはこれで正しかったとは思っている。

【EC開発体験記-サービス志向-】 疎結合で真価を発揮

言語の記事でも触れたが、私たちのECシステムでは、PHPと Javaの両方を使っている。PHPが主にリクエスター、Javaが主にプロバイダーだ。実は、PHPの開発者はJavaを知らないし、Javaの開発者はPHPを知らない。共通スキルはMySQLとLinuxだけだ。一昔前であれば考えられなかったチーム編成なんじゃなかろうか。お互いを干渉しない。干渉しようと思ってもできない。結果、自然と自分の責任範囲に集中することになる。これで本当の意味でサブシステム化が可能となる。私はサブシステム化する目的の一つは並行開発にあると考えている。密結合では実質的に無理な状況であった並行開発を、サービス志向であれば可能にできる。「完全なる隠蔽」によりシステム全体に及ぼす影響を最小限にできるため、分業・並行開発ができるようになるのだ。


 前述したように、コンポーネントを単位とするのが理想であり、その点では各処理はサービス化して疎結合が普通なのだけれども、受注と在庫のように、同期的処理が必要な場合もある。
 GAEでは、下図のように、DatastoreやMemcache、TaskQueueなど、すべてのリソースがネットワークだけで繋がっているため、基本的にWebサービスの呼び出しとなり、トランザクションは、EntityGroupのBASEトランザクションとなる。
 EntityGroupのロックは楽観的ロックを基本にしたもので、ロックをかけない非協調型であることが特徴だ。協調とは相手に合わせて自分が振舞うことで、非協調とは相手のことを考えない空気の読めないようなやつのことをいう。麻雀やると必ずいるだろう?自分のパイだけ直視して何の根拠もなくアンパーイとかいって全ツッパするヤシだ。
 悲観的ロックは、協調して動作することが基本。電車が運行管理システムで発射時間や速度が厳密にコントロールされている世界。一方の楽観的ロックは、各自が信号機を守って運転する自律の世界。ダイヤどおりに到着する電車に対し、渋滞もあって時間通りに着かないリスクがあるのがタクシー。でもこっちの方がとても効率がいいのである。
 リアルタイムで非協調な世界の代表はTwitter。ゆるく繋がって返事をしてもしなくても構わない世界。「リアルタイムで非協調」はWebスケールにおける重要なキーワードである。

 
 例えば、受注と在庫引当の2つがBASEトランザクションで連携すると、以下のように、アプリケーションによる2フェーズ処理のような感じになる。(BASEトランザクションの話は、送金のトランザクション処理パターンなどが詳しい)


 ① 1つのリクエストに対して受注を行いそれから在庫引当を非同期に実行する。在庫引当は必ず1回実行することは保証できるが数量によっては引当失敗が起こりうる。しかし、それを検知して受注をキャンセルすることはできない。
 ②  ①のリクエストに対して、引当失敗かどうかをクライアントからポーリングするなどしてチェックする。一定時間以内に確認できなければ失敗とみなすなど、例外処理も考慮する。


 結論からいうと、補償トランザクションはダメである。上記のようなBASEトランザクションも大変である。ではどうすればよいか。

 まず第一に、サブシステムの境界をちょっとだけ大きく広げ、サブシステム内であれば、ACIDトランザクションが可能になるようなフレームワークを作る。そのフレームワークはBASEトランザクションになるのだけれども、開発者はそれを意識せずに使えるというものである。

 ECシステムでいえば、受注、在庫、出荷、販売はそれぞれのコンポーネントとして独立しているが、サブシステムとしてみると1つであり、それぞれが同期的に連携可能とする。

 GAEのフレームワークであるSlim3は、Google App EngineでGlobal Transactionを実現している。
 Slim3では、CoordinatorがMemcacheやTaskQueueを使って2フェーズコミットを実行することでGlobal Transactionを実現している。つまり、BASEの仕組みで動作するACIDトランザクションシステムである。なんのこっちゃ!?と思われるかもしれないが、これは本当にすごいことだと私は思う。
 MemcahcedやTaskQueueといったCoordinatorの補佐をする機能は別途必要ではあるが、これらを含め、Scale Outのアーキテクチャーとして有効性が確認できれば、その応用としてマルチコア問題を解決できる可能性もあると思う。複数のCPUに共有メモリと高速バス ≒ Memcached+Apps+Datastoreに単純に置き換えて考えられなくもないと思う。
 Eventually Consistencyにも同期型、非同期型の2つのタイプがあり、同期型が実質的にACIDと同じ効果をもたらすならば、そんなに毛嫌いする必要もない。もしろ、HWを補完する機能はこういったソフトウェア技術かもしれないじゃないか。
 楽観的ロックもしかり、BASEトランザクションの応用はいろいろ可能だと思うのだが、どうだろうか。
 

木曜日, 3月 11, 2010

【Google App Engine】 In-page Integration of GFC JS API このエントリーを含むはてなブックマーク


 先日、WSSEチケット認証の話を書いたのだが、WSSEはパスワードをサーバで保持しなければいけないのが難点である。shin1ogawaさんがいうように、同じことがOAuthでできればそれに越したことはない。
 いろいろ調べてみると、In-page Integration of GFC JS APIというのが見つかった。これでいけるかもしれないので、ちょっと調べてみる。

<追記>
 ああ、shin1ogawaさんがいっていたのは、コンシューマとサービスプロバイダ間を2LeggedOAuthで繋ぐって話か。(こんなのあったのね。知らんかった)2LeggedOAuthはHMAC-SHA1を使った共通鍵認証みたいなので鍵の保持が必要だけど、”2LeggedOAuth”ってすごそうな名前なので、古臭いWSSEよりはいいかもしれない。
 ついでに調べておきます。

 GFC JS APIは、GAEを経由しないでGoogle Docsにアップロードするのに使えるかもしれないので、これはこれで調べます。

火曜日, 3月 09, 2010

【Google App Engine】 WSSEチケット認証でGoogleDocsとFederationさせる このエントリーを含むはてなブックマーク


GoogleDocsとGAEの連携
 GoogleDocsやGoogleAppsとGAEは相性がよく、これらを組み合わせたアプリを作りたいと考えている方も多いだろう。私もこの組み合わせは気に入っていて、下図のような、Google Apps 3層アーキテクチャーを基本にしたマッシュアップアプリが作れないか日々、研究している。
 この記事を書いてるあいだに、タイムリーにグーグル、Google Apps向けマーケットを開設なんて発表があった。今、Google Apps連携が熱い。



 Google Docsについては、先日、すごいのはGDriveより全文検索でしょ!?にも書いたが、PDFやEXCELといった様々なタイプのコンテンツをほぼ無制限に格納でき、かつ全文検索もできるので大変便利である。Google Docs List APIのAnyType Uploadなどは、Google AppsのPremier Edition向けとされているが、普通のGoogleアカウントでもPDFであればUploadができて、テキストファイルもcreateできるので、Premier Editionでなくても実質的にAnyTypeを扱えている。(保証はできないが・・)

 このように、Google AppsとGAEを連携させるのは非常に有効なのだが若干問題もある。一つには、Google認証だけでは、サイトを跨ぐ認証機能が不十分でうまくアプリケーションを連携できないこと。二つ目は、GAEには30秒ルールやURL Fetchの最大1MBという制約があり、GAEを介してしまうとGoogle Docsの大きなサイズのコンテンツを扱えないこと。

 これを解決するには、OAuthのような、サイトを跨ったアクセス権(認可)委譲の仕組みが必要となるが、OAuthを使ったとしても第3者の所有するリソースにはアクセスできない。
 そこで、下図のようなWSSEチケットを使った仕組みで解決してみることを考えた。これは、Federationと呼んでいるが、WSSEチケット認証機能をサービスプロバイダで受け持ち、Google Docsにユーザのアクセス権を付与することで第三者によるコンテンツ取得を可能にするものである。狭い意味でシングルサインオンのことであるが、第三者への認可を行えるという意味では別物と考えてもらいたい。
 WSSEは、WS-Securityと実質的に同じものであり、古くから存在するがあまり普及していない。Atom Pubで本命視されながら結局採用されなかった。


<やりたいこと>
  • ユーザYはサービスプロバイダZのコンテンツを取得したい。
  • YはコンシューマXのアカウントである。ZはYのことを知らないし知ってはいけない。
  • ZにとってYからのリクエストはXコンシューマからのリクエストとして処理しなければならない。

  • 一方で、コンテンツ取得の際はXを経由せずに行いたい。(1MB制限回避のため)

  • ZのコンテンツはXに対して常に開放されているわけではなく、普段は閉じられていてリクエストがあってはじめて提供できるようにしたい。
  • また課金などに使うためアクセスログも取りたい。



<処理の流れ>

  1. ユーザ(Yアカウント)はXアカウントが所有するGoogle Appsの一員である。

  2. ユーザ(Yアカウント)がZアカウントのGoogle Docsにアクセスしたい場合、サービスプロバイダにリクエストすることで、Xアカウントのドメイン名がGoogle DocsのACLに追加されてREAD権限がつく。

  3. ダウンロード後(数分後)サービスプロバイダが登録したTaskQueueによりXドメインのREAD権限が削除される。



<制約など>
  • Google DocsのACLには、Googleアカウントかドメイン名のどちらかを指定する。
  • すべての人への公開はGoogle Docs List API(Premier Editionを除く)からはできない。
  • 今回のケースでは、ZはYのことを知ってはいけないので、Xのドメイン名を追加する方法をとった。





 ① ユーザのアクションによりブラウザから以下のGETメッセージがコンシューマに飛ぶ。すると、コンシューマはWSSEリダイレクトURLを生成してブラウザに返す。

http://consumer.com/getcontent?key=2004000001.pdf


 ② WSSEチケットは、実際には以下のようなリダイレクトメッセージ(HTTP 302)であり、これを受けたブラウザは自動的にプロバイダに遷移する。nonceはランダムな値、createdは作成日時、userはXユーザである。

HTTP/1.1 302 Moved Temporarily
Location: http://provider.com/getcontent?key=2004000001.pdf&user=xxx&nonce=nnn&created=ccc&digest=ddd


 ③ WSSE URLを受けたサービスプロバイダは、保持しているXアカウントのpaswordとnonceとcreatedを結合してSHA1でハッシュ値を計算し、digestと比較する。一致すれば認証成功、一致しないか、既に使用済みのdigestであれば認証失敗としてブラウザに結果を返す。(digestはDatastoreに記録するなどして使用済かどうかを判定する)
   (パスワードを保持しているのはコンシューマXのサーバ内であり、ユーザYにはワンタイムだけ有効なハッシュ値だけが渡されるのがミソ。また、チケットを発行するには、必ずXサーバにログインしなければならないので、この時点で認可されていると考えてよい。)

 ④ 認証成功の場合、以下のような実際のダウンロードURLを返す。(これもリダイレクト)

HTTP/1.1 302 Moved Temporarily
Location: https://docs.google.com/uc?id=xxxxxxxxxxxxxxxxxxxxxxxxxxx&export=download


はこのとき、GAEだけではなく、Google Docsにもログインしていなければ、ダウンロード失敗となる。これの回避方法は後ほど述べる。また、document idが一瞬見えてしまうのが気になるところだが、コピーできるわけでもないので、まあこれはしょうがないと考えるしかないだろう。(わかったところで通常はアクセス権がないので大丈夫)

WSSE Sample




【コラム】FederationとGlobalの違い

 Globalは、アプリ内の連携という意味で使われることが多い。GAEでGlobalにアクセスできるものといえば、DatastoreやMemcacheなどがある。同じアプリであっても、内部変数などのLocalなリソースは1インスタンス内でしか利用できないが、Globalなリソースでは複数のインスタンス間で共有できる。(ちなみに、GAEでは異なるバージョンを10個持てるが、これらは1つのアプリとしてみなされるため、Globalなリソースを各々から参照できる。)
 ところが、アプリ(サイト)が異なれば、Globalなリソースであってもアクセスすることができない。Federationには「連携」という意味があり、サイトを跨ぐ連携という意味でよく用いられる。今回の話は、GAEのアプリとGoogle Docsとの連携なので、サイトを跨ぐFederationの仕組みが必要になる。


Googleのログイン認証について


 ちょっと本題からずれるが、Googleのログイン認証についていろいろ調査したことをまとめてみる。(話が複雑になるのでOAuthやAuthSubの話は省略する。)
 
ログイン画面からログインする

 ユーザアプリが勝手に画面をカストマイズすることは(たぶん)できない。以下のように、Bloggerなどは、ServiceLoginBoxを呼び出すことで独自のログイン画面を表示しているが、GAEの場合はServiceLoginが呼び出されている。


Blogger:
https://www.google.com/accounts/ServiceLoginBox?service=blogger&continue=https://www.blogger.com/loginz%3Fd%3Dhttps%253A%252F%252Fwww.blogger.com%252Fstart%253Fhl%253Dja%26a%3DALL&passive=true&alinsu=1&aplinsu=1&alwf=true&skipvpage=true&rm=false&showra=1&fpui=2&naui=8




GAE:
https://www.google.com/a/virtual-tech.net/ServiceLogin?service=ah&passive=true&continue=http://XXXXXX/_ah/login%3Fcontinue%3Dhttp://XXXXXX<mpl=ga&ahname=YYYYY&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



 また、Googleトークのようにユーザ認証なしに1クリックでGMAILボックスが開くような操作はブラウザからはできない。その理由は、ログイン画面には、GALXというソルトが埋め込まれており、表示されるたびに毎回生成されるからである。ソルト(塩)とは、ダイジェストを生成するときに含める乱数のことで、認証が成功して認証キーが生成されるまでセッションに含まれている。GALXはログイン画面を表示させないと取得できないので自動化は無理というもの。ちなみにGoogleトークではGALXを独自に生成しているっぽいが、これはGoogleだから成せる技である。

 認証キーの取得では、ログイン画面から以外に、ClientLoginサービスを呼び出す方法がある。ClientLogin for Installed Applicationsにあるように、USERIDなどをPOSTすることで、SID,LSID,Authといった認証キーを取得できるが、ブラウザから直接取得することはできない。ClientLoginサービスをサーブレットにして、認証キーを取得できたとしても、ブラウザからHTTPヘッダを付けることができないので、Authorization: GoogleLogin auth=your-authentication-tokenをつけてGETすることができない。SID,LSIDをCookieにつけようと思ってもクロスドメインにひっかかるのでできない。(ブラウザからgoogle.comにアクセスしてセットしなければならない。)XHR(AJAX)を使ってやるのも同様の理由でできない。要するにClientLogin認証はブラウザからは使えないということ。

 ブラウザ以外であれば、いろいろやり方はあるようである。


The Chromium Projects

For our needs, the normal Google Accounts ClientLogin API is not enough, as it is designed to provide cookies that allow a client application to authenticate to a single Google service. We want the cookies your browser gets when you run through a normal web-based login, so that we can get them into Chromium after the user's session has begun. Therefore, we currently go through a three-step process:

1. https://www.google.com/accounts/ClientLogin, to get a Google cookie
2. https://www.google.com/accounts/IssueAuthToken, to get a one-time use token (good for a couple of minutes) that will authenticate the user to any service
3. https://www.google.com/accounts/TokenAuth, to exchange the token for the full set of browser cookies we need to do SSO


Picasaの場合


When I run Picasa and tried to log in to Picasa Web, it connected to XSP and I was finally able to see how they were authenticating. The two interesting URLs were:

* https://www.google.com/accounts/ClientAuth
Posting the user name and password here gives us back a LSID and a SID value.
* https://www.google.com/accounts/IssueAuthToken
Posting the SID, LSID and service name (lh2 for Picasa Web) gives us an AuthToken.

Now that we've got the AuthToken, we just need to append it to the query string as auth=AuthToken when getting Picasa Web API information from http://picasaweb.google.com/api/urls?version=1. If you get that URL without the AuthToken, you will only get the read-only stuff, but adding the AuthToken gives you the post value, which is the URL used when sending commands to the server and also a cookie that should be used on the rest of the session to prove that you're authorized.

The authentication process now requires 2 POSTs and 1 GET, while before it was trying to emulate a web browser and got a bunch of redirections and lots of cookies being set and unset. Oh, and now google-sharp works on windows with the MS runtime too!


 このPython Sample(セキュリティ例外を認めて強制表示させてください)のなかでは、X-GOOGLE-TOKENを取得するというところで、上記と同じような処理を実装している。

GAEでログイン後にGoogle Docsにログインする

 一度、GAEアプリにログインできれば、Google Docsにログインすることは難しくない。ただ、GAEアプリ(service=ah)のSIDしか取得できていない状態なので、Google Docs(service=writely)のSIDを取得する必要がある。それは、以下のstatコマンドをGETリクエストしてあげればよい。(URL中のvirtual-tech.netはGoogle Appsのドメイン名)


https://www.google.com/a/virtual-tech.net/ServiceLogin?service=writely&passive=true&nui=1&continue=https%3A%2F%2Fdocs.google.com%3A443%2Fa%2Fvirtual-tech.net%2Fstat


 画面表示の際についでにこのGETリクエストも発行されるようにしておけば、再度ログインを要求されることなく静かにGoogle Docsにアクセスできる。(シングルサインオン)例えば、以下のGETリクエストを実行すると実際にコンテンツをダウンロードできる。(idはドキュメントID。Google Docsの画面で共有にしてダウンロードすると確認できる)


https://docs.google.com/uc?id=xxxxxxxxxxxxxxxxxxxxxxxxxxx&export=download



 ちなみに、downloadに続けて.htmlとすると、ブラウザはhtmlとして判断するので表示できてしまう。JavaScriptも同様に動かすことができる。ただ、提供元が、docs.google.comからdoc-xx-xx-docs.googleusercontent.comに遷移しているので、setCookieなどを仕込んで悪さをしようと思っても無駄である。


https://docs.google.com/uc?id=xxxxxxxxxxxxxxxxxxxxxxxxxxx&export=download.html



以下は、ServiceLoginを実行してからダウンロードを実行する方法。遅いのであまりおすすめではない。


https://www.google.com/a/virtual-tech.net/ServiceLogin?service=writely&passive=true&nui=1&continue=https%3A%2F%2Fdocs.google.com%2Fa%2Fvirtual-tech.net%2Fuc%3Fexport%3Ddownload%26id%3Dxxxxxxxxxxxxx



 ダウンロードはGAEを経由せずにできるようになったが、アップロードはブラウザからは無理のようである。何とかしたいけどよい方法はないだろうか。

今回の解析に使ったツール:

Live HTTP Header
FireBug+FireCookie

shin1ogawaさんからコメントをいただいたので追記:

イマイチ目的がわからない。gmail.comドメインのAppengineアプリから、userdomain.comのDocsのリソースにアクセスしたいなら、OAuthで普通に可能だけど、それとはまた違うのかな。 - shin1ogawa SoraUsagi 経由
うーん、ひょっとしてAppsの2LeggedOAuthでやれば良い話? - shin1ogawa SoraUsagi 経由


私もOAuthでやれるんじゃないかと思っていろいろ調べてみたのですがだめでした。 ><;。OAuthと周辺技術の勉強会を見ると、GFCの仕組みを使えばできそうな雰囲気なのですが・・・。もしわかったら教えてください。

<追記>
 ああ、shin1ogawaさんがいっていたのは、コンシューマとサービスプロバイダ間を2LeggedOAuthで繋ぐって話か。(こんなのあったのね。知らんかった)2LeggedOAuthはHMAC-SHA1を使った共通鍵認証みたいなので鍵の保持が必要だけど、”2LeggedOAuth”ってすごそうな名前なので、古臭いWSSEよりはいいかもしれない。
 ついでに調べておきます。

水曜日, 2月 03, 2010

【政治】 小沢幹事長不起訴に思うこと このエントリーを含むはてなブックマーク


小沢幹事長不起訴に関する気になる2つの書き込み。(2NNより)

これはヤミ献金、賄賂事件だと勘違いしていたが、石川議員が逮捕された理由は実は収支報告書の虚偽記載違反だった。
収支報告書は一年に一回、ちょうど今頃提出されるもので、お金の出し入れはすべて記入しなければならない。
 事件の概要はこうだ。
小沢さんの秘書たちは、銀行から借りて土地を買ったが、お金が下りるまで小沢さんに立て替えてもらった。
そして、すぐに返したのだが、そのことを収支報告書には記載しなかった。
1年の入金と出金だけ見れば結果的に同じことなので、小沢さんから一時的に借りたことを省略した。
なぜなら、小沢さんが大金を持っているのはイメージ悪いので隠したかったから。
これは嘘をついたことになり、虚偽記載違反となる。そういう罪で逮捕されて明日起訴される。
小沢さんが起訴されないのは、秘書に嘘をつくよう指示をしたり、関与した証拠が見つからなかったから。
今日のニュースはとても意外だった。
ゼネコンの捜索や2回の事情聴取を見て、検察は絶対何か証拠を掴んでると思っていた。
ヤミ献金の動かぬ証拠、起訴できる十分な証拠をもってるからこそ、捜索やら聴取やらをやったんだろうと。でもそうじゃなかった。
 そもそも、その頃は野党だったので収賄罪にならないそうだ。え=っ!
 検察の捜査の目的は、政治規制法違反容疑、つまり、「お金を一時的に借したことを記載しないよう指示した」証拠をつかむこと。
 それが、そんなに重要なことかよ。



総務省 政治資金監査に関するQ&A(その4) 資料3
http://www.soumu.go.jp/main_content/000037209.pdf

収支報告書の記載方法に関すること

Q 政治団体の事務職員が立替払いで物品を購入し、その後、政治団体から物品購入相当分の精算を受けた場合は、支出の年月日及び支出を受けた者はどのように記載することになるのか。

A 政治団体の事務職員が立替払いで特定の物品を購入し、その後、政治団体から物品購入相当分の精算を受けた場合は、この精算は、政治団体内部の事務処理として、政治団体の事務職員に渡したものであると考えられます。
 したがって、支出を受けた者は、事務職員ではなく、物品を購入した相手方が記載され、また支出の年月日は、物品購入時点が記載されることになります。

総務省自身が立替え処理を認めてるのに、検察はどうやって石川を【虚偽記載】で立件するの???w


たぶん、都合のいいように事実を曲げて書いたという悪意があったから。また、それを自供したことが大きなポイントかな。
法というのは、形式的なことより、事実などから読み取れる意図、特に悪意があったかどうかが重く見られるらしい。

火曜日, 2月 02, 2010

【クラウドコンピューティング】 Scale OutアンチテーゼとeCloud構想:中島の考えを読んで このエントリーを含むはてなブックマーク


 中島御大から返事があった。


本当は、ホメオトシスのスレッドで、竹嵜さんをネタに、北城さんとの昔の顛末を書いてやろうと思っていたのです。
竹嵜さんの勤務時間に対する当時の鷹揚さ(?)が北城会長の眼に触れて、アドミ専門のスタッフを付けられそうになった話です。中島には管理能力が全く無い、というご判断をなされたらしい。
勿論それで研究所長を首になったわけではありませんが。。。

Scale OutアンチテーゼとeCloud構想:中島の考え


(; ̄ー ̄川
どうも、すみません。

(そんなことが起きていたなんて全く知らず)、当時のIBMは本当に懐が深かったなあ、なんて勝手に思っていた。単に、中島さんに甘えていただけだったとは。とにかく、当時のIBMは、めっちゃ遊び働きやすかったことだけは事実であった。

 さて当時、中島さんは毎月の全体MTGで、いつも感動的なプレゼンをしてくださっていた。技術に裏付けられた論理、情熱、パワーにいつも圧倒されたが、一方で、机上の空論を嫌い、技術論だけでなく、ビジネスの重要性も説かれていた。技術要件と現実のあまりのギャップに戦意を無くしてしまうことも多かったが、脱力感を感じつつ毎回感激していたことも事実であった。特にすばらしかったのはIT動向で、5年~10年後のIT世界を、まるでタイムマシンで見てきたかのように具体的に話をされた。未来を妄想するのはとても楽しい。でも自分たちがIBMのイノベーションに一役買っていると思うともっと楽しかった。やりがいも感じていたし、本当にすばらしい会社だと思った。

でも、中島所長が本社の方に移動されてがっくりきたというか、モチベーションが無くなった。私にとって中島さんは5年~10年後の世界を教えてもらえる神のような、あるいは、北極星のような存在だったので、移動されてしまったことで方向性を見失ってしまい途方にくれた。まるで、たこの糸が切れたようにヒュルヒュルとなってしまった。

それでも、箱崎の方に移動させてもらい、2,3年は田原さんや米持さん達と好き勝手に過ごせたので楽しかった。その後、部署が解散、また幕張に戻されて、くだらない業務報告レポートばかり求められたのでやめることにした。仕事は無いのだが、自分がいかに有益な仕事をしたかを、毎週、妄想をかきたてて書かなければならない。私は、一日中、PCの前に座って誰と話すわけでもなく、ガマガエルのようにう~んと唸っていただけなので何も思いつかない。出てくるのはガマの汗だけ。不思議だったのは私と同じように全然仕事をしている雰囲気じゃなかった方達も毎週立派なレポートを書いていたこと。これはある意味すごい才能だと思った。私は罪悪感に苛まれて、こういった類のことがどうしてもできない。まあ不器用な人間である。今思えば、IBM社員で私ほど上司にレポートしなかった人間はいないんじゃなかろうか。(ところで、中島さんが上司にレポートしませんといった話は面白かった。レベルが全然違うけど、なんだ私と同じじゃん、と思った)

 中島所長が本社の方に移動されてモチベーションが下がったことも、私がIBMを離れた理由の一つだが、(念のためいっておくけど首になったんじゃないよ)インターネットの普及で情報元に困らなくなったことも大きかった。
 もうIBMから学ぶことはなくなったと思っていたので、いつやめてもいいと思っていた。それまで、SIプロセスも2,3回やって設計開発やプロジェクトリーダも経験した。また、自分一人でセリングをやって、割と大きな案件を成約させたりもした。しかし、IBMの情報元からは離れたくなかった。
 当時までイノベーションリーダは間違いなくIBMだったと思う。ITの動向を知るにしても、お客様対応するにしても、社内の情報を見なければ解決しなかった。なので、IBMの情報にアクセスできるという優位な立場は、離れられない大きな理由の一つであった。
 しかし、だんだんとインターネットに依存してくるようになり、あるとき、ふとIBM社内の情報は必要ないということに気づいてしまった。それから独立しようかなと考えるようになった。

 久しぶりに、中島さんの話を聞いて感じたのは「戦意喪失感」。ああ、昔感じたこの感じ。まるで映画のエンディングを先に聞いてしまったかのような脱力感。やっぱり、あのサイトは見ないほうがよかった。昔はあまり思わなかったけど実は中島さんはネタばれすることで人の楽しみを奪う悪い人なのかもしれない。

それは絶対正しいのだけど、中島さんは、これまでも正しいことをおっしゃってこられたけれども、何か受け入れられないモヤモヤがある。でも反論の余地はないから、歴史が証明するのを待つしかない。(反論を思いついたらまた書きます)

一発逆転ホームラン願望に満ちた中途半端な自由人の私は、悲しいかな、丸山先生に感化されて夢遊病になってさ迷うか、中島さんに感化されて戦意喪失してしまうかのどちらかしかない。

まあ、いずれにしても楽しいことに変わりないのだが。(なんだ楽しいのかよ!?)

金曜日, 1月 29, 2010

【Google App Engine】 TaskQueue再調査中 ><; このエントリーを含むはてなブックマーク


 前記事で、

HardDeadlineExceededErrorが発生すると、そのTaskは強制終了となってリトライされない。


 と書いたが、なんと、30秒制限にひっかかってもリトライされている事例があるではないか。=>Google App Engineで長い処理をタスクキュー使って実行

 う~む。これはもう一度調査する必要ありですな。
 すんません。

 2010/3/8追記 Exceptionを握りつぶさないで、最後までスローしてあげると、必ず再実行されるが、Task Queue sometimes leave tasks unexecuted for a few minutesにあるとおり、起動するのに数分間かかる場合があるという。

火曜日, 1月 26, 2010

【Google App Engine】 TaskQueueは信用できないで御座候 このエントリーを含むはてなブックマーク


 ajn#4、面白かったで御座候。浅海先生、荒川さん、おつかれさまで御座候。今回は、TaskQueueが信用できない話をするで御座候。(ところで、御座候って書くと何かいいことあるの?)

TaskQueueは必ず実行されるが正常終了するとは限らない

 TaskQueueはたしかに必ず起動される。例えば、"Request was aborted after waiting too long・・"というエラーになったとしても、正しく起動されるまでリトライされる。
 しかし、起動してから30秒を超えた場合に、com.google.apphosting.api.DeadlineExceededExceptionやcom.google.apphosting.runtime.HardDeadlineExceededErrorが発生すると、そのTaskは強制終了となってリトライされない。※Exceptionをcatchで握りつぶすのではなく、ちゃんとスローさせれば必ずリトライされる。(正確には、com.google.apphosting.api.DeadlineExceededExceptionの後、300ms~400msでHardDeadlineExceededErrorになって強制終了する。300ms~400msでは出来ることは限られるが、何らかの救済処理を追記できるかもしれない。また、com.google.apphosting.utils.servlet.TransactionCleanupFilterというのもある。これらの動作については、30秒後の後を見て得たものが詳しい。)

 (※)2010/3/8追記 Exceptionを握りつぶさないで、最後までスローしてあげると、必ず再実行されるが、Task Queue sometimes leave tasks unexecuted for a few minutesにあるとおり、起動するのに数分間かかる場合があるという。皆さん、スターよろしくお願いします。m(_ _)m

 TaskQueueが正常終了するとは限らない原因(リトライはされるが)はDeadlineExceededExceptionであるが、さらに、そのときの負荷状況によって発生したりしなかったりすることが問題を複雑にしている。ある条件下でテストして成功したとしても、実行環境の負荷状況は刻々と変化しており、次にテストしたときには成功するかどうかわからない。つまり、今日成功したものが明日は失敗するということも普通に起こる。これがTaskQueueが信用できないという意味である。
 

実際のテスト結果

 例えば、Taskを複数件登録するという実験をすると、※1のように、最初の10件までは問題なく完了するのだが、それ以上になるとエラーになる。
 ちなみに、1Taskで、500文字StringをBatch PUTで500個実行すると、以下の理由でうまくいかないので、300文字StringをBatch PUTで100個実行するようにしている。

  • DatastoreService#get(List)は500件まで。
  • Entity#setProperty(key, value)のvalue文字列(String)は500文字まで。
  • DatastoreTimeoutExceptionの場合は5秒sleepし無限に再実行する。(warningログは出力する。)
  • 同じキーのインデックスが既に登録されている場合は再度putしないようにする。
  • 500件put時に下記エラー。件数ではなくて、一度にputするサイズが大きすぎるのかも?

    SEVERE: The request to API call datastore_v3.Put() was too large.


  • 上記対策をコーディングしてテスト
    • 最大文字数500文字(日本語)、バッチput500件では"The request to API call datastore_v3.Put() was too large."エラー発生。
    • 最大文字数250文字(日本語)、バッチput500件では"The request to API call datastore_v3.Put() was too large."エラー発生。
    • 最大文字数100文字(日本語)、バッチput500件では"DatastoreTimeoutException"が1回発生し、リトライで正常終了。
    • 最大文字数100文字(日本語)、バッチput300件では"DatastoreTimeoutException"が2回発生し、リトライで正常終了。
    • 最大文字数100文字(日本語)、バッチput100件ではエラー発生せず正常終了。(11.2秒、バッチgetも100件)
    • 最大文字数100文字(日本語)、バッチput100件、バッチget500件ではエラー発生せず正常終了。(10.8秒)
    • ちなみにバッチput501件を実行すると、下記エラーとなった。(local環境だと501件が登録できてしまったが、GAEだとやはりエラーとなった。)
      • java.lang.IllegalArgumentException: cannot put more than 500 entities in a single call
  • バッチputは100件のまま、最大文字数を変えてテストする。
    • 最大文字数200文字(日本語)ではエラー発生せず正常終了。(11.5秒)
    • 最大文字数300文字(日本語)ではエラー発生せず正常終了。(12.5秒)
    • 最大文字数400文字(日本語)では"DatastoreTimeoutException"が1回発生し、リトライで正常終了。(20.7秒)
    • 最大文字数500文字(日本語)では"DatastoreTimeoutException"が2回発生し、リトライで正常終了。(27.6秒)

  • QueueにTaskを溜めてみる。
    500文字の文章(+3文字)を、最大文字数300文字(日本語)、バッチput100件でインデックス登録処理を実行する。
    • 一度に3件登録した場合、エラー発生せず3件とも正常終了。
    • 一度に100件登録した場合 、
      • 最初の10件まではエラー発生せず正常終了。(※1)
      • 11件目からDatastoreTimeoutExceptionが発生し始める。
        また、com.google.apphosting.api.DeadlineExceededException: This request (b0dadab42eb7da0a) started at 2010/01/18 06:33:21.954 UTC and was still executing at 2010/01/18 06:33:51.109 UTC.
        との30秒超過エラーが発生。(Errorログ)
      • このあたりから"Request was aborted ..."ログが出始める。
      • 12件目からDatastoreTimeoutException、DeadlineExceededExceptionの後、
        com.google.apphosting.runtime.HardDeadlineExceededError: This request (9e9803f05d46a8c5) started at 2010/01/18 06:33:32.729 UTC and was still executing at 2010/01/18 06:34:03.487 UTC.
        とのCriticalログが発生。
      • 以降はDatastoreTimeoutException、DeadlineExceededException、HardDeadlineExceededErrorが頻発。
      • 時々正常終了する場合もあるが、"This request used a high amount of CPU, and was roughly 1.1 times over the average request CPU limit. High CPU requests have a small quota, and if you exceed this quota, your app will be temporarily disabled."とのWarningログが出力されている。


StoneSkippingによる対応策
 
 ということで、TaskQueueは信用できないものとして、別途Memcacheで管理するという方法を考えてみた。(Memcacheも信用できないという話はあるが・・)
 下図のように、べき等性をもつTaskを1件づつ繰り返し実行することで全件を処理するが、Taskは不完全終了してもいいように、Memcacheにおいて情報を管理するというところがポイントである。これを勝手にStone Skippingと名づけている。川辺の石投げ遊びで3段とびとかやって遊んだやつだ。Cronだけだと最短で1分間隔でしか動かせないので、Taskの数段飛びで対応するようにしている。

 
 ① クライアントからのリクエストはMemcacheに登録する(※1)
 ② cronが最初のTaskを起動、未完了の文字列を拾ってINDEX登録。登録成功でMemcacheから消す。(※2)
 ③ パラメータに文字列指定して次のTaskを登録する(URLは最大2038 文字なのでたぶん大丈夫)
※1 Memcacheの排他制御は必要。(参考)Memcacheでスピンロックを実装してTask Queue処理結果を集約してみるテストCommentsAdd Star
  Max1MBなので最大1000件とする。
  それを超える場合はKeyを+1する。
※2 未完了のものを再実行する際は、途中までPUT成功しているものを読み飛ばす




INDEX生成実験
 

 これは、全文検索(SuffixArray)用INDEX生成のために実際に用いて実験したもの。

  • Store Skipping方式で500文字(日本語)×100件の文字列のSuffix Arrayを作成する。
  • Indexの最大長は200文字、バッチputは最大100件。
    • 500文字 / 100件 = 5回バッチputを実行する。
  • Index作成要求Servletに100回リクエストを投げる。1リクエストするたびに、200msスリープする。
  • cronは1分間隔で実行。
結果
  • Index作成要求100件リクエスト(Memcache書き込み) : 1分4秒
  • Index作成(datastore書き込み) : 1時間以上 (1時間10分で100件中60件登録完了)
    • com.google.apphosting.api.やcom.google.apphosting.runtime.HardDeadlineExceededErrorが多発。
      • 100件のバッチputが途中まで実行された後上記エラー発生。
      • 60件目あたりから、バッチputが1回も実行されないで上記エラー発生。
    • キューにタスクが3件たまることもあり。(※)
      • おそらく同じdoc,itemに対する処理。


 実行時間がかかりすぎるため、cronの実行間隔やPUTする文字列の長さなど、いろいろ調整することで、リトライが発生しないようにする改善は必要だと思われる。とりあえずは、これで確実に保存できることを確認できた。
 クライアントから登録する際にかかった時間が1分4秒であった点も大きい成果である。

<※追記>
# Task実行が1分以内に完了しないとcronによって多重に起動されてしまう。
# 今回の実験では、TaskQueueにTaskが65個溜まり、CPU TimeのDaily Quotaが限界値まで達してしまった。
# Memcacheにおいて、Task起動数管理(起動で+1、終了で-1)を行う必要がある。また、異常終了(DeadlineExceededException)発生時には、HardDeadlineExceededErrorまでの300ms以内に-1を実行する。そして、1個以上起動されない仕組みにする。
<※追記 01/28>
再テスト

  • 改善内容
    • インデックス作成対象文字列を500文字から100文字に変更。
    • cronの実行間隔を1分から2分に変更。
    • QueueにTaskが登録されている場合、cronからTaskを登録しない。(最大1TASK)
    • インデックス作成対象文字列の最後に番号を付加し、インデックスの内容が各リクエストで別々になるようにした。
  • 結果
    • 100文字 * 100件処理にかかった時間 : 3分4秒
    • 1タスクの処理時間 : 1.1秒~2.6秒
    • 2個のインスタンスが交互に処理を行い、タスク終了後、次のタスクはすぐに処理が実行されている。


# 同じ文字列を登録するとINDEXが肥大化してしまい、100リクエストを処理するのに約12分かかってしまった。実際にはそれぞれのリクエストで文字列は異なるので、このようなことにはならないと思われる。上記のテスト結果が標準的な数値だと思う。

TaskQueueはスケールしない!?5


 最後に、こちらの記事の続編で、ajn#3の宿題の報告を行う。
 前回の実験では、どんなにがんばってもvmが4つしか起動できなかったのだが、今回の実験では、いわゆる「あっため」を行うことで、vmのインスタンス数を増やしてみようという試みだ。

実験1:vmのインスタンスをとにかく増やす

  • Warmerサーブレットを作成。sleepしてレスポンスにuuidを返す。
  • クライアント側はJMeterを使用してテスト。
    • スレッド数、Ramp-Up期間、ループ回数をいろいろ調整して実行してみる。

  • sleepを1秒に設定してテスト
    • -> サーバ側に"Request was aborted ..."が所々発生。
    • -> 何件かクライアントにエラーで返ってくる。
    • -> インスタンスが4個から増えない。
  • sleepを3秒にしてみる。
    • -> DeadlineExceededExceptionが発生し正常終了しない。
  • sleepを2秒にしてみる。
    • -> サーバ側"Request was aborted ..."の発生件数が増えた。
    • -> インスタンスが4個から増えない。
    • -> 戻りがエラーの場合の件数が増えた。(60リクエスト中、エラー41件)
  • sleepを500ミリ秒にしてみる。
    • -> インスタンスが1個しか起動しない。
      (スレッド数60、Ramp-Up期間120秒、ループ回数1,2,4共全て)
  • sleepを800ミリ秒にしてみる。
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数4でインスタンス4個起動。
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数6でインスタンス10個起動!(ループ回数8でもインスタンス10個)
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数12でインスタンス11個起動。
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数16でインスタンス12個起動。
    • -> エラー戻りはなし。
    • -> サーバ側の"Request was aborted ..."もなし。
    • -> しかし、いくつか結果が返ってこなかった。
  • sleepを900ミリ秒にしてみる。
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数6でインスタンス9個起動。
    • -> スレッド数60、Ramp-Up期間60秒、ループ回数8でインスタンス12個起動。
    • -> エラー戻りはなし。
    • -> サーバ側の"Request was aborted ..."もなし。
    • -> しかし、いくつか結果が返ってこなかった。
  • ※1リクエストの処理を1秒未満にすると、順調にスケールするようです。

PDF生成実験

事前にあっため処理を行うと、インスタンス数が増えた分は有効。ただし、処理時間は1分15秒(インスタンス4個)が1分(インスタンス9個)になる程度。インスタンス9個でも主に稼動しているのは4個であった。(1タスク10ページ、total=700ページ)。
あっためても実質4つしか実行されないのは、この絵のなかのリクエストキューに実行単位の境界があって、その境界を越えて実行することができないからではないかと推測している。(By WdWeaver)



実験2:あっためてからPDF生成
  • 1タスク50ページの処理は重いせいか、1分少々で処理完了する場合もあったが、4分くらいかかることもあり、不安定。
  • 1タスクの負荷を減らして10ページ程度とすると、処理時間が安定した。
  • precompilation設定は有効と思えるが、1タスク50ページの条件で試したため誤差の範囲かもしれない。論理的には有効のはず。。。
  • あっため処理30秒では不十分。60秒はすべき。もう少しあっため時間を延ばした場合の実験要。

  • JMeterで、Warmerサーブレット(900msスリープ処理)を30秒(スレッド数30、ループ回数8)を実行した後、大量ページPDF生成処理を行う。
    • -> あっため処理をしながらPDF生成処理を行った場合、"Request was aborted ..."ログが多発した。

  • 1タスク50ページ、total=700ページを実行(タスク数14個)
    • 実行時間 : 3分54秒
    • インスタンス数 : 3個
    • "Request was aborted ..."ログ : 51件
  • 同じ条件で、precompilation設定を行って実行する。
    • 実行時間 : 2分38秒
    • インスタンス数 : 7個
    • "Request was aborted ..."ログ : 25件
  • 1タスク10ページにし、total=700ページを実行(タスク数70個)(precompilation設定有効)
    • 実行時間 : 1分8秒
    • インスタンス数 : 6個
      • メインに実行しているインスタンスは4個で、残り2個は1処理と3処理。
    • "Request was aborted ..."ログ : 122件
  • 1タスク10ページの上記条件で、あっため処理をしない場合
    • 実行時間 : 1分15秒
    • インスタンス数 : 4個
    • "Request was aborted ..."ログ : 123件
  • また1タスク10ページの上記条件で、あっため処理を60秒行った場合
    • 実行時間 : 1分00秒
    • インスタンス数 : 9個
    • "Request was aborted ..."ログ : 88件
ちなみに
1タスク10ページ、total=1000ページを実行(タスク数100個)(あっため処理30秒)
  • 実行時間 : 1分42秒
  • インスタンス数 : 6個
  • "Request was aborted ..."ログ : 166件

木曜日, 1月 21, 2010

【クラウドコンピューティング】 Scale OutアンチテーゼとeCloud構想 このエントリーを含むはてなブックマーク


Scale Outがクラウドの本質ではない!?

 ちょっと古いが、2008年10月に、クラウドの本質と動向という記事のなかで、1.スケールすること、2.安く利用できることがクラウドの本質であると書いた。大量のコモディティサーバを用意して分散KVSを配置することでスケーラビリティとアベイラビリティを確保することが基本で、プライベートクラウドは、この考えを企業内に応用したものである。

 これに対するアンチテーゼとして最近よく耳にすることは、サーバ単体の能力は十分に大きく、その能力を超えて処理しなければならないような大規模なケースはあまりないのではないかということ。真偽はわからないが、ムーアの法則が十分に成り立っており、CPU処理能力向上は将来においても続く見通しであることも背景にある。

 約5,000万PV/月くらいのサイトまでなら、アプリケーションサーバ1台で捌ける(ウェブアプリケーションサーバを複数台構成とか2010年代には流行らない


一般に、クラウドといえばCAP定理などに象徴される、超大規模な分散ストレージについての話になりがちだが、そんな最先端の基礎理論が必要になるのはトップ1%のなかの1%ぐらいのサービスで、世の中のほぼすべてのサービス開発者にとって、むしろクラウドの恩恵というのは以上のように一見地味な進化の中にこそあるのである
スケールアウトからスケールアップへの回帰


 また、クラウド・プラットフォームの不特定大量のプロセッサー資源をエラスティック(柔軟)にプロビジョニング(配置)して効率よく資源活用することが最大の効果であり、全体の最適化によりコスト削減を実現する仕組みの方が重要との意見もある。

 scalabilityやスループットの高さよりも、すべてのアプリをpartition-tolerantに書くよう強制して巨大インフラに細粒度で集約し、桁違いの全体最適を実現できることが重要と思う。でないと大規模サービス以外はあまり必要ない>NoSQLとかKVS(App EngineやNoSQLはスケーラブルだからエラいのではない


 プライベートクラウドでも、リアルタイムに、必要なITリソースを調達できるメリットが強調されている。

 海外で、ある金融機関に監査が入り、顧客の口座データや資金の動きをバッチ処理し、異常がないかを調べることになったという。期限は3日後。数十台のサーバが必要だが、今からIT部門にリソースを要求しても、とても間に合いそうにない。

 そこで、この金融機関の担当部門はAmazon EC2を使ってバッチ処理を行った。それを知ったCIOは激怒した。重要な口座データをインターネット経由のパブリッククラウドで処理するなど、とんでもないと。ところが、担当部門の責任者は、「リソースをすぐ使えるよう準備していないIT部門の方が怠慢」と逆切れ。これを教訓に、この金融機関はプライベートクラウドを導入したそうである。メリットを共有する「業界クラウド」の可能性--IBMに聞くプライベートクラウドの価値

 しかし、全体の最適化もそうだが、システムの規模が大きくなることで運用コストも増大する。特に、プライベートクラウドの経済性についての疑問は大きいようである。

 プライベートクラウドは、正しい方向への第一歩のように感じるかもしれないが、しかし規模の経済としては、プライベートクラウドは本当のクラウドコンピューティングの効率性に遠く及ばない。何が違うか? 規模、共有されたリソースファブリック、高いリソースの利用率でこそよいサービスが低コストで提供できるのだ。
つまりHamilton氏はプライベートクラウドはパブリッククラウドと比べて効率性もサービスレベルも悪く、しかしコストは高い、といった点を突いているわけです。
プライベートクラウドに未来はないのか?


プライベートクラウドの価値


 ところが、まったく逆の発想もある。

私たちのJEANSは、アプリケーションと基盤を疎結合化し、サーバー・クラウドなどの最新技術でアプライアンス・フレームワークを構築する企業システム革新への提案です。日本のお客様のIT変革を阻む大きな要因として、IT環境における強い安定志向と、それを達成するための案件個別のきめこまかな非機能要件(NFR)の作りこみが考えられると思います。この密結合に起因する変化対応能力の課題を解決できれば、グローバルな競争を凌駕する開発、保守、運用の革新を起こすことができると考えます。アプリケーションと基盤をNFRにフォーカスして疎結合化するために、新しくアプライアンス・フレームワークを設計し、いろいろとお客様実環境での実証性をスタディしたいと考えています。ミッションクリティカル環境にフォーカスし、仮想化技術やクラウド・コンピューティング技術を最大限活用してこの構想の実現をめざしています。”eCloud研究会” 参画について.JEANSの背景


 Googleはあれだけの規模のデータセンターを少ないコストで運用できているのだがら、運用コストの削減はたぶん可能だと思う。そういった技術を企業システムに応用することのメリットは計り知れないだろう。
 この提案で驚いたのは、開発コストにまで言及している点である。現在、IT投資の70%以上が運用系に費やされており、その原因が非機能要件(NFR)の作りこみの現状があるということ。この構想では、もう一度プラットフォーム側の可能性を見極め、そして、(HWではない)アプライアンス・フレームワークによる解決を試みる。つまり、NFR作りこみが必要ないぐらいの高度なプラットフォームを専用で用意(≒アプライアンス)することで、業務アプリは非常にシンプルにできる。そうなれば、3K,4Kといわれる酷いシステム開発の現状を打破できる。

CAP定理を超越した発想
 

 CAP定理は、Consistency, Availability, Partitionsを同時に満たすことができないという有名な定理であるが、中島さんは、「Consistency, Availability, Partitionsは全て満足した上でスケールアウト環境での高性能を出さなければならない」といわれているように、CAP定理を根底から覆すような発想をしておられる。今に始まったことではないが、中島さんは、ある意味無茶苦茶な方である。

さて、スケールアウト構成での最も重要な課題はデータの信頼性、一貫性、即ちConsistencyです。プロセッサー・ベルの技術用語ではCoherenceです。クラウドレベルのレイヤーの議論になると、CAP定理とかBASEだとかの主張の下、ACIDが出来ないならアプリケーションで緩めてもいいじゃん、というようなWS-*(Web Service astar)前夜の議論が当たり前のようになっていますが、ハードウェア・レベルではそれは絶対許されません。そんな事が簡単に許されるならSUNが ROCKチップに失敗してギブアップする苦渋など無いわけです。CAP定理の逆、すなわち Consistency, Availability, Partitionsは全て満足した上でスケールアウト環境での高性能を出さなければならない。それがコンピュータ本来の、HWの基本です。SWとHWの話をゴチャゴチャに論じているように見えるかもしれませんが、ROCKが火を点けたTransactional Memoryの技術はその風景にあります。
 さて、Hot Chips 21でクレームされているPOWER7のこの面での潜在能力、アプローチは中々凄いと思います。確かに Intel Nehalem-EXのQPIによる大幅な性能向上は驚愕です。しかしそれを超えて、POWER7で主張されているPOWER6に対する有効 Compute Throughput 5倍(1.6TB/s)のメッセージは大きい。これはフィールド・アップグレード等の面で、POWER7がPOWER6の足回りを基本的に受け継いだ以上物理的なチップI/Fの性能向上だけでは達成されないターゲットを、eDRAMのオンチップ搭載も含めた数々の技術革新によってクリアしようとしている点でIBMらしい味が感じられます。


 ちなみに、クラウドでは、「ScalableでAvailableで、かつ、Eventually Consistentなシステムは可能である。」というように、Cの部分を緩くすることで、3つをほぼ同時に満たすことを目指している。この命題の実現こそが、現在のエンタープライズ向けのクラウド・システムが目標としているところなのである。
 ところが、中島さんは、Eventually Consistentはナンセンスだとおっしゃっている。Googleを否定するわけではないが、ill-structuredだと。利用者側の対応に任せられてしまうことのデメリットの方が大きいと感じられているようだ。これはもっともなご意見である。

またレプリケーション型のデータ・モデルでデータ整合性を担保するためには、アプリケーション層で 3-Phase Commit 相応の最終的なコミット・コントロールが必須だ、というところでしょうか。プラットフォーム側の厳密さに期待できないという点でill-structured なわけですね。利用者側の対応に任せられてしまうということです。逆にこの ill-structured さがグーグルのスケールを可能にしているわけですから、”角を矯めて牛を殺す”ことがないようにもしなければならない。
 これを”出来ない論議”で終わらせないためにプライベート・クラウドの主張があるわけですが、このアプローチに対しても出来ない論が強くあります。現行のきめ細かにカストマイズされた多様な NFR (Non-Functional Requirement) 構築に対応出来ないというのも大きなクレームです。


 しかし私は疑問を抱かざるを得ない。
 複雑さを考える---Complexity Quanta and Platform Definition
Summary of Jim Waldo‘sKeynote at the 10th Jini Community Meetingでいわんとしていることは、「それぞれの段階を通り抜ける際、我々は、何かを失う」ということ。
 何も失わずにすべてを手に入れることなんて可能なのだろうか。これはとても難しい命題のように思える。
 昨日、"eCloud"というリスティング広告に引っかかって、中島御大のサイトを発見した私であるが、とりあえず見なかったことにしようと思う。
 (リタイヤされた元上司のサイトを半年もたってやっと見つけました。連絡ぐらいくれればいいのに。)

 

マルチ・スレッドへ:我々は、順序を失う(複数のことが同時に起こる)。これは、難しい。なぜなら、我々は、自然には、シーケンシャルに考えるから。
マルチ・プロセスへ:単一のコンテキスト(すなわち、我々が信頼しうる共有コンテキスト)を失う。グローバルな状態が、開発のあらゆるところで利用される。(すべてをスタティックに考えよ)
マルチ・プロセスからマルチ・マシンへ:我々は、状態を失う。「システム」のグローバルな状態というのは、虚構である。興味深い分散システムには、整合的な状態というものは存在しない。(Lamport:http://research. microsoft.com/users/lamport/pubs/pubs.html)分散OSのプロジェクトは、グローバルな状態を導入しようとしたが、大々的に失敗した。
信頼できないマルチ・マシンたちへ:誰を信ずることが出来るか分からない難しい状況の中で、我々は信頼を失う。

しかし、我々は何かを得てきた
Seq to MT: 並列処理
MT to MP: プロセスの分離(安全を与える)
MP to MM: 独立した失敗(何かまずいことが起きても、システムの部分は生きのこる)
MM to MMU: スケール(webスケール、インターネットスケール). 誰か他の人のリソースを利用せよ(あるいは、他の誰かが、我々のリソースを利用することを認めよ)


月曜日, 1月 18, 2010

【Google App Engine】 すごいのはGDriveより全文検索でしょ!? このエントリーを含むはてなブックマーク


Google Docsのオンライン・ファイルストレージ機能

 先日、Google Docsにオンライン・ファイルストレージ機能を追加するという発表があった。画像・動画、ZIPファイルなどあらゆる種類のファイルをGoogle Docsで保管でき、アップロードしたファイルは検索機能や共有フォルダ機能の対象にもなる。アップロードできるファイルのサイズは1つにつきMAX250MB※までだが、全体の容量の制限はなく、1GBまでは無料である。それ以上は追加で購入できる。ストレージの値段は、現時点で20GBが5ドル/年だが、Google Apps Premier Editionユーザーに対しては、1GB=3.50ドル/年で今後数ヶ月以内に提供する計画とのこと。
(※ MAX1Gに変更された。2010/1/28
 Documents List API: Upload any file and more (1/12/2010)

ついにGDrive実現、「Google Docs」に オンラインストレージ機能

全文検索の話

 Documents List APIの一番大きな目玉はなんといっても全文検索APIである。Protocol Guide (v3.0)で「Performing a full text query」が New になっていないところをみると、もともとあった機能のようだが、今回から容量制限がなくなり、XMLやテキストファイルを登録できるようになったことで、やっと実用的になったのではないか。(サンプルプログラムによる検証を参照)
 本題に入る前に、これまでのGAEにおける全文検索の実装方法についてまとめてみる。

 1) DatastoreのPropertyIndexを利用する方法。これは、完全一致か前方一致しかできず、長さもStringの500バイトまでが上限。(Text型だと1MBまで格納できるがIndexを張れない)。使用するStrageの容量は格納するデータサイズの1倍以下。

 2) N-gram検索。これには2つの意味がある。(①と②のb.は区別する)

  ① 転置インデックスのキーの切り出しを、辞書や構文解析に基づくのではなく、単に一定の文字数で切り出した語を入れる方法
     a.ユニグラム = unigram (1文字単位)
     b.バイグラム = bigram (2文字単位)
     c.トリグラム = trigram (3文字単位)

  ② 分かち書きで切り出す方法
     a.形態素解析(いわゆる転置Indexの実装)
     b.N-gram(GoogleやYahooなどが採用している直前の(N-1)個の単語を見て、次の単語を予測するモデル(参考

 SuffixArrayは①のユニグラムと同等のものとなる。漏れはないが、データ量は膨大になる。nが単語のサイズとして、n+(n-1)+・・・+1 = (n+1)*n/2。また、nの最大は500バイトまで。
 ②の形態素解析でよく使われるロジックは、KAKASIや、TinySegmenterなどがある。ちなみに、TinySegmenter Java版の実装はココにある。

 GAEにおいて現実的な実装と思われるものは、①のSuffixArrayと、②のTinySegmenterだろう。①はデータ量が膨大になることと、最大サイズが500バイトまでなので、長い文章には向かない。②は長い文章でも大丈夫だが、分かち書きの精度に問題があって、使い物になるかどうかはよくわからない。
 Google Documents List Data APIの精度は、検証結果からみて②のb.ではないかと思う。とてもよい品質なので、これで十分だと思われるが、漏れが完全になくなるわけではないので、完全性が必要な項目にはSuffixArrayを使うとよいと思う。
 注意点としては、Google Apps Premier Editionユーザーでないと、Documents List APIを使えないこと。ストレージの値段がGAEよりも2倍ほど高くなり、現在はまだストレージを追加購入できない。

サンプルプログラムによる検証

  1. Google Docs Serviceの生成と認証

    DocsService service = new DocsService(appName);
    service.setUserCredentials(user, pass);


  2. Google Docsの全文検索

    URL feedUri = new URL("https://docs.google.com/feeds/default/private/full/");
    DocumentQuery query = new DocumentQuery(feedUri);
    query.setFullTextQuery(word);
    DocumentListFeed feed = service.getFeed(query, DocumentListFeed.class);


  3. ポイント
    • テキスト形式(text/plain)が対象
      • Google Documents List Data APIを使用してアップロードしたmimeType="text/plain"のXMLファイルは検索対象となった。
      • Google DocsのページからアップロードしたXMLファイルは検索対象とならなかった。
      • Google DocsのページからアップロードしたTXTファイルは検索対象となった。
      • Google DocsのページからアップロードしたExcelファイルは検索対象とならなかった。
    • インデックス生成
      • アップロード後、すぐに検索対象となった。
    • 検索ワード
      • 「半茹で冷凍又は・・・」という文字列について
        • 「半茹で」はヒットした。○
        • 「半茹」はヒットしなかった。×
        • 「冷凍」はヒットした。○
        • 「冷凍又」はヒットしなかった。×
        • 「冷凍又は」はヒットした。○
      • 「東京都調布市深大寺東町1-XX-X」という住所文字列について
        • 「調布市」はヒットした。○
        • 「深大寺」はヒットした。○
        • 「深大寺東」はヒットしなかった。×
        • 「東町」はヒットした。○
        • 「東町1」はヒットした。○


XMLファイルをGoogle Docsにアップロードする。

  1. Google Docs Serviceの生成と認証

    DocsService service = new DocsService(appName);
    service.setUserCredentials(user, pass);

    DocumentListEntry uploadedEntry = uploadFile(service, fileName, title);

  2. Google Docsへアップロード

    public DocumentListEntry uploadFile(DocsService service, String filepath, String title)
    throws IOException, ServiceException {
    File file = new File(filepath);
    //String mimeType = DocumentListEntry.MediaType.fromFileName(file.getName()).getMimeType();
    String mimeType = "text/plain";

    DocumentListEntry newDocument = new DocumentListEntry();
    newDocument.setFile(file, mimeType);
    newDocument.setTitle(new PlainTextConstruct(title));

    return service.insert(new URL("https://docs.google.com/feeds/default/private/full/"), newDocument);
    }

    • Googleのサンプルにあった
      String mimeType = DocumentListEntry.MediaType.fromFileName(file.getName()).getMimeType();
      を実行すると
      java.lang.IllegalArgumentException: No enum const class com.google.gdata.data.docs.DocumentListEntry$MediaType.XML
      とエラーが発生する。
    • mimeTypeを"text/xml"に固定で設定すると
      com.google.gdata.util.InvalidEntryException: Content-Type text/xml is not a valid media type.
      アップロード時に上記エラーとなる。
      "application/xml"でも同じくエラー。
    • "text/plain"で正常にアップロードできた。
その他
  • EUC形式のXMLファイルをアップロードしたが、その後ブラウザからダウンロードするとUTF-8形式に変換されていた。
    またXMLの括弧"<"">"が、"<<"">>"に変換されていた。
  • アップロードのURLにパラメータ"?convert=false"を付けると変換なしにアップロードされる。
    ただし、全文検索対象とならない。
    • 登録はconvert=trueで行い、取得についてXMLの括弧"<<"">>"を"<"">"に変換するのが妥当か?


日曜日, 1月 17, 2010

【政治】 現政権に思うこと、それから国家権力の話 このエントリーを含むはてなブックマーク


成長戦略がほしい

 現政権は成長戦略を描けていない。社民連出身の菅さんを筆頭に、労組などを出身母体としている政治家が多いので、どうしても「人に優しく、産業に優しくない」発想になりがちである。人に優しい政策は結構であるが、日本の産業がとても弱っており、財源を含め合理的な策が見い出せないのが問題だと思う。
 人に優しい政策には大きなコストが伴う。それは、例えば、CO2削減は企業が、介護は国民が負担することになる。(介護ビジネスというのは局所的には成り立つが社会全体からみるとコストとなる。私は、麻生さんの失言「老人は働け」の方が、より生産的だと思っている)
 しかし、既に大企業に頼る時代は終わっており、国の税収も少なくなってきている。無駄をなくすとはいっているものの、こういった現状をふまえると、おのずと「人に優しい」政策には限界が見えてくる。 

 日本の大企業は昔ほど元気ではなく、例えば、Panasocic(3.81兆円)とソニー(3.08兆円)を足してもサムスン電子(8.26兆円)より小さい。

時価総額上位ランキング(日本)
時価総額上位ランキング(世界)

 足りないのは成長戦略である。基本はやはり産業の活性化。金融マネーゲームもよくないが、産業を否定するのもよくない。生産的な発想で、価値のあるものを効率よく生み出す努力をすることが重要だと思う。そういう意味では、ITは一つの柱になってしかるべきと思う。
 現政権には具体的な政策を提示して欲しいものである。

政治家の権力は限定的だった

 がらっと変わって、権力の話。 
 こないだ問題になった天皇の政治利用の件もそうだったが、民主党政権になっていろいろオープンに報道されるにつれ、政治家が及ぶ権力はかなり限定的だったんだなということがわかってきた。例えば、小沢さんの「検察の権力と闘う」といった発言はその象徴である。
 しかし、そもそも検察の権力はどこに属しているのだろうという素朴な疑問が沸いてくる。国家権力を立法権・行政権・司法権の三権に分立しているのは、「国家の権力を性質に応じて分け、それぞれを別個の機関に分散させ、各機関に他の機関の越権を抑える権限を与え、相互に監視しあうことにより抑制均衡を図るためである。(Wikipediaより)
 今は民主党が立法と行政の権力を握っているのは皆承知していることだ。実質的には、鳩山さんや小沢さんといった方が最高権力者だと思うが、その彼らたちが闘う国家権力とは一体何者なんだろうか?

小沢氏に「戦って」と首相、資質に疑問符

特捜部を含む検察庁は、行政機構上、法務省の一機関に位置付けられている。その法務省の長である法相は検察当局への指揮権を持つ。実際の指揮権発動には慎重な配慮が必要だろうが、その法相に指示できるのは唯一首相だけだ。


 鳩山さんの言動から推測すると、ご自身の指示ではないようである。ということは、検察は一行政機関ではあるが、自分たちで勝手に判断して動いているということだろうか。それとも、他にいる影の権力者が指示しているのだろうか。もしそうだとすると、責任は誰が取るのだろうか。形式的には行政のトップである鳩山さんの責任になるのだろうが、実際に権力を行使する者の責任はどうなるのだろうか。
 また、土地購入の際には、小沢さんは個人の積み立て金といっているが、検察は企業献金が使われた疑いがあるといっている。これが石川議員逮捕の理由とされているが、こういった情報は新聞やニュースから流れてくるだけで、検察からの説明はいっさいない。少なくとも、小沢さんの主張と検察の見解の違いがあるのだから、検察は根拠についての説明責任があるように思う。
 検察の顔が見えないまま捜査が行われていることに、ちょっと気持ちの悪さを感じてしまう。

また、以下のように、権力闘争と指摘している記事もあり、検察といえども、どういう意図があって動いているのか、国民がしっかり監視していく必要がありそうである。
逮捕前日「理不尽な世界つらい」 石川議員、佐藤優氏に
佐藤氏は外務省在職当時、鈴木宗男衆院議員の側近とされ、鈴木議員に対する一連の捜査の過程で、背任などの罪で起訴され、有罪が確定した。その時の捜査を「国策捜査」と批判した佐藤氏だが、「今回は国策捜査ではなく、民主党と官僚組織の権力闘争だ」と指摘した。

<関連> 鈴木宗男氏「検察正義は間違い」 批判に沸く民主党大会

 検察以外にも、政治家が及ばない権力があるように思う。独断と偏見で思いつくまま列挙するとこんな感じになる。

予算・・財務省
外交(軍事)・・米国
天皇・・宮内庁
情報管理・・マスコミ

 また、昨日も書いたが、日本には世間様という絶対神がある。世間様がいいといえば良く、悪いといえば悪い。本当の意味で民主主義でないかもしれないけれど、世間様には誰も逆らえない。
 戦前、暴走した陸軍は政府の統制下になかったといわれている。検察は軍ではないが、マスコミも同調していた構図は当時と瓜二つだ。
 政治家よりも、検察とマスコミの方が世間様の判断を操作できる立場にあるというのは、結構怖い状態なのかもしれない。権力のシビリアンコントロールは絶対に必要であると思う。

土曜日, 1月 16, 2010

【政治】 グーグル サイバー攻撃に思うこと このエントリーを含むはてなブックマーク


 GMAIL不正侵入問題で攻撃元となったサーバは中国政府関係者のものと同一だったというニュースが流れた。もしこれが本当なら国際社会から中国政府が釈明を求められる可能性があるとのこと。中国政府からの検閲を嫌って中国事業からの撤退も検討しているGoogleの動向にも影響を与えそうだ。
 中国に関しては、これまで経済と政治は別物と見ていたのであるが、今回の一件で、両者は密接に関係していることを十分に認識させられることになった。しかし、1IT企業の対応が国際政治にまで影響を及ぼしたことには驚きである。
 10年前に上海に行ったときには、活気あふれる街の雰囲気とはうらはらに、政治的なリスクを感じ得なかったので、いつかはこういう事件が起こるのではないかとは思っていた
 ただ、言論の自由が保障されないお国の事情があるのもわからないでもない。13億人、55の民族からなる国家体制を維持するには、全体主義でやっていくしかない。急激な民主化はソ連崩壊のときと同じように、地域紛争を勃発させる危険もある。言論の自由、民主化を進めた結果、多くの人血が流れるという事態は避けなければならず、当然、これはその国の政府が責任をもってやっていくことでもある。言論の自由は国の政治体制に影響を与えかねないのだ。
 今回の事件を受けて、岡田外務大臣が、「規制の裁量権はそれぞれの国にある」としながらも、「自由で民主主義の国に生きる我々として、言論の自由は可能な限り保障されるべきだ」と暗に中国を批判した。大臣のように正論を一方的に主張することは簡単だが、それがもたらす結果と責任をふまえ、現実論にもう少し踏み込んでもらいたい気もする。

 中国の全体主義を理解するには、中華思想を理解するのが早道だと思う。中国人が語る中華思想がとても生々しくてわかりやすかった。

 価値観という意味では、日本は欧米型の「個人主義」があり、それから、無意識のうちに世間体や恥の文化に支配されている。無宗教であるが世間様という絶対神には逆らえない。
 でも日本は個人の尊重があるからこそ公害などを乗り越えられたと思うし、世間体や恥があるからこそモラルを高く維持して犯罪発生を防いでいるとも思う。住みやすい環境で安全に暮らしていけるのは、こういった日本独自の文化があるおかげだと思っている。
 上海の大気汚染や、揚子江の水質汚染はとても酷いものだ。今より高収入になったとしても、そこに住もうとは思わない。
 困ったことに、揚子江から流れる栄養塩のせいでエチゼンクラゲの大発生などが東シナ海で起きている。大気汚染が九州の方に流れたために、光化学スモッグ注意報が佐賀県のど田舎で起きている。こういった環境汚染は日本も無関係ではない。
 中国の石炭の火力発電所建設などでは日本企業も支援していたらしいが、高度な脱硫技術をもっているにもかかわらず、現地の法律の基準が甘いとの理由で、わざわざ脱硫装置を外して導入したという話も聞いた。当事者にとってみたら、コストを安く導入できるので、ありがたい話なのかもしれないが、結局は自分たちがそのつけを払うことになると思う。
 たぶん、このあたりのモラルも高くしていかないと、国際社会では説得力がない。これから日本は環境立国でやっていこうと思うならなおさらである。
 一企業であってもGoogleのように強い姿勢で望むべきである。日本の環境基準を押し付けるぐらいの迫力で、政治的な摩擦を恐れず、どんどんやってほしいものだ。

月曜日, 1月 11, 2010

2010抱負 このエントリーを含むはてなブックマーク


福岡の事務所の近くで撮った室見川の写真



今年の動向、ネットのビジネスモデル

 今年は、新しい技術や大きな目玉トピックはないものの、クラウドを使ったサービスが多数登場して、標準的になると予想する。XMLやWebサービスのときも最初そうだったが、ある程度認知されると、それが標準的になり、単に使っただけでは注目を集めることはなくなる。ただ、うまく活用できたところは大きな競争力を得てきたのも事実だ。GoogleやAmazonは、早い段階からWebサービスに関してとても熱心に実装してきたが、それが現在の競争力になっているようにも思える。クラウドも同様に、今後うまく活用していけるところが競争力になっていくと思われる。

 さて、今年もあいかわらず景気はよくはならないと思うが、クラウドはだいぶ認知され一般的にも広く使われるようになってきている。弊社へのGAEに関する案件相談も着実に増えてきている。これまでは、知り合いのツテで請負の仕事をまわしてもらうようなことが多かったが、最近ではホームページを見て直接相談に来られるお客様が出てきた。インターネットから直接相談を受け、提案していた案件が成約できる見通しとなったことは非常に大きい。インターネットだけでビジネスをやりたいとずっと思ってきたので、本当にそれが実現できることがわかって嬉しいかぎりである。このモデルのいい点は、ブローカーのような、人を餌に暴利を貪る悪い連中を排除できるということ、また、大企業に依存してきた下請け体質から脱却できるので不景気でも強い会社になれること。それから、自分の強みや、やりたいと思っている分野(ドメイン)に集中できるという利点の3点である。これまでの下請け業務は、ある意味人材派遣的な要素が大きく、時間をお金に変えることはできても、プロダクトやノウハウが残ることはあまりなかった。GAEなどのクラウド技術に特化することで、やればやるほどプロダクトは進化してノウハウも蓄積する。本当に運用してはじめてわかる問題もあるので、リアルの案件の実績が得られることは本当に大きいと思う。

抱負


 去年は種まきの年で今年は収穫の年。

 今年の前半は何とか案件をリリースさせて、事例という形でお披露目できるようにしたいと思う。今年は泥臭く稼ぎ、消耗しきった体力を養う年にしたい。(もし一緒に開発したいという方がいたら連絡ください。弊社がブローカーとなってお仕事を依頼いたします。www)

 それから、今年の後半は、現在開発中のECもリリースできるようにしたい。理想としているインターネットの小売ビジネスへの第一歩として、それが本当に実現可能なビジネスモデルなのかを検証していきたい。

 技術的な点では、スケーラビリティの追求をテーマに以下をやっていきたい

 1)GAE PDFサービスの大規模対応

 大量のPDFを動的に生成するために、これまでにもReflex iTextを使って試行錯誤しながら実験してきたが、GAEを使うケースではまだ満足いく結果が得られていない。実案件ではAmazon EC2か独自サーバになってしまうのが現状である。今年も引き続き研究していき、何とか実用化させたい。GAEにこだわっている理由は「安い」からで、GAEでもちゃんとスケールすることが確認できたら実案件でも採用していきたい。

 2)GAE 全文検索

 実用的な全文検索サービスを作りたい。SuffixArray方式、分かち書き+転置Indexの2つの方式を採用し、用途に応じて使い分けていきたい。

 3)クライアントを含めた実装パターンの確立

 HTML5のWebStorageと大福帳 非同期モデルを推し進めたデザインで、これを実用レベルにすることを目標にしたい。リッチクライアントのようなWebアプリでありながら、いかにスケーラブルにしていくかが重要。これをやるには、ステートレスなバージョン管理がポイントだと思っている。プロジェクトでも積極的に採用していきたいと思う。

 4)Privateクラウドソリューション

 Privateクラウド、つまり、スケーラブルなシステムを分散KVSで実現させるシステムの需要は伸びてくると思われる。Reflex BDB単体では不十分で、Voldemortなどのミドルウェアを活用することで、具体的に提案できるレベルまで作っていきたい。

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

日曜日, 12月 20, 2009

【クラウドコンピューティング】 2009年振り返りとクラウド事例と記事のまとめ このエントリーを含むはてなブックマーク


今年はクラウドが普及した1年だった

 2009年もあとわずか、ということで、今年一年を振り返ってみたい。まずは年初に書いた「クラウド予想2009」についてから。
 このなかでいえば、「クラウドを利用したWebサービス」は思ったほど出なかった。「Google Appsの一人勝ちだが一般的には広がらない」は、4月にGAE/Jが登場してからは圧倒的だったと思う。(まあ、まだ開発者中心ではあるが)
 予想外だったのは、事例が出てくるのが非常に早かったこと。クラウドが流行るのはまだ先の話で、事例は当分出ないだろうと思っていたので、正直、そのスピード感には驚かされた。私自身、最初にクラウドに衝撃を受けたのが2008年の5月頃(※)だったので、それからまだ2年も経っていないことを考えると、本当にもの凄い広がり方であった。どれくらい凄かったか、以下の事例を見ていただくとよくわかるだろう。

(※ 私はこの記事を見て、Reflex iTextをクラウドに載せようと決心した。また、そのことを「究極のWebサービス。やられた感いっぱい ><。」 という記事に書いた。そして、公にクラウドという言葉を使い出したのが、「バーチャルテクノロジーは第二ステージへ」の記事を書いた同年8月頃だ。でもこの頃はまだ世間で通用する言葉でなかったのをよく覚えている。)
 
多くのクラウド事例が登場した

 クラウド事例の代名詞的になった「エコポイントシステム」は、安く早く作れることを実証した事例となった。また、100万PVをこなすmixiアプリモバイルコンテンツやモバツイッターは、スケーラビリティの凄さを見せつけた。海外では、BuddyPoke!やPixverseなどが出てきた。
 他のGoogle App Engineの事例では、プログラム申込予約システムや会員管理タスクマネージメントシステムや、ECまでもある。
 GAE以外の事例では、AzureのWebアルバムサービスなんてのがある。
 Google App Engineには、セキュリティに懸念があり、また、月平均に1~2回の定期メンテナンスがあって可用性も低い。過去に大きなトラブル「Google App Engineにデータストアの障害発生。復帰まで約6時間、原因は現在も不明」も引き起こしている。実運用に耐えうる可用性や信頼性を確保するにはまだまだ時間がかかりそうという印象をもっている。なので、実際の受注システムや会員管理などは時期尚早と思われたが、意外と多くの事例が出てきている印象がある。
 あと面白いのが、R-SPICE。これは、Salesforce.comとGAEを組み合わせたアプリケーション。この事例のように、ChartAPIや他のGDataAPIをWebサービスをマッシュアップして利用するパターンが今後増えてくると思われる。WebサービスはAtomやRESTといった単なるAPIとして使うことを前提とされており、汎用性が高く、クラウドのスケーラビリティ、使いたいときに必要なだけ使えるというユーティリティ性をいかんなく発揮できるのが特長だ。GAEのWebサービス事例としては、画像変換サービス や、弊社のReflex iTextサービスなどがある。GDataAPIのなかでは、個人的には、PicasaやGoogle Analitics APIに大きな可能性を感じている。欲を言えば、大量のテキストを格納できるストレージサービスと全文検索サービスを今後提供してほしいところ。全文検索はPicasaの説明文に文字を格納することで一応可能だが、最大1024文字であることと、写真付きでなければならないのが痛い。また、大量に保存する場合、GMAIL/PICASA並の料金にまで下げて欲しいところである。非常に安く提供できるという点はクラウドにとって最も重要なところである。
 これらクラウドサービスを提供し始めている企業は、大手ITベンダーというよりはむしろ中小ソフトウェア開発会社の方が多いという傾向があるように思う。弊社もそうだが、前述した写真サービス変換は有限会社アルコルさん。先日サービスされた、雨の日メールのplusvisonさんなどが事例を発表している。数人規模の有限会社でもサービスを提供できる点がGAEの凄いところで、それを可能にしているのがPublicクラウドのインフラ技術。私たちが実際に利用しているデータセンターはGoogleであり、胸を張って大手と張り合えるだけのインフラがあるといえるのが強みである。

不景気だからこそクラウド

 昨年の夏、景気が悪くなるからこそクラウドという記事を書いた。9・15に起きる、リーマンショックの約1ヶ月前のことで、まだ景気は悪くなっていなかった時期のことである。今は不景気の話でもちきりだが、当時は周りに話しても( ゚Д゚)ハァ? みたいな感じで、特に興味をもたれなかったのを覚えている。だが正直、言った本人もこれほど悪くなるとは思っていなかったので、全然説得力がなかったかなとも思う。
 いざ大不況になると、大変な変化が起きていることが、実感として感じざるを得ないようになってくる。IT業界でも単価の下落だけにとどまらず、案件そのものが無いという現実を経験した。かねてから下請けに未来は無いとは思っていて、クラウドビジネスへの転換は必然と考えてはいたが、これほど早い時期に不況が訪れて、急転換を迫られるなんて思いもしなかった。
 だが、お客様企業においても、不況に対応するために、大きな変化が要求されているのも事実である。
 いくつか相談をいただいたなかで多いのはコスト削減が一番であった。企業にとってITコスト削減要求が大きくなってきている現状をみると、部分的な利用に限っては、意外と早い時期にクラウド利用が進むのではないかとも思えてきた。
 というのは、削減目標が1/10とか、企業の管理者の間で飛び交っている話は、もはや、これまでのアーキテクチャーではとても成し遂げられないような無茶なレベルで要求されており、それを踏まえたうえで、私たちへの依頼についても、「常識にとらわれない提案をしてほしい」と、案にクラウドを期待するものも多くなってきているのもあった。これは、昨今のクラウドブームが背景にあるのも大きい。しかし、お客様自身に、現状のコストを抜本的に抑えられないアーキテクチャーのままではいけないという認識が大きくなっているのも事実であった。おそらく、この大不況がなければ、ここまで切羽詰った状態にならなかったのではないかと思う。これが原動力となって、エンタープライズへの移行シナリオにあるように、段階を得ながらクラウドに移行していく企業も出てくるかもしれない。さらには、ビジネスを変える8つの方法にあるように、ビジネスを変革できる付加価値も出てくるとなれば、当然、期待も大きくなっていくだろう。そう考えていくと、大不況は私たちにとって追い風であり、苦しいけれども、ITイノベーションを発展させていくうえで、必要な過程であると納得せざるを得ない。
 しかし、一方で「自治体クラウド」といったような、ITイノベーションに逆行する酷いものもある。3割~4割カットなんてお手盛りミエミエの自治体クラウドは、ビジネス的にも技術的にもクラウドとは全く関係ない世界であり、霞ヶ関と大手ITベンダーによる「雲の上」の茶番劇にすぎない。これは税金を使った大手ITベンダーの延命策にすぎず、ITイノベーション発展には何の寄与もしない。こんなことやっていると、せっかくお客様に芽生えたクラウド化への意識や原動力を削ぐことにもなりかねない。そして、税金が尽きたころには日本はクラウド技術で取り残され、世界に無残な姿を晒すことになるだろう。ああ、いっそのこと予算なんて付かなきゃいいのにとさえ思う。

クラウドの定義とエンタープライズへの移行シナリオ

 クラウドが普及してバズワード化してくるなかでミソクソになる、というのは年初の私の予想通りであった(弱者連合とスケーラビリティ、最近では、CBoCプライベートクラウド スタートアップキットなんてのも出てきた)
 ここでひとまず、モヤモヤしているクラウドの定義について、あらためて過去の記事を列挙することで、整理したいと思う。

 クラウドは言われだした当時から定義がモヤモヤしていたことは事実で、クラウドを15の否定で表現なんてのがあった。
 私が考えるクラウドとは、クラウドの本質と動向に書いたとおり、Scale outするシステムのことであり、抽象的に定義されたデータベースサービスへのアクセス手段を提供するものである。これは、昨年10月に書いたものなのでちょっと古いと感じるかもしれないが、今のところ私の定義は変わっていない。付け加えていうなら、クラウドは、Webサービスによる疎結合アーキテクチャーを基本としていることが特徴である。(ちなみに、弊社のReflexは、 RESTfulな新3層アーキテクチャ)にあるように、疎結合を基本に考えているので、クラウドに馴染みやすいという特徴をもつ。)
 大きく分けて、PublicクラウドとPrivateクラウドがあるが、どちらもScale outするという基本的なアーキテクチャーは同じである。Privateクラウドは、エンタープライズシステムのクラウド移行にあるように、コモディティサーバとオープンソースを基本とする分散KVSの基幹システムへの適用である。下図の価格シミュレーションは単純にHW価格だけを比較したものだが、1/4から1/3のコストダウンを図れる計算になる。


また、下図のサーバインフラの変遷にあるように、突き詰めれば複数のCPUが疎結合で連携するような処理を、1チップのなかで実現することを可能にする。Scale outアーキテクチャーが1Chipにまで応用可能であるということは、クラウドがイノベーションである証拠といえよう。(参考:流行りのクラウドは48コア・プロセッサで?



エンタープライズへの移行シナリオは、M先生にいわせると楽観的である。これに関連する話で、タイムリーに以下の投稿がMLにあった。


アマゾンのOです。
初めて投稿致します。
技術系の話題でなくて恐縮なのですが。。。

今週1週間、本社(シアトル)のほうに来ておりまして、いろいろ
情報を仕入れているのですが、個人的に驚いたのがこちらでは
大手企業でのクラウド利用状況が思いのほか進んでいることです。

本社営業チームの2010年向けの案件レビューに参加する機会が
あったのですが、大手どころに毎月かなりの金額でご利用
いただいていることが分かり、またその規模も急速に伸び
ているのがわかり、ちょっと驚きました。
で、Enterpriseでのクラウドビジネスは(もちろんスポット
利用も広告、メディア業界には多いのですが)保守ビジネスと
同じようなストックビジネスなので、毎年売上が積み上がって
いく感じなんですね。

頭では理解していたつもりなのですが、実際に営業報告のグラフ
等で見ると、改めてこのビジネスの伸び、将来性がわかった気
がしました。

こうしたトレンドは近いうちに日本でも見られるようになると
思うとなんだか楽しみな気がしてきました。
皆様にもこのワクワク感をお知らせしたく、シアトルからメール
している次第です。

機会があれば、こうしたビジネスでの広がりについても
研究会でお話ができればと思います。

それでは。


Publicクラウドの特徴と覇権争い

 一方、Publicクラウドは、 格安ストレージを利用するのなかで説明した図のように、べらぼうに安いのが特長である。運用コストも含めて、とにかく安くできるというのがウリで、逆にそれ以外のメリットはあまりないかもしれない。例えば、可用性は低くなり、セキュリティやベンダーロックインといったリスクは大きくなる。Scale Outアーキテクチャーを重視するなら、RDBをクラウドに載せるべきかという記事で書いたように、RDBというアーキテクチャーを諦めなければならないケースもある。柔軟に考えているAzureはRDBを採用することも可能だがこの場合はスケールしない。
 繰り返しになるがPublicクラウドの最大のメリットは低いコストである。GoogleやAmazonがこれを可能にしているのは、大規模なデータセンタをもっているスケールメリットや、コンテナ型で電気代などを含む徹底した管理コストの削減を図っていることもあるが、本業で使っている余剰インフラを提供している面も大きいのではないかと思う。(Googleは検索エンジン、AmazonはEC) そう考えると、弱者連合は太刀打ちできないだろう。
 特に、Googleの強さが際立つのであるが、ChromeOSと世界の対立軸で述べたように、IBM vs Google というよりは、MS vs Googleといった色合いが濃いと思う。企業向けという意味ではAzure(※)もかなり善戦しそうである。
 (※)大規模コンテナ型データセンターを構築している。参考 日経BPの中田さんによるAzure IT PACの写真

 ただ現時点でのGoogleは、失敗しないことがよいことかでも述べたように、イノベーションリーダであることは間違いないだろう。



Publicクラウドのpros cons

 パブリッククラウドとビジネスモデルで述べたように、Publicクラウドはセキュリティや信頼性がトレードオフになる分、安くなければ意味がない。
 また、Scaleするかどうか、それが問題である。
 Publicクラウドにおいては、セキュリティは最後の難問題であり、クラウドに企業情報や個人情報に近い情報を蓄積するにはセキュリティ面で不安が残るのは当然である。そもそも、クラウドにおいても企業内同様のレベルで守られて当然と考えるには無理がある。それは、内部規定で関係各所のPマークの取得やIPS構成の報告が定められている場合など、企業内データを外に出して保管すること自体、セキュリティポリシーとして禁じられているからだ。これを回避するには規定そのものを改正する必要がある。
 前述したが、現時点におけるPublicクラウドの可用性はまだ低いといわざるを得ない。オンスケジュールとはいえ、平均2回/月の停止は回数が多いと感じる。
 また、技術的に冒険的要素が強く、コスト面のメリットを勘案しても慎重にならざるを得ないと考えているお客様も多いだろう。特に、開発や運用における技術的ハードルが上がる点で不安が大きいと感じているようである。ただ、これに関しては、事例が増えて開発運用ノウハウが蓄積されていくことで解消されていくだろうと楽観している。

 クラウドには向き不向きがあり、業務アプリによってはむしろ自前でやった方がいいのも多い。クラウドでやるか、自前でやるかの判断は、最終的にはリスクを取られるお客様の判断になるという点は強調すべきである。最近ではクラウドのメリットばかり強調され、これらデメリットについて深く考えることは少ないのだが、むしろお客様にはデメリットを正直に説明することで、正しく理解していただくことが重要である。

 前述した事例のように、それでもクラウドに向いている業務アプリは多くある。それらをうまく拾っていきながら私たちはビジネスを広げていければいいと思う。

クラウドをどうやってビジネスにしていくか

 エンタープライズの移行シナリオでは利用する企業の視点で述べたが、最後に、私たちクラウドサービスを提供する側のビジネスについて述べたいと思う。

 クラウドで商売をやるには、もっと根本的にやり方を変えていかなければならないと感じている。従来は、偽装請負のススメで説明されているような発想が基本だったが、ビジネスモデルが変わるのだから、単にGAEで請負をやるという考え方ではなく、パッケージ販売のような小売業に近いビジネスへの転換が必要だと思う。
 以前、Publicクラウドはサブスクリプションモデルがいいという記事で、GAEやAmazonEC2などのpublicクラウドは、大企業から請負で開発するというビジネスモデルより、コンシューマをターゲットに小売的な商売を行って、使ってもらってナンボといった感じのビジネスモデル方が合うような気がしていると述べた。たぶん、これぐらいの大きな発想の転換は必要で、GAEを使ったアプリの開発を請負ってもいいけれど、作ったものを収めるというよりは、利用してもらって料金を徴収するといったモデルに少しでも近づけていくのがいいのではないか。Publicクラウドというすばらしい環境があるのだから、やってやれないことはない。

 ポイントは、顧客の欲しい“最終製品” を迅速に提供していくこと。

 5年後のIT市場でいったように、「ソリューション提供とかシステム構築などの業界用語は死語になる。顧客の欲しい“最終製品” がクラウドから出荷されるからだ」という話には非常に説得力があると思う。

 ただ、“最終製品”を売っていくには、相当のクオリティが求められるということも付け加えておく。小売に共通していえることは、クオリティの高いものでなければ、生き抜いていけないということ。クラウドに言い換えるとパフォーマンスやスケーラビリティ、あるいは、安くて短納期といった要素が重要になってくるだろう。Sales Forceの事例は、そのあたりのアピールが非常にうまいと感じている。要はカスタム化することで、様々な要求に迅速に対応できることをいっているのだと思うが、同じことをGAEでもやれることを示していけばよい。

 高いクオリティのものを安く売る秘訣については、小売の盟主ユニクロに学ぶことも多いと思う。例えば、UNIQLOCKのようなBlogパーツは、なかなか思いつかない。
 私自身、暮らしのデザインという小売を経験して、それが企業相手の商売とは全く異なるものだということだけは少しわかったつもりでいる。

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