IT土方から代表取締役になった

主に技術メモ。たまに違うことも書くかもね。

ブログタイトルが変わりました&El Capitan

久々のブログ更新ですが、タイトルを変えちゃいました。

IT土方からの脱却を目指していたら、代表取締役になりました。

とはいえまだ会社という器ができただけで、

しかもフリーランスでの契約は継続中だし

やってることはまだIT土方だけど・・・。

 

一歩前進

 

ところでMacのOSをEl Capitanに変えたんですが、

ライブ変換がとてもいい感じですね。

スペースを押さないで日本語入力ができるというのはものすごく快適。

 

 

 

SinatraでWebsocketチャットもどき

前回はwebsocket-railsでチャットもどきを作りましたが、

諸事情によりiOSから繋げられるWebsocketサーバを作りたかったがために

websocket-railsでは難しいことが判明。

 

そこでもうちょっと汎用的なWebsocketサーバを作るべく、Sinatraで作り直しました!

参考にしたのは、herokuが公開してるこれ。

あとは、コチラのブログも参考にしました!

んで、作ったのはコチラ!

 

では解説!

まずはサーバ側から!

app.rbはただのindex表示用。今回もViewはindexのみです。

で、backend.rbがキモなところですが、まずfaye/websocketをつかって、

wsオブジェクトを生成してます。で、ws.onで各イベントの処理を記載しています。

:open はWebsocketの接続時に実行されます。

clientに保存して、チャット人数表示用のcountメッセージを全クライアントに

送信してます。あと、50個だけ過去ログ保存するようにしているので、

それも送信しています。(これは新規接続したクライアントにだけ)

 

:messageは、chatの内容ですね。受け取ったら全クライアントに送信するだけ。

 

:closeはブラウザ閉じたり、Websocket切断時の処理です。

クライアント一覧の配列から該当のクライアントを削除して、チャット人数が減るので

それを全クライアントに送信する。

 

次にクライアント側です。

チャット送信ボタンを押すか、テキストボックスでEnterを押すと、

sentMessageが実行されます。27行目にWebSocketをnewしているので

そいつに対してsendを実行するだけ。

受信はonmessageです。チョー簡単ですね。

前回のwebsocket-railsでは、メッセージのラベルに対応するメソッドを呼び出すと

いう処理が隠蔽されているので、他のクライアントから繋ぐのは難しかったのですが

今回のバージョンでは単純なJSON形式なので、サーバ側のJSON解析如何で、

いくらでも処理は追加できそうです。

 

以上!

websocket-railsでチャットもどき

websocket-railsを使ってチャットもどきを作ってみました。

 超絶参考にしたのはこのブログです。

 あとはgithubのこの人のチャットシステムはすごーく参考になりました。

 

で、とりあえず作ったものはここに。

 

では解説!

 まずはサーバ側から。

 

PublicControllerははただのindex表示用ですね。

で、configのevents.rbでクライアントのラベル(ここだと:new_message)に大して

どのコントローラの、どのメソッドを呼ぶか、というのを設定します。

これだとChatControllerのnew_messageメソッドが呼ばれるということですね。

んで、 ChatControllerを見ると、initialize_sessionとnew_messageのメソッドがありますね。

initialize_sessionはWebsocket接続時に呼ばれるメソッドです。

とりあえず標準出力してるだけ。

で、new_messageをみると、putsはただのデバッグ用出力なので気にしないとして

broadcast_messageを呼び出して、接続中の全てのクライアントに対して、

:new_messageというラベルとメッセージ内容(messageの変数に入ってます)を

送信してるだけです。

 

ではクライアント側を見てみましょう。

参考元のソースほぼそのままですね。サーセンww

4行目でdispatcherにWebSocketRailsをnewしてます。

あ、ちなみにurlはindex.html.erbから取得してますよ。

でbindEvents()で、イベントを監視します。

まずメッセージ送る方はsendMessageメソッドでさすね。

サーバへなんか送るときは@dispatcher.triggerを使います。

で、new_messageのラベルと、メッセージ内容をJSON形式で送ってます。

new_messageのラベル付けることで、前述したサーバ側で対応するメソッドが

呼び出されるということですね。

このラベルの種類を増やすと色々やれるような感じです。

で、サーバ側から受け取るのは@dispatcher.bindです。

単純にhtmlにappendしてるだけです。ざっとこんな感じです。

 

 

websocket-rails使うと、かなり簡単にwebsocketを使ったWebアプリが作れますね!

ただし、このgemはクライアントとサーバをセットで使うことが前提なので

他のデバイスからも接続できるような汎用的な用途としては向いてません。

※パケットキャプチャしてみると、pingpongも独自に設定されているようなので。

 

30歳からの本気プログラマ

30歳でIT土方

今までは完全に職業プログラマとして、大して技術も磨かずにのほほんと過ごしてきた。

そんな僕もそろそろ色々やばいと気づいてきたので、

きちんと技術を勉強して、このブログに書き残す。

 

まずは小さな一歩から!

とりあえずメモ替わりにつらつら書いていこうと思います。