Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Practitioner's Journey from Ruby 1.8 to Present

Koichi ITO
September 09, 2023

A Practitioner's Journey from Ruby 1.8 to Present

Koichi ITO

September 09, 2023
Tweet

More Decks by Koichi ITO

Other Decks in Programming

Transcript

  1. ,PJDIJ*50&4. *OD
    A Practitioner's Journey
    from Ruby 1.8 to Present
    Have you been able to craft your job to be fun?
    େࡕ3VCZձٞ
    4BU

    ϋʔτϯϗςϧ৺ࡈڮদ෩ϗʔϧ

    View Slide

  2. @koic
    w044ϓϩάϥϚʔ
    w3VCP$PQίΞνʔϜ
    wגࣜձࣾӬ࿨γεςϜϚωδϝϯτ &4. *OD


    ΤϯδχΞϦϯάϚωʔδϟʔ݉

    σΟεςΟϯάΠογϡυΤϯδχΞ

    View Slide

  3. w ʰΦϒδΣΫτࢦ޲εΫϦϓτݴޠ3VCZʱ
    ͕ڭຊɻʰσεΫτοϓϦϑΝϨϯεʱΛ

    ࣋ͪา͍ͯ௨ۈͯͨ͠ɻ
    3VCZͱࢲ

    View Slide

  4. View Slide

  5. େࡕ3VCZձٞͷ&4.ϝϯόʔ
    4
    Q
    FBLFS
    @junk0612
    4
    Q
    FBLFS
    @koic
    -5
    @maimux2x
    4
    UB
    f
    @haruguchiyuma
    "
    UUFOEFF
    @fugakkbn
    "
    UUFOEFF
    @nsgc
    "
    UUFOEFF
    @kakutani
    ϑΣϩʔ

    View Slide

  6. w ೔ຊ3VCZΧϯϑΝϨϯε͔Βࠓ೥ͷ
    3VCZ,BJHJ·Ͱ͢΂ͯεϙϯαʔͯ͠Δ

    ੈք།Ұͷاۀ ެืͷͳ͍ আ͘

    w 3VCZ,BJHJ -5

    -5
    ొஃഐग़
    w ೔ຊࠃ಺Ͱ͸34QFDͱ)BNMॳظͷಋೖاۀ
    3VCZͱ&4. *OD

    View Slide

  7. 044ίϛϡχςΟͱͷڞੜΛࢧԉ
    3BJMT044ύονձ
    #esm_oss

    View Slide

  8. w !KVOL-SBNBίϯτϦϏϡʔλʔ
    w !4)QBSTFZίϯτϦϏϡʔλʔ
    w !LPJD1BSTFSHFNίϛολʔ
    w !JNB[VNJ*3#ίϛολʔ
    w !GVHBLLCO3#4ίϯτϦϏϡʔλʔ
    ߏจղੳثݚڀ෦
    IUUQTNBHB[JOFSVCZJTUOFUBSUJDMFT'PMMPX6Q,JSJTIJNB3VCZIUNM
    /&8

    View Slide

  9. w3VCZͱΞδϟΠϧιϑτ
    ΢ΣΞ։ൃΛ௨ͯ͡ίϛϡ
    χςΟͱ੒௕͍ͨ͠ਓ
    w೔ຊશࠃ͔Βઈࢍืूத
    ΤϯδχΞืूத
    ͜Εɺωλ͡Όͳ͍Ͱ͔͢ΒͶʁ
    🗾

    View Slide

  10. 3VCZ࣌୅͔Βݱࡏͷ࠷৽։ൃ൛Ͱ͋Δ
    3VCZ·Ͱɺ3VCZͷόʔδϣϯΞοϓʹ
    ΑͬͯͲͷΑ͏ͳΠϕϯτ͕͋Γɺ౰࣌ͷ࢓
    ࣄͰͷΞϓϦέʔγϣϯ։ൃ͋Δ͍͸044

    ΤίγεςϜͰͲͷΑ͏ͳग़དྷࣄ΍ίʔυ΁
    ͷมֵ͕͔͋ͬͨԹނ஌৽Λ͓࿩͠͠·͢ɻ
    ࠓ೔ͷ࿩ $'1ఏग़֓ཁΑΓ

    View Slide

  11. ྺ࢙

    View Slide


  12. #FGPSF3BJMT

    View Slide

  13. w ຊ൪ϥϯλΠϜʹ3VCZ͕ೖ͍ͬͯͳ͍
    w ։ൃ؀ڥͰ͋Ε͹3VCZΛΠϯείͰ͖Δ
    w +BWBͩͱෳ਺छͷ+&&αʔόʔʹσϓϩΠ͢Δ

    &"3ϑΝΠϧͷBQQMJDBUJPOYNMͳΜ͔ͷ

    αʔόʔݻ༗9.-ଐੑͷฤूΛ3&9.-ͰࣗಈԽ
    w 0ODF8SJUF3VO"OZXIFSF΁ͷάϧʔݴޠ🤔
    U%JBSZ͕ΩϥʔΞϓϦ࣌୅

    View Slide

  14. 0.(ʹ࠾୒ʁ
    !LLE
    IUUQPCKFDUDMVCKQNMBSDINBHB[JOFIUNM

    View Slide


  15. "GUFS3BJMT

    View Slide

  16. w 3BJMTͱ͍͏ࠇધ͕΍͖ͬͯͨ
    w ౰࣌3BJMTͷ࠾୒͸·ͩϦεΫ
    w 3BJMTొ৔ͷ౰࣌͸TDB
    ff
    PMEͰ·ͱ΋ͳΞϓϦ
    ࡞ΕΔͷٙ࿭ʁ΍ͬͯΈͨΒશવͰ͖ͨ
    w ࣮ࡍͷͱ͜ΖTDB
    ff
    PME࢖͏ػձ͕ͳ͍Α͏ͳ
    ͓࢓ࣄͰ3VCZΛΩϝΔ࣌୅

    View Slide

  17. w 3VCZPO3BJMTͰ΋Γ΋ΓίʔυΛॻ͚ΔΑ
    ͏ʹͳͬͨ୅ΘΓʹΩϚΓ͗͢ͷΦʔόʔ
    ϫʔΫʹͳͬͯ͠·ͬͨࣄྫ΋͋Γ
    w ౰࣌ੜ࢈ੑഒͱݴΘΕ͍ͯͨཪ͸
    w 3VCZPO3BJMTͰఆ࣌ʹؼΖ͏"8%X3
    Ωϝա͗஫ҙใ͕ग़Δ

    View Slide

  18. w has_manyͳͲͰݴޠ಺%4-ͷڧྗ͞Λྲྀ෍
    w Ҿ਺࠷ޙͷϋογϡͷϒϨʔεͷলུͰ

    ΩʔϫʔυҾ਺ͬΆ͞ ౰࣌͸=>ه๏ͷΈ

    w 3BJMTͰಋೖ͞ΕͨSymbol#to_proc͕3VCZ
    ʹϙʔςΟϯά͞ΕΔ

    3BJMTʹΑΔ3VCZͷදݱྗ

    View Slide

  19. ͸͡·ΓͷSymbol#to_proc
    https://github.com/rails/rails/commit/69bf71f5e9b537f88acc0d4492a057336e7305d1

    View Slide


  20. .FSHF:"37

    View Slide

  21. w :"37͕ೖͬͯɺ"45ϕʔεͷ௚઀ධՁث͔
    Β7.ʹΑΔόΠτίʔυ࣮ߦʹͳͬͨ
    w άϦʔϯεϨου͔ΒωΠςΟϒεϨουʹ
    ͳͬͨ (7-͕͋Δ΋ͷͷ*0଴ͪͳͲͷϒ
    ϩοΫத͸ଞͷεϨου͕࣮ߦͰ͖Δ

    w ͭ·ΓΞοϓάϨʔυ͢Δͱ଎͘ͳΔ࣌୅
    ΞϓϦίʔυԼͰͷมԽ

    View Slide

  22. w key => valueʹՃ͑key: valueͷ)BTIه๏ಋೖ
    w ྩ࿨೥ ࣌୅͸3VCZEFW
    ʹ

    ʮ3VCZͷ)BTIه๏ʯͱίϝϯτ͢Δ͜ͱ͕ʂ
    w ΩʔϫʔυҾ਺͕ೖͬͨͷ͸3VCZ͔Β͕ͩɺϝιο
    υҾ਺ͷ࠷ޙͷϋογϡ͕ຊ౰ʹͦΕͬΆ͘
    w ౰࣌ࢍ൱྆࿦ͷlambdaͷ->ه๏͕ೖͬͨ
    w จࣈͱه߸ͷࣝผௐ࿨͕ઈົ
    ΞϓϦίʔυ͕ݱ୅తͳݟͨ໨ʹ

    View Slide

  23. w 3VCZҎલͷจࣈྻ͸όΠτͷγʔέϯε
    w ⤴Ͱଟ͘ͷEncoding::CompatibilityErrorͱରቂ
    w # encoding: UTF-8ϚδοΫίϝϯτʹΑΔ

    εΫϦϓτΤϯίʔσΟϯάͷࢦఆͱ
    String#force_encodingͳͲʹΑΔετϦʔϜ

    ΤϯίʔσΟϯάม׵Ͱ৐Γ੾ͬͨΑ͏ͳ
    w ͓͔͛Ͱ΁ͷΞοϓάϨʔυ͸೉͘͠ͳ͔ͬͨʁ
    ΞϓϦίʔυ΁ͷඇޓ׵ աڈ࠷େ

    View Slide


  24. 5IF'JSTU4UBCMF

    View Slide

  25. w 3VCZ(FNT͕ඪ४ఴ෇ʹͳΔ
    w ruby setup.rbίϚϯυʹΑΔΠϯετʔϧ΍

    apt-get install railsͱ͍͏gem؅ཧͱࠞ
    ͥΔͳةݥͷ౫ଡ
    w ͜ͷޙ͘Β͍ʹ3BJMTʹ#VOEMFS͕౷߹͞Εͯ
    ύοέʔδ؅ཧͷΤίγεςϜ͕҆ఆͨ͠
    ܥ࠷ॳͷ҆ఆόʔδϣϯ

    View Slide


  26. .BOZ/FX'FBUVSFT

    View Slide

  27. w ΩʔϫʔυҾ਺ɺModule#prependɺ

    γϯϘϧϦςϥϧɺEnumerable#lazyɺ

    َӢɺTracePointɺ3F
    fi
    OFNFOUTͳͲͳͲ
    w ໿೥ӽ͠ͷΞοϓάϨʔυͰຊ౰ʹ৽ػೳ੝
    Γͩ͘͞Μͩͬͨ
    w ϝλϓϩΪϟϯά΋େتͼʁ
    ޫͷػೳͱҋͷػೳͨ͘͞Μ

    View Slide

  28. w εΫϦϓτΤϯίʔσΟϯάͷσϑΥϧτ͕
    65'ʹͳͬͨ ࠓ౓͸Ϛδίϝෆཁ

    εΫϦϓτΤϯίʔσΟϯάෆཁ

    View Slide


  29. *NQSPWFNFOUT

    View Slide

  30. w ΞϓϦ໘Ͱେ͖ͳมߋ͸ࢥ͍ग़ͤͳ͍
    վળʹײँ

    View Slide


  31. 4ZNCPM($

    View Slide

  32. w 3BJMTͰ͸4ZNCPM($ඞਢͷͨΊಋೖ

    ͞Εͨ3VCZҎ্Λཁٻ͢Δ
    w ݫີʹ͸όάϑΟοΫεͷҎ্͕ཁ݅
    վળʹײँ

    View Slide


  33. 4FWFSBM6TFGVM4ZOUBYFT

    View Slide

  34. w 4BGF/BWJHBUJPO0QFSBUPS ΅ͬͪԋࢉࢠ


    ʹΑΔ3BJMTΞϓϦͷtryͱtry!ͷஔ͖׵͑
    w .Ͱे෼ͳ৔߹ʹ&.Λكʹݟ͔͚Δ
    4BGF/BWJHBUJPO0QFSBUPS

    View Slide

  35. w 4RVJHHMZ)FSFEPDʹΑΔ3BJMTΞϓϦͷ
    strip_heredocͷஔ͖׵͑
    4RVJHHMZ)FSFEPD

    View Slide

  36. • # frozen_string_literal: trueʹΑ
    ΔϚδοΫίϝϯτͰfreeze͞Εͨ
    String͕खʹೖΔΑ͏ʹͳͬͨ
    • RubyͷॊΒ͔͕͞ݮͬͨʁ
    w ౰࣌෺͕ٞৢ͞Ε͍ͯͨ
    GTUSJOHMJUFSBMͷಋೖ

    View Slide

  37. 3VCZͰԆظޙͷԻࠫଡ͸ʁ
    https://mametter.hatenablog.com/entry/20151004/p1

    View Slide

  38. 3BJMTͱGTUSJOHMJUFSBMT
    https://github.com/rails/rails/pull/30342

    View Slide


  39. *OUFHFS6OJ
    fi
    DBUJPO

    View Slide

  40. ܯࠂͷ઒͕ྲྀΕΔ
    w 3VCZͷͱ͖ͱҟͳΓɺ·ͣඇޓ׵΁ͷ

    ඇਪ঑ܯࠂ͞Ε͍ͯͨ
    w 3VCZEFWΛ࢖͏͜ͱͰϦϦʔε࣌
    ʹ઒ͷ൙ཞ͕ݮΔΑ͏ʹύονΛૹ͍ͬͯͨ

    View Slide

  41. 044ͱ೔ৗ
    w HIRHFNTSD
    ؅ཧϦϙδτϦ
    ͷඇਪ঑ܯࠂ΁
    ύονΛग़͢Τί
    γεςϜࢀՃͷ
    ͖͔͚ͬʹͳΔ

    View Slide


  42. *NQSPWFNFOUT

    View Slide

  43. w rescueelseensure͕doend

    ϒϩοΫʹॻ͚ΔΑ͏ʹͳͬͨͷ͸ॻ͖৺஍
    ྑ͍
    վળʹײँ

    View Slide


  44. .+*53VCZ7."45

    View Slide

  45. w ͍ͪ͹Μ࣮༻໘ͰӨڹ͍ͯͦ͠͏
    w 3VCZΛΠϯετʔϧͨ͠ޙʹ

    gem i bundlerͱ͍͏ఆܕّྱ͕ෆཁʹ
    #VOEMFS͕ඪ४ఴ෇͞ΕΔ

    View Slide

  46. w .+*5͕ಋೖ͞Ε͕ͨɺ3BJMTΞϓϦέʔγϣ
    ϯͰͷ࣮༻ࣄྫ͸Չฉʹͯ͠ฉ͔ͣͩͬͨ
    w 3VCZ7."CTUSBDU4ZOUBY5SFFʹΪϟϯά
    ͕ΞϓϦ৔֎Ͱ੝Γ্͕ΓΛݟ͍ͤͯͨ
    w ΞϓϦͷ࣮༻໘Ͱ͸FOEMFTTSBOHFͳͲͷ

    ৽ػೳΛ࢖͑ΔΑ͏ʹͳͬͨ
    ͍Ζ͍Ζͱ࣮ݧతͳ೩ྉ౤Լ

    View Slide


  47. 4VQFS)BSE.PEF3VCZ

    View Slide

  48. LXBSHT෼཭
    w ͍͍ͩͨฐࣾͷ
    ύονձʹग़ͯͨ
    ਓͷपลͰΤί
    γεςϜଆͷ
    LXBSHTͷ෼཭ͷ
    ରԠΛਐΊ͍ͯͨ
    ҹ৅

    View Slide

  49. w OVNCFSFEQBSBNFUFSͷελΠϧੋඇʹͭ
    ͍ͯʮ3VCZ͸8FCΛ࡞ΔͨΊͷݴޠͰ͸

    ͳ͘εΫϦϓτݴޠʯͱ͍͏ͷ͸ͳΔ΄Ͳ
    w ݸਓతʹ͸อक͢Δίʔυʹ͸໊લ͕͍ͭͯ
    ͍ͯ΋Β͍͍͚ͨΕͲɺॻ͖ࣺͯ΍εϥΠυ
    ෼ྔΛݮΒ͢ͷʹศར
    ύλʔϯϚον΍φϯύϥ

    View Slide


  50. "CTUSBDU*OUFSQSFUBUJPO

    View Slide

  51. CVHTSVCZMBOHPSHJTTVFT
    3VCZݴޠʹ͍͔ͳΔܗͰ͋Εܕએݴ
    ΍ܕ஫ऍΛಋೖ͢Δͭ΋Γ͸͋Γ·ͤΜ

    View Slide

  52. w ܕΛॻ͔ͣʹɺܕͷϝϦοτΛڗड͍ͨ͠
    w 3#4ͩͱΞϓϦͰ·ͩܕΛॻ͘ίετ͕ߴ͘
    ࠳ં͢ΔͷΛݟ͔͚Δ %3:Ͱͳ͘ਏ͍

    w 3#*ͷಋೖίʔυ͸΋͸΍3VCZʹݟ͑ͣਏ͍
    w ྫ͑͹3#4͕πʔϧؒͷཪଆͷ௿ϨΠϠʔݴޠ
    ʹͳΔະདྷ͸ʁ
    ந৅ղऍͱ͍͏ୈͷಓ

    View Slide


  53. :+*5

    View Slide

  54. w .+*5ʹՃ͑ͯ-##7ʹج͍ͮͨ4IPQJGZ੡
    +*5Ͱ͋Δ:+*5͕ಋೖ͞Εͨ
    w 3BJMTΞϓϦͰ༗ޮԽͨ͠ޮՌଌఆ͕࿩୊ʹ
    ͳΔ͜ͱ͕͋Δ͚ΕͲ-41Ͱ΋ΫϥΠΞϯτ
    ͔ΒRUBY_YJIT_ENABLED=trueͯ͠ΈΑ͏
    w FHWTDPEFSVCPDPQ TUFFQWTDPEF
    :+*5

    View Slide


  55. 3VTU:+*58"4.

    View Slide

  56. w :+*5ͷ࣮૷͕3VTUʹͳͬͨ
    w 3VTU:+*5ͷϏϧυͰࠔΔͱ͍͏࿩ΛपลͰ
    ฉ͔ͳ͍
    w %0$,&30''*$*"-*."(&͕࢖ΘΕ͍ͯΔ
    ͷ͔ɺ3VTUΠϯετʔϧ͸ڭཆͳͷ͔ɺ
    :+*5ແޮͰͷϏϧυͱ͍ͯ͠Δͷ͔
    3VTU:+*5

    View Slide

  57. w ࠷ۙ5SZ3VCZͷσϑΥϧτ͕0QBM͔Β
    8"4.ʹͳ͍ͬͯͨ ΑΓྑ͍ೖ໳ʹ

    8FC"TTFNCMZ 8"4.

    IUUQTUSZSVCZMBOHPSHQMBZHSPVOE

    View Slide

  58. w ਖ਼نදݱ·ΘΓվળʹΑΔ3F%P4߈ܸରࡦ
    ͸࣮༻త
    w 3FBEPOMZͷStruct.new૬౰ͱͯ͠
    Data.define͕ಋೖ͞Εͨ
    w 3BDUPSͷར༻ʹؔΘ͍͖ͬͯͦ͏
    ͷݸਓతਪ͠

    View Slide


  59. 6OJWFSTBM1BSTFS3BDJOH


    View Slide

  60. -SBNBBOE:"31
    6OJWFSTBM1BSTFS೼ݖ૪ୣͷηϝϯτ

    View Slide

  61. w !KVOL-SBNBίϯτϦϏϡʔλʔ
    w !4)QBSTFZίϯτϦϏϡʔλʔ
    w !LPJD1BSTFSHFNίϛολʔ
    w !JNB[VNJ*3#ίϛολʔ
    w !GVHBLLCO3#4ίϯτϦϏϡʔλʔ
    ߏจղੳثݚڀ෦
    IUUQTNBHB[JOFSVCZJTUOFUBSUJDMFT'PMMPX6Q,JSJTIJNB3VCZIUNM

    View Slide

  62. "CPWF"MM .BLF*U'VO

    View Slide