numpyとかscipyで引っかかったところ

ちなみに今言うのもなんですが、現在私は大学の学部4年生、卒業研究に取りくんでいます。いや、取り組んでいると言ってもあんまり進んでいない状態。
何をやっているかというと、音の信号をフィルタにかけてどーこーするというやつです。分野的には信号処理。微分やら積分がいっぱい出てきてちょっと混乱中です。データ構造に落とすことが出来れば、得意分野なのでいいのですが……。

で、我が研究室では基本的にMATLABという数値解析システム、もとい言語環境を使ってやるのですが、これがまたなんというか、プログラミングと言えばWebProgな私としては我慢ならない点が多いです。配列のインデックスが1から始まったり、for文がなんか遅かったり、関数なのか配列なのかが分からなくなったり。あとオブジェクト使えるの?って書こうとしたら、なんかあるみたいです。みんな使ってないだけで。
それもそのはずで、MATLABはプロトタイピング用の環境なんですね。もちろんGUIウィジェットみたいなのがあって組めるには組めるのですが、常用するツールを作るのには向いていないというか。思いついたアルゴリズムやら処理を簡単に書いて試すという感じ。

あと、ゆくゆくは僕はこの研究の成果をWebブラウザ上で動かせるようにしたいと考えているので、サーバサイドで動かすことをあまり考えたくないMATLABさんでやるのもなんだか、と乗り気ではありませんでした。

そこでPythonですよ。困ったときのPythonちゃん。
さて、僕がこの研究をやるのに必要なものはただ一つ、強力な行列演算ライブラリです。行列式やら行列同士の積、和、それらをベクトルプロセッサのようにガバっとやるようなライブラリを欲していたのです。MATLABにはそれがあります。故に強力、いまだにデファクトスタンダードなんですね。MATLABとセットでよく使われるSimulinkというビジュアルプログラミング環境もなかなか強いですけれど。
Pythonにそれがあるのかというと、実はあるんです。行列演算ライブラリのnumpyと、それをさらに実用的に拡張したscipyです。行列演算をやるときにはCで書くのと同じぐらいの速度で動作するらしいです。こりゃ使うっきゃない。
というわけで使ってみたのでした。でも、いくつか引っかかった点があったので書いてみます。

numpy.ndarray()で.Tは使えない

ベクトル的に使うことも出来るっちゃ出来るんですけれど、例えば横ベクトル縦ベクトルという区別がある場合、そのまま使うことが出来ません。
ケースとしては後に別の行列との積を計算するベクトルがある場合、横であるか縦であるかで結果が変わってくるので、重要です。
横を縦に、もしくは縦を横にする場合は、転置という方法を使います。
MATLABではこんな感じ

A = 1:10;
A_dash = A';

これで転置が出来ます。
numpyだとどうやるか。

import numpy as np
A = np.arange(1, 11)
A = A.T # これだとAがそのまま出る。つまりnumpy.ndarrayは転置の意味が無い
A_mat = np.mat(A).T # 一旦numpy.mat()で行列に変換してそこから転置する。これなら縦ベクトルが出てくる。ただし、np.matはあんまり使わない方がいいらしい
A_T = A[:, np.newaxis] # これでndarrayのままで縦ベクトルを出せる

とまあこんな感じです。

標準のrangeだと間隔が設定できないからarangeの配列をforに使う

そんなことも出来るんだーと思いました。
例えばMATLABだと

for i=0:3:100
  i
end

というように増分を3と簡単に決められたりするんですが、多分こういうことやるのってpythonだとリスト内包表記でやるんだろうなーって今思いつきました。よってこの項目はあんまり必要ないかも…。
実際はどうやったかというと、

for i in np.arange(0, 101, 3):
  print i

実はそれでも出来るんだーって思いました。まあ配列ですからね。当たり前かも

今のところこんな感じです。まだまだ使っていくのでいろいろTIPS的なことを発見したら書いてみます。

Joyent SmartMachinesでserver.js以外で動かす

表題通りです。
SocketStreamはsocketstream startというコマンドで起動するので、Expressのときのように
単純にserver.jsにリネームするだけでは出来ません。
そこで設定を変えることによりスタートアップコマンドを"node server.js"というデフォルト値から
"socketstream start"に書き換えます。
とりあえず成功したやつを先に書いときます。

成功バージョン

http://wiki.joyent.com/display/node/npm+Integration
ここのscripts.startという項に書かれています。
つまり、package.jsonにscriptsという項を増やせばいい。

"dependencies": {
  "request": ">=1.9.5",
  "socketstream": ">=0.2.1"
},
"scripts": { "start": "socketstream start"  }

これでおk
あとはgit pushすれば使えるようになります。
socketchatをアップしたのですが、読み込みが遅い。
これはサーバの遠さに起因するのかどうかを検証するために、次はさくらVPSで試してみます。
それでもダメだったら、Socket.IOのままで使うしか無いですね。
さて、普通の方はここで終わり。あとは反省会です。

続きを読む

発見したこと

たぶん、シンプルなExpressベースアプリケーションだったからかもだけれど、HerokuにアップしていたアプリケーションをJoyentにもアップするときに怒られた。なんかバージョンがどーのこーの。
そこで調べたところ、HerokuはProcfileに起動するときのコマンドを入れておくのだけれど、Joyentはserver.js決め打ちらしい。Expressコマンドで生成するとapp.jsになっちゃうからね勝手に。以下に書いてありました。

Joyentでnode.jsのプログラムを動かそう! | 名称未定ドキュメント”Que”
d:id:hidesuke:20110831

と、いうわけで解決方法は以下。

$ cp app.js server.js

本当に動いた。マジかー。JoyentはWebSocketがマトモに使えるらしいので、バリバリ使っていきます。バリバリバリー!

やりたいこと -> やってみること

僕は裏で同人誌を書く(「描く」ではありません、文章を「書く」)ことなんぞをやっているのですが、そこのサイトがドメイン取ったはいいが作っていなかったので、そいつを練習がてらnode.jsで書いています。

みんなだいすきExpress

フレームワークは今のところExpressで、テンプレートエンジンはJade、スタイルシートにStylusを使う、ハズだった。
Expressは、node.jsでは割とみんな使っているRubySinatraライクのフレームワーク。要はこういうふうに書けるよってやつですね。

//サーバインスタンスを作る
var app = express.createServer();

//ドキュメントルート(/)に以下のメソッドをバインディング
app.get('/', function(req, res){
//ハローワールド!
    res.send('Hello World');
});

//3000ポートで受け付けるよ
app.listen(3000);

みたいな。これ、公式サイトにあるやつなんですけれど。あとインスタンス生成とかそういう文言でいいのかな。JavaScirpt/node.js初心者なので鵜呑みにしないでね。
Sinatraとか僕がよく使うPythonのFlaskでもそうなんですが、メソッドとバインドするURLが一対一の関係になっていて、ページをシンプルに書けるというのが特徴みたいです。
これがRailsなんかだとファイル名からどーのこーのするので、めんどくさい。あそこまでの大規模じゃなくてよくて、もちろんルーティングは正規表現なんかも使えるので、もっとシンプルに行こうじゃないかという思想です。こういうマイクロフレームワークとよばれるやつらは、いろんな言語であるみたいです。

SocketStream

で、これからの話。僕が作るページというのはワンページでJavaScriptをドバドバ使って画面遷移なしでいろいろ表示させるシンプルなものにしようとしていたので、URLルーティングでページをドバドバ変えていくようなExpressじゃ不向きじゃねえか、と思った。いや、SocketStreamを見つけるまではExpressだろうなーそうだろうなー、しかないよなーとか思っていたんだけれど。
SocketStreamなるものを見つけたわけです。こいつはSingle-page Applicationに向いているらしいフレームワーク。ExpressはJadeでテンプレートエンジンまでは面倒は見るけれど、たぶんクライアント側のJavaScriptに関しては面倒を見ないはずです(間違ったら言ってください)。SocketStreamはクライアント側スクリプトまで面倒を見る仕様です。
イマドキのWebアプリケーションで双方向にリアルタイム通信するにはWebSocketなる仕組みや、それに似せたポーリングなんかを駆使したやつを使うわけですが、そいつらをJavaScript上で使いやすくしてくれるのがSocket.IOというライブラリです。この公式サイトに超シンプルなコードがありますけれど、あらためて言いますがこれだけで通信できるなんて僕感動です。
こいつでバリバリやりとりすることで画面遷移なしで動かすっていうのをやるわけですね。
で、SocketStreamもSocket.IOの手助けを借りつつ(なんかドキュメント見るとWebSocketそのまま使うことも出来るみたいですが)こうバリバリってやっていくわけですね。
しかも超イケてるのは、CoffeeScriptがそのまま使えること。もちろんJavaScriptも使えますが。CoffeeScriptについてはこちらを。
今日から始めるCoffeeScript | tech.kayac.com - KAYAC engineers' blog tech.kayac.com
http://tech.kayac.com/archive/coffeescript-tutorial.html

はい、擬音が多くなったのはこれからやるからです。実はSocketStreamでまだ書いていない。
しかもこっちで公開できるかな……。創作アカウントとこのアカウントは分離したいんだ。

というわけで、今後も躓いたり発見したことをここに書いていきます。

はてダ始めました

始めましたも何も、他でやっていたのですが、とりあえず技術系をこちらでは書き連ねてみます。

どうもmackeeです。まこピーとか呼ばれています。どっちでもいいです。
まこピーのピーはPythonのpyで覚えてくださいね。

ま、他のことはプロフィールか何かに書いておけばいいやー。