Slide 1

Slide 1 text

CyberAgent, Inc. All Rights Reserved Dynalystにおける動的な広告の 画像生成 黒崎 優太 @kuro_m88

Slide 2

Slide 2 text

黒崎 優太 @kuro_m88 ● 株式会社サイバーエージェント ○ AdTech Studio / Dynalyst エンジニア ● 新卒2年目 ● Scala, AWS, 自宅サーバ 査読に参加しました 今日書き終えました

Slide 3

Slide 3 text

今日話すこと ● 自分から見たScala ○ 初心者的な話 ● 動的な広告の画像生成 ○ Scalaを使ってどのようにして実現したか (募集ページより)

Slide 4

Slide 4 text

自分から見たScala

Slide 5

Slide 5 text

Scalaを始めたきっかけ ● 配属されたチームがScalaしか使ってなかった ○ 社歴 = Scala歴 ● 聞いたことはあったかもしれない…? ● Go言語も2010年くらいに力説された事があった ○ こんなに流行るならやっとけばよかった ● 今覚えるならScalaかGoかRust

Slide 6

Slide 6 text

なぜScalaなのか ● インタビュー記事が! ○ アドテクスタジオのエンジニアに聞くScalaの魅力 http://gihyo.jp/dev/serial/01/cyberagent/0063

Slide 7

Slide 7 text

なぜScalaなのか ● チャレンジ (今は普通?) ● 可読性、メンテナンス性が高い ● パフォーマンス ● Javaの資産が使える ● 社内コミュニティ

Slide 8

Slide 8 text

なぜScalaなのか ● 弊社Scala Girlからの回答

Slide 9

Slide 9 text

なぜScalaなのか ● 弊社Scala Girlからの回答

Slide 10

Slide 10 text

Scala Meetup ● 社内勉強会を定期的に開催

Slide 11

Slide 11 text

Scalaをやってみて ● 書いて実際に使ってみないと良い書き方がわからない ○ 既存のコード、チームのレビュー環境のおかげ ● 並行、並列処理が書きやすい ● よく言われるデメリット的な物はあまり感じない or 工夫次第 or 慣れ ○ 例: コンパイル遅い、検索しにくい ○ スペック低めの環境で開発つらいのはどうにかしたい ○ ハマるのはだいたいJavaっぽい箇所 ● モックをすぐ作って動かす!みたいな用途には向いてなさそう

Slide 12

Slide 12 text

朗報: ググラビリティ問題は解決しました ● Google先生の圧倒的成長により解決 ● こういうやつ

Slide 13

Slide 13 text

朗報: ググラビリティ問題は解決しました

Slide 14

Slide 14 text

Scalaのコンパイル

Slide 15

Slide 15 text

参考: Scalaプロダクトのビルド高速化 ● https://speakerdeck.com/kurochan/scalapurodakutofalsebirudogao-su-hua

Slide 16

Slide 16 text

動的な広告の画像生成

Slide 17

Slide 17 text

● Dynamic Retargeting for Games ● Dynamic Personalized Ads

Slide 18

Slide 18 text

● 100+ sbt subprojects ● 400K+ lines ● 18K+ builds (50 builds / day) ● Running on AWS (US, JP)

Slide 19

Slide 19 text

配信している広告の例 ● こんな感じです

Slide 20

Slide 20 text

生成している画像 ● こんな感じです

Slide 21

Slide 21 text

動的な部分 ● ユーザによって色々違う

Slide 22

Slide 22 text

構成

Slide 23

Slide 23 text

そもそも画像を生成する理由 ● HTMLとかSVGで重ねればよいのでは? ○ ディスプレイ広告だけなら可能 ○ ネイティブ広告に対応できない

Slide 24

Slide 24 text

Scalaで画像合成 ● 画像パーツとテキストを合成

Slide 25

Slide 25 text

Scalaで画像合成 ● ほぼJavaの標準クラスライブラリを利用 ○ javax.imageio ■ ImageIO ● 画像の入出力 / 圧縮フォーマット変換 ○ java.awt ■ image.BufferedImage ● 画像をメモリに展開して操作するバッファ ■ Graphics2D ● 画像の操作

Slide 26

Slide 26 text

Scalaで画像合成 ● 便利なライブラリ ○ rkalla/imgscalr ■ 画像のリサイズに利用 ○ sksamuel/scrimage ■ 画像の操作がひととおり用意されている(今回は自作) 画像フィルタもある

Slide 27

Slide 27 text

テキストのアウトライン描画 ● アウトラインがあると文字がくっきりする

Slide 28

Slide 28 text

Scalaでアウトライン描画 (一部簡略化)

Slide 29

Slide 29 text

透過情報付き画像がJpegに書き出せない ● 透過なしの画像バッファを用意してそこに再描 画

Slide 30

Slide 30 text

日本語/中国語/韓国語が描画できない ● いわゆるCJKフォント ● PCで動くのにサーバでレンダリングされない ● フォントサイズを変えてもフォントの幅が0px ● OracleJDKをOpenJDKに変えたらなおった… ○ JVMの実装依存 ○ 手元と環境揃えるの大事

Slide 31

Slide 31 text

気になりそうなところ ● 画像をメモリ上で扱うので容量が気になる ○ バランス的にメモリよりもCPUを使うのでイン スタンスサイズ的に問題なかった ● 生成速度を上げられるのか ○ Kinesisを使ってるので生成サーバを増やせ ば水平スケール可能

Slide 32

Slide 32 text

Scalaの強みが活かせそうなところ ● 別々に画像を生成してそれらを重ねる

Slide 33

Slide 33 text

どうやって開発したのか ● 開発期間: 1ヶ月程度 ● 他に配信のためにデータの連携する部分とか ● コンポーネントごとに分担して開発

Slide 34

Slide 34 text

まとめ ● 入社して初めてScala触った人の体験談 ● Scalaで画像生成するサーバを作った話 ○ 他にも色々新機能追加しています