Slide 1

Slide 1 text

גࣜձࣾϠϓϦా࣮੣ QIQTSDΛಡΜͰΈΑ͏

Slide 2

Slide 2 text

ࣗݾ঺հ w ా࣮੣!U[N@GSFFEPN w גࣜձࣾϠϓϦͷαʔόʔαΠυΤϯδχΞ w 1)1ྺ͸ʙ೥͘Β͍ w $ݴޠྺ͸̍೥͘Β͍ʹॳ৺ऀ w 1)1FS,BJHJͰ͸1)1Ͱ1)1Λ࣮૷ 
 1)1$POGFSFODFͰ͸ಠࣗϑϨʔϜϫʔΫΛվળ 
 1)1FS,BJHJͰ͸1)1Ͱ1)1ͷσόοΨʔΛ࣮૷

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

͜ͷηογϣϯͰ͸ ϓϩάϥϛϯάݴޠͷιʔείʔυΛ ಡΈ͍ͨͱ͍͏ਓͷເΛ׎͑·͢

Slide 5

Slide 5 text

͜ͷηογϣϯͷ໨త w1)1ຊମͷιʔείʔυ QIQTSD ΛಡΉ্Ͱඞཁͳ஌ ࣝ΍ಡΈํΛͬ͟ͱ঺հ wQIQTSDΛશ͘ಡΜͩ͜ͱ͕ͳ͘ɺ$ݴޠ΋ͦΜͳʹ஌ Βͳ͍ਓ͕ಡΊͦ͏ͳؾ࣋ͪʹͳΔ͜ͱ͕໨ඪ w͜ΕΛ͖͔͚ͬʹQIQTSDΛಡΉحಛͳਓΛ૿΍͢ 
 ϓϩάϥϛϯάݴޠͷιʔείʔυΛ͍͔ͭಡΜͰΈͨ ͍ɺͱࢥ͍ͬͯΔਓͷಡΉ͖͔͚ͬʹͳͬͯ͘ΕΔͱخ ͍͠Ͱ͢

Slide 6

Slide 6 text

͜ͷηογϣϯͰ࿩͢͜ͱ w QIQTSDͷσόοάͷํ๏ w σόοάϏϧυͷํ๏ w (%#ͷΠϯετʔϧ w QIQTSDΛಡΉ্Ͱඞཁͳ1)1ͱ$ݴޠͷ஌ࣝ w FDIPͷίʔυΛಡΜͰΈΑ͏ w 1)1Λվ଄ͯ͠ΈΑ͏ w ˞ಡΉ͜ͱʹϑΥʔΧε͍ͯ͠·͢

Slide 7

Slide 7 text

QIQTSDͷσόοάͷํ๏

Slide 8

Slide 8 text

QIQTSDͷσόοά͕Ͱ͖ΔΑ͏ʹ͢Δ w ίʔυΛಡΉ͚ͩͰ׬શʹཧղ͢Δ͜ͱ͸೉͍͠ w σόοά͢Δ͜ͱͰɺͦͷͱ͖ͷม਺ͷ஋΍ݺͼग़͠ݩʢελ οΫτϨʔεʣ͕֬ೝͰ͖ͯਖ਼͍͠ཧղ͕Ͱ͖Δ w σόοά͢Δʹ͸1)1ͷσόοάϏϧυ͕ඞཁ w 1)1͸$ݴޠͰ࣮૷͞Ε͍ͯΔͷͰ(%#ͰσόοάͰ͖Δ w (%#(/6%FCVHHFS$6*56*ͳσόοΨʔ

Slide 9

Slide 9 text

1)1ͷσόοάϏϧυͷํ๏ Ϗϧυ͢ΔͱTBQJDMJQIQʹ1)1ͷ$-*͕࡞੒͞ΕΔ $ git clone [email protected]:php/php-src.git $ cd php-src $ ./buildconf $ ./configure --enable-opcache --enable-debug $ make -j4 $ sapi/cli/php test.php

Slide 10

Slide 10 text

(%#ΛΠϯετʔϧNBD04ͷ৔߹ w ίʔυॺ໊Λ͠ͳ͍ͱ࢖͑ͳ͍ͷͰΩʔνΣʔϯΞΫηεͰূ ໌ॻΛ࡞੒ͯ͠YNMϑΝΠϧ࡞੒ͯ͠ίʔυॺ໊͢Δ w ৄࡉ͸ൃදࢿྉͷ"QQFOEJYʹهࡌ $ brew install gdb $ codesign --entitlements gdb.xml -fs gdb $(which gdb)

Slide 11

Slide 11 text

(6*ͳσόοάͷઃఆ w ׽͸໧ͬͯ(%#Λ௚઀࢖ͬͨ56*σόοάͰ΋ྑ͍͕ w (6*ϕʔεͷσόοά͕Ͱ͖Δͱίʔυͷཧղ͕ḿΔ w 74$PEFͰͷ(6*σόοάͷઃఆ͸͜Ε͚ͩˣ w $$ͷϓϥάΠϯΛΠϯετʔϧ w MBVODIKTPOΛઃఆ w ৄࡉ͸ൃදࢿྉͷ"QQFOEJYʹهࡌ

Slide 12

Slide 12 text

(6*ͷσόοάྫ ม਺Λ֬ೝ͢Δͱ͜Ζ ίʔϧελοΫ εςοϓ࣮ߦͷૢ࡞

Slide 13

Slide 13 text

σόοάίϯιʔϧͰ56*σόοά͢Δ͜ͱ΋Մೳ ͜͜ͰίϚϯυΛ࣮ߦ

Slide 14

Slide 14 text

HECJOJUͰ͞Βʹศརʹσόοά͢Δ w (%#ʹ͸HECJOJUͱ͍͏(%#࣮ߦ࣌ʹಡ·ΕΔϑΝΠϧ͕͋Δ w QIQTSD௚Լʹ΋HECJOJU͕͋ΓɺQIQTSDΛσόοά͢Δͨ Ίͷศརؔ਺͕༻ҙ͞Ε͍ͯΔ QSJOU@DWT $7ʢม਺ʣͷҰཡΛऔಘ QSJOU[W [WBMΛಡΈ΍͘͢දࣔ QSJOU@[TUS [TUSJOHΛಡΈ΍͘͢දࣔ HECJOJUʹఆٛ͞Ε͍ͯΔؔ਺ͷྫ

Slide 15

Slide 15 text

Α͠ɺ1)1ͷίʔυΛಡΉͧʂ

Slide 16

Slide 16 text

ͦͷલʹ$ݴޠͷجૅ஌ࣝ

Slide 17

Slide 17 text

QIQTSDΛಡΉલͷ$ݴޠͷجૅ஌ࣝ w جຊతʹ͸งғؾͰಡΜͰ͍͚͹0, w ϚΫϩͱϝϞϦ͚ͩ஫ҙ͕ඞཁ

Slide 18

Slide 18 text

ϚΫϩ w ϏϧυલʹߦΘΕΔจࣈྻஔ׵ w จࣈྻஔ׵͕Ώ͑ԿͰ΋Ͱ͖Δɻ$ݴޠͷߏจແࢹͯ͘͠Δɻ w QIQTSDΛಡΉͱ͖͸େྔͷϚΫϩͱ޲͖߹͏ඞཁ͕͋Δ #define PHP_VERSION "8.2.0-dev" #define PHP_VERSION_ID 80200

Slide 19

Slide 19 text

࣮ࡍͷίʔυྫ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zval *z; SAVE_OPLINE(); z = RT_CONSTANT(opline, opline->op1);

Slide 20

Slide 20 text

࣮ࡍͷίʔυྫ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zval *z; SAVE_OPLINE(); z = RT_CONSTANT(opline, opline->op1); ͑ɺͳΜ͔ηϛίϩϯແ͍Μ͚ͩͲʜʂ ͑ɺܕ͕ϚΫϩʹͳ͍ͬͯΔʜʁ ͑ɺҾ਺Ͳ͏ͳͬͯΜͷʜʂʁ PQMJOF͍ͬͯ͏ม਺ɺͲ͜ʹ΋ఆٛ͞Ε͍ͯͳ͍ͷ͕ͩʜʁʁ

Slide 21

Slide 21 text

ϚΫϩ͸͜Μͳײ͡Ͱఆٛ͞Ε͍ͯΔ # define ZEND_OPCODE_HANDLER_RET int # define ZEND_FASTCALL # define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data # define USE_OPLINE const zend_op *opline = EX(opline); #define EX(element) ((execute_data)->element)

Slide 22

Slide 22 text

ల։͢Δͱ͜Μͳײ͡ static int ZEND_ECHO_SPEC_CONST_HANDLER(zend_execute_data *execute_data) { const zend_op *opline = ((execute_data)->opline); zval *z; static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zval *z;

Slide 23

Slide 23 text

͜ΜͳϚΫϩ΋͋Δ ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { //… } ZEND_HASH_FOREACH_END(); do { for(...) { { //... } } } while(0) w ։࢝ͷϚΫϩͱऴྃͷϚΫϩͰରʹͳ Δɻ w ͪͳΈʹEPʙXIJMF ΛೖΕ͍ͯΔͷ ͸JGจͳͲͰෳ਺จͷల։Λͨ͠ͱ͖ʹ ҙਤͨ͠ڍಈʹ͢ΔͨΊ

Slide 24

Slide 24 text

ϝϞϦ഑ஔ w ܕఆٛΛݟΔ͚ͩͰ͸ίʔυ͕ಡΊͳ͍ʢʂʁʣ w $ݴޠ͸ϝϞϦ؅ཧΛॊೈʹߦ͑Δ w ܕఆ͚ٛͩͰ͸ͳ͘ɺϝϞϦׂΓ౰ͯɾ഑ஔΛཧղ͢Δඞཁ ͕͋Δ

Slide 25

Slide 25 text

ίʔϧϑϨʔϜͷϝϞϦ഑ஔྫ w [FOE@FYFDVUF@EBUBม਺ [WBM ʜͱ͍͏ײ͡Ͱ഑ஔ͞Εͯ ͍Δ w ϝϞϦΛಈతʹ֬อͯ͠[FOE@FYFDVUF@EBUBͱ[WBMͷྖҬΛܾΊͯ ഑ஔ 
 [FOE@FYFDVUF@EBUBͷఆ͚ٛͩͰ͸ϝϞϦ഑ஔ͸Θ͔Βͳ͍ [WBM FYFDVUF@EBUB ࣮ߦதͷؔ਺΍0QDPEF౳ΛؚΉߏ଄ମ [WBM ൪໨ͷม਺ ൪໨ͷม਺

Slide 26

Slide 26 text

ม਺ͷߏ଄ମΛऔಘ͢Δྫ ((zval*)(((char*)(execute_data)) + ((int)(n)))) w FYFDVUF@EBUBͷϙΠϯλʢઌ಄ͷΞυϨεʣ͔ΒOόΠτઌ ʹ͋ΔΞυϨε͔Β[WBMߏ଄ମΛऔಘ͍ͯ͠Δɻ

Slide 27

Slide 27 text

Α͠ɺ1)1ͷίʔυΛಡΉͧʂ

Slide 28

Slide 28 text

ͦͷલʹ1)1ͷجૅ஌ࣝ

Slide 29

Slide 29 text

4"1* w 4FSWFS"1* w ༷ʑͳ8FCαʔόʔͰ1)1Λಈ͔ͨ͢Ίͷ"1* w 1)1ͷίΞʹ;FOE&OHJOFΛ࢖͏ͨΊͷΠϯλʔϑΣʔε w $-* 1)1%#( NPE@QIQ QIQGQN 'BTU$(* ʜ

Slide 30

Slide 30 text

;FOE&OHJOF w 1)1ͷεΫϦϓτΛ࣮ߦ͢ΔΤϯδϯ w $-*΋NPE@QIQ΋QIQGQN΋࠷ऴతʹ;FOE&OHJOFΛݺΜͰ ͍Δ

Slide 31

Slide 31 text

4"1*;FOE&OHJOFͷ֓ཁਤ BQBDIF NPE@QIQ 4"1* ;FOE&OHJOF )551 ϦΫΤετ $-* 4"1* ;FOE&OHJOF ίϚϯυ ࣮ߦ OHJOY QIQGQN 4"1* ;FOE&OHJOF )551 ϦΫΤετ

Slide 32

Slide 32 text

$-*ͷFDIPͷελοΫτϨʔε NBJO TBQJDMJQIQ@DMJD EP@DMJ TBQJDMJQIQ@DMJD QIQ@FYFDVUF@TDSJQU NBJONBJOD [FOE@FYFDVUF@TDSJQUT ;FOE[FOED [FOE@FYFDVUF ;FOE[FOE@WN@FYFDVUFI FYFDVUF@FY ;FOE[FOE@WN@FYFDVUFI ;&/%@&$)0@41&$@$0/45@)"/%-&3 ;FOE[FOE@WN@FYFDVUFI 4"1* ;FOE&OHJOF

Slide 33

Slide 33 text

QIQGQNͷFDIPͷελοΫτϨʔε NBJO TBQJGQNGQNGQN@NBJOD QIQ@FYFDVUF@TDSJQU NBJONBJOD [FOE@FYFDVUF@TDSJQUT ;FOE[FOED [FOE@FYFDVUF ;FOE[FOE@WN@FYFDVUFI FYFDVUF@FY ;FOE[FOE@WN@FYFDVUFI ;&/%@&$)0@41&$@$0/45@)"/%-&3 ;FOE[FOE@WN@FYFDVUFI 4"1* ;FOE&OHJOF

Slide 34

Slide 34 text

1)1ͷॲཧͷྲྀΕ

Slide 35

Slide 35 text

1)1ͷॲཧͷྲྀΕ 4"1*͔Βىಈ εΫϦϓτΛղੳͯ͠"45Խ "45͔Β0QDPEFʢόΠτίʔυʣΛੜ੒ 0QDPEFΛ࣮ߦ

Slide 36

Slide 36 text

1)1εΫϦϓτΛղੳͯ͠"45Խ w "45"CTUSBDU4ZOUBY5SFF w ͍ΘΏΔࣈ۟ղੳɺߏจղੳ w ࡶʹݴ͏ͱεΫϦϓτΛߏ଄ମʹ͢Δॲཧ [FOE@BTU "[email protected]@-*45 [FOE@BTU "45@"44*(/ [FOE@BTU "45@&$)0 QIQ J FDIPJ

Slide 37

Slide 37 text

ࣈ۟ղੳɾߏจղੳͷίʔυ͸ࣗಈੜ੒͞ΕΔ start: top_statement_list { CG(ast) = $1; (void) zendnerrs; } ; echo_expr_list: echo_expr_list ',' echo_expr { $$ = zend_ast_list_add($1, $3); } | echo_expr { $$ = zend_ast_create_list(1, ZEND_AST_STMT_LIST, $1); } ; echo_expr: expr { $$ = zend_ast_create(ZEND_AST_ECHO, $1); } ; w ;FOE[FOE@MBOHVBHFZ΍;FOE[FOE@MBOHVBHF@TDBOOFSM͔Β 
 ύʔαʔͷίʔυ͕ࣗಈੜ੒͞ΕΔ

Slide 38

Slide 38 text

"45͔Β0QDPEFΛੜ੒ [FOE@BTU "[email protected]@-*45 [FOE@BTU "45@"44*(/ [FOE@BTU "45@&$)0 "44*(/ &$)0 $7 JOU TUSJOH lIPHFz PQDPEF PQ PQ SFTVMU w ωετͨ͠ଟ֊૚ͷߏ଄ମ͔Β̍֊૚ͷߏ଄ମͷ഑ྻʹม׵

Slide 39

Slide 39 text

ม׵͍ͯ͠Δॲཧͷྫ static void zend_compile_echo(zend_ast *ast) /* {{{ */ { zend_op *opline; zend_ast *expr_ast = ast->child[0]; znode expr_node; zend_compile_expr(&expr_node, expr_ast); opline = zend_emit_op(NULL, ZEND_ECHO, &expr_node, NULL); opline->extended_value = 0; } &$)0ͷ0QDPEFΛ࡞੒ w ;FOE[FOE@DPNQJMFDʹ"45͔Β0QDPEFΛੜ੒͢Δؔ਺͕͋Δ

Slide 40

Slide 40 text

0QDPEFͷ֬ೝํ๏ w 0QDBDIFͷΦϓγϣϯΛࢦఆ͢Δͱ0QDPEFΛμϯϓͰ͖Δ $ sapi/cli/php -dopcache.opt_debug_level=0x10000 test.php $_main: ; (lines=3, args=0, vars=1, tmps=1) ; (before optimizer) ; /Users/nuser/phpconf2022/php-src/test.php:1-5 ; return [] RANGE[0..0] 0000 ASSIGN CV0($i) int(1) 0001 ECHO CV0($i) 0002 RETURN int(1)

Slide 41

Slide 41 text

0QDPEFͷ࣮ߦ w 0QDPEFͱΦϖϨʔλͭɺ ݁Ռͷ֨ೲઌ͕ೖ͍ͬͯΔ w 0QDPEFΛ࣮ߦ͢Δϋϯυϥ ʔʢؔ਺ϙΠϯλʣ΋ඥ෇͍ ͍ͯΔ struct _zend_op { const void *handler; znode_op op1; znode_op op2; znode_op result; uint32_t extended_value; uint32_t lineno; zend_uchar opcode; zend_uchar op1_type; zend_uchar op2_type; zend_uchar result_type; };

Slide 42

Slide 42 text

0QDPEFΛ࣮ߦ͍ͯ͠Δίʔυ while (1) { int ret; if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE- >handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) { if (EXPECTED(ret > 0)) { execute_data = EG(current_execute_data); ZEND_VM_LOOP_INTERRUPT_CHECK(); } else { return; } } }

Slide 43

Slide 43 text

Α͠ɺ1)1ͷίʔυΛಡΉͧʂʢ̏ճ໨

Slide 44

Slide 44 text

FDIPΛಡΜͰΈΑ͏

Slide 45

Slide 45 text

FDIP͕Ͳ͏ಈ͍͍ͯΔͷ͔ΛݟͯΈΑ͏ w "45Λ֬ೝ͢Δ w 0QDPEFΛ֬ೝ͢Δ w ϋϯυϥʔͷॲཧΛ֬ೝ͢Δ

Slide 46

Slide 46 text

"45Λ֬ೝ͢Δ w ద౰ͳͱ͜ΖʹϒϨʔΫϙΠϯτΛషͬͯ$( BTU Λσόο ά͢Δ w ͷ͸େมͳͷͰOJLJDQIQBTUΛ࢖ͬͯશମͷߏ଄Λ೺Ѳ͢Δ $ pecl install ast var_dump(ast\parse_code(‘

Slide 47

Slide 47 text

class ast\Node#1 (4) { public $kind => int(132) public $flags => int(0) public $lineno => int(1) public $children => array(1) { [0] => class ast\Node#2 (4) { public $kind => int(283) public $flags => int(0) public $lineno => int(1) public $children => array(1) { 'expr' => string(4) "hoge" } } } } w ;&/%@"[email protected]@-*45 w ;&/%@"45@&$)0 [FOE@BTU "[email protected]@-*45 [FOE@BTU "45@&$)0 [FOE@BTU@[WBM 
 TUSJOH

Slide 48

Slide 48 text

0QDPEFΛ֬ೝ͢Δ w &$)0ͱ͍͏0QDPEFΛ֬ೝͰ͖Δ 
 &$)0ΛϋϯυϦϯά͢Δؔ਺͕͋Δ͸ͣ w ˞3&563/JOU ͸Ұ୴εϧʔͰ0, 0000 ECHO string(“hoge”) 0001 RETURN int(1)

Slide 49

Slide 49 text

ϋϯυϥʔΛ֬ೝ͢Δ w ;FOE[FOE@WN@FYFDVUFIʹఆٛ͞Ε͍ͯΔ w ;&/%@\0QDPEF^@41&$@\Ҿ਺ͷछผ^@)"/%-&3ͱ͍͏໊લʹͳ͍ͬͯΔ w &$)0ͷϋϯυϥʔͰ͸[FOE@XSJUF ؔ਺͕ݺ͹Ε͍ͯΔ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { // …লུ… if (ZSTR_LEN(str) != 0) { zend_write(ZSTR_VAL(str), ZSTR_LEN(str));

Slide 50

Slide 50 text

[FOE@XSJUF w ؔ਺ϙΠϯλ w 4"1*ʹΑͬͯηοτ͞ΕΔؔ਺͕มΘΔ w $-*͸ඪ४ग़ྗʹॻ͖ࠐΉ w NPE@QIQ͸BQBDIFͷؔ਺ܦ༝Ͱ)551ϨεϙϯεΛฦ͢ extern ZEND_API zend_write_func_t zend_write; typedef size_t (*zend_write_func_t)(const char *str, size_t str_length);

Slide 51

Slide 51 text

1)1Λվ଄ͯ͠ΈΑ͏

Slide 52

Slide 52 text

վ଄ֶͯ͠Ϳ1)1 w ԿΛFDIPͯ͠΋ʮ1)1࠷ߴʂʂʯ͕ग़Δ1)1ʹ͢Δ $ sapi/cli/php test.php PHP࠷ߴ!!PHP࠷ߴ!!PHP࠷ߴ!!PHP࠷ߴ!!

Slide 53

Slide 53 text

վ଄ͷ΍Γํ w 0QDPEFͷॲཧͷৼΔ෣͍Λม͑Ε͹0, w ;&/%@&$)0@41&$@$0/45@)"/%-&3ͳͲ w ॻ͖׵͑ͨ͋ͱ͸࠶౓NBLFͯ͠Ϗϧυ - zend_write(ZSTR_VAL(str), ZSTR_LEN(str)); + char *str = “PHP࠷ߴ!!”; + zend_write(str, strlen(str));

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

QIQTSDಡΊͦ͏ʹͳΓ·ͨ͠ΑͶʁ

Slide 56

Slide 56 text

·ͱΊ w 1)1ͷσόοάͷํ๏͔ΒಡΉํ๏·Ͱͬ͟ͱ঺հ͠·ͨ͠ w ϓϩάϥϛϯάݴޠͷίʔυΛಡΉͷ͸ɺ΍Γํ͑͞஌ͬͯ ͍Ε͹ͦ͏೉͗͢͠Δ΋ͷͰ΋ͳ͘୭Ͱ΋Ͱ͖·͢ w ීஈԿؾͳ͘࢖͍ͬͯΔ1)1͕Ͳ͏΍ͬͯಈ͍͍ͯΔͷ͔͕ Θ͔Δͱ໘ന͍Ͱ͢ w ஌Βͳ͍࢓༷΋ग़͖ͯͨΓɺݴޠ࢓༷ΛΑΓཧղͰ͖·͢ w ΤϯδχΞͷᅂΈͱ͍͔͕ͯ͠Ͱ͠ΐ͏͔ʁ

Slide 57

Slide 57 text

&OKPZ$PEF3FBEJOHʂʂ

Slide 58

Slide 58 text

"QQFOEJY

Slide 59

Slide 59 text

ಡΉ্Ͱࢀߟʹͳͬͨهࣄ w ϨϯδΦϖϨʔλͷ࣮૷ w IUUQTQIQJOUFSOBMTOFUBSUJDMFT JNQMFNFOUJOH@B@SBOHF@PQFSBUPS@JOUP@QIQ w ৽͍͠ԋࢉࢠΛ࣮૷͍ͯ͘͠QIQTSDνϡʔτϦΞϧ w ࣈ۟ղੳɾߏจղੳʙ0QDPEFੜ੒ɾ0QDPEF࣮ߦ·ͰܦݧͰ͖Δ w 1)1*OUFSOBMT#PPL w IUUQTXXXQIQJOUFSOBMTCPPLDPN w /JLJDେઌੜͷϒϩά w IUUQTXXXOQPQPWDPN

Slide 60

Slide 60 text

(%#ͷίʔυॺ໊ dHECJOJUͷઃఆ ΩʔνΣʔϯΞΫηεͰίʔυॺ໊༻ͷূ໌ॻΛ࡞੒ ίʔυॺ໊ʹඞཁͳ9.-ϑΝΠϧΛ࡞੒ ίʔυॺ໊Λ࣮ߦ ৄࡉ͸ҎԼͷهࣄ͕Θ͔Γ΍͍͢Ͱ͢ʂ🙏 w IUUQTUBNBLJJJIBUFOBCMPHDPNFOUSZ w IUUQTCMPHTZNEPOJOGPQPTUT

Slide 61

Slide 61 text

74$PEFͷ$$ͷϓϥάΠϯ w IUUQTDPEFWJTVBMTUVEJPDPNEPDTMBOHVBHFTDQQ w IUUQTDPEFWJTVBMTUVEJPDPNEPDTDQQDQQEFCVH