Share
Embed
Simplicity on Rails -- RDB, REST and Ruby
Kaigi on Rails 2023の登壇資料です。
https://kaigionrails.org/2023/talks/moro/
実世界のRailsアプリケーションをシンプルに保つための方法を、Railsが提供する機能群をもとに考察します。
実世界の、特に仕事で開発するRailsアプリへの要求は様々のものがあり、Railsの豊富な機能群をもっても日々苦労して開発しているかと思います。 そんな中でも、Railsが得意とするような設計に落とし込むことで、複雑な要求をシンプルな実装で実現できると感じています。
本講演では、Railsが提供する機能のうち、「RDB」「REST」「Ruby」という要素を軸に、実世界の要求をシンプルに実装するための考え方を紹介します。
MOROHASHI Kyosuke
October 27, 2023
Transcript
54 slides
-
“ • : • 時 存在 、存在 <登録> •名前 持
。 • 扱 「時」 扱 「時」 違 、 瞬間 刻印 、 有効 存在 期間 表現 。 • : •繰 返 ⾏ ⾏為。 時起 <記録> •例) ⼊荷、発注、etc •時刻 ( ) 持 。 •多 場合、 使 ⾏ •名前 ( ⾃体 ⾏為 名前 ) 持 %#ઃܭษڧձ λϫʔζΫΤετࣾాলೋ͞ΜΛઌੜʹΉ͔͑ͨษڧձͷϝϞ IUUQTHJTUHJUIVCDPNTVOBPU -
ྫ,BJHJͷΤϯςΟςΟ conferences id name location start_at end_at *timestamps users id
name *timestamps registrations id conference_id user_id *timestamps -
,BJHJͷϦιʔεΤϯςΟςΟ w ΠϕϯτࢀՃొαʔϏεΛఆ͢Δ w DPOGFSFODFTͱVTFSTͱ͍͏ϦιʔεΤϯςΟςΟ͕͋ΓɺଟରଟͷؔʹͳΔ w ϢʔβʔɺෳͷΧϯϑΝϨϯεʹࢀՃͰ͖Δ w ΧϯϑΝϨϯεɺෳͷϢʔβʔ͕ࢀՃͰ͖Δ w
3%#ͰଟରଟΛදݱ͢Δʹɺ྆ऀΛࢀর͢ΔΤϯςΟςΟΛಋೖ͢Δ conferences id name location start_at end_at *timestamps users id name *timestamps -
“ ⾃体 独⽴ 扱 場合 、中間 join 使 has_many
:through 設定 。 何 特別 必要 場合 、join 不要 has_and_belongs_to_many 使 ⽅ 。 3BJMTΨΠυ"DUJWF3FDPSEͷؔ࿈͚ IBT@NBOZUISPVHIͱIBT@BOE@CFMPOHT@UP@NBOZͷͲͪΒΛબͿ͔ IUUQTSBJMTHVJEFTKQBTTPDJBUJPO@CBTJDTIUNM -
ϦϨʔγϣϯγοϓϞσϧࣗମΛ ಠཱͨ͠ΤϯςΟςΟͱͯ͠ѻ͍͍ͨ w ΠϕϯτΤϯςΟςΟΛݟग़͢͜ͱɺͦΕΛIBT@NBOZUISPVHIͰ ͏͜ͱ͕ɺશମͷγϯϓϧ͞Λอͭͷʹཱͪ·͢ w ʮϦϨʔγϣϯγοϓϞσϧͰԿ͔ಛผͳ͜ͱΛ͢Δඞཁ͕·ͬͨ͘ͳ͍ ߹ʯ͘͝গͳ͍
w ϦιʔεΤϯςΟςΟͰଟରଟΛදݱ͢Δ͚ͩͳΒ͋Δ͔͠Εͳ͍͚Ͳʜ w ޙड़͢ΔUISPVHIͷػೳڧԽ͋Γɺগͳ͘ͱऀ͜͜·ͬͨ͘IBCUNΛͬͯ·ͤΜͶ -
3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ w ࠷ॳͷ࠷ॳIBCUN͜ͱIBT@BOE@CFMPOHT@UP@NBOZؔ࿈͚͕ͩ͋ͬͨ w 3BJMTͷஈ֊ͰɺIBT@NBOZUISPVHI͕Ճ͞Εͨ w ͦͷ͋ͱɺIBT@POFUISPVHICFMPOHT@UPUISPVHIͳͲɺ UISPVHIོ͕ΛۃΊ͍ͯΔ w
υϝΠϯͷදݱͱͯ͠༏Ε͍ͯΔ ͖ΐ͏ͬͪ͜ͷ w ػೳతʹUISPVHIͷUISPVHIͳͲͰؔ࿈Λ୧ΕΔͷ͕ͪΐ͏ศར͡Όͳ͍Ͱ͔͢ "3εΰΠ -
ΠϕϯτΤϯςΟςΟΛݟग़ͯ͠ɺ͏ w ΠϕϯτΤϯςΟςΟΛݟग़͠ɺUISPVHIͰࢦఆͯ͠ଟରଟͷؔΛ࡞Δ w ࣮ੈքͷαʔϏεͰɺ͜ͷΠϕϯτΤϯςΟςΟ͕Ͱ͖Δ͜ͱ͕ɺ ॏཁͳίϯόʔδϣϯϙΠϯτʹͳ͍ͬͯΔ͜ͱଟ͍ w ྫΧϯϑΝϨϯεࢀՃొαΠτʹ͓͚Δʮొʯ w
ΧϯϑΝϨϯεͱϢʔβʔɺ୯ʹଟରଟͳͷͰͳ͘ʮొ͍ͯ͠Δʯ͕ؔ͋Δͷͩ w ͦͯͦ͠ͷׂʹɺ׳Εͳ͍ͱൃݟͮ͠Β͍ w ऀɺӋੜষ༸ʮָʑ&3%Ϩοεϯʯ ᠳӭࣾ Ͱֶͼ·ͨ͠ɻIUUQTXXXTFTIPQDPNQSPEVDUEFUBJM -
ొͨ͠ίτSFHJTUSBUJPOT w 6TFS͕$POGFSFODFʹࢀՃొͨ͠ίτɺΛΠϕϯτΤϯςΟςΟͱͯ͠ ه͢Δɻ͜ͷ߹SFHJTUSBUJPOͳͲ w ͜Ε͕IBT@NBOZUISPVHIͰࢦఆ͢ΔςʔϒϧʹͳΔɻ w IBCUNͷதؒςʔϒϧͱҧͬͯJEΛ࣋ͭΤϯςΟςΟͱͯ͠ѻ͏ conferences
id name location start_at end_at *timestamps users id name *timestamps registrations id conference_id user_id *timestamps -
ొͨ͠ίτSFHJTUSBUJPOT class User < ApplicationRecord has_many :registrations has_many :conferences, through:
:registrations end class Registration < ApplicationRecord belongs_to :user belongs_to :conference end conferences id name location start_at end_at *timestamps users id name *timestamps registrations id conference_id user_id *timestamps -
ΠϕϯτΤϯςΟςΟΛݟग़͢ͱͰ͖Δ͜ͱ UserMailer.registration_accepted(@user, @conference, at: Time.current).deliver_later # => #{@user.name}༷ɺ#{I18n.l(at)}ʹ#{@conference}ͷࢀՃΛड͚͚·ͨ͠ UserMailer.registration_accepted(@registration).deliver_later w
SFHJTUSBUJPOΛݟग़͍ͯ͠ͳ͍߹ɺ!VTFSͱ!DPOGFSFODFɺλΠϜελϯϓΛݸผʹ࣋ͪճΔඞཁ͕͋Δ w !VTFS΄Μͱʹ!DPOGFSFODFొ͍ͯ͠Δ ࠶νΣοΫͨ͘͠ͳΒͳ͍ w λΠϜελϯϓ΄ΜͱʹDVSSFOUͰ͍͍ ϦτϥΠ͢Δͱ͖Ͳ͏͢Δ w SFHJTUSBUJPO͕͋Εɺʮొͨ͠ίτʯΛίʔυ্Ͱͦͷ··औΓճͤΔ w VTFSͱDPOGFSFODFΛ୧ΕΔɻ྆ऀΛ୧ΕΔ͜ͱɺ%#ͷࢀর߹ੑ੍Ͱࢧ͑ΒΕΔ w SFHJTUSBUJPOTDSFBUFE@BUΛొ࣌ͱΈͳͤΔ υϝΠϯͰେࣄͳʮొͨ͠ίτʯΛίʔυ্ʹදݱͰ͖Δ -
ଓΠϕϯτΤϯςΟςΟΛݟग़͢ͱͰ͖Δ͜ͱ w SFHJTUSBUJPOTʹΧϥϜΛՃͯ͠ɺՃใΛͨͤΒΕΔ w ొ൪߸ͱ͔ɺొ࣌ͷਃ͠ૹΓAOPUFAͱ͔ɺొछผ ݱࢀՃYPSΦϯϥΠϯࢀՃ ͱ͔ w ޙଓΠϕϯτͷϨίʔυʹͳΕΔ w
ྫࢀՃඅ༻Λܾࡁͨ͠ίτQBZNFOUT ʹࢀՃͨ͠ίτBUUFOEBODFTͳͲ w ACFMPOHT@UPSFHJTUSBUJPOAͳ"3ϞσϧͱͳΔ w ొͨ͜͠ͱࣗମΛهͰ͖Δ w ࠪϩάʹͨ͠Γɺίϯόʔδϣϯܦ࿏ͷϩάʹͨ͠Γͱ͔ -
༨ஊ໋໊ʹ໎͏߹ w ಈࢺͷ໊ࢺܗΛ͏͜ͱ͕ଟ͍ɻSFHJTUSBUJPOBUUFOEBODF w Ͳ͏ͯͬ͘͠͠Γ͜ͳ͚ΕݱࡏࢺΛ͔ͭ͏͜ͱ͋ΔSFHJTUFSJOH w ໊લॏཁɺͳͷ͚ͩͲલఏͱͯ͠ɺ͜ͷ֓೦Λݟग़͢͜ͱ͕ͬͱॏཁ w ͳͷͰɺ໊લ͕ࢥ͍͔ͭͳ͍߹ͰఘΊͳ͍Ͱ w
༨ஊͷ༨ஊͰɺBQQMZͨ͜͠ͱɺΛදݱ͢Δͱ͖ࠔΓ·͢ΑͶɻ"QQMJDBUJPOͯɻ -
4JNQMJDJUZPO3BJMT ɹ3%# ɹ3&45 ɹ3VCZ w ίτΛ3&45Ϧιʔεͱͯ͠ఆٛ͠ɺ αʔϏεͷػೳΛͦͷ$36%Ͱදݱ͢Δ w
ίτͷૢ࡞ͷͨΊͷঢ়ଶભҠɺ63-ͷ ΞΫηεͰදݱ͢Δ -
3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ w ϧʔςΟϯάΛఆٛ͢Δखஈͱͯ͠ɺΓDPO fi HSPVUFTSCͰ ASFTPVSDFTAASFTPVSDFAએݴΛ͏ͷ͕͍͍ΜͰ͠ΐ͏Ͷ w ੲ͔ΒҰ؏ͯ͠·͢͠Ͷʜ w ͱ͍͑ʮϦιʔεͳΔͷΛ)551ܦ༝Ͱ$36%͢Δʯͱ͍͏
ϚΠϯυηοτ͕Ή͔͍ͣ͠ w ͳΜ͔ ༨ܭͳͷΛؚΊ ͨ͘͞ΜϧʔςΟϯάఆٛ͢ΔϚΫϩΈ͍ͨͳѻ͍ʹͳͬͯΔ -
ίτΛϦιʔεͱͯ͠ѻ͏ resources :conferences do resource :registration, only: [:new, :create] end
resources :registrations w ͜ͷྫͰɺΧϯϑΝϨϯεʹࢀՃొͰ͖Δͷճ͚ͩొܥͷ SFHJTUSBUJPO୯SFTPVSDF ొͷ63-ΛΦγϟϨʹωετ͢ΔͷΛ ΊΔͱͬͱγϯϓϧʹͰ͖Δ -
ίτΛϦιʔεͱͯ͠ѻ͏ w લड़ͷྫʮࢀՃొ͢Δ͜ͱSFHJTUSBUJPOʯΛϦιʔεͱͯ͠දݱ͢Δɻ w ࢀՃొ͢ΔSFHJTUSBUJPOTDSFBUF w ྫA1045DPOGFSFODFTLBJHJPOSBJMTSFHJTUSBUJPO w ొ༰ͷ֬ೝSFHJTUSBUJPOTTIPX w
ྫA(&5SFHJTUSBUJPOTJEA w ొ༰ͷߋ৽SFHJTUSBUJPOTVQEBUF -
ൺֱ༻3&45͡Όͳ͍߹ʹΑ͘ݟΔͭ resources :conferences do # POST /conferences/:conference_id/register # => conferences#register
post :register end w A$POGFSFODFT$POUSPMMFSSFHJTUFSAΞΫγϣϯΛఆٛͯ͠͠·͏ w ͕૿͑ΔͱϧʔςΟϯάෳࡶͳΔ͠ɺ$POGFSFODFT$POUSPMMFSංେԽ͢Δ -
ίτΛOFX͢Δ w OFXFEJUͷϧʔςΟϯάఆٛ͞ΕΔ͕ɺෆཁͳΒΘͳͯ͘ྑ͍ w ΧϯϑΝϨϯεৄࡉϖʔδ ADPOGFSFODFTTIPXA ͔ΒϘλϯΛԡ͚ͩ͢Ͱొྃ͢Δ߹ɺ ASFHJTUSBUJPOTDSFBUFAʹαϒϛοτͯ͠Α͍ w ϑΥʔϜΛ+4ͰؤுΔ߹ಉ༷ʹɺ+4ʹ1045͖͢63-Λͯ͠1045ͤ͞ΕΑ͍
w ͷͪͷͪొը໘͕΄͘͠ͳͬͨΒɺASFHJTUSBUJPOTOFXAΛ͏ w ֬ೝը໘ʮొͯ͠ΑΖ͍͠Ͱ͔͢ ʯΈ͍ͨͳͷΛग़͍ͨ͠߹ͱ͔ w ࢀՃܗଶඋߟͳͲՃใͷೖྗ͍ͤͨ͞߹ͱ͔ -
ΞϓϦέʔγϣϯঢ়ଶͷભҠ w ΞϓϦέʔγϣϯঢ়ଶͷભҠΛɺίτͷϦιʔεʹ·ͭΘΔϖʔδભҠͰ දݱ͢Δ w ྫʮΧϯϑΝϨϯεৄࡉදࣔʯঢ়ଶͰɺొϘλϯΛදࣔ͢Δɻ ϘλϯΛԡ͢ͱʮొ࣌ใͷೖྗͪʯঢ়ଶʹભҠ͢Δ w
͜ΕΛAB<ISFGDPOGFSFODFTLBJHJPOSBJMTSFHJTUSBUJPOOFX>AͳϦϯΫΛఏࣔ͢Δ͜ͱɺ ͦΕ୧ͬͯΒ͏͜ͱͰදݱ͢Δ w ASFTPVDFTAએݴ͜ͷঢ়ଶભҠͷϧʔςΟϯάఆٛͯ͘͠Ε͍ͯΔ -
͞ΒʹʮίτʯΛϦιʔεͱͯ͠ΈΔ w ࢧ͍ͯ͠΄͍͠ࢧ͍ͱ͍͏ίτΛ࡞ͬͯཉ͍͠ w A(&5SFHJTUSBUJPOTSFHJTUSBUJPO@JEQBZNFOUOFXAͰࢧ͍ҊΛදࣔ͠ w ͔Βͷɺܾࡁ͍ͨ͡ಋઢ֎෦αʔϏε࿈ܞ͠ w ͬͯ͘ΔA(&5SFHJTUSBUJPOTSFHJTUSBUJPO@JEQBZNFOUAͰࢧ͍ྃͷࢫΛදࣔ͢Δ w
༧ఆͷΩϟϯηϧɺA$BODFMMBUJPOAΛDSFBUF͢Δͱߟ͑ΒΕΔ͠ɺ A3FHJTUSBUJPOAΛEFTUSPZ͢Δͱߟ͑ΒΕΔ w ͜ͷ͋ͨΓΩϟϯηϧϙϦγʔʹΑͬͯߟ͑ΒΕΔ w ରαʔϏεʹͱͬͯԿ͕ద͔ɺߟ͑·͠ΐ͏ w ࢧ͍ͳ͠ͳΒ3FHJTUSBUJPOΛEFTUSPZɺࢧ͍ࡁΈͩͬͨΒฦۚϦΫΤετΛOFX͢Δɺͱ͔ -
༨ஊ%#ʹؔͳ͍ʮίτʯͷ$36% w ϩάΠϯϩάΞτΛʮηογϣϯͷDSFBUFEFMFUFʯͱͯ͠ දݱ͢Δ׳शɺDPPM͡Όͳ͍Ͱ͢ w ϩάΠϯը໘ͱͭ·ΓTFTTJPOTOFX͢Δը໘Ͱ͋Γ w ϩάΠϯ͢Δ͜ͱTFTTJPOTDSFBUFͰɺ
w ϩάΞτ͢ΔͱTFTTJPOTEFTUSPZ͢Δ͜ͱͳͷͩɻ -
4JNQMJDJUZPO3BJMT ɹ3%# ɹ3&45 ɹ3VCZ w ίτΛ3&45Ϧιʔεͱͯ͠ఆٛ͠ɺ αʔϏεͷػೳΛͦͷ$36%Ͱදݱ͢Δ w
ίτͷૢ࡞ͷͨΊͷঢ়ଶભҠɺ63-ͷ ΞΫηεͰදݱ͢Δ -
3BJMTͰ3&45GVMͳೖྗΛӬଓԽ͢Δ*' # POST /conferences/:conference_id/registration def create @registration = current_user.registrations.build( conference:
Conference.find_by!(name: params[:conference_id]) ) @registration.save! end -
3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ w "3#BTFͷΦϒδΣΫτΛੜ͢Δͱ͖ͷΠϯλʔϑΣʔε͕͜Ε w ͷͪʹಉ༷ͷ*'Λ࡞ΔͨΊͷ"DUJWF.PEFM ҎԼ".P ग़͍ͯΔ w ͞ΒʹదʹೖྗΛߜΔͨΊͷػߏͱͯ͠4USPOH1BSBNFUFST͋Δ w
͍ΖΜͳํ͕ࣜ͋Δ͏ͪɺNBTTBTTJHONFOUͱ૬ੑͷྑ͍͕ͭ࠾༻͞Εͨ ΤϯτϦϙΠϯτʹBUUSJCVUFTͷ)BTI ͷΑ͏ͳͷ Λͯ͠ NBTTBTTJHONFOU͠ɺϑΝαʔυΛݺͿͷ͕جຊߏ -
ྫ͑ొ࣌ʹऔΔใΛ૿͢ def create @registration = current_user.registrations.build( conference: Conference.find_by!(name: params[:conference_id]), **params.require(:r10n).permit(:note,
:attend_type) ) @registration.save! end උߟ OPUF ͱࢀՃछผ BUUFOE@UZQF*/@1&340/c0/-*/& ͱΛ ೖྗՄೳʹͯ͠ΈΔ w ༨ஊ"$1BSBNFUFSTUP@IBTIΛ Ͱͯ͠ύϥϝʔλΛՃ͢Δͭɺॻ͖ຯ͕ྑ͖ͯ͘Ͱ͢ SOʹSFHJTUSBUJPOͷུͰ͢ -
ίϯτϩʔϥͰ͍͍͚ͬͯͲʜ def create @registration = current_user.registrations.build( conference: Conference.find_by!(name: params[:conference_id]), **params.require(:r10n).permit(:note,
:attend_type) ) @registration.save! UserMailer.registration_accepted(@registration).deliver_later OrganizerMailer.registration_accepted(@registration).deliver_later if @registration.attend_type.in_person? SeatAllocationJob.perform_later(@registration) … rescue ActiveRecord::RecordInvalid => ex ... end -
".PΛͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ͢ w ͦͷΦϒδΣΫτͰೖྗηοτͷଥੑΛݕূ͢Δ w ೖྗ͕ଥͰͳ͍߹ɺαʔϏεར༻ऀʹݟͤΒΕΔΤϥʔϝοηʔδΛੜ͢Δ w ଥͰ͋Δ߹ɺΓ͍ͨॲཧͷϑΝαʔυͱͳΔϝιουΛ࣮ߦ͢Δ w
ͭ·ΓϑΥʔϜΦϒδΣΫτͱ͍͏͔αʔϏεΫϥεͱ͍͏͔ͷಋೖ w ϑΥʔϜͱݺশ͢Δ΄͏͕Έ w ͜ͷͷೖྗɺϢʔβʔೖྗͷܗɺ͢ͳΘͪϑΥʔϜͱҰக͓ͤͯ͘͞ͱָͩͱࢥ͏ͨΊ w ࣮༻্ՌͷूϧʔτͱͳΔΦϒδΣΫτͷΞΫηα͋Δͱศར -
def create @form = RegistrationForm.new( user: current_user:, conference: Conference.find_by!(name: params[:conference_id])
**params.require(:r10n).permit(:note, :attend_type) ) @form.call redirect_to form.registration rescue ... ".PΛͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ ʮ3FHJTUSBUJPO'PSNొϑΥʔϜΛද͢ΦϒδΣΫτͰ͢ʯ -
class RegistrationForm < ApplicationForm attribute :user, :conference, :note, :attend_type validates
:attend_type, inclusion: {in: ...} attr_reader :registration def call @registration = user.registration.create!(...) notify_registration! if @registration.attend_type.in_person? SeatAllocationJob.perform_later(@registration) ".PΛͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ ".P.PEFMͱ͔".P"UUSJCVUFͱ͔Λ JODMVEFͨ͠ബ͍εʔύʔΫϥε -
͓͓ΉͶ;ͭ͏ͷ3VCZ0CKFDU w ".PΛͬͯΔͷͰ1MBJO0MEͱݴ͑ͳ͍͔͠Εͳ͍͚Ͳ w Ͱ;ͭ͏ͷ3VCZΦϒδΣΫτͱͯ͠ѻ͍͍͢Ͱ͢ΑͶ w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ͢ w Γ͍ͨॲཧͷϑΝαʔυͱͳΔϝιουΛ࣮ߦ͢Δ
w ͔ͦ͜Β͞ΒʹෳࡶʹͳͬͨΒ3VCZͱͯ͠ෳࡶ͞ʹ͖߹͑ྑ͍ w ΈΜͳେ͖03.Ͱ͋Δ"DUJWF3FDPSE͑Δ -
;ͭ͏ͷ30ͳͷͰࣗಈςετॻ͖͍͢ w "SSBOHFηοτΞοϓ w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ͢ w "DUॲཧ࣮ߦ w ϑΝαʔυΛݺͼग़ͯ͠ॲཧͷҰ࿈͕Δ w
"TTFSU݁Ռݕূ w ࡞Γ͍ͨσʔλͷूϧʔτʹΞΫηεͰ͖ΔͷͰɺ ͔ͦ͜ΒҰ࿈ͷσʔλάϥϑ͕ҙਤ௨ΓͰ͖͍ͯΔ͔ΛݕূͰ͖Δ w όϦσʔγϣϯΤϥʔʹͳΔೖྗύλʔϯՃ͍͢͠ w ޙॲཧ͕࣮ߦ͞ΕΔ͔ͳͲςετͰ͖Δ -
ίτͷDSFBUFͱ%#ӬଓԽͱͷؒ w 3FHJTUSBUJPOT$POUSPMMFSDSFBUFΛड͚ΔΞΫγϣϯͱͯ͠ɺ */4&35JOUPSFHJTUSBUJPOTҎ֎ͷ͜ͱ·Ͱ͍͍ͬͯͷ w ͦͷαʔϏεͷͱͯ͠ʮࢀՃొ͢Δ͜ͱʯਵ͢ΔॲཧͰ͋Ε͍͍ͬͯ w Ή͠ΖΔ͖
w 3FHJTUSBUJPOϦιʔεͷDSFBUFɺʰαʔϏεར༻ऀͷߟ͑Δʮొ͢Δ͜ͱʯʱΛද͍ͯ͠Δ w ҧײ͕ग़͖ͯͨΒɺίʔυͷ༷ࢠΛΈͯநग़͍ͯ͘͠ w 3VCZͳͷͰ w ΠϯλʔϑΣʔε͕҆ఆ͓ͯ͠Γςετॆ࣮͍ͤ͢͞ͷͰɺϦϑΝΫλϦϯά͍ͣ͢͠ -
ඞͣ͠શ෦Λͭͷ'0ʹೖΕͳ͘ͱྑ͍ w ॻ͍ͯΈΔͱɺϑΥʔϜΦϒδΣΫτʹͯ͢Λ٧ΊΔʹҧײ͕ ͋Δ͜ͱ͋Δ w ͬͺΓϝʔϧίϯτϩʔϥͰૹΓͨ͘ͳΔ͔͠Εͳ͍ɺͱ͔ w ॻ͍ͨॳྑͯ͘ɺػೳՃͰมΘͬͯ͘Δ͜ͱ͋Δ w
͚ͨ͘ͳͬͨͱ͖ɺॊೈʹநग़͍ͯ͘͠ w 3VCZͳͷͰ w ΠϯλʔϑΣʔε͕҆ఆ͓ͯ͠Γςετॆ࣮͍ͤ͢͞ͷͰɺϦϑΝΫλϦϯά͍ͣ͢͠ -
3BJMTͷؾ࣋ͪʹԊ͏ͱɺγϯϓϧʹ࣮Ͱ͖Δ w ΠϕϯτΤϯςΟςΟΛݟग़ͯ͠3%#ʹදݱ͠ɺIBT@NBOZUISPVHIͳ "3Ϟσϧͱͯ͠ɺҰڃʹѻ͏ w ΠϕϯτΤϯςΟςΟʹද͞ΕΔʮίτʯΛ3&45Ϧιʔεͱͯ͠ଊ͑ Γ͍ͨ͜ͱΛͦͷ$36%ૢ࡞Ͱදݱ͢Δ w
3BJMT͕ఏڙ͢ΔΠϯλʔϑΣʔεΛࢥ͍ඳ͖ɺ"3".Pɺ 3VCZͷॊೈੑΛ׆͔ͯ͠ܧଓతʹ։ൃɾϦϑΝΫλϦϯά͍ͯ͘͠