意思決定の罠

意思決定は技術ですね。この本は結構面白かったので創薬の場合で考えてみた。

ProductName まさか!?―自信がある人ほど陥る意思決定8つの罠
マイケル・J・モーブッサン
ダイヤモンド社 / 1890円 ( 2010-04-09 )


意思決定には、おかしなパラドックスがある。誰でも意思決定の重要性については理解しているが、それでも意思決定のトレーニングをする人は極めて少ない。

本書は特に意思決定の際にはまりがちな落とし穴を8つ紹介している

思考モデルとはなんなのか?

モデラーの間にはよく知られた格言がありますね、正しいモデルなんて存在しない、十分に表現できるモデルが得られただけだみたいな(正確なのは忘れた)。

思考モデルとは、外の世界の現実を自分の内側に描写したものである。細部よりもその情報が素早く自分に到達することを重視した、不完全な描写と言ってもいいだろう。

例えば芳香環を共鳴による電荷移動だけしか知らなくて電子雲のイメージを持てないとかそんな感じ。モデルの限界わかってないと、ハマることは多い。

帰納法的に考えてしまう問題は、要は限られた情報をもとに未来を予測してしまうことだ。

これはQSAR,QSPRの抱える本質的な問題ですね。構造XX相関は、知っていることの範囲でしか答えることができないし、どこまでいっても相関であって因果関係とは異なる。

ストレス反応があると短期的に特になることを追求できるが、長期的に何がいいのかを考えられないのだ。これが、トンネルビジョンになる原因の一つだ

プロジェクトでミクロな視点しかできないのは本人の資質かなと思っていたけど、環境要因も後押ししてるのかもしれない。短期成果は見えやすいのでプロジェクトリーダーにあがりやすいんだけど、こういう人がなるとプロジェクトが迷走しやすい(経験的に)

専門家の意見を鵜呑みにしない

物事を予測する際に、人間がアルゴリズムを上回る結果を出すような分野を見つけるのは不可能

直感がうまく機能するのは安定した環境下なので、複雑な状態では重要性としては低い

  • 専門家は、その分野のパターンを認識している
  • 専門家は、初心者よりも素早く問題を解決する
  • 専門家は、初心者よりも奥深くまで問題を掘り下げて考えることができる
  • 専門家が提示する問題解決方法は、初心者のそれよりクオリティが高い

正解は時と場合による

理論構築をする過程では、仮説が実データと合っているかを研究社が検証し、その中で出てくる例外(アノマリー)を見つけ、さらに理論を研ぎ澄ましていくのだ

深く考えて本質を捉えるということですね。特にその際に相関関係と因果関係は違うということをきちんと理解することが重要。

lead optimizationするときには大抵logPとかPSAの相関からそういったパラメータの上げ下げで問題を解決するストーリーにしたがるけど、それってメカニズム的に説明がつくの?っていうことを常に問いかける癖をつけておくとよいですね。

突然大規模な変化に見舞われることもある

所謂ブラック・スワンですね。

ProductName ブラック・スワン[上]―不確実性とリスクの本質
ナシーム・ニコラス・タレブ
ダイヤモンド社 / 1890円 ( 2009-06-19 )


ProductName ブラック・スワン[下]―不確実性とリスクの本質
ナシーム・ニコラス・タレブ
ダイヤモンド社 / 1890円 ( 2009-06-19 )


ハロー効果に注意する

平均回帰性から、運により大きな成果をあげた人は次も同じくらい大きな成果をあげるとは限らない。結果よりもプロセスを重視するということは、そういった運の要素を見極めながら実力を評価するということなのでしょう。

まぁ、でも企業は結果を評価してプロセスなんて後付ですよね。頑張ったから結果がついてきたという言葉に現れているような気がする。

now.jsとcanvasでお絵描きリアルタイム共有

now.jsの練習。canvas操作ははじめての共同作業 Canvas編を流用させてもらった。

now.jsは単に呼び出せば非同期メッセージングができるようになるので便利ですね。あと実際に使ってみて楽だなぁと感じたのがjade、これはヤバイ。Pythonだと何が一番近いんだろうか?後で探してみよう。

expressコマンドでできたスキャフォールド

$ tree
.
├── app.js
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   │   └── client.js
│   └── stylesheets
│       └── style.css
└── views
    ├── index.jade
    └── layout.jade

app.js

最後の二行追加したくらい。楽ちん

var express = require('express');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index', {
    title: 'Express'
  });
});

app.listen(3000);
var everyone = require("now").initialize(app);

everyone.now.distributeMessage = function(message){
  everyone.now.receiveMessage(message);
};
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

package.json

npm -d install

で依存モジュールがさくっとインストールされるので便利ですね。

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.4.3"
    , "jade": ">= 0.0.1"
    , "now": ">= 0.0.1"
  }
}

client.jsのmove

now.distributeMessage(JSON.stringify(points));

だけで、他のクライアントに通知されます。

 Painter.prototype.move = function(event) {
   if (!this.isDrawing) {
     return;
   }

   var points = {
     bx: this.beforeX,
     by: this.beforeY,
     ax: event.clientX - 10,
     ay: event.clientY - 10,
     c: this.strokeStyle
   };

     now.distributeMessage(JSON.stringify(points));
     this.drawLine(points);

   this.beforeX = points.ax;
   this.beforeY = points.ay;
 };

layout.jade

!!! 5
html
  head
    meta(charset='UTF-8')
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body!= body

index.jade

canvas(id='layer0', class='canvas', style='position: absolute; top: 0; left: 0; border: 10px solid #dddddd;', width='900px', height='600px')
script(src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js')
script(type='text/javascript', src='/javascripts/client.js')
script(src='/nowjs/now.js')
script
  $(document).ready(function(){
    var painter = new Painter('layer0');
    now.receiveMessage = function(message){
       var d = JSON.parse(message);
       painter.drawLine(d);
    }});

ダンボール掘ってみた(13)

Hospitalの記念すべき100番

1295003277

Yikes Remixいいよね

nowjsが使いやすそう

socket.ioを更に抽象化してnowっていうオブジェクトを操作するだけで非同期メッセージングをできるようにしたという理解でいいのかな。

Quick "Hello World" Exampleを触ってみる。サーバー側はたったの12行

var html = require('fs').readFileSync(__dirname+'/helloworld.html');
var server = require('http').createServer(function(req, res){
  res.end(html);
});
server.listen(8080);

var nowjs = require("now");
var everyone = nowjs.initialize(server);

everyone.now.distributeMessage = function(message){
  everyone.now.receiveMessage(this.now.name, message);
};

ポイントはこの3行か。

everyone.now.distributeMessage = function(message){
  everyone.now.receiveMessage(this.now.name, message);
};

Expressとの連携も簡単だそうです

var app = express.createServer();
app.listen(3000);
var everyone = require("now").initialize(app);

あとで何か作ってみる

静岡デベロッパーズつくる会#2

前回と同様、富士のコミュニティfでやります。

ワイワイとなんか作る場なので、ウェブアプリケーションを作ってもいいし、(みんなに背中を押されて)おもむろにさくらのVPSを契約して環境構築にはげんでもいいです。前回はNode.js度が高かった気がしますが、今回もそんな感じはするので、俺のNode.js作品見せつけに行ってやるぜってのでもみんな喜びます。

近くにはもちろんつけナポリタンのお店が点在してます。

僕はリアルタイムウェブでなんか面白そうなアイデアが見つかればExpress+nowjsで何か作りたいなぁと思っていますが、地道に自分のブログシステムのスマホ対応しているかもしれません。

小悪魔女子大生のサーバエンジニア日記の1,2章は面白かった

1章のインターネットと2章のDNSの話はわかりやすくて良かったが、知っているのを前提で読んだからな気もするなぁ。

例えば、中高生あたりが読んで素直に理解できる内容なんだろうか?というあたりが知りたいが、amazonの書評は偏ってるからなぁ、booklogも見てみたけど「初心者にはいいのでは」っていう評価してるのは初心者じゃないからなぁ。

ちなみに僕はコレが欲しい

ProductName UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
W.リチャード スティーヴンス
ピアソンエデュケーション / 8400円 ( 1999-07 )


QRコードにtwitterアイコンを埋め込むPythonスクリプト

xooqで本を渡す際に、背表紙の裏側にtwitterアイコン入りのQRコードシールを張っておいたらウッフィーが増えて面白いかなと思い、簡単なPythonスクリプトを書いてみた。

import urllib
import Image
from cStringIO import StringIO

twitter_id = "kzfm"

url = "http://chart.apis.google.com/chart?chs=200x200&cht=qr&chl=http://twitter.com/%s" % twitter_id
buffer = urllib.urlopen(url).read()
qr_image = Image.open(StringIO(buffer))

twurl = "http://img.tweetimag.es/i/%s_m" % twitter_id
twbuffer = urllib.urlopen(twurl).read()
tw_image = Image.open(StringIO(twbuffer))

qr_image.paste(tw_image, (147, 147))

qr_image.save("twqr.png")

TwQR

ウェブオペレーション

成功するためには、致命的でない失敗を如何に重ねるかと誰かが言ったように、先人の経験から学ぶことは非常に意味のあるものです。

本書は、18人のエキスパートによるエッセイ集のようなもので、様々な経験が語られているので参考になった。

とりわけメトリクスの重要性はウェブオペレーションに限らず全てのカイゼンが必要なプロジェクトにおける真実だよなぁと思った。

  • より早いフィードバック
  • もっと自動化
  • 現実世界のメトリクスを監視
  • 断続的なバグにうまく対処する
  • より小さなバッチ

あと、読んでいてこれって創薬プロジェクトが抱えている問題そのものじゃないかと思ったりした。という視点で見てみると

  • MTTD (平均診断時間)
  • MTTR (平均復旧時間)
  • MTTF (平均故障時間)
  • MTBF (平均故障間隔)

が創薬研究において何を意味しているのかを考えるのは意義深いかもと感じた。

ProductName ウェブオペレーション ―サイト運用管理の実践テクニック

オライリージャパン / 2730円 ( 2011-05-14 )


インフラはアプリケーションである

目次

  • 1章 ウェブオペレーション:キャリア
  • 2章 Picnikにおけるクラウドコンピューティングの利用とその教訓
  • 3章 インフラとアプリケーションのメトリクス
  • 4章 継続的デプロイ
  • 5章 コードとしてのインフラ
  • 6章 監視
  • 7章 いかにして複雑なシステムは失敗するか
  • 8章 コミュニティ管理とウェブオペレーション
  • 9章 予期しないトラフィック急増への対応
  • 10章 開発と運用の協力と連携
  • 11章 訪問者の気持ち:ユーザ対面メトリクス
  • 12章 ウェブにおけるリレーショナルデータベースの戦略と戦術
  • 13章 障害を活用する:ふりかえりの技芸と科学
  • 14章 ストレージ
  • 15章 非リレーショナルデータベース
  • 16章 アジャイルインフラストラクチャ
  • 17章 夜中に聞こえる奇妙な物音(と、ぐっすり眠る方法)
  • 18章 日本の料理のインフラ

FilePadはNode.js製のオンラインエディタ

Node.jsとcoffee-scriptの勉強のために読んでみた。coffee-scriptは(javascriptよりも)読みやすくていいですね。

サーバーにあるファイルを読み書きできます。

filepad

複数のクライアントで同時に開いても変更がリアルタイムで反映されているので面白い。

でも使い道がよくわからない。

脳をハックしながらジムを習慣付ける

風邪を引いたり出張が重なったりして行かない日が続くと足が遠のいてしまうことがあるが、そこそこ定期的に通えているという僕のジムライフは、脳が教える! 1つの習慣を読んだおかげで、それなりに楽しく取り組んでいる。

ジムではランニングマシンばかりなので、CNNのiPodを聞くこととと走ることを結びつけている。そうすると今回20分しか走らなかったじゃなくて今日は20分英語の勉強したという風にポジティブに捉えるようになるので、ちょっとだけでもジムで走ることが肯定されるのでよいです。

あと走り終わるとすっきりするので、その後のコーディングとか集中できるのも良いですね。

ProductName 脳が教える! 1つの習慣
ロバート・マウラー
講談社 / 1365円 ( 2008-07-05 )