日本OSS推進フォーラム主催 第4回アプリケーション部会勉強会 での発表資料
ॳΊͯͷ1BESJOPʙ1BESJOPΛར༻ͨ͠8ΞϓϦέʔγϣϯ࡞ํ๏ͷհʙຊ044ਪਐϑΥʔϥϜओ࠵ୈ̐ճΞϓϦέʔγϣϯ෦ձษڧձ݄5BLFTIJ:BCF !UZBCF
View Slide
͓͢Δ͜ͱw ࣗݾհw ୈ෦1BESJOP֓ཁw ୈ෦1BESJOPΛͬͨ։ൃͷ࣮ફ
5BLFTIJ:BCF!UZBCF ΞϓϦέʔγϣϯΤϯδχΞ ओͳ୲αʔόαΠυ :PLPIBNBSC 4IJCVZBSC 1BESJOPͱͷग़ձ͍ࠒ
ୈ෦1BESJOP֓ཁ1BESJOPͱͲ͏͍ͬͨͷ͔ʢྺ࢙ɾಛʣΛઆ໌ͭͭ͠ɺ1BESJOPΞʔΩςΫνϟͷ֓આɺಛతػೳΛઆ໌͠·͢ɻ
1BESJOPͱ3VCZͷ8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ8FCΞϓϦέʔγϣϯΛखૣ͘࡞ΔͨΊͷ%4-Ͱ͋Δ4JOBUSBͷίʔυͱઃܭࢥΛϕʔεʹɺ8FCΞϓϦέʔγϣϯ։ൃͰΑ͘ΘΕΔͰ͋Ζ͏ϥΠϒϥϦϔϧύʔϝιουͳͲΛՃ͢Δ͜ͱͰɺෳࡶͳ8FCΞϓϦέʔγϣϯ։ൃͰར༻ՄೳͳΑ͏ʹ͢Δ͜ͱΛతͱ͍ͯ͠Δ
1BESJOPͱ
1BESJOPͱ1BESJOPΠλϦΞޠɺӳޠͩͱ(PEGBUIFSlγφτϥzͰ࡞ΒΕ͍ͯΔ͔ΒΒ͍͠ʜ
1BESJOPͱ4JOBUSBϕʔείʔυ͚ͩͰͳ͘ઃܭํ͏ͱ͖ίϨ͕؊ཁ
4JOBUSB4JOBUSBϑϨʔϜϫʔΫͰͳ͘ɺ8FCΞϓϦέʔγϣϯ 3BDLΞϓϦέʔγϣϯΛखૣ͘؆୯ʹهड़͢ΔͨΊͷ%4-l4JOBUSBJTB%4-GPSRVJDLMZDSFBUJOHXFCBQQMJDBUJPOTJO3VCZXJUINJOJNBMF⒎PSUzIUUQXXXTJOBUSBSCDPNJOUSPΑΓҾ༻
ΫϥγοΫελΠϧ1 require 'sinatra'23 get '/' do4 "Hello, sinatra!"5 endϞδϡϥʔελΠϧ1 require 'sinatra/base'23 class App < Sinatra::Base4 get '/' do5 "Hello, world!"6 end7 end୯ମͰ͏γϯϓϧͳΞϓϦͳΒΫϥγοΫελΠϧଞͷ3BDLΞϓϦͱҰॹʹ͏ͳΒϞδϡϥʔελΠϧ4JOBUSB
4JOBUSB؆ܿͰ͋Δ͜ͱෳࡶੑඞཁʹͳͬͨͱ͖ʹՃ
4JOBUSBγϯϓϧ͚ͩͲʜ
NZQSPKFDUᵓᴷᴷ(FNpMFᵓᴷᴷ(FNpMFMPDLᵓᴷᴷ3BLFpMFᵓᴷᴷBQQSCᵓᴷᴷDPOpHᴹᵋᴷᴷEBUBCBTFSCᵓᴷᴷDPOpHSVᵓᴷᴷECᴹᵋᴷᴷEFWFMPQNFOUECᵓᴷᴷMPHᴹᵋᴷᴷEFWFMPQNFOUMPHᵓᴷᴷNBJMFSSCᵓᴷᴷQVCMJDᴹᵓᴷᴷKBWBTDSJQUTᴹᴹᵋᴷᴷBQQKTᴹᵋᴷᴷTUZMFTIFFUTᴹᵋᴷᴷBQQDTTᵋᴷᴷWJFXTᵓᴷᴷJOEFYTMJNᵋᴷᴷMBZPVUTMJN σΟϨΫτϦߏ %#ͷઃఆ ϩάͷઃఆ ϔϧύʔϝιου )5.-Τεέʔϓ ηογϣϯ ςετڥ ίϯιʔϧͰͷಈ࡞֬ೝ 3BLFλεΫ ͳͲͳͲָ͍ͨ͠4JOBUSB
1BESJOPͷྺ࢙TJOBUSB@NPSFͷ։ൃ͕ελʔτQBESJOPͷ։ൃ͕ελʔτ TJOBUSB@NPSF͕QBESJOPͷҠߦΛද໌TJOBUSB@NPSF࠷ޙͷίϛοτʜຊਓ͕։ൃνʔϜೖΓ !OBNVTZBLBϦϦʔε3VCZͷαϙʔτഇࢭͳͲେ͖ΊͷมߋϦϦʔεEZOBNPJEͷαϙʔτɺDBDIF@PCKFDUIFMQFSͷՃϦϦʔε1BSBNT1SPUFDUJPOͷՃϦϦʔεSPVUFS SFMPBEFS HFOFSBUPSͷվળϦϦʔεNPVOUFS͕վળ͞Εɺଞͷ3BDLΞϓϦͷϚϯτ͕ՄೳʹͳͬͨOFTRVFOB͕ݸਓͰ։ൃOFTRVFOBͱɺಉ྅ͩͬͨ%"EE:& BDIJVͰ։ൃ৽͍͠ϧʔλʔ QFOESBHPOΛ։ൃ
1BESJOPͷར༻ऀ
1BESJOPͷओͳػೳ δΣωϨʔλؚΉίϚϯυϥΠϯπʔϧ αϒΞϓϦέʔγϣϯ ଞͷ3BDLΞϓϦέʔγϣϯͷϚϯτ ϧʔςΟϯάͷ֦ு .7$ύλʔϯͷಋೖ ๛ͳϔϧύʔϝιου ؆୯ͳϝʔϧૹ৴ػೳ Ωϟογϡػೳ ࠃࡍԽػೳ ଞͷϥΠϒϥϦͱ࿈ܞՄೳͳϩΨʔ ։ൃ࣌ͷϦϩʔμʔ
1BESJOPͷߏ1BESJOP'SBNFXPSLDPSF4JOBUSBIFMQFSTNBJMFSTTVQQPSUHFODBDIF BENJO
QBESJOPDPSF
QBESJOPDPSF4JOBUSBΛ֦ுͨ͠ϕʔεΞϓϦέʔγϣϯ1BESJOP'SBNFXPSLͷػೳΛશͯ͏͜ͱ͕Ͱ͖Δ# lib/padrino-core/application.rb1 module Padrino2 class Application < Sinatra::Base3 register Padrino::ApplicationSetup4 register Padrino::Routing5 register Padrino::ParamsProtectionSFHJTUFSϝιουʹΑΔ4JOBUSB֦ுͷొVTFϝιουʹΑΔ3BDLϛυϧΣΞͷొ
QBESJOPDPSFՃ͞ΕΔओͳػೳ ϧʔςΟϯάͷ֦ு αϒΞϓϦέʔγϣϯͱͦͷଞͷ3BDLΞϓϦͷϚϯτػߏ ΦʔτϩʔυରσΟϨΫτϦͷઃఆ ֦ு͞ΕͨϩΨʔ ։ൃ༻ͷϦϩʔμʔ ίϚϯυϥΠϯπʔϧ TUBSU TUPQ HFOFSBUF DPOTPMF SVOOFS SBLF
QBESJOPDPSF1 SampleProject::App.controllers :posts do2 get :index do3 # url(:posts, :index) => "/posts"4 render 'posts/index'5 end67 get :show, map: '/posts/:id' do8 # url(:posts, :show, id: 5) => "/posts/5"9 render 'posts/new'10 end11 endϧʔςΟϯάͷ֦ுʢҰྫʣ໊લ͖ϧʔτɺςϯϓϨʔτΤϯδϯͷࣗಈݕग़
QBESJOPDPSF֦ு͞ΕͨϩΨʔ
QBESJOPHFO
- project- app- mailer- controller- helper- model- migration- plugin- component- task- admin- admin_pageQBESJOPHFO৽͍͠1BESJOPϓϩδΣΫτͷ࡞࣌طଘͷ1BESJOPϓϩδΣΫτ؆୯ʹίʔυΛՃ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ
QBESJOPHFO৽͍͠1BESJOPϓϩδΣΫτͷ࡞࣌طଘͷ1BESJOPϓϩδΣΫτ؆୯ʹίʔυΛՃ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ- project- app- mailer- controller- helper- model- migration- plugin- component- task- admin- admin_page
QBESJOPHFO ϓϩδΣΫτੜUsage:padrino-gen project [name] [options]Options:-n, [--app=APP]-b, [--bundle], [--no-bundle]-r, [--root=ROOT][--dev], [--no-dev]-i, [--tiny], [--no-tiny]-l, [--lean], [--no-lean]-a, [--adapter=ADAPTER]-p, [--template=TEMPLATE]-g, [--gem], [--no-gem][--migration-format=MIGRATION_FORMAT]-d, [--orm=ORM]-t, [--test=TEST]-m, [--mock=MOCK]-s, [--script=SCRIPT]-e, [--renderer=RENDERER]-c, [--stylesheet=STYLESHEET]QBESJOPϓϩδΣΫτͰ͏߹QBESJOPHQSPKFDU
QBESJOPHFO ϓϩδΣΫτੜ03.ɺσʔλϕʔεΞμϓλɺςϯϓϨʔτΤϯδϯɺςεςΟϯάϑϨʔϜϫʔΫɺϞοΫϥΠϒϥϦɺελΠϧγʔτΤϯδϯɺ+BWB4DSJQUϥΠϒϥϦඞཁͳͷ͚ͩΛબΜͰ͑Δ બͳͯ͘ྑ͍
QBESJOPHFO ϓϩδΣΫτੜQBESJOPHQSPKFDUTBNQMF@QSPKFDUTBNQMF@QSPKFDUᵓᴷᴷ(FNpMFᵓᴷᴷ3BLFpMFᵓᴷᴷBQQᴹᵓᴷᴷBQQSCᴹᵓᴷᴷDPOUSPMMFSTᴹᵓᴷᴷIFMQFSTᴹᵋᴷᴷWJFXTᴹᵋᴷᴷMBZPVUTᵓᴷᴷCJOᴹᵋᴷᴷTBNQMF@QSPKFDUᵓᴷᴷDPOpHᴹᵓᴷᴷBQQTSCᴹᵋᴷᴷCPPUSCᵓᴷᴷDPOpHSVᵓᴷᴷMPHᵓᴷᴷQVCMJDᴹᵓᴷᴷGBWJDPOJDPᴹᵓᴷᴷJNBHFTᴹᵓᴷᴷKBWBTDSJQUTᴹᵋᴷᴷTUZMFTIFFUTᵋᴷᴷUNQEJSFDUPSJFT pMFTQBESJOPHQSPKFDUUJOZ@QSPKFDUUJOZUJOZ@QSPKFDUᵓᴷᴷ(FNpMFᵓᴷᴷ3BLFpMFᵓᴷᴷBQQᴹᵓᴷᴷBQQSCᴹᵓᴷᴷDPOUSPMMFSTSCᴹᵓᴷᴷIFMQFSTSCᴹᵋᴷᴷNBJMFSTSCᵓᴷᴷCJOᴹᵋᴷᴷUJOZ@QSPKFDUᵓᴷᴷDPOpHᴹᵓᴷᴷBQQTSCᴹᵋᴷᴷCPPUSCᵓᴷᴷDPOpHSVᵓᴷᴷMPHᵓᴷᴷQVCMJDᴹᵓᴷᴷGBWJDPOJDPᴹᵓᴷᴷJNBHFTᴹᵓᴷᴷKBWBTDSJQUTᴹᵋᴷᴷTUZMFTIFFUTᵋᴷᴷUNQEJSFDUPSJFT pMFT
QBESJOPHFO ίϯϙʔωϯτͷՃUsage:padrino-gen component [options]Options:-n, [--app=APP]-r, [--root=ROOT]-a, [--adapter=ADAPTER]-d, [--orm=ORM]-t, [--test=TEST]-m, [--mock=MOCK]-s, [--script=SCRIPT]-e, [--renderer=RENDERER]-c, [--stylesheet=STYLESHEET]Description:padrino-gen component add components into a Padrino projectCurrent Selected Components:orm nonetest nonemock nonescript nonerenderer slimstylesheet noneඞཁʹͳͬͨͱ͖ʹඞཁͳͷΛՃͰ͖Δ
QBESJOPHFO αϒΞϓϦέʔγϣϯαϒΞϓϦέʔγϣϯϞσϧϥΠϒϥϦΛڞ௨Ͱ͑ΔQBESJOPHBENJOQBESJOPHBQQBQJTBNQMF@QSPKFDUᵓᴷᴷBQQᴹᵓᴷᴷBQQSCᴹᵓᴷᴷDPOUSPMMFSTᴹᵓᴷᴷIFMQFSTᴹᵋᴷᴷWJFXTᴹᵋᴷᴷMBZPVUTᵓᴷᴷBENJOᴹᵓᴷᴷBQQSCᴹᵓᴷᴷDPOUSPMMFSTᴹᵓᴷᴷIFMQFSTᴹᵋᴷᴷWJFXTᴹᵋᴷᴷMBZPVUTᵓᴷᴷBQJᴹᵓᴷᴷBQQSCᴹᵓᴷᴷDPOUSPMMFSTᴹᵓᴷᴷIFMQFSTᴹᵋᴷᴷWJFXTᴹᵋᴷᴷMBZPVUTᵋᴷᴷQVCMJDᵓᴷᴷBENJOᴹᵓᴷᴷJNBHFTᴹᵓᴷᴷKBWBTDSJQUTᴹᵋᴷᴷTUZMFTIFFUTᵓᴷᴷGBWJDPOJDPᵓᴷᴷJNBHFTᵓᴷᴷKBWBTDSJQUTᵋᴷᴷTUZMFTIFFUT# config/apps.rb1 Padrino.mount('SampleProject::Admin')2 .to('/admin')3 Padrino.mount('SampleProject::Api')4 .to('/')5 .host("api.example.org")6 Padrino.mount('SampleProject::App')7 .to(‘/')ϚϯτͷઃఆͰɺҰகͤ͞Δύεϗετ໊ΛࢦఆͰ͖Δ
QBESJOPBENJO
QBESJOPBENJOϢʔβೝূ͖ͷཧΞϓϦ͕࡞Ͱ͖ΔΑ͏ʹͳΔQBESJOPHBENJO
QBESJOPBENJO# config/apps.rb1 Padrino.mount('SampleProject::Admin').to('/admin')2 Padrino.mount('SampleProject::App').to('/')BENJOᵓᴷᴷBQQSCᵓᴷᴷDPOUSPMMFSTᴹᵓᴷᴷBDDPVOUTSCᴹᵓᴷᴷCBTFSCᴹᵋᴷᴷTFTTJPOTSCᵋᴷᴷWJFXTᵓᴷᴷBDDPVOUTᴹᵓᴷᴷ@GPSNTMJNᴹᵓᴷᴷFEJUTMJNᴹᵓᴷᴷJOEFYTMJNᴹᵋᴷᴷOFXTMJNᵓᴷᴷCBTFᴹᵋᴷᴷJOEFYTMJNᵓᴷᴷFSSPSTᴹᵓᴷᴷTMJNᴹᵓᴷᴷTMJNᴹᵋᴷᴷTMJNᵓᴷᴷMBZPVUTᴹᵓᴷᴷBQQMJDBUJPOTMJNᴹᵋᴷᴷFSSPSTMJNᵋᴷᴷTFTTJPOTᵋᴷᴷOFXTMJNEJSFDUPSJFT pMFTཧΞϓϦαϒΞϓϦέʔγϣϯͱͯ͠Ϛϯτ͢Δ
QBESJOPBENJOϞσϧʹରԠͨ͠ཧϖʔδΛՃͰ͖ΔQBESJOPHBENJO@QBHFmodel
QBESJOPBENJOཧΞϓϦ༻ͷϔϧύʔϝιου͕͍͔ͭ͘Ճ͞ΕΔ1 module SampleProject2 class Admin < Padrino::Application3 register Padrino::Mailer4 register Padrino::Helpers5 register Padrino::Admin::AccessControl67 set :admin_model, 'Account'8 set :login_page, '/sessions/new'910 enable :sessions11 disable :store_location1213 access_control.roles_for :any do |role|14 role.protect '/'15 role.allow '/sessions'16 end1718 access_control.roles_for :admin do |role|19 role.project_module :posts, '/posts'20 role.project_module :accounts, '/accounts'21 end2223 # Custom error management24 error(403) { @title = "Error 403"; render('errors/403', :layout => :error) }25 error(404) { @title = "Error 404"; render('errors/404', :layout => :error) }26 error(500) { @title = "Error 500"; render('errors/500', :layout => :error) }27 end28 end
QBESJOPIFMQFST
QBESJOPIFMQFSTϑΥʔϜϦϯΫɺը૾༻ͷλάͳͲ)5.-λάΛੜ͢Δϝιου͕༻ՄೳʹͳΔMJOL@UPJNBHF@UBHͳͲ3BJMTͱಉ͡Α͏ͳϝιου͕ఆٛ͞Ε͍ͯΔinput_tag :text, class: “demo”#=> ςϯϓϨʔτΛϨϯμϦϯά͢ΔͨΊͷϝιουSFOEFS QBSUJBM͕༻ՄೳʹͳΔrender ‘path/to/any/template'partial 'photo/_item', object: @photo, locals: { foo: 'bar' }
QBESJOPDBDIF
QBESJOPDBDIFςϯϓϨʔτͷϨϯμϦϯά݁ՌҙͷΦϒδΣΫτͷ༰ΛΩϟογϡͰ͖ΔΑ͏ʹͳΔΩϟογϡػߏͷϕʔεʹ.POFUB͕ར༻͞Ε͓ͯΓσϑΥϧτͰ༷ʑͳΩϟογϡετΞ͕ར༻Մೳͱͳ͍ͬͯΔ1 Padrino.cache = Padrino::Cache.new(:LRUHash) # default choice2 Padrino.cache = Padrino::Cache.new(:File, dir: Padrino.root('tmp', app_name.to_s, 'cache'))3 Padrino.cache = Padrino::Cache.new(:Memcached, backend: memcached_or_dalli_instance)4 Padrino.cache = Padrino::Cache.new(:Redis, backend: redis_instance)5 Padrino.cache = Padrino::Cache.new(:Mongo, backend: mongo_client_instance)1 module SampleProject2 class App < Padrino::Application3 register Padrino::Cache4 enable :caching56 get '/foo', cache: true do7 expires 108 Time.now.to_s9 end10 end11 end
QBESJOPNBJMFST
QBESJOPNBJMFSTγϯϓϧͳΠϯλʔϑΣʔεͰϝʔϧ৴͕ߦ͑ΔΑ͏ʹͳΔϑΝΠϧͷఴϚϧνύʔτՄೳ .BJMϕʔε1 class App < Sinatra::Base2 register Padrino::Mailer34 set :delivery_method, smtp: {5 address: ‘smtp.gmail.com’,6 port: 587,7 domain: 'your.host.name',8 user_name: '',9 password: '',10 authentication: 'plain',11 enable_starttls_auto: true12 }1314 post :mail do15 email do16 from: "[email protected]",17 to: "[email protected]",18 subject: "Welcome!",19 body: "This is test mail."20 end21 end2223 end1 module Sample2 class App < Padrino::Application3 register Padrino::Mailer45 set :delivery_method, :sendmail67 mailer :sample do8 email :welcome do9 from "[email protected]"10 to "[email protected]"11 subject "Welcome!"12 add_file "/path/to/someotherfile.png"13 provides :html, :plain14 render "sample"15 end16 end1718 post :mail do19 deliver :sample, :welcome20 end2122 end23 end
QBESJOPTVQQPSU
QBESJOPTVQQPSUQBESJOPΛαϙʔτ͢ΔͨΊͷϥΠϒϥϦू4USJOHͷ֦ு DPMPSJ[F QMVSBMJ[FࠃࡍԽରԠ༻ͷZBNMϑΝΠϧ͕ஔ͍ͯ͋ΔҰ෦ͷϝιου"DUJWF4VQQPSUͷͷΛͦͷ··ར༻͍ͯ͠Δ
·ͱΊ
·ͱΊ1BESJOPͱɺ4JOBUSBͷ؆ܿ͞ΛอͪͭͭɺෳࡶͳΞϓϦέʔγϣϯ։ൃʹඞཁͱͳΔΑ͏ͳػೳΛඞཁͳͱ͖ʹ͚Ճ͑Δࣄ͕Ͱ͖ΔΑ͏ʹͨ͠8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ"HOPTUJD03.ςϯϓϨʔτΤϯδϯͳͲΛࣗ༝ʹΈ߹ΘͤՄೳ.PVOUBCMFখ͞ͳ3BDLΞϓϦέʔγϣϯΛࣗ༝ʹΈ߹ΘͤՄೳ
ୈ෦1BESJOPΛͬͨ։ൃͷ࣮ફ1BESJOPͰ։ൃΛߦ͏ࡍͷ5JQTͷղܾํ๏ͳͲΛઆ໌͠·͢ɻ
1BESJOPͷΤίγεςϜ
1BESJOPͷΤίγεςϜ 3BDLϛυϧΣΞ SBDLDPOUSJC 4JOBUSBͷػೳ֦ு 4JOBUSB&YUFOUJPO TJOBUSBDPOUSJC 1BESJOPͷػೳ֦ு 1BESJOP༻ͷ4JOBUSB&YUFOUJPO QBESJOPDPOUSJC 1BESJOPͷϓϥάΠϯػೳ QBESJOPSFDJQFTʹެࣜͷϨγϐ͕ެ։͞Ε͍ͯΔ
1BESJOPͷϓϥάΠϯػೳ 5FNQMBUFTϓϩδΣΫτͷ࡞खॱ͕هड़͞ΕͨςϯϓϨʔτϑΝΠϧΛݩʹ৽͍͠1BESJOPϓϩδΣΫτΛੜ͢Δ͜ͱ͕Ͱ͖ΔQBESJOPHQSPKFDUTBNQMFUFNQMBUFQBUIUPNZ@UFNQMBUFSC
1BESJOPͷϓϥάΠϯػೳ 5FNQMBUFT
1BESJOPͷϓϥάΠϯػೳ 1MVHJOTϨγϐϑΝΠϧΛݩʹɺطଘͷ1BESJOPϓϩδΣΫτʹػೳՃ͕ߦ͑ΔQBESJOPHQMVHJOQBUIUPNZ@QMVHJOSC
1BESJOPͷϓϥάΠϯػೳ 1MVHJOT
ͦͷଞ 0NOJ"VUI 8BSEFO KQNPCJMF #SPXTFS XJMM@QBHJOBUF ,BNJOBSJ #FUUFS&SSPST4JOBUSBͰ͑Δͷී௨ʹ͑Δ QBESJOPQJQFMJOF QBESPOJBTTFUT1BESJOPʹಛԽͨ͠ͷ͋Δ
1BESJOPΛ͍ͬͯ͘ͱૺ۰͢Δ
1BESJOPΛ͍ͬͯ͘ͱૺ۰͢Δ ίʔυͷංେԽ ֤छίϚϯυͰͷىಈ͕͘ͳΔ ։ൃαʔόىಈޙϦϩʔμʔ͕Կͱ͔ͯ͘͠ΕΔ͕ʜ 4QSJOH3BJMT༻ͩ͠4QPSLϝϯς͞Ε͍ͯͳ͍ 4JOBUSBͷֶʹै͍খ͞ͳ෦ʹׂͰ͖ͳ͍͔ αϒΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯͷHFNԽ
1BESJOPෳΞϓϦߏͷαϯϓϧ
1BESJOPͷใݯ
1BESJOPͷใݯ ެࣜϖʔδ
1BESJOPͷใݯ ެࣜυΩϡϝϯτ
1BESJOPͷใݯ FCPPL
1BESJOPͷใݯ ॻ੶ɾࡶࢽ
1BESJOPͷใݯ Δͼ·߸
1BESJOPͷใݯ ͦͷଞ
1BESJOPͷใݯ ίʔυ
1BESJOPͷใݯ JEPCBUB1BESJOPʹ͍ͭͯࡶஊͰ͖Δॴ͕ཉ͔ͬͨ͠ͷͰ࡞ͬͨIUUQTJEPCBUBJPPSHBOJ[BUJPOTQBESJOPGSBNFXPSLKQSPPNTQVCMJDKPJO@SFRVFTUCEEBDGEDDC
1BESJOPͷࠓޙ
1BESJOPͷࠓޙ1BESJOP͚ͯ ϚϧνεϨουͷαϙʔτ ৽͍͠ϧʔλʔͷಋೖ 1BESJOP"ENJOͷ৽ ϖʔδωʔγϣϯɺݕࡧɾϑΟϧλɺμΠφϛοΫͳ6*ͳͲ ϦϑΝΫλϦϯά ϦϩʔμʔɺϩΨʔ υΩϡϝϯτͷඋґଘΛগͳ͘ɺΑΓݎ࿚ͰΑΓߴͳϑϨʔϜϫʔΫΛࢦ͢3BDL 4JOBUSBͷಈ
࠷ޙʹ
1BESJOPͷߩݙ υΩϡϝϯτ ίʔυͷதɺެࣜυΩϡϝϯτɺຊޠ ϓϥάΠϯ ಈ͔ͳ͍ͷͷύονɺࣗͷཉ͍͠ͷ HFN 3BDLϛυϧΣΞɺ4JOBUSB&YUFOUJPOɺ1BESJOPઐ༻ ίʔυ ίϝϯτमਖ਼ɺόάमਖ਼ɺ৽ػೳͷఏҊ
͓·͚
ͦͷଞͷ3VCZ8FC"QQMJDBUJPO'SBNFXPSLݸਓతʹؾʹͳ͍ͬͯΔͷ
ຖ݄ୈ̏ਫ༵։࠵ौ୩पลͰ։࠵ ෆఆIUUQTIJCVZBSCEPPSLFFQFSKQ