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

  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 MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@BVUI •APIαʔό޲͚ೝূ༻Gem •DeviseͷػೳΛ׆༻ •Deviseͱซ༻Մ README FAQ

  20. DeviseTokenAuth MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@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 # ... MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@BVUICMPC BGDCBEFCEBFFFBQQNPEFMT[email protected]@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 # ... MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@BVUICMPC BGDCBEFCEBFFFBQQNPEFMT[email protected]@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? && [email protected]_confirmation_postpone && self.email.present? && ([email protected]_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 [email protected][email protected]EJSUZSC
  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 && [email protected]_confirmation_postpone && self.email.present? && ([email protected]_reconfirmation_in_callback || !email_value_in_database.nil?) @bypass_confirmation_postpone = false postpone end end will_save_to_change_email?Λ email_in_database != emailͰ࠶࣮૷ ˞ɹ[email protected]@[email protected]͸3BJMTͷόʔδϣϯʹԠͨ͡[email protected]@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 # ... MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@BVUICMPC BGDCBEFCEBFFFBQQNPEFMT[email protected]@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 •༨ஊͰ͕͢ઃఆ஋ͷςετͷ΍Γํ͕Θ͔Βͳ͔ͬͨͷͰ
 ࠙਌ձͰΞυόΠε͍͚ͨͩΔͱخ͍͠Ͱ͢ʂ MZOOEZMBOIVSMFZ[email protected]@BVUIc(JU)VC
 IUUQTHJUIVCDPNMZOOEZMBOIVSMFZ[email protected]@BVUICMPC BGDCBEFCEBFFFUFTUEVNNZBQQ[email protected][email protected]SC
  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? && [email protected]_confirmation_postpone && self.email.present? && ([email protected]_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? && [email protected]_confirmation_postpone && self.email.present? && ([email protected]_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

    && [email protected]_confirmation_postpone && self.email.present? && ([email protected]_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. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠