DBCLSのメモ

バイトの生物系のお話。
僕自身、高校時は物理/化学だったので、生物は中学校レベルです。

DNA

A,G,T,Cの四種類の塩基が有機的に結合した二重らせん構造。

DN

DNA(設計図) -> タンパク質による変換 -> アミノ酸(臓器など)

RNA中ではT(チミン)がU(ウラシル)に対応



元 ATGCATGCAAAA
相方 TACGTACGTTTT
転写 AUGCAUGCAAAA

Blast

DNAの部分一致を見つけてくるライブラリ

特定の塩基の並びで、タンパク質の読み取りに使われるstartのマーカーとendのマーカーがある。が、その間全ての塩基が実際に使われるわけではない。部分部分がスキップされる。(アセンブラのサブルーチンのような)
実際に使われている部分はタンパク質に渡される際に抽出できて、その差分から調べることができる。
具体的には、Aシーケンスに一致するBシーケンスの部分をプロットすると、線形的にBシーケンスで使用されているDNAの部位が浮かび上がる。
(淡水魚と海水魚を比較すると、塩分の排出に使われる部分が特定できたり)

ソフトウェア

オープンソースの解析ソフトウェアが大量にある。解析用の素材も。ただし、その資料がまとまっているとは言い難く、その統合を目指すのがDBCLS。

biopythonを使ってみる

Python用のバインディングがあるらしいので、どうせならPythonでやる。

easy_install biopython

from Bio.Seq import Seq
from Bio.Alphabet import IUPAC

my_alphabet = IUPAC.unambiguous_dna

my_seq = Seq('ATGCATGCAAAA',my_alphabet)

my_rna_seq = my_seq.transcribe()
print my_rna_seq.tostring()

rev_dna_seq = my_rna_seq.back_transcribe()
print rev_dna_seq.tostring()

Titaniumでゲーム制作中

Titaniumで簡単なローグライク的な何かを作っている


枠組みだけできた。といってもアクションみたいなものを作るつもりはないので、Pythonなのは記述が容易という、それだけのメリットです。

class Picture(Sprite):
    def __init__(self,fpath,clip=[0,0],size=32):
        Sprite.__init__(self)
        self.im=document.createElement("img")
        self.im.src=fpath
        self.__clip=clip
        self.__size=size
    def render(self,ctx,sx,sy,dx=15,dy=15):
        ctx.drawImage(self.im,
                      self.__size* self.__clip[0], self.__size* self.__clip[1] ,
                      self.__size,self.__size,
                      sx,sy,dx,dy )

Javascriptから叩くとうまくいくのだけど
Picture("img/iconset.png").render(ctx,10,10); //=>ok

だけど同じものをPythonから叩くとダメ
INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.


あんまりcanvasの必要性を感じていないのでHTML(CSS3)で全部書いた方が楽なのかなー
アニメーションは Worker Thread / setInterval に投げてPythonはひたすら処理を書くのがよさげ


グラフィックに拘るなら gamequeryというものが気になってます。Blenderなんかのモデルをインポートできるらしい。
gameQuery - a javascript game engine with jQuery


シーン管理や入出力なんかは自分で全部書いてしまったので、今更他人のフレームワークを使うのは面倒なのだけど、使えるソースは積極的に取り込んでいきたい。

PythonでGUIやるならTitaniumがよさそう ~ Twitterクライアント作ってみた

この記事読んで以来、ずっとTitaniumをいじっていました
Ruby,Python,PHP,JavaScriptでマルチプラットフォームなデスクトップアプリを簡単に作成する Appcelerator Titanium Desktop - 仙台 Rails Vim JavaScript社長

Titanium Desktopの何がすごいって、Webkitベースなのでhtml/css/javascriptweb標準技術が使えて、さらにはKrollというライブラリがそれぞれの言語の仲立ちをし、名前空間を共有しそれぞれのライブラリを呼び出せるそうな。なにそれきもい。
僕は完全に が使えるwebkitとしか見てなくて、GUIライブラリが貧弱なPythonだと、十分有力な選択肢に入ると思われます。一度作ったものはクロスブラウザで使えるし。

簡単なTwitterクライアントを作ってみた

あっさりできました。ここにおいてるのは簡易版で、いろいろ機能を追加してる開発板はgithubに置いてます
mizchi's twaan at master - GitHub

ちなみに Titanium固有のAPIは全く使ってません。ファイルアクセスとか、pythonからやればいいじゃない。


要:twitter-python simplejson
python-twitter - Project Hosting on Google Code


tw.py

#encoding:utf-8
import twitter

localStorage.id="your_twitter_username"
localStorage.password="your_password"

tw=twitter.Api(localStorage.id,localStorage.password)
id_last_tl=0 
twul = document.getElementById("twitter")

def update():
    tl = tw.GetFriendsTimeline(count=150,since_id=_id_last_tl)
    for i in tl[::-1]:
        node=document.createElement("li")
        node.innerHTML=u'<img src="%s"/><span>%s</span><span>%s</span>' %(i.user.profile_image_url,i.user.screen_name,i.text)
        twul.insertBefore(node,twul.firstChild)

    global _id_last_tl
    _id_last_tl=tl[0].id

index.html

<!DOCTYPE html>
<html>
  <head>
    <script type="text/python" src="tw.py" />
  </head>
  <body>
     <button onclick="update()">更新</button>
     <ul id="twitter" />
  </body>
</html>


配置はこう

Resources
  - index.html
  - tw.py
  - twitter.py
  - simplejson


行儀がいい書き方かわからないのですが、Pythonから縦横無尽にjsの関数を呼び出してDOMを叩いています。
localStorageの保存先は Macだと /Library/Application\ Support/Titanium/プロジェクト とかどこか。
何ができるかはソースで雰囲気はわかると思います。

利点

  • とにかくPythonでごりごり書けるのが素敵
  • 標準技術の最新仕様でGUIを書ける!
  • ウェブ経由のインストーラを自動的に作ってくれる

欠点

  • 別言語のオブジェクトを参照するときの挙動がいまいちわからない
  • ドキュメントが整理されてない
  • 日本語での情報が極端に少ない

参考:Appcelerator Codestrong - Titanium Desktop APIs


そういえばpythonから canvasのコンテキストをとってこれなかった
次の式で getContextがないと言われる
ctx = document.getElementById('main').getContext('2d')

undohist.elとundo-tree.elがあわさり最強のアンドゥにみえる

undohist.el + undo_tree.elでアンドゥが超安心
使ってて結構LifeChangingだなーと思ったので紹介しておく


http://cx4a.org/pub/undohist.el
undo-tree.el の導入 - とりあえず暇だったし何となく始めたブログ

いつものように両方突っ込んでrequireしてください


undohist.el そのバッファを閉じてもアンドゥ情報を保持
undo-tree.el undoの分岐を保持し、undo分岐のTreeをプレビューしながらみることができる
= undo情報をプレビューしながら無限に遡れる!


残念ながらundo-treeの分岐までは保存されてませんでした。誰か作ってくれると嬉しいですね!僕は寄生なのでelisp一切書けません!簡単な関数を当てたりするだけで、そのうち勉強したい、elisp...

※ undohistはemacs以外の環境でファイルを開くとundo情報が消去されてしまうそうですが、よく訓練されたEmacsenの皆様方ならそんな心配は無用でありましょう

CSSセレクタからHTMLを展開できるZen-Codingをいれてみた

あんまりHTMLのマークアップはしないのだけど、話題的にもHOTだし、いれといて損はないだろうと突っ込んでみた
ZenCodingはCSSセレクタのような記述からそのHTMLを吐き出すプラギンで、これはemacs実装
他にTextMateとかCodaとかvim版がある


動作例 http://www.youtube.com/watch?v=u2r8JfJJgy8

ここからダウンロード
例のごとくpathの通ったところに保存 ~/.emacs.d/elisp など

.emacs に追記

(require 'zencoding-mode)
(add-hook 'sgml-mode-hook 'zencoding-mode)
(define-key zencoding-mode-keymap "\C-z" 'zencoding-expand-line);;デフォルトだとC-Return


div#hoge のような記述をして、hogeの末尾にカーソルを揃えてC-Return すると

<div id="name">
</div>

このように展開される
こんなこともできるらしい

div#news.module>(div.header+div.body>ul>li#item-$*5)
    <div id="news" class="module">
       <div class="header">
       </div>
       <div class="body">
          <ul>
             <li id="item-1">
             </li>
             <li id="item-2">
             </li>
             <li id="item-3">
             </li>
             <li id="item-4">
             </li>
             <li id="item-5">
             </li>
          </ul>
       </div>
    </div>


個別のオプションなんかは次の解説がわかりやすかった
知らない人は損してる?コーディングが3倍速くなるZen-Codingを導入してみた - EC studio デザインブログ
参考:EmacsWiki: Zen Coding

Python+iPython+Emacsの設定 (Mac)

今まで何を思ったかipythonはwindows用のpythonだと思っていて、調べたところより便利なpythonシェルだということが判明したので入れてみた。
iPythonには基本的なunixコマンドが移植されていて、それでwindowsでcygwing代わりにiPython起動してる人が多いらしい。それで勘違いしたんだろう。たぶん。

導入

iPython導入の解説はたくさんあったけど、easy_installからいれるのが迷わなくてよかった。

sudo easy_install ipython

rc

pythonインタプリタは起動時にbashで指定されたPYTHONSTARTUPのpythonを読んでくれるのだけど、iPythonは別にrcファイルを持っていて、そっちを設定してやらなきゃいけないっぽい
~/.ipython/ipythonrc の末尾に以下を記入

execfile ~/.pyrc

Python基礎文法最速マスター - D++のはまり日誌で紹介されてたseeライブラリが便利だったので、指定しておく。

~/.pyrc

from see import see
import os,sys

もっと詰め込んでもいいんだけど、頻繁に起動するものを重くするのも嫌なので。
ipython -p math などで個別に読み込むプリセットを指定できるみたいだ。

Emacs上で iPython

python-mode(python.el)ではないpython-mode(python-mode.el)をいれる。

http://launchpadlibrarian.net/21781107/python-mode.el
http://ipython.scipy.org/dist/ipython.el

.emacs.elに追記

(autoload 'python-mode "python-mode" "Python Mode." t)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))
 
(setq ipython-command "/usr/local/bin/ipython")
(require 'ipython)

これで pythonモードで C-c!すれば ipythonが起動する。

これから

pymacsを使った補完、pycomplete ropemacs pysmell を三つとも試したんだけど、どれも上手くいかなかった。現状どうしようもないので放置する
viper-modeでノーマルモードに戻るときにIMをオフにしたいんだけど、いい方法ないかなぁ。

(setq ipython-command "/usr/local/bin/ipython")
(require 'ipython)

思考停止Macportsでmemcached あとPythonから叩く

ぶっちゃけ作業をはじめるまで memcached が何か知らなかったのだが、なんとなくインメモリデータベース的な何かだと思っていた。テンポラリーなデータ置き場。
いまでも理解が微妙なところなのでmemcachedを知り尽くす:第1回 memcachedの基本|gihyo.jp … 技術評論社をあとで読んどく。


Macmemcachedを使う。今BOTを作っていて本番環境はUbuntuなのだが、Macでもごにょごにょするために portsからインストールしてみた。
とはいっても、調べると面倒臭い手順を公開してるばかりのページがヒットして、カッとして sudo port install memcached したら通ってしまった。(悪い癖なのでそのうちどうにかしないと)


起動時の登録は以下を参考に。
ベイエリア情報局: Mac OS X に memcached をインストールして launchd で自動起動するようにした
~/Library/launchAgents/memcached.plist として以下を保存

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
        <key>Label</key>
        <string>memcached</string>
        <key>OnDemand</key>
        <false/>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/memcached/bin/memcached</string>
                <string>-m 32</string>
        </array>
</dict>
</plist>

% launchctl load -w Library/LaunchAgents/memcached.plist
% launchctl list
memcached
% ps x|grep memcached
6286 ?? Ss 0:00.07 /opt/memcached/bin/memcached -m 32


Pythonから使いたかったので Python-memcached を easy_install で導入

sudo easy_install memcache

python-memcached: Python API for memcached


とりあえずハローワールド的な

import memcache 
mc = memcache.Client(['localhost:11211']) 
mc.flush_all() # データをリセット(全部消える)
mc.set('key', 'value') # 'key'に'value'をセット
mc.get('key') # 'key'の値を取り出す

参考:pythonでmemcachedを使ってみた | Ken's blog

当たり前ですが この後にflush_all()すると'key'の値は消えます