yonet77的な雑記帳

日々思いついたネタなどを書き留めておきます

Glovia Order Management (on Salesforce) を使ってみようか (11)

実に久々の投稿となると、その投稿に対して自身でハードルを上げてしまって良くないですね。(反省

それはともかく、gOMネタの紹介を細々と再開しようと思います。
今回は「在庫予約」オブジェクトに関するネタでも、と。

続きを読む

Salesforce World Tour Tokyo2014: MiniHack を(ちょこっと)やってみたよ

先日、Salesforce World Tour Tokyoが盛大に開催されましたね。Dev向けの会場は虎ノ門ヒルズでしたので、当日は虎ノ門ヒルズにずっと居座ってました。(別会場の方も行ってみたかったのですが...色々な事情で諦めました。。)

さて、今回も恒例の"MiniHack"が行われました。6つのお題("H", "A", "C", "K", "E", "R")に答えて景品をGETする!という類いのものです。

続きを読む

Qiita 始めてみました。

最近、技術ネタをQiitaに投稿するようにしてみました。

今のところ、まだ3つしかないですが、ジョジョ徐々に増やしていければ・・と思います。Force.com開発上の小ネタとか。

すっかり秋になってきましたね。

急に涼しくなったせいか、鼻づまりになって体調崩したかな・・?と思ったのですが、実は秋の花粉症じゃないか?とも疑う今日この頃です。。

いづれにしても、早く落ち着いて欲しいところです。

Force.com と Heroku の程よい関係を模索して...(1)?

この記事は、Force.com AdventCalendar2013の18日目の記事になります。


先日のDreamforceでは、"Salesforce1"プラットフォームに関する大々的な発表がありました。
それに合わせるかのようにheroku1なんてモノも発表されました。
salesforceのプラットフォームサービスとして、force.comとherokuが結びつく日も近くなってきて、なかなか楽しみですね!

続きを読む

Schema Namespace について

そろそろForce.comのバージョンもWinter' 14になる季節となりました。(あぁ!更新試験....)
それに先立って、ApexのリファレンスもVersion 29.0 となってますね。それにしても、v29.0になってリファレンスの構成も大幅に見直した模様で、v28.0までに慣れていると、欲しい情報がどこにあったかなーとすぐに見つけられません。。(まぁ、そのうち慣れるでしょう、ということで。)

続きを読む

Apex Triggerの実装について考えてます

Force.comでの開発で、ほとんど避けて通れない...の1つに

Apex Trigger

があると思います。

続きを読む

Cloudforce2012 Mini Hackに参加したよ (2)

前回の続きです。
2つ目のお題は "Treasure Data Mini Hack" です。

Treasure Data Mini Hack

f:id:yonet77:20121220194723j:plain

ふむふむ。Treasure Dataネタですね。
※Force.comとは無関係ですが、頑張ってみましょう。

 

Treasure Dataのアカウントを作成する

ココから作成すれば簡単にできそうです。

 

tdコマンドのインストール

Toolbeltが用意されているので、これも簡単ですね。
ちなみに、herokuもToolbeltを用意してますねー。インストールパッケージを用意してくれると、気軽に使えるようになっていいですね!ww

 

Treasure DataにアップロードするためのTweetデータをダウンロード

ココからダウンロードしてください。

 

TweetデータをTreasure Dataにアップロード

さて、ココからが本番です。ローカルに保存したデータをアップロードしましょう!
Treasure Dataから提供されているドキュメントが非常に参考になりますので、併せて確認ください!

1. ログイン
ターミナルで

$ td account -f

と入力して、ユーザIDとパスワードを聞かれるので、そのまま入力してログインします。

2. データベース&テーブルの作成
Treasure Data内にデータベースと、その中にテーブルを作成します。

$ td db:create cfj2012
$ td table:create cfj2012 test

最初のコマンドで "cfj2012" というデータベースを作成します。
そして、"cfj2012"データベースの中に、"test"というテーブルを作成します。

3. Tweetデータのアップロード

$ td table:import cjf2012 test --json tweet.json

td table:import コマンドで「データベース」「テーブル」と、アップロードするローカルのファイルを指定して、インポートします。


というだけで良かったはずなのですが、

skipped: argument out of range: "{\"retweet_count\":\"0\",\"time\":\"1352901513\",\"user_screen_name\":\"philnash\",\"user_name\":\"Phil Nash\",\"created_at\":\"2012-11-14 08:58:32 -0500\",\"text\":\"@_dte Why not just use Heroku for Ruby stuff?\"}\n"
uploading 8969 bytes...
imported 89 entries from tweet.json.

と結果が返ってきました。。。。。
んー・・・何か激しくエラーが発生してるみたいで、OKかどうか悩ましいところです。。。

skipped: argument out of range

が、どうにも怪しいので、色々ググるとこんな感じのエラーみたいでした。
Time: argument out of range (ArgumentError)

時刻のデータをパースする際にエラーになってるみたいですが、一体何がッ・・・!?


で、結局、Treasure Dataのブースにいた方々の支援を得ました..w
どうやら、Tweet.json内の

"time":"1352901513"

が悪さをしているようでした。
Treasure Data側が「文字列」として指定されている"1352901513"を時刻型でパースしようとして"argument out of range"エラーが発生していたようです。
なんと・・・_| ̄|○

結局のところ

$ td table:import cfj2012 test --json tweet.json -t "created_at"

という感じに、timeの指定をオプションで付加することで、

importing tweet.json...
  uploading 808174 bytes...
  imported 9817 entries from tweet.json.
done.

と無事にインポートできました!
※しかし、最初のインポートで、89件は取り込まれた模様ですが、この89件は何でしょうね??

カスタマーダッシュボードで確認すると、こんな感じでした。
 ↓
f:id:yonet77:20121221001130p:plain

 

ジョブの実行

さて、データがインポートできましたので、クエリを発行してみましょう!

$ td query -d cfj2012 -w 'SELECT COUNT(*) FROM test'

とコマンドを実行してみると・・・?

Job 1319769 is queued.
Use 'td job:show 1319769' to show the status.
queued...
  started at 2012-12-20T13:06:32Z
  Hive history file=/tmp/1237/hive_job_log__276669154.txt
  Total MapReduce jobs = 1
  Launching Job 1 out of 1
  Number of reduce tasks determined at compile time: 1
  In order to change the average load for a reducer (in bytes):
    set hive.exec.reducers.bytes.per.reducer=<number>
  In order to limit the maximum number of reducers:
    set hive.exec.reducers.max=<number>
  In order to set a constant number of reducers:
    set mapred.reduce.tasks=<number>
  Starting Job = job_201209262127_180974, Tracking URL = http://ip-10-8-189-47.ec2.internal:50030/jobdetails.jsp?jobid=job_201209262127_180974
  Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=10.8.189.47:8021 -kill job_201209262127_180974
  2012-12-20 13:06:46,411 Stage-1 map = 0%,  reduce = 0%
  2012-12-20 13:06:55,512 Stage-1 map = 65%,  reduce = 0%
  2012-12-20 13:06:58,541 Stage-1 map = 80%,  reduce = 0%
  2012-12-20 13:07:01,570 Stage-1 map = 92%,  reduce = 0%
  2012-12-20 13:07:04,604 Stage-1 map = 100%,  reduce = 0%
  finished at 2012-12-20T13:07:15Z
  2012-12-20 13:07:12,684 Stage-1 map = 100%,  reduce = 100%
  Ended Job = job_201209262127_180974
  OK
  MapReduce time taken: 36.445 seconds
  Time taken: 36.621 seconds
Status     : success
Result     :
+-------+
| _c0   |
+-------+
| 19724 |
+-------+
1 row in set

・・・という結果になりました。
※インポートコマンドを何回か実行してるので、データ件数は実際とは異なるかと思います。

 

おしまい

今回、初めてTreasure Dataに触れる機会がありました。
こうして見ると、課題自体は非常にシンプルなのですが、実際に手を動かしてやってみて、クエリの結果が返ってくるとなかなか楽しいものですね!
また、まずはちょっと触ってもらう、知ってもらう・・ために、こうした"Mini Hack"をやるのは非常に良かったと思います。

"Force.com"と"Treausre Data"を組み合わせると、何か面白いソリューションとかできそうな予感もします。
例えば、Salesforce側で蓄積された過去の実績データ(売上とか?)の退避先として"Treasure Data"を選ぶ・・というのも、面白いかもしれません。(会社のルール等の制約で難しいかもしれませんが・・・)

また、中の人から聞いた話では、Talend Open StudioなどのETLツールと組み合わせることも可能(参考)ということなので、一度試してみる価値はありそうですッ・・・!

さて、この雑記はAdvent Calendar 21日目にエントリしています。
もう残すところわずかになりましたねー。最後まで頑張りましょう!

ではでは〜