Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dynalystにおける動的な画像生成
Search
Kurochan
March 21, 2017
Programming
0
1.5k
Dynalystにおける動的な画像生成
Kurochan
March 21, 2017
Tweet
Share
More Decks by Kurochan
See All by Kurochan
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
8
4.1k
GoでTCP Proxyを実装してみよう
kurochan
1
440
サイバーエージェントの広告配信におけるIPoEトラフィックの概況
kurochan
0
210
スケールするというのはどういうことなのか
kurochan
14
4.1k
サイバーエージェントのGitHub Copilot導入と 開発生産性
kurochan
40
37k
Cloudflare Zero Trustを利用したセキュアな開発環境へのアクセス手法の確立
kurochan
10
2.4k
セキュキャンを卒業してその後
kurochan
0
1.1k
サイバーエージェントの実践×実験Snowflake 導入の経緯から最新機能のトライアルまで / How Snowflake Is Used In CyberAgent - Go To the Future
kurochan
0
820
入門Open Policy Agent: Policy as Codeを目指して / introduction-to-open-policy-agent
kurochan
0
480
Other Decks in Programming
See All in Programming
Rubyでたのしむクリエイティブコーディング/Enjoy Creative coding with Ruby
chobishiba
1
180
0→1と1→10の狭間で Javaという技術選定を振り返る/Reflecting on the Decision to Choose Java Between Scaling from 0 to 1 and 1 to 10
jaguar_imo
2
380
MetricKitで予期せぬ終了を検知する話 / Detect unexpected termination with MetricKit
nekowen
1
190
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
270
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
110
Build Apps for iOS, Android & Desktop in 100% Kotlin With Compose Multiplatform (mDevCamp 2024)
zsmb
0
330
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
270
大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~
kj455
4
960
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
920
Elm 0.19.0 Changes
bkuhlmann
0
490
ONE WEDGE_company_guide
1wedge_one
0
480
Featured
See All Featured
Side Projects
sachag
451
41k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
The Invisible Side of Design
smashingmag
294
49k
YesSQL, Process and Tooling at Scale
rocio
164
13k
A better future with KSS
kneath
231
16k
Optimizing for Happiness
mojombo
370
69k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
Building Your Own Lightsaber
phodgson
99
5.7k
Designing the Hi-DPI Web
ddemaree
276
33k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
Done Done
chrislema
178
15k
Transcript
CyberAgent, Inc. All Rights Reserved Dynalystにおける動的な広告の 画像生成 黒崎 優太 @kuro_m88
黒崎 優太 @kuro_m88 • 株式会社サイバーエージェント ◦ AdTech Studio / Dynalyst
エンジニア • 新卒2年目 • Scala, AWS, 自宅サーバ 査読に参加しました 今日書き終えました
今日話すこと • 自分から見たScala ◦ 初心者的な話 • 動的な広告の画像生成 ◦ Scalaを使ってどのようにして実現したか (募集ページより)
自分から見たScala
Scalaを始めたきっかけ • 配属されたチームがScalaしか使ってなかった ◦ 社歴 = Scala歴 • 聞いたことはあったかもしれない…? •
Go言語も2010年くらいに力説された事があった ◦ こんなに流行るならやっとけばよかった • 今覚えるならScalaかGoかRust
なぜScalaなのか • インタビュー記事が! ◦ アドテクスタジオのエンジニアに聞くScalaの魅力 http://gihyo.jp/dev/serial/01/cyberagent/0063
なぜScalaなのか • チャレンジ (今は普通?) • 可読性、メンテナンス性が高い • パフォーマンス • Javaの資産が使える
• 社内コミュニティ
なぜScalaなのか • 弊社Scala Girlからの回答
なぜScalaなのか • 弊社Scala Girlからの回答
Scala Meetup • 社内勉強会を定期的に開催
Scalaをやってみて • 書いて実際に使ってみないと良い書き方がわからない ◦ 既存のコード、チームのレビュー環境のおかげ • 並行、並列処理が書きやすい • よく言われるデメリット的な物はあまり感じない or
工夫次第 or 慣れ ◦ 例: コンパイル遅い、検索しにくい ◦ スペック低めの環境で開発つらいのはどうにかしたい ◦ ハマるのはだいたいJavaっぽい箇所 • モックをすぐ作って動かす!みたいな用途には向いてなさそう
朗報: ググラビリティ問題は解決しました • Google先生の圧倒的成長により解決 • こういうやつ
朗報: ググラビリティ問題は解決しました
Scalaのコンパイル
参考: Scalaプロダクトのビルド高速化 • https://speakerdeck.com/kurochan/scalapurodakutofalsebirudogao-su-hua
動的な広告の画像生成
• Dynamic Retargeting for Games • Dynamic Personalized Ads
• 100+ sbt subprojects • 400K+ lines • 18K+ builds
(50 builds / day) • Running on AWS (US, JP)
配信している広告の例 • こんな感じです
生成している画像 • こんな感じです
動的な部分 • ユーザによって色々違う
構成
そもそも画像を生成する理由 • HTMLとかSVGで重ねればよいのでは? ◦ ディスプレイ広告だけなら可能 ◦ ネイティブ広告に対応できない
Scalaで画像合成 • 画像パーツとテキストを合成
Scalaで画像合成 • ほぼJavaの標準クラスライブラリを利用 ◦ javax.imageio ▪ ImageIO • 画像の入出力 /
圧縮フォーマット変換 ◦ java.awt ▪ image.BufferedImage • 画像をメモリに展開して操作するバッファ ▪ Graphics2D • 画像の操作
Scalaで画像合成 • 便利なライブラリ ◦ rkalla/imgscalr ▪ 画像のリサイズに利用 ◦ sksamuel/scrimage ▪
画像の操作がひととおり用意されている(今回は自作) 画像フィルタもある
テキストのアウトライン描画 • アウトラインがあると文字がくっきりする
Scalaでアウトライン描画 (一部簡略化)
透過情報付き画像がJpegに書き出せない • 透過なしの画像バッファを用意してそこに再描 画
日本語/中国語/韓国語が描画できない • いわゆるCJKフォント • PCで動くのにサーバでレンダリングされない • フォントサイズを変えてもフォントの幅が0px • OracleJDKをOpenJDKに変えたらなおった… ◦
JVMの実装依存 ◦ 手元と環境揃えるの大事
気になりそうなところ • 画像をメモリ上で扱うので容量が気になる ◦ バランス的にメモリよりもCPUを使うのでイン スタンスサイズ的に問題なかった • 生成速度を上げられるのか ◦ Kinesisを使ってるので生成サーバを増やせ
ば水平スケール可能
Scalaの強みが活かせそうなところ • 別々に画像を生成してそれらを重ねる
どうやって開発したのか • 開発期間: 1ヶ月程度 • 他に配信のためにデータの連携する部分とか • コンポーネントごとに分担して開発
まとめ • 入社して初めてScala触った人の体験談 • Scalaで画像生成するサーバを作った話 ◦ 他にも色々新機能追加しています