Author Archive

    はてなブックマーク - RDS for PostgreSQL を早速試してみた!
    このエントリーをはてなブックマークに追加

    Fusic杉本です。こんにちは。
    みなさま既にご存知だと思いますが、AWSが2013/11/14にRDSでPostgreSQLをリリースしました。


    その日と言えば、サー・ポール・マッカートニーの日本ツア福岡公演の日。
    若干AWSのニュースが薄れてしまっていたかもしれません!!!弊社がある福岡市内ではド派手なトラックが走っていました。

    私は先日の会社10周年記念パーティで弊社社長より福岡公演のチケットをいただいていたので、朝からこの2大ニュースでわくわくしてたまらず、筆を取りました。※ライブサイコーでした!><

    なぜこのニュースに胸熱なのか!?

    弊社では、特に“制限”がない限り、PostgreSQLを使用しています。
    理由は社内全員に経験があり、さらに社内のデータベーススペシャリストがPostgresマスターのため、パフォーマンスや複雑な処理が必要となったときに助けてもらえるから(と個人的に勝手に思ってる)です。
    で、この“制限”というのが、お客様の要件というよりも『AWSのRDSでPostgreSQLがないから仕方なく、MySQLを使ってる』という。。。(これも個人的に勝手に思っていることです)

    だからかなり胸熱です!

    ということで、早速Postgres for RDSを試したみました。

    とりあえずインスタンスを起動してみました。


    インスタンスの起動はAmazon Management Consoleから、MySQLのときと何ら変わりません。

    あるある!おなじみの象さん!

    とりあえずいつも通り、ポチポチと進みます。
    AWSブログではver.9.3.0が表示されていましたが、2013/11/16時点では9.3.1しか選択肢がありませんでした。9.3.1が2013/10/10リリースみたいなので、リリースが決まってからデフォルトバージョンもあげたのでしょうか。そのスピード感いいですね!

    ほんと全ての機能が使えるようでした。
    ・・・ようでしたが、Read Replicaは使えませんでした。9系からレプリケーション機能あると思ってたんですけど。

    しかし、バックアップ関係がそろっているだけでもう完璧です!!!
    もうこれでせっせと頑張ってEC2上でバックアップやらデータ領域を別EBSにしたりとか、冗長構成とか、諸々の心配事を楽して解決できますね!
    ※お金さえあれば。

    あとはいつも開発している感じで、さくさくっと動きましたよっと

    とりあえず、pgAdminでの接続とCakePHPで簡単なデータ登録を試してみました。
    vagrant上のアプリからの接続からなのか、e-mobileだからなのか、ケチってmicroインスタンスにしたせいなのかは不明ですが、結構重かったです。
    性能等については、近いうちに調査してみたいと思います。


    ※(左)CakePHPアプリケーションの画面、(右)pgAdminでの画面

    まとめ

    RDS for PostgreSQL胸熱!ってだけの記事でしたが、休みの日に気になって試した程度なのでお許しいただくとして、、、
    弊社は既にAWSコンサルティングパートナーとして多くのシステムをAWS上で構築してきましたが、今後より強みを活かして、開発をすることができそうです!

      はてなブックマーク - PHP Matsuri 2011に参加して得たこと(3/4)
      このエントリーをはてなブックマークに追加

      3区担当の杉本です。
      PHP Matsuri
      でのハッカソンは10/16に終わりましたが、弊社ではまだマラソンが続いています。

      「ブログを書くまでが”Matsuri”」

      ※リレーブログ形式になったのは初日の誰かさんのせいですね。

      PHP Matsuriについて

      今回、初めてPHP Matsuriに参加しました。また、ハッカソンというのも初めての経験でした。
      コアデベロッパーの方やお世話になっているライブラリの開発者の方にお会いできるのを楽しみにしていました。

      Matsuriでは過ごし方を手探りしながら、初日は講演とワークショップに参加して、日付が変わったところから開発を始めました。
      ただ、もう少しいろんな方とお話しすればよかったなと今は思っています。

      デモ大会での発表について

      ハッカソンでは「CakePHPのbakeで確認画面(添付画像付き)含めたソースを楽して一括生成する」というテーマで参加しました。

      弊社ではCMSや業務系システムなどの案件が多く、「確認画面(添付画像付き)」という要件も少なくありません。
      これが結構面倒な処理になるのですが、「TransitionComponent(hiromi2424さん)」と「FilebinderPlugin」を使うことでかなり簡単に実装ができるようになりました。ほんと感謝感謝ですm(_ _)m
      それぞれのライブラリの使い方については割愛させていただきますが、色々な方が詳しく解説されていますので是非調べてみてください。
      ※弊社ブログでも過去にTransitionComponentについての記事が書かれています。

      ただ、それでも案件毎に、モデル毎に同じ処理を書くのが面倒になってきました。

      「もっと楽に、簡単に、ミスがないように」

      実装するために、確認画面ありのCRUDをbakeを使ってソースを生成したいと思うようになりました。

      そこで、CakePHP1.3+から導入されたTemplatesを使って、コアのbakeをいじらず、実装することにしました。
      今回は即実践投入を考えて、まずはCakePHP1.3で開発。

      CakePHP Templatesについて

      Templatesはcakeディレクトリにあるtemplates/default一式をappにコピーして作っていきます。
      Controller/Modelについてはソースを見れば、修正は簡単でしたが、
      課題はCRUDの4ファイル以外のctpファイルをどう生成するか、でした。

      Matsuriに参加するまではコアのbake周りをいじらないといけないかと思っていましたが、cakephperさんに相談したところ、コアデベロッパーのグラハムさんに直接質問できる機会ができ、templatesを使って任意のctpファイルを生成するサンプルコードを教えてもらい、見事解決しました。

      ちょっと緊張しましたが、グラハムさんとお話ができたこの瞬間が一番楽しかったです。(でもやっぱり英語勉強しないといけませんね。。。)
      本当にMatsuriに参加してよかったです。

      CrudPlusPluginについて

      ブログを書きながら(思いつきで)名前を決めました。
      使い方はapp/pluginsディレクトリに置いてbakeするだけ。

      php cake/console/cake.php bake all

      該当するモデルを選ぶところはいつもと同じです。異なるのは最後にテンプレートを指定するところです。

      ---------------------------------------------------------------
      You have more than one set of templates installed.
      Please choose the template set you wish to use:
      ---------------------------------------------------------------
      1. confirm_with_file
      2. default
      Which bake theme would you like to use? (1/2)
      [1] > 1

      これでadd.ctp/edit.ctp/index.ctp/view.ctpに加えて、add_confirm.ctpも同時に生成されます。今回のハッカソンでは時間が足りず、edit_confirm.ctpまで作れませんでした。
      あと改善したいのはTransitionComponent/FilebinderPluginの存在チェックをして、なければ取得・設置できるような処理を入れたいと考えています。
      近いうちに仕上げて、GitHubで公開します。

      最後に

      今回、目標の一つにCakePHP2.0を学ぶというのを掲げていました。年内にはstableが出るだろうから年明けにはガンガン使い出すという雰囲気でしたので。
      ところが福岡に帰ってきてみると、いつの間にかリリースされているというお土産つき!
      CakePHPワークショップ中にバグを直すという(予期しない)”イベント”があったので、まるで自分が開発チームのような、一緒に2.0をリリースしたような気分に勝手になっていました。
      これはただの妄想ですが、いつも使っているフレームワークやライブラリを開発している方と直に話をすることで、さらにこのフレームワークやライブラリが好きになりました。
      これは今回得たものの中でも予想外のことでした。

      今回このような素晴らしい機会に恵まれたことに感謝しています。
      そして、PHP Matsuriのスタッフの方にはこの場を借りてお礼を言いたいと思います。本当にありがとうございました。

      さて明日は最終走者、弊社小山です。
      初日の安藤さんや吉岡さんのように、熱く”Matsuri”を語って、このリレーマラソンを締め括ってくれると思います。
      みなさん、期待しておいてください。

      それではまたどこかで。

        はてなブックマーク - USTREAM Flash Client APIの使い方
        このエントリーをはてなブックマークに追加

        はじめまして、Fusicの杉本です。

        Fusic Advent Calenderのルーレットをノリで作った張本人です。
        ここまで同じ人に複数回当たったり、言い出しっぺの弊社小山が当たっていなかったりと、バグって偏っているのではと責められてきましたが、やっと自分が当たって疑いが晴れた感じです。

        USTREAM API

        USTREAMといえば、先日宇多田ヒカルさんのライブを中継して話題になりましたね。
        同時アクセス10万以上、ユニークユーザ34万5000人、加えてあの画質と音質、USTREAMすごい!と感動した方も少なくないのではないでしょうか。
        また弊社でもUSTREAMを使ったサービスZENPREを提供しています。ご存じない方は是非一度アクセスしてみて下さい。

        さて、USTREAM APIの情報については、こちらに公開されています。

        • Data API Documentationは、ユーザ情報やチャンネルのURL、タイトル、概要などをhtml/json/xml/php形式で返してくれるAPI情報です。
        • Flash Client API Documentation (AsDoc)は、LIVE動画や録画動画のビューワや動画配信するブロードキャスターのFlashをカスタム実装するためのAPI情報です。

        今回はUSTREAMのFlash Client APIについて、ご紹介したいと思います。

        Flash Client API

        ドキュメントはASDoc形式になっていて見慣れた感じですが、コメントが少なく非常に分かりづらいです。
        実装の仕方はここにサンプルなどがあります。ここではビューワの実装方法について説明していきます。
        まずは提供されているswfをロードします。

        Security.allowDomain("*");
        var viewerLoader = new Loader();
        viewerLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onRslLoad);
        this.addChild(viewerLoader);
         
        var applicationDomain:ApplicationDomain = ApplicationDomain.currentDomain;
        var loaderContext:LoaderContext = new LoaderContext();
        var request:URLRequest = new URLRequest("http://www.ustream.tv/flash/viewer.rsl.swf");
         
        loaderContext.applicationDomain = applicationDomain;
        viewerLoader.load(request, loaderContext);

        LoaderのCOMPLETEイベントでtv.ustream.viewer.logicパッケージのLogicクラスをインスタンス化します。

        private function onRslLoad(e:Event):void {
        	var logicClass:Class = viewerLoader.contentLoaderInfo.applicationDomain.getDefinition("tv.ustream.viewer.logic.Logic") as Class;
        	viewer = new logicClass();
        }

        Display Class

        表示するUSTREAM映像の大きさを指定します。上記viewerオブジェクトのdisplayプロパティで値を設定します。width=300,heigth=200くらいが最小値のようです。

        viewer.display.width = 360;
        viewer.display.height = 240;

        Channel ClassとRecorded Class

        チャンネルの設定や動画の再生・停止、音量調整などはこちらのクラスを使います。
        Channel ClassがLIVE配信用、Recorded Classが録画再生用となっています。基本的に使い方は同じですが、動画をロードするメソッドが異なります。

        // LIVE配信用のロード
        viewer.createChannel(channelId);
        // 録画用のロード
        viewer.createRecorded(channelId);

        channelIdが少し分かりづらいですが、以下のようになっています。
        LIVE配信用は、ライブ配信ページのURL「http://www.ustream.tv/broadcaster/*******」の一番最後のスラッシュ以下の数字
        録画再生用は、録画動画受信ページのURL「http://www.ustream.tv/recorded/*******」の一番最後のスラッシュ以下の数
        となっています。このメソッドをたたくと、USTREAMにchannelIdを渡して、動画を読み込み始めます。
        余談ですが、サービスでこのchannelIdをユーザに入力してもらうのは難しいと思いますので、今回は紹介していないUSTREAMのData APIと連携し、番組名の登録でchannelIdを取得するようにしてみてはいかがでしょうか。(ZENPREではそうしています)

        イベント

        次に、その際に発生するイベントについて発生する順番で説明をしていきます。

        • found・・・指定したchannelIdの動画が見つかった時
        • video・・・ビデオが見つかった時
        • audio・・・音声が見つかった時
        • createStream・・・動画ストリームがつながった時
        • getProgressive・・・動画のダウンロードが開始した時
        • progress・・・動画のバッファを読み込む毎に

        その他のイベントについても簡単に説明をします。

        • finish・・・動画が最後まで再生された時
        • destroy・・・インスタンスを削除(destroyメソッドを叩いた)した時
        • muted・・・ミュートした時

        これらイベントは、LIVE配信時と録画再生時では参照するプロパティが異なりますので、注意して下さい。以下に例を示します。

        // LIVE配信時
        viewer.channel.addEventListener("found", function(e:Event):void {
        				// 処理を入れる
        });
        // 録画再生時
        viewer.recorded.addEventListener("found", function(e:Event):void {
        				// 処理を入れる
        });

        動画の再生・停止のイベントがないのがちょっと不便です。これらは自前で実装する必要があります。

        主要なメソッドとプロパティ

        最後にプレーヤを実装する上で注意が必要なメソッドとプロパティを説明をします。

        【メソッド】

        • seek(percent:Number, bufferOnly:Boolean = false):Boolean

        →シーク先の値は、録画動画のトータル再生時間における割合(値は0以上1以下)を第1引数に渡します。後述のプロパティdurationを使って算出します。

        【プロパティ】

        • bufferProgress: Number[読み取り専用]

        →動画データのダウンロードしたバッファーのプログレス値。値は0以上1以下です。

        • duration: Number[読み取り専用]

        →動画のトータル再生時間。単位は秒。

        • seekTo: Number[読み書き込み]

        →seekメソッドと同じ。こちらも値は録画動画のトータル再生時間における割合(値は0以上1以下)のため注意。

        • time: Number[読み取り専用]

        →現在の動画再生時間。単位は秒。

        • volume: Number[読み書き込み]

        →動画の音量。値は0以上1以下です。

        まとめ

        以上、USTREAM Flash Client APIの使い方の紹介でした。
        紹介した以外にも色々なAPIが用意されていますので、興味のある方は是非カスタムプレーヤを作ってみて下さい。またLIVE配信をする時は、通常USTREAMが用意したFlash(Web)かProducerを使うと思いますが、このAPIを使うと自前でブロードキャスタも作れます。

        今年Ustream Asia Inc.も設立され、ストリーム配信が盛り上がってきています。TVやラジオといったメディアの形が見直され、いつでもどこでも誰でも簡単に配信できる環境ができてきています。
        いままで当たり前だったことが崩され、変化していくというのはおもしろいですよね。自分が持っているものでコンテンツ化できるものがないか考えてみると、新しいサービスやビジネスが思いつくかもしれません。その第一歩として、弊社サービスZENPREを使ってみるのはいかがでしょうか。
        と、宣伝をいたしまして終わりたいと思います。
        (私は社内一まじめな人間なので、他の人みたいにボケたり、オチを入れたりしません。)

        長文を最後までお読みいただき、ありがとうございました。
        それでは良いお年を(もう当たらんだろう)