Hatena::ブログ(Diary)

ゆどうふろぐ RSSフィード

2011-10-10

[][] nvmとnpmを入れたメモ

色々あってnode.jsの環境を手元で作る事にした。


個別環境にnode.jpをインストールするには、nvm以外にもnaveもあったけど、手軽さと最近の潮流から刷るとnvmぽかったのでそちらを入れた際のメモ。

nvmのインストール

creationix/nvm - GitHub

こちらの通りインストールする。

% sudo apt-get install build-essential libssl-dev

まずは指定されている必要パッケージをインストール

その後nvmをcloneして実行する。

% git clone git://github.com/creationix/nvm.git ~/.nvm
% source ~/.nvm/nvm.sh

source...の行は.*shrcにも記述しておく。

% nvm install v0.5.8
% nvm use v0.5.8
% nvm alias default v0.5.8

これでnvmのインストールが完了。

npmのインストール

といっても、npmは実はnvmのインストールに合わせてセットで入っている。

% npm install socket.io

バージョンを切り替えた時点でnpmにもパスが通るので、パッケージをインストールできる。


パッケージは、グローバルインストールするとパスがうまく通ってなかったりするので、自分で.nvm/<version>/lib/node_modulesにNODE_PATHでパスを通すか、特に事情がないならローカルインストールで使うとよいと思う。


以上で完了。

2011-10-09

[][] 第1回GraphDB勉強会に参加してきた。

昨日、フューチャーアーキテクトさんで開催された第1回GraphDB勉強会に参加してきました。


ほぼスーパー @doryokujin タイムみたいな感じの勉強会だったりしますがw

それでなおこのクオリティなのがさすがですね。

運営の皆さまも、いつもよい勉強会ありがとうございますm(_ _)m


スライドやtwitterまとめについては、@bibrostさんによる、できたてほやほやのgraphdb.jpにまとめ記事が既にまとめられているので、そちらへどうぞ。

ついでに、今回発表内容の中心のネタになっていたneo4jとThinkerPopについてもリンクを置いておきます。


以下、自分が参加して聞いていた際のまとめです。


はてダがmarkdownに対応してくれてないので、まんま貼り付け。そろそろposterousに乗り換えようか。。。

第1回 GraphDB勉強会
====================

The Definition of GraphDB
-------------------------

* Graphとは
  * NodeとEdge(Relationship)で構成されるもの

* 有向グラフと無向グラフ
  * 無向 = お互いが対等になる 
  * 有向 = やじるしになる。方向性を持ち、対等ではない。

* 例:
  * Facebook -> friendは対等で向きを持たない。無向グラフ
  * Twitter -> follow関係は一方向。有向グラフ

* その他にも以下のようなものが考えられる。
  * 有向と無向の混在 = Mixied
  * Node感に複数のedgeがある。Multiple

* Mixiedはシステム的に扱うのは面倒なので考え方を変える
  * 無向グラフは、2本の有向の線と考えられる。
  * 両方の向きを持つグラフは片方の向きのみを持つグラフとして表現することができる。

* Sngle-Relational Graph
  * 全ての頂点が同じオブジェクト・タイプしか持たない
  * 全ての辺も同じ性質しか持たない

* Multi-Relational Graph
  * 各頂点は様々なオブジェクトタイプを持つ
  * 複数の種類のrelationを持つ

* 例:
  * Livlis
  * 物と人というものが、followやイイネ、欲しいなど様々な関係が成り立っている。

* 現実の事象をシステムに落とす場合には、Graph として落とさないと関係性が失われてしまう。

* Property Graph
  * Nodeに対するProperty、Edgeに対するPropertyとして、様々な情報・特徴を持たせる。
  * ここで言うPropertyはkey-valueで表現され、さらにschema freeであるとする。

* 任意の特徴を持つオブジェクト同士を、任意の性質をもつrelationで結ぶ事が出来る、という柔軟性を持たせたGraphをデータとして保持することができるのが、GraphDBと定義されている。


* Hyper Graph というのもある。


### Traversals

* GraphDBでの検索
  * RDBMSなどの検索は、全体の中から特徴を検索するものだが、それとは違う。
  * 主役の頂点を決めて、その近傍を検索する。
  * RDBMSはGlobalな検索、Graphの検索はlocalityを重視した検索になっていると言える。

* Q:XMLDBのXPathの検索と同じ考え方ではないか?
  * A:その通りです。
  * Q:どう同じなの?
    * A:tree構造の中から取ってくるという考え方が、TravarsalとXPathで似ている。

* 頂点から頂点をたどっていく検索がTravarsal

* 幅優先か、深さ優先か、2種類の探索方法がある。

* 最小ステップを定義
* 自分から、出ている辺に移動するのを1ステップ、辺から、はいってくるノードへ移動するのを1ステップ。
  * Q:なぜ、わざわざ2ステップと見るのか?
    * 

* Q:どういうデータの場合に向いている?
  * A:多くのJOINしたほうがいい場合などが考えられる。もちろん、一意にJOINしまくるものがGraphに載せられるということではないはず。
  * そういう意味で、GraphDBを使うかどうかはまず目的が見えてないといけない。

### index-free adjaceny

* External Indexを読みに行かない、というのがGraphDBのindexの特徴。
  * 通常のRDBMSはindex treeと実際のデータを行き来するようにしてデータのTravarsalをする。

* ルックアップにlog_2(n)のコストがかかっている。
  * 効率よくデータのTravarsalができなをもたないので、graphがどれだけ大きくなろうがある頂点から近傍のインデックスのみをい。

* GraphDBではどうしているか?
  * Indexを持たずに、NodeとEdgeの接続情報だけで進んでいく。
  * Graphの増大に対しても、検索コストはほぼコンスタンスである。
    * 自分自身にミニインデックスを持っている、という方が効率が良くなる。

* こういった特徴をindex free adjencyと呼び、このような特徴を持っているものをGraphDBと呼ぶ


* Q: 1回のTravarsalなら確かにコストは少ないが、グラフ全体に対して辿るようなTravarsalについてはコストはどうか?
  * まだまだ評価できていないので、答えづらい。あまり扱われないのではないか。

* RDBMSやDocumentDBも、Graphであらわすことができる。


* 例:レコメンドの評価が行列演算ベースではなく、Graphを使って表現できる。

* Q: 関係性に、重みをつけることは可能か?
  * A: propertyとして付与することが可能。

* Q: InsertやUpdateのような操作はどうなるのか?
  * A: それをやる場合は、外部のIndex経由で探していくしかない。


An Introduction Neo4j
---------------------

* ライセンス
  * 有償のものもある。好き勝手にできるもの、というわけでもない。
    * community(free , Advanced(SNMP & JMX, Enterprise(high load & HA
  * neotechnology スウェーデンの会社。
    * GraphDBはヨーロッパで盛ん

* Java製。エンタープライズを意識している。
* indexにはluceneを使っている。

* トランザクションをサポート
* しっかりした耐久性。
* Java

* コードサンプル。
* 追加
  * Pathクラス
  * トランザクションブロック内で実行。
  * Nodeの追加を行った後、Relationを追加する。
* Travarsal
  * Travarserクラス
  * 検索方法やリレーションの種類と深さなどを検索できる。
  * relationshipを複数設定するなども。

* Index
  * nodeとrelationshipに対してindexを張ることができる
    * luceneを使っている。
  * 各種propertyに対してもindexをつけることあできる。
  * Full text Searchも可能。Propertyの値に対して検索できる。


### Cypher

* Graph向けのDSL。
  * SQLライクに記述が可能

* 取ってきたデータに対して計算をすることが可能

* リリースされてからまだ数カ月

### Other Features

* 有償版のみ

* High Availability
  * Master Slave構成が取れる

* Backup
  * オンラインバックアップが可能


An Introduction to Thinkerpop
-----------------------------

* GraphDBを統一的に扱うインターフェース・ツールを提供するオープンソース・プロジェクト
  * ベンダーロックインを防ぐ

* 2009年にgremlinを発表
  * vendor側も好意的に対応

### 各プロダクト

### Blueprints

* GraphDBに共通なAPIを提供する、JDBCドライバのGraph版
* 各プロジェクトのベースになるもの。

### ThinkerGraph

* ライトウェイトなインメモリのGraphDB

### reXster

* RestFulなGraphのアクセスができる。
* Tomcatベース
* WebインターフェースとしてDog Houseというツールも提供してくれる。

### Gremlin

* consoleから操作できるコマンドインターフェース
  * Vertex、Edgeをたどる

* Graphをたどっていくような指定を、ステップごとに書いていく
  * filterという方法もある。
  * loopメソッドを使って繰返しを行っていくことが可能。

### pipes

* Gremlinのドットでつないでいくことによって入力から出力を得るフレームワークを提供している。

* transform
* filter
* sideEffect

* 独自に柔軟なpipeを定義してtravarseを行うこともできる。

### Summary

* Neo4j, OrientDB, RDFなどにも対応。
* 有志がHBaseやRedisにも対応している。


Enjoy Graph DB
--------------

* ネイティブドライバで直接接続するのは、心中する覚悟が必要。
* DB固有のHTTPインターフェスは心中する覚悟が必要。
* ThinkerPop/Gremlinを経由
  * Java/Groovyなのでパワーが必要

* Rexster経由
  * かなり距離があるので、パフォーマンスが悪い

* ネイティブドライバ以外、ほぼ情報がない
* 見渡す限りいばらの道

* pythonにはbulbflowというツールがある。
  * 使い方の紹介

[][] virtualenvwrapperとvirtualenvを入れたメモ

色々あってpythonの環境を手元で作る事にした。


wozozoに聞いたらpythonバージョン毎に切り替えとかそんな気にしなくていいらしくて、virtualenvwrapper入れとけよって事なのでそれで入れる事にした。

virtualenvwrapper、virtualenvのインストール

virtualenvwrapper - Doug Hellmann

上記サイトからたどるドキュメントに従っていれる。

system pythonに依存しないようにしたかったけど、さすがにそれは無理っぽいので最小限に。

-> pythonの切り替えもvirtualenvwrapper側でやってくれてるらしい。


perlbrewやrvmは個人環境の閉じた中に作るけれど、virtualenvwrapperはインストールはsystemに対して入れて、環境として

仮想環境を個人環境内で構築する感じになる。

% sudo apt-get install python-setuptools
% sudo easy_install virtualenv
% sudo easy_install virtualenvwrapper

easy_install経由でそれぞれをインストールする。pipは特に入れない。

% export WORKON_HOME=~/Envs
% source /usr/local/bin/virtualenvwrapper.sh

上記の設定は.*shrcにも書いておくEnvsディレクトリはsourceした時点で自動で作成される。


以上でインストールは完了。

virtualenvの作成と設定

インストールは終わっているので、仮想環境を作成する。

% mkvirtualenv django13
% pip install django

仮想環境を作ると、環境内に自動的にsetuptoolsとpipがインストールされる。

ちなみに、pythonは3系からはpipよりdistributeを使ってパッケージ管理するのがよくなるらしい。


ついでに、コマンド体系がわかりにくかったので以下にメモ。

% deactivate #仮想環境から抜ける
% workon django13 #指定した仮想環境に入る
% echo $VIRTUAL_ENV #利用中の仮想環境を確認

以上で完了。

2011-10-06

[][] rvmとgemsets入れたメモ

色々あってrubyの環境を手元で作る事にした。


system rubyを使うのは筋がいいのかよくわからないというか、gemがとにかく依存性とバージョン管理がぷぎゃーな感じで

すっきりさせるのがモダンなやり方なのかなーと思うので、とりあえず組んどいたメモ。


基本方針としては、できるだけ環境やrubyライブラリバージョンの依存をシンプルにし、極力編集作業を少なくする。

rvmでSingle User方式で組んだベース上に、gemsetsでバージョン毎に環境を切り替えられるように作っていく。

rvmのインストール

RVM: Ruby Version Manager - RVM Ruby Version Manager - Documentation

こちらの方法に準ずる。

環境のgemには頼らず、curlで取ってくる方法を使う。

% bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

これで、インストールするとrubyの構築に必要なライブラリパッケージのインストール方法が表示されるので、それに従ってapt-get なりyum なりでインストールする。

% source ~/.rvm/scripts/rvm
% rvm get latest

source...は.*shrcにも書いておく

% rvm list known # 利用可能なバージョンを調べる
% rvm install 1.9.2
% rvm use 1.9.2 --default

以上でrvmとrubyのインストールは完了。

gemsetsの設定

実はrubyのバージョンを指定してインストールした時点で、一緒にそのバージョン用の個別のgemインストールされてる。

あとは、さらにその中で切り替え可能なように、gemsetsを作る。


例としてrails 3.1用のgemsetを作ってインストールする。

% rvm gemset create rails31
% rvm gemset use rails31
% rvm use 1.9.2@rails31 --default # gemsetのデフォルトを切り替えたい場合

以上。

あとは、適宜必要な環境毎にgemsetを作って切り替えてやっていく。

2011-10-05

[][] perlbrewとcpanm入れたメモ

色々あってperlの環境を自分の手元で作る事にした。


perlbrew + cpanmの環境作ればいい事まではわかっていたけれど、進化・変化も激しいようなので現時点で一番簡単+きれいな方法(っぽいと感じたもの)を調べてやってみたのでメモ。

あと、local::libはperlbrew使ってるなら同じような効果が得られるから必要ない、らしいのでスルーした。


会社で聞けば早いって?まぁいいじゃないか。


基本方針としては、できるだけ環境やperlバージョンとの依存をシンプルにし、編集作業を極力少なく済ませるようにする。

perlbrew -> cpanm -> 各種ライブラリ という順で入れていく

perlbrewインストール

Perlbrew

こちらに従ってインストールする。

環境のcpanには頼らず、curlインストールする方法をとる。

% curl -L http://xrl.us/perlbrewinstall | bash
% source ~/perl5/perlbrew/etc/bashrc

source ~/perl5/perlbrew/etc/bashrc は、.*shrcにも書いておく

% perlbrew available  # 利用可能なバージョンを調べる
% perlbrew install perl-5.14.2
% perlbrew switch perl-5.14.2

以上でperlbrewperlインストールは完了。

cpanm

cpanmのインストール方法は実に色々な方法が紹介されているが、基本方針に従って極力シンプルに保つため、perlbrewを使ってインストールする方法をとる。

% perlbrew install-cpanm
% cpanm --self-upgrade # これやらなくていいらしい

以上。

pm-uninstall、cpan-outdeted

pm-uninstallはperlモジュールアンインストールするためのもの。

cpan-outdetedはperlモジュールアップデートするためのもの。

% cpanm App::pmuninstall
% cpanm App::cpanoutdated

これで、perlを利用するためのベース環境構築は完了。

あとはライブラリを使う場合は、cpanmを使って突っ込んでいく。

2011-09-11

[][][] PHPカンファレンス2011を開催してきました。

ということで、昨日9/10(土)に、PHPカンファレンス2011を開催してきました。

今年も、昨年に引き続き実行委員長として、カンファレンスの全体進行管理)をとり行わせていただきました。


ご来場していただいた参加者の皆さま、Ustでご覧頂いていた皆さま、カンファレンスを支えてくれた委員・スタッフの皆さん、カンファレンスを盛り上げていただいて、本当にありがとうございましたm(_ _)m


普段はあまりカンファレンスのことなどに言及することもないのですが、

たまには開催側として目指したこととか、裏話っぽいことでも書いてみようかと思い立って、記事にしてみました。


今年のカンファレンスで目指していたこと

今年のカンファレンスでは、委員としては対外的なものと内部的なもの、2つの目標を掲げていました。


1つ目は技術者向けイベントの原点に立ち返って、エンジニアにとって楽しい話題を多く提供すること。

2つ目は実行委員として省力運用体制を作ることです。


ここ数年、PHPカンファレンスではビジネスデイという日を設け、エンジニアイベントで敬遠されがちだった「ビジネスとして見たときの技術」という視点でのセッションを取り扱ってきました。

当時まだ技術イベントでピックアップされることの少なかった、ソーシャル関連の話題を積極的に取り込むことができ、有意義な試みだったと思っています。

と同時に、エッジの効いたセッション数が減少していたり、2日間分の話題の選定にも悩みを抱えていました。*1


そこで今回のカンファレンスでは、開催日を1日とする代わり、3トラックの会場を用意して内容も大量に公募で埋めるというスタイルにチャレンジしてみました。

企画当初はうまく集まらなかった場合の事も心配していたのですが、大変バラエティに富んだ発表が集まり、結果として楽しいイベントにできたのではないかと思います。


また、内部的な話ではありますが、省力化についても流れを作るために尽力してきました。

毎年多くのものが使い捨てになる傾向があったものを、昨年と今年でいくつかコアになる資料を使い回せる形で作成・集約することができました。

まだまだ改善の余地はあるものの、一定の成果を得られたと思っています。


今年あったトラブルとか。

面白い発表をいっぱい集めることができた一方、同時になかなか悩ましい問題にもぶち当ったりしました。

サブセッションの会場が狭すぎて、会場前に入れない人の列が半端ないことになる、という状態になってしまったのです。。。


元々、会場としてお借りしていたPiOは借りられる部屋のサイズにわりと開きがあり、メインに用意した会場が400人オーバー入る一方、他に借りた2つの会場が80人強・60人強のサイズでした。

例年はその差で問題になることもほとんどなかったのですが、今年は消防法等のこともあって立ち見を禁止したことや、公募で集めたせいもあってかサブ会場にもメインを張れるレベルの魅力的な発表が並び、想像以上に人があふれてしまいました。


正直、セッション毎に応募をかけとけばよかったなぁ、とだいぶ後悔したり。。。


ともあれ、これは何とかしなければ!ということで、急遽、スタッフの控室として確保していた40人程度の会議室をパブリックビューイング会場として開放することを決めました。

その場で会場のPiOの方と交渉してプロジェクターインターネット回線・音響設備を貸していただいて、特にあふれ方のひどかったセッションの内容をUstで流すように設置を行いました。


本当は、もう1つの会場の受け皿になる部屋も用意したくて、会場に空き部屋がないか交渉したのですが、そこまではさすがに確保できず、ちょっと悔しかったです。

入りきれなかったりして聞きたいセッションが聞けなかった方々には、本当に申し訳ない限りです。


それにしても、事前に予定のなかった機材や設備を高速で用意してくださったPiOの柔軟な対応は本当に素晴らしかったです。PiO++


また余談ですが、長時間行列を作ってしまうと会場施設の他の利用者の方に迷惑になってしまうため、行列は5分前から・・・という制限を設けざるをえませんでした*2

そのため、列ができるたびに参加者の方に説明して、行列を解散させることになったのですが、これはとても心苦しかったです。

この心折れそうな作業にも当たってくれたスタッフのみなさんも、本当にご苦労様でした。


最後に

なにはともあれ、多くの人に支えられて、今年もPHPカンファレンスいいイベントにできたと思います。

みなさん、本当にありがとうございました。


これからもPHPカンファレンスをよろしくお願いいたしますm(_ _)m


P.S.

ちなみに、実行委員長にもかかわらず、懇親会のプレゼント抽選じゃんけんで、本気モードでジャンケンに買ってオライリーHadoop本をいただいてきてしまいましたwww


空気読めなくてすいませんwΣ(ノ∀`)

ありがとうございますw

f:id:Yudoufu:20110912025929j:image

*1:昨年は、幸いにもRasmusが来日してくれるという素晴らしい機会が得られたため、トータル的にはよくなっていたのですが。

*2:行列ができていた会場の並びの部屋にも、別の利用者の方々がいたりしたのです。