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

OSS is great but not special

makicamel
December 21, 2019

OSS is great but not special

いつもの開発のようにOSS開発をしよう at TokyoGirls.rb Meetup vol.2

makicamel

December 21, 2019
Tweet

More Decks by makicamel

Other Decks in Programming

Transcript

  1. ͍ͭ΋ͷ։ൃͷΑ͏ʹ

    044։ൃΛ͠Α͏
    2019.12.21.
    TokyoGirls.rb Meetup vol.2
    @makicamel

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. ࠓ೔ͷλΠτϧ

    View full-size slide

  6. ͍ͭ΋ͷ։ൃͷΑ͏ʹ

    044։ൃΛ͠Α͏
    ࠓ೔ͷλΠτϧ

    View full-size slide

  7. ͍ͭ΋ͷ։ൃͷΑ͏ʹ

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

    View full-size slide

  8. ͍ͭ΋ͷ։ൃͷΑ͏ʹ

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

    ͋ͷίʔυ·ͩಡΜͰͳ͍

    View full-size slide

  9. ͍ͭ΋ͷ։ൃͷΑ͏ʹ

    044։ൃΛ͠Α͏
    Ͱ΋ݴ͏

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. Devise
    QMBUBGPSNBUFDEFWJTF3&"%.&NEc(JU)VC

    IUUQTHJUIVCDPNQMBUBGPSNBUFDEFWJTFCMPCCBDDEBCFGFBEGF3&"%.&NE
    ೝূͷଟػೳGem

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 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

    View full-size slide

  18. Devise ?
    gem "devise"
    gem "devise_token_auth"

    View full-size slide

  19. DeviseTokenAuth
    MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC

    IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUI
    •APIαʔό޲͚ೝূ༻Gem
    •DeviseͷػೳΛ׆༻
    •Deviseͱซ༻Մ
    README
    FAQ

    View full-size slide

  20. DeviseTokenAuth
    MZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIc(JU)VC

    IUUQTHJUIVCDPNMZOOEZMBOIVSMFZEFWJTF@UPLFO@BVUIJTTVFT

    View full-size slide

  21. 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

    View full-size slide

  22. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

  26. Ͳ͏ͯ͠ΦʔόʔϥΠυͯ͠Δͷʁ
    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

    View full-size slide

  27. 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͍ͨ͠

    View full-size slide

  28. 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ͨ͘͠ͳ͍

    View full-size slide

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

    View full-size slide

  30. 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

    View full-size slide

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

    View full-size slide

  32. 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?

    View full-size slide

  33. 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ϞδϡʔϧͷڍಈΛมߋ͠ͳ͍

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. ޙํޓ׵ੑ
    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
    ϝʔϧૹ৴ϑϥά

    View full-size slide

  37. ޙํޓ׵ੑ
    # 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ͷςϯϓϨʔτʹઃఆ஋Λ௥Ճ
    ͜ͷઃఆ஋͕͋Δཧ༝΋
    Ұݴఴ͑ͨ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  40. ςετͷ௥Ճ
    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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  44. ૬ஊ
    •codeclimateʹࢦఠΛड͚Δ

    View full-size slide

  45. ૬ஊ
    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
    ɹࣅͨॲཧ͕͋Δͱ͍͏ࢦఠ
    ɹॲཧ͕ࣅͨίʔυϒϩοΫ

    View full-size slide

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

    View full-size slide

  47. ૬ஊ
    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ʹ͖ͯͬ͢͠Γ

    View full-size slide

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

    View full-size slide

  49. ;ͭ͏ͬΆ͍

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    IUUQTTJOTPLVIBUFOBCMPHDPNFOUSZ
    @sinsoku

    View full-size slide

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

    View full-size slide

  63. ΈΜͳ༏͍͠

    View full-size slide

  64. TokyoGirls.rb vol.1࠙਌ձ
    5PLZP(JSMTSC.FFUVQWPMͷ࠙਌ձͰΑ͏͞ΜʹΊͬͪΌΞυόΠεΛ௖͍͓ͨ࿩NBLJDBNFMͷ೔ه

    IUUQTNBLJDBNFMIBUFOBCMPHDPNFOUSZ
    ɹGibierͬͯ͘͢͝໘ന͍ͱࢥ͍·ͨ͠ʂ
    ɹͨͩɺ͏·͘ىಈͰ͖ͳͯ͘
    ɹͦ͏ͳΜͰ͢Ͷɻͥͻݟ͍ͤͯͩ͘͞ʂ
    @youchan ɹࣗ෼͕ؒҧͬͯΔΜͩͱࢥ͏ΜͰ͚͢Ͳ…
    ɹͦΕ͸ͦΕͰɺ͜Μͳ෩ʹϛε͠΍͍͢Μͩͳͬͯ
    ɹࢀߟʹͳΔ͔Βେৎ෉Ͱ͢Α
    ༏͍͠

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  67. •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
    ࢀߟ

    View full-size slide

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

    View full-size slide