Slide 1

Slide 1 text

͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ 2019.12.21. TokyoGirls.rb Meetup vol.2 @makicamel

Slide 2

Slide 2 text

•@makicamel / ઒ݪສق •ɹ •Ruby/Railsྺ3೥͘Β͍ •Ruby ͱϏʔϧɹɹͱ͓ञ͕޷͖ ࣗݾ঺հ

Slide 3

Slide 3 text

044׆ಈ ͲΜͳΠϝʔδ͋Γ·͔͢ʁ

Slide 4

Slide 4 text

TokyoGirls.rb vol.1ࢀՃ࣌ OSS׆ಈ͸ ͭΑͭΑΤϯδχΞ͕͢Δ΋ͷ 100೥ૣ͍ ා͍ ͦΜͳ ٕज़ͳ͍

Slide 5

Slide 5 text

ࠓ೔ͷλΠτϧ

Slide 6

Slide 6 text

͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ ࠓ೔ͷλΠτϧ

Slide 7

Slide 7 text

͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ ࠓ೔ͷλΠτϧ ͜ΜͳͻΑ͕ͬ͜ ɹɹͳΜͯλΠτϧΛ…

Slide 8

Slide 8 text

͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ ࠓ೔ͷλΠτϧ ΊͬͪΌίϯτϦϏϡʔτͯ͠ΔΘ͚Ͱ΋ͳ͍ͷʹ ͍ٕ͢͝ज़ྗ͕͋ΔΘ͚Ͱ΋ͳ͍ͷʹ Railsʹ΋Rubyʹ΋ ίϯτϦϏϡʔτͨ͜͠ͱͳ͍ͷʹ ίϛϡχςΟʹ΋ ߦͬͨΓߦ͔ͳ͔ͬͨΓͩ͠ Θͨ͠ΑΓ΋˓˓͞Μͷ΄͏͕ ·ͩ͋ͷຊੵΜͩ··ͩ͠ ͜ΜͳͻΑ͕ͬ͜ ɹɹͳΜͯλΠτϧΛ… ͋ͷίʔυ·ͩಡΜͰͳ͍

Slide 9

Slide 9 text

͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ Ͱ΋ݴ͏

Slide 10

Slide 10 text

Ϟνϕʔγϣϯ OSS׆ಈ͸ ͭΑͭΑΤϯδχΞ͕͢Δ΋ͷ 100೥ૣ͍ ා͍ ͦΜͳ ٕज़ͳ͍

Slide 11

Slide 11 text

044׆ಈ͸͜Θ͘ͳ͍ Ϟνϕʔγϣϯ

Slide 12

Slide 12 text

OSS։ൃͱ͍ͭ΋ͷ։ൃ͸ࣅ͍ͯΔ

Slide 13

Slide 13 text

͋Δ೔ ɹϝʔϧͷมߋػೳ࣮૷ͯ͠ɺ ɹมߋ࣌ʹ৽͍͠ΞυϨεʹ֬ೝϝʔϧૹΔΑ͏ʹͯ͠Ͷ gem "devise"

Slide 14

Slide 14 text

Devise QMBUBGPSNBUFDEFWJTF3&"%.&NEc(JU)VC
 IUUQTHJUIVCDPNQMBUBGPSNBUFDEFWJTFCMPCCBDDEBCFGFBEGF3&"%.&NE ೝূͷଟػೳGem

Slide 15

Slide 15 text

Devise class AddUnconfirmedEmailToUser < ActiveRecord::Migration[5.2] def change add_column :users, :unconfirmed_email, :string end end # config/initializer/devise.rb config.reconfirmable = true •ઐ༻ͷΧϥϜ௥Ճ •ઃఆ

Slide 16

Slide 16 text

Devise current_user.update!(email: user_params[:email]) •৽͍͠஋Λอଘ͢Ε͹ϝʔϧ͕ૹ৴͞ΕΔ Կ΋ى͖ͳ͍

Slide 17

Slide 17 text

module Devise::Models::Confirmable extend ActiveSupport::Concern included do before_create :generate_confirmation_token, if: :confirmation_required? after_create :skip_reconfirmation_in_callback!, if: :send_confirmation_notification? if defined?(ActiveRecord) && self < ActiveRecord::Base # ActiveRecord after_commit :send_on_create_confirmation_instructions, on: :create, if: :send_confirmation_notification? after_commit :send_reconfirmation_instructions, on: :update, if: :reconfirmation_required? else # Mongoid # ... end before_update :postpone_email_change_until_confirmation_and_regenerate_confirmation_token, if: :postpone_email_change? end ࠶֬ೝ͕ඞཁͩͬͨΒ Devise ϝʔϧͷมߋΛԆظ͢Δ ϝʔϧૹ৴ ৗʹfalse

Slide 18

Slide 18 text

Devise ? gem "devise" gem "devise_token_auth"

Slide 19

Slide 19 text

DeviseTokenAuth MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUI •APIαʔό޲͚ೝূ༻Gem •DeviseͷػೳΛ׆༻ •Deviseͱซ༻Մ README FAQ

Slide 20

Slide 20 text

DeviseTokenAuth MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIJTTVFT

Slide 21

Slide 21 text

DeviseTokenAuth module DeviseTokenAuth::Concerns::User extend ActiveSupport::Concern included do # don't use default devise email validation def email_required?; false; end def email_changed?; false; end def will_save_change_to_email?; false; end # ... MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUICMPC BGDCBEFCEBFFFBQQNPEFMTEFWJTF@UPLFO@BVUIDPODFSOTVTFSSC

Slide 22

Slide 22 text

module Devise::Models::Confirmable extend ActiveSupport::Concern included do before_create :generate_confirmation_token, if: :confirmation_required? after_create :skip_reconfirmation_in_callback!, if: :send_confirmation_notification? if defined?(ActiveRecord) && self < ActiveRecord::Base # ActiveRecord after_commit :send_on_create_confirmation_instructions, on: :create, if: :send_confirmation_notification? after_commit :send_reconfirmation_instructions, on: :update, if: :reconfirmation_required? else # Mongoid # ... end before_update :postpone_email_change_until_confirmation_and_regenerate_confirmation_token, if: :postpone_email_change? end Devise don’t use default devise email validation

Slide 23

Slide 23 text

•Deviseඪ४ͷػೳΛյ͍ͯ͠Δ •࢓ࣄͷίʔυ͸Ԡٸख౰Ͱॲஔ •ࣅͨΑ͏ͳIssue͕͍ͭ͘΋͕͍͋ͬͯΔ •ࠔ͍ͬͯΔਓ͕͍ͬͺ͍͍ͦ͏ DeviseTokenAuth

Slide 24

Slide 24 text

΋͔ͯ͠͠ɿ ίϯτϦϏϡʔγϣϯνϟϯε

Slide 25

Slide 25 text

͓Ϛʔδ

Slide 26

Slide 26 text

͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ

Slide 27

Slide 27 text

Ͳ͏ͯ͠ΦʔόʔϥΠυͯ͠Δͷʁ module DeviseTokenAuth::Concerns::User extend ActiveSupport::Concern included do # don't use default devise email validation def email_required?; false; end def email_changed?; false; end def will_save_change_to_email?; false; end # ... MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUICMPC BGDCBEFCEBFFFBQQNPEFMTEFWJTF@UPLFO@BVUIDPODFSOTVTFSSC

Slide 28

Slide 28 text

module Devise::Models::Validatable def self.included(base) base.extend ClassMethods assert_validations_api!(base) base.class_eval do validates_presence_of :email, if: :email_required? if Devise.activerecord51? validates_uniqueness_of :email, allow_blank: true, case_sensitive: true, if: :will_save_change_to_email? validates_format_of :email, with: email_regexp, allow_blank: true, if: :will_save_change_to_email? else # ... end # ... end end ͜ͷvalidationΛskip͍ͨ͠

Slide 29

Slide 29 text

module Devise::Models::Confirmable extend ActiveSupport::Concern if Devise.activerecord51? def postpone_email_change? postpone = self.class.reconfirmable && will_save_change_to_email? && !@bypass_confirmation_postpone && self.email.present? && (!@skip_reconfirmation_in_callback || !self.email_in_database.nil?) @bypass_confirmation_postpone = false postpone end else # ... ͜ͷvalidation͸skipͨ͘͠ͳ͍

Slide 30

Slide 30 text

•DeviseͰ࢖͍ͬͯΔmodule͸2Օॴ •Validatable •Confirmable →ৗʹfalseΛฦ͍ͨ͠ →super͍ͨ͠ will_save_to_change_email?

Slide 31

Slide 31 text

will_save_to_change_email? module ActiveRecord::AttributeMethods::Dirty extend ActiveSupport::Concern include ActiveModel::Dirty included do # ... # Attribute methods for "will change if I call save?" attribute_method_affix(prefix: "will_save_change_to_", suffix: "?") attribute_method_suffix("_change_to_be_saved", "_in_database") end SBJMTSBJMTc(JU)VC
 IUUQTHJUIVCDPNSBJMTSBJMTCMPCFEBDCGDECFDD⒎BDUJWFSFDPSEMJC BDUJWF@SFDPSEBUUSJCVUF@NFUIPETEJSUZSC

Slide 32

Slide 32 text

•ActiveRecord͕४උͯ͘͠Ε͍ͯΔಈతͳattribute •`will_save_to_change_{column}?`͕֤Ϟσϧʹੜ͑Δ •஋͕มߋ͞ΕͨΒtrueɺDBͷ஋ͱಉͩͬͨ͡Βfalse •มߋ͞ΕΔલͷ஋͸`{column}_in_database`ͰͱΕΔ •Rails5.1ΑΓલ͸`{column}_changed?` will_save_to_change_email?

Slide 33

Slide 33 text

module DeviseTokenAuth::Concerns::ConfirmableSupport extend ActiveSupport::Concern included do def postpone_email_change? postpone = self.class.reconfirmable && email_value_in_database != email && !@bypass_confirmation_postpone && self.email.present? && (!@skip_reconfirmation_in_callback || !email_value_in_database.nil?) @bypass_confirmation_postpone = false postpone end end will_save_to_change_email?Λ email_in_database != emailͰ࠶࣮૷ ˞ɹFNBJM@WBMVF@JO@EBUBCBTF͸3BJMTͷόʔδϣϯʹԠͨ͡FNBJM@JO@EBUBCBTFΛฦ͢ϝιουΛఆٛͨ͠΋ͷͰ͢ will_save_to_change_email?

Slide 34

Slide 34 text

module DeviseTokenAuth::Concerns::User extend ActiveSupport::Concern included do def email_required?; false; end def email_changed?; false; end def will_save_change_to_email?; false; end # ... MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUICMPC BGDCBEFCEBFFFBQQNPEFMTEFWJTF@UPLFO@BVUIDPODFSOTVTFSSC Ͱ͖ͨ ValidatableϞδϡʔϧͷڍಈΛมߋ͠ͳ͍

Slide 35

Slide 35 text

͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ

Slide 36

Slide 36 text

ޙํޓ׵ੑ •ࠓ·ͰͷDeviseTokenAuth+DeviseͰ͸֬ೝϝʔϧ͕ૹΕͳ͍ •खݩͰύονΛ͋ͯͨΓ͍ͯ͠Δ͸ͣ •όʔδϣϯΞοϓͰٸʹڍಈΛม͑Δͷ͸Α͘ͳ͍ •σϑΥϧτ͸ϝʔϧૹ৴͠ͳ͍ɺઃఆͨ͠Βϝʔϧૹ৴͢ΔΑ͏ʹ͢Δ

Slide 37

Slide 37 text

ޙํޓ׵ੑ module DeviseTokenAuth::Concerns::User extend ActiveSupport::Concern included do def email_required?; false; end def email_changed?; false; end def will_save_change_to_email?; false; end if DeviseTokenAuth.send_confirmation_email && devise_modules.include?(:confirmable) include DeviseTokenAuth::Concerns::ConfirmableSupport end ϝʔϧૹ৴ϑϥά

Slide 38

Slide 38 text

ޙํޓ׵ੑ # By default DeviseTokenAuth will not send confirmation email, # even when including devise confirmable module. # If you want to use devise confirmable module and # send email, set it to true. # (This is a setting for compatibility) # config.send_confirmation_email = true •υΩϡϝϯτʹઆ໌Λ௥Ճ •configͷςϯϓϨʔτʹઃఆ஋Λ௥Ճ ͜ͷઃఆ஋͕͋Δཧ༝΋ Ұݴఴ͑ͨ

Slide 39

Slide 39 text

͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ , •Ϛʔδ͞ΕΔ౒ྗ

Slide 40

Slide 40 text

ςετͷ௥Ճ •౰ͨΓલ͚ͩͲ΍Δ •؀ڥߏங͕஍ຯʹେม͚ͩͲ΍Δ •؀ڥߏங΍ςετํ๏͸CONTRIBUTING.mdʹ͋Δ͜ͱ͕ଟ͍ •CONTRIBUTING.md(ContributionGuide)͸࠷ॳʹ໨Λ௨͢

Slide 41

Slide 41 text

ςετͷ௥Ճ class ConfirmableUser < ActiveRecord::Base # Include default devise modules. devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable DeviseTokenAuth.send_confirmation_email = true include DeviseTokenAuth::Concerns::User DeviseTokenAuth.send_confirmation_email = false end •༨ஊͰ͕͢ઃఆ஋ͷςετͷ΍Γํ͕Θ͔Βͳ͔ͬͨͷͰ
 ࠙਌ձͰΞυόΠε͍͚ͨͩΔͱخ͍͠Ͱ͢ʂ MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUICMPC BGDCBEFCEBFFFUFTUEVNNZBQQBDUJWF@SFDPSEDPOpSNBCMF@VTFSSC

Slide 42

Slide 42 text

͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ

Slide 43

Slide 43 text

఻ΘΔίϛοτΛ໨ࢦ͢ ɹίϛοτ͸ద੾ͳཻ౓ʹ͢Δ ɹͳͥΛຊจʹॻ͘

Slide 44

Slide 44 text

Θ͔Γ΍͍͢PRΛ໨ࢦ͢ ɹ֓ཁ΍໰୊ɾඞཁੑ͸IssueͰޠΒΕͯΔ ɹ΍ͬͨ͜ͱͷ֓ཁ ɹݱࡏͷ࣮૷ͱ໰୊ͷൃੜཧ༝ ɹ࣮૷ϙΠϯτ ɹߟྀͨ͜͠ͱɾޓ׵ੑ

Slide 45

Slide 45 text

૬ஊ •codeclimateʹࢦఠΛड͚Δ

Slide 46

Slide 46 text

૬ஊ if Devise.rails51? && self.respond_to?(:email_in_database) def postpone_email_change? postpone = self.class.reconfirmable && will_change_email? && !@bypass_confirmation_postpone && self.email.present? && (!@skip_reconfirmation_in_callback || !self.email_in_database.nil?) @bypass_confirmation_postpone = false postpone end else def postpone_email_change? postpone = self.class.reconfirmable && will_change_email? && !@bypass_confirmation_postpone && self.email.present? && (!@skip_reconfirmation_in_callback || !self.email_was.nil?) @bypass_confirmation_postpone = false postpone end end ɹࣅͨॲཧ͕͋Δͱ͍͏ࢦఠ ɹॲཧ͕ࣅͨίʔυϒϩοΫ

Slide 47

Slide 47 text

૬ஊ ɹDeviseͷݩͷ࣮૷͕͜ͷܗͰɺ͋Θͤͨํ͕ ɹΦʔόʔϥΠυͨ͠ࣄ͕Θ͔Γ΍͍͍͔ͯ͘͢ͱࢥͬͨΜ͚ͩͲ ɹͲ͏ࢥ͏ʁ ɹϦϑΝΫλ͍ͨ͜͠͠ͷmodule͕੹຿Λ࣋ͪ͗ͯ͢ΔͷͰ ɹผmoduleʹ੾Γग़͍ͨ͠ͳʂ

Slide 48

Slide 48 text

૬ஊ def postpone_email_change? postpone = self.class.reconfirmable && email_value_in_database != email && !@bypass_confirmation_postpone && self.email.present? && (!@skip_reconfirmation_in_callback || !email_value_in_database.nil?) @bypass_confirmation_postpone = false postpone end module੾Γग़͠+ DRYʹ͖ͯͬ͢͠Γ

Slide 49

Slide 49 text

͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ , •Ϛʔδ͞ΕΔ౒ྗ

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

;ͭ͏ͬΆ͍

Slide 52

Slide 52 text

•ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ ͜ͷPRͰ΍ͬͨ͜ͱ ઃܭͷཧղ Өڹൣғͷ֬ೝ ྺ࢙తܦҢͷ೺Ѳ طଘ&৽نϢʔβ΁ͷ഑ྀ ૬ஊ ૬खͷෛ୲ΛݮΒ͢ ʮ͜ͷίʔυͳΒೖΕͯ΋େৎ෉ʯ σάϨΛى͜͞ͳ͍ কདྷͷσάϨΛੜ·ͳ͍ νʔϜن໿Λ஌Δ Ϧϯτʹै͏ ؔ࿈Gemͷ֬ೝ υΩϡϝϯτ ςϯϓϨʔτ

Slide 53

Slide 53 text

͍ͭ΋΍ͬͯΔ͜ͱͱಉ͡ 044։ൃͰ΋ಛผ͡Όͳ͍

Slide 54

Slide 54 text

ҧ͏͜ͱ •ӳޠ •૬ख͕໨ͷલʹ͍ͳ͍(͜ͱ͕ଟ͍) •໷ͱ͔ٳ೔ʹ΍ͬͯΔਓ͕ଟ͍ •࣌ࠩ •ίʔυͷίϯςΩετ͕Θ͔Βͳ͍ Ϩεϙϯεͷૣ͞͸ ਓͦΕͧΕͳͷͰؾ௕ʹ଴ͭ

Slide 55

Slide 55 text

OSS։ൃͰಛʹେมͱࢥ͏͜ͱ

Slide 56

Slide 56 text

OSS׆ಈͬͯܧଓతʹଓ͚ͯͦ͜ Ձ஋͕͋ΔͷͰ͸ ࣗ෼ͷͰ͖Δ࣌ʹͰ͖ΔϖʔεͰؔΘΕ͹͍͍

Slide 57

Slide 57 text

ܧଓ͠ͳ͍ͱେมͳ͜ͱ΋͋Δ

Slide 58

Slide 58 text

•ઃܭ •ྺ࢙తܦҢ •աڈʹͲΜͳٞ࿦͕͔͋ͬͨ •ͲΜͳϝϯόʔ͕͍Δ͔ •νʔϜϧʔϧ ίϯςΩετ͕Θ͔Βͳ͍ స৬ͨͯ͠ͷ࣌΋ಉ͡ ಛผͳ͜ͱͰ͸ͳ͍

Slide 59

Slide 59 text

Θ͔Βͳ͍͜ͱ͕ͨ͘͞Μ͋Δ

Slide 60

Slide 60 text

ίʔυ͕Θ͔Βͳ͍ •࢓ࣄͷίʔυ΋Ή͔͍ͣ͠΋ͷ͸Ή͔͍ͣ͠ ಛผͳ͜ͱͰ͸ͳ͍

Slide 61

Slide 61 text

ϝλϓϩ͕Θ͔Βͳ͍ •Θͨ͠΋Θ͔Γ·ͤΜ… ಛผͳ͜ͱͰ͸ͳ͍ʢʁʣ

Slide 62

Slide 62 text

{Ή͔͍ͣ͠Կ͔}͕Θ͔Βͳ͍ •Θ͔Βͳ͍͜ͱ͸ͨ͘͞Μ͋Δ •΍ͬͯΔͱΘ͔ΔΑ͏ʹͳΔͷͰָ͍͠ •Θ͔Βͳ͍͜ͱͨ͘͞Μָ͍͋ͬͯ͠ Ή͠Ζಛผ

Slide 63

Slide 63 text

Θ͔Βͳ͍ͳΒ஌Ε͹͍͍ 3BJMTͷJTTVFΛղܾ͢Δ·Ͱͷखॱͱ044ॳ৺ऀͰ΋Ͱ͖Δ͜ͱcΞδϟΠϧ4&ͷ༕ᓔ
 IUUQTTJOTPLVIBUFOBCMPHDPNFOUSZ @sinsoku

Slide 64

Slide 64 text

Θ͔Βͳ͍ͳΒ஌Ε͹͍͍ •࠷ۙͷश׳ •ຖேrails/railsͷIssue or PRΛ1ͭҎ্ݟΔ •Կ΋Θ͔Βͳ͍ •ʮXXͬͯԿʁʯͰऴΘΔே΋Α͋͘Δ •Θ͔Βͳ͍΋ͷʢ∞ʣ͕۩ମԽ͞ΕΔ •ʮΘ͔ΒΜʯʮ͜Θ͍ʯͱ͍͏യવͱͨۤ͠खҙ͕ࣝͳ͘ͳΔ ✨

Slide 65

Slide 65 text

ΈΜͳ༏͍͠

Slide 66

Slide 66 text

TokyoGirls.rb vol.1࠙਌ձ 5PLZP(JSMTSC.FFUVQWPMͷ࠙਌ձͰΑ͏͞ΜʹΊͬͪΌΞυόΠεΛ௖͍͓ͨ࿩NBLJDBNFMͷ೔ه
 IUUQTNBLJDBNFMIBUFOBCMPHDPNFOUSZ ɹGibierͬͯ͘͢͝໘ന͍ͱࢥ͍·ͨ͠ʂ ɹͨͩɺ͏·͘ىಈͰ͖ͳͯ͘ ɹͦ͏ͳΜͰ͢Ͷɻͥͻݟ͍ͤͯͩ͘͞ʂ @youchan ɹࣗ෼͕ؒҧͬͯΔΜͩͱࢥ͏ΜͰ͚͢Ͳ… ɹͦΕ͸ͦΕͰɺ͜Μͳ෩ʹϛε͠΍͍͢Μͩͳͬͯ ɹࢀߟʹͳΔ͔Βେৎ෉Ͱ͢Α ༏͍͠

Slide 67

Slide 67 text

·ͱΊ •OSS։ൃ͸ಛผͳ͜ͱ͡Όͳ͍ •Θͨͨͪ͠͸࢓ࣄͰ΋େมͳ͜ͱΛ΍͍ͬͯΔ •ܧଓతʹؔΘΔ͚͕ͩOSS΁ͷؔΘΓํ͡Όͳ͍ •ίϯςΩετ͕Θ͔Βͳ͍ͱେมͳ͜ͱ͸ଟ͍ •Θ͔Βͳ͍ͳΒ஌Ε͹͍͍ •ΈΜͳ༏͍͠

Slide 68

Slide 68 text

޷͖ͳϦϙδτϦΛ։͍ͯΈΔ

Slide 69

Slide 69 text

•RailsίϯτϦϏϡʔγϣϯ͔ΒֶΜͩGit/GitHubज़ - @koic
 https://speakerdeck.com/koic/commit-message-will-never-die •OSSͰ݁ՌΛग़͢ํ๏ - @knu
 https://speakerdeck.com/knu/ossdejie-guo-wochu-sufang-fa •RailsͷissueΛղܾ͢Δ·ͰͷखॱͱOSSॳ৺ऀͰ΋Ͱ͖Δ͜ͱ - @sinsoku
 https://sinsoku.hatenablog.com/entry/2019/10/17/013415 •RubyྗΛ্͛ΔͨΊͷίʔυϦʔσΟϯά - @kinoppyd
 https://docs.google.com/presentation/d/1de64myiozcpiS18fvrmmlYLhXdl0y_qlUc-2TGZkNhY/ edit#slide=id.g74005e1fbe_2_29 •OSSߩݙ௒ೖ໳ - @shigemk2
 https://www.slideshare.net/shigemk2/oss-78585757 ࢀߟ

Slide 70

Slide 70 text

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