Archive for the ‘JavaScript’ Category

    はてなブックマーク - Sinatra+Mongo+Pusherで忘年会余興アプリを作ってみた
    このエントリーをはてなブックマークに追加

    こんにちわ、Fusic新卒のカワサキです。
    だいぶ投稿が遅れてしまいましたが、先日の忘年会2013のお話!

    10周年記念パーティーのときもそうでしたが、弊社ではなぜか行事ごとに力をいれていて、IT会社らしくITを使って何かやるというのが「仕来り」になってきています笑

    ということで今回も
    ・みんなが知っているゲーム
    ・ルールが単純
    ・チーム対抗で楽しめる
    を前提に幹事チームで考えた結果、アタッ○25「っぽい」ゲームをやってみましたw

    1545777_707721675929493_1789192938_n

    943057_707722552596072_1538389287_n

    1512660_707724779262516_29234952_n

    使用した技術

    Pusher(pusher.com): 早押しボタンなどのリアルタイム通信のため
    Sinatra: Pusherのサーバ側、Publishや認証のため
    MongoDB: パネルの状態保持のため
    Grunt: CoffeescriptとかLessのコンパイル自動化のため

    今回はPusherにリアルタイム通信周りを「おまかせ」したおかげで、ほとんどサーバサイドが必要なく、Html・CSS・Javascriptのクライアントサイドアプリになったかなという感じ。
    なのでRubyは最低限必要部分だけで、メインはSinatraのpublicディレクトリにGruntでクライアントサイド開発をしやすい環境整えて、開発していきました。

    実際Pusherのおかげでリアルタイム通信部分はほんとに少ないコードで書けて
    ・Sinatra側でPublish用のメソッドを用意
    ・JS側でチャンネル・イベントのバインドとAjaxでのデータPOST
    だけで、簡単にリアルタイム通信を行うことができました!

    例えば、早押しボタンを例にすると

    Sinatra側のPublishメソッド

    1
    2
    3
    4
    5
    6
    
    # server.rb
    post '/pusher/publish' do
      Pusher.trigger('channel-name', params[:event],
        params[:contents]
      )
    end

    Ajaxで早押ししたチーム色のPOST

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    # buzzer.coffee
    $('#buzzer').on 'click', 'a', ()->
      $(@).attr('href', "##{color}")
     
      $.ajax
        type: 'POST'
        url: '/pusher/publish'
        data:
          event: 'attack:buzzer'
          contents:
            color: color

    早押ししたチーム色の音をならす・一番早かったチーム以外受け付けない排他制御・回答者を点滅

    1
    2
    3
    4
    5
    6
    7
    8
    
    # panel.coffee
    channel.bind 'attack:buzzer', (data)->
      return if fastest
      fastest = data.color
     
      playPlay('panel-' + fastest) #早押ししたチーム色の音をplay
     
      flashOn(fastest) # 回答者点滅

    のような感じで、簡単にリアルタイム通信を行えます。

    また幹事チームの役割分担もけっこううまくできて

    上司W: 当日の進行・景品の準備・音源の獲得。
    上司O: パネル画面の実装・映像問題作成。
    : サーバ側・早押しボタン・ポイント画面の実装。

    といった感じで役割分担し、全体の構成や問題についてはみんなで話し合って進めていきました。

    あと今回最後の映像問題の答えが「黒田官兵衛」だったので、昼休みにわざわざ福岡城に撮影しにいったり、先輩たちに「無理やり」筑紫もち早食いさせられたりと、良い?思い出があったりしますw

    当日もよりリアルな雰囲気を再現するため、幹事はコスプレしたのですが、なぜか白髪のおじさんじゃなくて「バーコードハゲ」だったり、アナウンサーではなく「女子高生」だったり、なぜかなぜか「お地蔵さん」がいたりとなかなか面白かったです笑

    1536716_707720409262953_1660490088_n

    感想やまとめ

    ・当日は思った以上にみんなが真剣にクイズとか考えてくれたし、盛り上がってよかった。
    ・無駄にアタッ○25に詳しくなった。例えばパネルがめくれる際の音は赤・白・青・緑、全ての色で違うとかw
    ・幹事チームのメンバーは普段案件とかであまり関わりがなかったので、短い期間ですががっつり絡めてよかった。
    ・普段業務で使ったことがなかった技術、今回でいえばPusherやGruntなど使えて勉強になった。

    以上、次回の行事ごとにも期待です!

      はてなブックマーク - Node.js(Socket.IO)を使ってzenpreのリアルタイム配信基盤を作る
      このエントリーをはてなブックマークに追加

      zenpreチームの小山です。
      昨日食べた先輩のカレーがとてもおいしかったです。量が少なかったので次回大盛りを希望しました。

      zenpreリニューアル!!

      “ZENPRE”は6月11日に”zenpre”としてリニューアルしました。
      主な改善内容はリリース文章にお任せするとして、
      今回は技術的な側面から紹介できればと思います。

      大文字から小文字になっただけではないのです。

      リアルタイムプレゼンテーション配信を支える技術の刷新

      zenpreは「リアルタイムなプレゼンテーション配信」と「プレゼンテーションの共有(スライド+動画のコンテンツ作成)」の2つを軸にしてサービスを提供していますが、
      この「リアルタイムなプレゼンテーション配信」、つまり

      スピーカーがスライドを切り替えたら、同時に他の視聴者の画面のスライドも切り替わる

      という機能は、当然ながらブラウザ間のリアルタイム連携がポイントになってきます。

      ZENPREではこの部分は元々Rubyで書かれていたのですが、今回のリニューアルを機に全てNode.js(Socket.IO)で書き換えました。

      なぜわざわざNode.jsで書き換えたのか?

      実は「ベンチマーク結果でNode.jsのほうがずばぬけて優秀だった」とか、「Rubyでの実装に問題があった」とかいう皆さんが期待するような理由は、実はありません。

      強いてあげるとすれば、「zenpreをただリニューアルするのではなく、新規技術採用の起点としたい」というのと「JavaScriptがチームの共通言語だったから」というのが一番大きいです。

      現在は私がメインで開発していますが、近い日にチーム全体で改良を加えられる体制を目指しています。

      また、以前はZENPREではプレゼンテーションのプレイヤーをFlash(スライド+USTREAM)で構築していましたが、
      今回のリニューアルで、機能に占めるFlashの割合を小さくしました。
      その際に代わりに割合が大きくなったのがJavaScriptで、Nodeは当然ながら(ブラウザ上の)JavaScriptと親和性が高かったというのもあります。

      同期通信は、ZENPREではRuby<->Flash(スライド+USTREAM)で行っていたところを、zenpreではNode.js<->JavaScript(連系用ライブラリ)<->JavaScript(スライド)+Flash(USTREAM)という形で作り変えています。

      リアルタイム同期機能の別アプリケーション化

      Node.js(Socket.IO)のサンプルアプリケーションでは、よく「チャットアプリケーション」がありますが、zenpre自体のNodeの利用方法もそれと大差ありません。

      スケールの方法についても一応方策にあたりをつけていますが、現在は1プロセスで十分機能しています。

      一つ特殊なことをしているとすれば、「リアルタイム同期機能」自体を別アプリケーションとして構築しているということです(つまり、Node.jsでは全く特殊ことはしていないということですね)。

      もっと言うと、

      zenpreはリアルタイム同期機能を自身で持っておらず、別のサービスと契約して実現している

      ということを社内でしているイメージです。

      その別アプリケーションは、今は”Sync.IO“という名前でよんでいます。

      なぜわざわざ別アプリケーションにしたのか?⇒Webアプリケーションに求められる要望の多様化に備えてみた

      プログラムでは、よく「汎用的に使うものはライブラリ化して分離する」ことがありますが、そのアプリケーション版の考え方です。(「汎用的に使うものはアプリケーション化して分離する」)

      弊社では受託開発も多くやらせていただいていますが、

      Webアプリケーション(社内業務システムなど)だけで考えても、

      クライアントから求められていたり、逆にこちらからアピールする価値は
      「ブラウザから操作できますよ」という初期の単純なものから、

      • 帳票も出力できます(Excel、PDF連携)
      • 画面遷移をせずに登録できます(Ajax)
      • 1日に一度統計を表示します(グラフ、バッチ処理)
      • サーバの負荷に応じてスケールアウトします(AWS)
      • データはクラウド上に保存しまう(AWS)

      など、どんどん変わってきています。

      そして、「リアルタイムに複数ブラウザで連携する」という機能が、今後、

      「『普通の』Webアプリケーションに求められることもあるのではないか?」

      と考えて、汎用的に利用できるリアルタイム連携の基盤としてSync.IOを作ってみた、という感じです。

      Sync.IOは何ができるのか?

      Sync.IOに似ている(?)サービスとしては、例えばFirebaseなどがありますが、Sync.IOはもっともっとシンプルです(そこまで機能がないとも言えます。)。

      Sync.IOが提供している機能は2つだけです。

      • Socket.IOによるブラウザ間のリアルタイム連携の基盤
      • 連携ログの保持

      チャットアプリケーションを例にとると、
      「チャットができる」「閉じたチャットルームを作ることができる」「権限のある人だけチャットで全員に発言できるように制限できる」「チャットのログをとれる」というような機能の基盤をSync.IOは提供します。

      もし、1からPHPでチャットアプリケーションを作りたいときは、

      • チャットアプリケーション自身のユーザ認証基盤の作成(PHP)
      • 認証されたユーザだけが見れるチャットページの作成(PHP)
      • Sync.IOへアプリケーション登録
      • Sync.IOのAPIと連携するサーバサイド(PHP)
      • Sync.IOのSocket.IOと連携するJavaScript部分

      だけ(?)で「リアルタイムチャット機能」が作れます。リアルタイムなNodeアプリケーションの構築も、クローズドなチャットルームの実現方法も、連携ログの保持方法も考える必要がないですね。

      ちなみに社内技術発表のときの資料にSync.IOの仕組みが少し載っていますので、よろしければご覧ください。

      Sync.IOの今後

      Sync.IOは今のところzenpreのバックエンドという立ち位置で、それで十分なのですが、実は今すぐにでも他のアプリケーションで利用できます。
      (ユーザ登録やFacebookのようにアプリケーション登録の仕組みも既に持っています。zenpreもただの1アプリケーションとして登録されています)

      まずは、zenpreでない他のアプケーションに組み込む機会を得て、zenpreだけではわからないSync.IOの課題点を探ってみたいと思います。

      まとめ

      zenpreがリニューアルしました!

      是非使ってみてご意見ご感想をいただければと思います!

        はてなブックマーク - PHPmatsuriにいって来ました!(一人目?)
        このエントリーをはてなブックマークに追加

        多分久しぶりな登場の気がする萩原です。

        昨年に引き続きPHP Matsuriに参加させていただきました!
        (今回は福岡!)
        弊社からは何と8人も参加させて頂きました。
        全員LTで発表しましたので発表の最後の方にはまたFusicかとつぶやかれるくらいでした。

        一人目って書きましたが別に二人目とかタイトルが続くことは多分ないんじゃないかと思います。

        今回のPHP Matsuri

        今回は、本当にネタが思いつかずやることが決まったのは当日14時くらいでした。
        大して役に立たないものおもしろそうなものを作ろうということは何となく事前に決めていましたが。

        何とかネタは思いついたものの、時間内に出来るんだろうかとか思いながらバタバタ作っていたらなんだかんだで日付が変わったころには大体できてしまっていました。
        残り時間は書いたのもを見直したり、前でファミコンやってるのを眺めてたりホークスと横浜のトレードに衝撃を受けていたり(しかも今日公式に発表されたトレード、メンツが変わってたし)してました。

        今回やったこと

        今回はお絵かきのアプリを作りました。
        ただお絵かきするだけじゃつまらないので、
        お絵描きの履歴を取っておいて速度まで再現するものを
        CakePHPとJavasciptで作成しました。

        具体的に何をしたかというと
        ・canvasを利用して絵を描きつつ、mousemove中のマウスの座標や色、線の太さ、時刻を取得。
        ・絵を描き終わったタイミングでAjaxでデータを送信して保存。
        ・保存したデータを利用して、SetTimeoutを使ってcanvasで描写。

        なんてことをやってました。

        え?PHPがどこにあるのかって?
        saveとかfindとか使ったってば!
        PHPmatsuriの間一つもPHPに関してググらなかったけど!

        因みにmousemoveでとれる座標はすべて取得しているので1分くらい描き続けると保存のAjaxが30秒くらいかかります・・・。
        (まぁVM使って動かしてたんで実際にやればもっと速くなるとは思いますが・・・。)

        ちなみにちょっと公開する場所とかないのでお見せできないのが残念です。

        ついでに言うと発表はダダすべりしました・・・。

        感想

        ネタは2週間くらい前から考えてたんですが、思いついたのは当日。
        当日になって「エイヤ」でやっても意外となんとかなるものだなと思ってしまいました。

        発表は失敗しましたが(一説にはマイクが入ってなかったとかなんとか・・・)、
        作ったものを評価してくれたみたいで本とシャツをいただけました!
        ありがとうございます!

        前回は結構セッションをたくさん聞いたので、今回はコーディングをメインに参加しました。
        やっぱりあの雰囲気でコードを書くのはとても楽しかったです!

        何か次回は北海道とかいう宣言が何かなされていたので次回は北海道なのでしょう(笑)

        次回も楽しみにしておきます!
        後結局のところ私はFusicの変態枠なのでしょうか・・・