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 Tutorialを Phoenixで移植してみた
Search
hagiyat
August 25, 2015
Programming
3
2.3k
Rails Tutorialを Phoenixで移植してみた
* *
* + うそです
n ∧_∧ n
+ (ヨ(* ´∀`)E)
Y Y *
hagiyat
August 25, 2015
Tweet
Share
Other Decks in Programming
See All in Programming
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
540
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
150
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
980
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
330
Is Xcode slowly dying out in 2025?
uetyo
1
190
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
240
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
420
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
420
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
190
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
390
Benchmark
sysong
0
270
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
190
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
93
6.1k
Documentation Writing (for coders)
carmenintech
72
4.9k
Visualization
eitanlees
146
16k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Producing Creativity
orderedlist
PRO
346
40k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
The World Runs on Bad Software
bkeepers
PRO
69
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
Practical Orchestrator
shlominoach
188
11k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Transcript
Rails TutorialΛ PhoenixͰҠ২ͯ͠Έͨ @hagiyat 2015/08/25 #shibuya.ex#1
͡Ί·ͯ͠ɻഡ୩Ͱ͢ɻ github/twitter: hagiyat 2014/05͔Βגࣜձࣾnanapiʹॴଐ ձࣾͷTechBlogͪΐͬͱॻ͍ͯ·͢ http://blog.nanapi.co.jp/tech/author/hagiyat/ ͦΕ·ͰϑϦʔϥϯεΛ໊Γͳ͕Β৭ʑͳձࣾͰSIerͱͯ͠ಇ͍ͯ ͍ͨΓ͠·ͨ͠ 2014/12ͷݴޠೖΕ͔͑ࣄมͰॳΊͯRuby/Ruby on
Railsʹ͞ΘΔ Ҏ߱΄΅RubyͷΈॻ͍ͯա͍ͯ͝͠·͢
ͳͥElixirʹڵຯΛ࣋ͬͨͷ͔ʁ RubyΛॻ͍͍ͯͯҰ൪ָ͍͠ͷϝιουνΣΠϯ࡞Γ RubyΛॻ͖࢝Ίͯɺ͙͢ʹ@merborne͞Μͱ@yuroyoro͞ΜͷϒϩάͰ܆ ಃΛड͚ͨ ϝιουνΣΠϯʹ͔ܽͤͳ͍ͷߴ֊ؔ ߴ֊ؔͱ͍͑ؔܕݴޠ ؔܕݴޠࣗମʹڵຯ͕Θ͍͚ͨͲɺϝδϟʔͲ͜Ζͷݴޠ͙͢ʹֶͷ ͕࢝·Δͷ͕ਏ͔ͬͨ खͷ͖͖͍ͬͯͳ͍ؔܕݴޠΛٻΊΔ Elixirʂʁ
·ͣԿ͔ॻ͍ͯΈΑ͏ ۙͳڥΛ࠶ݱͯ͠ΈΔͱ͍͏ͷ͕ਅͬઌʹࢥ͍͍ͭͨ WAFɺ͍͙͢ʹPhoenixͱ͍͏ͷ͕ݟ͔ͭͬͨ ͦΕ͕Railsʹ͍ۙͱ͍͏ᷚฉ͖͚ͭͨ
ͬͯΈΑ͏ʂʂʢ҆ʣ
·ͣڥͮ͘Γ ηοτΞοϓʢ1ষʣͬ͘͞ͱࡁΜͩ ࣌࠷৽ͩͬͨPhoenix0.13.0ΛΠϯετʔϧ ࠓ͔Β͡ΊΔΜͩͬͨΒઈରanyenv - erlenv/exenv͕ Φεεϝ http://qiita.com/nownabe/items/ 67a27ddd23652676ffee
ͬͦ͘͞Phoenix.new EctoͷηοτΞοϓ ඪ४ͷσʔλετΞPostgreSQL PostgreSQLૉਓ͗ͯ͢ɺଓ͢Δ·ͰͪΐͬͱϋϚΔ ↑useraddతͳͱ͜Ζ localhost:4000ΛݟͯؾΛߴΊΔ ৽͞ϞνϕʔγϣϯʹͳΔ
֤GemͷସΛ୳͢ Rails Phoenix sqlite3 EctoͰαϙʔτ sass-rails brunch-config.jsͰઃఆ͢ΕOK uglifier brunch-config.jsͰઃఆ͢ΕOK coffee-rails
brunch-config.jsͰઃఆ͢ΕOKͷͣɻެࣜυΩϡϝϯ τʹTypescriptʹ͍ͭͯͷݴٴ͕͋Γ·͢ jquery-rails brunch-config.jsͰઃఆ͢ΕOK turbolinks ͳ͍ʂ jbuilder ViewͰରԠ sdoc ex_doc http://d.hatena.ne.jp/k-1/20130505/p1 rails_12factor ެࣜυΩϡϝϯτʹهࡌ͋Γ http://www.phoenixframework.org/docs/heroku
൪֎ฤɿϥΠϒϥϦ୳͠ͷ༑ http://getawesomeness.com/ ຊʹศར
Scaffoldతͳͭ mix phoenix.gen.html Ͱ࣮ߦͰ͖Δ http://www.phoenixframework.org/docs/mix-tasks ༻ײ΄΅ಉ͡ͱݴͬͯྑ͍ͱࢥ͍·͢ jsonϨεϙϯε༻ͷઐ༻λεΫ phoenix.gen.json ͕ଘࡏ ͢Δͷ͕ಛత
ActiveRecordతͳͭ Ectoͱ͍͏ඪ४ORM(?) PostgreSQL/MySQL/MSSQL/SQLite3͕͑Δ MongoDB͑ΔΑ͏ʹͳΔ༷ associationActiveRecordͱಉ͡ײ֮Ͱ͑Δ model͝ͱ࡞Δ(phoenix.gen.model)ͷɺmigrate୯ମ (ecto.gen.migration) mixλεΫͰ࣮ߦͰ͖Δ ͍͜͠ͱࢼ͍ͯ͠ͳ͍ͷͰɺ༻ײ·ͩอཹ
rails server/rails console RubyͰ͋ΕଈPryؔ࿈ͷGemΛ͋Ε͜ΕಥͬࠐΉ͚Ͳɺiex ૉͰઓ͑Δ iex -S mix phoenix.server ɺrails
server݉rails consoleͰɺ tmuxʹ͍͞͠ ิ͕ຊʹര byebugඪ४ͰೖͬͯΔ(ϒϨΠΫϙΠϯτషΔͷ؆୯ɻ͠ ͔ͯ͠εςοϓ࣮ߦͰ͖ͳ͍ʁ) show-docͰ͖Δ͚Ͳshow-sourceͰ͖ͳ͍ʁʁ
2ষऴྃɺ3ষ ൃੜ
Rails TutorialΛҠ২ͨ͠ͱݴ͕ͬͨɺΞϨӕͩ ࣮͍ͯ͘͠ʹͭΕͯɺ࣮ફʹೖͬͨΒViewपΓͰۤ͠Ή͜ ͱ͕༧Ͱ͖ͯ͠·ͬͨ Slim͕ͳ͍ʂ Turbolinks͕ͳ͍ʂ Cells͕ͳ͍ʂ Kaminari͕ͳ͍ʂ
ͬͱࠜຊతʹ RailsTutorialʹग़ͯ͜ͳ͍͚ͲɺElixir/Phoenixతʹ ॏཁͳ͜ͱ͕͍͔ͭ͘ ฒྻॲཧؔ࿈ Channelؔ࿈ ͜ΕΒͳ͍ͰͲ͏͢Μͷײ
PhoenixRailsͷҠ২(్த)ʹ͗͢ͳ͍ʁ ଟࢦ͍ͯ͠Δͱ͜Ζ͕ͪΐͬͱҧ͏ Channelͷଘࡏ 0.13.1Ҏ߱ɺWebSocketͱ͔PubSubͱ͔ Transport.LongPollͱ͔ɺίϯςϯπੜɾ৴ػೳ͔Β Εͨͱ͜ΖͷڧԽཱ͕ͬͨ͜ͱ͋Γɺ༨ܭͦ͏ײ͡ Δ
Elixirʹ͍ͭͯͷ·ͱΊ - πʔϧฤ iex͕࠷ߴ͗͢Δ REPLͳ͠ͰԿͰ͖ͳ͍ʹͱͬͯࢸߴͷπʔϧ mix૬͍͍͢ ૣͯ͘؆୯ mix.exsͷهड़ཧղ͍͢͠ ຊ֨తʹ͍ग़ͨ͠Βɺzshͷิࣗ࡞ͯ͠ͰͳΜͱ͔͠ ͍ͨ
Elixirʹ͍ͭͯͷ·ͱΊ - ݴޠฤ |> Ϡό͍ RubyͰϝιουνΣΠϯ͕ݏ͍ͩͬͨਓʹΦεεϝ͍ͨ͠ “hoge,fuga,piyo,baz” |> String.split(“,”) ͱ͍͏۩߹ʹɺॲ
ཧͷίϯςΩετ͕pipeͷޙʹ͋Δ(͜ͷྫͩͱString)ͬ ͯɺಡΈͯ͘͢Θ͔Γ͘͢ͳ͍Ͱ͔͢ʁ ฒྻॲཧ͕ຊʹΧδϡΞϧʹͰ͖Δ spawn_linkͱ͔؆୯͗͢ͰΘ͔Γ͗͢͢
Phoenixʹ͍ͭͯͷ·ͱΊ ίϯςϯπΛ৴͢ΔλΠϓͷαʔϏε։ൃ࣌ظঘૣ(͔ʁ) ࠓ·Ͱ͖ͬͯͨViewपΓͷศརͳಓ۩͕͑ͳ͍ͷ͕ਏ͍ ཧը໘ͱ͔ಛʹɺखؒΛ͔͚ͣʹαΫαΫը໘࡞ͬͨΓ͍ͨ͠ͷͰɺγϣʔτΧοτͷ උେࣄ͔ͳʔ RestfulͳAPI։ൃʁ ػೳతͳෆɺී௨ʹ͍ͬͯΔͰಛʹײ͡ͳ͍ ڧ͍ͯݴ͑KVSΛEcto͔Β͍͍ͨέʔε࣮֬ʹ͋ΔΑͳ͊ɾɾͱ͍͏ͱ͜Ζ Scala/Akkaൺֱͩͱ࣮ߦҰาৡΔ͚Ͳɺ࣮͕͘͠ͳͯ͘Ϗϧυ͕ૣ͍ Railsൺֱͩͱಉ࣌ଓ࣮ߦʹ༏Ґੑ͕͋Δ
্هཧ༝ʹΑΓɺདྷΔ͖Http2࣌ͷόοΫΤϯυͱͯ͠ຊʹͪΐ͏Ͳ͍͍ؾ͕͢Δ
Ε͍͚ͯͳ͍Ϣχοτςετ - extest ී௨ʹී௨ͷςετεΠʔτ͚ͩͲɺasyncઃఆ͕σϑΥ ϧτͰೖͬͯΔ RailsͰ͋Ε͜Εۤ࿑ͯ͠ฒྻςετͷΈΛߟ͑ͨΓ ͯͨ͠ͷͰɺΧδϡΞϧʹͰ͖͗ͯ͢ٽ͚Δ ͨͩɺ࣌ʑFactoryGirlFakerTimecopͳͲ͕࿀͘͠ͳ Δ͔͠Εͳ͍ ࣗಈ࣮ߦGuardͷ··Ͱ͍͍͔ͳʔ
ऴΘΓʹ Elixir/PhoenixɺϓϩμΫτͷೖ։࢝͠·ͨ͠ʂʂ ͦͷ͏ͪৄͤ͘͠Δ͔ɾɾ ͋ͱ͜ͷϓϩδΣΫτԠԉͯ͠·͢ https://github.com/awetzel/neovim-elixir neovimElixirઐ༻ͷIDEʹͳΔ͔ʂʁ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠