AMP Campをひと通りさらってみる:第1回 IntroductionとGetting Started
AMP Campとは?
AMP CampはBerkeleyのAMP Labによるオープンソースのデータ解析用テクノロジースタックであるBDAS (the Berkeley Data Analytics Stack)のBoot Campみたいです。年1回開催されるようで、すでに2014年開催で5回目のようです。ハンズオンなんかが充実しているのでひと通りさらってみました。
IntroductionとGetting Started
Camp概要と準備
AMP Campの概要です。ざざっと雰囲気が分かりますが、Sparkのエコシステムがひと通りさらえるようです。で、PrerequisitesのAssumptionに"You have experience using the core Spark APIs"とかあって、BootCampのくせに経験者対象かよ、という感じですが、その下にIntroduction to the Scala Shellがありますので、まずはこちらからやりましょう。
SparkはScala/JavaもしくはPythonのインターフェースを備えていますが、Scalaがわかっていた方が何かと便利なはずです。楽せずScalaを見てみます。 順番は前後しますが直前のエントリにて触ってみた話を載せていますので参考までに。
Scala面白いのでもう少し色々と勉強したくなりますが、ぐっとこらえてそのまま進みます。で、読み進めるとGetting Startedをフォローしておけよ、ということで、見てみると、どうやら参加者には必要なソフトウェアやデータ一式が入ったUSBが渡されるようです。Getting Startedのページから一式を取得できるのでゲットしておきます。
下記はremote参加者用のダウンロードURLです。 * software一式 * データ一式
SimpleAppのビルド
software一式はAMPCAMPとか適当な名前のディレクトリを掘って全てそこに入れるようにします。 そして、sbtでビルドします。
$ ../sbt/sbt package Getting org.scala-sbt sbt 0.13.5 ... :: retrieving :: org.scala-sbt#boot-app confs: [default] 44 artifacts copied, 0 already retrieved (13482kB/521ms) Getting Scala 2.10.4 (for sbt)... :: retrieving :: org.scala-sbt#boot-scala confs: [default] 5 artifacts copied, 0 already retrieved (24459kB/142ms) [info] Set current project to Simple Project (in build file:/Users/norihiro_shimoda/Work/study/spark/AMPCAMP/simple-app/) [info] Updating {file:/Users/norihiro_shimoda/Work/study/spark/AMPCAMP/simple-app/}simple-app... [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Compiling 1 Scala source to /Users/norihiro_shimoda/Work/study/spark/AMPCAMP/simple-app/target/scala-2.10/classes... [info] Packaging /Users/norihiro_shimoda/Work/study/spark/AMPCAMP/simple-app/target/scala-2.10/simple-project_2.10-1.0.jar ... [info] Done packaging. [success] Total time: 10 s, completed 2014/12/31 23:35:42
successということで成功ですね。ビルドしたものを実行します。
$ ../spark/bin/spark-submit --class "SimpleApp" --master local target/scala-2.10/simple-project_2.10-1.0.jar Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties 14/12/31 23:36:35 INFO SecurityManager: Changing view acls to: norihiro_shimoda, 14/12/31 23:36:35 INFO SecurityManager: Changing modify acls to: norihiro_shimoda, 14/12/31 23:36:35 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(norihiro_shimoda, ); users with modify permissions: Set(norihiro_shimoda, ) 14/12/31 23:36:36 INFO Slf4jLogger: Slf4jLogger started 14/12/31 23:36:36 INFO Remoting: Starting remoting 14/12/31 23:36:36 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkDriver@192.168.0.6:60528] ...<中略>... 14/12/31 23:36:38 INFO TaskSetManager: Finished task 1.0 in stage 1.0 (TID 3) in 11 ms on localhost (2/2) 14/12/31 23:36:38 INFO DAGScheduler: Stage 1 (count at SimpleApp.scala:13) finished in 0.023 s 14/12/31 23:36:38 INFO TaskSchedulerImpl: Removed TaskSet 1.0, whose tasks have all completed, from pool 14/12/31 23:36:38 INFO SparkContext: Job finished: count at SimpleApp.scala:13, took 0.044037 s Lines with a: 83, Lines with b: 38
という感じで出力されます。何やってるんだろうということでAMPCAMP/simple-app/src/main/scala/SimpleApp.scala
を見てみると、sparkのREADME.mdからaとbを含む行をカウントしているのが分かります。シンプルですね。
という感じでgetting startedは完了です。
動画
- 初回に流れるAMP Labの活動やSpark ecosystemの最近の同行についての動画
- 英語苦手な人でも最新のSpark事情が分かり、見ておいて損はない動画だと思います。
- 自分も得意ではないですが、十分理解できる内容でした。
Scala超入門
SparkのとっかかりとしてたぶんSparkの入門的なものであるAMPCampをさらってみています。
とりあえず、prerequireにあったScalaの超入門的なものをやりました。SparkはPythonでも動かせますが、真面目にやるにあたってはScalaは避けて通れませんので、当面はその辺りの勉強も必要ですね。
例ではScalaShellで動かしていましたが、Scala自体もほぼ初心者なので勉強を兼ねてソースコード化して動かしてみました。 Scalaはまだコップ本を読みつつなので、全然手に馴染んでないし、関数型っぽくうまく書けずまだまだだなぁ、と。2年くらい前にSICPの読書会に参加していた記憶よよみがえれ!
import scala.io.Source object Intro { // 3. cubeというInt型の値の3乗を計算する関数を定義 def cube(n: Int): Int = n * n * n // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う def factorial(n: Int): Int = { if (n == 0) 1 else n * factorial(n-1) } // ボーナス:ワードカウントの実装 // まだ良くわかっていないので答えをみた // mutableなHashMap使っているのでScalaらしくはない def wordcount(source: String): collection.mutable.Map[String, Int] = { val lines = Source.fromFile(source).getLines.toArray val counts = new collection.mutable.HashMap[String, Int].withDefaultValue(0) lines.flatMap(line => line.split(" ")).foreach(word => counts(word) += 1) return counts } def main(args: Array[String]) { // 2. myNumberというInt型のリストを定義 val myNumbers = List(1, 2, 3, 4, 5) // 4. 定義した関数をmyNumbersに提供する myNumbers.map(x => cube(x)) // myNumbers.map(cube) こっちのほうがscalaっぽい? // 5. 関数リテラル使って3,4と同じことを実現 myNumbers.map(x => x * x * x) // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う // factorialの定義は上部にて println(myNumbers.map(factorial)) // ボーナス:wordcountの実装 // sparkのREADME.mdをカレントディレクトリに持ってきた println(wordcount("README.md")) } }
Sparkへの貢献コトハジメ
2015年はSparkだ、と勝手に思っています。で、社内で自分の関わるサービスの裏側で利用する箇所をどんどん増やしていくのももちろんですが、これまでまともにOSSに貢献していなかったので、これを気にOSSへの貢献にもチャレンジしてみようかと思ったりしたので、色々調べてみた備忘録です。
基本情報
何かできないかな、ということで Contributing to Spark を読んで適当に要約してみます。
Reporting Issues
バグとか質問する時はJIRAでissueをopenするかMLにて。
Contributing Code
githubのPull Requestで受け付けている。JIRAでissueをopenにした上でgithubのsparkリポジトリでのPRでレビューを行う。
- タスクは小さく分解し、出来るなら目的は1つに
- パッチの取り込み、拒絶の指針を確認して
- JIRAでpatch用のissueを作成
- 大きな変更を提案しようとしているなら、設計のドキュメントをJIRAに添付して、dev用のMLで議論をして
- githubのPRでpatchを提出。forkのチュートリアルとPRのチュートリアル
- Sparkのコード規約を守って(ScalaとPythonのチェッカーが付属しているのでかける)
- 自動テストに通って
- 追加のコード用のテストを加え、ScalaTestでテストを行って
- もし必要ならドキュメントを更新する
という感じでしょうか。
Criteria for Inclusion or Rejection of Patches
Sparkの正しさ(バグフィックスとか?)に関するパッチであり、小さく、多くのユーザーにとって有益であるものは即座にレビューされ、マージされる。そうでないもの(以下のもの)は時間がかかったり、場合によっては拒絶される。
- 変更が多いコードや正しさの確認が難しいもの
- Sparkそのものよりもサードパーティに手を入れているようなケース
- 複雑過ぎるもの
- 明示的にせよ、暗黙的にせよユーザーに依存するような振る舞いをするもの(退化と表現されている)
- 新しいAPIを追加しようとするもの
- 依存関係を追加するもの
小さなパッチはほぼリジェクトされない。
Contributing New Algorithms to MLLib
MLLibの重要なゴールはアルゴリズムをたくさん揃えていることである一方で、プロジェクトのメンテナンス性や一貫性、品質が第一の要求のため、実装されるアルゴリズムは
であるべき。
Automated Testing
全てのパッチには自動テストが行われる。
Starter Tasks
Sparkコントリビュータになりたいならまずはここからなチケット集
Documentation
2つの方法がある
Development Discussions
開発社MLにての議論
IDE Setup
IntelliJ
SBTやMavenコマンドをよく使うので一番よく使わえれているIDEはIntelliJなので早速コミュニティエディションをゲットする。
Eclipse
Eclipseも使われているよ〜という話だけどもういいや。。。
という感じです。さらに調べたり勉強したりしないといけないものが色々増えました。
インドのビザ事情その他色々
インドへ向かう際に、色々と肝を冷やして必至に調べた話です。調べた情報が2013年くらいまでのものがほとんどでしたが大変助かりましたので、最新の2014年度版、ということで。
あらまし
12/22-12/24の超ド短期出張というか、現地の人に会う予定がが12月冒頭に決まり、航空券と宿を押さえて後は出発を待つのみ、と油断していたら出張前々日の12/20に、「ビザ取ってない!」という事実に気づきました。 そう、インドは短期の滞在でもビザが必要なんです。
インドのビザの事情
短期だろうがなんだろうが入国の際にビザは必要、なので、事前に申請しましょう。以上。
以下は、正規ルートに乗っかりそこねた人の体験談となります。
正規ルートの場合、上記のインド大使館のオンラインフォームで申請を行った上で、大使館に赴いて申請が必要です。申請から発給まで時間もかかるし、大使館に行くのもめんどくさいですね。。。
正規ルートで無理だった人はどうすれば良いのか?
結論から言うと、短期滞在目的の場合、Tourist Visa On Arraival(TVOA)という制度がありなんとかなります。現地でビザを発給しますよー、という制度です。一見便利なので、これで救われたー、と考えるのは甘いです。自分も最初はこの制度で救われた、と思ったのですが、よくよく考えると、入国が保証されない状態で現地に向かい、現地で入国許可を受ける、というパターンなので、ほぼないとは思いますが、入国が許可されず帰還させられる可能性も。。。
TVOAについて
自分の旅程は、成田(NRT) - バンコク空港(BKK) - バンガロール空港(BLR)という旅程でしたので、バンガロール空港の話になります。 ここを見る限り、
- Delhi
- Mumbai
- Chennai
- Kolkata
- Hyderabad
- Thiruvanthapuram
- Kochi
等の空港も対応していそうです。日本人であれば、30日以内の滞在で、観光やカジュアルビジネスなら問題ないようです。
で、ここからが重要な話です。TVOAは今まさに制度の移行期らしく、実は上述した正規ルートとはまた別にオンラインでのTVOAの発給が可能なようです。米国のESTAのようなノリで申請できるものですね。こちらを利用できれば一番楽だったのですが、こちらはインドへの到着4日前までしか入力すらできません。。。ということで今回は使えず、現地に乗り込んでからパターンとなります。さらにさらに、現地乗り込みパターンはどうやら2014年12月26日までの制度らしいので要注意です。とか書いていると最新ではどうやらさらに延長が決まったようです。インド、難しい国ですね。。。
事前の準備
下記のモノを用意していきました。必ず必要というわけではありませんが、そもそも入国できないリスクを負っているという認識を持って、しっかり目に用意しておいて損はないと思います。
- eチケットの控え(帰りの航空券が必須という噂です)
- 宿の予約の控え(こちらも必須という噂です)
- USドルにて70ドル以上の現金(ビザ発給時に必要となります)
- インドでのインド人のreference(今回は人と会う予定だったので、その人の名前、携帯番号等を書きました。特に人と会わない場合はホテル等で大丈夫な気がしますが。。。)
- TVOA用の書類(必ず使えるかは分かりませんが、事前に埋めておくと楽ができました)
- TVOA用の書類に使う写真2枚(パスポート用サイズです)
出発空港での対応
最初の難関はチェックイン時です。通常であればビザが必要な国にいくため、チェックイン時にビザを持っているか聞かれます。TVOAという制度があってそれで行く、と言い張ります。自分の場合は、観光で人と会う、と言い張ったほうが良いと聞いていたので、それで押し通せば問題ありませんでした。
トランジットの空港
今回はトランジット時に出国しなかったので分かりませんが、もしかしたら再入国時にビザチェックがあると少々めんどくさいかもしれません。
入国時の対応
イミグレーションのカウンターの端っこにTourist Visa On Arrivalのカウンターがありますので、通常通り、入国と税関用の書類を埋めてカウンターに向かいます。 実はTVOA用にも書類を埋める必要があり、それは現地で行うものなのですが、自分の場合はここを参考にした際に書類を事前に入手できていたので、トランジットの際に練習がてらに埋めていました。見せるとそれでもOKだということだったので、それを利用します。顔写真と今回は60ドル(事前の調べでは70ドル以上80ドル未満ということでしたが。。。)を払ってしばらく待ちます。ダブル、トリプルチェックをしているようで、けっこう待たされた後に、ハンコをペタっと押されてビザ発給完了で、そのまま入国できます。トータルで30分くらいかかったでしょうか。噂では1時間2時間は当たり前にかかるとのことでしたのでちょっと早かったかな、という感じです。
という感じで、思ったより簡単に入国できました。
その他どうでもいい注意事項
そこそこちゃんとした建物に入る時には必ず荷物検査及び金属探知機を通過させられる等があります。 また、インドは入国よりむしろ出国の方が大変でしたので、書いておきますと、
- 空港に入る時にパスポート、航空券(eチケットの控え)のチェック、ビザの確認
- 出国時にも滞在目的とか色々聞かれる(しかもインド人の英語聞き取り難しい。。。)
- 身体検査は相当厳重なチェック(自分も2回リュックをチェックされました)
- で、ここで一個罠なんですが、チェックインとかのタイミングで手荷物にも荷物タグを付けていないと怒られます。というか、チェックインの時にはオススメくらいのノリだったので、いらない、って無視しちゃったのですが。。。
- 飛行機に乗る時に再度、ビザと航空券と荷物タグのチェックがあります。
- 同行者は身体検査時に何故か荷物タグのツッコミはなかったのに、この飛行機に乗る前にタグがないことを咎められて搭乗が遅れたそうです。。。なぞ。。。
というわけで何とか無事に帰国することができましたが、中々大変な旅でしたよ、と。
D28 地球の歩き方 インド 2014~2015 | |
地球の歩き方編集室 ダイヤモンド社 2014-06-28 売り上げランキング : 8966 Amazonで詳しく見る by G-Tools |
2014年最もイケてるBigData領域でのスタートアップ10社
Top 10 Coolest Big Data Startups Of 2014という記事がありまして、はじめて名前を聞く企業が多くありましたので簡単に調べてみました。ホントに簡単に調べただけです。正確には記事の説明+HPのトップをざっと見ただけですので、そんなものがあるのかー、くらいのノリです。
1. SumAll
FacebookやTwitter, eBayやInstagramなど、42種類のソーシャルとEコマースサイトのデータからデータを可視化することができるオンラインのプラットフォームを提供してくれる、とのこと。今年に入っていくつかの機能追加を行い、例えば、リツイートやメンションの数によってアラートを発してくれるようなシステムが追加されたとのこと。
2. Luminoso
テキスト分析に強みがある会社ぽいです。MITメディア・ラボからのスピンアウトみたいですね。
3. Flatiron Health
2012年に元Googleの2人によって創設されたみたいです。医療データに特化したプラットフォームOncology Cloudを開発しているみたいです。ガンを含む腫瘍に特化したデータを取り扱うプラットフォームみたいですね。
4. Domo
クラウドベースのプラットフォームみたいです。強みは正直読み取れませんでした。。。
5. Alpine Data Labs
ドラッグアンドドロップベースの分析クエリ作成というのが特徴なんですかね。Hadopベースのデータソースでも、RDBでも大丈夫で、モデルを共用しながらチームでの共同作業も得意だよ、とのことです。
6. Altiscale
元Yahoo CTOによる、Apache Hadoopを動かすクラウドサービスということです。Apache Hadoopをクラウドで動かせることの利点はよくわかっていません。
7. Tamr
Tamrは割と注目しています。DB界の大物のストーンブレイカーさんが関わっているということでPublickeyでもとりあげられていました。 Tamrは少し真面目に調査していて、大変おもしろいので、また別エントリでまとめたいと思います。取り扱うデータ規模が大きくなりつつある昨今のETLに関わる課題の一つで、バラバラに散らばったデータを良い感じに取り扱うというのは、Apache DrillやPrestoが切り開きつつある領域かと思います。Tamrも同じ課題感を解決しようとしているETLではありますが、「目的に合わせて何のデータを集めるべきか」をTamr自身が考える、というのが最大のポイントとなります。(DrillやPrestoだとクエリ自体は人間が作成/発行する必要がありますので、そこが違いかなぁと)。取得すべきデータの選別は、地味なようで、データの規模や種類が増えつつある最近では、ETLの課題における最大の問題の一つかと思います。
8. Cloudera
Clouderaは有名なので割愛、直近で大きな資金調達もありましたね。
9. DataGravity
こちらもDomoと同じく強みがよくわかっていません。。。
10. Elasticsearch
@johtaniさんにTwitterでメンション飛ばせば全てが理解できます(違
ちなみに2013年度版っぽいのはこちらです。
2013年度版に関しては、今や空前のSparkブーム(自分の観測範囲に限る)で飛ぶ鳥落とす勢いのDatabricksや、今の会社の関係で少し繋がりがある、Skytree なんかが目を引く所でしょうか?(他を知らなすぎるだけですが。。。反省。。。)
2013年度版をざざっと見た感じではMachine Learningという用語がちらほら出てるように思えますが、2014年度版ではそういう記述が見当たらなくなっていますので、Machine Learningが徐々に一般的になり、サービス内に組み込まれるようになってきたからかなー、などと色々と想像が膨らみますね。
BigData, Machine Learningなど、日本でその用語を使ってる企業/サービスへの胡散臭さがまだまだ消えきれない2014年現在ですが、米国では間違いなく、そういったキーワードを中心に人/モノ/金が動いているようですので、ソーシャルやアドテクといったこれまでの流れと同じく1,2年後のビッグウェーブはやってくるのではないでしょうか。
AdFraudについて調べてみた話
これは?
なんとなく最近金融のFraudの話に触れる機会が多く、その中でAdFraudという単語が引っかかったので調べてみた話です。参照記事を適当に繋げて意訳しているので、大意としてそもそも違うことになっていたらご指摘ください。
メルセデスベンツ問題
メルセデスベンツによるオンライン広告キャンペーンにおいて、広告が人間以上に自動化されたプログラムに見られていた、ということが報じられて波紋を呼んでいる。
従来から、オンライン広告のFraud(不正表示,不正クリック, etc..)というのは度々問題になっていたが、ナスダックに上場しているRocket Fuelにより実施されたキャンペーンにおいて大規模なFraudが生じていたため、かなりインパクトの大きな問題となっている。
具体的な数値
イギリスのセキュリティー企業Telemetryサンプリングした約365,000のimpressionのうち、57%が自動化されたコンピュータプログラムによる閲覧だった。
なぜ問題が拡大しているのか
- Ad Fraudの被害額が2014年には$11bnに上る見込みで、これは2013年比で22%の増加であること
- RTB市場は急速に拡大しており、現在では全ディスプレイ広告の22%を占めており、2018年には76.5%を占める見込みのため
Ad Fraud問題に関しては、Googleも関心が高く、spider.ioというロンドンにあるAd Fraudに特化したスタートアップを買収したことでも有名
AdFraudの各種手法をざっくりと
大別すると、広告表示やクリック効果を偽装することで広告料をだまし取ろうとする行為が多い印象。その行為によって発生するimpressionを買ってしまうことが広告主の不利益に繋がる、というもの。
CrowdSourcing(Cyclops)
依頼され、記事を見て(時には)広告をクリックする集団。ユーザは意識的に不正を行っている認識はない
Incentive Ad Network(Voldemorts)
リワード目当てに広告を閲覧/クリック/コンバージョンする人たち。正しい行為ではないことをうっすらと認識はしている
Click Farms(Zergs)
報酬をもとに広告クリックを行う集団。モバイルデバイスとSIMカードの組み合わせで、様々な偽装をしながらクリックを行う
Computer Malware(VaderBots)
洗練され、見つけるのが困難なMalwareの一種。感染すると、PCにはbot slaveが潜伏し、bot masterと通信を行い、bot masterからの指令に従い、どのサイトでどのようにクリックするかの指示を遂行する。
Sophisticated Fraud (PhantomBots)
一定のアルゴリズムに従って、広告の閲覧、クリックを行う
Retargeting Fraund (DeceptiBots)
例えば、特定のブランドの車を何度も閲覧する、人間のように振る舞うことで、リターゲティングの対象になる。リターゲティングの対象となることで高いCPMを支払う価値あるターゲットと認識させる。
Mobile Simulator (CryptoBots)
PC上で動作し、スマートフォン上のモバイルアプリのように振る舞う。モバイルアプリ内広告の効果を不正に引き上げるために利用される。
Ad Stacking
複数の広告を一つの場所に表示させることで、見えていない広告をカウントさせる
Toolbars
ツールバーによって、ブラウザの動きをコントロールできるため、特定のサーチエンジンを利用するように強制し、ツールバー自身のアンインストールは困難にさせる
Ad Injection
未承認の広告を勝手に注入するソフトウェア
Domain Identity Theft
広告が表示されるドメインを偽る価格で適正価格でのディールが行われないようにする。
こういった問題に関してIABはTraffic of Good Intent Task Force(TOGI)を立ち上げて不正トラフィックへの取り組みを初めている。
メルセデスベンツ問題に対するRocket Fuel側の反論等
メルセデスベンツ側の証言
キャンペーン中、Fraudと疑わしいインプレッションは6%未満だと報告を受けており、RocketFuelからは該当のインプレッション分の払い戻しが行われた。
ここの数値がFinancialTimesの報道と大きく乖離していていたため、大きな注目を集める要因となった。
RocketFuel側の証言
RocketFuel自身も、広告の不正表示に関しては注意を払っており、実績としては平均的に広告表示箇所の約40%がbot判定及びブランドセーフの観点から適切か、という点でリジェクト対象となっている。ということもあり、Telemetryのレポートを100%正しいと核心は持てない、という感じでバチバチやっている。
AdFraud対策の方法論など
と、いうことで、今現在進行形でAdFraudは米国で大きな問題になってきており、この流れで行くと1,2年後には日本にもその流れがやってきそうかな、と。まだ方法論まで踏み込んだところまでキャッチアップできていないですが、例えば、こういった論文も公開されています。
FDMAというAd Fraudに特化したコンペティションが開催されていたようです。
いつもの流れだと1,2年後くらいに流れがやってくるので、今のうちに情報を仕入れておくと差別化要因になるかも?的な感じです。なかなか奥深い。
参考
Ad Engineering Summitというイベントで登壇してきました
5/15にAESというイベントにて「デジタルマーケティングを支える技術とその未来」というタイトルで発表してきました。当日のスライドの公開などは特に予定していません。
エンジニアの人も参加しやすいように、と、イベント自体が始まりも終わりも遅い、という少し変わったタイムテーブルで、自分は夜の20:30からのお話してきました。
「Engineering」とイベント名に入ってはいるものの、初回のイベントだったため、オーディエンス層がいまいち掴めず資料作成に苦しんだのはいい思い出です。記憶にあるうちで一番苦しんだかもしれません。とはいえ、登壇後に分かりやすかった、面白かった、などのフィードバックを頂けたので一安心です。
この登壇やイベント参加を通じて、改めて今のアドテクブームやデジタルマーケティングという言葉について考えなおすきっかけになったのが収穫かな、と思っています。「DMP」という言葉はバズワード化しつつも、サービス提供者側はマネタイズ面で苦労していたり、広告主側はうまく活用しきれていなかったり、と理想と現実のギャップはまだまだ大きいな、と感じています。少なくとも広告という文脈だけでデータ活用を行おうとすると結構苦労するんじゃないかなぁ、というのが今の自分の意見だったりします。