27022012 bioinformatics Python
pyfastaってのがあった。
Biopythonでいいんじゃないかと思ったが、pyfastaのほうがメモリ効率がいいのかな。ゲノムを扱うような気がする。
あとでちゃんと見てみる。
27022012 bioinformatics Python
26022012 chemoinformatics coffeescript
8章のマルコフモデルの実装までやった。ちなみに二単語のプレフィックスによるモデルを作ってた。ちなみにNodeで作る人工無脳は一単語ですね。こっちはリアルタイム化させているので面白いです。
9章はググらせるだけなのでこれでおしまいでいいやと。
いい本だと思うんだけどなかなか復刊しないですね。
coffeescriptでディープコピーをやる方法を探していたらCoffeeScript Cookbookを見つけたので、Smooth CoffeeScriptとあわせて読んでみる予定。
ところで、人口無能はつくってて楽しいですね。とか書いていて、ふとケミストの合成の流れもマルコフ性があるんじゃないかなぁと思った。思ったというより確信に近い。プレフィックスに構造とイシュー(活性改善とか代謝よくするとか)を入れてやれば、次に修飾したがるところって容易に想像できるよね。実際ベースラインとしてのファーマコフォアをたもちながらっていうよりは、直近の結果にものすごい左右されやすいという性格があってだなぁ(略)。
例えば、ある文章中の単語をランダムに並べ換えて、それをもとの文章に戻すっていう問題を考えた場合マルコフ性をうまく利用すればどの位うまく解けるんだろうかね?
そういう風に考えると、特許化合物のリストっていうのはランダムな単語リストと同じになるわけで、合成のマルコフ性を利用して合成の流れを再構築しなおすってのは面白いかもしれんなぁと思った。
そのうちもう少し良く考えてみようっと。
26022012 Ruby coffeescript Node.js
Rubyのgsubはblockを受け取ってマッチするたびにブロック内の処理内容を変えられるので便利。
irb(main):002:0> i = 0 => 0 irb(main):003:0> 'a-a-a-a'.gsub(/a/){i += 1} => "1-2-3-4"
Node.jsでも同じようなことがやりたかったのでRuby's String gsub in Javascriptをちょっと変更して配列を受け取れるようにしてみた。
gsub = (source, pattern, replacements) -> unless pattern? and replacements? return source result = '' while source.length > 0 if (match = source.match(pattern)) result += source.slice(0, match.index) result += replacements.shift() source = source.slice(match.index + match[0].length) else result += source source = '' result console.log gsub('a-a-a-a', /a/, [1..4])
25022012 coffeescript
なんというかjavascriptの感覚で文字列は+でつなげてしまう。使ったことなかったので調べた。
coffee> a = [1,2,3] [ 1, 2, 3 ] coffee> "ary #{a}" 'ary 1,2,3' coffee> b = {a:'text'} { a: 'text' } coffee> "dic #{b}" 'dic [object Object]' coffee> "dic #{b.a}" 'dic text'
25022012 life
古典なんだろうが、読んだことがなかったので。
好きな人にとってはたまらないかもしれないが、僕には宗教色が強すぎるかなと感じた。眩しすぎてあてられちゃうひと続出だろうから★2つくらいのちょっとネガティブなコメントのほうが参考になる。つまり批判的な読み方したほうが得られるものが多いと思う。
時間管理の第二領域に集中するというのは、まぁみんな理解しているけど、実践できているかというのは微妙だと思う。読後に改めて考えてみると、第三領域というのは第4の習慣(Win-Winを考える)とバッティングするからだろうな。緊急だけど(自分にとって)重要でない仕事は必ずしも相手にとって重要でないわけではないからなぁ。
という話は昔書いたし、自分は基本的にこの原則に従っていて、しょうもない仕事はあまりしなくなったけど、対人関係が全然壊れていないかというと微妙なところだな。つまらない仕事を受けてくれることが信頼関係の構築につながるって信じてる人も一定数いる(特に年功序列世代のおじさんに多い)し、結局自分がどう在りたいかにかかってくるだけだよねー。
25022012 Python
FabricにFile I/O,User/Group Management, Package Management, Text-processingの機能を加えたもの(slide 53)
複数台のサーバーを管理することがあったら使ってみよう。
24022012 life
24022012 life
娘は絵を描くのが好きなのでマインドマップは合っているみたいだ。子供向けのマインドマップ本を買ったら最初に好きなもののマインドマップを描こうって書いてたので、二人で描いてみた。

漢字の起源象形文字を中心におくのもマインドマップしやすくて面白い。
23022012 chemoinformatics Python openbabel
pybel(openbabel)で立体構造の立ち上げを行うのは簡単だ。
import pybel mol = pybel.readstring("smi", "c1ccccc1C") mol.make3D() mol.write("mol")
コードを眺めていたら構造をたちあげるメソッドは
make3dもglobaloptもlocaloptのstep数を変えて呼び出している。
localoptメソッドはデフォルトではmmff94パラメータを使って最急降下法で構造最適化をしている。
22022012 coffeescript Node.js
spawnとexecの違いがわからんのでちょっと調べた。
Difference between spawn and exec of Node.js child_process
spawnはストリームをexecはバッファーを返す
で、Node.jsのドキュメントを読んでて spawnをつかった 'ps ax | grep ssh' の例が書いてあったので、これをcoffeescriptで書いた。
ターミナルで普通に動くのでvowsでテストしたら、callbackが返ってくる前に変なオブジェクトが返ってきてなんじゃこりゃ?と。
coffeescriptをjavascriptにコンパイルして読んだら、変なとこにreturnが挿入されてたのであちこちにreturnを入れて勝手にreturnされないようにした。
psax.coffee
util = require('util') spawn = require('child_process').spawn psax = (callback) -> ps = spawn('ps', ['ax']) grep = spawn('grep', ['ssh']) d = "" ps.stdout.on 'data', (data) -> grep.stdin.write(data); return ps.stderr.on 'data', (data) -> console.log('ps stderr: ' + data); return ps.on 'exit', (code) -> console.log('ps process exited with code ' + code) if code isnt 0 grep.stdin.end(); return grep.stdout.on 'data', (data) -> d += data; return grep.stderr.on 'data', (data) -> console.log('grep stderr: ' + data); return grep.on 'exit', (code) -> console.log('grep process exited with code ' + code) if code isnt 0 return grep.stdout.on 'end', -> callback(null, d); return return exports.psax = psax
returnを入れて最後に評価した式がかえらなくてしなくていいような記法は用意されてないんだろうか? >>なんかモナドっぽくて素敵じゃないか。
vowsのテスト。宣言(文字列)の書き方のお作法がまだよくわかってない。should beとかshoud haveはわかるんだけど、whenとかAfterとか使い分けってどうなってんの?
そういうお作法が書いてあるサイトないかなぁ。
vows = require('vows') assert = require('assert') sp = require('./psax') psax = sp.psax vows.describe('Psax').addBatch({ 'A psax': { topic: -> psax 'should be a function': (px) -> assert.equal(typeof px, "function") 'After psax function called': { topic: (psax) -> psax(this.callback) 'callback should return a result': (err,result) -> assert.isString(result) } } }).export(module)