« 2009年3月5日 | 2009年3月10日の投稿 |
2009年3月11日 » |
ある空想をしてみましょう。あなたはある企業の情報システム部門の技術者です。その会社のイントラネットシステムを担当しており、メールやワークフローの運用や保守を行なっています。大規模な開発を外部委託する窓口を担当する傍らで、社内へのお知らせ掲示板などの簡単なアプリケーションは自ら開発もしています。
ある日、社長が情シス部長に言いました。
「なんか『ツイッター』ってのがおもしろいらしいんだよね。しかも無料らしい。うちの会社でもやろう」
情シス部長は社長の発言をそのままあなたに伝えます。
「無料で、社内で、ツイッターを、やれ。」
twitter.comにアカウントを作ってしまうのも手かもしれませんが、社内の発言が外に見えてしまうのは気になります。自力で構築するしかないと踏んだあなたはいくつかのサイトを見て回りました。どうやらオープンソースのマイクロブログがあるようです。また、Yammerというサービスはイントラネット向けにパッケージが販売される動きもあるようです。よし、いける。そう思ったあなたは3秒後に首を左右に振りました。
「うちの基盤は、Lotus Notesだった。」
Lotus Notesのオーソドックスな手法、すなわちビューと文書を用いてtwitter相当のアプリが作れるだろうか、その疑問をきっかけにもう1つの疑問が生まれました。
「twitterってどう実装されているんだ?」
twitterの姿とは
さて、twitterとはどのようなサービスでしょうか。参照系、更新系、管理系にわけて主な機能を洗い出してみます。
参照系
- タイムライン
自分がフォローしている人と、自分の発言が時系列順に20件ずつ表示されます。 - あなた宛のつぶやき
自分に向けられた公開つぶやき(@username)を表示します。 - ダイレクトメッセージ
自分だけに公開されたつぶやきを表示します。 - 全体の公開つぶやき
twitter全体から公開つぶやきを取得します
更新系
- つぶやく
自分のつぶやき内容が時系列で表示されます。 - お気に入り
あるつぶやきをお気に入り登録します。 - フォローする
他のユーザをフォローします。
管理系
- 「フォローする」の表示・削除
自分がフォローしているユーザを表示します。 - 「フォローされている」の表示・ブロック
自分をフォローしているユーザを表示します。
他、会員登録やつぶやきの削除などの機能は省略しました。
さておそらくtwitterはこれらをRDBとキーバリュー型データストアあたりに保存していることと思われます。こちらの記事にもありますが、一般論からすればtwitterの仕様は性能を出しやすいとは決して言えません。
こちらの記事はGREEというSNSのパフォーマンスについて書かれたものです。twitterについても同じような問題が出てきます。
- ひとりひとりのフォロー先は異なる。そのためタイムラインも異なり、共通データをキャッシュしても意味がない
- 発言を格納するテーブルが1つだった場合、データが肥大化して問い合わせのコストが上昇する
- テーブルが複数だった場合、ソートで困る
ですので例えば新人研修でRDBについてみっちり講義した後に「自由に情報共有システムを作ってみよう」というお題を出したとして、twitterと同じものを考えてきた人がいたら小一時間その意図を問い詰めたいところです。どうやってスケールするか考えて設計したか、と。
テーブル構造の妄想
今のtwitterがどのような構成になっているかうかがい知る資料を見つけることはできませんでした。推察するに、GREEの「友達の新着日記」と同様にユーザごとにタイムラインを保持しているのではないかと思います。以下はできるだけシンプルに考えた妄想のマイクロブログモデルです。実機に組んで検証したり第三者のレビューを受けたものではありませんが、RDBに組むならこんな感じかな、ということを考えてみました。
(イメージ)ユーザAのタイムラインテーブル
日時 | userID | 発言ID |
3/4 12:00 | userB | 0AE24 |
3/3 11:00 | userB | AC803 |
3/3 10:00 | userC | D0832 |
3/2 22:00 | userD | E8923 |
3/1 18:00 | userE | 2389E |
(イメージ)フォロー関係テーブル
フォロー者 | 被フォロー者 |
userA | userB |
userA | userC |
userA | userD |
userA | userE |
userB | userA |
(イメージ)ユーザBの発言テーブル
日時 | 発言ID | 発言内容 |
3/4 12:00 | 0AE24 | ただいま |
3/3 11:00 | AC803 | @userA まじで |
3/3 03:00 | D0832 | カップル爆発しろ! |
3/2 23:00 | E8923 | 今日寒いな |
3/1 11:00 | 2389E | reading httpXXXXX |
タイムライン
GREEやmixiで見られるような友達の最新日記では、見せるのは何件かに限られます。そのため無用なDBアクセスを増やさないために日時、友達の名前、発言内容が非正規化された状態で保存されているものと思われます。twitterの場合は過去に遡ってすべての発言が格納されていることから、文書IDをキーとしてテーブルを分割しているように思います。twitter.comのサイトからは20件おきにしかアクセスできませんので、副問い合わせも大きな負荷ではないでしょう。上のイメージでいうところのユーザBのテーブルはユーザごとに分かれているとテーブル数が凄まじくなりますので、実際のところはユーザ何人かでまとまっているでしょう。ただし下で述べるフォロー時の処理を考えると1人のユーザの発言がいたずらにバラバラのテーブルに書き込まれることは無さそうです。
フォロー(した|された)場合
ここでユーザAが新たにユーザXをフォローした場合はどうでなるでしょうか。フォロー関係テーブルを更新するとともに、ユーザXの発言をすべて抜いてきてユーザAのタイムラインに追加する処理が発生します。このとき、ユーザXの発言をすべて、の抜きやすさはテーブル数が少なく、また総当りしなくてもテーブルを特定できる(ユーザIDからのハッシュ値計算など)ことが望ましいでしょう。
新たに発言した場合
その後、ユーザXが発言した場合はどうなるでしょうか。ユーザXの発言は発言IDが付与された後にユーザXの発言テーブルに格納されます。そしてフォロー関係テーブルで被フォロー者がuserXのレコードを取得し、ユーザXをフォローしている人のタイムラインに発言IDを配信します。ダイレクトに処理したら大変ですので、キューイングされるでしょう。高負荷時はタイムラインの取得リクエストがあったことをイベントとして処理を行い、リクエストがないデータについては遅延させてしまうというのも割り切っていてよいかもしれません。
タイムラインのソート
ここのところでタイムラインの「ソート」について考えなくてはなりません。データ量が大きくなればなるほどソートは大変になります。しかし既にソートされているデータにソートされているデータを差し込むのはそう難しいことではありません。人間がUIを操作しながらフォローを増やしていったり、被フォローが増えていく過程は非常に緩やかですので、無理のある処理にはならないでしょう。レコード数が大きくなりすぎないように設計できたならばそのへんのRDBMSのB+木か何かに任せれば問題ないと思われます。レコードにポインタ的列を持たせて並び順が次に位置する文書IDを格納してもおもしろいかもしれません。挿入データが既にソートされているので、先頭から1回だけ全行をスキャンすれば挿入とソートの処理が終わります。
もしフォローした1000人分の発言をすべて抜いてきて、一度にソートしようとしたらえらいことになるでしょう。
あなた宛のつぶやきとDM
@UserIDのつぶやきについては、相手が自分のフォローリストに入っていない場合と入っている場合とで処理が異なります。入っている場合は普段と同じつぶやき処理になりますが、入っていない場合は普段の処理に加えてつぶやきを送った相手のタイムラインテーブルに自分の発言レコードを突っ込む処理になります。自分に向けられたつぶやきを見る場合は、自分のタイムラインから@UserIDで始まるものを抜き出すか、そもそもタイムラインへの登録時に@UserIDで始まるものにフラグを立てる、あたりになるでしょう。DMは普段のつぶやき処理を行なわず、相手のタイムラインにだけつぶやきを配信します。
自分のつぶやき
自分のタイムラインに自分の発言が入っていますので、自分のユーザIDでレコードを検索します。
お気に入り
ある発言をお気に入りに追加する場合、お気に入りテーブルが必要になります。自分のユーザID、文書IDの構造になるでしょう。
キャッシュについて
twitterで特に頻繁にアクセスされるレコードは最近1日分くらいのデータでしょうから、それらはRDBでなくオンメモリのキーバリュー型データストアに書き込んでおいたらRDBを検索するコストが更に下げられるでしょう。処理としては24時間以内のレコードならば文書IDのみをキーにキーバリュー型データストアを検索し、24時間以前ならばユーザIDをキーにしてテーブルを見つけ、その中から該当する文書データを持ってきたらいいかと思います。ただし各人のタイムラインのトップ20件については、フォローしている人が誰か1人でも発言したら更新されてしまいますのでキャッシュ効果があるかどうか疑問です。反対に全体の公開つぶやきは、確かに更新の可能性も高いですが、読み込まれる回数もそれだけ多いと思われます。そのバランス次第ではキャッシュに入れたほうが望ましいかもしれません。
でも一人当たりの平均とか総発言数、1時間当たりの発言数、ピーク時のリクエスト/秒などを聞かずに好きなように妄想するというのも健康的でよいですね。
いい加減、長くなり過ぎたのでこれをLotus Notesで実装したらどうなるか?についてはまた気が向いたときに書きます。(環境が無いのでソースなどは出せませんが。)乞うご期待。
「なんでもかんでも機械で出来る」という感覚や、そういった機械を発明しようという精神は、とても怖い感覚で、無神経…
というエントリを拝見しました。アメリカでビッグ3と言われる自動車会社がありますが、その1つであるフォード社。その創業者たるヘンリー・フォード氏の自伝「藁のハンドル」にはまさしく「なんでもかんでも機械で出来る」ようにするためにどうしたらよいか、というフォード氏の考えが述べられています。フォードに納入するベアリング製造会社の社長だったアルフレッド・スローンはGM社の社長に、GM社の子会社であるビュイック社の社長をしつつ、デュラント時代のGM社に経営参画していたウォルター・クライスラーはGM社のドアを蹴飛ばして独立し、クライスラー社を興します。
チャーリーチャップリンの「モダンタイムズ」にもあるように機械に振り回される人間たちの姿はまさしく「なんでもかんでも機械で出来ると思うなよ」という機械時代の幕開けに対するカウンターパンチであり、今に至るまで機械を信じることに一種の背徳感を覚える人も少なくないでしょう。そのあたりへの葛藤が大量生産文化の発祥の地であるイギリスでも、大量生産文化を花開かせたアメリカでもなく、日本の手塚治虫のいくつもの著作に見事に描かれているのは同じ日本人として誇らしく思います。
考えてみれば大量生産時代は富める層に多くの快楽をもたらしました。しかし消費が飽和して頭打ちになると「より売ること」を目的とした売り込み方法、世間ではマーケティングとして理解されているものですが、この理論体系が進歩します。そのことにより資源国からは資源を獲得し、作れる国ではより多くのものが作られ、そして消費されることとなりました。この消費はある時代までは幸福をもたらしましたが、ある時からは飽和しかもたらさずどこまで消費しても幸福度が大きく上昇しないという問題が生まれています。この日本において3万人とも言われる自殺者が出ているというデータはその一端を指し示すものでしょう。
私は大学時代にマーケティングを専攻していました。マーケティングは上で述べたように売り込みの学問として理解されていますが、元々はまだ貧しかった時代のアメリカにおいて資源や、資源から作られた商品の配布の問題を解決するものとして誕生したと言われています。すなわち、ある街では食料があっても服がなく、ある街では服があっても家具がない、という問題を解消することが急務である時代がありました。大陸横断鉄道と連絡網の整備によりこれらは急激に解消され、「商品がないところに商品を運べば売れる」という視点が再発見されました。そして「どこで商品がなくなりそうか」ですとか「この次はどんな商品が望まれそうか」から「どのような商品ならば望まれるか」や「商品を望むためにどういった音楽や女優を使えばいいか」という形にマーケティングは進化していきます。
今日ではその基本的な形のひとつは、消費者に対し「あなたは不完全である」ということをつきつけ、「完全であるためにはこの商品を買いなさい」という提案をすることになっています。自動車、化粧品、ビール、缶コーヒーなどCMでよく見かける消費財はどこか「あなたを変える」ための提案をしています。例えば缶コーヒーはサラリーマンに売れますので、その時代のサラリーマンの心象をよく反映したCMが放映されます。
もし完璧に欲望を満足させるマーケティングが行なわれた場合、その後の商品は売れなくなります。そのためいつまでも「完全ではないこと」をアピールするような仕組が作られています。端的に言えばマスコミを通した情報の一方的配信は消費者に渇きを訴え続け、それにより消費行動が刺激されます。この点においてマーケティングは自分で渇きを生み出して、それを潤すという奇妙なものになりました。いま世の中に自然に存在する渇きのすべてを潤していないのに自分で渇きを作り出す構造、それに前向きになれず、私はマーケティングを職業とすることを考えずにITの道に進んでいます。
ITによれば情報の共有を加速することができます。おそらく近い未来には起こり得ないことですが、アグレッシブなマーケティングにより作り出された虚構の乾きはインターネットを中心とした消費者同士のフラットな情報交換により癒され、消費行動が鈍くなる世界がやってくるでしょう。多くのメーカにとって、いや、日本経済にとって避けられない後退局面が発生する可能性があります。そして昨今の自動車販売台数や旅行者の減少などは既にこの時代の到来を示し始めているのではないか、と感じることすらあります。
ただしこれは行過ぎたところでまた是正されるでしょう。消費の喜びは一度知ったらやめられません。マーケティングの生まれるより前、古来より人間には「お祭り」と言われる意味不明の行動があります。裸になったり食べ物をぶつけたり、平常には考えられない行動が正当化されます。マーケティングとは長い長いお祭り騒ぎであり、それを支えうる基盤さえあれば存在してもよいのではないでしょうか。それを支えうる基盤とは地球のキャパシティであり、資源です。本来ならば人間の労働力を上回る生産は発生しないため、これまでお祭りは1年に1度など低い頻度で行なわれてきました。それが化石燃料や動力機関の発明により人間の労働力をはるかに上回る生産が発生し、お祭りが高い頻度で行なわれる状態にあります。許されるならばできるだけ楽しく生きたいのが人間の性ですので、温暖化的にも埋蔵資源的にも許されるならば今の大量消費社会という長いお祭りも続いて欲しいものだと思います。劣等感を過度に刺激しない限りは。
「機械」というとどうしてもアレルギーがある方がおられるようですが、どこまで機械かということを考えるのはおもしろいものです。正確な定義はあろうかと思いますが、身の回りの車輪やテコまで機械とすると機械なしでは生きていけません。また、機械は1つの作業をものすごく効率的に行なえるようになるというメリットがあり、分業して仕事を行なうことにより労働生産性をものすごく向上させます。よく引き合いに出されるアダム・スミスの分業の例ですが「諸国民の富の性質と原因の研究」いわゆる国富論では第1編の1章でピンの製造について述べています。分業せずに作れば一日で1人10本がいいところだろうが、ある工場では簡単な機械を使うだけで10人で1日に4万8千本以上ものピンが作られる、というものです。となると人々は工場で労働を提供し、賃金を得て身の回りのものを購入したほうが効率的に生活できるようになります。となると農業や畜産業や漁業から遠いところで生活が成立し、食べ物がどのようにやってくるかよくわからなくても生きていけるようになります。
この分業に加え、動力を化石燃料や内燃機関から得ることで人々は労働力を拡大してきました。しかしそれ以前から人々は他のところからエネルギーを借りてきて生きることを知っています。例えば微生物や太陽の力を使えば食品の性質を変えることが出来ます。人間自身は少し体力を使ってイカを天日に干したり、牛乳を皮袋に詰めたりしますが、タンパク質をアミノ酸に変えたり、ビタミンを作ったりと腕力や脚力では絶対にできないことを行なうことができます。
そう。そうなのです。微生物を使えば大豆をおいしい調味料に変換できるのです。 分業による工業生産の増加、それを契機とする農業生産の増加は余剰作物を生みました。余剰作物は保存しなくてはいけません。そこで保存のための魔法「発酵」が誕生するのです。世は発酵ブーム。もやしもんが博物館で企画展をやる時代です。これは何かを発酵させなくては。
日本人のハート。それは味噌。
今年もやってきました味噌仕込みの季節。2009年版の味噌作りのはじまりはじまりー。
(昨年の味噌作りの様子はこちら)←分量や手順はこちらが詳しいです。
今年は東京は江東区門前仲町にある豆の専門店「エチノブ」で大豆を購入。
ボウルに入れてたっぷりの水につけます。おいしい水を使いましょう。
これが去年(2008年2月仕込み)の味噌です。半分以上食べました。
水を吸った大豆です。丸大豆でも水を吸うと長くなります。
恒例の「こうじ屋」さんです。こうじを「植物を分解する機械」とみなせばガソリンスタンドか自動車ディーラーみたいなポジションになるんでしょうか。
昔みそ・糀屋三郎右衛門 <http://www.kouji-ya.com/>
圧力鍋で大豆を煮ます。15分から20分です。
うちのビタクラフトのスーパー圧力鍋は購入後4年ほど経ちますが現役ばりばりです。
去年の味噌を樽から別の容器に移し、綺麗に洗いました。
これが「こうじ」です。(製造者の糀屋さんの住所、氏名、電話番号やFAXは↑のリンクを見れば誰でも確認できるものでしたので塗りつぶしていません)
こうじに塩を混ぜ合わせる「塩切り」に入ります。大き目のビンにこうじを入れます。
塩を入れてシャカシャカ振ります。これだと飛び散らないので楽です。
と、大豆が茹で上がりました。この時点の大豆の美味しさは味噌作りの経験者しかわからないでしょう。バクバクつまみ食いしてしまいます。
基本にオーソドックスに、親指と小指の間でつぶせるほどの堅さであることを確認します。
熱に強いビニール袋に入れます。
踏んでつぶします。息子の足です。
ちなみに去年の息子はこちら↓(両足で立って味噌を踏める程度に大きくなりました)
つぶした味噌はこちら。ほんのところどころに大豆の形が残っているくらいがベストです。
忘れてはいけないのが種水。大豆をゆでたお湯は捨てずにとっておきます。
すべての大豆がつぶし終わった様子です。
こちらに種水を入れます。べちょべちょになります。
が、混ぜていくと少しまとまってきます。不思議。
こうじを入れます。粘性があって重い大豆と、軽くてパラパラのこうじ(乾燥した米)の組み合わせは最悪で、注意深くやらないとこうじが周りに飛び散ります。
このように冗談のようにきれいにまとまります。
手のひらに軽くすくって玉にします。空気が入り込まないよう、樽にぶつけます。お年寄りに本格的な作業を見せてもらわないとなかなかコツがつかめないかもしれません。1回見たら簡単に習得できます。
すべて投げ込み、表面をツルツルになるようにします。防腐に塩をパラパラとまきます。
味噌(となる予定の大豆とこうじと塩の塊)の表面にラップをし、上から蓋をします。その上から重石をします。
この後、夏ごろに天地返しをして発酵の進み具合を均一にします。あとは秋頃に取り出して食べます。ふっふっふ。
「味噌はスーパーで買ってくるんじゃない。下駄箱の上の味噌樽で醸す(かもす)んだ!」
以上、味噌作り2009でしたー。
« 2009年3月5日 | 2009年3月10日の投稿 |
2009年3月11日 » |