2011年7月27日水曜日

javascriptでurlエンコードしたものをphpでデコードする

どうも、俺@仕事中です。
相変わらずNodeやってます。

Node側でユーザの入力データを受け取り、それをphpへ渡すような事をする場合は
javascriptで入力データをURLエンコードしてphpでデコードを行う必要が出てきます。

javascriptには
escape(str);
encodeURI(str);
encodeURIComponent(str);
の3つエンコード関数があり
phpには
urldecode($str);
rawurldecode($str);
の2つデコード関数があります。

どうやらそれぞれエンコード/デコードのアルゴリズムが違うらしく
全くデータの受け渡しが出来なかったので、どれとどれの組み合わせだったらうまく動作するのか確認しようかな
と思ってたところ、やってくれてる方がいらっしゃいました。

JavaScriptとPHPのURLエンコード【JavaScript,PHP】:Programming Magic

このサイトを参考にして、javascriptでは
encodeURIComponent(str)
してからphpへ送り、
phpでは
rawurldecode($str);
すれば正しく受け渡しができました。感謝!!
逆の場合でも同じですね。


以上でぇぇえっぇぇす。

2011年7月19日火曜日

socket.ioをv0.6.xからv0.7.xへ変更する

どうも、俺@仕事中です。

socket.ioのv0.7.xが出てたという噂を聞きつけて早速
# npm update socket.io
しちゃったら、途端にnodeアプリが動作しなくなっちゃいました。
そこで、socket.ioのv0.7.xの仕様変更、特にメッセージ送受信部分について簡単にめもめもします。
まぁ、、socket.io : github : Migrating 0.6 to 0.7からの引用です。
※express上で動作させているものとします。


■ソケットの生成
・サーバ側
var io = require("socket.io").listen(app);
io.sockets.on('connection', function(socket) {
   console.log('接続されました');
});

・クライアント側
var socket = io.connect('http://node.server.com:3000');
すでにv0.6.xと実装が異なります。

■メッセージ送受信
・サーバ側
io.sockets.on('connection', function(socket) {
  socket.on('message', function(data) {
    // 受信処理
  });
});

・クライアント側
var socket = io.connect('http://node.server.com:3000');
socket.send(data);
// または
socket.json.send(data, [callback]);
v0.7.xからは socket.json.send() により明示的にJSONへ変換するように指定できるようになりました。(省略可)
それ以前は自動的にJSONへ変換がかかっていたので、それを変換する/しないが指定できるようになった形です。
callbackでは、送信後の処理を記述できます。(送達確認処理)

■メッセージ送受信(カスタムイベント)
v0.7.xからはメッセージやり取りに開発者の指定するカスタムイベントによって送受信できるようになりました。
・サーバ側
socket.on('custom event', function(data) {
  // custom eventを受け取ったときの処理
});

・クライアント側
socket.emit(custom event, data, [callback]);


■サーバからのメッセージ送信
・サーバ側
// 自分自身へ送る
socket.emit('custom response', data);
// 自分以外全員へ送る
socket.broadcast.emit('custom response', data);
// 自分を含む全員へ送る
io.sockets.emit('custom response', data);

ちなみにこれらemit()でサーバから送られたデータをクライアント側で受け取る場合は、第1引数に指定されたイベント名でなければ受信できません。
・クライアント側
socket.on('custom response', function(data) {
  // 受け取ったときの処理
});

v0.6.xのようにクライアント側で
socket.on('message', function(data) {
});
で受け取る場合は、サーバ側の送信部分は
socket.send(data);
socket.broadcast.send(data);
io.sockets.send(data);
のように記述すればOKです。

また特定のソケットセッションに対し送信することもできるようになりました。
・サーバ側
io.sockets.socket(<session id>).send(data);
io.sockets.socket(<session id>).emit('custom response', data);
<session id>は任意のセッションIDです。

セッションIDはv0.6.xまではsocket.sessionIdで取得していましたが、v0.7.xからはsocket.idで取得できるようになりました。



以上でぇぇぇぇぇす。

2011年7月15日金曜日

node.jsで自作モジュールの作り方

どうも、俺@昼ごはんは鯛の刺身を食べました。

さて、nodeでモジュールを作る方法についてメモメモです。
nodeは本日v0.5.1がリリースされたとこですね。

nodeで言う「モジュール」というのはjavaやphpなどでいう「クラス」みたいなものです。
でも実態はjavascriptなので、中身は関数群というか関数オブジェクトのかたまりですね。
参考)http://nodejs.org/docs/v0.5.1/api/modules.html#modules
commonsJSの仕様にのっとって利用します。

利用するフレームワークはexpressとします。
サンプルとしてよくある人間クラス(Person)を作ります。
hello()メソッドで"hello!"と、myName()メソッドで自分の名前を出力します。
Person.js
var Person = function(name) {
  this.name = name;
  this.hello = function() {
    console.log("hello");
  };
  this.myName = function() {
    console.log(this.name);
  };
};
module.exports = Person;
module.exportsは、モジュール全体を関数化(オブジェクト化)する時に利用します。
ちなみにjavascriptのprototypeを使うパターンでも同じです。
var Person = function(name) {
  this.name = name;
};
Person.prototype.hello = function() {
  console.log("hello");
};
Person.prototype.myName = function() {
  console.log(this.name);
};
module.exports = Person;

app.js
var Person = require("/path/to/Person");
var p = new Person("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
です。


またはもう一つやり方があり
Person.js
exports.setName = function(name) {
  this.name = name;
};
exports.hello = function() {
  console.log("hello!");
};
exports.myName = function() {
  console.log(this.name);
};

app.js
var p = require("/path/to/Person");
p.setName("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
です。
こちらの方が少し簡略ですね。


以上でぇぇぇえぇぇぇぇす。

2011年7月14日木曜日

使いどころが分からないUnixコマンド

どうも、俺@仕事中です。

今日はどういう使い方をしたら良いか分からないUnixコマンドの紹介です。
$ talk username
talkコマンド。
同サーバにログインしているusernameとチャットをすることができます。
ちなみに別ホストにいるユーザに対しては
$ talk username@ホスト名
です。
チャットを終了する場合は<Ctrl>+dです。
ただしtalkdデーモンが起動している必要があります。これまたマニアックなデーモンですね。
今時、便利なメッセンジャーアプリが多くありますし、電話もありますし。。
全ての通信手段が利用不可になり、サーバ上でやり取りをするしかない場合は使えるかもしれません。


続いて
$ time cmd
timeコマンド。cmdは実行コマンドです。
引数に指定したコマンドの開始~終了までの実行時間を測定します。
どんなベンチマークで使うのでしょう。。



以上でぇぇぇぇぇす。

2011年7月7日木曜日

javascriptでスマホのタッチ(タップ)イベントを取得する

どうも、俺@仕事中です。お久しぶりです。
最近はクライアントjavascriptを書いたり、nodeを書いたり、やたらjavascriptばかりイジっています。

今日はスマホブラウザ(iphoneやandroid)でタッチ(タップ)に対するイベントをjavascriptで取得する方法をめもめもします。

// 1)ontouchstart
document.getElementsByTagName("body").item(0).ontouchstart = function() {
  alert("touchされたよ");
};
// 2)ontouchmove
document.getElementsByTagName("body").item(0).ontouchmove = function() {
  alert("touchされて移動してるよ");
};
// 3)ontouchend
document.getElementsByTagName("body").item(0).ontouchend = function() {
  alert("touchが終わったよ");
};
jQueryだともっと楽に書けます。
ちなみにiphoneのsafariだと確実に動作しますが、androidはGalaxySでしか確認していません。
が、新しいandroid端末であればほぼ大丈夫だと思います。

以上でぇぇえぇぇえす。