Laravelを使った既存WebサービスのAPI化

F2ab92715fdcc539883d13af4b804ec1?s=47 Futoshi Endo
September 13, 2018

 Laravelを使った既存WebサービスのAPI化

Laravel MeetUpTokyo #11で発表した内容になります。

https://laravel-meetup-tokyo.connpass.com/event/93838/

F2ab92715fdcc539883d13af4b804ec1?s=128

Futoshi Endo

September 13, 2018
Tweet

Transcript

  1. ԕ౻ଠಙ(.01FQBCP *OD -BSBWFM.FFU6Q5PLZP -BSBWFMΛ࢖ͬͨ طଘ8FCαʔϏεͷ"1*Խ

  2. ԕ౻ଠಙ ͑ΜͲ͎ʔ !'FOEP 4)ࣄۀ෦(PPQFάϧʔϓ8FCΤϯδχΞ @Fendo181 @Fendo181

  3. ɾ؆୯ʹࣗ෼ͷϗʔϜϖʔδ͕࡞੒Ͱ͖Δ ɾࠓ೥ͰαʔϏεՔಇͯ͠೥໨

  4. -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δɻ ʲ຋༁ʳLaravelΛ5.6͔Β5.6.30ʹΞοϓάϨʔυ͢Δ(Security Release) ͜Ε·Ͱ΍͖ͬͯͨࣄ

  5. ࠓ೔͓࿩͍ͨ͠ࣄ

  6. طଘͷ࢓༷ʹ߹Θͤͨ3&45GVM"1*Λ ৽نͰ։ൃ͢Δ࿩ ࠓ೔͓࿩͍ͨ͠ࣄ طଘͷ8FCαʔϏεΛ"1*Խͤ͞Δ ৽͘͠"1*Λ࡞Δ 8FC"QQ ˞ҎԼ"1*ͱ͍͏දه͸3&45GVM"1*ͱ͠·͢ɻ

  7. എܠ

  8. ͋Δ৽ػೳͷ։ൃͷҝ ৽نͰ"1*Λ։ൃ͢Δࣄʹͳͬͨɻ എܠ

  9. ࣌ؒ ΍Δ΂͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮૷ ࣮૷͢Δલ എܠ

  10. εςʔλείʔυ͸ Ͳ͏͢Δͷ͔ ΤϥʔϨεϙϯε͸ Կ͕ฦͬͯ͘Δͷ ͲΜͳΤϯυϙΠϯ τ͕ඞཁͳͷ ϦιʔεԿ͕͋Δͷ ઃܭஈ֊ ࣌ؒ ΍Δ΂͖ࣄ

    Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮૷ എܠ
  11. εςʔλείʔυ͸ Ͳ͏͢Δͷ͔ ͲΜͳΤϯυϙΠϯ τ͕ඞཁͳͷ σΟϨΫτϦߏ੒͸Ͳ͏͢Δͷ ςετ͸ ࣮૷ஈ֊ طଘͷ%#ʹͲ͏΍ͬͯ߹ΘͤΔͷ ϦιʔεԿ͕͋Δͷ ΤϥʔϨεϙϯε͸

    Կ͕ฦͬͯ͘Δͷ ࣌ؒ ΍Δ΂͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮૷ എܠ
  12. ։ൃཁ݅ ɾ%#͸طଘͷ΋ͷΛѻ͏ ɾಠࣗͷςʔϒϧن໿ ɾѻ͏%#͕ͭଘࡏ͢Δ എܠ ɾ3&45GVMͳ"1*Λ৽نͰ։ൃ ۀ຿Ͱ։ൃ͸ະܦݧ

  13. "1*։ൃ͸ߟ͑Δࣄ΋ɺ΍Δࣄ΋ଟ͗͢ʜ എܠ

  14. ͜ͷΑ͏ͳঢ়گͰ΋ ཁ݅Λຬͨͯ͠"1*Λ։ൃ͍ͨ͠ എܠ

  15. എܠ

  16. എܠ ͳͥ-BSBWFMͳͷ͔ ɾυΩϡϝϯτͷ৘ใྔ͕ଟ͍ɻ3FBE%PVCMFΛݟΕ͹ղܾ͢Δɻ  ࣾ಺Ͱ૬ஊͰ͖Δਓ΋͍Δɻ ɾೝূͱೝՄɾϩάͷಋೖ͸ඞਢͰ͋Γɺͦ͜Ͱ᪴͘ͷ͸ࠔΔ  -BSBWFMʹ͸ඪ४ೝূϥΠϒϥϦͷ1BTTQPSU͕࢖͑Δ ɾڧྗͳσʔλϕʔεΫΤϦʔϏϧμʔ͕͋ΔͷͰɺෳࡶͳ ςʔϒϧεΩʔϚͰ΋ରॲͰ͖Δɻ

  17. എܠ ࣌ؒ ΍Δ΂͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτઃܭ Ϩεϙϯεͷઃܭ ΤϯυϙΠϯτͷ࣮૷ ఆٛ ࣮૷

  18. ఆٛɾ࣮૷ͷ྆໘͔Β طଘ8FCαʔϏεΛ-BSBWFMͰ "1*Խ͢Δ͓࿩͠·͢ɻ എܠ

  19. ΞδΣϯμ

  20. ΞδΣϯμ ɾ4XBHHFSͰ"1*ͷυΩϡϝϯτԽ ɾσΟϨΫτϦͷߏ੒Λ੹຿ʹ෼͚ͯΤϯυϙΠϯτΛ࣮૷͢Δɻ ɾطଘʹ%#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ5JQT ɾ·ͱΊ

  21. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ

  22. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ ɾ3&45GVM"1*Λߏங͢ΔͨΊͷΦʔϓϯιʔεͷϑϨʔϜϫʔΫ ɾ+40/΋͘͠͸:".-ܗࣜͰهड़͕Ͱ͖Δ ɾϩʔΧϧͰϞοΫαʔόΛ্ཱͪ͛Δࣄ΋Մೳ

  23. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ 4XBHHFS4QFD 4XBHHFS6*

  24. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ ͳͥ4XBHHFSΛ࠾༻ͨ͠ͷ͔ ɾҰ൪ͷཧ༝ͱͯ͠͸ɺΫϥΠΞϯτͱαʔόαΠυͷೝࣝΛ߹ΘͤΔҝ ɾ"1*ଆͰఆٛ͢ΔΑΓ΋ΫϥΠΞϯτଆ ࢖͍ਓ ͕ఆٛͨ͠ํ͕ྑ͍ 4XBHHFS BQJWIPHF Λୟ͍ͨΒ ˓˓ͳϨεϙϯε

    ͕ཉ͍͠ ΫϥΠΞϯτଆ ɾ:".-͸ڞ௨ͰಡΊΔҝɺ͓ޓ͍ʹมߋ΍मਖ਼͕͠΍͍͢ αʔόଆ ˓˓ͳϨεϙϯε ͕ฦͬͯ͘ΔΑ͏ ʹϨεϙϯεΛ૊ ΈཱͯΑ͏
  25. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ ɾΤϯυϙΠϯτΛ௥Ճ͢Δ౓ʹίʔυ͕ੌ·͘͡ݟͮΒ͘ͳΔ໰୊ ɾมߋ͠Α͏ʹ΋ɺߦ͙Β͍௒͑ͯ͘Δͱ໨Ͱ௥ͬͯमਖ਼Ͱ͖ͳ͘ͳΔʜ ɾ4XBHHFS1)1΍-4XBHHFS΋ߟ͕͑ͨίʔυͷՄಡੑ͕Լ͕Δ  ͦ΋ͦ΋ΫϥΠΞϯτଆ͕͍͡Εͳ͍ 4XBHHFSͱݴ͑͹ʜ

  26. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ JOEFYZNM SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ

  27. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ $ tree -I node_modules . ├── definitions │ ├──author.yml

    ├── index.yml ├── paths │ ├── account │ │ └── authors.yml └── resolve.js ɾEFpOJUJPOTσΟϨΫτϦҎԼʹ.PEFMΛఆٛ͢Δ ɾQBUITσΟϨΫτϦҎԼͷϑΝΠϧʹΤϯυϙΠϯτͷ࢓༷Λఆٛ͢Δ SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ
  28. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ JOEFYZNM BVUIPSTZNM QBUITσΟϨΫτϦ BVUIPSZNM EFpOJUJPOTσΟϨΫτϦ

  29. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ ͜ΕΒΛ݁߹ͤͯ͞JOEFYZNMΛ࡞੒͢Δ const resolve = require('json-refs').resolveRefs; const YAML = require('js-yaml');

    const fs = require('fs'); const root = YAML.load(fs.readFileSync('index.yml').toString()); const options = { loaderOptions : { processContent : function (res, callback) { callback(undefined, YAML.safeLoad(res.text)); } } }; resolve(root, options).then(function (results) { console.log(YAML.dump(results.resolved)); }); node resolve.js > index_all.yml # ϑΝΠϧ໊͸೚ҙ SFTPMWFKT ৄࡉ4XBHHFS༻ϑΝΠϧΛ෼ׂͯ͠هड़͠Α͏ ෼ׂ͞ΕͨϑΝΠϧ͕౷߹͞Εͯग़ྗ͞ΕΔ
  30. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒

  31. 3PVUFS ᶃ(&5BQJWIPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶆ

    %#ૢ࡞ ϨεϙϯεΛ࡞੒ ϨεϙϯεΛฦ͢ ɾͭͷΤϯυϙΠϯτʹରͯ͠ɺͭͷ$POUSPMMFSͰରԠΛߦ͏ ɾ(&5BQJWIPHF )PHF$POUSPMMFS ˞ఏڙ͢ΔαʔϏεͷ؀ڥʹΑͬͯมΘΔҝɺ͋͘·ͰͭͷྫͰ͢ʂ ɾ1045BQJWIPHF ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ #FGPSF
  32. ├── app ├── Http │ ├── Controllers │ │ └──

    HogeController.php └── Requests │ └── HogeRequest.php └── Hoge.php ├── routes ├── api.php ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
  33. SPVUFTBQJQIQ BQQ)UUQ)PHF$POUSPMMFSQIQ ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ Route::prefix('api/v1')->group(function () { Route::get('/hoges', 'Hoge@index'); Route::get(‘/hoges/1', 'Hoge@show');

    Route::post(‘/hoges', 'Hoge@store'); Route::put(‘/hoges/1', 'Hoge@update'); Route::delete(‘/hoges/1', 'Hoge@delete'); });
  34. 3PVUFS ᶃ(&5IPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶆ

    %#ૢ࡞ ϨεϙϯεΛ࡞੒ ϨεϙϯεΛฦ͢ ɾஈʑͱ$POUSPMMFS͕ංେԽͯ͘͠Δͷ͕ݟ͑ͯ͘Δʜ ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
  35. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ Ͳ͏ͨ͠΋ͷ͔ʜ

  36. 3PVUFS ᶃ(&5BQJWIPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶇ

    ϨεϙϯεΛฦ͢ 4FSWJDF ɾϏδωεϩδοΫΛ"QQ4FSWJDF΁੾Γग़͢ ɾ(&5BQJWIPHF )PHF$POUSPMMFS!JOEFY ᶆ %#ૢ࡞ ϨεϙϯεΛ࡞੒ ɾ$POUSPMMFSʹ͸ϏδωεϩδοΫΛॻ͔ͣʹ)551ͷؔ৺ࣄʹूதͤ͞Δɻ ɾϧʔςΟϯάαʔϏεΫϥε -JTU4FSWJDFQIQ ɾ1045BQJWIPHF )PHF$POUSPMMFS!TUPSF $SFBUF4FSWJDFQIQ ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ "GUFS
  37. ├── app ├── Http │ ├── Controllers │ │ └──

    HogeController.php └── Requests │ └── HogeRequest.php └── Hoge.php ├── Servicies └── Hoge │ └── ListService.php #GET Ұཡ │ └── ShowService.php #GET ৄࡉ │ └── CreateService.php #POST │ └── DeleteService.php #DELET ├── routes ├── api.php ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
  38. BQQ4FSWJDFT)PHF-JTU4FSWJDFQIQ ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ ɾ"QQ4FSWJDFͰΤϯυϙΠϯτΛୟ͍ͨࡍͷϏδωεϩδοΫͷॲཧΛ٧ΊΔ

  39. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒ ɾ$POUSPMMFSͰ͸͋͘·ͰϨεϙϯεΛKTPOͰฦ͚ͩ͢ʹప͢Δ

  40. %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

  41. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

  42. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹ FOWͰઃఆΛ௥Ճ͢Δ # 1ͭΊͷDB DB_CONNECTION=mysql1 DB_HOST=database DB_PORT=3306 DB_DATABASE=database_1 DB_USERNAME=hoge

    DB_PASSWORD=secret # 2ͭΊͷDB DB_CONNECTION_2=mysql2 DB_HOST_2=database DB_PORT_2=3306 DB_DATABASE_2=database_2 DB_USERNAME_2=fuga DB_PASSWORD_2=secret FOW
  43. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ DPOpHaEBUBCBTFQIQʹઃఆΛ௥Ճ͢Δ # 2ͭΊͷDBͷઃఆΛ௥Ճ͢Δ 'mysql2' => [ 'driver' => 'mysql',

    'host' => env(‘DB_HOST_2‘, '127.0.0.1'), 'port' => env(‘DB_ACC_PORT_2', '3306'), 'database' => env(‘DB_DATABASE_2', 'forge'), 'username' => env(‘DB_USERNAME_2', 'forge'), 'password' => env(‘DB_PASSWORD_2', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], DPOpHaEBUBCBTFQIQ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
  44. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ $date = DB::connection(env(‘DB_CONNECTION_2’)) ->table(’t_name’) ->get() NZTRMͷઃఆͰ%#ʹ઀ଓͨ͠ঢ়ଶͰσʔλΛऔಘ͢Δࣄ͕ՄೳͱͳΔ FOW ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹

  45. ˞FOW Λݺͼग़͢ࡍͷ஫ҙ %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ 

  46. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹ ৄࡉ:Laravelͷ .env ͷ஋͸config()ܦ༝Ͱ࢖͏ɻ <?php class HogeController extends Controller

    { public function getHoge() { dd( env('MY_ENV'), config('my-app.my-env') ); } } ˞։ൃ؀ڥͰ͸ྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪؀ڥʹ͓͍ͯFOW ͕஋Λฦ͞ͳ͍ɻ
  47. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ˞։ൃ؀ڥͰ͸ྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪؀ڥʹ͓͍ͯFOW ͕஋Λฦ͞ͳ͍ɻ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹ ৄࡉ:Laravelͷ .env ͷ஋͸config()ܦ༝Ͱ࢖͏ɻ null "Full" php

    artisan config:cache FOW Ͱݺͼग़͢ͱOVMM͕ฦͬͯ͘Δɻ
  48. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ DPOpH Λ࢖ͬͯݺͼग़͢Α͏ʹ͢Δ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹ Psy Shell v0.9.8 (PHP 7.2.1 —

    cli) by Justin Hileman >>> dump(config('database.connections.mysql2')) array:12 [ "driver" => "mysql" "host" => "database" "port" => "3306" "database" => "database_2" "username" => "fuga" "password" => "secret" "unix_socket" => "" "charset" => "utf8" "collation" => "utf8_general_ci" "prefix" => "" "strict" => true "engine" => null ]
  49. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ DPOpH Λ࢖ͬͯݺͼग़͢Α͏ʹ͢Δ ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹ $date = DB::connection(config(‘database.connections.mysql2’)) ->table(’t_name’) ->get()

  50. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

  51. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ +------------------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key

    | Default | Extra | +------------------------+--------------+------+-----+-------------------+-----------------------------+ | user_id | int(20) | NO | PRI | NULL | auto_increment | | name | varchar(32) | YES | MUL | NULL | | | email | varchar(255) | YES | MUL | NULL | | | state | tinyint(4) | YES | MUL | NULL | | | make_date | datetime | YES | MUL | NULL | | | update_date | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +------------------+--------------+------+-----+-------------------+-----------------------------------+ U@VTFSςʔϒϧ TUBUF༗ޮ TUBUFແޮ (&5BQJVTST TUBUFFOBCMFE (&5BQJVTST TUBUFEJTBCMFE TUBUFFOBCMFE͸ͳ͍Αʂ (&5BQJVTST TUBUFBMM "1* ΫϥΠΞϯτ
  52. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ ৄࡉ-BSBWFM&MPRVFOUɿϛϡʔςλ

  53. ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ (&5BQJVTST TUBUFFOBCMFE TUBUFFOBCMFE ΫϥΠΞϯτ "1* TUBUF %# ࠓճͷέʔεͰ͸TUBUFΛม׵͍ͨ͠ͷͰΞΫηαΛ࡞Δ

    HFU4UBUF"UUSJCVUF $user = App\User::all(); # state=1ͷuserΛऔಘ͢ΔΑ͏ʹࣗಈͰม׵͢Δ $firstName = $user->state(’enabled’)->get()
  54. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ

  55. $users = User::where('user_id', $this->request->userId) ->state(User::toStateKey($state)) ->limit($limit) ->offset($offset) ->get(); %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ ΞΫηαɾϛϡʔςʔλΛ࢖͏ࣄͰΫΤϦʔύϥϝʔλͰडऔͬͨ஋Λ

    ࣗಈͰ&MPRVFOͰ࢖͑ΔΑ͏ʹͯ͠σʔλΛऔಘ͢Δࣄ͕Ͱ͖Δɻ TUBUFFOBCMFE͕ૹΒΕͯ͘ΔͱTUBUFʹม׵͞ΕΔ TUBUFEJTBCMFE͕ૹΒΕͯ͘ΔͱTUBUFʹม׵͞ΕΔ TUBUFBMM͕ૹΒΕͯ͘ΔͱɺԿ΋͠ͳ͍ͷͰࣗಈͰ TUBUFPSTUBUFͷσʔλΛऔಘ͢Δɻ ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ
  56. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

  57. ·ͱΊ

  58. ·ͱΊ ɾ3&45GVM"1*Λ͔Β࡞੒͢Δͷ͸େมͳͷͰɺ·ͣ͸ ΫϥΠΞϯτଆͱ૬ஊ͠ͳ͕ΒϨεϙϯεΛ͔ͬ͠Γઃܭ͢Δɻ ɾطଘͷ%#ͷ࢓༷ʹରͯ͠΋-BSBWFMͳΒɺඋΘͬͯΔػೳΛ࢖͍͜ͳ͢ ɹ͚ͩͰ͋Δఔ౓ͷࣄ͸Ͱ͖Δɻ ɾͪΐͬͱ೉͍͠ࣄΛ΍Δ৔߹͸੹຿ΛΘ͚ΔΑ͏ʹ͢Δɻ

  59. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ϓϩϑΟʔϧGFOEP1SPpMF