Share
Embed
Road to white mages
Tama Ruby会議01
白魔術士への道
2019.7.6
https://tama-rb.github.io/tamarubykaigi01/
Kuniaki IGARASHI
July 06, 2019
Transcript
71 slides
-
നຐज़ࢣͷಓ Road to white mages Tama Rubyձٞ01 20197݄6 ޒेཛྷ໌ /
igaiga twitter: @igaiga555 -
ࣗݾհ • ϑϦʔϥϯεRails/RubyΤϯδχΞ • ஶॻ • Rubyೖ • RailsͷڭՊॻ •
RubyͱRailsͷֶशΨΠυ -
ࠓճͷํ • ґཔʮجௐߨԋͰ͕͢ςΫ͍Ͱ͓ئ͍͠·͢ʯ • ຊձٞͷςʔϚʮʯ • ڵຯ͋Δ͜ͱΛௐͯൃද͍ͨ͠ͱࢥͬͨ • ࢲ3ϲ݄લʹΒͳ͔ͬͨ͜ͱ͔Γ͠·͢ •
RubyೖͳͲஶॻͷ͋·Γ͠·ͤΜ • ସΘΓʹॻ੶Ͱઆ໌ͨ͠༰ʹ ϚʔΫ͚·ͨ͠ -
લஔ͖ • ʮޙੈͷྺ࢙Ոʯͱʮ࠷લઢͷ༐ऀʯͷޠΔҧ͏ • Rubyೖʮޙੈͷྺ࢙Ոʯ • ಓ͕ఆ·Γɺܦ࿏Λ৽ͨʹઃܭͯ͠આ໌ • ࠓͷʮ࠷લઢͷ༐ऀʯ •
Ͳͷಓ͕ྑ͍͔Λࡧ͢Δ • ௐํΜͩλΠϛϯά͓͑͠·͢ -
ຐज़ͱԿ͔ʁ matz ʮຐज़ʹ2छྨ͋Δɻྑ͍͜ͱΛ͢Δനຐज़ͱɺݏͳ͜ͱΛ͢Δࠇຐज़ͩɻʯ ࡢࠓͷRubyքͰͷຐज़ͷఆٛ ʮʢҰݟແཧͳʣΓ͍ͨ͜ͱΛɺखஈΛΘ࣮ͣݱ͢Δ͜ͱʯ ※ࢲͷҙݟͰ͢ • ॻ੶ʮϝλϓϩάϥϛϯάRubyʯ • ຐज़ͱ
• ϝλϓϩάϥϛϯάͷٕ๏ • ϝλϓϩάϥϛϯάͱ • ίʔυΛهड़͢ΔίʔυΛهड़͢Δ͜ͱ • ݴޠཁૉΛ࣮ߦ࣌ʹૢ࡞͢ΔίʔυΛهड़͢Δ͜ͱ -
ͳͥTracePoint Λ͏ͱ͋Ϳͳ͍ͷ͔ʁ ॳา͔Βઆ໌͞ΕΔػձ͋·Γͳ͍ ͳͥRubyKaigi LTͰʮTracePoint Bomb!ʯͱ͍ ͏λΠτϧ͕ग़͚ͨͩͰΈΜͳരস͢Δͷ͔ ࠇຐज़ڧྗ͕ͩҙਤ͠ͳ͍ಈ࡞Ҿ͖ى͜͢Մೳੑ͕͋Δ • TracePointϩʔΧϧมΛ্ॻ͖Ͱ͖Δ
• ͜ͷ্ॻ͖Λ͠ΕΔϧʔτ͕9ϲ݄ޙ໌ • ఆ͠ͳ͍͍ൣғͰϩʔΧϧม্͕ॻ͖ • ͦͷόά͕ൃݟ͞Εͨͱ͖ͷք۾ͷ༷ࢠ https://speakerdeck.com/koic/the-tracepoint-bumb -
Ғେͳࠇຐज़ࢣ͕Ғେͳཧ༝ Ғେͳཧ༝ؒΛकΔຐ๏͑Δ͔Β ࠇຐज़࣌ͱͯ͠ڧେ͗͢ΔྗΛ੍ޚͰ͖ͳ͘ͳΔ ख़࿅ͷࠇຐज़ࢣͨͪຐज़Λ੍ޚ͢Δྗʹ͚͍ͯΔ ࠇຐज़దʹ͔ͭΘͳ͚ΕͳΒͳ͍ ੍࣮ޚ͢Δํ͕͍͜͠ͱଟ͍ ͔͠͠ڧେͳྗັྗతͰ͋Δ †Rubyࠇຐज़ܦయ† https://speakerdeck.com/joker1007/rubyhei-mo-shu-jing-dian ࠇຐज़ʹ͓͍ͯकΔ͖ϧʔϧ
• ΈࠐΈΫϥεΛյ͞ͳ͍ • ελοΫΛ͑ΔΑ͏ʹ͢Δ • ύϑΥʔϚϯεΛҙࣝ͢Δ • TracePointͷར༻໌ࣔతʹ -
σόοΨͷ͍ํ ϓϩάϥϜΛ࣮ߦ్தͰҰ࣌ఀࢭͯ͠ϓϩάϥϜΛ࣮ߦ͢Δ • binding.irb Rubyೖ P.62 • pry gem Rubyೖ
P.241 • binding.pry • step ࣮ߦ pry-byebug gem • ιʔεදࣔ pry-doc gem • pry on • $ prying=true rspec spec/a_spec.rb • pry off • $ rspec spec/a_spec.rb ifͰON/OFF͢Δͱָ ڥมͰON/OFF͢Δͱָ -
͋ͳͨ୭Ͱ͔͢ʁ ΦϒδΣΫτΛΔ • class ϝιου Rubyೖ P.178 • ΦϒδΣΫτͷΫϥεΛΔ •
object_id ϝιου Rubyೖ P.128, 269 • ΦϒδΣΫτͷࣝผ൪߸ΛΔ Integer Float String Hash 2 1.2 "abc" {coffee: 300, caffe_latte: 400} -
ͲΜͳΦϒδΣΫτ͕͋Γ·͔͢ʁ ΦϒδΣΫτքΛѻ͏ObjectSpace • ObjectSpace • ΦϒδΣΫτքΛѻ͏ΈࠐΈϥΠϒϥϦͷϞδϡʔϧ • ObjectSpace.each_object(klass) • Ҿʹࢦఆͨ͠ΫϥεͷΠϯελϯεΦϒδΣΫτΛಘΔ
• ΫϥεҰཡΛऔಘ: ObjectSpace.each_object(Class) • ObjectSpace.count_objects • ΦϒδΣΫτΛछྨ͝ͱʹΧϯτ -
ͲΜͳϝιου͕͑·͔͢ʁ ݺͼग़ͤΔϝιουΛΔ • methods ϝιου Rubyೖ P.189 • ΦϒδΣΫτ͕ݺͼग़ͤΔϝιουΛΔ •Array.methods
• ΫϥεϝιουΛௐΔ •[].methods • ΠϯελϯεϝιουΛௐΔ -
͋ͳͨͲ͔͜Βདྷ·͔ͨ͠ʁ ιʔείʔυฤ • Object#method, Module#instance_method • MethodΦϒδΣΫτऔಘ • MethodΦϒδΣΫτͰ͑Δϝιου •
source_location: ఆٛ͞Ε͍ͯΔϑΝΠϧ • owner: ఆٛ͞Ε͍ͯΔΫϥε • parameters: Ҿใ method(:pp).source_location #=> ["/Users/igaiga/.rbenv/versions/2.6.2/lib/ruby/2.6.0/pp.rb", 582] method(:pp).owner #=> Kernel require "time" Time.instance_method(:httpdate).source_location #=> ["/Users/igaiga/.rbenv/versions/2.6.2/lib/ruby/2.6.0/time.rb", 691] Time.instance_method(:succ).source_location #=> nil # RubyͰॻ͔Ε͍ͯͳ͍ωΠςΟϒͳϝιουnil -
͋ͳͨͲ͔͜Βདྷ·͔ͨ͠ʁ gemฤ • gemιʔείʔυ͕ஔ͍ͯ͋Δॴ • gem which • bundle show
• bundle open • ࢦఆ͞ΕͨΤσΟλͰ։͘ • ڥม EDITOR or BUNDLER_EDITOR Ͱࢦఆ -
͋ͳͨͲ͔͜Βདྷ·͔ͨ͠ʁ ݺͼग़͠ݩฤ • Kernel#caller • ϝιουݺͼग़͠ཤྺΛදࣔ • Kernel#caller_locations • callerͷ݁ՌΛ
Thread::Backtrace::LocationͰऔಘ • Exception#backtrace • ͦͷException͕raise͞Εͨͱ͖ͷϝιουݺͼग़͠ཤྺΛදࣔ -
ΦϒδΣΫτΛมߋ͢Δ ͍͍ͩͨͷ͜ͱͰ͖Δ • instance_variables Rubyೖ P.198 • ΠϯελϯεมҰཡΛऔಘ • instance_variable_get,
instance_variable_set • ΠϯελϯεมΛऔಘɺվ͟Μ • instance_eval, class_eval • ͦͷΦϒδΣΫτʹͳΓ͖࣮ͬͯߦ͢Δ • ΠϯελϯεมΛ͍͡Δͱ͖ʹศར • privateϝιουΛݺͼग़͢ͱ͖ʹศར • sendϝιουΛ͏ख͋Δ • bindingΛ͏ͱϩʔΧϧมΛมߋͰ͖Δ • લड़ͷ joker&moris ߨԋࢀর -
ιʔείʔυͷੈքɺΦϒδΣΫτͷੈք σόοά͕͍͠ͷ2ͭͷੈքʹִͨΓ͕͋Δ͔Β • ԋܶͰྫ͑Δͱ • ιʔείʔυຊ • ࢲ͕ͨͪॻ͚Δͷຊ • ΦϒδΣΫτͷੈք
• ࣮ࡍʹϓϩάϥϜ͕ಈ͍͍ͯΔͷ͜͜ • ࢲͨͪ͜͜Ͱ͕ࣗԋ͡Δ͜ͱɺ؍Δ͜ͱͰ͖ͳ͍ ΦϒδΣΫτͷੈք ➡ ιʔείʔυͷੈք ➡ p 1+2 1 + 2 -
ιʔείʔυͷੈքɺΦϒδΣΫτͷੈք มΦϒδΣΫτͷ໊ࡳɺ໊લॏཁ Rubyೖ P.53 มorderʹ "ΧϑΣϥς" ΦϒδΣΫτΛೖ ʹ "ΧϑΣϥς" ΦϒδΣΫτʹ
มorderͱ͍͏໊લΛ͚Δ "ΧϑΣϥς" PSEFS ʮ໊લʯιʔείʔυͷੈք͔ΒΦϒδΣΫτͷੈքʹ͍ ΔʮͦͷΦϒδΣΫτʯΛݺͿʢ΄΅ʣ།ҰͷΈ ΦϒδΣΫτͷੈք ➡ ιʔείʔυͷੈք ➡ ༷ʑͳखஈͰΦϒδΣΫτͷੈքʢʣͷ༷ࢠΛ Δํ๏Λ͜ͷ͋ͱઆ໌͍͖ͯ͠·͢ɻ -
ʮͭେมͳͷΛ౪ΜͰ͍͖·ͨ͠ɻ ͋ͳͨͷΠϯελϯεมͰ͢ɻʯ • ͪͳΈʹάϩʔόϧม Kernel#trace_var ͕͋Δ • ΠϯελϯεมΦϒδΣΫτͰͳ͍ • ίʔυ:
https://github.com/igaiga/tmrk01/ ࡐɿʮRailsͷCRUD indexΞΫγϣϯͰɺ@books Πϯε λϯεม͕ [] ʹͳ͍ͬͯͯදࣔ༰͕ҙਤ௨ΓͰͳ͍ʯ ਖ਼͍͠ಈ࡞ ʮΠϯελϯεมͷೖΛݕ͢Δʯํ๏Λߟ͑Δ ݱঢ়ͷಈ࡞ -
TracePoint Կ͔Λ͖͔͚ͬʹॲཧΛڬΉ ࣮ߦ͢ΔϒϩοΫΛొ ͓ͯ͘͠ͱಛఆτϦΨʔͰ ϒϩοΫΛ࣮ߦͯ͘͠ΕΔ https://docs.ruby-lang.org/ja/latest/class/TracePoint.html ओͳτϦΨʔ • :line ࣜͷධՁ
• :call Rubyϝιουͷ࣮ߦ • :c_call Cϝιουͷ࣮ߦ • :b_call ϒϩοΫ࣮ߦ • :raise ྫ֎ൃੜ ⬆ p tpͷ݁Ռ -
TracePoint TracePointΛ͔͚ͯ͠શͯͷࣜධՁʹॲཧΛڬΉ TracePoint.trace ʹ :line Λ͢ͱɺࣜධՁ࣌ʹϒϩοΫ࣮ߦ ϒϩοΫͷมtpͰड͚औΔTracePointΦϒδΣΫτ͔Βใऔಘ tp.methods ΔΓ·Ͱ͍࣋ͬͯΔϝιουΛௐΔ P.123
• event • τϦΨʔ • path • ιʔεύε • lineno • ߦ൪߸ • method_id • ϝιου • defined_class • Ϋϥε ↙ [TP:line] test.rb:3 hi User ⬆ TracePointΦϒδΣΫτͷใදࣔ ⬅ @hi ೖ 3ߦ User#hi ⬇ |tp| TracePointΦϒδΣΫτ -
TracePoint ࣜͷݩʹͳͬͨιʔείʔυΛಘΔ TracePointΦϒδΣΫτʹιʔείʔυใ͕ͳ͍ ධՁ͞Εͨࣜͷ path, lineno ͔Δ ➡ path, lineno
͔ΒιʔείʔυΛऔΕͦ͏ " @hi = \"hi(ŇŋωŋŇ)ϊ\"\n" ιʔείʔυτϨλ ⬆ ιʔεϑΝΠϧ͔Βιʔείʔυऔಘ -
RubyVM::AbstractSyntaxTree ίʔυ͔ΒASTΛಘΔ RubyVM::AbstractSyntaxTree.parseΛ͏ͱίʔυ͕ԿΛ ͢Δͷͳͷ͔ͷใΛಘΒΕΔ ↖ RubyVM::AbstractSyntaxTree.parse(" @hi = \"hi(ŇŋωŋŇ)ϊ\"\n") ↙
#<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:33> -
RubyVM::AbstractSyntaxTree AbstractSyntaxTree(AST)ͬͯԿʁ Rubyͷίʔυ͕࣮ߦ͞ΕΔ·ͰͷྲྀΕ Rubyͷίʔυղੳͷʮ੩ʯͱʮಈʯ ۄد मҰ https://speakerdeck.com/siman/railsdm2019?slide=6 AST RubyVM::AbstractSyntaxTree.parse ΦϒδΣΫτͷੈք
ίʔυͷੈք Rubyͷ͘͠Έ https://tatsu-zine.com/books/ruby-under-a-microscope-ja iSeq୳๚ https://booth.pm/ja/items/834594 -
node.methodsͰ࣋ͬͯΔϝιουΛ୳ͯ͠ௐΔ P.189 node #=> (SCOPE@1:0-1:33 tbl: [] args: nil body:
(IASGN@1:4-1:33 :@hi (STR@1:10-1:33 "hi(ŇŋωŋŇ)ϊ"))) node.class #=> RubyVM::AbstractSyntaxTree::Node node.type #=> :SCOPE node.children #=> [[], nil, (IASGN@1:4-1:33 :@hi (STR@1:10-1:33 "hi(ŇŋωŋŇ)ϊ"))] node.children.last.class #=> RubyVM::AbstractSyntaxTree::Node node.children.last.type #=> :IASGN RubyVM::AbstractSyntaxTree.parse(" @hi = \"hi(ŇŋωŋŇ)ϊ\"\n") RubyVM::AbstractSyntaxTree AST::NodeΦϒδΣΫτͷߏ RubyVM::AbstractSyntaxTree::NodeΦϒδΣΫτ͕ੵ -
node.children.last #=> (IASGN@1:4-1:33 :@hi (STR@1:10-1:33 "hi(ŇŋωŋŇ)ϊ")) node.children.last.type #=> :IASGN RubyVM::AbstractSyntaxTree.parse("
@hi = \"hi(ŇŋωŋŇ)ϊ\"\n") RubyVM::AbstractSyntaxTree AST::NodeΦϒδΣΫτͷߏ IASGNΛRubyͷιʔείʔυͳͲͰௐͯΈΔ IASGN #=> Πϯελϯεมͷೖ RubyVM::AbstractSyntaxTree::Node ৄࡉ - siman https://qiita.com/siman/items/3017ed399ded43229189 -
TracePoint ࢦఆΫϥεͷΠϯελϯεมೖΛݕ tp.self : ΠϕϯτΛൃੜͤͨ͞ΦϒδΣΫτ tp.self.is_a?(Ϋϥε) ͰࢦఆΫϥε͔Ͳ͏͔νΣοΫ ↙ Kernel.const_get(target_class_name) "User"
Λ UserΫϥε ※tp.selfʮͲͷΫϥεͰ࣮ߦ͞Ε͍ͯΔॲཧ͔ʯͳͷͰɺincludeͨ͠ModuleͰೖͯ͠ ͍Δέʔεͳ͘ಈ͘ɻΫϥε֎ͰΠϯελϯεมೖʢՄೳʁʣ͢Δͱμϝ͔ɻ ⬅ is_a? ϝιουͰͦͷΫϥε͔ఆ -
RailsΞϓϦͷ४උ • ࡐ: ʮRailsͷڭՊॻʯͰ࡞͍ͬͯΔΞϓϦ • https://tatsu-zine.com/books/rails-textbook • ॻ੶ཧΞϓϦ • BookϞσϧ(title,
memo)ͷCRUD • rails g scaffold book title:string memo:text • https://github.com/igaiga/tmrk01/missing_instance_variables_sample_rails_app • config/initializers ҎԼʹݕίʔυஔʢ࣍ϖʔδઆ໌) • /books ΞΫηε(indexΞΫγϣϯ) • app/views/books/index.html.erb • <% @books.each do |book| %> ⬅ ೖݕର @books • app/controllers/books_controller.rb:7 Ͱೖ͞Ε͍ͯΔ • @books = Book.all ⬅ @books ೖίʔυ -
Πϯελϯεมೖݕ config/initializers ݕίʔυஔ ίϯτϩʔϥͰೖ͞ΕͯΔ͍Δ߹ શͯͷΫϥεͰͷ࣮ߦΛௐΔͨΊ Ϋϥε໊ࢦఆͤͣʹ Πϯελϯεม໊͚ͩࢦఆ Started GET "/books"
for ::1 at 2019-06-08 12:34:50 +0900 Processing by BooksController#index as HTML @books is assigned in /path_to_app/app/controllers/books_controller.rb:7 index BooksController Rendering books/index.html.erb within layouts/application Book Load (6.8ms) SELECT "books".* FROM "books" ↳ app/views/books/index.html.erb:15 Rendered books/index.html.erb within layouts/application (249.2ms) Completed 200 OK in 2933ms (Views: 2800.7ms | ActiveRecord: 6.8ms) /books ΞΫηεͨ͠ϩά ൜ਓ͕͍ͳ͍ૉͷίʔυͰςετ ⬇ίϯτϩʔϥͰͷਖ਼ৗೖݕޭ @books ೖݕίʔυ -
Πϯελϯεมೖݕ ίϯτϩʔϥʹ൜ਓ͕͍ͨέʔε Started GET "/books" for ::1 at 2019-06-08 13:02:25
+0900 Processing by BooksController#index as HTML @books is assigned in /path_to_app/app/controllers/books_controller.rb:7 index BooksController @books is assigned in /path_to_appapp/controllers/books_controller.rb:8 index BooksController Rendering books/index.html.erb within layouts/application Rendered books/index.html.erb within layouts/application (50.2ms) Completed 200 OK in 3146ms (Views: 2867.5ms | ActiveRecord: 0.0ms) /books ΞΫηεͨ͠ϩά ⬆ ݕ!! ⬅ books_controller.rb:8 books_controller.rb:7,8 Ͱͷೖݕ͕Ͱ͖ͨ ൜ਓ֬อ!! ⬅ books_controller.rb:7 -
Πϯελϯεมೖݕ ݕͰ͖ͳ͍έʔε͕͋Δ Started GET "/books" for ::1 at 2019-06-08 12:55:09
+0900 Processing by BooksController#index as HTML @books is assigned in /path_to_app/app/controllers/books_controller.rb:7 index BooksController Rendering books/index.html.erb within layouts/application Rendered books/index.html.erb within layouts/application (83.2ms) Completed 200 OK in 2881ms (Views: 2742.1ms | ActiveRecord: 0.0ms) /books ΞΫηεͨ͠ϩά ⬇ίϯτϩʔϥͰͷೖݕ ⬅ books_controller.rb:7 books_controller.rb:7 Ͱʢਖ਼ৗͳʣೖݕͰ͖͍ͯΔ ൜ਓͷݕ Ͱ͖͍ͯͳ͍ -
Πϯελϯεมೖݕ ͜ͷํ๏ͰViewͰͷೖΛݕͰ͖ͳ͔ͬͨ app/view/books/index.html.erb <% @books = [] %> ... <%
@books.each do |book| %> ⬅ ൜ਓ͕Viewʹ͍Δͱ͖ɺ͜ͷೖΛݕͰ͖ͳ͍ line #=> "<% @books= [] %>\n" erbͳͷͰલޙʹ <% %> ͕͍͍ͯΔ ※ݟҧ͍ͯͯ͠ղܾʹ1ϲ݄͔͔ͬͨ ݪҼ RubyVM::AbstractSyntaxTree.parse(line).children.last #=> SyntaxError -
Πϯελϯεมೖݕ erbରԠ લޙʹ <% %> ͕͍͍ͯͨΒ֎͢ ↖ line = match_data.captures.first
↙ line.match(/\A\s*<%=*(.*)%>\s*\z/) Rubyೖ P. 271 ਖ਼نදݱ ASTऔಘΑΓޙΖಉ͡ ਖ਼نදݱதͷ(.*)෦औಘ https://docs.ruby-lang.org/ja/latest/class/MatchData.html -
Πϯελϯεมೖݕ erbରԠ Started GET "/books" for ::1 at 2019-06-09 09:55:08
+0900 (12.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC ↳ /Users/igaiga/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/ log_subscriber.rb:98 Processing by BooksController#index as HTML @books is assigned in /path_to_app/app/controllers/books_controller.rb:7 index BooksController Rendering books/index.html.erb within layouts/application @books is assigned in /path_to_app/app/views/books/index.html.erb:1 _app_views_books_index_html_erb__4042701126060758541_70158372829520 ActionView::CompiledTemplates Rendered books/index.html.erb within layouts/application (76.8ms) Completed 200 OK in 13765ms (Views: 13457.4ms | ActiveRecord: 0.0ms) ൜ਓ֬อ!! ↖index.html.erb:1 <% @books = [] %> -
നຐज़ೖ ʮ౪·ΕͨΠϯελϯεมʯ·ͱΊ • ΠϯελϯεมೖݕखॱͷҰྫ • TracePoint :line ͰϑοΫ • TracePointͷใ͔ΒιʔεϑΝΠϧऔಘ
• RubyVM::AbstractSyntaxTree.parseͰղੳ • ΠϯελϯεมೖIASGN • ͜͜Ͱग़͖ͯͨιʔείʔυ • https://github.com/igaiga/tmrk01 • instance_variable_tracer gem ͱͯ͠ެ։ • https://github.com/igaiga/instance_variable_tracer -
Tracerඪ४ఴϥΠϒϥϦ ϩάग़ྗ https://docs.ruby-lang.org/ja/latest/class/Tracer.html தͰ Kernel.#set_trace_func Λར༻ શ࣮ߦߦϩά(ιʔείʔυೖΓ)ΛϑΝΠϧग़ྗͯ͠grepͰௐΔ log.txt ... #1:/path_to_app/app/views/books/index.html.erb:1:ActionView::CompiledTemplates:-:
<%= @books = [] %> ... Tracer.add_filter do |event, file, line, id, binding, klass| file == "/path_to_app/app/views/books/index.html.erb" end Tracer.on ϑΟϧλʔ͢Δ͜ͱՄೳ ϑΟϧλʔதͰιʔείʔυΛऔΕͳ͍ʢͣʣ = TracePointͱಉ͘͡ඞཁͳΒιʔεϑΝΠϧ͔Βऔಘ -
ObjectSpace.allocation_sourcefile ΦϒδΣΫτͷੜ࢈ΛΔ ͜͜·Ͱઆ໌͖ͯͨ͠࡞ઓ: Ͳ͜ͰΠϯελϯεมೖ͞Ε͔ͨΛΔ ৽࡞ઓ: Ͳ͜ͰΦϒδΣΫτ͕࡞ΒΕ͔ͨΛΔ ObjectSpaceͱobjspaceϥΠϒϥϦ ObjectSpaceΈࠐΈϥΠϒϥϦ objspaceObjectSpaceʹՃͰϝιουΛੜ͢ඪ४ఴϥΠϒϥϦ ObjectSpace.allocation_sourcefile
ΦϒδΣΫτͷੜݩϑΝΠϧ ObjectSpace.allocation_sourceline ΦϒδΣΫτͷੜݩϑΝΠϧߦ൪߸ #=> {"path_to_app/app/views/books/index.html.erb"=>1} -
station_signage gem with g https://github.com/igaiga/station_signage application_controller.rb before_action { g "#{self.class.name}##{action_name}"
} gem "g" gem "terminal-notifier" ⬆g gem͕෦Ͱར༻͢Δgem ͬͯΔ͜ͱ ϦΫΤετͨ͠ϖʔδͷίϯτϩʔϥ໊ɺΞΫγϣϯ໊Λදࣔ -
signal & trap ࣌ؒ࣠Ͱσόοά ⬅ infoγάφϧΛड͚औΔͱಈ͘ macͰ ctrl-T Ͱ infoγάφϧΛൃੜ
·ͨ $ kill -s info [pid] http://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html -
ࢀߟࢿྉ • Hijacking Ruby Syntax in Ruby • https://www.youtube.com/watch?v=04HGQEw3A6Y •
RubyVM::AbstractSyntaxTree::Node ৄࡉ • https://qiita.com/siman/items/3017ed399ded43229189 • I am a puts debugger • http://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html • Ruby Debugging Magic Cheat Sheet • https://www.schneems.com/2016/01/25/ruby-debugging-magic-cheat-sheet.html • rubyͰ͍͍͔Μ͡ʹDI͢Δhabuͷհ • https://qiita.com/hanachin_/items/8aa4bd82258bb19b7f91 • †Rubyࠇຐज़ܦయ† • https://speakerdeck.com/joker1007/rubyhei-mo-shu-jing-dian • Railsdm Podcast unasuke.fm #5 Ruby Tendency • https://soundcloud.com/railsdm -
ँࣙ (ܟশུ) Ғେͳࠇຐज़ࢣͷΈͳ͞Μ joker, moris, koic, hanachin, siman, alitaso ૬ஊʹͬͯͩͬͨ͘͞Έͳ͞Μ
ko1, mame, _tad_ ωλΛఏڙͯ͘͠ΕͨΈͳ͞Μ aaron, jugyo RubyೖνʔϜͷΈͳ͞Μ machu, beco ࢲ͕RubyΛ࢝ΊΔ͖͔͚ͬʹͳͬͨtDiary։ൃνʔϜͷΈͳ͞Μ tdtds, hsbt, machu ࠓͷ४උΛͯ͘͠ΕͨελοϑͷΈͳ͞Μ -
Ռ • bugs.ruby-lang ىථ "Tracing instance variable assignment" • https://bugs.ruby-lang.org/issues/15854
• instance_variable_tracer gem ࡞ • https://github.com/igaiga/station_signage • station_signage gem ࡞ • https://github.com/igaiga/station_signage • RubyConf CFP ࠾ • Rubyͷࣝ -
ޒेཛྷ໌/igaiga ࣗݾհ ৽͍͠ࣄืू͍ͯ͠·ͤΜ͕ɺࡳଋͷ͝༻ҙ͕͋Δํ͓͔͚͍ͩ͘͞ ϑϦʔϥϯεRails/RubyΤϯδχΞ औҾઌ: NaCl͞Μ, ϐΫγϒ͞Μ, OSCR͞Μ, IDCϑϩϯςΟΞ͞Μ, Classi͞Μ,
αΠόʔηΩϡϦςΟΫϥυ͞Μ, GMOϖύϘ͞Μ ஶॻ: ʮθϩ͔ΒΘ͔ΔRubyೖʯʮRailsͷڭՊॻʯ ʮRubyͱRailsͷֶशΨΠυʯ https://twitter.com/igaiga555