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
FW と ライブラリ の考え方
Search
kanayannet
June 29, 2024
Programming
270
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
0
95
Mcp Training
kanayannet
0
190
MCP で「こいつ動くぞ」
kanayannet
0
140
無関心の谷
kanayannet
0
1.1k
生成AIの使いどころ
kanayannet
0
250
github copilot と 心理的安全性
kanayannet
0
270
TDDと今まで
kanayannet
0
670
個人開発 稼げなくてもいいアプリ
kanayannet
0
600
システムの堅牢性
kanayannet
0
340
Other Decks in Programming
See All in Programming
Modding RubyKaigi for Myself
yui_knk
0
920
Oxcを導入して開発体験が向上した話
yug1224
4
310
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
3Dシーンの圧縮
fadis
1
690
dRuby over BLE
makicamel
2
330
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
AIで効率化できた業務・日常
ochtum
0
120
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
500
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
2
560
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.6k
Webフレームワークの ベンチマークについて
yusukebe
0
160
Vite+ Unified Toolchain for the Web
naokihaba
0
240
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
140
GraphQLとの向き合い方2022年版
quramy
50
15k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
30 Presentation Tips
portentint
PRO
1
320
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Music & Morning Musume
bryan
47
7.2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
470
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Git: the NoSQL Database
bkeepers
PRO
432
67k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
390
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
ご清聴 ありがとう ございました。