結婚式で写真共有アプリを開発しエンドロール作成費をケチった話
8月3日に雅叙園にて結婚式をあげました。
数年前に雅叙園で開催されたHadoopのカンファレンスに参加した時に雅叙園に一目惚れ。
憧れ続けやっと雅叙園で神前式をあげることができました!!
さて、本題。
実は夫婦2人ともシステムエンジニア。ということで、ずっと一緒に何か作りたいね。って話をしてて、せっかくなので結婚式で使えるものを開発することにしました。
あと、親族にシステムエンジニアの仕事を知ってもらいたいっていうのもありました。よく、仕事何してるの?聞かれシステムエンジニアと答えると。
何するのといったことをよく聞かれるので。
まずは、開発したものは、こんな感じのもの。
- 結婚式用のLINEアカウントを準備。
- ゲストには用意したLINEのアカウントと友達になってもらう。
- ゲストにLINEへ撮った写真をアップロードしてもらう。
- 会場のスクリーンにアップロードした写真をリアルタイム表示。
- 最後、エンディングロールで投稿してもらった写真をランダム表示。
旦那の会社同僚にご協力いただきちなみに開発分担はこんな感じ。
披露宴開始後の新郎挨拶→新郎主賓挨拶→新婦主賓挨拶の後の乾杯準備中にシステムの説明をざっとし、みんなに公開!
ここでは、エンドロールの話はせず投稿のお願いとリアルタイム表示されることの案内のみを実施。
会場のスクリーンにはこんな感じで、リアルタイム表示されます。
中座後の白無垢からウェディングドレスへお色直しをし、余興という名目でアプリの全体像の話をしました。
ウェディングドレスでスライド発表するという異様な光景(笑
ここで、初めて投稿された写真がエンディングロールで利用されることを発表。
みんな自分が投稿した写真を振り返りざわざわw
いい感じにサプライズできたのかなと思います。
最後のエンディングロールは、料理の写真が連続して表示されザワつきはあったものの全体的にいい感じに仕上がりました!!
業者に頼んで当日の動画でエンディングロール作成すると10~20万はかかってしまうので、題名にもあった通り今回のアプリ使って経費削減もでき、2人で開発して楽しかったし、結果オーライかなと思います。
技術的な話は、別記事かQittaに改めてまとめようかなと思います。
とりあえず、こんなことやったよ!ってことを記録としてまとめたかったので。
一旦、以上です。
fluentdで集めたログデータをpgjsonでpostgreSQLに格納した時の課題と解決策
題名そのままfluentdを利用してプラグインpgjsonを使ってpostgreSQLにデータを格納したときの、課題と考えついた解決方法について記載。
もっといい方法があればぜひ、と思いブログにまとめました。
ちなみに、DBの選択肢が、、、っていうのは無しで。
fluentdとは?とか、postgreSQLとは?とかについては全部省略してます。
時間があるときに、簡単に補足はする予定。
プラグインpgjsonはこちら。
pgjsonのReadMeにあるように、格納先のテーブルは、
下記のように「tag」と「ログ出力日時」「ログデータ(json)」が格納できるテーブルに設計。
Schema
Specified table must have this schema.
col | type |
---|---|
{tag_col} | Text |
{time_col} | Timestamp WITH TIME ZONE |
{record_col} | Json |
が、しかし。。。
使っているpostgreSQLのバージョンは9.3
9.3
そう、jsonb型に対応していない。9.3。
GINインデックスが張れない。9.3。
ちょっと複雑なjsonの問い合わせしたら、しばらくぼーっとできる。
(ちなみに格納データ量は数百万行orz)
さて、どうしたものか。。。
データinsert時に、jsonの要素の中にある検索キー項目のデータが別カラムとして外出しされていれば最高なんだけどな。。。
プラグインを触るか。いや、Ruby触ったことないからきっと大変だろうなぁ。
と、いろいろ考えたりしていたところ。
トリガの利用を思いついた。
https://www.postgresql.jp/document/9.3/html/plpgsql-trigger.html
まず、テーブルのカラムを
「tag」「ログ出力日時」「ログデータ(json)」
から、
「tag」「ログ出力日時」「ログデータ(json)」「検索対象のjsonキー」
に、変更。
検索対象キー項目をjson要素からを外出し(別カラム)して、テーブルに格納するinsertトリガを作成。
無事、検索のキーとして利用したい項目がカラムとして外出しできたので、
検索の高速化が測れました。
めでたしです。
ただ、ぐぐってもこの方法が出てこなかったので、DBの選択肢がまちがっている感は否めない。
GraphAPIを利用してシェア・いいね!の件数を取得する。
使うのはGraphAPI。APIを操作できるGUIが用意されているので、ここで試してみます。
https://developers.facebook.com/tools/explorer
最初に、 取得したいFacebookページのIDを調べる
https://graph.facebook.com/v2.4/https://www.facebook.com/kimatetsu
→取得結果(「きま鉄」の理由は、現在参加しているビックデータ分科会の研究テーマ?のため。)
{
"name": "きまぐれ鉄道ぶらり旅(きま鉄)",
"id": "285904144822648"
}
あとは、GUIに従って欲しい情報を取得する。が、投稿に対していいねしたユーザID一覧は取得できるが、合計数がとれない。。。
ググったら、同じことで悩んでいる人がいたためこれを参考にした。
How to get Likes Count when searching Facebook Graph API with search=xxx - Stack Overflow
投稿メッセージ内容、投稿日時が欲しかったため、追加して、
いいねしてくれたユーザ、シェアしてくれたユーザのID情報はいらなかったので、
limit(0)に修正。
Getパラメタの設定
https://graph.facebook.com285904144822648?fields=id,name,feed{message,created_time,comments.limit(0).summary(true),likes.limit(0).summary(true)}
取得データ。JSON型
{
"id": "285904144822648",
"name": "きまぐれ鉄道ぶらり旅(きま鉄)",
"feed": {
"data": [
{
"message": "【振り子ロマン】雄大な日高山脈をバックに、軽快にカーブを駆け抜けるスーパーおおぞら(^o^)車両の屋根はスッキリしてますね~ 車体の赤色は丹頂鶴のイメージだそうです(^^)(撮影:特派員K)",
"created_time": "2015-07-14T21:15:09+0000",
"id": "285904144822648_877168342362889",
"likes": {
"data": [
],
"summary": {
"total_count": 1880,
"can_like": true,
"has_liked": false
}
},
"comments": {
"data": [
],
"summary": {
"order": "ranked",
"total_count": 14,
"can_comment": true
}
}
},
{以下省略}
}
これで、とりあえず自分に与えられた課題は完了。
elasticsearch+KibanaとtwitterAPIで遊んでみる。 その3
無事動いたので、各設定ファイルを見直し。
<source>
type twitter
consumer_key YOUR_CONSUMER_KEY # Required
consumer_secret YOUR_CONSUMER_SECRET # Required
oauth_token YOUR_OAUTH_TOKEN # Required
oauth_token_secret YOUR_OAUTH_TOKEN_SECRET # Required
tag input.twitter.sampling # Required
timeline tracking # Required (tracking or sampling or userstream)
# keyword Ruby,Python # Optional (keyword is priority than follow_ids)
# follow_ids 14252,53235 # Optional (integers, not screen names)
lang ja,en # Optional
output_format nest # Optional (nest or flat or simple[default])
</source>
<match input.twitter.sampling>
type elasticsearch
host localhost
port 9200
index_name fluentd
type_name fluentd
</match>
keywordは日本語設定できないのかしら ?
バルスで絞って時間ごとのグラフ作ってみたいきがする。
elasticsearch+KibanaとtwitterAPIで遊んでみる。 その2
- fluetd
プラグイン導入
y-ken/fluent-plugin-twitter · GitHub
uken/fluent-plugin-elasticsearch · GitHub
インストールにとまどったけど、ローカルのgemとtd-agentのgemバージョンが合わなかったから?
ソフトウェアアップデートしたら、無事プラグインのインストールできた。
-以下メモ-
バックグランドモードで
./bin/elasticsearch -d
td-agent 起動・停止コマンド
sudo launchctl load /Library/LaunchDaemons/td-agent.plist
sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
こんな感じでfluentdで拾ったtweetを分析できた。
elasticsearch+KibanaとtwitterAPIで遊んでみる。 その1
- elasticsearchの導入
Download Elasticsearch Free • Get Started Now | Elastic
elasticsearchを起動しようとしたらエラー発生。
----------------------------------------------------------
# ./elasticsearch -f
getopt: illegal option -- f
{1.5.1}: Initialization Failed ...
- RuntimeException[Java version: 1.7.0_51 suffers from critical bug https://bugs.openjdk.java.net/browse/JDK-8024830 which can cause data corruption.
Please upgrade the JVM, see http://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html for current recommendations.
If you absolutely cannot upgrade, please add -XX:-UseSuperWord to the JVM_OPTS environment variable.
Upgrading is preferred, this workaround will result in degraded performance.]
----------------------------------------------------------
java8をインストールしろとのことなので、java8をインストールして再挑戦し無事起動。
http://localhost:9200/ に接続して、200 OKが返却されることを確認。
kibanaもインストールしようかと思ったら、esのプラグインでkibanaが使えるという。設定もなくめっちゃ楽。
詳細はこちらから
Fluentd + ElasticSearch + Kibana3 を mac で試してみる (追記あり) - いけむランド
そのほか導入したプラグイン
elastic/elasticsearch-river-twitter · GitHub
elastic/elasticsearch-analysis-kuromoji · GitHub