22012013 chemoinformatics
NARのDatabase IssueにMMPのサービスが載るんだとか思いつつ、SwissBioisostereにアクセスしたら、構造描画にjava製のプラグインを要求するので使うのをやめた。
なんかが良いかなと思うが。chemdoodleのチュートリアルは結構面白いしbackbone.jsなんかと組み合わせられるんじゃないかなぁ。
あとで試す。
22012013 chemoinformatics
NARのDatabase IssueにMMPのサービスが載るんだとか思いつつ、SwissBioisostereにアクセスしたら、構造描画にjava製のプラグインを要求するので使うのをやめた。
なんかが良いかなと思うが。chemdoodleのチュートリアルは結構面白いしbackbone.jsなんかと組み合わせられるんじゃないかなぁ。
あとで試す。
21012013 life
後半の湯山玲子さんの話が面白かった。
デザインとは、そこからあることを読み取って、その発見をもとにビジュアル化し、社会と共有、共感していく行為なのです。
薦められていたので、今度読んでみようっと。
リーン・スタートアップを読んだ。
リーン・スタートアップとは、スタートアップの成功確率を高める方策を集めたものである。
アイデアよりも実行すべきかどうか
「この製品を作れるか」と自問したのでは駄目。いまは、人間が思いつける製品ならまず間違いなく作れる時代だ。問うべきなのは「この製品は作るべきか」
検証できない仮説は意味ないですね。ただモチベーションを上げる手段としての仮説はアレだよなぁと。
ユーザーストーリーは検証による学びが得られてはじめて完結だと考えること
創薬プロセスももうちょっとこういったことを意識しないと駄目だろうなぁと思うが。
リーンスタートアップにおける製品開発プロセスでは「行わなければならない実験をプル信号としてそれに反応する」と考えるべきだ
ピボットのタイプに種類があることを知った。
19012013 javascript Backbone.js
リンク切れてるっていう連絡をもらったので更新しておきました(2018/01/30)。
モデルにgoogle tasksのapiを使ってbackbone.jsでアプリをつくるチュートリアルを読んだ。
package.jsonのscriptsのセクションにstartがないのにnpm startでサーバーが立ち上がるのはなんでじゃろかー?って不思議だったので、ぐぐってみた。
npm startのデフォルトはnode server.jsらしい。
RESTfulなAPIじゃない場合とか他のライブラリを使いまわす場合どうするのかなと思って調べてみたらBackbone.syncを上書きすればいいらしい。modelのほうはいじらないでsyncでよろしくやればいいみたい。
Backbone.sync = function(method, model, options) { var requestContent = {}; options || (options = {}); switch (model.url) { case 'tasks': requestContent.task = model.get('id'); break; case 'tasklists': requestContent.tasklist = model.get('id'); break; } switch (method) { case 'create': requestContent['resource'] = model.toJSON(); request = gapi.client.tasks[model.url].insert(requestContent); Backbone.gapiRequest(request, method, model, options); break; case 'update': requestContent['resource'] = model.toJSON(); request = gapi.client.tasks[model.url].update(requestContent); Backbone.gapiRequest(request, method, model, options); break; case 'delete': requestContent['resource'] = model.toJSON(); request = gapi.client.tasks[model.url].delete(requestContent); Backbone.gapiRequest(request, method, model, options); break; case 'read': request = gapi.client.tasks[model.url].list(options.data); Backbone.gapiRequest(request, method, model, options); break; } };
19012013 life
Nexus7を導入してから漫画をよく読むようになった。ブックオフにいかんでもいいしな。蟻編は面白いので最後のほうをまとめて買ってしまった。ワンクリック恐るべし。
18012013 javascript Backbone.js
日本語のアノテーションがついているソースコードを読んだので、ちょっとわかりにくかったあたりをメモっておく。
リスト構造にしてあんのかなと思ったがtailってなんだろうと思ったら最後尾を常に指すようにしているらしい。
while (event = events.shift()) { list = calls[event]; node = list ? list.tail : {}; node.next = tail = {}; node.context = context; node.callback = callback; calls[event] = {tail: tail, next: list ? list.next : node}; }
これは最後尾のobjectのnextとtailが同じ物を指すようにしているのでさくっと最後に空のオブジェクトの参照を保持している。全てのコールバックを実行するのはnextでたどればいいようになっている。Spine.jsは普通に配列使っていたけどリストにするメリットはなんかあるのかなぁ。
実際の動きはこんな感じ。
> node = {} {} > node.next = tail = {} {} > node.context = "ctx1" 'ctx1' > node.callback = "callback1" 'callback1' > calls = {tail: tail, next: node} { tail: {}, next: { next: {}, context: 'ctx1', callback: 'callback1' } } > list = calls { tail: {}, next: { next: {}, context: 'ctx1', callback: 'callback1' } } > node = list.tail {} > node.next = tail = {} {} > node.context = "ctx2" 'ctx2' > node.callback = "callback2" 'callback2' > calls = {tail: tail, next: list.next} { tail: {}, next: { next: { next: {}, context: 'ctx2', callback: 'callback2' }, context: 'ctx1', callback: 'callback1' } }
tailとnextは同じ空のオブジェクトを指しているので、常に次の参照を保持したまま大きくなっていく。
void 0はundefinedになる。
> void 0 undefined
if (success) success(model, resp);って何やっているのかなぁと思ったのだが、opttion.successを上書きしてしまうので、元々のoption.successを残しておいてコールバックで呼び出しているだけだった。
var model = this; var success = options.success; options.success = function(resp, status, xhr) { if (!model.set(model.parse(resp, xhr), options)) return false; if (success) success(model, resp); }; options.error = Backbone.wrapError(options.error, model, options); return (this.sync || Backbone.sync).call(this, 'read', this, options);
},
$elとelが存在する。
this.$el = (element instanceof $) ? element : $(element); this.el = this.$el[0];
ステートフルJavascriptを読んであればそんなに難しくないので、コードリーディングにちょうどいいかも
17012013 Python javascript Flask
ちょっと色々あってSpine.jsからBackbone.jsに乗り換えることにした。で、REST-APIが使いたかったので、Flask-RESTfulで書いてみた。
from flask import Flask, request from flask.ext.restful import Resource, Api app = Flask(__name__) api = Api(app) todos = {} i = 0 class TodoSimple(Resource): def get(self, tid): return {"tid": tid, "todo": todos[tid]} def put(self): global i tid = i i = i + 1 todos[tid] = request.form['data'] return {"tid": tid, "todo": todos[tid]} def post(self, tid): todos[tid] = request.form['data'] return {"todo": todos[tid]} def delete(self, tid): deldata = todos[tid] del(todos[tid]) return {"tid": tid, "todo": deldata} api.add_resource(TodoSimple, '/', '/<int:tid>') if __name__ == '__main__': app.run(debug=True)
curlで確かめた。
$ curl http://localhost:5000/ -d "data=Remember the Flask" -X PUT {"tid": 0, "todo": "Remember the Flask"} $ curl http://localhost:5000/ -d "data=Remember the Python" -X PUT {"tid": 1, "todo": "Remember the Python"} $ curl http://localhost:5000/0 {"tid": 0, "todo": "Remember the Flask"} $ curl http://localhost:5000/0 -d "data=Remember the Sphinx" -X POST {"todo": "Remember the Sphinx"} $ curl http://localhost:5000/0 {"tid": 0, "todo": "Remember the Sphinx"} $ curl http://localhost:5000/0 -X DELETE {"tid": 0, "todo": "Remember the Sphinx"} $ curl http://localhost:5000/0 {"status": 500, "message": "Internal Server Error"}
今回はMongoDBを使いたかったので Flask-RESTfulを検討しているのだけど、SQLAlchemyでいいんだったらFlask-RESTlessでいいかもしれない。メソッド自分で書かなくていいし。
16012013 life
先月の広島出張の行きの新幹線のなかで4冊読んだけど、これが一番面白かった。
特に会議の考え方がすごかった。
プロジェクトの成果の質は、そこにかかわる人間の多さに反比例する
というように、意思決定に必要ない人間は徹底的に排除するというのは、会議が4W1Hを決めるために存在すると考えるのであれば合理的だなと思った。報告というのは意思決定をするためのおまけみたいなものだからな。
16012013 家庭菜園
久しぶりに畑にいって、ブロッコリーとカリフラワーの成長具合を見に行ったけど、全然育ってなかった。
しかも茎があかっぽくなってるし。
まったくおなじポット苗からベランダのプランターで育てているのは順調に大きくなっている。たまにハイポネックス与えたりしてるし、日当たりがいいからだろうなぁ。
来期はベランダ菜園も併用したほうが楽しめるかもしれないなぁ。
畑は来年の契約が終ったら再抽選になるので、当選するかどうかわからんし、ベランダ菜園の比重も増やしておこうっと。
14012013 life
娘と息子がジグソーパズルをやりたがって買ってきたのだけど、子供たちは予想通り途中で飽きてしまい、同時進行していた僕の苦行にしかならなかった。
こびとづかんシリーズのホトケアカバネ。鳩の餌が大好物らしい。
娘のワンピースは難易度低め(顔とか図柄がわかりやすい)。
やるならラージピースのほうがいいな。