Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dynalystにおける動的な画像生成

1f745ff900e1be51aedae18cae76593c?s=47 Kurochan
March 21, 2017

 Dynalystにおける動的な画像生成

1f745ff900e1be51aedae18cae76593c?s=128

Kurochan

March 21, 2017
Tweet

Transcript

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

  2. 黒崎 優太 @kuro_m88 • 株式会社サイバーエージェント ◦ AdTech Studio / Dynalyst

    エンジニア • 新卒2年目 • Scala, AWS, 自宅サーバ 査読に参加しました 今日書き終えました
  3. 今日話すこと • 自分から見たScala ◦ 初心者的な話 • 動的な広告の画像生成 ◦ Scalaを使ってどのようにして実現したか (募集ページより)

  4. 自分から見たScala

  5. Scalaを始めたきっかけ • 配属されたチームがScalaしか使ってなかった ◦ 社歴 = Scala歴 • 聞いたことはあったかもしれない…? •

    Go言語も2010年くらいに力説された事があった ◦ こんなに流行るならやっとけばよかった • 今覚えるならScalaかGoかRust
  6. なぜScalaなのか • インタビュー記事が! ◦ アドテクスタジオのエンジニアに聞くScalaの魅力 http://gihyo.jp/dev/serial/01/cyberagent/0063

  7. なぜScalaなのか • チャレンジ (今は普通?) • 可読性、メンテナンス性が高い • パフォーマンス • Javaの資産が使える

    • 社内コミュニティ
  8. なぜScalaなのか • 弊社Scala Girlからの回答

  9. なぜScalaなのか • 弊社Scala Girlからの回答

  10. Scala Meetup • 社内勉強会を定期的に開催

  11. Scalaをやってみて • 書いて実際に使ってみないと良い書き方がわからない ◦ 既存のコード、チームのレビュー環境のおかげ • 並行、並列処理が書きやすい • よく言われるデメリット的な物はあまり感じない or

    工夫次第 or 慣れ ◦ 例: コンパイル遅い、検索しにくい ◦ スペック低めの環境で開発つらいのはどうにかしたい ◦ ハマるのはだいたいJavaっぽい箇所 • モックをすぐ作って動かす!みたいな用途には向いてなさそう
  12. 朗報: ググラビリティ問題は解決しました • Google先生の圧倒的成長により解決 • こういうやつ

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

  14. Scalaのコンパイル

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

  16. 動的な広告の画像生成

  17. • Dynamic Retargeting for Games • Dynamic Personalized Ads

  18. • 100+ sbt subprojects • 400K+ lines • 18K+ builds

    (50 builds / day) • Running on AWS (US, JP)
  19. 配信している広告の例 • こんな感じです

  20. 生成している画像 • こんな感じです

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

  22. 構成

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

  24. Scalaで画像合成 • 画像パーツとテキストを合成

  25. Scalaで画像合成 • ほぼJavaの標準クラスライブラリを利用 ◦ javax.imageio ▪ ImageIO • 画像の入出力 /

    圧縮フォーマット変換 ◦ java.awt ▪ image.BufferedImage • 画像をメモリに展開して操作するバッファ ▪ Graphics2D • 画像の操作
  26. Scalaで画像合成 • 便利なライブラリ ◦ rkalla/imgscalr ▪ 画像のリサイズに利用 ◦ sksamuel/scrimage ▪

    画像の操作がひととおり用意されている(今回は自作) 画像フィルタもある
  27. テキストのアウトライン描画 • アウトラインがあると文字がくっきりする

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

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

  30. 日本語/中国語/韓国語が描画できない • いわゆるCJKフォント • PCで動くのにサーバでレンダリングされない • フォントサイズを変えてもフォントの幅が0px • OracleJDKをOpenJDKに変えたらなおった… ◦

    JVMの実装依存 ◦ 手元と環境揃えるの大事
  31. 気になりそうなところ • 画像をメモリ上で扱うので容量が気になる ◦ バランス的にメモリよりもCPUを使うのでイン スタンスサイズ的に問題なかった • 生成速度を上げられるのか ◦ Kinesisを使ってるので生成サーバを増やせ

    ば水平スケール可能
  32. Scalaの強みが活かせそうなところ • 別々に画像を生成してそれらを重ねる

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

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