2012年7月20日金曜日

A/BテストツールのOptimizelyを使ってみた


Optimizelyは、ウェブサイトのA/Bテストを行うための洗練されたソフトウェアです。

A/Bテストとは、ダイレクトマーケティングでは昔から使われてきた手法で、顧客に対して2種類のダイレクトメールなどを行って、反応が良いものを選び出す、実験の手法です。

これによって、マーケティングのような感覚的な分野においても、データをもとに改善を積み重ねる経営を行うことができるようになります。

最近では、ウェブサイトにおいても顧客にN通りのパターンを見せて、どれが購買に結びつくかなどのA/Bテストを行うことが増えてきました。

A/Bテストツールには色々なものがあり、Google Analyticsなど無料のものもあります。

その中で、Optimizelyは有料ですが、使いやすさに特化されており、話題を集めています。

Optimizelyを使ってA/Bテストを行う場合、HTMLエディタを使ってWYSIWYGで変更内容を編集する方法と、Javascriptを自力で書く方法があります。

静的コンテンツであれば、HTMLエディタで簡単に編集することができますので、プログラマ不要でA/Bテストを行うことができます。

動的コンテンツは、自力で変更案を適用するJavascriptを書かなければなりません。それでも結果測定、集計や統計検証などは自動で行ってくれ、美しいグラフも書いてくれるので、それなりに役に立ちます。

実際に弊社でもちょっとした文字の変更などを試してみたのですが、クリック率の0.7%改善という結果が得られました。しかし、もっと大幅な改善を期待する場合には、変更案を考えるのがなかなか大変だなー、と思いました。

円高の昨今ですから、月79ドルの利用料は高いものではありませんが、月間20,000ページビューを超えると1,000ページビューあたり7ドルという高額の追加料金を取られるので、それは結構問題です。

Google Analyticsなら無料で使えますから、そちらの機能で満足できる人は、あえてOptimizelyを使うまでもないでしょうね。でもたぶんGoogle Analyticsのウェブテスト機能では物足りないし、サポートも足りないので使い物にならないと思いますけど。

今の時代、A/Bテストを使ってウェブサイト反応率を改善していくのは常識になりつつあります。われわれウェブ業界人はA/Bテストツールの一つや二つは使えるようになっておく必要があるのではないでしょうか。

2012年7月12日木曜日

Amazon DynamoDBがウェブのインフラを塗り替える

Amazon Web Services (AWS)は、すごい勢いで機能を増やしており、いわゆるクラウド業界の中で圧倒的な存在感を示しています。AWS = クラウドと言っても過言では無いでしょう。

AWSは、他のレンタルサーバーやホスティングと比べたり、自社でデータセンターを借りるのに比べると、だいぶ割高な設定になっています。しかし、その機能は他のサービスを圧倒しています。

AWSがすごいのは、分散ストレージであるS3などの分散システムを管理不要で提供していることです。

分散システムには、耐障害性、性能(スケーラビリティ)などの点で大きなメリットがありますが、実際に分散システムを管理運用するのはとても面倒で煩雑な作業になります。弊社でも分散ストレージを自社開発運用していますが、かなりややこしく、可能な限りやりたくない作業です・・・

とくに分散システムのソフトウェア開発者と、分散システムの管理運用者が異なる場合には、ハードウェアとの相性や、ソフトウェアの細かい癖、ソフトウェアのバグなどを克服してうまく分散システムを運用するのは至難の業となります。

そのため、弊社では、わざわざ自前で分散ストレージのソフトウェアを自社開発しています。機能が少ない簡易的な自社製品の方が、機能が多くて挙動が完全に把握できない他人の作品よりもマシだからです。

その点で、自前でソフトウェアを開発し、サービスを自前で運用しているAmazon Web Servicesは、分散システムの理想型と言えます。これができる企業は、世界でも多くはないでしょう。

Amazonのさらなる強みは、Salesforceのようなエンタープライズ業界の企業と違って、ずっとセンスの良いAPIや使い勝手の良いUIや分かりやすいドキュメントを提供していることです。


さて、本題に移ります。

先日登場したAmazon DynamoDB (分散NoSQLデータベース)には私も強い興味を抱いており、このたびAmazonが開催したDynamoDBセミナーに参加してきました。そこから得たDynamoDBの情報と印象をお伝えしたいと思います。

私はMongoDBなどの既存のNoSQLには極めて懐疑的な見方をしていました。先述のように、分散システムを運用し、期待通りの性能を安定してたたき出すにはかなりの苦労が伴います。それを考えると、どうしても極めて高いスケーラビリティの必要なソーシャルゲーム業界など以外では有用性はないだろうと考えていました。

しかしDynamoDBは違います。テーブルを作成し、必要なスループット(毎秒の読み書き数)を設定するだけで、勝手に分散データベースを自動で作成・運用してくれます。スループットはリアルタイムに変化させることも可能です。これなら何の苦労もなく分散データベースを運用することができます。

DynamoDBの特徴は、極めて簡単な運用、驚愕のスケーラビリティ(高い書き込みスループット)、高可用性の3つです。スケーラビリティは驚くほどで、最高で、秒間200万リクエストの実績があるそうです。データは自動的にリージョン内の3つのデータセンターにレプリケーションされ、高い可用性を誇ります。

DynamoDBの弱点は、現時点では機能がめちゃくちゃ限られていることです。複雑なクエリはもちろんのこと、テーブルにプライマリキー以外のインデックスを貼ったり、バックアップを取ったりする機能すら標準では備わっていません。なんとデータ型も、整数と文字列とそれらの集合の4種類しかありません。

複雑なクエリを実行したり、バックアップを取ったりするためには、Elastic Map Reduce (Hadoop)を利用して、Hiveというクエリマネージャを使ってクエリを実行する必要があります。これははっきりいってややこしいです。

しかしワークショップに参加して、実際にコーディングをして使ってみて思ったのは、実際には意外と色んな用途に使いやすいかもしれないということです。

EC2から同リージョンのDynamoDBにアクセスする場合、レイテンシは極めて短く、データも高速に転送されます。そのため、誇張気味に言うと、ローカルにあるファイルのような感覚で扱うことができます。これなら、小規模システムの場合は、インデックスなど使わずとも、フルスキャンを多用しちゃってもいいのかな、と思いました。

かなり曲者で使いこなしが難しい印象のDynamoDBですが、既にかなり導入実績があり、どんどん売上が伸びているそうです。ソーシャルゲームなどの業界にとっては福音と言えるのでしょう。

将来的に、二次インデックスがサポートされ、データ型もいろいろと実装されてきて、複雑なクエリをうまく実行できるライブラリなどがでると、ソーシャルゲーム業界に限らず、一般のシステムも一部はこれで置き換えられていくのではないかなと思います。RDBMSの運用はいささか面倒ですからね。

EC2, S3, DynamoDB, Cloudfrontの登場によって、スケーラビリティや高可用性を実現するということはお金さえ払えば誰にでもできる仕事になってしまったな、という印象です。

弊社としても、今後はAWSの使いこなしに力を入れていこうと考える次第です。


ところで、Amazonワークショップ内で、2時間で「並列的にニコニコ動画のタグをクロールして集計するスクリプト」を書いたので、おまけとして以下に乗せておきます。DynamoDBの並列性を確保する機能であるConditional PutとAtomic Counterを活用することで、簡潔に並列集計を実現しています。

require 'uri'
require 'net/http'
require 'kconv'
require 'rexml/document'
require 'rubygems'
require 'aws-sdk'

AWS.config({
  :access_key_id => "",
  :secret_access_key => ""
})

dynamo_db = AWS::DynamoDB.new(:dynamo_db_endpoint => "dynamodb.ap-northeast-1.amazonaws.com")
videos = dynamo_db.tables["nicovideo_videos"]
videos.load_schema
tags = dynamo_db.tables["nicovideo_tags"]
tags.load_schema

# タグ収集、カウント

loop {
  vid = (rand * 17392999).to_i
  video_id = "sm#{vid}"

  puts video_id
  begin
    url = URI.parse("http://ext.nicovideo.jp/api/getthumbinfo/#{video_id}")
    http = Net::HTTP.new(url.host, url.port)
    result = http.get(url.path)

    xml = REXML::Document.new(result.body)

    next unless xml.elements['//title']

    title = xml.elements['//title'].text
    puts title
    videos.items.put({"video_id" => video_id, "title" => title},{:unless_exists => "video_id"})

    xml.elements.each('//tag') { |tag|
      tag_name = tag.text
      puts tag_name
      t = tags.items.put({"tag_name" => tag_name, "count" => 1}, {:unless_exists => "tag_name"}) rescue nil
      unless t
        t = tags.items.at(tag_name)
        t.attributes.add({"count" => 1})
      end
    }
    puts "\n\n"
  rescue Exception => e
    p e
  end
}

# 集計

rank = {}

tags.items.select { |tag|
  count = tag.attributes['count'].to_i
  tag_name = tag.attributes['tag_name']
#  puts "#{count}: #{tag_name}"
  rank[count] ||= []
  rank[count] << tag_name
}

rank.keys.sort[-10..-1].reverse.each_with_index { |count, i|
  puts "#{count}件: #{rank[count]}"
}

2012年6月25日月曜日

ファーストサーバの事故から考えること

つい先日、ファーストサーバというホスティング企業が多数の顧客の全データを喪失するという前代未聞の事故が起こりました。

twitterやfacebookでは技術者や弁護士など、様々な方々が色んな観点からの議論を始めています。

私としても、今回の事故から得られた教訓と、弊社でのデータ保全の取り組みについてお話ししたいと思います。


大規模障害の概要と原因について(中間報告) ファーストサーバ サポートWEB

こちらに中間報告があがっていますが、オペレーションミスによりサーバの削除タスクをバックアップ環境を含めた全サーバに対して適応してしまったという前代未聞の事故です。

動的にサーバのプロビジョニング(構成管理)を行う場合には、バグやオペミスによりデータを誤って消してしまうということは考えられますので、その点では作業手順やプログラムの安全品質については厳重な管理が必要と考えられます。

本質的な原因としては、このファーストサーバでは、ある時間の静的なバックアップ(スナップショット)を保存しておらず、そのために本番環境でのオペミスがバックアップまで波及してしまったということが言えます。

ホスティング企業では、膨大な顧客データを保持しており、銀行などのシステムに比べれば圧倒的に割安な価格でストレージ環境を顧客に提供していると考えられます。そのため、膨大なデータのスナップショットを取得するようなストレージ環境が用意できなかったことは原因の一つかと考えられます。

きしだなおきさんとも話したのですが、致命的ミスと言えるのは、待機系(スタンバイ)サーバと、バックアップを混同してしまっていたことだと考えられます。

待機系サーバというのは、あるサーバが故障で動かなくなったさいに代わりに立ち上げるサーバであり、そのデータは常に本番環境と同じデータを保持している必要があります。そのため、本番環境で行われたオペミスなどは待機系サーバにも波及してしまいます。

それに対し、バックアップというのは、基本的には「ある時点のデータ」を保存して、オペミスを含むデータ損失事故を防ぐというものです。

これはIT技術者にとって基本的知識だと思われますが、その点の配慮が無かったことが最大の敗因でしょう。


弊社では、データベースは毎日スナップショットを取得しており、データベース以外のファイルについてはバックアップでの上書きや物理削除を禁止する運用によって、データ損失事故を防ぐという思想で運用しております。

この思想により、今回のようなオペミス一回でデータ損失という事態は発生しないようになっております。

また、常時スタンバイサーバへのデータベースのレプリケーション(複製)を行っており、サーバ故障時には、バックアップ時点から更新されたデータについてもデータ損失を防ぐようになっております。

今回の事故の報に接し、大変に身の引き締まる思いであり、弊社としても、より一層のデータ保全への取り組みや投資を強化して行く所存です。

追記:

向井さんの見解として、まさかデータを消すような操作とは思わないから一気に全部のサーバに更新を適用しちゃったんじゃないの? という見解がありました。そうなってくると昔ながらのテープバックアップなども再導入を検討するべきなのかもしれませんね。テープドライブが急に売れ出すという事態があるかもしれません。

再追記:

ちなみに私はファーストサーバ社を批難する意図でこの記事を書いているわけではありません。どんなシステムも100%のデータ保全性を保証することはできません。スナップショットを取る、テープにバックアップする、といったことはコストに大きく跳ね返ってくる選択肢です。

ファーストサーバ社がどれだけのデータ保全性を謳っていたのか分かりませんが、Amazon EC2であればAmazon EBSのデータは保全性が低いことが前提であり、顧客の判断でAmazon S3にスナップショットを取ることになっています。もちろん、そのスナップショットの保存は有料です。Amazon S3では低保全性モードでは、料金が安くなります。

サービス提供企業にとってデータ保全は事業継続性の上で非常に重要な問題ですが、利用者としてもホスティングというサービスが必ずしも高いデータ保全を目的として運用されるものではないこと、自社のデータについて最終的に責任を負えるのは自社しかいないことは考慮すべきであると思います。

2012年6月23日土曜日

メイシーにSalesforce連携機能がつきました!

弊社の超簡単名刺管理サービス「メイシー」にSalesforceとの連携機能がつきました。

ワンクリックでSalesforceに名刺データをインポートすることが可能です。

Salesforceを活用するのに、いちいち顧客情報を入力するのは面倒であり、営業社員の貴重な時間をとるのは無駄ですよね。そのために名刺入力コストの安いメイシーをぜひご活用ください。

引き合いが多ければ、取り込んだ名刺の自動でのインポート機能なども開発していきますので、ぜひ弊社営業担当までお気軽にお問い合わせください!

メイシーは、名刺をスキャンしたり、名刺を宅急便で送るだけで、人間のチェックを経てデータベース化して、オンラインで利用できるようになるという弊社の名刺管理ツールです!

ぜひこの機会にご利用くださいませ。

2012年6月18日月曜日

起業という幻想 - アメリカンドリームの現実

この本は、平均的な起業家は、いかに華やかなものとはかけ離れており、泥臭い敗残者達であるかを描き出した本です。

起業家の多くは、転職を繰り返し、そのあげくに失業し、小さな会社を立ち上げて自営業とはなるものの、その会社も永遠に成長することがなく、ほとんどが自分一人だけの事業のまま終わる。という起業の現実を描き出しています。

本書では、起業というものは基本的に、仕事の無い人が、なんとか仕事を作り出そうとする試みであり、仕事が無いところ(田舎や発展途上国)でこそ起こるということを示しています。そうした人々はサービス業や建設業など自分の働いていた業界において、少ない資本で起業します。そして、その結果はあまり芳しくなく、大企業で働くよりも少ない成果しかもたらしません。


本書の問題点は、全編が「既存の○○という考え方は間違っている」という形で記述されており、むやみに既存の「幻想」なるものを攻撃するばかりの書き方である点です。少なくとも日本においては、起業なるものにそんな素晴らしい幻想を抱いている人は滅多にいないと思うので、著者の攻撃的な姿勢には鼻白むばかりです。

また著者はしばしば統計的事実をむやみに一般化して全てのケースに適用しようとしています。

さらに最も大きな問題は、意図的に「ベンチャー起業家」と「自営業者」を混同し、ベンチャー起業家への期待を自営業者の低パフォーマンスという証拠で否定するというミスリーディングな論調です。この本で述べていることは「自営業者」に関することばかりであり、ベンチャー論はほとんどありません。


それでも、本書はいくつかの重大な示唆を与えてくれます。

まず一つは、転職を繰り返したりしたあげく、あてもないのに起業するのは極めて危険だということです。無能な人が無能であるがゆえに起業するというのは、(当たり前ですが)危険です。自分の貯金を投じて、低い収入に甘んじたあげく、倒産して最後に残るのは借金だけという結果に終わります。若いうちならともかく、年を取ってそういうことをするのは、まさに致命的かもしれません。

日本における常識人の認識としては、起業家とは無職の一類型であるというものですが、まあ、それは当たらずとも遠からずなのでしょう。

もう一つは、もし起業するなら「起業に適した産業を選ぶ」「チームで起業する」「株式会社を作る」「ビジネスプランを策定する」「資本を多く調達する」「頑張って事業を長く存続させる」「大学院を出てから起業する」などをすることで成功の確率を高めることができるということです。スタンフォード大学院を出て、シリコンバレーでベンチャーキャピタルから投資を受けてITスタートアップを立ち上げるほうが、どっかの田舎町で美容院や建設業を立ち上げるよりも良いということです。

また、この本を読むことを通じて、自営業者とベンチャー企業の違いを感じとることが出来ます。


私のように無能な起業家の一員としては、こうした本を読むのは本当に不愉快極まりない体験なのですが、これから起業しようとする人は読んでおいても良い一冊です。

たいして優れた本では無いので、起業と関係の無い人はわざわざ読む必要はないでしょう。


ところで、本書の著者は、零細起業家はろくでもない無職もどきなので補助金などを投じるべきではないと言っています。

その意見について、私は半分賛成でもあり、半分反対でもあります。

既に職がある人に補助金を与えて起業させる試みは危険であると思います。起業とは失敗することが大半なのですから、わざわざ有職者を道に迷わせる必要はありません。

しかし世の中には私を含め、既存の社会や会社には適応できず、自営業として何とか生き延びている零細・弱者が大勢居ます。そうした人の存在を無視するべきではないとも思います。

たとえばコンサルタントの栢野克己氏などは「弱者」「零細」「社長」「人生逆転」に特化したコンサルティング・講演などを専門にされています。

現実の多くの起業は泥臭いものなのですから、TechCrunchのような華やかなストーリーよりも、栢野克己、竹田陽一神田昌典などのような弱者向けの本こそが多くの人の役に立つのだと思います。

ま、補助金がそうした弱者救済の役に立つかどうかはさておき、社会には華やかな成功者だけでなく、底辺で泥水をすすって生きている大勢の人がいるのだ、ということを忘れないでもらいたいものです。

「起業という幻想」の著者が、そのような弱者たちの苦闘を小馬鹿にする姿勢でなければ、もっとずっと良い本が書けたと思うのですが・・・

「出馬してみた」の時代へ

私は、先日行われた第二回ニコニコ学会βにて、セッション「イノベーションと社会規範」の座長を務めました。

当セッションではWinny事件の最高裁での無罪判決を受けて、Winny開発者の金子勇さま、メタ・アソシエイツ代表の高間剛典さま、法学者で法政大学准教授の白田秀彰さま、経済学者で駒澤大学准教授の飯田泰之さまをお招きしてパネルディスカッションを行いました。

セッションの内容についてはCNET Japanの記事「悪い面だけ注目してもろくなことがない--Winny事件から見た社会規範」が良くまとめられていますので、こちらをご参照ください。

セッションでは、過度に批判的な「世論」が社会を抑圧的にしている問題点としてあげられました。その対応策としては、もっと個人が気軽に政治参加をしてみることが一つの方策としてあげられました。


白田氏が提案されたのは「出馬してみた」です。

いまの公職選挙ではネット上での選挙運動など、様々な選挙運動の方法が禁止されています。また供託金の金額も高いために気軽に立候補することができなくなっています。そこでネット上で仮想の出馬をして、実際の選挙と同じ時間軸で選挙戦を戦い、どれくらい得票できるかやってみるという方法です。

政治上でも消費者参加型コンテンツが増えて行くことは面白いかもしれません。「政策議論のプラットフォーム」などと大上段に構えると疲れてしまいますが、「出馬してみた」が簡単にできてしまうプラットフォームなら面白く参加できるかもしれませんね。やりっぱなし、言いっ放しでいいんじゃないかと思います。極端に他人を不快にさせるような人が登場した場合、どのように規制するかという問題はありますが、まあ、突っ込みどころ満載の偏った場所になってしまっても、それはそれで一つの結果です。


私としても、色々な政治運動、社会活動をみなが気軽にやっていくことが社会をよくしていくと考えます。

Winny事件ではウェブサイトと寄付金口座を作るだけという「支援してみた」程度の支援で1500万円を集めて最高裁での勝利に結びつけることができました。

また医薬品ネット販売規制でも、一中小企業であるケンコーコムが高裁において勝利を得ました。

著作権法改正での「ダウンロード犯罪化」については津田大介氏らMiauの面々が議員に働きかけて、議論無しで国会に提出されるという最悪の事態を防ごうとしました。残念ながら今回は負けてしまいましたが、津田氏らの動きには、議員たちから一定の反応が得られています。

日本では一個人の力は無力であるかのようなことを言う人が多くいますが、実際にはこれだけ多くのことがなしとげられているのです。一人一人が声を上げて動くことが、これからの日本には大切だろうと思います。ぜひ皆さんが少しずつでも政治を自分のものと考えて動いてくれれば良いな、と思います。

実際に政策について「本当にこれを実施したらどうなるだろう」ということを深く考えることで、単なる批判者、傍観者として政策について考えるよりも、ずっと深い理解をできるようになるのではないかと思います。

まず隗より始めよということで、私も自分の時間の2~3割くらいは政治社会活動に使おうと考えています。ちょっとした政治活動が社会を変えていくということが見えてくれば良いなと思います。このブログにも社会の話題が増えるかもしれませんが、ご了承くださいませ。

2012年6月3日日曜日

CourseraでStanfordの授業をオンラインで無料で受ける


スタンフォードの授業が無料で受けられるCourseraというサイトが登場してるのをご存じですか?

これはMIT Open Coursewareのように教材が投げっぱなしで置いてあるというものではなく、予め決められた期間にコースが設定され、ビデオ授業・小テスト・課題の組み合わせによって、きちんとペースとモチベーションを保って学ぶことができるという仕組みです。

きちんとテストや課題をこなしていれば、最後にはPDFで修了証書がもらえます。これもちょっと嬉しい仕掛けです。

授業は数週間のコースで終わるように作られており、基本的には教科書などを買わなくてもついて行けるような作りになっています。

フォーラムが用意され、一緒に学んでいる学生たちと交流することができるので、分からないところを質問したりすることができます。プログラミングの課題ではテストケースを提供してくれる学生がおり、とても役立ちました。

アルゴリズムの授業(Algorithms: Design and Analysis, Part I)機械学習(Machine Learning)の授業を受けましたが、どちらもとても面白い授業でした。数学が苦手な人であっても、計算機科学の要素を学べるように工夫されています。アメリカの一流の教授というのはすごいな、と思いますね。こんな良質の授業は、そこらの大学ではなかなか受けられないのではないでしょうか。

プログラマであっても計算機科学の知識を持っていない方は多いと思いますので、そういう人にとってはぴったりの授業です。

6月11日より、アルゴリズムの授業の第二回が始まるようですので、是非とも受けてみてください。英語力がいまいちでも、字幕がでるので何とかなりますよ。もし何とかならなければ英語の学習が必要ですね・・・

今はスタンフォードの計算機科学のコースばかりですが、これからは他の大学から、医学、社会学など様々な分野の授業が登場する予定になっています。

私のように大学に行けなかった人間にとっては福音とも言えるサービスです。今後のさらなる発展に大いに期待したいものです。

同時に、大学に行って正規に学ぶことはとても大事だなと思わされました。大学に行ける機会がある人はぜひ大学に行ってしっかり学ぶべきでしょうね。

ですが、大学に行くにはお金も時間も体力も多く使います。21世紀の知識社会においては、誰もがずっと学び続ける必要があります。そうした社会の中では、こうしたオンラインコースの必要性は増す一方でしょう。18歳の若者よりも、社会経験を経た30歳の大人の方が、学べる知的能力もモチベーションも高いのではないでしょうか。