Dynalystにおける動的な画像生成
by
Kurochan
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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で画像生成するサーバを作った話 ○ 他にも色々新機能追加しています