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
FW と ライブラリ の考え方
Search
kanayannet
June 29, 2024
Programming
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
FW と ライブラリ の考え方
kanayannet
June 29, 2024
More Decks by kanayannet
See All by kanayannet
リファクタリング ハーネス
kanayannet
1
130
厳密な定義
kanayannet
0
140
Mcp Training
kanayannet
0
270
MCP で「こいつ動くぞ」
kanayannet
0
200
無関心の谷
kanayannet
0
1.3k
生成AIの使いどころ
kanayannet
0
270
github copilot と 心理的安全性
kanayannet
0
300
TDDと今まで
kanayannet
0
760
個人開発 稼げなくてもいいアプリ
kanayannet
0
620
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
新卒PdEのリアル
ryu1013
1
520
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.4k
The Rails Doctrine Decade
koic
2
400
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
210
速習iPhone Duo対応
yuukiw00w
2
840
カツオ、ご期待ください
suneo3476
0
110
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
490
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
260
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.9k
Intent as Code
shoppingjaws
6
1.1k
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
200
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
30 Presentation Tips
portentint
PRO
1
410
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
The Language of Interfaces
destraynor
162
27k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
370
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Transcript
FW と ライブラリ の考え方 Gunma.web #53 @kanayannet 15分
突然ですが SQLを初めて学ぶとします。 目的はデータへの問い合わせをスムーズに行う 今、使える言語はRuby
何から勉強する? ActiveRecord O/R mapper mysql2 素のSQL をひたすら書く
ActiveRecord class User < ActiveRecord::Base establish_connection( # connection 設定色々 )
validates :name, presence: { message: '名前を入力してください' } end # ここから実行コード u = User.new u.name = 'kanayannet' u.sex = 'man' u.like = 'jojo' u.save
mysql2 class User def initialize @cli = Mysql2::Client.new( # connection
設定色々... ) @name = '' @sex = '' @like = '' @errors = [] end attr_accesor :name, :sex, :like, :errors
def valid? if self.name.blank? @errors << '名前を入力してください' end return false
if @errors.present? true end
def save return false if self.valid? sql = <<~SQL insert
into users( name, sex, like, updated_at, created_at ) values(?, ?, ?, now(), now()) SQL sts = @cli.prepare(sql) sts.execute( @name, @sex, @like ) true end def close @cli.close end end
さて SQL 初学者にオススメの学び方 はどっち?
ここからは挙手方式でやろうと思います。
ActiveRecord ?
mysql2 ?
絶対はないですが... 自分は mysql2 をオススメします。
理由 基礎からガッツリと 接続, 切断, SQL文, transaction ...慣れる事ができるため 応用が効きます。(頭の中でイメージしやすい) 複数のtable があり
別sever いる 別scheme にいて join が必要である
NG な例 active_record でいきなりスタートすると... 例 正規化されている table A, B があります。
同じ server内に table はありません。 A の IDを含む B のデータを出す必要がある
NG1 1 接続しか考慮できなくて詰む 1 server 1 scheme に全部入ってないと頭が追いつかない joins method
で繋げたいけど...同じServer内にいないし出 来ない A.joins(:b)
NG2 A を全件 loop してその中で都度都度 B にqueryを発行 数件ならいいけど... 100万件とかあるとServer負荷的にやさしくないよ
OK limit n, 1000 で切って where in を使えばいんじゃない? n は
offset 下記は 1 - 1000 の例 MySQL を基礎からやった人は辿りつきやすい select id from A limit 1, 1000 ↓ select id from B where id in (AのID, AのID, ....)
心理学(人間の脳について) 感覚記憶 外界から入力された刺激情報 すぐ忘れる これのうち注意を向けられた情報だけが短期記憶 短期記憶 文字通り短期間の記憶 一度に保持される情報の容量の大きさにも限界がある 長期記憶 容量の大きさに制限はない
保持情報が長期記憶として安定化する過程がある 自転車に乗る方法やパズルの解き方などのように、 同じ経験を反復する
大事なことなので 自転車に乗る方法やパズルの解き方などのように、同じ 経験を反復する
慣れたら ActiveRecord
理由 コード量が少なく、開発効率が圧倒的
これの違いに似てるね プログラミングがとりあえず、できる データ設計 -> コード設計 -> 実装
オープニング終了!
今日のAgenda 勉強する場合の好み Front <-> Server の好み Server <-> RDB の好み
lambda <-> DynamoDB の好み 画像処理 の好み
勉強する場合の好み Front <-> Server の好み Server <-> RDB の好み lambda
<-> DynamoDB の好み 画像処理 の好み
Front <-> Server の好み
マイクロサービス 規模が小さいサービス同士を組み合わせて連係させるこ とで、ひとつの大きなアプリケーションやサイトの構築 を行う技法
よくある分離パターン データベースや全文検索エンジンといったミドルウェア からデータを取得、更新する ページを構築する それぞれ別サーバで処理して.... HTTPのインタフェースを利用してやりとりする
参考: @it https://atmarkit.itmedia.co.jp/ait/articles/1803/12/news012.h
BFF(Backends For Frontends) Front <-> Server これの事ですね。
Sinatra が推奨です。
理由 学習コストが少ない -> Ruby が解ってれば、大体できる 余計なパーツがない -> 比較対象: Rails memory,
cpu が最低限で済みやすい 癖(作法) が少ない -> Frontend engineer が書いたものをそ のまま当てやすい 分業しやすい
Sample code app.rb require 'sinatra' class App < Sinatra::Base get
"/" do "index" end post "/" do "create" end patch "/:id" do "edit #{params[:id]}" end delete "/:id" do "delete #{params[:id]}" end end
config.ru require "./app" run App
Gemfile # frozen_string_literal: true source "https://rubygems.org" gem 'sinatra' gem 'puma'
bundle config --local path vendor/bundle bundle i bundle exec pumactl
start
frontend の人には 文字列の箇所を erb(テンプレート) に して 渡せばいいだけ
backend server Server <-> RDB lambda <-> DynamoDB
Server <-> RDB 役割: BFF のサーバからの input を保存, 抽出する 基本:
html を返さず, json を返す
Ruby on Rails
特徴(メリット) 大体のよくある処理は短いコードで表現可能 ActiveRecord -> 特にこれがある事が大きい 同じ言語でこれを超えるFWがないので、迷いが少ない 他言語だと乱立してる感がある
特徴(デメリット) Frontの作法が独特...Frontend エンジニアがそのまま参加 しずらい事がある asset pipeline formタグ周りの独特な記法 <%= form_with model:
@fruit, local: true do |form| %>
sinatra にActiveRecordでもいいのでは? activerecord は接続は1プロセスの中で1回のみ
Lost connection to MySQL server... 接続が長すぎて切れる事がある daemon process だし reconnect
option は非推奨 -> 今後なくなる方向 trancation や SQLの変数を保持してくれないので Rails は http request 開始時にチェックして自動で接続し てくれる reconnect option いらない -> よしなにやってくれる 自分で実装する必要もない
注意: ディスってる訳じゃない 例: python orm でググる... どれ使えばええネン。 Ruby = ActiveRecord
1択 Rails とともに発展した感があり、優れてるし迷いがな い
Frontの作法が独特... backend Api にしておけば、目立たないね
利用企業 みんな大好きgithub も Rails だし 他: cookpad, 食べログ, note, Qiita,
ラクスル
lambda <-> DynamoDB
どんな時にこれ? 大前提 トランザクションがいらない NoSQL だし リクエスト数が計算しやすい 使った分だけ課金される 読めないくらい多いものだと不向き
EC2, ECS, RDS あるけど? RDS 落としておいても...勝手に起動しちゃう ? 使ってなくとも起動してると課金される 料金が...
Lambda 側で何のFW ? Express.js 一言で表現すると... nodejs 版 sinatra
SampleCode const express = require('express'); const app = express(); const
serverless = require('serverless-http'); app.get('/users', (req, res) => { res.json([1, 2, 3]); }); app.get('/users/:id', (req, res) => { res.json({ id: req.params.id }); }); app.post('/users', (req, res) => { res.json(req.body); }); app.delete('/users/:id', (req, res) => { res.json({ id: req.params.id }); });
app.put('/users/:id', (req, res) => { res.json({ id: req.params.id }); });
const handler = serverless(app); // ここ以降は local でテストするために必要 const startServer = async () => { app.listen(3000, () => { console.log("listening on port 3000!"); }); }
これと DynamoDB の組み合わせなら... フルマネージドでかつ、放っておいても課金がリクエス ト分
縁起でもないが... 使われなくなって放置されても課金されない
Lambda S3 event + Python + pillow 画像処理 の好み
画像処理周りの悩み事 画像よりも大きなメモリーを大量消費 middle ware の install -> 面倒臭い ImageMagick, opencv
など
分離したいよね? アップロード先は静的ファイル だし S3 にまとめたい メモリーも 実運用サーバではなく 別に依存関係を切り たい
この時点で Lambda S3 event が確定したようなもの
参考: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with- s3-example.html
middle ware の install 出来ればその言語だけで処理したい ゆくゆく拡張性持たせるにしても画像処理に向いてる言 語
Python + pillow この時点でこの二つが決まる
理由 pillow middle ware の install が不要 pure python で実装されてる
という訳で言語は Python
SampleCode from PIL import Image import urllib.parse import boto3 import
os QUALITY_IMAGE = 50 s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] org_key = urllib.parse.unquote_plus( event['Records'][0]['s3']['object']['key'], encoding='utf-8' ) source_file = u'/tmp/' + os.path.basename(org_key) ext = 'jpg' dst_path = os.path.splitext( os.path.basename(source_key) )[0] + '.' + ext dst_key = os.path.splitext(org_key)[0] + '.' + ext
try: s3.download_file( Bucket=bucket, Key=org_key, Filename=source_file ) img = Image.open(source_file, 'r')
img.save( dst_path, ext, quality = QUALITY_IMAGE ) s3.upload_file( Filename=dst_path, Bucket=bucket, Key=dst_key ) return dst_key except Exception as e: print(e)
画像は色々厄介 ちなみに ImageMagick を使って、3MB の画像を処理した ら 1GB 以上のメモリを使っていた経験があります。
まとめ
目的と手段 良いも悪いも表裏一体なところあります。 目的に沿って適切な手段を取ることを推奨します。
アンチパターン xx言語しか出来る人がいないから xx言語のFW ありがちだけど非推奨 理由: 結果的に後から見返した際にベストな選択ではな いため
学習期間 許されるのであれば、可能な限り 「学習」と「調査」期間を設けよう 言語やFWやライブラリは「道具=手段」であって 「目的」そのものではない
よくある Q & A Q: K澤さん一体、何言語覚えればいいんすか? A: 全部を覚える必要ないよ。 その代わりに出来る範囲を実装してください。 分担作業も手段の一つです。
よくある Q & A Q: 全部をやってみたいんですが? A: ガンバロウ! 覚えるしか...(ry
よくある Q & A Q: そんな事言ったって 一気に数言語も覚えられんすよ? A: 各個撃破です。 偉い人
も前回各個撃破と言ってました。 一気にやるのはオススメしません。 参考: https://speakerdeck.com/rtechkouhou/enziniatositekofalsexia sheng-kifalsekorutameni
ご清聴 ありがとう ございました。