こんにちは。先日のブログで以下のような発言をしたイッシーです。(●´ω`●)

僕は生産設備を持っていませんので食料をはじめとした物流における支援は難しいのかもしれません。しかしながらシステムエンジニアとして間接的な支援や情報における支援はできます。僕は、天災における「破壊」を修復するのは人々の「生産」と考えるとともに、その「生産」の一部分を担う者として頑張っていきたいと思います。

有言実行ということで緊急地震速報をお知らせするChrome用の拡張機能を作ってみました。そこで今回は技術的な部分をまとめておきます。

■仕様

クライアント側

Web Notifications

お知らせを表示する小窓です。一番はじめのブログの題材にしました。

WebSocket

双方向通信の規格。これを使うとサーバ側から情報をプッシュできます。

Audio API

お知らせ音を鳴らす際に使用しました。

サーバ側

node.js

サーバサイドJavaScript。一言では表せない存在。同時接続ユーザ数が増えた場合のパフォーマンスがapacheと比べて非常に良いと思います。

■困ったこと1

node-websocket-serverの接続数が1024以上にならない。

解決策

node serverを立ち上げる前に以下のコマンドを実行することで解決しました。

[cc lang="bash"]
ulimit -n 2048
[/cc]

デフォルトでファイルディスクリプタの数が1024になっているので、1プロセスあたり1024個の接続がリミットになっていたわけです。twitterで教えてくださった方に感謝です!

■困ったこと2

30分以上のスリープ状態から復帰すると接続が切れているが、イベントが発火せずプロパティにも特に変化がない。

解決策

以下のようなコードを使用することで回避しました。

[cc lang="javascript"]
var reload = 600000;
var before = new Date();
setInterval(function(){
var current = new Date();
if((current – before) > (reload + 15000)){
connect();// 再接続
}
before = current;
},reload);
[/cc]

タイマーを利用してスリープを検知しています。通常はcurrentとbeforeの差は殆どreloadと等しくなりますが、スリープした場合に差が大きくなります。それを利用して再接続をしているわけです。ヒラメキに感謝!

コードが美しくないのでhtml5-developers-jpに質問してみたところ、「NATやFireWallがあり通信が一定期間無い場合、リソース節約のためにそのセッションテーブルを切ってしまうため、readyStateなどは変化しない」とアドバイスを頂きました。教えてくださった方ありがとうございます!

■困ったこと3

千人くらい使ってくれるかなと考えていましたので、一万人を超えた時は正直焦りました。急激にトラフィックが制限に近づいてます。ソーシャルゲームとは違いユーザ間でデータの共有はしてませんので、サーバさえあれば分散は容易になってます。また、協力してくださる方もいますので協力してくださる方に感謝です!

■まとめ

当初、不具合がありまして多くの皆様に迷惑をかけたにもかかわらず、温かい言葉をかけてくださいまして大変励みになりました。また、個人で制作したものではありますが、サーバーなど会社のバックアップがあってこそ運営できているものです。改めて周囲の皆様に感謝し今後も頑張っていきたいと思うとともに、震災にあわれた地域のいち早い復興を願っております。

Post Navigation