Haskellでオイラー法を実装する

オイラー法とはあれです、常微分方程式解くやつ。

これをHaskellで実装してみた。下の二行。

euler h f = euler'
    where euler' = (f 1.0 0.0): zipWith (+) euler' [h*y| y <- (zipWith f euler' [h*x| x <- [1..]])]

f = xにすればx = e**tが解になるので。

f _ 0.0 = 1.0
f x t = x

として解いてみる。

*Main> euler 0.00001 f !! 100000
2.7182510547639454

あんま刻み幅を小さくしすぎるのはだめ。

*Main> euler 0.000001 f !! 1000000
*** Exception: stack overflow

AuthKitでSQLAlchemyを使う

pylons bookの19章を参照。

ProductName The Definitive Guide to Pylons
James Gardner
Apress / ¥ 4,506 ()
在庫あり。

from simplesite.model import meta
meta.metadata.bind = meta.engine

をいまいちきちんと理解できてない。

追記 100130

model/meta.pyをみたら

"""SQLAlchemy Metadata and Session object"""
from sqlalchemy import MetaData
from sqlalchemy.orm import scoped_session, sessionmaker

__all__ = ['Session', 'engine', 'metadata']

# SQLAlchemy database engine. Updated by model.init_model()
engine = None

# SQLAlchemy session manager. Updated by model.init_model()
Session = scoped_session(sessionmaker())

# Global metadata. If you have multiple databases with overlapping table
# names, you'll need a metadata for each database
metadata = MetaData()

ってなってるだけだった。

Real Life Is No Cool / Lindstrom & Christabelle

若干 No Coolだったというか、もうひとつメランコリック感が足りなかった

ProductName Real Life Is No Cool
Lindstrom & Christabelle
Smalltown Supersound / ¥ 1,820 (2010-01-19)
通常1~3週間以内に発送

こっちのほうが、、、

ProductName Reinterpretations
Lindstrøm & Prins Thomas
Eskimo / ¥ 1,724 (2007-06-05)
在庫あり。

Mighty Girlは良いですな。

SQLAlchemyのDeclarative APIの使い方

SQLAlchemy 0.5から使えるようになったDeclarative APIはマッパーとテーブルとクラスを一度に定義するものらしい。

なのであとはengineをバインドすればよろしくやってくれる。

上の例だと

import datetime
from sqlalchemy import schema, types, orm

metadata = schema.MetaData()

def now():
    return datetime.datetime.now()

from sqlalchemy.ext.declarative import declarative_base

# Assign the same metadata object we created earlier.
Base = declarative_base(metadata=metadata)

# We still need the pagetag table because we don't want to explicitly define a
# Pagetag class but still
# need to specify the table in the relation between pages and tags.
pagetag_table = schema.Table('pagetag', metadata,
    schema.Column('id', types.Integer,
        schema.Sequence('pagetag_seq_id', optional=True), primary_key=True),
    schema.Column('pageid', types.Integer, schema.ForeignKey('page.id')),
    schema.Column('tagid', types.Integer, schema.ForeignKey('tag.id')),
)

class Page(Base):
    __tablename__ = 'page'

    id = schema.Column(types.Integer,
        schema.Sequence('page_seq_id', optional=True), primary_key=True)
    content = schema.Column(types.Text(), nullable=False)
    posted = schema.Column(types.DateTime(), default=now)
    title = schema.Column(types.Unicode(255), default=u'Untitled Page')
    heading = schema.Column(types.Unicode(255))
    comments = orm.relation("Comment", backref="page")
    tags = orm.relation("Tag", secondary=pagetag_table)

class Comment(Base):
    __tablename__ = 'comment'

    id = schema.Column(types.Integer,
        schema.Sequence('comment_seq_id', optional=True), primary_key=True)
    pageid = schema.Column(types.Integer,
        schema.ForeignKey('page.id'), nullable=False)
    content = schema.Column(types.Text(), default=u'')
    name = schema.Column(types.Unicode(255))
    email = schema.Column(types.Unicode(255), nullable=False)
    created = schema.Column(types.TIMESTAMP(), default=now())

class Tag(Base):
    __tablename__ = 'tag'

    id = schema.Column(types.Integer,
       schema.Sequence('tag_seq_id', optional=True), primary_key=True)
    name = schema.Column(types.Unicode(20), nullable=False, unique=True)

page_table = Page.__table__

これをmodel.pyとかしといてpython対話環境で

>>> execfile('model.py')
>>> from sqlalchemy.engine import create_engine
>>> engine = create_engine('sqlite:///test.db')
>>> metadata.bind = engine
>>> metadata.create_all()

とやってengineをバインドすればsqliteのファイルが作られる。metadataのところはテーブルからもアクセスできて

>>> page_table.metadata.bind = engine
>>> page_table.metadata.create_all()

でも同じことができる。

sqlite> .schema
CREATE TABLE comment (
    id INTEGER NOT NULL, 
    pageid INTEGER NOT NULL, 
    content TEXT, 
    name VARCHAR(255), 
    email VARCHAR(255) NOT NULL, 
    created TIMESTAMP, 
    PRIMARY KEY (id), 
     FOREIGN KEY(pageid) REFERENCES page (id)
);
CREATE TABLE page (
    id INTEGER NOT NULL, 
    content TEXT NOT NULL, 
    posted TIMESTAMP, 
    title VARCHAR(255), 
    heading VARCHAR(255), 
    PRIMARY KEY (id)
);
CREATE TABLE pagetag (
    id INTEGER NOT NULL, 
    pageid INTEGER, 
    tagid INTEGER, 
    PRIMARY KEY (id), 
     FOREIGN KEY(pageid) REFERENCES page (id), 
     FOREIGN KEY(tagid) REFERENCES tag (id)
);
CREATE TABLE tag (
    id INTEGER NOT NULL, 
    name VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id), 
     UNIQUE (name)
);

Linuxカーネル2.6解読室 Part I

カーネルプリミティブ

ProductName Linuxカーネル2.6解読室
高橋浩和,小田逸郎,山幡為佐久
ソフトバンククリエイティブ / ¥ 5,670 ()
在庫あり。

「まだまだ伸びる農産物直売所」を読んだ

まぁ読んだ。

ProductName まだまだ伸びる農産物直売所―地域とともに歩む直売所経営
田中 満
農山漁村文化協会 / ¥ 1,680 ()
通常2~5週間以内に発送

  • 直売活動の形態と展望
  • 直売所の野菜は新鮮で日持する
    • (というイメージ? それとも願望?)
  • 直売所の魅力はスーパーでは見かけない珍しいものが帰ること

結局、客が人につくんであれば最終的に直売所はアンテナショップというか見本市とかそういう形になるんではなかろうか?または、個人の直売の集合としての直売所。

そうであれば、付加価値をつけたモノを売って、そのお土産としての商品的な意味合いの野菜。biodeliとか伽羅とか。

鮮度にこだわるんであれば、最終的には通販形式でいいし。そういったあたりがすっきりしなかった。

むしろ「農家がいいもの売る方向で調整しとるよ」みたいなそんな話が多かったかな。地域で団結して頑張ってます的な。な感じなので、消費者動向先取りっていう感じの本ではなかったかな。

それなりに面白かったけど、付加価値をどうつけるかっていう部分は物足りなかった。

エラトステネスのふるい

C/C++の課題丸投げ

sieve (x:xs) = x : sieve [y|y<-xs,y `mod` x /= 0]
prime = sieve [2..]

「入門Git」を読んだ

単に手っ取り早く使いたい場合には入門gitでもよいと思うが、版管理の思想とかを学ぶのにはこっちのほうがおすすめ。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / ¥ 2,310 ()
在庫あり。

1-5章と16章を丁寧に読んで、あとは軽く流す程度。細かいところは使いながら読み直す予定。

あとはこの本読んで、創薬プロジェクトにおけるバージョン管理みたいなのを強烈にイメージ出来たのが収穫であった。

バージョンがツリーごとに並んでないで単なる集合として表現されているのが特許だと考えれば化合物特許解析というのは化合物集合を歴史として並べ直すことなんだよなぁとつくづく感じた。

そういうエントリを書こうと思っているんだけど、図とか作るのが面倒で放ってあるのでそのうち文章にまとめたい。

HaskellでGraphviz

fglを使えばよい。

import Data.Graph.Inductive
import Data.Graph.Inductive.Example
import Data.Graph.Inductive.Graphviz

m486 :: NodeMap String
m486 = fromGraph clr486

t1 :: Gr String ()
t1 = insMapEdge m486 ("shirt", "watch", ()) clr486

t2 :: Gr String ()
t2 = insMapEdge m486 ("watch", "pants", ()) t1

main = do putStrLn $ graphviz t2 "test" (0,0) (0,0) Portrait

これはDOT言語で出力される。

digraph test {
    margin = "0"
    page = "0.0,0.0"
    size = "0.0,0.0"
    rotate = "0"
    ratio = "fill"
    1 [label = "shorts"]
    2 [label = "socks"]
    3 [label = "watch"]
    4 [label = "pants"]
    5 [label = "shoes"]
    6 [label = "shirt"]
    7 [label = "belt"]
    8 [label = "tie"]
    9 [label = "jacket"]
    1 -> 4
    1 -> 5
    2 -> 5
    3 -> 4
    4 -> 7
    4 -> 5
    6 -> 3
    6 -> 8
    6 -> 7
    7 -> 9
    8 -> 9
}

pngで出力したいときにはdotに渡す。

$ ./gvtest | dot -Tpng > gvtest.png

gvtest

参考

来来亭

久々の来来亭。普段は混んでいるので避ける。京都なラーメンが食べたいときだけ。

1264327192 1264327186

薄切りの肉が好き。新福とか懐かしい。