Sphinxで日本語pdfをつくる

rst2pdf で reStructuredText から PDF を生成するで日本語pdfが生成できるようになってもSphinxでは

[ERROR] pdfbuilder.py:120 BuildEnvironment instance has no attribute 'modules'
....
if self.config.pdf_use_modindex and self.env.modules:
AttributeError: BuildEnvironment instance has no attribute 'modules'
FAILED

とかいうエラーが出る(Sphinx1.02,1.03 + rst2pdf-0.15)

この場合にはrst2pdfの新しい版をsvnでインストール(0.16.dev-r2311をいれた)

あとはSphinxで日本語PDFを生成するの通りにやればうまくいく

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / ¥ 3,780 ()
在庫あり。

中身は全然進んでないのに、出力だけは色々できるようになった ;-)

Flaskでprocessing.jsを使う

staticディレクトリにprocessing.jsを置いて

from flask import Flask

app = Flask(__name__)

@app.route("/")
def processing():
    response = """
<html>
<head>
<title>Processing Sample</title>
<style  type="text/css">
body {margin:0; padding:0;}
</style>
<script type="text/javascript" src="static/processing-0.9.7.js"></script>
<script type="text/javascript">
window.onload = function() {
  var canvas = document.getElementsByTagName('canvas')[0];
  var codeElm = document.getElementById('processing-code');
  var code = codeElm.textContent || codeElm.innerText;
  Processing(canvas, code);
};
</script>
<script id="processing-code" type="application/processing">
void setup()
{
  size(window.innerWidth, window.innerHeight);
  background(102);
  smooth();
}

void draw() {
if (mousePressed == true) {
    variableEllipse(mouseX, mouseY, pmouseX, pmouseY);
    }
}

void variableEllipse(int x, int y, int px, int py)
{
  float speed = abs(x-px) + abs(y-py);
  stroke(speed);
  fill(random(0,255),random(0,255),random(0,255))
  ellipse(x, y, speed, speed);

}
</script>
</head>
<body>
<div>
<canvas width="400" height="400"></canvas>
</div>
</body>
"""
    return response

if __name__ == "__main__":
    app.run()

processing.js

参考

ProductName Built with Processing[Ver. 1.x対応版] -デザイン/アートのためのプログラミング入門
田中 孝太郎,前川 峻志
ビー・エヌ・エヌ新社 / ¥ 2,940 ()
在庫あり。

Visualizing Data chapter 7 (TreeMap)

processingを使ってデータの視覚化をするための基礎的な本。なのでprocessingでアート的なことをやる本とはちょっと違うかも。

ProductName Visualizing Data
Ben Fry
Oreilly & Associates Inc / ¥ 3,852 ()
在庫あり。

スキャッタープロットとかネットワークを題材に「より効率的にデータを表現する」ということを考えていく。僕は、データとヒトの目という中途半端なデバイスをうまくつなげるミドルウェアのようなものはどういうものが良いのかということを考えていくための教科書的なものと位置づけて読んでる。

7章はズームして掘っていけるようなTreeMapを実装する。TreeMapならMatplotlibでももちろんできるけど、インタラクテイブ性をもたすならProcessingがいいかも。 あとこの本はコードの断片の説明というかたちが多いので別途サンプルコードをダウンロードしながら読む必要がある。 僕はjavaとprocessingがまだ拙いので、単に写経していくだけでは動かず、悩むことが多かったため、なかなか読み進められていないが、良書の予感はする(びしびしと)。

pyprocessing

pythonでprocessingっぽいことをやろうというプロジェクトが立ち上がってた。

pyprocessing

楽しみ。

bruceとかでかっこいいプレゼンが出来るようになると嬉しい。

「ブックビジネス2.0」を読んだ

電子書籍が普及しまくったら図書館ってどういう位置づけになるの?とかそういう疑問があって電子書籍やビジネスに関する本なども読んでいる。

というより、論文がpdf化している割には使いづらいのが気に入らない。doiとかつけといてアトミックな単位がそこか?とか思っている。例えばReal World Haskellみたいにパラグラフ毎にコメントを入れられるようにして、フリーズした状態じゃなくてもっと流動的な知識のストレージの受け皿みたいなのが、必要なんじゃないかなぁと。そういったCGM的なインフラって出来ないもんかね?

ProductName ブックビジネス2.0 - ウェブ時代の新しい本の生態系
岡本 真,仲俣 暁生,津田大介,橋本大也,長尾真,野口祐子,渡辺智暁,金正勲
実業之日本社 / ¥ 1,995 ()
在庫あり。

  • 可処分時間の食い合い
    • アテンションエコノミーとかそういうあたり?
  • デジタル時代の本に対する所有感は「検索できる」ということ
  • アマゾンの読者レビューの問題点
  • 面白い本とは
    • 読み手の読書の動機づけが充分
    • 未知の内容が書かれている
    • 難易度や趣味が今の自分に適合する
  • 図書館という仕組みの制度設計が限界を迎えている
  • オペレーティングシステムとしての図書館、アプリケーションとしての図書館
  • ストックフォト業界の行方
  • 利便性が高ければ有料でも
  • コンテンツ優位の時代

igraphを使ってmaximum common substructure(MCS)を求める

MCSを求めるには比較したい二つの化合物のModular Productを求めて、それの最大クリーク探索をすればいい。

Modular Productとは

  • 二つのグラフの属性の対応が同じノードが両方共隣接していてエッジの属性が同じ場合
  • 二つのグラフの属性の対応が同じノードが両方共隣接していない場合

にエッジを張ったグラフ。

これを作ってあとはigraphの最大クリーク探索メソッドで

import openbabel as ob
from igraph import *

sm1 = 'OCC(N)=O'
sm2 = 'O=CC(N)=O'

obc = ob.OBConversion()
obc.SetInAndOutFormats('smi','smi')

source = ob.OBMol()      
obc.ReadString(source,sm1)
source_atoms = [a for a in ob.OBMolAtomIter(source)]

target = ob.OBMol()      
obc.ReadString(target,sm2)
target_atoms = [a for a in ob.OBMolAtomIter(target)]

pairs = []
for i in range(len(source_atoms)):
    for j in range(len(target_atoms)):
        if source_atoms[i].GetAtomicNum() == target_atoms[j].GetAtomicNum():
            pairs.append((source_atoms[i].GetIdx(),target_atoms[j].GetIdx()))

p = []
for x in range(len(pairs)-1):
    for y in range(x+1,len(pairs)):
        u = pairs[x]
        v = pairs[y]
        if u[0] != v[0] and u[1] != v[1]:
            sb = source.GetBond(u[0],v[0])
            tb = target.GetBond(u[1],v[1])
            if sb != None: sbo = sb.GetBondOrder()
            if tb != None: tbo = tb.GetBondOrder()

            if (sb == None and tb == None) or (sb != None and tb != None and sbo == tbo):
                p.append((pairs.index(u),pairs.index(v)))

g = Graph(p)
mc = g.largest_cliques()
for c in mc:
    print [pairs[i] for i in c]

実際にはline graph(エッジとノードを入れ替えたグラフ)のModular Productをもとめてクリーク探索したほうが計算量がかなり減るらしい。

が、今回はやっていない。

igraphでクリーク探索

igraphはRとPythonのbindingがあるのにチュートリアルがほとんどなさげなので、ネットワーク分析の本があると手っ取り早く知れて良い。

ProductName ネットワーク分析 (Rで学ぶデータサイエンス 8)
鈴木 努
共立出版 / ¥ 3,465 ()
在庫あり。

クリーク探索

こんなネットワークからクリークを探してみる

cliquetest

g <-matrix(c(0,1,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,
             0,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,
             0,1,0,0,0),nrow=7,ncol=7,byrow=TRUE) 
a <- graph.adjacency(g)
maximal.cliques(a)
[[1]]
[1] 0 1 2

[[2]]
[1] 1 6

[[3]]
[1] 0 2 4

[[4]]
[1] 2 3 4 5

[[5]]
[1] 3 6

追記 100818

Pythonの場合

a = [[0,1,1,0,1,0,0],
[1,0,1,0,0,0,1],
[1,1,0,1,1,1,0],
[0,0,1,0,1,1,1],
[1,0,1,1,0,1,0],
[0,0,1,1,1,0,0],
[0,1,0,1,0,0,0]]

g = GraphBase.Adjacency(a,mode=ADJ_UNDIRECTED)
g.maximal_cliques() # [(0, 1, 2), (1, 6), (0, 2, 4), (2, 3, 4, 5), (3, 6)]
g.largest_cliques() # [(2, 3, 4, 5)]

amen alley

hospitalのpodcast聴いてて amen alley /danny byrdやばすぎ!とか思ったら、すでにyoutubeにあがっていた。

これいつリリースされんだろかね。

昔のでも聴いとくか。

ProductName スーパーサイズド
ダニー・バード,ケビン・マーク・トレイル,T-レイシー,レッド
Third-Ear JPN Ltd. / ¥ 2,415 (2008-05-28)
在庫あり。

MCSSTanimotoで組んだネットワークのメリット

MCSSTanimotoで組んだネットワークのメリットはなんといってもエッジの属性にMCSの情報(smilesとかInChi)をのっけられることであろう。

mcs-net

import sys
from Gaston import MCSSTanimoto,Gaston
import openbabel as ob

obc = ob.OBConversion()
obc.SetInAndOutFormats("sdf", "smi")

input = "pc_sample.sdf"
mol = ob.OBMol()
next = obc.ReadFile(mol,input)
mols = [mol]

while next:
    mol.StripSalts(14)
    mols.append(mol)
    mol = ob.OBMol()
    next = obc.Read(mol)

mols = mols[1:11]

for i in range(len(mols)-1):
    for j in range(i+1,len(mols)):
        sys.stdout.flush()
        mcs = MCSSTanimoto(mols[i],mols[j])
        if mcs.score() > 0.2:
            print "%s\t%s\t%s\t%s\t%2.3f" % (mols[i].GetTitle(), "mcs", \
            mols[j].GetTitle(), obc.WriteString(mcs.mcs).split()[0], mcs.score())

でも、実際に組んでみたら、解釈が意外に難しそうなことに気がついた。MCSSTanimotoのアルゴリズム自体が問題なのかもしれない。

MCSよりはmolblaster的に細切れにしてみて最頻出のフラグメントからネットワークを組んでいくか、ありがち置換基の定義済みテーブルを使って類似性の高い置換基動どうしをつなぐという経験ベースのアプローチのほうが直感的かもしれないなぁ。