PyMOL v1.5をosx10.6.8に入れた

リリースしている安定版はインストールできなかったので、svnのtrunk(r3983)を入れた。それからbrewを使っているのでsetup.pyをちょっと変える必要があった。

/opt/localはmacports用の設定だと思うので/usr/X11に変更しないとGL/gl.hがないとかそんなエラーを吐くはず。

156         EXT = "/usr/X11"
157         inc_dirs=["ov/src",
158                   "layer0","layer1","layer2",
159                   "layer3","layer4","layer5",
160                   EXT+"/include",
161                   EXT+"/include/GL",
162                   EXT+"/include/freetype2",
163                   "modules/cealign/src",
164                   "modules/cealign/src/tnt",
165                   "generated/include",
166                   "generated/src",
167                   ]

それからPmwはソースをダウンロードしてきて入れた。なくても動くと思うが、import errorが出るので気持ち悪かったから後から入れておいた。

ExpressでOpenID認証

イントラにOpenIDを入れたので認証のことを考えなくてもよくなって快適なので、色々作っている。

ちょっとsocket.ioを使いたかったので、Expressでopenid認証させるサンプルを書いてみた。node-openidを使っている。openid.ne.jpのID使って試してある。mixi-openidは動かなかったし、facebookとgoogleのopenidはドキュメントの場所がよくわからなくてイラッと来てやめた。

app.coffee

authenticateっていうパスにアクセスするとopen-id認証してverifyにリダイレクトされてくるようになっている。

express = require("express")
routes = require("./routes")
openid = require('openid')
url = require('url')
querystring = require('querystring')
relyingParty = new openid.RelyingParty(
  'http://localhost:3000/verify',
  null,
  false,
  false,[])

app = module.exports = express.createServer()
app.configure ->
  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", ->
  app.use express.errorHandler(
    dumpExceptions: true
    showStack: true
  )

app.configure "production", ->
  app.use express.errorHandler()

app.get "/", routes.index

app.get "/authenticate", (req, res) ->
  identifier = req.query.openid_identifier
  relyingParty.authenticate identifier, false, (error, authUrl) ->
    if error
      res.send "Authentication failed: " + error
    else unless authUrl
      res.writeHead 200
      res.send "Authentication failed"
    else
      res.redirect(authUrl);

app.get "/verify", (req, res) ->
  relyingParty.verifyAssertion req, (error, result) ->
    if not error and result.authenticated
      res.send 'Success :)'
    else
      res.send 'Failure :('

app.listen 3000
console.log "Express server listening on port %d in %s mode",
  app.address().port, app.settings.env

view/index.jade

formを追加しただけ

h1= title
p Welcome to #{title}

form(method="get", action="/authenticate")
  p Login using OpenID
  input(name="openid_identifier")
  input(type="submit", value="Login")

イラッと来るのはsnow leopardにあげたらmacがやたらと重くなった部分も多い。さすがに4年も経つのでそろそろ買い換えてもいいかなと思ったりするところではある。

THE AGONY & THE ECSTASYはアッパー

みんな大好きHIGH CONTRASTはリキッドファンクなアゲ目なノリですね。

ProductName THE AGONY & THE ECSTASY
HIGH CONTRAST
HOSPITAL RECORDS / 1877円 ( 2012-02-27 )


EPとかコンピで聴くとよいけど、アルバムで何曲も聴くのはちょっと辛いかなぁ。

個々の曲は★4が多くてクオリティが高いんだけど、自分の場合は上がったテンションが持続しないので、上がった状態が続くとすぐに疲れちゃうんだよね。

  • The Agony & The Ecstasy (feat. Selah Corbin)
  • The First Note Is Silent (feat. Tiesto & Underworld)

は名曲ですね。

ピタゴラ装置DVDブック(3)

欲しい

ProductName ピタゴラ装置DVDブック(3)
教養
ポニーキャニオン / 2228円 ( 2011-11-25 )


CoffeeScriptのsplatsの挙動がわからないと思ったがやっぱわかった。

コッココッココココココッヒーな脳になってます。

splatsとはこれです。

最大値を返す関数を例にとります。

まずはNode.jsで

> Math.max(1,9,7,4,2,6)
9
> Math.max([1,9,7,4,2,6])
NaN
> Math.max.call(null,1,9,7,4,2,6)
9
> Math.max.apply(null,[1,9,7,4,2,6])
9

これはOKですね。同様にcoffeeでも

coffee> Math.max 1,9,7,4,2,6
9
coffee> Math.max.call @, 1,9,7,4,2,6
9
coffee> Math.max.call null, 1,9,7,4,2,6
9
coffee> Math.max.apply @, [1,9,7,4,2,6]
9
coffee> Math.max.apply null, [1,9,7,4,2,6]
9
coffee> Math.max.apply [1,9,7,4,2,6]
-Infinity
coffee> Math.max.apply()
-Infinity

最後の2つは第一引数にthisもnullも入れてないからですね。

さてsplatsを使います。

coffee> ary = [1,9,7,4,2,6]
coffee> Math.max ary...
9

なんでMath.max @, ary...じゃないのよ?と思ったがエントリ書いてたら理解してしまった。

coffee> Math.max.call @, ary...
9

こういうことね。

ProductName みいつけた!ぬいぐるみM コッシー

セガトイズ / 2623円 ( 2010-04-30 )


ホウレンソウは暗に指示は明に

「テクノロジーを駆使して、従来のホウレンソウをface-to-faceの同期が必要な作業から引き剥がそうよ、そうすれんば効率が上がるよね」と「イマドキのコミュニケーションは明示的に指示しないとだめだよ」いう内容。

ProductName ホウレンソウはいらない!―ガラパゴス上司にならないための10の法則
本田 直之
日本経済新聞出版社 / 1470円 ( 2011-11-10 )


「繰り返し行われる」ということはパターン化できるということですから、システム化したり仕組み化していくことが可能なわけです。

とあるように、仕組み化されたものをうまく取り入れる能力、仕組み化できる能力があるかないかで、定型業務をこなす効率が全然ちがいますね。

メールベースの問題

  1. 誰に何を振ったか管理しにくい
  2. 進捗状況がわかりにくくチェックできない
  3. スケジュールと連動できないので、忘れるなど抜けをチェックできない

まぁ、ココらへんをどうにかしようと涙ぐましい努力をするわけで、送信メールのコピーを振った人の名前のフォルダで管理してみたりとか、締め切りを設定してみたりとか、件名に進捗状況なんかを入れてみたりとか。それに比べてredmineなんかは快適だと思う。

いちばん非効率なミーティングは、報告やお知らせをするだけのミーティングです。

これも、非常に同意する。face-to-faceのホウレンソウは確かに要らないとおもう。会議は事前に資料配ってアジェンダ決めてあるんだから、質疑から入るのが理想だと思っている。逆にそういう会議の設定形態じゃないと基本的に参加しないルールにしているが、それで困ったことは殆ど無い。

一方で、最近はインフラ構築もやっているので、質疑から始まれるように仕組み化したいと思っている。そのためには報告の粒度をもっと細かく、週単位で報告が自動的に上がるようにする必要があるかなぁと。

できる2割で会社全体を引っ張っていくのはなかなか難しいため、その2割がどちらにも属さない6割の社員をうまく引っ張ってくれるような形にしたほうが効率がいいのです

これは組織依存だよなと思う。上の方の2割をつまんで引っ張ると、その下がついてこれなくてプチンと切れてしまうこともあるし、うまくついてくることもある。一方下の2割を押してボトムをあげようとしてもびくともしないこともあるし、思ったようにレベルが上がることもある。これはトップダウンがうまくいく時も、ボトムアップがいいほうもある。

ただ、どういう時にどういうやり方がうまくいくのは、その時の雰囲気とか、キーパーソンに訴求できるかにかかっているけどじつはよくわからん。キーパーソンもコロコロ変わるからなぁ、意外な人が先導してくれたりするし。だから、うまくいかなかったからとあまり悲観的になりすぎず、折を見て再チャレンジすることにしている。

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'