Cloud9でPHP5.4を使う

最近はやり?のCloud9を使ってみようとごにょごにょやってます。

クラウド上にIDEがあるんで、ブラウザがあればそれだけでコーディングが出来ちゃう優れもの。
こんなんが出てくるとChromeBookも全然ありだなぁっと思うわけです。
まぁもうしばらくちゃんと使い込んでみないです。

で、このCloud9でプロジェクト作成時にサーバーのインタンスが出来上がるわけですがPHPのバージョンは5.3.3です。

配列を[]で宣言したりクロージャーで$thisを使ったりしたい場合もあったりでできれば5.4が使いたい。

一応HELPには同様のQ&Aがあって、nada-nix(yumみたいなもの)をつかってインストールできるらしい。
でも、Cloud9上でサーバー実行しても5.3.3のままで、5.4で動かすなら5.4のBuilt-inサーバーで実行しないといけないらしい。

実際にやってみたところ、phpのバージョンは5.4.14になってるけどRunボタン押しても5.3.3のままだった。

とりあえず、今日はここまで。

Node.jsでクライアントのIPアドレスを取得する

最近Node.jsをまじめにやり始めました。

クライアントのIPアドレスが取りたかったので、ググったり聞いたりして
結局行き着く先はStackOverflowのQ&A
How can I get the user’s IP address using Node.js?

リクエストオブジェクトのheaders[‘x-forwarded-for’]に入ってるらしいんだけども
ブラウザによっては入ってない感じだったので、回答の2つ目をそのままつかってみることに

var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     req.connection.socket.remoteAddress;

これである程度取れるようになったんだけど、特定のアクセスの場合
req.socket.remoteAddressでエラーで止まっちゃう。
そもそも、リクエストオブジェクトにsocketプロパティなんてない場合もあるようで(´・ω・`)
javascriptの性質上、オブジェクト直下のプロパティにアクセスするだけなら
undefinedが返ってくるのでエラーにはならないんだけど
undefinedに対してプロパティアクセスしたら例外エラーになってしまう。
サーバーが止まってしまうのも困るのでこれじゃあ使いものにならないのでエラーハンドリングちゃんとするように変更してみた。

    if(request.headers['x-forwarded-for']) {
        return request.headers['x-forwarded-for'];
    }
    
    if(request.connection && request.connection.remoteAddress) {
        return request.connection.remoteAddress;
    }
    
    if(request.connection.socket && request.connection.socket.remoteAddress) {
        return request.connection.socket.remoteAddress;
    }
    
    if(request.socket && request.socket.remoteAddress) {
        return request.socket.remoteAddress;
    }
    return '0.0.0.0';

プロパティが存在するか確認してあったら返すように変更。
4つのプロパティのどれもなかったらどうしようもないので’0.0.0.0’を返して、エラーでサーバーが止まらないように
try-catchしてもいいんだけど、順番的にconnection.socketが評価されずに終わったりするのも切ないし
1こずつtry-catchをネストするのも深くて読みにくくなるしこれでいいんじゃないかな。

他のプロパティに入ってるって知ってる人はこっそり教えて下さい。

追記:
もう少しちゃんと書いた記事はこちら

MoodleというCMSのプラグインを作ってて思ったこと

Moodleというeラーニング特化型のCMSのプラグイン開発を受注しまして、いろいろと弄ってました。

該当の開発に使ってるバージョンは古くて1.7で今のバージョンで改善されているかわかりませんがDB周りのAPIがひどいこと。。。

特にget_records_sql()関数は、SELECT文でDBに問い合わせすれば結果のレコードを返してくれるものなんです。
結果が0件のときは空の配列ではなくfalseが帰ってきます。
そして、1件以上の結果があるときは、配列ではなく、問い合わせたSQLの最初のフィールドの値をキーにした連想配列が帰ってきます。
これのなにが困るって

オートインクリメントフィールドが不要なテーブルやUNIONをつかって他のテーブルと結合した時に
最初のフィールドがキーになるため、キーが重複したら最後のキーのレコードしか取れないこと。

なんでこんな仕様なんだ。。。

PlayFramework関西ビギナーズ もくもく会 第2回

9時半という土曜の割りには朝早くから開催されたPlayFrameworkの勉強会に参加。
第1回にも参加してきたんだけど第1回はPlayFrameworkをインストールしただけで力尽きたというか邪魔が入った。

今回はちゃんとやろうと、PlayFrameworkのドキュメントを読んでみたもののScalaの文法がわからないから何書いてるのかがさっぱりわからんという状態に。。。

別にJavaでやってもいいんだけどせっかくだからScalaでやりたい。
しょーがないのでPlayFrameworkをやる前にScalaの文法を勉強しようと本を買った。

Kindleで読めるのと100円なんで迷わず購入
とりあえずこれでScalaの基本を勉強しようと思う。
PlayFrameworkでなんかできるようになるのはもう少し先だなぁ。。。

次回はなんか作れるように頑張りたい。

Node.jsの勉強会に行ってきた。

今日は知り合いが主催するNode.jsの勉強会に行ってきた。

Node.jsのインストールから
Node.jsのフレームワークのことまで。

基本使い方の勉強会だったけど
ユースケースを知りたいなぁ。

何に使うならNode.jsがいいんだろうか。
勉強会で聞いた話ならRESTfulなもので大量のリクエストをさばく必要があるときは
Apache+PHPとかよりも有利なのかな。

使い方の勉強よりも長所短所が知りたい気持ちが大きくなった