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
rails new --api してからやったこと 〜2017年・夏〜 / EC Tech M...
Search
Kōhei Yamamoto (山本浩平)
August 02, 2017
Technology
0
830
rails new --api してからやったこと 〜2017年・夏〜 / EC Tech MTG 3
EC Tech MTG #3(GMOペパボEC事業部の社内勉強会)のための資料です
Kōhei Yamamoto (山本浩平)
August 02, 2017
Tweet
Share
More Decks by Kōhei Yamamoto (山本浩平)
See All by Kōhei Yamamoto (山本浩平)
総会員数1,500万人のレストランWeb予約サービスにおけるRustの活用
kymmt90
3
3.3k
一休.comレストランにおけるRustの活用
kymmt90
3
1.1k
一休.comレストランのRustバックエンド開発の様子
kymmt90
14
12k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
3k
コードレビュー座学 / About code reviews
kymmt90
0
6.7k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
600
GraphQL and Schema-First Development
kymmt90
4
3.9k
EC新サービスにおけるスキーマファースト開発 / Schema First Development in the New EC Service
kymmt90
1
2.3k
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
530
Other Decks in Technology
See All in Technology
生成AI時代におけるAI・機械学習技術を用いたプロダクト開発の深化と進化 #BetAIDay
layerx
PRO
1
1k
S3 Glacier のデータを Athena からクエリしようとしたらどうなるのか/try-to-query-s3-glacier-from-athena
emiki
0
180
✨敗北解法コレクション✨〜Expertだった頃に足りなかった知識と技術〜
nanachi
1
360
Vision Language Modelと自動運転AIの最前線_20250730
yuyamaguchi
3
1.1k
OPENLOGI Company Profile for engineer
hr01
1
37k
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
2
770
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
4
500
【CEDEC2025】ブランド力アップのためのコンテンツマーケティング~ゲーム会社における情報資産の活かし方~
cygames
PRO
0
230
VLMサービスを用いた請求書データ化検証 / SaaSxML_Session_1
sansan_randd
0
210
僕たちが「開発しやすさ」を求め 模索し続けたアーキテクチャ #アーキテクチャ勉強会_findy
bengo4com
0
1.8k
Lambda management with ecspresso and Terraform
ijin
2
120
金融サービスにおける高速な価値提供とAIの役割 #BetAIDay
layerx
PRO
1
720
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
184
22k
Embracing the Ebb and Flow
colly
86
4.8k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Building an army of robots
kneath
306
45k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Docker and Python
trallard
45
3.5k
Navigating Team Friction
lara
188
15k
Agile that works and the tools we love
rasmusluckow
329
21k
How to train your dragon (web standard)
notwaldorf
96
6.1k
Adopting Sorbet at Scale
ufuk
77
9.5k
Transcript
ʙɾՆʙ !LZNNU(.01FQBCP *OD &$5FDI.5( rails new --api͔ͯ͠Β ͬͨ͜ͱ
͢͜ͱ w3BJMTͰ"1*αʔόΛ࡞Δʹ͋ͨͬͯɺ։ൃੜ࢈ੑΛ্͛ΔͨΊʹ ͬͨ͜ͱΛհ͠·͢ wΰʔϧ w"1*ͳͲ։ൃ࣌ʹҰൠʹߟ͑ΔͱΑͦ͞͏ͳ͜ͱ͕ΒΛͬͯΒ͏ wຊࢿྉ3BJMTΛྫʹ͋͛ͯઆ໌͠·͕͢ߟ͔͑ͨԠ༻Ͱ͖ͦ͏
എܠ w+40/Λฦ͢8FC"1*αʔό Λ৽نʹॻ͘͜ͱʹͳͬͨ wϑϩϯτΤϯυͷ4JOHMF1BHF"QQMJDBUJPO 41" ͕͏ wΏ͘Ώ͘ެ։"1*ͱ͍ͨ͠ w3BJMTͰ։ൃͯ͠)FSPLVͷ্Ͱಈ͔͢ •$ rails
new <app_name> --api -d postgresql ͍͍ػձͳͷͰ։ൃָ͕ʹͳΔڥΛ࡞Γ͍ͨ ࠓޙ"1*ͱݺͼ·͢
ͬͨ͜ͱҰཡ w%PDLFSͰ։ൃڥ࡞ wελϒαʔόͷੜ wίʔσΟϯάنͷࣗಈνΣοΫ
%PDLFSͰ։ൃڥ࡞
%PDLFSͰ։ൃڥ࡞ʛ8IZ wݸਓ1$ͷڥʹΑͬͯɺ։ൃڥͷηοτΞοϓ͕ͳ͔ͳ͔͏·͘ ͍͔ͳ͍͜ͱ͕͋ͬͨ wྫɿOBUJWFFYUFOTJPOΛ͏HFNΛσβΠφ͞Μͷ1$ Πϯετʔϧ͠Α͏ͱࣦͯ͠ഊ͠ଓ͚Δ wϓϩμΫτ։ൃͰσβΠφͱΤϯδχΞͷ྆ํ͕։ൃڥΛ͏ w͔ΜͨΜʹηοτΞοϓͰ͖ɺ͏·͘ಈ͔ͳ͍ͱ͖ͷݪҼΓ͚͕ ָͳ։ൃڥʹ͔ͨͬͨ͠
Dockerfile FROM ruby:2.4.1 ENV APP_HOME /usr/src/app RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME COPY Gemfile \ Gemfile.lock \ $APP_HOME/ ENV BUNDLE_GEMFILE=$APP_HOME/Gemfile \ BUNDLE_JOBS=4 "1*Λ্ཱͪ͛ΔͨΊͷڥΛ%PDLFS Πϝʔδͱͯ͠࡞͢Δ %PDLFS)VC͔Βऔಘͨ͠3VCZͷެࣜ ΠϝʔδΛͱʹɺΠϝʔδʹ3BJMTͷ ΞϓϦΛઃஔ͢ΔσΟϨΫτϦΛ४උ
docker-compose.yml version: '3' services: db: image: postgres:9.6.3 app: &app_base build:
. # build a container from Dockerfile command: bin/rails s -b '0.0.0.0' depends_on: - db spring: <<: *app_base command: bin/spring server %# 3BJMT 4QSJOHͦΕͧΕͷ ίϯςφΛ্ཱͪ͛ΔͨΊͷઃ ఆϑΝΠϧʢࠨਤൈਮʣ app͖͞΄Ͳͷ DockerfileΛͱʹͨ͠3BJMT Λಈ͔͢ίϯςφ db্ཱ͕͕ͪͬͨ͋ͱʹapp Λ্ཱͪ͛Δ db1PTUHSF42-ͷެࣜ ΠϝʔδΛͦͷ··ར༻ͨ͠ ίϯςφ
"1*ͷηοτΞοϓ $ git clone
[email protected]
:foo/bar.git && cd ./bar $ docker-compose
run --rm app bundle install $ docker-compose run --rm app bin/rake db:setup $ docker-compose up # start db, app, spring εςοϓͰηοτΞοϓͰ͖Δ
bin/setup chdir APP_ROOT do puts '== Installing dependencies ==' system!
'docker-compose run --rm app bundle install' puts "\n== Preparing database ==" system! 'docker-compose run --rm app bin/rake db:setup' puts "\n== Removing old logs and tempfiles ==" system! 'docker-compose run --rm app \ bin/rails log:clear tmp:clear' puts "\n== Restarting application server ==" system! 'docker-compose up' end 3BJMTͰೖͬͨΞϓϦͷॳظઃఆ ΛࣗಈԽ͢ΔͨΊͷεΫϦϓτ !LFODIBO͘Μ͞Μ͔Βbin/setup Ͱઌड़ͨ͠ηοτΞοϓΛ࣮ͯ͢ߦ ͢Δ ͨΊͷQVMMSFRVFTU͕ʂʂ ʢࠨਤൈਮʣ !POL͞ΜͷࢿྉͰհ͞Ε͍ͯͨํ๏ IUUQTXXXTMJEFTIBSFOFUUBLBGVNJPOBLB SBJMT
"1*ͷηοτΞοϓɾվ $ git clone
[email protected]
:foo/bar.git && cd ./bar $ bin/setup
εςοϓʹͳͬͨ
ελϒαʔόͷੜ
ελϒαʔόΛੜ͢Δʛ8IZ wόοΫΤϯυ൝ "1* ͱϑϩϯτΤϯυ൝ 41" Ͱ͔Εͯ։ൃ ͍ͯ͠Δ w"1*͕͠ͳ͍ͱ41"࡞Γʹ͍͘ w͔͠͠ฒߦͯ͠։ൃ͍ͨ͠ wαϯϓϧͷϨεϙϯεΛฦ͢ελϒαʔό͕΄͍͠
0QFO"1* paths: /products/{productId}: get: operationId: getProduct parameters: - in: path
name: id type: integer responses: '200': schema: type: object properties: product: type: object properties: name: type: string example: ͓ࡼ Χϥʔϛʔγϣοϓ"1*Ͱ෦తʹಋೖࡁΈ ͷ0QFO"1*Ͱ"1*༷Λઌʹॻ͘ ʢࠨਤൈਮʣ :".-Ͱॻ͍ͨ0QFO"1*ͰͷఆٛΛZBNM@SFG@SFTPMWFS Λ ͬͯ0QFO"1*ͱͯ͠WBMJEͳswagger.jsonʹม͠ɺ Ͳ͔͜ʹग़ྗ͓ͯ͘͠ IUUQTHJUIVCDPN+PFOPIZBNM@SFG@SFTPMWFS
4XBHHFS$PEFHFO $ docker pull swaggerapi/swagger-codegen-cli $ docker run -v ${PWD}:/local
\ swaggerapi/swagger-codegen-cli \ generate -l nodejs-server -i /path/to/swagger.json \ -o /local/stub_app 4XBHHFS$PEFHFO W Ͱɺఆٛͨ͠αϯϓϧϨεϙϯεΛฦͤΔͷ /PEF 4QSJOH.7$ͳͲʹݶΒΕ͍ͯΔͷͰɺࠓճnodejs-serverΛࢦఆ
ελϒαʔόͷ্ཱͪ͛ ʢNodeͷڥDockerͳͲͰ࡞͓ͬͯ͘ʣ $ npm start ʢҎԼผλʔϛφϧͰʣ $ curl http://localhost:3000/products/1 {
"product": { "name": "͓ࡼ" } } ͖ͳϨεϙϯεฦ͠์
ࢀߟʛ"1*ఆٛͷ։ൃϑϩʔ w0QFO"1*Ͱ"1*ఆٛΛՃ͢ΔQVMMSFRVFTUΛ࡞Δ w4XBHHFS&EJUPSΛ͏ͱTZOUBYDIFDLͬͯศར wॻ͖࣍ୈɺσεΫपลͰ։ൃਞΈΜͳ͕ू·ͬͯϨϏϡʔ wϑϩϯτΤϯυʗόοΫΤϯυ྆ํͷࢹͰϨϏϡʔͰ͖Δ w0,Ͱ͋ΕNBTUFSϚʔδ w͜ͷ࣌ͰελϒαʔόͰͦͷ"1*͕͑ΔΑ͏ʹͳΔ
ίʔσΟϯάنͷࣗಈνΣοΫ
ίʔσΟϯάنͷࣗಈνΣοΫʛ8IZ wίʔυϨϏϡʔͰઃܭϩδοΫͷϨϏϡʔʹूத͍ͨ͠ͷͰɺ ίʔσΟϯάελΠϧΛܾΊͯɺࣗಈͰͤΔΑ͏ʹ͍ͨ͠ wͨͩ͠ɺ3VCZʹ1)1ͷ143 1ZUIPOͷ1&1΄Ͳཱ֬ͨ͠ ίʔσΟϯάنඪ४ͳ͍
ίʔσΟϯάنʢϧʔϧʣͷઃܭ w3VCP$PQͰνΣοΫ͢Δ wϧʔϧͷݫີ͞ΛܾΊΔ wࣾطଘϓϩδΣΫτͷϧʔϧ!POL͞Μͷهࣄ Λࢀߟʹ ͠ͳ͕Βɺ؇Ίͷͷ͔Β࢝ΊΔ͜ͱʹͨ͠ w!ITCU͞ΜͷΞυόΠε͋ͬͯɺؾܰʹ.rubocop.ymlʹରͯ͠ QVMMSFRVFTUΛग़ͯ͠Β͏ํʹͨ͠ IUUQCMPHPOLOJOKBSVCPDPQHFUUJOHTUBSUFE
3VCP$PQͷϧʔϧྫ w3VCZJTUͳΒ΄΅͜͏ॻͩ͘Ζ͏ͱ͍͏ͷ͚ͩΛϧʔϧͱͯ͠ ͏ w͓અհͳͷΈ͕Θ͔Εͦ͏ͳͷͻͱ·ͣΘͳ͍ w͏ϧʔϧͷྫ wෆཁͳۭߦʗۭ֯നΛফ͢ wίϩϯʗΧϯϚͷ͏͠ΖɺதΧοίͷଆͳͲۭ֯നΛೖΕΔ wҾͳ͠ϝιουͷݺͼग़࣌͠ΧοίΛ͚ͭͳ͍
3VCP$PQͷ࣮ߦ wRuboCop::CLI#runΛͬͯ34QFDͷࣗಈςετͷͳ͔ͰνΣοΫ ͍ͯ͠Δ wࣗಈमਖ਼·Ͱ͍ͯ͠ͳ͍ w3VCZͷίʔυͯ͢ΛόονͰνΣοΫ͢ΔͷͰ͘ͳΔ w;ͩΜQSFDPNNJUIPPLͰνΣοΫͭͭ͠ɺNBTUFSʹରͯ͠ OJHIUMZDIFDL͢Δͱ͔
·ͱΊ
·ͱΊ w։ൃڥ୭ͷ1$্Ͱಉ͡ڥͰಈ͘Α͏ʹ͢Δͱศར w։ൃڥͰ͖Δ͚ͩগͳ͍εςοϓͰηοτΞοϓͰ͖Δͱศར wελϒαʔό࡞ͷΈΛ࡞͓ͬͯ͘ͱϑϩϯτΤϯυʗόοΫΤ ϯυͰฒྻʹ։ൃͰ͖ͯศར w͞Βʹ"1*ఆٛΛνʔϜͰϨϏϡʔ͢Δػձ͕૿͑ΔͷͰศར wࣗಈͰίʔσΟϯάنͷνΣοΫ͕ΔΑ͏ʹ͢Δͱศར
Ҿ͖ଓ͖͍ͬͯ͘͜ͱ w"1*༷ͱ࣮ͷ͍͋ͩͷڍಈͷဃΛ͙ w0QFO"1* 34QFD "QJWPSF wػೳʗύϑΥʔϚϯεͷܧଓతվળͷޮԽ w5BDIJLPNB HFNEJ⒎ͰHFNͷܧଓతΞοϓσʔτ w/ ͷࣗಈݕग़
w$*ͷҡ࣋