Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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で画像生成するサーバを作った話 ○ 他にも色々新機能追加しています