OSS is great but not special

Cfbe23392787cb3ad4689c5f72463fcc?s=47 makicamel
December 21, 2019

OSS is great but not special

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

Cfbe23392787cb3ad4689c5f72463fcc?s=128

makicamel

December 21, 2019
Tweet

Transcript

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

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

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

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

  5. ࠓ೔ͷλΠτϧ

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

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

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

    ·ͩ͋ͷຊੵΜͩ··ͩ͠ ͜ΜͳͻΑ͕ͬ͜ ɹɹͳΜͯλΠτϧΛ… ͋ͷίʔυ·ͩಡΜͰͳ͍
  9. ͍ͭ΋ͷ։ൃͷΑ͏ʹ
 044։ൃΛ͠Α͏ Ͱ΋ݴ͏

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

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

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

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

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

  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 •ઐ༻ͷΧϥϜ௥Ճ •ઃఆ
  16. Devise current_user.update!(email: user_params[:email]) •৽͍͠஋Λอଘ͢Ε͹ϝʔϧ͕ૹ৴͞ΕΔ Կ΋ى͖ͳ͍

  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
  18. Devise ? gem "devise" gem "devise_token_auth"

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

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

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

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

  25. ͓Ϛʔδ

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

  27. Ͳ͏ͯ͠ΦʔόʔϥΠυͯ͠Δͷʁ 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
  28. 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͍ͨ͠
  29. 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ͨ͘͠ͳ͍
  30. •DeviseͰ࢖͍ͬͯΔmodule͸2Օॴ •Validatable •Confirmable →ৗʹfalseΛฦ͍ͨ͠ →super͍ͨ͠ will_save_to_change_email?

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

  33. 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?
  34. 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ϞδϡʔϧͷڍಈΛมߋ͠ͳ͍
  35. ͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ

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

  37. ޙํޓ׵ੑ 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 ϝʔϧૹ৴ϑϥά
  38. ޙํޓ׵ੑ # 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ͷςϯϓϨʔτʹઃఆ஋Λ௥Ճ ͜ͷઃఆ஋͕͋Δཧ༝΋ Ұݴఴ͑ͨ
  39. ͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ , •Ϛʔδ͞ΕΔ౒ྗ

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

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

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

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

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

  46. ૬ஊ 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 ɹࣅͨॲཧ͕͋Δͱ͍͏ࢦఠ ɹॲཧ͕ࣅͨίʔυϒϩοΫ
  47. ૬ஊ ɹDeviseͷݩͷ࣮૷͕͜ͷܗͰɺ͋Θͤͨํ͕ ɹΦʔόʔϥΠυͨ͠ࣄ͕Θ͔Γ΍͍͍͔ͯ͘͢ͱࢥͬͨΜ͚ͩͲ ɹͲ͏ࢥ͏ʁ ɹϦϑΝΫλ͍ͨ͜͠͠ͷmodule͕੹຿Λ࣋ͪ͗ͯ͢ΔͷͰ ɹผmoduleʹ੾Γग़͍ͨ͠ͳʂ

  48. ૬ஊ 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ʹ͖ͯͬ͢͠Γ
  49. ͜ͷPRͰ΍ͬͨ͜ͱ •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ , •Ϛʔδ͞ΕΔ౒ྗ

  50. None
  51. ;ͭ͏ͬΆ͍

  52. •ௐࠪɾमਖ਼ •ޙํޓ׵ੑͷҡ࣋ •ςετͷ௥Ճ •Ϛʔδ͞ΕΔ౒ྗ ͜ͷPRͰ΍ͬͨ͜ͱ ઃܭͷཧղ Өڹൣғͷ֬ೝ ྺ࢙తܦҢͷ೺Ѳ طଘ&৽نϢʔβ΁ͷ഑ྀ ૬ஊ

    ૬खͷෛ୲ΛݮΒ͢ ʮ͜ͷίʔυͳΒೖΕͯ΋େৎ෉ʯ σάϨΛى͜͞ͳ͍ কདྷͷσάϨΛੜ·ͳ͍ νʔϜن໿Λ஌Δ Ϧϯτʹै͏ ؔ࿈Gemͷ֬ೝ υΩϡϝϯτ ςϯϓϨʔτ
  53. ͍ͭ΋΍ͬͯΔ͜ͱͱಉ͡ 044։ൃͰ΋ಛผ͡Όͳ͍

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

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

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

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

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

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

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

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

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

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

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

  65. ΈΜͳ༏͍͠

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

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

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

  69. •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 ࢀߟ
  70. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠