Entity/Model実装メモ。

タイトルの通りEntity/Modelの実装上のメモ。ORMを作ってるわけではないけど、一部似たようなものを作ってる。

書籍

エリック・エヴァンスの『ドメイン駆動設計』を読み始めた。好感触。

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

PyConJP2014一日目と近況

ざっくりと。だらだらと書いとく。

PyConJP 2014

駅で、知人と偶然合流したので、話しながら会場へ向かった。
パトロンチケットで参加。

セッション

Pythonの実装系総ざらい (ja)

本日一番の目的id:Ehrenさんのセッションに参加。
https://pycon.jp/2014/schedule/presentation/33/

初心者をターゲットにしたPython処理系のさらいだった。

よし、来年もう一度発表を聞く機会がありそう。
あと、id:Ehrenさんが次回のpypy-cha来てくれる予感がする。|д゚)チラッ

その後流れでオフィス・アワーに参加。
残念だったのはセッションにあんなに参加者居たのに、オフィス・アワーに全然人が来なかったこと。もったいない。カジュアルに技術交換する場なのに。

その他セッション関連

今年はどうやらid:methaneさんの熱い内容のセッションがなさそうで残念。たのしみにしてたのに。pymysqlあたりや処理系高速化系のやつとか。

立ち話

みなとまったり立ち話。久々に会う人達ばかりだった。
近況や技術話などなど。

ジョブボード

ジョブボード前で物色してたら、モバイルファクトリーを勧められるなど。
どうもオプトグループにお世話になってました。こんにちわこんにちわ。

オライリーさん出店のショップで

購入done
ぁっぉさんからサインもらった。読み始めてる。バーっと飛ばし読みしてるけど、Ellipsisオブジェクト(省略記法は'...')を知らなかったので驚いた。

Python文法詳解

Python文法詳解

同じく購入done
磯さんからサインもらった。まだ読み始めてない。

バッドデータハンドブック ―データにまつわる問題への19の処方箋

バッドデータハンドブック ―データにまつわる問題への19の処方箋

二日目の予定

id:nishiohirokazuの基調講演と@shibu_jpさんのFM-Indexあたりの発表PyNESの発表がお目当て。

朝が早い。

近況

仕事は一段落してて、激務ではなくなった。
Perlです。Perlです。田舎の母へ、僕は元気です。Perlです。
先日は家庭の事情でYAPC::Asiaに出れずに悔いてます。Perlで食ってます。

とりわけAmon2を触る機会が多いか?...な...?

趣味

Cython触ったり、QA、セキュリティ関連のノウハウためてる。もちろんPyPyの動向は追ってる

ファジング

ひとまず下記の本は手を動かしながら読了。Fuzzingフレームワークsulleryの存在を知った。

ファジング:ブルートフォースによる脆弱性発見手法

ファジング:ブルートフォースによる脆弱性発見手法

この技術を使う場面が来るかは未定。現状の習得度もひとまず、頭にインデックス貼られた程度。

Androidのapk

ごにょるノウハウ溜まる

Cython

オライリーのCython本(Early Release版で4章までしか書かれてない本)読了

Cython - O'Reilly Media

まだ、echo serverくらいしか書いてないから次の一歩の課題を検討中。libevent使ってサーバでも書いてみるか。
コード断片はこのあたり。
rokujyouhitoma/cython-traning · GitHub

Pandas

(ry

IPython

(ry

pypy-stmがリリースされたので、STMとGIL周り調べてた

家帰ったら読みなおすための備忘録。

pypyのSTMバージョンが初リリースしたので、その関連でSTMがなぜいるんだっけ?GIL-lessになると何がうれしいの?GILってそもそもなんだっけ?を再キャッチアップ。

以下まとめ。

STM

RubyのGVL(Global VM Lock or Giant VM Lock)

RubyではどうやらGILとは呼ばず、GVLと呼ぶらしい。そしてGVLもGlobal VM LockかGiant VM Lockのいずれかだぞうな。*1
Rubyの公式ドキュメントで記述探したんだけど、"http://docs.ruby-lang.org/ja/2.1.0/class/Thread.html[:title=Threadクラス]"上でしか見当たらなかった。

"パーフェクトRuby"...

技評さんから出てる"パーフェクトRuby"にGVLのこと記載あるかと期待したけど、裏切られた。オライリーさんの"プログラミング言語Ruby"も。
誰かがブログに書いてたけど、Cのコード嫁っていうことなんだろうなぁ*2
Rubyの公式ドキュメント上もThreadクラスに記載がちょっろって載ってるくらいだし。

Perl

いま使ってるPerlがグローバルインタプリタロックの問題をどうしてるのか見当たらなかった。継続調査。

山城さんについて思い返す

第一回チキチキjava-ja ymsr送別会に行ってきた。

先日、知人の山城さんが亡くなった。山城さんについて思い返す。

初めて会ったのはjava-jaが新宿で開催されてた時の懇親会か、BBQやった時のどちらか。間違いなく神奈川のBBQで会ったのは覚えてる。山城さんは子供と遊んでいたのを鮮明に覚えてる。

技術的な懇親会で一緒に飲む機会があった。Rubykaigiの懇親会、渋谷で知人数人で飲んだりもした。

会った記憶で一番鮮明なのは近年行われたjava-ja.childrenとクルーザー貸切東京湾花火大会

人に打ち解けられない私だけど、私のことを山城さんは名前を覚えてくれてて、会うと話しかけてくれた。「ろくじょー。最近どう?」とか。最近だと「人生荒波にもまれている俺」について語ってくれたり、「不格好経営読み終わったしあげよか?」と気を使ってくれていた。

私の結婚祝いに『プログラミング言語の基礎概念』をプレゼントして頂いたのを覚えてる。
彼の誕生日に試しに、『サーバサイドJavaScript』を送ってみた。Amazonウィッシュリストからぽちっとな。山城さんは僕が送ったと気づいたようでわざわざ礼をしてきた。私が贈ったと伝えたのか、山城さんの勘かはわからない。

私には1歳と半年前後の息子がいる。

山城さんは子供がいないけど、java-ja.childrenという集まりに顔を出していた。身近な子持ち家族が参加して一緒に遊ぶ催しだ。そこで息子を抱っこしたり、相手してくれたのを覚えてる。

f:id:rokujyouhitoma:20140216224512j:plain
写真は私の息子を抱く山城さん。

山城さん本人はあまり関係ないが、おもちゃとして息子の身近にいる。

id:daisuke-mさんとのやりとりから、ある買ったおもちゃに『山城さん』と名付けた。完全にねたである。
残念なことに私の息子はその『山城さん』を見ると、避けたり泣いたりする。

f:id:rokujyouhitoma:20140216224034j:plain
私の家における『山城さん』二代目。一代目は今日の掃除で失踪中なので、気が向いたら一代目の写真もあげなおすかも。

また、クルーザー貸切東京湾花火大会の時には船酔いした私に変わって私の息子をあやしてくれてたりした。

こうやって書き出すとそこそこ交流してる。次回もjava-ja.childrenに参加したいなー。また、私の息子と一緒に遊んでほしいなと思っていた矢先に彼が亡くなった。

一報を頂いた時は落ち込んだ。java-jaの忘年会の日で、楽しみにしてた日だった。その日は仕事が手につかなかったのを覚えてる。

山城さんが亡くなってから思うことは、こうやってぽっくり逝くことがあるのは私だってそうだし、身の回りの全ての人がそうだなと。後悔しないようにみなと語り合う機会を作るようにしたいと考えるにいたる。

山城さんはあちらの世界でも楽しくやってそうだから、私が行ったら声をかけてくれるとうれしいな。ありがとう。さようなら。

『Pythonによるデータ分析入門』を献本頂きました

ちょっと早いクリスマスプレゼントを頂きました。こんな歳になってもサンタさんに出会えて感謝です。

表題の通り、オライリー・ジャパン様より献本頂きました。ありがとうございます。縁を感じる本です。

正式名称は『Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理』です。

Pandasのメインコミッターであり原著者のWesMcKinnery氏を初め、翻訳者のみなさん、編集や、この書籍に携わった全ての方々。お疲れ様でした。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

まず、初めに

私自身は、

  1. Pythonはある程度不自由なく触れる。
  2. NumPy, Scipy, Pandasの名称は知っている、ないしは軽く使った程度。適度な興味もある。
  3. Rは使ったことない。
  4. 計算機科学の知識は独学でかじる。統計学数値計算科学は独学でかじる、ないしは未学程度。

目次

  • 1章 はじめに
  • 2章 Pythonによるデータ分析事例
  • 3章 IPython:対話的な開発環境
  • 4章 NumPyの基本:配列とベクトル演算
  • 5章 pandas入門
  • 6章 データの読み込み、書き出しとファイル形式
  • 7章 データ管理:データのクリーニング、変換、マージ、再結成
  • 8章 プロットと可視化
  • 9章 データの集約とグループ演算
  • 10章 時系列データ
  • 11章 金融と経済データへの応用
  • 12章 NumPy:応用編

各章にコメント

1章 はじめに

1章では、なぜPythonを選ぶのかに始まり、紹介されるライブラリの簡易概要、環境やカンファレンス、コミュニティの紹介、そして謝辞です。

2章 Pythonによるデータ分析事例

2章では、 github.comで公開されてるデータを具体的に読み込んで、処理をしていきます。
Pythonのリスト内包表記の説明がごく少ないことであったり、Rの配列とインデックスの始まりが違うこと(具体的にはRは1から、Pythonは0から)が明確に説明されていました。

データの基本的な集計から、Matplotlibによる表示も紹介されています。

気づいたこととしては、私が使う時はMatplotlibに対して、pandasのデータをプロットしていました。書籍ではpandasのオブジェクトにplotメソッドを使っています。これは知りません。便利ですね!
他にも気づいたこととしては、IPythonと対話的に行うことでした。経験として、もちろんIPythonやPythonインタプリタと対話しながらという場面はありますが、ファイルに書いて実行が常だよな。と思うところです。

2.2ではとってもよい機能がありました。pandasのDataFrameオブジェクトのmergeメソッドです。このメソッドはpandasのデータフレームオブジェクト同士を結合する機能です。あたかもRDBMSのテーブルを結合するかのように。

3章 IPython:対話的な開発環境

3章はなんとまるまる1章IPythonに割かれています。
IPythonの作られた文化背景や、如何に野心的で高機能であるかを知ることができました。Python標準インタプリタの対話機能をちょっと強化しただけだと認識して使ってた私はどうやら馬鹿です。

様々なIPythonのコマンドが紹介されています。特に、IPythonのコマンドで処理時間を計測を計測する%timeと%timeitは活躍しそうです。

Matplotlibとの連携機能もあまり知られていないのではないでしょうか。

また、3.5でIPythonノートブック(書籍中ではIPython HTML ノートブック)が紹介されていました。
IPythonをブラウザから実行できたりと手軽感があるので、ちょっと使うだけの方は試してみてください。

書籍では語られていませんでしたが、IPythonは並列実行をサポートしています、もし興味がある方は公式ドキュメントの"Using IPython for parallel computing"を参考にしてみて下さい。

4章 NumPyの基本:配列とベクトル演算

この章はまるまるNumPyについて割かれています。ちなみに12章はNumPyの応用編です。

NumPyのndarrayに各種方法によってアクセスした際に、値コピーであるか参照であるかという基本的な仕組みから、インデックスによる参照、スライシング、ソートなどの操作が解説されています。

4.1.1 ndarrayの生成において、ndarray.ndimが説明されることなく使われていますが、これのメソッドは多次元配列の次元数を表します。

追記: 訳注しっかり付いてました。訳者++。

5章 pandas入門

5章ではpandasが提供するデータ構造のSeriesとDataFrameをはじめとしたpandasの機能を説明しています。特に欠損値(NaN)の除外や穴埋めは、7章でふれるマージの機能ととともに使う機会が多そうです。

正直、ちょっと私には難しいですねー。

6章 データの読み込み、書き出しとファイル形式

6章ではpandasに特に注目して、データのファイル入出力を解説しています。

これを読むまでははcsvやtsvのデータを集計する際に、Python標準ライブラリのcsvPythonのコードで集計してました。これからは、pandasのread_csvとpandasのDataFrameを駆使すれば良さそうです。

7章 データ管理:データのクリーニング、変換、マージ、再結成

この章では、pandasのマージが紹介されています。left join、right join、outer join、inner joinとRDBMSでよく馴染みがある結合についてです。

それ以外にも、配列同士の連結(≒concat)やピポット(行から列へ、列から行への旋回)が紹介されています。

後半はPythonによる正規表現を学んだあとに、データの正規化(Normalize)についてです。ごめんなさい。ここは飛ばし読みしました。

8章 プロットと可視化

8章は"matplotlib"による可視化の話です。

気になったのは、2012 Google Summer of Codeプログラムの一環で学生さんがフルタイムで改修かけたので、一気に変わってるよ!てへぺろ。という文でしょうか。pandas公式オンラインドキュメントのコード例が先を行っている可能性があることが明記されていました。

9章 データの集約とグループ演算
10章 時系列データ
11章 金融と経済データへの応用
12章 NumPy:応用編

さてはて私感。

全体的にスムーズに読めてよい翻訳本でした。誤字脱字も少なくて良いです。

本家のドキュメントを除き、pandas、NumPy、SciPy、matplotlibのいずれを考えても日本語のドキュメント、書籍が多いとは言えず、この一冊が重要な情報源になると思います。

ライブラリとしては興味あるので、継続して学んでみようと思います。
けれども、そもそもの数値を扱う学や、明確な機会がないので、現状過ぎたる物ですね。。気長に行きます。

正誤情報

本家の正誤表かレポート先ができたら連絡する。念のため原著は確認ずみ。

p.110 np.sqrtの引数

o > In [135]: z = np.sqrt(xs ** 2 + ys ** 2)
x > In [135]: z = np.sqrt(xs 2 + ys 2)

p.288

o > グループキーにkey1だけを指定する代わりに、
x > グループキーにkey1をだけを指定する代わりに、

余談:この書籍に縁を感じた話

どうやら、2013年はNumPy, Scipy, Pandasと縁がある年でした。

ひとつは、今回献本頂いた書籍。

もうひとつは、先月(あれ、もしかして今月だってっけ...)購入した電子書籍が今回献本頂いた書籍の原本でした。英語書籍に挫折しててgrep用途となっていたのでした。

更にもうひとつは、7月初旬に行われたEuroPython2013の会場で購入して、帰りの空港、飛行機の中で読んでた書籍。ページ数が82ページと極薄なのでちょうどよい分量でした。(内容も軽い

そして最後は、業務において少なからずPandasとMatplotlibによって業務データをビジュアル化し、知識を活かすことができました。

この業務の時に活きたのは、書籍『データサイエンティスト養成読本』による"Pythonのによる機械学習"という章でした。ここではNumPy、Scipy、Pandasに触れられているので、興味ある方は中身を覗いてみてください。

A*をPythonで

C++でA*が必要なのだけど、実装経験がなかったのでまずはPythonでリファレンス実装を行った。
という背景があるので、setとかは使ってない。neighbor_nodes関数のタプルもなくしたいのだががががが。

参考にしたのは、wikipediaのA*。wikipedia英語版のA*の擬似コードをPythonで実装した。ほぼ一緒。
wikipedia日本語版のA*は擬似コード載ってないからどんまい。

距離の評価関数は、マンハッタン距離とユークリッド距離の2つ。
となりのノードは上下左右のみでok。

コード

テストはない。

import math

def astar(start, goal, neighbor_nodes, dist_between, heuristic_cost_estimate):
    closedset = []
    openset   = [start]
    came_from = {}
    g_score   = {}
    f_score   = {}
    g_score[start] = 0
    f_score[start] = g_score[start] + heuristic_cost_estimate(start, goal)
    while openset:
        current = min((f_score[node], node) for node in openset)[1]
        if current == goal:
            return reconstruct_path(came_from, goal)
        openset.remove(current)
	closedset.append(current)
        for neighbor in neighbor_nodes(current):
            tentative_g_score = g_score[current] + dist_between(current, neighbor)
            tentative_f_score = tentative_g_score + heuristic_cost_estimate(neighbor, goal)
            if neighbor in closedset and tentative_f_score >= f_score[neighbor]:
		continue
            if neighbor not in openset or tentative_f_score < f_score[neighbor]:
                came_from[neighbor] = current
		g_score[neighbor] = tentative_g_score
                f_score[neighbor] = tentative_f_score
                if neighbor not in openset:
                    openset.append(neighbor)

    return False

def reconstruct_path(came_from, current_node):
    path = [current_node]
    while current_node in came_from:
        current_node = came_from[current_node]
        path.append(current_node)
    return path

MAP_ROW = 5
MAP_COL = 5
map = [[1,1,1,1,1],
       [1,0,0,0,1],
       [1,0,0,0,1],
       [1,0,0,0,1],
       [1,0,0,0,1],
       [1,1,1,1,1]]

def is_movable(p):
    x, y = p
    if x < 0 or x > MAP_COL-1 or y < 0 or y > MAP_ROW-1:
        return False
    if map[y][x] == 1:
        return False
    return True

def neighbor_nodes(p):
    x, y = p
    neighbors = [(x-1, y), (x, y-1), (x+1, y), (x, y+1)]
    return filter(is_movable, neighbors)

def heuristic_cost_estimate(p1, p2):
    return manhattan_distance(p1, p2)

def manhattan_distance(p1, p2):
    return abs(p1[0]-p2[0]) + abs(p1[1]-p2[1])

def euclidean_distance(p1, p2):
    return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)

if __name__ == '__main__':
    start = (1, 1)
    goal  = (3, 4)
    path  = astar(start, goal, neighbor_nodes, heuristic_cost_estimate, heuristic_cost_estimate)
    if path:
        for position in reversed(path):
            x,y = position
            print(x,y)

感想

実装に手間取った。この後C++に書き換える。このPythonコードkivyで使えるなーと思った。
kivyはTMXフォーマット対応からしないと、自分が作りたいもの作れないのがががが。

そういえば、kivyといえば、kivyアドベントカレンダーid:cheeseshopさんにより進行中なので、興味ある方は読んでみるよろし。

気が向いたらgithubにもpushしとく。

追記2

そういえばNLPでもA*使われることあったの思い出した!

numpy, sciypy, matplotlib, pandas, scikit-learnの環境構築とかとか。

表題のライブラリ群の必要性が高まってきたので環境構築して遊ぶ。...のだけど環境構築に思った以上に手こずったので記す。

それにしてもPythonはこのあたりのライブラリが充実してるから逃げられないなぁ...。移行先希望。

環境

事前にvirtualenv, virtualenvwrapperでPythonの環境を切っておいた。

  • OSX 10.8.4
  • XCode4.8.2
  • Python 2.7.2
    • CPython2.7.2。今回はPyPyじゃないよ。PyPyじゃライブラリ動かないのあるから...。

インストール

% pip install numpy
% pip install scipy
% pip install matplotlib
% pip install pandas
% pip install scikit-learn


??tornadoがインストールされたのかはなぞである。

% pip freeze              
distribute==0.6.34
matplotlib==1.3.0
nose==1.3.0
numpy==1.7.1
pandas==0.12.0
pyparsing==2.0.1
python-dateutil==2.1
pytz==2013d
scikit-learn==0.14.1
scipy==0.12.0
six==1.4.1
tornado==3.1.1
wsgiref==0.1.2

ハマりどころ。

pip install scipyがコケる。

pip install sciypyすると、次のようなエラーが出た。

building 'dfftpack' library

error: library dfftpack has Fortran sources but no Fortran compiler found

----------------------------------------
Command /Users/rokujyouhitoma/.virtualenvs/analyze/bin/python -c "import setuptools;__file__='/Users/rokujyouhitoma/.virtualenvs/analyze/build/scipy/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/lc/vw5blb150gxd3_xwxj2k3s080000gn/T/pip-gv6NBX-record/install-record.txt --single-version-externally-managed --install-headers /Users/rokujyouhitoma/.virtualenvs/analyze/include/site/python2.7 failed with error code 1 in /Users/rokujyouhitoma/.virtualenvs/analyze/build/scipy
Storing complete log in /Users/rokujyouhitoma/.pip/pip.log

どうやらdfftpackというライブラリが足りないとわかるので、ググり記事に行き着く。

gfortran

どうやらgfortranが必要。

http://r.research.att.com/tools/からgcc-4.2 (Apple build 5666.3) with GNU Fortran 4.2.4 for Mac OS X 10.7 (Lion)をダウンロードし、インストール。

正しくインストールされたことを確認。

% gfortran-4.2 
i686-apple-darwin11-gfortran-4.2.1: no input files

#でもgfortranはみあたらず...。
% gfortranx   
zsh: command not found: gfortranx

#シンボリックリンクを貼って対応。
% sudo ln -s /usr/bin/gfortran-4.2 /usr/bin/gfortran

% gfortran --version
GNU Fortran (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

#再度pip instal scipy
% pip install scipy

scipyってfortranに依存してるのね。

pip install matplotlibがコケる。

freetypeがないと怒られる。

============================================================================

                        * The following required packages can not be built:

                        * freetype

----------------------------------------
Command python setup.py egg_info failed with error code 1 in /Users/rokujyouhitoma/.virtualenvs/analyze/build/matplotlib
Storing complete log in /Users/rokujyouhitoma/.pip/pip.log
freetypeのインストール
% curl -O http://ftp.twaren.net/Unix/NonGNU//freetype/freetype-2.5.0.1.tar.gz
% tar zxf freetype-2.5.0.1.tar.gz
% cd freetype-2.5.0.1
% ./configure
#エラー...libpngがないってさ( ꒪⌓꒪)...
checking for libpng... configure: error: `libpng-config' not found;
either set the LIBPNG_CFLAGS and LIBPNG_LDFLAGS environment variables,
or pass `--without-png' to the `configure' script.
make: *** [setup] Error 1
libpngのインストール
% http://jaist.dl.sourceforge.net/project/libpng/libpng16/1.6.3/libpng-1.6.3.tar.gz
% tar zxf libpng-1.6.3.tar.gz
% cd libpng-1.6.3
% ./configure
% make
% sudo make install
% libpng-config --version
1.6.3
再度freetypeのインストール
% cd freetype-2.5.0.1
% ./configure
% make
% sudo make install
追記: brew installでfreetypeとlibpng

そもそもbrewで入れれるっぽい...

% brew install freetype
% brew install libpng

以上。

matplotlibは業務でちょびっと使った。numpyも業務とkivyの経路探索でお世話になったけど、まだまだ知識不足。なのでこれでやっと取り掛かれる。