Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
画像へのアクセス方法の悩み
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
RingoUmaii
December 13, 2019
Technology
19
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
画像へのアクセス方法の悩み
画像へのアクセス方法の悩み
ファイルサーバーを持つべきか
データベースに画像データを保存する方法
RingoUmaii
December 13, 2019
Other Decks in Technology
See All in Technology
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
6k
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
420
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
290
Classmethod Company Deck
satoshi7
1
680
継続的なAIコスト最適化
bgpat
1
340
Kiro Crewをはじめよう
kizawa2020
1
160
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
280
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
130
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
150
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Optimizing for Happiness
mojombo
378
71k
The Language of Interfaces
destraynor
162
27k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
Everyday Curiosity
cassininazir
0
350
The Curious Case for Waylosing
cassininazir
1
570
Transcript
画像へのアクセス⽅法の悩み
データベースで画像を持つ⽅法 ~3パターン~ ▪ ファイルサーバーを別に作り画像を保存、DBにはファイルサーバーのURLを保存 → ファイルサーバー⾼いの︖ ▪ DBのテーブルに、画像への変換可能な形式で画像データを保存 → ⼿間がかかりそう・・・
▪ アプリケーションサーバーに画像ファイルを保存、DBにはファイルパスを保存 → 保守性の観点からも現実的ではなさそう・・・
ファイルサーバー vs データベースサーバー 〜画像の保持にbest practiceはあるのか︖〜 ファイルサーバーに画像を保存 (DBにはファイルサーバーに保存した画像のURLを保存する) データベースに画像を保存 費⽤ ・ファイルサーバーはDBサーバーより安い?
・DBは⾼い? パフォーマンス ・ネットワーク速度が早ければ問題ない。 ・レコードが少なければOK ・レコード数が多くなれば画像データは容量が⼤きいので、画像ではな いデータと⽐べて、取得に時間がかかることもある バックアップ ・冗⻑構成、バックアップ構成を考える必要がある ・S3等のクラウドサービスを使うのであれば、お⾦で検討する時間を解 決することも可能 ・DBのバックアップをすると、おのずと画像データもバックアップされ るので、特別に考慮することはなくなる 保存⽅法 ・画像ファイルを変換しないで保持することが可能 ・テーブルにBLOB等のバイナリデータを保持することが可能なカラム に、バイナリデータに変換した画像を保存する 扱いやすさ ・画像の更新にDBを触る必要がなくなるので、関係ない重要なデータを 消す⼼配はない ・DBを更新する何らかのシステムやPGM、またはSQLを介して画像を 更新することになるので、⼿間がかかる
画像の数が少なく&& 数が増えない場合、 ファイルサーバーを持たないことも許容できる この場合に適⽤できる⽅法 ⽅法1︓アプリケーションサーバーに画像ファイルを保存、DBにはファイルパスを保存 ⽅法2︓DBのテーブルに、バイナリ形式で画像データを保存
⽅法2︓ DBのテーブルに、バイナリ形式で画像 データを保存
画像データをbase64エンコーディングで変換 ▪ 画像データ︓ ▪ /Users/ringoumaii/Documents/study/iconfinder_Santa_Hat_1651937.png 素材元︓https://www.iconfinder.com/icons/1651937/christmas_claus_hat_santa_icon
画像データをbase64エンコーディングで変換 $ irb irb(main):001:0> require 'base64’ Þ true irb(main):005:0> binary_data
= File.read("/Users/ringoumaii/Documents/study/iconfinder_Santa_Hat_1651937.png") Þ “¥x89PNG¥r¥n¥u001A¥n¥u0000¥u0000¥u0000¥rIHDR¥u0000¥u0000¥u0002¥ 省略︕︕︕” irb(main):025:0> Base64.strict_encode64(binary_data) => "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAAC xMBAJqcGAAAIABJREFUeJzsnXmcHMV5939V1T3X7kqrW0hCB7olEAghcSNuZMAgIQkQQgcSlm/HSez4SBzZ iZ33jRPHjh3f8RHbbxIQNz44DRiMzQ0Gc0hCB7rPva+Z7qr3j9VKs7sz0省略︕︕︕
htmlでbase64エンコードした画像を表⽰ <!DOCTYPE html> <html> <head> <title>画像</title> </head> <body> <img src=“data:image/png;base64,
Base64.strict_encode64(binary_data)の実⾏結果" /> </body> </html>
Base64 データを、アルファベット(A–Z, a–z)と数字(0–9)と記号(+, /, =)でするエンコーディン グ⽅式 =は変換時に余った部分を詰めるための記号として ⽤いられる。 irb(main):001:0> require
'base64' => true irb(main):054:0> before_text = "EBISU!?" => "EBISU!?" irb(main):055:0> after_text = Base64.strict_encode64(before_text) => "RUJJU1UhPw==" 16進数表記 45 42 49 53 21 3F 2進数表記 01000101 01000010 01001001 01010011 01010101 00100001 00111111 6bitずつに変換(4bit余るので0を4bit分後ろに追加して6bitにする) 010001 010100 001001 001001 010100 110101 010100 100001 001111 110000 ( R U J J U 1 U h P w ) base64の変換表に基づき、4⽂字ごとのかたまりに変換(最後がPwと2⽂字になるので、4⽂字になるように=を2つ追加) RUJJ U1Uh Pw==
base64エンコードすると データサイズが1.3倍に・・・ < base64エンコード前の画像ファイルのサイズ> -rw-r--r--@ 1 ringoumaii study 44375 11
25 18:59 iconfinder_Santa_Hat_1651937.png <base64エンコードした⽂字列を保存したファイルのサイズ> -rw-r--r-- 1 ringoumaii study 59168 12 13 16:43 after_santa
base64を過去に使ったときは・・・ n どんなシステム︖ - お得情報と⼀緒に画像を保存するシステム(base64エンコードした画像データをBLOB列に格納) - 画像データをbase64エンコードしてデータベースに保存するAPI - base64エンコードした画像データを返すAPI n
base64を使うとなった理由 ü クラウド使えない、ファイルサーバーを別に持つこともできない (お⾦かけられない、許可もらうのにとても時間がかかる、リリースまで差し迫っている) →既にあるデータベースで何とかするしかなかった ü レコードの量がmaxでも100ぐらいと決まっていた