HerokuのアプリからTreasure Dataにデータを入れてみた

TLにHerokuでTreasure Dataが簡単に使える的なのが流れてきて、 ブログみてたらハンパ無く楽チンくさいのでやってみることにしました↓ Just STDOUT: The Simplest, Most Flexible Way To Collect Application Data On Heroku | Treasure Data Blog     ■ 試したアプリ   個人的に2006年くらいにAward on RailsというRORで作ったサービスのコンテンストがあって、 当時、iKnow!のスッゲーしょぼい版みたいなのを作ったのですが、 数年前にHerokuに上げたっきりなーんもしてない感じになってるので、そいつを使ってみる感じで。 #ちなみにロゴのデザインは@445ticにしてもらいました。よしこちゃんThx!     ■ Herokuの設定   ↓のGet Add-onsってとこからTreasureData用のアドオンを追加します。   ↓検索すると引っかかってくるのでソレを追加して、   ↓nanoで作ればお金かけずに試せます。   ↓が、請求情報が必要と怒られます。   ↓ってことでクレジットカード情報を入力します。この辺はAWSもそんな感じですやね。   ↓めでたしめでたし。     ■ Herokuからソース取得&アプリ変更&デプロイ   いつもコレ系のブログは昼休みとか定時後に会社のUbuntuで書いてるのですが、今回は自宅のMacBookAirで。 ってことで、HerokuのToolbeltをインストールするところから。   認証とか鍵ファイルをホゲホゲしたり。

$heroku login
Enter your Heroku credentials.
Email: xxxxx@xxx.com
Password (typing will be hidden):
Authentication successful.
$heroku keys:add
Found existing public key: /Users/eiji/.ssh/id_rsa.pub
Uploading SSH public key /Users/eiji/.ssh/id_rsa.pub... done

  んでもって、Herokuからgitでソースコード落としてきます。

$git clone git@heroku.com:together-shi-yo-ze.git
Cloning into 'together-shi-yo-ze'...
The authenticity of host 'heroku.com (50.19.85.156)' can't be established.
RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added 'heroku.com,50.19.85.156' (RSA) to the list of known hosts.
remote: Counting objects: 212, done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 212 (delta 59), reused 164 (delta 28)
Receiving objects: 100% (212/212), 141.63 KiB | 60 KiB/s, done.
Resolving deltas: 100% (59/59), done.

  controllerのコードに手入れて、putsで↓こんな風にしてやります。

@login = current_user[:login]
td_str = "@[service.users] { "name": "#{@login}" }"
puts td_str

太字のところ追加しただけ。   あとはgit commit -am〜とかやってやった後に、

$git push origin master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 440 bytes, done.
Total 5 (delta 4), reused 0 (delta 0)
-----> Removing .DS_Store files
-----> Ruby/Rails app detected
-----> WARNING: Detected Rails is not declared in either .gems or Gemfile
       Scheduling the install of Rails 2.3.5.
       See http://devcenter.heroku.com/articles/gems for details on specifying gems.
-----> Configure Rails to log to stdout
       Installing rails_log_stdout... done
-----> Compiled slug size: 6.0MB
-----> Launching... done, v19
       http://together-shi-yo-ze.heroku.com deployed to Heroku

To git@heroku.com:together-shi-yo-ze.git
   f2312ca..a50a2fa  master -> master

  こんな感じでアプリ作業は終了です。     ■ Treasure Dataの設定   アプリの改修は終わったので、今度はTreasureDataにデータベースとテーブルを作ります。   herokuコマンドにプラグインを追加してTreasureDataのコマンドを叩けるようにします。

$heroku plugins:install https://github.com/treasure-data/heroku-td.git
Installing heroku-td... done
$heroku -h | grep td
  td           #  manage Treasure Data hadoop service

  んで、TreasureDataにデータベースとテーブルを作るべぃと、、、

$heroku td
 !    Local `td` command could not be located.
 !    To install `td` command, visit and download it from http://toolbelt.treasure-data.com/

アレ。。あ、そもそもtdコマンド自体がこのマシンに入ってねーやって話で。   って事で、gemでtd入れようとしたら、、、あぁ、、Rubyのバージョンとかすかね。。

$sudo gem install td
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing td:
    ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h


Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/msgpack-0.4.7 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/msgpack-0.4.7/ext/gem_make.out

  Rubyのバージョンあげようとしたら、、、アレ、、こいつMacPortsも入ってねーですか?

$port list ruby
-bash: port: command not found

  MacPortsよりもHomebrewの方がイイよん的な噂を聞くのでコレを気に。。 ホームーページみてると↓だけでイイみたいだし。 ↓その通りに叩いてみたら、、、

$ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
〜略〜
==> Installation successful!
You should run `brew doctor' *before* you install anything.
Now type: brew help

イイ感じですヽ(´▽`)ノ   が、portsで他のRubyがいるじゃねーかって怒られた…。

$brew install ruby
Warning: No developer tools installed
You should install the Command Line Tools: http://connect.apple.com
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.

  よくよく見てみると、/opt/local/bin/portってのは存在してたので、 sudoしつつ、とりあえずportでselfupdateしてRubyのバージョン上げる事にしよかな、と。 #ってかRubyのバージョンが問題なのかどうか分かってないわけですが。。 そしたら、、、もうなんなのよ。。。

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed

ググってくとXCodeが入ってねーからとかそんな話になってきたので、、XCode入れる事にします。 3GのPocketWifi経由で落としてきたので死ぬほど時間かかりましたけど、 XCode入れたところで、何も変わりませんでしたよ、とw   更にググってくと、どうもXCodeだけじゃなくてXCode Toolsがどうのって話らしい。 そこまでしてMacPortsにこだわりないので、、、 brewのmanみてたらinstallに--forceってあったので、この際それで。。

$brew install ruby --force
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
==> Installing ruby dependency: readline
==> Downloading http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz
######################################################################## 100.0%
==> Patching
patching file callback.c
〜略〜

なんかイイ感じっす。 ってかHomebrewって何これ、ジョッキの絵出てきてんじゃん。ちょーナイスw   無事インストールが終わって結果をトレースしてたら、

NOTE: By default, gem installed binaries will be placed into:
  /usr/local/opt/ruby/bin

You may want to add this to your PATH.

とかって言われたので、↓にバッツリ入れてやりました。

$sudo vi /etc/paths

  んで、どんなもんじゃい的な。

$echo $PATH
/usr/local/opt/ruby/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin
$ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858) [x86_64-darwin12.2.1]

  ようやく、tdコマンドのインストール。

make
sh: make: command not found

(゚Д゚)ハァ? ちっくしょー、make入ってねーってどんなん…。   ググってくと、XCodeのCommand Line Toolsってのが必要らしいって事で、 XCode起動してPreferencesからDownloadの↓のところでInstallしやす。   ようやくtdコマンドインストールぢゃ!

$sudo gem install td
Password:
Building native extensions.  This could take a while...
Fetching: yajl-ruby-1.1.0.gem (100%)
Building native extensions.  This could take a while...
Fetching: hirb-0.7.1.gem (100%)
Fetching: parallel-0.5.21.gem (100%)
Fetching: json-1.7.6.gem (100%)
Building native extensions.  This could take a while...
Fetching: td-client-0.8.45.gem (100%)
Fetching: fluent-logger-0.4.4.gem (100%)
Fetching: td-logger-0.3.18.gem (100%)
Fetching: td-0.10.70.gem (100%)
Successfully installed msgpack-0.4.7
Successfully installed yajl-ruby-1.1.0
Successfully installed hirb-0.7.1
Successfully installed parallel-0.5.21
Successfully installed json-1.7.6
Successfully installed td-client-0.8.45
Successfully installed fluent-logger-0.4.4
Successfully installed td-logger-0.3.18
Successfully installed td-0.10.70
9 gems installed

あー、入った入った。   そしてheroku td。

$heroku td
usage: td [options] COMMAND [args]

だんだんソレっぽくなってきましたね。   いよいよTreasureDataにテーブルを作ります。

$heroku td db:create service
Database 'service' is created.
Use 'td table:create service ' to create a table.
$heroku td table:create service users
Table 'service.users' is created.

  めでたしめでたし。 コレでHerokuもアプリもTreasureDataの設定も終わったので、 あとはアプリにアクセスすれば、データが溜まっていくはずです。     ■ 画面からアクセスしてデータをストアしてコマンドでTDからデータを取得   ようやく準備が整ったのでいよいよ本日のクライマックスです。   ↓画面からアクセスしてみます。 #ちなみにTOPのillyは何ヶ国語(もちろん日本語も)も堪能な、 #自分が勤めてる会社のエグゼクティブ向けな英語の先生。 #こんなページにアクセスしてくれたなんて、Thx, Illy!   んで、クエリしてみると、、

$heroku td query -w -d service "select v['name'] AS name, v['time'] as time from users"
Job 1661606 is queued.
Use 'td job:show 1661606' to show the status.
queued...
  started at 2013-02-03T09:58:16Z
  Hive history file=/tmp/1528/hive_job_log__2083994169.txt
  Total MapReduce jobs = 1
  Launching Job 1 out of 1
  Number of reduce tasks is set to 0 since there's no reduce operator
  Starting Job = job_201301150013_67644, Tracking URL = http://ip-10-8-189-47.ec2.internal:50030/jobdetails.jsp?jobid=job_201301150013_67644
  Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=10.8.189.47:8021 -kill job_201301150013_67644
  2013-02-03 09:58:30,006 Stage-1 map = 0%,  reduce = 0%
  finished at 2013-02-03T09:58:38Z
  2013-02-03 09:58:36,071 Stage-1 map = 100%,  reduce = 0%
  2013-02-03 09:58:37,094 Stage-1 map = 100%,  reduce = 100%
  Ended Job = job_201301150013_67644
  OK
  MapReduce time taken: 14.985 seconds
  Time taken: 15.268 seconds
Status     : success

  うおぉ、、来ましたねー!     ■ ということで、、   自分のMacの環境でRubyとかGemとかで手間取ってtdコマンド入れたりするのに時間かかっただけで、 普段Heroku使ってアプリ開発してる人にとっては本当になんてこっちゃない感じですね。   こうやってとりあえずデータ入れる事さえ出来ちゃえば、   例えば、  1. 1年後とかに、なんかキャンペーンとかやろうとした時に  2. 去年のデータはxxだったから  3. 今年のアレはxxxで行きましょう とかって流れにすることが出来る。   コレがなければ2.の部分が、声が大きいとか、経験と勘と度胸とか、 なんかそういう事になっちゃって、残念になりがちでしょう。   ちょっと手動かしてるだけで、時代は変わってんだなーって実感出来たりするものですね。 ↓の本的(Koboでも読めます)には、情報リテラシーがないと合法的な詐欺の被害者になっても文句言えないし、 カモられる時代なんだって事らしいので、自分もちょっと勉強してみよかなと思ってる今日この頃です。

統計学が最強の学問である
西内 啓
ダイヤモンド社
売り上げランキング: 102