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

FW と ライブラリ の考え方

FW と ライブラリ の考え方

kanayannet

June 29, 2024
Tweet

More Decks by kanayannet

Other Decks in Programming

Transcript

  1. 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
  2. mysql2 class User def initialize @cli = Mysql2::Client.new( # connection

    設定色々... ) @name = '' @sex = '' @like = '' @errors = [] end attr_accesor :name, :sex, :like, :errors
  3. 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
  4. NG な例 active_record でいきなりスタートすると... 例 正規化されている table A, B があります。

    同じ server内に table はありません。 A の IDを含む B のデータを出す必要がある
  5. 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, ....)
  6. 理由 学習コストが少ない -> Ruby が解ってれば、大体できる 余計なパーツがない -> 比較対象: Rails memory,

    cpu が最低限で済みやすい 癖(作法) が少ない -> Frontend engineer が書いたものをそ のまま当てやすい 分業しやすい
  7. 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
  8. Lost connection to MySQL server... 接続が長すぎて切れる事がある daemon process だし reconnect

    option は非推奨 -> 今後なくなる方向 trancation や SQLの変数を保持してくれないので Rails は http request 開始時にチェックして自動で接続し てくれる reconnect option いらない -> よしなにやってくれる 自分で実装する必要もない
  9. 注意: ディスってる訳じゃない 例: python orm でググる... どれ使えばええネン。 Ruby = ActiveRecord

    1択 Rails とともに発展した感があり、優れてるし迷いがな い
  10. 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 }); });
  11. 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!"); }); }
  12. 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
  13. 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)
  14. よくある Q & A Q: そんな事言ったって 一気に数言語も覚えられんすよ? A: 各個撃破です。 偉い人

    も前回各個撃破と言ってました。 一気にやるのはオススメしません。 参考: https://speakerdeck.com/rtechkouhou/enziniatositekofalsexia sheng-kifalsekorutameni