ExpressとSocket.IOで作られたドラッグ&ドロップ対応ファイルアップローダ

dotHTML5から

ソースがGitHubで公開されているのでコードリーディング。Soket.IOの使い方が勉強になる。

あと、ヘッダのリソースをsession経由で渡せばいいのか。

  req.session.resources = [
    { type: 'javascript', uri: '/libraries/file-iterator/file-iterator.js' },
    { type: 'javascript', uri: '/socket.io/socket.io.js' },
    { type: 'css', uri: '/stylesheets/sender.css' },
    { type: 'javascript', uri: '/javascripts/sender.js' }
  ];
  req.session.variables = [
    { name: 'webSocketHost', value: "'" + config.client.webSocket.host + "'" },
    { name: 'webSocketPort', value: config.client.webSocket.port }
  ];
  res.render('sender');

こうしておくとテンプレートにハードコードしなくて良いからいいかもしれん。今度使おうっと。Flaskだったら辞書に突っ込んでレンダリングすればいいのかな。


8/21(Sun) @コミュニテイfで第二回Shizudevつくる会やります。

夏休み三日目

最初の2日はキャンプ。

今日は妻が健康診断のためにこどもの世話をしていたのだけど、自分の仕事は何も出来ずに一日潰れた。恐るべし娘と息子。

お絵描きの練習

娘にペンタブレットとphotoshopの使い方を教えてた。お絵描きが好きなのでこういうのは好きみたいだな。とっとと上達して僕のウェブサービスのロゴとかデザインとかできるようになってくれるとありがたい。

yuki110809_1

yuki110809_2

子供お絵かき板Flickrみたいなのあればいいのにねーと思った。

ProductName Wacom Bamboo Comic CTE-450/W1

ワコム / ?円 ( 2007-11-16 )


自転車特訓

夕方補助輪を外した自転車の練習をした。

昨日お友達に「まだ補助輪つけてるのー?」って言われたのがショックだったらしい(泣きそうになってたし)。で、昨晩寝る前に「明日から補助輪外す!」って言ってたけど本当に外すとは。

少し、一緒に練習すれば走れるようになりそう。

息子とトリコごっこ

16連釘パンチとか言ってひたすらくすぐると喜ぶ。しつこいので泣くまでくすぐり続けておくのが定番だが、息子との仲良し度も高まった。息子と娘は性格が全然違うが、二歳くらいで既に違うなってわかるのはやっぱ遺伝要因なのかなぁとか思う。環境要因ではないよなと。

ProductName トリコ 1 (ジャンプコミックス)
島袋 光年
集英社 / 420円 ( 2008-11-04 )


トリコ面白いけど、HUNTER×HUNTERの連載が再開したのも喜ばしい

ProductName HUNTER×HUNTER 29 (ジャンプコミックス)
冨樫 義博
集英社 / ?円 ( 2011-08-04 )


富士山子どもの国でキャンプ

子どもが生まれてから初めてテントを担いだキャンプですな。二週間くらいに急に思い立ったので、探したほとんどのキャンプ場の予約は埋まってたのだけど、子どもの国のキャンプサイトは数サイト空きがあったので申し込んだ。

キャンプサイトで、テントとタープ貼り終わったのがお昼で、その後に突然の雷雨がきてテントの中で雨宿りしてたら時間を食ってしまった。水の国に行って水遊びをする予定を変更して、アルパカ見たりしてた。

1312793415

娘が乗馬で大喜び。

1312793418

二日目は、クモノスネットで遊びつつ歩きながら水の国に行って水遊びをして、街の国で、ヨーヨー釣りしたり、かき氷を食べて帰ってきた。帰りはバスみたいなのに乗って街の駅から草原駅まで戻ってきた。

1312793420

こどもの国は広くて一泊だと結構慌ただしい。二泊してゆったりするのがいいかも。

pros

  • キャンプサイトが10区画でだいたい埋まっているし、夜中も見まわりしているので安心感がある。
  • キャンプサイトまでちょっと遠いけど、リヤカー貸してくれるので荷物を運ぶのは楽。手軽さで選ぶならパオという手段もある
  • テントサイトは1000円と安い。パオなら4000円(パオは予約が埋まるのが早い)

cons

  • 夏でも夜はかなり寒い。防寒対策必須。
  • こどもの国は広くて結構歩く。

テトラゾールの負電荷はどこにたまるのか?

生物学的等価体として知られているものにカルボン酸とテトラゾールがありますね。

医薬化学において、テトラゾール環はカルボン酸の等価体と見なされ、医薬品の部分構造に汎用されている。これは前述のようにpKaがほぼ等しいため、

Wikipedia

tetrazole

テトラゾールってこんな構造だからpKaは同じだとしてもアニオン化した状態で負電荷どこにたまるのかなという素朴な疑問を持っていた。

ま、計算すればいいだけなので、pygamessを使って計算してみた。以下コード。チャージがcontrlセクションに入力するっていうのが気持ち悪い。

あと、最適化がなかなか終わらないのでmaxitとnstepは増やした。デフォルトをこの値にしてもいいかもしれない。

from pygamess import Gamess, GamessError
import openbabel as ob

g = Gamess()
g.contrl['maxit'] = 200
g.contrl['icharg'] = -1
g.statpt['nstep'] = 300
g.system['mwords'] = 80
g.basis_type('631g')
g.run_type('optimize')

obc = ob.OBConversion()
obc.SetInAndOutFormats("mol","mol")

mol = ob.OBMol()
obc.ReadFile(mol, "tetrazole.mol")
print g.gamess_input(mol)

try:
    newmol = g.run(mol)
except GamessError, gerr:
    print gerr.value
else:
    for obatom in ob.OBMolAtomIter(newmol):
        print obatom.GetIdx(), obatom.GetType(), obatom.GetPartialCharge()

いろいろ試していたので、GAMESSインプットを出力するようにしてある。

結果を見ると、確かに6,9番目の窒素のマイナスチャージが大きくなっているので、カルボン酸等価なんだろうなと納得したのであった。

$ /opt/local/bin/python optimize.py
 $contrl runtyp=optimize scftyp=rhf icharg=-1 maxit=200 mult=1  $end
 $basis gbasis=N31 ndfunc=1 ngauss=6 $end
 $system mwords=80  $end
 $statpt opttol=0.0001 nstep=300  $end
 $DATA

C1
C      6.0     -5.1500000000    0.5694000000    0.3351000000 
C      6.0     -3.6632000000    0.3894000000    0.3044000000 
H      1.0     -5.3940000000    1.6144000000    0.4937000000 
H      1.0     -5.6014000000   -0.0166000000    1.1314000000 
H      1.0     -5.6123000000    0.2533000000   -0.5982000000 
N      7.0     -2.8049000000    1.3874000000    0.2522000000 
N      7.0     -1.6217000000    0.7950000000    0.2303000000 
N      7.0     -1.7700000000   -0.4762000000    0.2679000000 
N      7.0     -3.0563000000   -0.7807000000    0.3162000000 
 $END

1 C3 -0.5149
2 Car 0.437823
3 HC 0.153658
4 HC 0.142616
5 HC 0.138266
6 Nar -0.487902
7 Nar -0.192393
8 Nar -0.188063
9 Nar -0.489106

量子化学計算っていうのは意外にトライアンドエラーが多い。だからといってGUIのコンソールからちまちまと作業すると時間が取られて困るし、作業ログが残りにくいので、こういったスクリプトで幾つかの条件を用意してforループでグルグルまわして計算させれば手順がきちんとドキュメントとして残るのでよい。

意思決定の罠

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

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 )