VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

tool

Node.js × Herokuで今日から始められる忘年会コンテンツ

こんにちは、ECナビでアプリケーションエンジニアとして働いている@chocopie116です。
いやーそろそろ年末ですね。
忘年会の時期も近いですね。

えっ!?ちょっと早いって!?
そう思う人は、ここでそっと画面を閉じてください。
あなたが呑気に生きてる間に、幹事様は年末どうしようと一生懸命悩んでいます!!w

さてここからは年末の忘年会ネタどうしようと悩む幹事の人だけ読み進めてください。

・はじめに
今回のエントリーでは、忘年会どうしようと頭を悩ませる人たち向けに、VOYAGE GROUP総会で開発したクイズシステムを紹介します。

弊社VOYAGE GROUPでは、半期を通じて活躍した人材・プロジェクトを表彰する総会が年2回あります。内容としては、2部構成になっており、1部は全社の振り返りや、表彰式が行われます。2部では所謂オモシロコンテンツが催されます。

ある日、今回の2部のおもしろコンテンツをどうしようか話していました。
VOYAGE GROUPは前身アクシブドットコム・ECナビも含めると創設15周年でおめでたいし、なんか面白いことやりたいよねーという話になり
やっぱりクイズは鉄板だよね!!という話になり、
全社員300名弱を巻き込んだクイズ大会というアイディアに決まりました。
サービスイメージ図
こういう感じのサービスならきっと世の中であるだろうと思い、google先生に、"クイズ 忘年会"、"クイズ 結婚式"、"スマホ クイズ システム"といった切り口で聞いても、既にクローズしているサービスが多く、利用できるサービスはありませんでした。

・なので、つくってみました
とりあえず構成はこんな感じで。
クイズコンテンツ概要
クイズの面白さを際立たせるため参加者を巻き込んだ出題VTR・解答VTR等は、WEBでやろうとするとリッチな表現の要求により爆死することが目に見えているので、DVDの映像を使います。
回答結果や、ランキング表示の部分のみスタッフ(管理者)のPCを使いウェブアプリをひらいたブラウザをスクリーンに映します。
つまりスクリーンではスイッチャーを用いて、シームレスにブラウザとDVDプレーヤーの映像を交互に映します(実はこのからくり、実際にあの場でいた人たちも気づかなかったはずです)。

またウェブアプリとして実装する機能もなるべくシンプルにしました。
・簡易ユーザー機能(ランキングの名前表示のため)
・回答機能
・問題の管理機能

・採用した手段
WebSocketや、イベントループ方式のほうがよさそうと思いNode.jsを採用。
インフラは手軽に使えるPaaSのHeroku採用しました。(といってもどちらも実戦投入初で使ってみたかったのが一番の理由w)

・実際の様子
こんな感じで出題(DVD)をして、制限時間内に会場の参加者にスマホで回答ボタンを押してもらいます。
出題

制限時間がきたら、こんな感じで回答結果(WEBアプリ)を表示します。 

回答集計結果
回答集計結果表示の後は、ユーザーの早押しランキングを表示しました。
・時間かけたこと・捨てたこと
新しいことにトライするのは楽しいですが、メインの業務ではないのもあり時間の制約があります。
以下のことを取捨選択しました。

■拾ったこと
ベンチマークテスト・回答受け付け処理の高速化
→制限時間内での回答がさばけるかどうか。想定リクエストが来てもアプリケーションに問題がないかどうか。
→回答受付処理で少し時間がかかる部分は、キャッシュじゃなく直接アプリのメモリに乗せたりして早くした。

■捨てたこと
お前は今まで食ったパンの枚数を覚えているのか?


ちなみにDynoは、一番高いPXのsizeを使いました。
ベンチマークテスト入れても24時間しかぐらいしか稼働させないので迷わずお金で解決にかかりました。
もろもろのサーバー利用料で2000円ぐらい支払いがきていたと思います。

・まとめ
やはり会場参加型のクイズコンテンツは盛り上がります。
また小規模の忘年会で映像つくれないよーという方は、DVDの代わりにパワーポイントのアニメーションを使うことで同等のサービスを提供することができるかと思います。
またスイッチャーがない場合でも、2台のプロジェクターを用意し、出題と回答を同時に表示するなどして対応出来ると思います。うまいことやりくりをしましょう。

さて、このエントリーでは、皆様の年末の幹事業の何かヒントになりましたでしょうか
最後になりますが今回実装したアプリのコードをgithubで公開しました。

node初めてだしーとか、オレオレprivateリポジトリだったしーとか
色々言い訳を挙げればキリはありませんが、もうえいやっと公開してしまいますw
enkai-quiz
それでは皆さんの忘年会 幹事業の成功をお祈りしております!

MongoDBのGUIツールを比較してみた

みなさんこんにちは。
(株)adingoでprivate DMPと呼ばれるcosmi Relationship Suiteの開発をしています。
@tana_raことあらたです。

世の中にはアルファベット3文字が溢れていて混乱しますよね。AWSと広告業界が混ざるとカオスです。
AWSとかEMRとかSSPとか。DMPもその一つですね。
ちなみにDMPはData Management Platformの略です。

ところでcosmiでは、データの管理にMySQLとMongoDBを利用しています。
私は開発時にはMySQLのGUIツールをよく利用するのですが、
MongoDBのGUIツールってあまり聞かないなと思ったので探してみました。
今日は触ってみたMongoDBのGUIツールを紹介してみたいと思います。
基本的にWEBベースの物を利用しています。

触ってみたGUIツールたち
  • phpMoAdmin 1.1.2
  • RockMongo 1.1.7
  • mongo-express 0.18.0 (※) 
  • Genghis 2.3.11
※mongo-expressは最新版では、依存ライブラリのバージョンによって動かなかったため、
現在masterブランチに上がっているものを利用しています。

phpMoAdmin

まずはじめにphpMoAdminです。
名前から分かる通りPHP製です。
phpMyAdminとかphpMyFaqとか似た名前のものがたくさんありますね。
1ファイルで出来ているので、apacheのDocument Rootに配置するか、
PHPのビルトインサーバで利用することが出来ますね。

インストール
$ wget http://www.phpmoadmin.com/file/phpmoadmin.zip
$ unzip phpmoadmin.zip
$ mv moadmin.php /var/www/html/moadmin.php
でインストール完了です。
以下がその画面です。

phpMoAdmin1


何にもせず接続できました。
デフォルト設定で接続ができますが、Configファイルなどはないので
portを変えたり、認証をつけたりすると使えなくなってしまいます。

(無理やりコードを変更することで色々できますが・・・w)
基本的なデータの確認は可能ですが、ユーザ認証とかは無いみたいですね。

RockMongo

次にRockMongoです。これもPHP製。
したがって、phpMoAdminと同様の方法で利用することが出来ます。


インストール
$ wget "http://rockmongo.com/downloads/go?id=14” -O rockmongo.zip
$ unzip rockmongo.zip
$ mv rockmongo-1.1.7 /var/www/html/rockmongo
これで完了です。
アクセスすると以下のような画面が現れます。
RockMongo
ログイン認証もできますが、以下のように
/var/www/html/rockmongo/config.php
の31行目を編集すれば認証を無くすことも可能です。
31 //$MONGO["servers"][$i]["control_auth"] = true;//enable control users, works only if mongo_auth=false
32 $MONGO["servers"][$i]["control_auth"] = false;
するとこんな画面が現れます。

RockMongo2

RockMongoは結構機能が多そうですね。
データの確認も見やすくていいです。

mongo-express
mongo-expressはJavaScript(node.js)製のGUIツールです。
CSSはTwitter Bootstrapを利用しているようで綺麗です。

インストール
$ npm install https://github.com/andzdroid/mongo-express/tarball/master
・・・
$ cd node_modules/mongo-express
$ cp config.default.js config.js
$ vim config.js
デフォルトだとconfig.jsが無いため怒られます。
なのでconfig.default.jsをコピーして使いましょう。
今MongoDBで認証は行っていないのでconfig.jsで認証が必要ないように変更します。
変更しないとConnectionErrorとコンソールに出てきます。

 35 //    adminUsername: 'admin',
 36 //    adminPassword: 'pass',
 37     adminUsername: '',
 38     adminPassword: '',

$ node app
Mongo Express server listening on port 8081
Database connected!
Admin Database connected
以下がアクセスした時の画面です。
mongo-express-find
右のバツボタンを押したらこのレコード消してくれそうだなーと思って押したら
確認なしで消してくれましたw
とてもカジュアルですね・・・(´・ω・`)w

Genghis

最後にGenghisです。
Genghisの読みがわからなくてぐぐったらチンギスハンのチンギスらしいです。
gem installでもできるらしいのですが、
PHPerな私はPHPのビルトインサーバを利用しました。
(色々躓いたわけでは決してないです。)
こちらもTwitter Bootstrapを利用しているのでどことなくモダンな感じです。

インストール

$ wget https://github.com/bobthecow/genghis/archive/v2.3.11.zip -O genghis.zip
$ unzip genghis.zip
$ mv genghis-2.3.11 genghis
$ cd genghis
$ php -S localhost:8080 genghis.php
として、アクセスしたら下のような画面にたどり着きました。

genghis-top


localhostを選択すればlocalhostのサーバにつながります。
その他にもAdd serverとやれば、他サーバのMongoDBにもつなげることが出来そうです。
localhostにつなげてみた画面が以下のようになります。

genghis

Twitter Bootstrapのおかげかとても見やすいですが、
findとinsertくらいの機能しかありませんでした。

まあ見やすければ・・・いいですかねw

全体的な比較
phpMoAdmin RockMongo mongo-express Genghis
Version 1.1.2 1.1.7 0.18.0 2.3.11
言語 PHP PHP JavaScript(node.js) PHP or Ruby
License GNU GPL BSD MIT MIT
Github phpMoAdmin RockMongo mongo-express Genghis
出来ること
データ
コレクション
データベース管理
認証 × △(configファイル利用) ×
他サーバアクセス × × △(configファイル利用)


という感じでしょうか。
データの確認レベルであればphpMoAdmin以外はどれも良さそうだなーと思いました。
MongoDBにはAggregationMap-Reduce機能もありますが、
それら用のなにか特別な機能はなさそうでした。
考えてみたら、結局難しい処理はシェルで打ち込んでしまうと思ってしまい、
個人的にはGUIツールに要求する機能はデータの確認くらいという結論に至りました。

そうすると、データの確認がカジュアルにできる、
mongo-expressはかなりいいなと思います。
(開発環境とはいえ誤って複雑なレコードを消したら泣きそうですがw)

GUIツールは個人に依る部分があると思うので皆さんも試してみるといいかもしれません。
以下に検証に利用したレポジトリを用意したので、
是非みなさん、MongoDBのGUIツールと戯れてみてください。
VagrantとVirtualboxを利用してMongoDBのGUIツールを検証出来るレポジトリです。

https://github.com/tarata/mongo-gui-try


アラートをXymonからチーム開発向けのめっちゃグレートなグループチャットidobataにpostする

Zucksの技術環境整備係 @bash0C7 です。

さて、我々は今のところシステム監視にXymonという統合監視ツールを使っています。基本のXymon Client連携の他、カスタムスクリプトで定期的にAWSのリソースの状態を監視したり、Fluentdからfluent-plugin-xymon経由でXymonにメトリクスを取り込んだりという手を加えながら、より高いサービスレベルの達成に力を注いでいます。

Zucks Ad NetworkではXymonが問題を感知したときの通知として、これまでは伝統的なメール発報を行ってきました。利用実績の多さに加え、最近だと携帯にプッシュを受けれたり、ルールに基いてメールを転送したり、フィルタリングしたりと、伝統的とはいえまだまだ使い手のある手段ではあります。
ただ、21世紀の今日、もっとカジュアルかつ即時性が高く、送られてきた通知を契機に迅速かつスムーズにコミュニケーションが取れる手段を使いたいなあと思っていました。

そこで我々は"チーム開発にフォーカスした快適なグループチャット"idobataとXymonを組み合わせることで上記を実現しました。

Xymonからidobataに通知


idobataはグループチャットとして動作がスムーズで謳い文句の通り快適に使うことができる他、WebHook機能によってGithub、PivotalTracker、Jenkinsなど日常的に使っているポピュラーな開発支援ツールからの通知をかんたんに取り込むことができます。
Xymonからidobataの連携は、汎用のGeneric WebHookに、Xymonサーバからアクセスする方法をとっています。

下記2ステップをXymon側に設定するだけでかんたんに実現できるので、Xymonを使っている方は是非速攻でお試しください。
他の監視ツールを使っている場合も考え方は同じなのでかんたんに適用できるでしょう。 また、Fluentdにはfluent-plugin-idobataというプラグインがあるので、こちらも利用すると捗るかと思います。

■ステップ1

alerts.cfgに、条件に合致したらスクリプトをキックするように設定を追加します。
例えばいずれかのホストでCOLORがredの場合に/path/to/xymon2idobata.shをキックしてidobataに通知する場合、下記の様に記述します。
$ZGOK_IDOBATA_WEBHOOK_URL=https://idobata.io/WEBHOOK_URL

HOST=* COLOR=red
  SCRIPT /path/to/xymon2idobata.sh $ZGOK_IDOBATA_WEBHOOK_URL  
idobataのWebHook URLはidobataのルームごとにユニークなものが発行されるので、idobataのROOM SETTINGSをご覧ください。
alerts.cfgの詳細な書き方は、http://xymon.sourceforge.net/xymon/help/xymon-alerts.html#scripts をご参照ください

■ステップ2

idobataに通知するためのxymon2idobata.shを実装します。
スクリプトの中では、エラーの状況やメッセージなどが環境変数で渡されるので、それを元にhttpリクエストを作ってidobataにpostします。
#!/bin/bash

WEB_HOOK_URL=$RCPT

IDOBATA_STATUS="<span class='label label-info'>${BBCOLORLEVEL}</span>"
test ${BBCOLORLEVEL} = "red" && IDOBATA_STATUS="<span class='label label-important'>FAILURE</span>"
test ${BBCOLORLEVEL} = "yellow" && IDOBATA_STATUS="<span class='label label-warning'>WARNING</span>"

curl -s $WEB_HOOK_URL --data-urlencode "body=${IDOBATA_STATUS}<pre>${BBALPHAMSG}</pre>`echo $BBALPHAMSG | sed 's/.*See http/http/g'`" -d format=html
スクリプト中で使えるXymonの環境変数についても、http://xymon.sourceforge.net/xymon/help/xymon-alerts.html#scripts をご覧ください。
ちょっとしたハマりどころとしては、alerts.cfgで渡したrecipient情報(ステップ1では$ZGOK_IDOBATA_WEBHOOK_URL)は、コマンドライン引数ではなくRCPT環境変数に格納されます。

このスクリプトではidobata.ioでGeneric HookでFAILUREとかSUCCESSを出すを大いに参考にして、エラーレベルごとにわかりやすくidobataに表示するようにしています。
BBCOLORLEVELにredだのyellowだの、Xymonのエラーレベルのカラーが渡ってくるので、これでどのようなラベルにするか判断しています。

また、Xymonからのメッセージをpreタグで囲むようにしましたが、これだとメッセージの最後についているURLがidobata上でクリッカブルになりません。`echo $BBALPHAMSG | sed 's/.*See http/http/g'` でURL部分をpre外にも出して、idobataに送り込んでいます。


どうですか、かんたんだったでしょう?
上記スニペットはMIT Licenseとしますので、ご自由にお使いください。


また他にも様々な技術的なアーキテクチャや工夫を行っています。
PHPカンファレンス2013やad:tech Tokyo 2013 AWSブースで講演した時の資料を公開していますので、こちらも是非ご参照ください。

■PHPカンファレンス2013講演資料

■ad:tech Tokyo 2013 AWSブース講演資料

そして、VOYAGE GROUPや広告配信に興味を持ちましたら、是非こちらもご検討ください。
VOYAGE GROUP キャリア採用 広告配信システムエンジニア

HRForecastでサービスの数値を見える化してディレクターに好評。そしてアンパンマン。

こんにちは、VOYAGE GROUPの水越(@Akiyah)です。
ECナビECナビ でエンジニアをしています。

最近、同僚のコテツさんが社内にHRForecastを導入してくれました。
HRForecastとは数値を毎日/毎時で登録するとブラウザ上でわかりやすいグラフにしてくれるツールです。

HRForecast - もうひとつのデータビジュアライズツール - blog.nomadscafe.jp 

ディレクターの方が必要としている数値を、われわれエンジニアが出して渡すという運用は今までもいろいろな方法でやっていました。管理画面を作ったり、デイリーバッチで数値の入ったメールをメーリングリストに送ったり、エクセルファイルやCSVファイル、グラフ画像を更新してファイルサーバーに置いておくといったやり方です。
しかしHRForecastを使うと数値の更新もデータの表示も楽になるので、できるところから順次HRForecastに移しているところです。

sample

HRForecastのいいところ(エンジニア目線)

(e1) データを記録するのはhttpでPOSTするだけなので簡単。

たとえばデータ解析環境「R」ではこんな感じで、APIにしたがってsimplePostToHostを叩くだけです。

このスクリプトを1回動かすとすると、グラフに当日と前日の数値がプロットされます。(なぜ前日分もプロットするのかは後述)

(e2) 過去のデータは保存してくれるので、最新のデータのみ更新すればよい。

過去のデータは保存されるので、過去のデータを計算しなおす必要は無く、毎日最新のデータを更新するだけでよいです。
CSVファイルを毎日更新するような運用の場合、毎回何ヶ月分もの過去分を含めて計算しなおしていることが多いので、最新のデータのみ更新すれば良いのはとても助かります。
HRForecastを使い始めの時は、上記のスクリプトを必要な過去の日数分繰り返すようなスクリプトを書いて1回だけ過去データをまとめて入れておくと良いでしょう。

(e3) 過去のデータを上書きすることもできるので、未確定のデータを入れておくこともできる。

たとえば当日のDAU(Daily Active Users:1日にサービスを利用したユーザー数)を1時間おきに更新したい、と言うような場合、上記のスクリプトを1日1回では無く、毎時実行するだけで毎時更新を行うことができます。
DAUの場合、ある日のDAUが確定するのは次の日になってからになりますが、そういう場合には前日と当日のDAUを更新するようなスクリプトを書いておきます。そうすれば当日分は1時間おきに更新され、前日分は日が変わって確定した時に(1時間以内に)確定した数値で更新されます。

(e4) シンプル

上で書いたようにPOSTするAPIはシンプルです。
そして、データベースのテーブルもdata(個々の数値)、metrics(グラフ)、complex(複合グラフ)の三つだけで、その中身も一度HRForecastを使った人なら何となくわかるくらいシンプルです。
テーブルの構成がシンプルなので、ブラウザ上では面倒なこともSQLで一気に操作することが簡単にできます。
うっかりしてグラフをたくさん作ってしまった時などはよくSQLを使って消しています。

ちなみに、HRForecastではブラウザ上でグラフを書くのにdygraphsというJavaScriptライブラリが使用されています。HRForecastのviewの部分はdygraphsにCSV形式のデータを渡しているだけなので、viewの部分もシンプルに作られています。 

HRForecastのいいところ(ディレクターの人から聞いた意見)

(d1) CSVファイルとしてダウンロードできる。

Excelで加工したい場合も多いので、描画されたグラフではなく元のデータが得られるのはうれしいようです。

(d2) グラフを拡大、縮小して見たいところに注目することができる。

データはたくさん(例えば何年分も)入れておいても、表示するときに最新の1ヶ月分などを簡単に見られるのが好評です。

(d3) URLさえ知っていれば見ることができる。

今までの仕組みだとメーリングリストに入らないと自分にはメールが届かなかったり、権限をもらわないと管理画面を見られなかったりするので、それに比べるととても便利です。
(もちろん社内のLANからしか見られないようにはしています)

アンパンマン

と言うわけで、社内で好評なHRForecastですが、もっと仲良くなるためにアンパンマンを書いてみました。私にとってアンパンマンはHelloWorldなのです。
まずは以前作ったアンパンマン方程式を使って、横軸を日付(2013/1/1~2013/12/31)、縦軸を整数(-200~200)でcsvファイルにしました。
そしてそのcsvファイルの数値をHRForecastのグラフとして登録します。HRForecastの(複合グラフではないほうの)グラフには1つの線しかかけないので、アンパンマンの顔を6つのパーツに分けて登録しました。

顔の輪郭(上)
顔の輪郭(上)
顔の輪郭(下)
顔の輪郭(下)

目
はなとほっぺ
はなとほっぺ
まゆげ
まゆげ
くち
くち

これらのグラフをHRForecast上で複合グラフにして、アンパンマンの完成です!

アンパンマン
↑これはHRForecastに貼り付けたもののスクリーンショットですが、HRForecastで実際に見るときはインタラクティブに操作ができるので、その雰囲気を感じられるようにdygraphを使って拡大縮小できる状態にしたグラフを下に貼っておきます。(canvasが使えるブラウザのみ)
みなさまもHRForecastとアンパンマンとお友達になれましたでしょうか。
Happy Anpanmaning!

おまけのばいきんまん

こちらもcanvasが使えるブラウザのみ
バイバイキ〜ン!


追記(2013/10/15 18:30)
はからずもこの記事を書き終えて公開してからやなせたかしさんの訃報を知りました。
アンパンマンは私の息子と娘、そして私にとってのヒーローでした。
ご冥福をお祈りいたします。

Google Tag Manager for MobileでABテストをしてみたかった

こんにちは。android事業室エンジニアの@shinbashi です。
 
8月中旬にGoogle Tag Manager (以下GTM)がモバイル・アプリ向けに対応したことが正式に発表されてから久しいですが、きちんと見ていなかったのでせっかくなので調べて使ってみた時の事を書こうと思います。

さて、 GTMってなんだ?という方もいらっしゃるかもしれないので、簡単に紹介させていただきます。
こちらが正式発表がされた際のブログの日本語訳から、分かりやすそうな部分の抜粋になります

ボタンを押してイベントを追加するのを忘れた? それは、まいったな!

キャンペーン終了直前にコンバージョン追跡を追加しなくてはいけない? それはひどい!

大事な設定を変更しなくてはいけないことに気付いた? 残念だが、それは無理だ。

これは、今までの話! 今年初めにGoogle I/Oで予告したように、今日、当社はモバイルアプリ向けのGoogleタグマネージャをローンチします。

モバイルアプリ用Googleタグマネージャを一度導入してしまえば、設定変更は可能になり、分析、リマーケティング、コンバージョントラッキングを、対象のアプリをアップグレードせずに追加することが可能になります。
 

引用元:モバイルアプリ向けGoogleタグマネージャ登場! 

おお、なんだかすごく便利そうですね!予めSDKを仕込んでおけば、ある程度GTMからいろいろなところにフック出来そうな感じがします。
何はともあれ、とりあえずヘルプを見てみます。

モバイル アプリ向け Google タグマネージャ

Google タグマネージャを使用すると、変更予定のある設定値や、条件に応じて変える可能性のある設定値を簡単に管理できます。具体的には、アプリ内の値を定数ではなく変数として定義して、これらの値を指定するルールを Google タグマネージャで管理します。例として次のものが挙げられます。

  • アプリに掲載する広告のサイズや位置(画面サイズに応じて広告バナーの縦のサイズを変更する場合など)
  • ゲームの設定
  • ユーザー インターフェースの設定(プラットフォームに応じて変更する場合など)
  • デバイスの言語によってローカライズする文字列

引用元: Google タグマネージャについて - Tag Manager ヘルプ

・・・、なんだか入れ忘れたイベントを追加したり、コンバージョンを追加したりするのはどうやるのかイマイチわかりません。予め設定をGTM経由で取得するようにしておけば、設定変更を行えそうだということはわかりました。
  • イベント追加忘れ→そいつは参ったまま
  • 急なコンバージョンの追跡→それもひどいまま
  • 大事な設定の変更→残念じゃないかもしれない!予め仕込んで置けば無理じゃないかもしれない!
 といった具合のようです。
記事を書き始めた当初はイベント追加し忘れたよ!GTMで新しく追加したよ!みたいな記事を書こうと思ったんですが、完全な見切り発車でした。
 
なのでここで大きく方向転換をして、近々ABテストが実装できるとの事なので、おそらく現在の機能でも頑張ればABテストできるんじゃないかと思ってABテストのようなものを実装してみることにしてみました。 
続きを読む
記事検索
QRコード
QRコード