VOYAGE GROUPの1dayインターンに参加してきました

このイベントに参加してきました。

イベントの内容

ゴールはGoを使ってアドサーバーを作ろう。講師は@jewel x12さんでした。jewelさんとはPyConKyushuで同じ企画スタッフだったの少しリラックスして参加できました。アナグラさんやパダワンさんも一緒だったので孤独死しなくてよかった。

感想

タイムテーブル順で書いていきます。

オープニング
まず、jewelさんとサッサーさんの自己紹介があり、jewelさんがVOYAGE GROUPの説明をしました。

ice break
みんなで協力しやすい雰囲気と名前を覚えるためにice breakをしました。学校のレクとかでもやったことがありますが今回のice breakは初めてでした。内容は、それぞれが自己紹介していって2つニックネームを言います。そしたら多数決でどっちの名前がいいかを選びます。それを参加者全員でやるという流れです。ユニークなニックネームを出してる人がいておもしろかったです。ちなみに私の隣に座っていたアナグラさんは「パール太郎」でした。私は「tax_free」or 「脱税」にしました。多数決の結果「tax_free」になりました。あと少しで治安が悪くなるところだった。いい感じに砕けてました。

インターネット広告の仕組み
ここから真面目な話です。まずは使い回しているスライド(jewelさんが言ってた)でインターネット広告の仕組みを解説してもらいました。今までインターネット広告には邪魔という気持ちしか抱いてなかったので新鮮でおもしろかったです。

自分の言葉で説明すると、


「大昔は広告主がメディアに広告を直接入稿していました。しかし時が流れ、広告で色んなことができるようになると直接やり取りするのが面倒になってきます。理由は色んなころがきるようになったので要求が増えたからです。そこで広告主とメディアの間に入るアドネットワークが誕生しました。アドネットワークを使うことで広告主サイドはアドネットワークがラップしてくれるので簡単に広告を出すことができるようになります。メディアサイドは直接依頼されていた時に比べて営業や顧客の管理をする必要が無くなり、タグをページに貼るだけで広告を表示させることができるようになります。両者にとってwin-winです。アドネットワークを理解するためにはDSP,SSPを知る必要があります。前提として広告主は広告コストが最小 and パファーマンスが最大になるようにしたいと考えています。一方、メディアサイドはもっとも収益性が高い広告が表示されるようにしたいと考えています。でも、こんなにごちゃごちゃしていたらアドネットワークやアドエクスチェンジ(価格バランスを調整する)の管理が大変です。そこで使われるのが、DSPSSPです。DSPはどんな広告やユーザーをいくらで欲しいかを知っています。SSPはどんなユーザーが見ているのかえお知っています。だったらDSPSSPが直接やり取りした方が楽です。これがRTB取引です。RTB取引を解説します。

  1. インプレッション(ユーザーが訪問する)が発生するとSSPDSPに対してBid Requestを送ります。Bid Requestは枠情報やブラウザ情報、ユーザー情報を含んでいます。
  2. Bid Requestを送られたそれぞれのDSPはRequestを確認しいくら払うのかを決定します。
  3. DSP内でオークションが始まります。オークションで一番高い金額を提示した広告主がそのDSPの代表となります。
  4. それぞれのDSPSSPにオファー(入札)を投げます。
  5. オファーを受け取ったSSPは広告を買わない選択をしたDSPを消します。
  6. SSPは買うオファーを投げたDSPがフロアープライスなのかを確認します。フロアープライスは最低金額のことです。
  7. オファーがフロアープライス以上だった場合は最高金額のDSP、つまり最高金額を提示した広告主の広告を貼ります。もしも、フロアープライス以下だった場合の処理はシステムによって違う(はず)。
  8. SSPDSPにオークションの結果をDSPに通知します。

選ばれた広告主は提示額を支払う必要はありません。ここで登場するのがセカンドプライスオークションです。普通のオークションのことをファーストプライスオークションといいます。ファーストプライスオークションでは一番高い金額を提示した人がその値段で落札します。しかし、それは両者にとってwin-winなのでしょうか? こういう事例を考えてみましょう。
Aさんはある商品にn円までなら払うと考えていました(nは自然数)。AさんにはライバルであるBさんがいます。AさんはBさんは0.5n円を提示するだろうと考えていました。そこでAさんは0.6n円で入札しました。しかし、Bさんは0.7n円で入札していました。すると当然Aさんの入札金額 < Bさんの入札金額なので、勝者はBさんになります。
ここで考えなければならないのはほんとうに両者がwin-winになっているのでしょうか。Bさんは商品を落札できたので幸せです。ですが、出品者とAさんはどうでしょうか? 出品者からするとn円の価値がある商品を7割の値段で売ってしまったことになります。Aさんも0.7nで入札されるなら最初からn円で入札すれば良かったと思うでしょう。これではwin-winではありません。
ではセカンドプライスオークションだったらどうでしょう。セカンドプライスオークションでは勝者は提示した金額を支払う必要はありません。勝者は二番目に高い金額を払えばいいのです。するとさっきのシナリオではAさんは最初からn円で入札でき、Aさんが落札することができます。すると、出品者も0.7n円ではなくn円を得ることができます。するとwin-winになります。 ちなみにこういうのはゲーム理論の管轄です。興味のあるかたは是非!

同じように、最高額を提示した広告主は二番目の人の金額+1円の金額が実際の落札金額になります。


広告サーバを動かす

ここからはGoが入ってきます。つまり、解説が雑 & 理解してない可能性が大きいです
もうソースコードのgitはクローズしてるので配布できませんが、フローとしては

  1. DSP起動
  2. htmlのrequestに書いてるIdでどの広告を付けるかをdbを使って判定
  3. ad serverがDSPにrequestを投げる
  4. DSPが価格を決定
  5. DSPがad serverに広告をreturn
  6. ad serverがhtmlに広告をreturn
  7. 広告が表示される

です

インプレッションを見る

インプレッションを見てみます。インプレッションにはどういうリクエストを送ってるのか、落札の結果が書かています。

課題を探して解決策を練る

私はad blocker絶対に倒すマンになるために、策を考えました。しかしGoが書けないので実装はしないで仕組みを調べることにしました。 私はもうad blockerがないと生きていけないレベルで使ってるのですが、仕組みを調べたことがありませんでした。

自分が発表した内容


最近は多くの人がad blockerを使っています。これは広告業界にとっては痛手だと考えました。そこで私はこのad blockerを倒して広告を表示させる方法がないかを調べ、考えました。
主流のad blockerはeasy listなどのリストを参照して広告をブロックしています。リストに載っているクラスが記述されているとad blockerがそれを検知し、要素を消去します。よって広告がページに表示されないという仕組みです。
ad blockerを倒して広告を表示させるには、ad blockerが使われているのかを検知する必要があります。ad blockerを検知するには様々な方法があると思いますが、今回はわざとタグを消してもらってそれを後から確認することで調べようと思います。仮にad blockerが使われている場合は、検知したうえで新しいタグを生成してそこに広告を格納します。これで、広告が表示されるはずです。 たぶん。 そうであってほしい。


打ち上げ

打ち上げは居酒屋くぅでしました。インターンでは聞けないリアルな仕事の話とか聞けて楽しかったです。
ごちそうさまでした

参加した感想

企業インターンに参加するのは今回が初めてでしたがとても楽しく学ぶことができました。普段の勉強会とは違った緊張感があって新鮮でした。今までPythonしか書いたことがなくて、他の言語に触れる機会がありませんでした。しかし、今回はGoを軽くすることができました。VOYAGE GROUPさん、fluctさんありがとうございました。