Keen IOでグロースハックするための分析をする

グロースハックというキーワードがちょっと前から流行っていますが、Webサービスの利用状況の分析、何で行っていますか?GoogleAnalyticsMixPanel

でもGoogle Analyticsではトラフィック分析がメインだし、MixPanelはサマりすぎ、もっといろんな切り口で分析したい!そこで、とりあえず分析したい項目だけがんがん入れたJSONを送り込んだあとで分析できるKeen IOというサービスがあります。

Keen IOは月間のイベント数が50,000までは無料で利用できますが、それ以降は有料になります。全トラフィックを送るとすぐイベント数が超過してしまいますが、必要なものだけ送るのであれば十分ですね。

サービスが利用されるようになれば売上もあがるようなサービスであれば、費用もそこまで問題にならないのではないでしょうか。

イベントを送信したり閲覧したりするためのSDKはiOS, JavaScript, Android, Python, Ruby, Java, Node, PHPなど各種プログラミング言語向けに公開されています。

私は主にPHPから利用していますが、PHP版は非同期送信に対応していないため、cURLコマンドを利用して別プロセスで送信するようにしています。

public function event ($name, $params) {  
        $payload = json_encode($params);
        $payload = escapeshellarg($payload);
        $url = sprintf(
            'https://api.keen.io/3.0/projects/%s/events/%s?api_key=%s',
            KEENIO_PROJECT_ID,
            $name,
            KEENIO_WRITE_KEY
        );
        $cmd = '/usr/bin/curl -X POST -H "Content-Type: application/json"';
        $cmd.= ' -d ' . $payload . ' "' . $url . '"';
        $cmd.= ' > /dev/null 2>&1 &';
        exec($cmd, $output, $exit);
    }
    

送信するイベントの中身はMongoのように好きなパラメーターを定義して送ることができます。

分析のためのAPIは基本的なものがすでに用意されており

  • イベント名
  • 分析の種別
    • sum 数値の合計値
    • count カウント
    • countunique ユニークカウント
    • minimum 値の最小値
    • maximum 値の最大値
    • average 値の平均値
    • selectunique カラムの値
    • extraction 生データ(最大100件まで)
  • 対象のカラム
  • グループ化(Group By)
  • フィルタリング
  • 出力する対象期間
  • 集計(minutely, hourly, daily, weekly, monthly, yearly)
  • タイムゾーン

を指定できます。たとえば以下のような集計が簡単にできます。

  • 機能ごとの利用者数を知りたい
  • 利用者ごとの指定した機能の利用回数を知りたい
  • 利用者一人あたりの平均課金額が知りたい

Keen IOはこの集計結果をJSONとして出力するだけでなく、JavaScriptのSDKにはグラフを表示する機能もビルトインされています。複雑な集計はJSONとして出力した後、自分で加工する必要がありますが、「このフィールドごとの数を知りたい」といったわりとシンプルなものは簡単に画面に表示できます。

また、Workbenchという機能がKeen IOの管理画面にあります。FacebookのGraph API Explorerに近い機能ですね。プログラムレスに集計を行いその結果をグラフとして出したり、結果をJSONで表示、表示するためのJavaScriptのコードの出力、結果をcURLで得るためのURLも表示できるので実装前に集計を行うことができるので実装の準備を行うにはとても便利です。

Fluentd+Elasticsearch+Kibanaでほとんど同じことができるとは思いますが、環境構築するためのリソースが無い時やシンプルに分析したいときに活用できると思います。

ブログをGhostに移行しました

以前、さくらのVPSで運用していたサーバーを手放す必要があり、WordPressから静的HTMLでブログを運用できるOctopressに移行していたわけですが、このたび仮想サーバーをまた利用できる状況になり、静的HTMLで運用するのはもったいないなと思いGhostに移行することにしました。

Ghostはまだまだ機能が少なく、不具合も多いですがMarkdownで記述でき、ライブプレビューが右側に表示されるエディタが気にいり乗り換えを決めました。

私の運用しているブログは記事数もそんなに無いのですが、OctopressからGhostに移行するスクリプトを作っている方が居ましたので、それを利用しました。

jbrooksuk/OctoGhost

ついでにテーマまで作りました。まだ公開できるレベルのものではありませんが、カスタマイズができるよう調整したらGhost Open Maeketplaceで公開しようかなと思っています。

テーマに対して普通にHTMLやCSSを書く以外にやったこととしては

  • <!-- more --> に対応
    • Ghostの「続きを読む」はいわゆる抜粋にしか対応していないので、本文中の任意の場所で「続きを読む」が表示できるようJavascriptで対応しました。
  • サイドバーに新着記事一覧
    • Ghostのほとんどのテーマは1カラムで、しかも個別記事で記事一覧を取得するすべが無いのでこれもJavascriptでフィードを読み込んで表示するようにしました。
  • サイドバーに最近のコメント一覧
    • Octopressに移行したタイミングでコメントシステムをDisqusにしていました。Disqusにはコメント一覧を出すウィジットも特に無いようでしたので、これも新着記事を表示するのと同じ要領で実装しています。

Javascriptでフィードを取得する部分はGoogle Feed APIを利用していますが、若干パフォーマンスが気になるのでCronで定期的に取得するようにしてもいいかなと思いました。

テーマにJavascriptで実装したほとんどの機能はPlanned Featuresで予定されているので、バージョンアップとともにそちらに移行します。

テザリングでダウンロード容量制限をするプロキシ

ふと Nexus 4 をいろいろと触っていたところ、「データ使用」のサブメニューに「モバイルアクセスポイント」という項目を発見しました。最初はテザリングをする項目かなと思ったらどうやら違うようで「このWiFiアクセスポイントはテザリング経由」という設定ができるようです。

Android端末は設定によりますがWiFiに接続していると勝手にアプリをアップデートしてくれますが、大きいファイルをダウンロードすることになるとすぐ通信量があがってしまいます。日本の通信事業者各社は月間7GBの通信量制限をしているわけですが、この設定を行うことでその通信量を抑えることができます。

で、本題ですがMac OSXに同様のことをしてくれる機能があるとありがたいのですが、残念ながら無いようです。OSXもバージョンが上がり大変便利になりましたが、AppStore経由でソフトウェアアップデートで勝手にアプリやOSのアップデートをダウンロードしてくれます。が、テザリングしていてもダウンロードしてくれるので7GBなんてあっという間です。

そこで、ダウンロードされるファイルサイズを制限するプロキシを考えました。最初はRubyでWEBRickを使ったプロキシを考えましたが、プロキシのソフトウェアに設定を仕込むのがお手軽かと思い、今回はSquidを使うことにしました。

SquidをMacにインストールするにはHomebrewを使う方法などありますが、今回は簡単にインストールできるSquidManを使うことにしました。

インストールを行い、設定に以下を追記します。

# 端末から払い出されるIPアドレス帯を指定します
    # 以下は iPhone 5 における例
    acl tethered src 172.20.10.0/24  
    # ファイルサイズを10MBに制限
    reply_body_max_size 10 MB tethered  
    

本当はグローバルIPアドレスやDNS名を指定したいのですがその指定は簡単にはできなさそうなので、端末から払い出されるIPアドレスを判別し簡易的に識別することにします。同じIPアドレス帯を他で使っている場合にはちょっと難しいですね。。

設定ファイルを修正し起動したらプロキシ設定をOSXの設定から行います。一つ注意が必要で、「Webプロキシサーバー」に127.0.0.1やlocalhostなどを指定すると、Squidからは接続元のIPアドレスがローカルホストになってしまうため判別できませんので、「コンピュータ名.local」を指定します。「保護されたWebプロキシ」にも同じ設定をしましょう。

これで実際にテザリングして大きなファイルをダウンロードしようとしたときにSquidのエラー画面が表示されれば問題ないですね。

Have a nice NOMADO life.

YahooのワンタイムパスワードはGoogle Authenticatorと互換性がある

先日Yahoo!JAPANのIDとハッシュ化されたパスワードが流出したと報じられた

パスワードを変更したうえで、iPhoneのApp StoreでもYahoo!JAPANワンタイムパスワードが上位にランクインされていたので、早速私も設定してみることにしました。

アプリを起動して、Yahoo!JAPANのサイトのインストラクションにしたがって設定しようとしてふと思ったこととして、私は普段からGoogle Authenticatorを利用してGoogleの二段階認証をしているのですが、これは面倒だなと。。どうせならGoogle Authenticatorひとつにまとめたい。

なんの下調べもせずに、Yahoo!JAPANのワンタイムパスワード設定画面の「自動設定がうまくいかない場合(手動で設定)」のリンクを押し、表示された登録コードをGoogle Authenticatorに設定してみた。

するとどうだろう。そのまま使える。

Yahoo!JAPANのワンタイムパスワードとGoogle Authenticatorには互換性があるようです。

アプリを2つ使い分けるのが面倒で統一したいという方、お試しください。

サーバーをRackHubに移行

これまで様々なレンタルサーバー、VPSサーバーを転々としていましたが、ブログをWordPressからOctopressに変更したことでメモリすら必要がなくなりました。

Octopressであれば静的HTMLでしか構成されなくなり、GitHub Pagesで運用できるのでサーバーすらいらないわけですが、やはりサーバーが海外にあるとレスポンスが悪い。

さらに言うと、ただのレンタルサーバーよりSSHなどで黒い画面を観れるVPSのほうが心が落ち着くわけで。。

今まで借りていたさくらのVPSよりも安いVPSは無いかな?と思いちょっと探して悩みましたがRackHubを使うことにしました。今回はWebサーバーだけあれば十分なのでRack X1を選択。メモリ256MB、ディスク4GBで15日260円=月額520円。

秘密鍵でのSSHログインは自動で設定されるし、ミドルウェアがあらかじめひととおりインストール済みなので、バージョンを選ばないのであれば楽に構築ができます。IaaSとPaaSの間みたいで新鮮。

インストール済みのNginxの設定ファイルを編集し起動するだけで構築は完了。空きリソースは以下の通り。

    $ free
                 total       used       free     shared   buffers     cached
    Mem:        245404     173112      72292          0     41004      91524
    -/+ buffers/cache:      40584     204820
    Swap:       524284          0     524284
    
    $ df
    Filesystem     1K-blocks   Used Available Use% Mount
    ed on
    aufs             5104816 223000   4625816   5% /
    udev              113528      4    113524   1% /dev
    tmpfs              49084    204     48880   1% /run
    none                5120      0      5120   0% /run/lock
    none              122700      0    122700   0% /run/shm
    

結局バックエンドはさくらの専用サーバーのようで、レスポンスはなかなかいいです。

ご参考までにこのドメインをホスティングするために転々としたレンタルサーバー、VPSサーバーを以下に列挙します。覚えている限り時系列に。

Octopress への移行についてはまた近いうちに書きます!

1 of 10