Slide 1

Slide 1 text

࣮ྫͰݟΔ ίʔυϦʔσΟϯάͷεεϝ 2020.1.9. Omotesando.rb #54 @makicamel

Slide 2

Slide 2 text

•@makicamel / ઒ݪສق • •Ruby/Railsྺ3೥͘Β͍ •Ruby ͱϏʔϧɹɹͱ͓ञ͕޷͖ ࣗݾ঺հ ࠷ۙ೤͍τϐοΫ͸ ݕࡧͰ͢

Slide 3

Slide 3 text

ಥવͰ͕͢ ໰୊Ͱ͢

Slide 4

Slide 4 text

ݕࡧΤϯδϯ͸ͳͥݟ͚ͭΔͷ͔஌͓͖͍ͬͯͨ΢Σϒ৘ใݕࡧͷجૅ஌ࣝc৿େೋ࿠
 IUUQTXXXBNB[PODPKQݕࡧΤϯδϯ͸ͳͥݟ͚ͭΔͷ͔EQ ⇀ᄝaൗࢸᇏƎƒ≌∓ದ¸ƑದůᇾƶƊŧƮƋ࿽ ƲƯƉŧơżb
 ൗࢸᇏƑżƜƉƑದůҕࡆźƉ℧Ƅ㋆ŰŻƦƶŴƶ ն߶ƵżƮƋŰaޅ߭℧ƉƓ∱℧ƊŰƮƊźƪũ ŮĤ "߭
 # ߭
 $ ߭ ˞೥݄ݱࡏ͸໿ԯਓ

Slide 5

Slide 5 text

ݕࡧΤϯδϯ͸ͳͥݟ͚ͭΔͷ͔஌͓͖͍ͬͯͨ΢Σϒ৘ใݕࡧͷجૅ஌ࣝc৿େೋ࿠
 IUUQTXXXBNB[PODPKQݕࡧΤϯδϯ͸ͳͥݟ͚ͭΔͷ͔EQ ⇀ᄝaൗࢸᇏƎƒ≌∓ದ¸ƑದůᇾƶƊŧƮƋ࿽ ƲƯƉŧơżb
 ൗࢸᇏƑżƜƉƑದůҕࡆźƉ℧Ƅ㋆ŰŻƦƶŴƶ ն߶ƵżƮƋŰaޅ߭℧ƉƓ∱℧ƊŰƮƊźƪũ ŮĤ "߭
 # ߭
 $ ߭ ˞೥݄ݱࡏ͸໿ԯਓ ਖ਼ղ

Slide 6

Slide 6 text

͔֬ΊͯΈ͍ͨ ɹ233 > 69ԯ͍ͬͯ͢͝ʂ(਺ֶͰ͖ͳ͍ਓ)

Slide 7

Slide 7 text

͔֬ΊͯΈ͍ͨ ɹaⁿ ͬͯ͜Μͳײ͡ʁ
 ɹ(a΋n΋0Ҏ্ͷ੔਺ͱ͢Δ) def power(a, n) result = 1 n.times { |i| result *= a } result end power(2, 33) # => 8589934592

Slide 8

Slide 8 text

͔֬ΊͯΈ͍ͨ ɹRuby͞Μͷ͜ͱ͔ͩΒɺaⁿ͋ΔΜͰ͠ΐ͏ʁ

Slide 9

Slide 9 text

͋ͬͨ *OUFHFSΫϥεc3VCZϦϑΝϨϯεϚχϡΞϧ
 IUUQTEPDTSVCZMBOHPSHKBDMBTT*OUFHFSIUNM

Slide 10

Slide 10 text

͋ͬͨ 2 ** 0 # => 1 2 ** 33 # => 8589934592

Slide 11

Slide 11 text

ͲΜͳ࣮૷ʁ static VALUE int_pow(long x, unsigned long y) { // ... y &= ~1; do { while (y % 2 == 0) { if (!FIT_SQRT_LONG(x)) { VALUE v; bignum: v = rb_big_pow(rb_int2big(x), LONG2NUM(y)); if (RB_FLOAT_TYPE_P(v)) /* infinity due to overflow */ return v; if (z != 1) v = rb_big_mul(rb_int2big(neg ? -z : z), v); return v; } x = x * x; y >>= 1; } { if (MUL_OVERFLOW_FIXNUM_P(x, z)) { goto bignum; } z = x * z; } } while (--y); if (neg) z = -z; return LONG2NUM(z); } Կ΋Θ͔Βͳ͍ OVNFSJDDSVCZSVCZc(JU)VC
 IUUQTHJUIVCDPNSVCZSVCZCMPCEBCDFFGCBBGDOVNFSJDD

Slide 12

Slide 12 text

rubinius / rubinius •rubyͰ࣮૷͞Εͨruby SVCJOJVTSVCJOJVTc(JU)VC
 IUUQTHJUIVCDPNSVCJOJVTSVCJOJVT

Slide 13

Slide 13 text

ͲΜͳ࣮૷ʁ DPNQMFYSCSVCJOJVTSVCJOJVTc(JU)VC
 IUUQTHJUIVCDPNSVCJOJVTSVCJOJVTCMPCFCEDBCCGEBBCBGFE DPSFDPNQMFYSC def ** (other) # ... if other.kind_of?(Complex) # ... elsif other.kind_of?(Integer) if other > 0 x = self z = x n = other - 1 while n != 0 while (div, mod = n.divmod(2) mod == 0) x = Complex(x.real*x.real - x.imag*x.imag, 2*x.real*x.imag) n = div end z *= x n -= 1 end z else # ... end elsif Complex.generic?(other) # ... end end ͳΜͱ͔ಡΊͦ͏

Slide 14

Slide 14 text

def ** (other) if !other.kind_of?(Float) && other == 0 return Complex(1) end if other.kind_of?(Complex) # ... elsif other.kind_of?(Integer) if other > 0 x = self z = x n = other - 1 while n != 0 while (div, mod = n.divmod(2) mod == 0) x = Complex(x.real*x.real - x.imag*x.imag, 2*x.real*x.imag) n = div end z *= x n -= 1 end z else # ... end elsif Complex.generic?(other) # ... end end other͕0ͷ࣌1Λฦ͢ ࠓճ͸ॲཧͷྲྀΕΛ
 ஌Γ͍͚ͨͩͳͷͰলུ (self΋other΋ਖ਼ͷ੔਺ͷ૝ఆ)

Slide 15

Slide 15 text

def ** (other) if !other.kind_of?(Float) && other == 0 return Complex(1) end if other.kind_of?(Complex) # ... elsif other.kind_of?(Integer) if other > 0 x = self z = x n = other - 1 while n != 0 while (div, mod = n.divmod(2) mod == 0) x = Complex(x.real*x.real - x.imag*x.imag, 2*x.real*x.imag) n = div end z *= x n -= 1 end z else # ... end elsif Complex.generic?(other) # ... end end ࠓճ͸ॲཧͷྲྀΕΛ
 ஌Γ͍͚ͨͩͳͷͰলུ (਺ֶͰ͖ͳ͍ਓ)

Slide 16

Slide 16 text

def power(a, other) x = a z = x n = other - 1 while n != 0 while (div, mod = n.divmod(2); mod == 0) x = x * x n = div end z *= x n -= 1 end z end ͘͢͝ಡΊͦ͏ʂ ɹɹɹ Կ΋Θ͔Βͳ͍ ؆ུԽ͢Δͱ ࣮ߦ͠΍͍͢Α͏ʹselfΛaʹ͢Δ

Slide 17

Slide 17 text

def power(a, other) x = a z = x n = other - 1 while n != 0 p " n: #{n}" while (div, mod = n.divmod(2); mod == 0) p x = x * x p n = div end z *= x p " z: #{z}" n -= 1 end z end ࢦ਺͕2ͷഒ਺ͷؒ ৽͍͠ࢦ਺͸n / 2 ؆ུԽ͢Δͱ x = x2Λ͚ͭͮ͠Δ

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

৆❴ƑࠎЧ ྦྷ৐ͱ͸ɻͦͷҙຯͱܭࢉํ๏Λղઆʲఈɾࢦ਺ͱ͸Կ͔ʳcΞλϦϚΤʂ
 IUUQTBUBSJNBFCJ[BSDIJWFT

Slide 20

Slide 20 text

def power(a, other) x = a z = x n = other - 1 while n != 0 p " n: #{n}" while (div, mod = n.divmod(2); mod == 0) p x = x * x p n = div end z *= x p " z: #{z}" n -= 1 end z end ྦྷ৐ ࢦ਺͕ۮ਺ͷؒ ࢦ਺͕ح਺ʹͳͬͨΒ
 zʹྦྷ৐ͨ͠xΛֻ͚Δ (((x2)2)2…͠ଓ͚Δ

Slide 21

Slide 21 text

def power(a, other) x = a z = x n = other - 1 while n != 0 p " n: #{n}" while (div, mod = n.divmod(2); mod == 0) p x = x * x p n = div end z *= x p " z: #{z}" n -= 1 end z end ྦྷ৐ a = 3, other = 3ͷ৔߹( 33 ) n(ࢦ਺) = 2 div = 1, mod = 0 n = 1 z = 3 * 9 = 27
 n = 0 x = 3 * 3 = 9

Slide 22

Slide 22 text

ͭ·Γ •33 = 3 * 32 •34 = 3 * 33
 = 3 * 3 * 32 35 = 3 * 34
 = 3 * (32)2
 ఈΛऔΓग़͢ ࢦ਺Λ1 + nʹ෼͚Δ

Slide 23

Slide 23 text

ͭ·Γ •33 = 3 * 32 •35 = 3 * 34
 = 3 * (32)2 35 = 3 * 34
 = 3 * (32)2
 ෼͚ΒΕͨࢦ਺͕2nͰׂΓ͖ΕΔؒ
 ࢦ਺Λ2ͰׂΓଓ͚͍ͯ͘

Slide 24

Slide 24 text

ͭ·Γ •33 = 3 * 32 •35 = 3 * 34
 = 3 * (32)2 35 = 3 * 34
 = 3 * (32)2
 ෼͚ΒΕͨࢦ਺͕2nͰׂΓ͖ΕΔؒ
 ࢦ਺Λ2ͰׂΓଓ͚͍ͯ͘

Slide 25

Slide 25 text

ͭ·Γ •33 = 3 * 32 •35 = 3 * 34
 = 3 * (32)2 •37 = 3 * 36
 = 3 * (32)2 * 3
 ෼͚ΒΕͨࢦ਺͕2nͰׂΓ੾Εͳ͘ͳΔͱ
 ఈΛ෼͚Δ

Slide 26

Slide 26 text

Θͨ͠ͷ࣮૷ • def power(a, n) result = 1 n.times { |i| result *= a } result end power(2, 33) # => 8589934592 •n.times {} ͩͱ୯७ʹnճܭࢉ͢Δ
 233 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2

Slide 27

Slide 27 text

rubyͷ࣮૷ • def power(a, other) x = a z = x n = other - 1 while n != 0 while (div, mod = n.divmod(2); mod == 0) x *= x n = div end z *= x n -= 1 end z end •ࢦ਺Λ2Ͱׂ͍ͬͯ͘ͱܭࢉճ਺͕૿͑ͳ͍

Slide 28

Slide 28 text

•ࢦ਺Λ2Ͱׂ͍ͬͯ͘ͱܭࢉճ਺͕૿͑ͳ͍
 233 = 2 * 232
 = 2 * ((((22)2)2)2)2 rubyͷ࣮૷ Θͨ͠ͷ࣮૷ •233 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 *
 2 * 2 * 2 ͍͢͝ݮͬͨʂ

Slide 29

Slide 29 text

•ϏοτɾόΠτͬͯ2nͩ͠
 ΋͔ͯ͠͠ྦྷ৐ͬͯΊͬͪΌ࢖ΘΕͯͦ͏ •ܭࢉྔݮΒͨ͢Ίʹ͜͏͍͏࣮૷ͳͷ͔ͳ͋

Slide 30

Slide 30 text

΍͍ͬͯΔ͜ͱ •໨తΛ໌֬ʹ͢Δ •ແཧ͠ͳ͍ •͍ͭͰ΋ಡΊΔ؀ڥΛ࡞Δ ίʔυϦʔσΟϯά
 ͢Δ্Ͱ

Slide 31

Slide 31 text

໨తΛ໌֬ʹ͢Δ •໨తʹΑͬͯಡΉৄ͠͞΍ಡΈํ͕มΘΔ •ϝιουͷਖ਼֬ͳڍಈΛ஌Γ͍ͨ •ӨڹൣғΛ஌Γ͍ͨ •ྺ࢙తܦҢͷ֬ೝ •ϝιουͷུ֓ͷ֬ೝ •ύονΛૹΓ͍ͨ •޷ح৺ɾ஌Γ͍͔ͨΒɾָ͍͔͠Β΋΋ͪΖΜ͋Δ ɹnonzero? ͬͯ
 ɹͲ͏͍͏ڍಈ͚ͩͬʁ ɹ͜ͷม਺มߋ͍͍ͯ͠Μ͚ͩͬʁ ɹͳΜͰ͜ͷ࣮૷ʹͳͬͯΔͷʁ ɹԿͷΠϯελϯεฦ͢ͷʁ ɹ

Slide 32

Slide 32 text

໨తΛ໌֬ʹ͢Δ •ࠓճͷ໨త͸ʮruby͕ߟྀ͍ͯ͠Δ͜ͱΛ஌Δ͜ͱʯ •ΞϧΰϦζϜͷཧղ͸෭࣍తͳ໨త •ࣗ෼Ͱ΋࣮૷͸Ͱ͖Δ •Α͍ίʔυ͔͸ •Կ͕ߟྀ͞ΕΔͱΑ͍ίʔυͳͷ͔ʁ •rubyͷίʔυ͸Α͍͓खຊ(ͨͿΜ) ͨ͘͞Μͷਓ͕࢖͏͔Β
 ࢥ͍͔ͭͳ͍͜ͱ͕
 ߟྀ͞Εͯͦ͏

Slide 33

Slide 33 text

໨తΛ໌֬ʹ͢Δ •ࠓճͷֶͼ •ܭࢉྔͬͯ͜͏͍͏෩ʹݮΒͤΔɾݮΔͷΛ࣮ײͨ͠ •(DBΞΫηεҎ֎Ͱܭࢉྔ·͡Ίʹߟ͑ͨ͜ͱ͋·Γͳ͍) •ͨͿΜྦྷ৐(΂͖৐)ͬͯසग़ϝιου •ຊମଆͰܭࢉྔݮΒ͢ͷେࣄ •਺ֶษڧ͠Α͏ͳɻɻɻ •஌Βͳ͔ͬͨϝιου΍จ๏Λ஌ͬͨ

Slide 34

Slide 34 text

̤̤ΤϯδχΞͷྠʂʙୈճਢ౻ޭฏ͞ΜͷרʙcΦϒδΣΫτͷ޿৔
 IUUQTXXXPHJTSJDPKQPUDIJSPCBPUIFST003JOHJOUFSWJFXIUNM ǿƺǬǿȀƋŮƵ൐ũƋŰƎaǟǃǻǷȉǞƵ䪎ơ ƍŰƦŧŧƶŻƦƍŧŮƍƋනŧơżb
 ൐ŧٚůƲŮƶƍŮƆƂƬǓ✣Ǐ䪎ƶƊ൐ŧٚƵƲ ŮƯƓŧŧb
 ƀƑℭƒሱٳƊŶũŧũἀƎ൐ŧƂŧƆƉŧũଢ֥ ťƮƑƊaŶũŧũἀƎႄඔ؈žƓũơŲọŲƍƆ ƉŧũƑƵсေƎ௧ƬƯƉ䪎ƣƋනũƶƊżƫb
 
 ƀƯůaଢ֥ƵӻƆƉ䪎ƣŶƋƎ
 ƍƮƶŻƦƍŧŮƋනŧơżb

Slide 35

Slide 35 text

ແཧ͠ͳ͍ •ಡΈ͍ͨ/ಡΉ΂͖ίʔυ͸ແݶʹ͋Δ •࣌ؒ͸༗ݶ •શ෦ཧղͰ͖ͳͯ͘΋OK •໨తୡ੒ͨ͠Βऴྃ •ʮԿ΋Θ͔Βͳ͍ʯ࣌͸ܿ͘ఘΊΔ
 ͍͔ͭಡΊΔΑ͏ʹͳΔ೔͕དྷΔ •ͳΜ͔ͩΜͩۙ͘ͷίʔυ΋ݟͯΔͷͰษڧʹͳͬͯΔ

Slide 36

Slide 36 text

•bundle install —path vendor/bundle && rm .bundle/config •gem-src •source_location(rubyͷϝιουఆٛΛݺ΂Δ) •pry + pry-doc(`$`Ͱcͷϝιουఆٛ΋ݺ΂Δ) •RubyMine •OctTree ͍ͭͰ΋ಡΊΔ؀ڥΛ࡞Δ

Slide 37

Slide 37 text

ίʔυϦʔσΟϯά͸͍͍ͧ ·ͱΊ

Slide 38

Slide 38 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠