Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
870
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.4k
一休.comレストランにおけるRustの活用
kymmt90
3
1.1k
一休.comレストランのRustバックエンド開発の様子
kymmt90
15
12k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
3k
コードレビュー座学 / About code reviews
kymmt90
0
6.8k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
610
GraphQL and Schema-First Development
kymmt90
4
4k
EC新サービスにおけるスキーマファースト開発 / Schema First Development in the New EC Service
kymmt90
1
2.3k
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
570
Other Decks in Technology
See All in Technology
プロダクトマネージャーが押さえておくべき、ソフトウェア資産とAIエージェント投資効果 / pmconf2025
i35_267
2
590
生成AIでテスト設計はどこまでできる? 「テスト粒度」を操るテーラリング術
shota_kusaba
0
560
Noを伝える技術2025: 爆速合意形成のためのNICOフレームワーク速習 #pmconf2025
aki_iinuma
2
2.1k
Lambdaの常識はどう変わる?!re:Invent 2025 before after
iwatatomoya
1
370
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
160
生成AI時代の自動E2Eテスト運用とPlaywright実践知_引持力哉
legalontechnologies
PRO
0
210
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
330
re:Invent 2025 ~何をする者であり、どこへいくのか~
tetutetu214
0
150
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
580
AWS re:Invent 2025で見たGrafana最新機能の紹介
hamadakoji
0
140
法人支出管理領域におけるソフトウェアアーキテクチャに基づいたテスト戦略の実践
ogugu9
1
210
AIと二人三脚で育てた、個人開発アプリグロース術
zozotech
PRO
0
690
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
93
The Invisible Side of Design
smashingmag
302
51k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Being A Developer After 40
akosma
91
590k
Producing Creativity
orderedlist
PRO
348
40k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
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$*ͷҡ࣋