PythonでFasta fileを扱う

pyfastaってのがあった。

Biopythonでいいんじゃないかと思ったが、pyfastaのほうがメモリ効率がいいのかな。ゲノムを扱うような気がする。

あとでちゃんと見てみる。

恋するプログラムをCoffeeScriptで書いてみた

8章のマルコフモデルの実装までやった。ちなみに二単語のプレフィックスによるモデルを作ってた。ちなみにNodeで作る人工無脳は一単語ですね。こっちはリアルタイム化させているので面白いです。

9章はググらせるだけなのでこれでおしまいでいいやと。

ProductName 恋するプログラム―Rubyでつくる人工無脳
秋山 智俊
毎日コミュニケーションズ / ?円 ( 2005-04 )


いい本だと思うんだけどなかなか復刊しないですね。

coffeescriptでディープコピーをやる方法を探していたらCoffeeScript Cookbookを見つけたので、Smooth CoffeeScriptとあわせて読んでみる予定。

化合物の合成ストーリーはケミスト言語による文章構築

ところで、人口無能はつくってて楽しいですね。とか書いていて、ふとケミストの合成の流れもマルコフ性があるんじゃないかなぁと思った。思ったというより確信に近い。プレフィックスに構造とイシュー(活性改善とか代謝よくするとか)を入れてやれば、次に修飾したがるところって容易に想像できるよね。実際ベースラインとしてのファーマコフォアをたもちながらっていうよりは、直近の結果にものすごい左右されやすいという性格があってだなぁ(略)。

例えば、ある文章中の単語をランダムに並べ換えて、それをもとの文章に戻すっていう問題を考えた場合マルコフ性をうまく利用すればどの位うまく解けるんだろうかね?

そういう風に考えると、特許化合物のリストっていうのはランダムな単語リストと同じになるわけで、合成のマルコフ性を利用して合成の流れを再構築しなおすってのは面白いかもしれんなぁと思った。

そのうちもう少し良く考えてみようっと。

RubyのgsubをCoffeeScriptで

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])

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'

「7つの習慣」を読んだ

古典なんだろうが、読んだことがなかったので。

好きな人にとってはたまらないかもしれないが、僕には宗教色が強すぎるかなと感じた。眩しすぎてあてられちゃうひと続出だろうから★2つくらいのちょっとネガティブなコメントのほうが参考になる。つまり批判的な読み方したほうが得られるものが多いと思う。

ProductName 7つの習慣―成功には原則があった!
スティーブン・R. コヴィー
キングベアー出版 / 2039円 ( 1996-12 )


時間管理の第二領域に集中するというのは、まぁみんな理解しているけど、実践できているかというのは微妙だと思う。読後に改めて考えてみると、第三領域というのは第4の習慣(Win-Winを考える)とバッティングするからだろうな。緊急だけど(自分にとって)重要でない仕事は必ずしも相手にとって重要でないわけではないからなぁ。

という話は昔書いたし、自分は基本的にこの原則に従っていて、しょうもない仕事はあまりしなくなったけど、対人関係が全然壊れていないかというと微妙なところだな。つまらない仕事を受けてくれることが信頼関係の構築につながるって信じてる人も一定数いる(特に年功序列世代のおじさんに多い)し、結局自分がどう在りたいかにかかってくるだけだよねー。

  • 習慣は、知識とスキルとやる気という3つの要素からなっている
  • 個人的なミッションステートメントを書く
  • 原則中心の生活
  • デレゲーションの重要性

Cuisine ( Chef-like functionality for Fabric )

FabricにFile I/O,User/Group Management, Package Management, Text-processingの機能を加えたもの(slide 53)

複数台のサーバーを管理することがあったら使ってみよう。

子供の本の難易度を調整するのは楽しい

達成感というか読了感を如何に与えるかは重要だと思う。

最近娘が気に入った本。

ProductName 特急おべんとう号 (福音館創作童話シリーズ)
岡田 よしたか
福音館書店 / 1575円 ( 2009-03-01 )


子供のためのマインドマップ

娘は絵を描くのが好きなのでマインドマップは合っているみたいだ。子供向けのマインドマップ本を買ったら最初に好きなもののマインドマップを描こうって書いてたので、二人で描いてみた。

1329616847

漢字の起源象形文字を中心におくのもマインドマップしやすくて面白い。

ProductName マインドマップ(R)for kids勉強が楽しくなるノート術
トニー・ブザン
ダイヤモンド社 / 1680円 ( 2006-11-17 )


pybelで立体構造を立ち上げる

pybel(openbabel)で立体構造の立ち上げを行うのは簡単だ。

import pybel
mol = pybel.readstring("smi", "c1ccccc1C")
mol.make3D()
mol.write("mol")

コードを眺めていたら構造をたちあげるメソッドは

  • make3d
  • localopt
  • globalopt # ただし2.3.1ではコメントアウトされてた

make3dもglobaloptもlocaloptのstep数を変えて呼び出している。

localoptメソッドはデフォルトではmmff94パラメータを使って最急降下法で構造最適化をしている。

Node.jsのspawnをつかってcoffescriptでps ax | grep sshを実行させるサンプル

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)

ProductName テスト駆動JavaScript
Christian Johansen
アスキー・メディアワークス / 3780円 ( 2011-11-25 )