$30 off During Our Annual Pro Sale. View Details »

Second-System Syndrome: A tale of power-assert

Second-System Syndrome: A tale of power-assert

Second-System Syndrome: A tale of power-assert
#jsconfjp
https://jsconf.jp/2023/

Takuto Wada
PRO

November 19, 2023
Tweet

More Decks by Takuto Wada

Other Decks in Programming

Transcript

  1. 4FDPOE4ZTUFN4ZOESPNF
    "UBMFPGQPXFSBTTFSU
    📷🙆 🙆
    5BLVUP8"%"ʢ!U@XBEBʣ
    #jsconfjp
    rev.1
    /PW !+4$POG+1

    View Slide

  2. *TV
    ff
    FSFEGSPNUIFUZQJDBMTFDPOETZTUFNTZOESPNFJOUIF
    EFWFMPQNFOUPGNZPXO044QSPEVDUT FTQFDJBMMZQPXFSBTTFSU
    *XJMMFYQMBJOXIBUTFDPOETZTUFNTZOESPNFJTBOEIPXUPSFDPWFS
    GSPNJU CBTFEPONZPXOFYQFSJFODF
    ࣗ࡞044ϓϩμΫτɺಛʹQPXFSBTTFSUͷ։ൃʹ͓͍ͯయܕతͳʮηΧ
    ϯυγεςϜγϯυϩʔϜʯʹጶױ͠·ͨ͠ɻʮηΧϯυγεςϜγϯυ
    ϩʔϜʯͱ͸Կ͔ɺͲ͏΍͔ͬͯͦ͜ΒϦΧόϦʔ͢Δ͔ɺࣗ෼ͷମݧΛ
    ϕʔεʹઆ໌͠·͢ɻ
    BCTUSBDU

    View Slide

  3. QPXFSBTTFSU
    import assert from 'node:assert';


    const truthy = '1';


    const falsy = 0;


    assert(truthy === falsy);

    View Slide

  4. QPXFSBTTFSUJTBUSBOTQJMFSBOEXPSLTMJLFBDIBSN
    assert(truthy === falsy)


    | | |


    | | 0


    "1" false


    import assert from 'node:assert';


    const truthy = '1';


    const falsy = 0;


    assert(truthy === falsy);
    /P"1*JTUIFCFTU"1*

    View Slide

  5. 5IBOLZPVGPSVTJOHQPXFSBTTFSU
    IUUQTOQNTUBUDPNDIBSUTIUNM QBDLBHFQPXFSBTTFSUGSPNUP

    View Slide

  6. #VUIPXBCPVUUIJT
    assert(truthy === falsy);

    View Slide

  7. 0SUIJT
    assert(truthy


    ===


    falsy);

    View Slide

  8. $BTF4UVEZBTTFSUJPODBOPOJDBMJ[BUJPOBOE+49

    View Slide

  9. 2)PXEP*IBOEMFBOBTTFSUJPOFYQSFTTJPOUIBUTQBOTNVMUJQMFMJOFT
    2ෳ਺ߦʹ·͕ͨΔද໌ࣜΛͲ͏͠·͠ΐ͏
    "6TFDPEFHFOFSBUPSXIJMFUSBWFSTJOHXJUIZPVSUSBOTQJMFSTPUIBUZPVDBO
    HFUBTIPSUDBOPOJDBMJ[FETUSJOHPGUIFBTTFSUJPOFYQSFTTJPOPOBTJOHMF
    DPODJTFMJOF/BNFJUDBOPOJDBMJ[FEBTTFSUJPO5IFOFNCFEUIF
    DBOPOJDBMJ[FEBTTFSUJPOJOUIFHFOFSBUFEDPEFBOEQBTTJUUPUIFSVOUJNFTJEF
    "USBOTQJMFSͰUSBWFSTF͢ΔࡍʹίʔυɾδΣωϨʔλʔΛ࢖༻͠ɺද໌ͷࣜΛҰߦ
    ʹ୹͘ਖ਼نԽͨ͠จࣈྻΛऔಘͰ͖ΔΑ͏ʹ͠·͠ΐ͏ɻ໊෇͚ΔͳΒʮਖ਼نԽ͞Ε
    ͨΞαʔγϣϯʯͰ͢ɻͦͷਖ਼نԽ͞ΕͨΞαʔγϣϯΛੜ੒ͨ͠ίʔυͷதʹຒΊ
    ࠐΈɺ࣮ߦଆʹ౉͠·͢ɻ

    View Slide

  10. 25IFQPTJUJPOJOUIFDBOPOJDBMJ[FEBTTFSUJPONBZCFEJ
    ff
    FSFOUGSPNUIF
    PSJHJOBMQPTJUJPO8IBUTIPVME*EP
    2ਖ਼نԽ͞ΕͨΞαʔγϣϯͷதͷҐஔ͸ΦϦδφϧͷҐஔͱ͸ҟͳΔ͸ͣͰ͢ɻ
    Ͳ͏͠·͔͢ʁ
    "%F
    fi
    OFBMPHJDBMQBUIUPQPJOUUPBTQFDJ
    fi
    DMPDBUJPOJOUIFBTTFSUJPO
    FYQSFTTJPO/BNFJUFTQBUI&BDIMPDBUJPOJOUIFBTTFSUJPOJTQPJOUFEUPCZ
    FTQBUI OPUQPTJUJPO
    "ΞαʔγϣϯͷதͷಛఆͷҐஔΛࢦࣔͨ͢͠Ίͷ࿦ཧతͳύεΛఆٛ͠·͢ɻͦ
    ΕΛʮFTQBUIʯͱ໊෇͚·͠ΐ͏ɻΞαʔγϣϯͷதͷ֤෦Ґ͸ҐஔͰ͸ͳ͘
    FTQBUIͰࢦࣔ͠͠·͢ɻ

    View Slide

  11. 2)PXEP*HFUUIFBDUVBMMPDBUJPOGSPNUIFMPHJDBMFTQBUIBUSVOUJNF
    2࣮ߦ࣌ʹ࿦ཧతͳFTQBUI͔Β࣮ࡍͷҐஔΛऔಘ͢Δʹ͸Ͳ͏͠·͔͢ʁ
    "#VOEMFBQBSTFSBOEBWJTJUPSPOUIFSVOUJNFTJEF'JSTU QBSTFUIF
    DBOPOJDBMJ[FEBTTFSUJPOUP"45XJUIMPDBUJPOJOGPSNBUJPO BOEXIFOUSBWFSTJOH
    "45XJUIUIFWJTJUPS DPNQBSFFTQBUIXJUIUIFDVSSFOUUSBWFSTBMQBUIBUFBDI
    OPEFBOESFUVSOUIFMPDBUJPOJGNBUDIFE5IJTXJMMDSFBUFBNBQQJOHCFUXFFO
    MPHJDBMFTQBUITBOEQIZTJDBMMPDBUJPOT
    "ϥϯλΠϜଆʹQBSTFSͱWJTJUPSΛόϯυϧ͠·͢ɻ·ͣ͸ਖ਼نԽ͞ΕͨΞαʔ
    γϣϯΛMPDBUJPO৘ใ෇͖ͰQBSTF͠ɺWJTJUPSͰτϥόʔε͢Δࡍʹ֤ϊʔυͰ
    FTQBUIͱͷൺֱΛߦ͍ɺϚονͨ͠ΒͦͷҐஔΛฦ͢Α͏ʹ͠·͢ɻ͜ΕͰ࿦ཧύε
    ͱ෺ཧҐஔͷϚοϐϯά͕Ͱ͖·͢ɻ

    View Slide

  12. 8IBUBDMFWFSTPMVUJPO
    const truthy = '1';


    const falsy = 0;


    assert(truthy


    ===


    falsy);
    assert(truthy === falsy)


    | | |


    | | 0


    "1" false


    View Slide

  13. )FSFDPNFTUIF+49

    View Slide

  14. 28IBUJGUIFSFJTB+49FMFNFOUJOUIFBTTFSUJPOFYQSFTTJPO
    2ද໌ࣜͷதʹ+49ཁૉ͕͋ͬͨΒͲ͏͠·͔͢
    "6TF#BCFMBTZPVSUSBOTQJMFSBOEXSJUFB#BCFMWFSTJPOPGQPXFS
    BTTFSUWJTJUPS
    "τϥϯεύΠϥʹ#BCFMΛ࢖͍ɺ#BCFM൛ͷQPXFSBTTFSUWJTJUPSΛॻ͖·
    ͠ΐ͏ɻ

    View Slide

  15. 2#VUCBCFMQBSTFSBOECBCFMUSBWFSTFEPOPUXPSLPO PME
    CSPXTFST
    TP*DBOUCVOEMFUIFNPOUIFSVOUJNFTJEF
    2Ͱ΋CBCFMQBSTFS΍CBCFMUSBWFSTF͸ʢݹ͍ʣϒϥ΢β্Ͱಈ͔ͳ͍ͷͰϥ
    ϯλΠϜଆʹόϯυϧͰ͖·ͤΜɻ
    "(JWFVQCVOEMJOHCBCFMQBSTFSBOECBCFMUSBWFSTF LFFQCVOEMJOH
    BDPSOBOEFTUSBWFSTFXIJDIXPSLTPOPMEFSCSPXTFST
    "Ͱ͸CBCFMQBSTFSͱCBCFMUSBWFSTFΛόϯυϧ͢Δͷ͸ఘΊͯɺݹ͍ϒϥ΢
    βͰ΋ಈ͘BDPSOͱFTUSBWFSTFͷΈΛόϯυϧ͠ଓ͚Δ͢Δ͜ͱʹ͠·͠ΐ͏ɻ

    View Slide

  16. 2#VUXJUIPVU#BCFMQBSTFS *DBOOPUQBSTFDBOPOJDBMJ[FEBTTFSUJPOTDPOUBJOJOH
    +49FMFNFOUTBUSVOUJNF
    2Ͱ΋#BCFMͷQBSTFS͕ͳ͍ͱ+49ཁૉؚ͕·Εͨਖ਼نԽ͞ΕͨΞαʔγϣϯΛ࣮ߦ࣌ʹ
    QBSTFͰ͖·ͤΜ
    "*OTUFBEPGQBSTJOHUIFNBUSVOUJNF QBSTFUIFDBOPOJDBMJ[FEBTTFSUJPOTUSJOH
    JUTFMGBUDPNQJMFUJNF UVSOJUJOUPB+40/TUSJOH FNCFEJUJOZPVSDPEF BOEQBTTJU
    UPUIFSVOUJNFTJEF*GZPVIBWFUIBU+40/ USFBUJUBTBQBSTFE"45
    "࣮ߦ࣌ʹQBSTF͢ΔͷͰ͸ͳ͘ɺਖ਼نԽ͞ΕͨΞαʔγϣϯจࣈྻࣗ਎΋ίϯύΠϧ࣌
    ʹQBSTFͯ͠ɺͦΕΛ+40/จࣈྻʹͯ͠ίʔυʹຒΊࠐΈɺϥϯλΠϜଆʹ౉͠·͠ΐ
    ͏ɻͦͷ+40/͕͋Δ৔߹͸ͦΕΛύʔεࡁΈͷ"45ͱͯ͠ѻ͍·͠ΐ͏ɻ

    View Slide

  17. 2#VUFTUSBWFSTFEPFTOULOPXUIFLFZPGUIF+49FMFNFOUT TPUIF
    USBWFSTFGBJMT
    2Ͱ΋FTUSBWFSTF͸+49ཁૉͷLFZΛ஌Βͳ͍ͷͰτϥόʔεʹࣦഊ͠·͢
    "5IFWJTJUPS,FZTVTFECZUIFCBCFMUSBWFSTFTIPVMEBMTPCFDPOWFSUFE
    UP+40/ FNCFEEFEJOUIFDPEF BOEQBTTFEUPUIFSVOUJNFTJEF
    "Ͱ͸#BCFMUSBWFSTF͕࢖͍ͬͯΔWJTJUPS,FZT΋+40/Խͯ͠ίʔυʹຒΊࠐ
    ΈɺϥϯλΠϜଆʹ౉͠·͠ΐ͏ɻ

    View Slide

  18. 24PSSZ *XBTBDUVBMMZVTJOHUPLFOTFRVFODFTBTXFMMBT"45TUP
    fi
    OEPVU
    UIFFYBDUMPDBUJPOPGPQFSBUPSTBQQFBSJOHJOBTTFSUJPOFYQSFTTJPOT TJHI

    2͝ΊΜͳ͍͞ɺࣜͷதʹొ৔͢Δԋࢉࢠͷਖ਼֬ͳҐஔΛௐ΂ΔͨΊʹɺ࣮͸
    "45͚ͩͰͳ͘τʔΫϯྻ΋࢖͍ͬͯ·ͨ͠ʢͨΊଉʣ
    "5IFO UIFUPLFOTFRVFODFQBSTFECZCBCFMQBSTFSTIPVMEBMTPCF
    DPOWFSUFEUP+40/ FNCFEEFEJOUIFDPEF BOEQBTTFEUPUIFSVOUJNFTJEF
    "Ͱ͸CBCFMQBSTFS͕QBSTFͨ͠τʔΫϯྻ΋+40/Խͯ͠ίʔυʹຒΊࠐΈɺϥ
    ϯλΠϜଆʹ౉͠·͠ΐ͏ɻ

    View Slide

  19. \"body\"],\"DeclareFunction\":[\"id\"],\"DeclareInterface\":[\"id\",\"typeParameters\",\"extends\",\"mixins\",\"implements\",\"body\"],\"DeclareModule\":[\"id\",\"body\"],\"DeclareModuleExports
    [\"typeAnnotation\"],\"DeclareTypeAlias\":[\"id\",\"typeParameters\",\"right\"],\"DeclareOpaqueType\":[\"id\",\"typeParameters\",\"supertype\"],\"DeclareVariable\":[\"id\"],\"DeclareExportDecla
    [\"declaration\",\"specifiers\",\"source\"],\"DeclareExportAllDeclaration\":[\"source\"],\"DeclaredPredicate\":[\"value\"],\"ExistsTypeAnnotation\":[],\"FunctionTypeAnnotation\":[\"typeParamete
    \"params\",\"rest\",\"returnType\"],\"FunctionTypeParam\":[\"name\",\"typeAnnotation\"],\"GenericTypeAnnotation\":[\"id\",\"typeParameters\"],\"InferredPredicate\":[],\"InterfaceExtends\":[\"id
    \"typeParameters\"],\"InterfaceDeclaration\":[\"id\",\"typeParameters\",\"extends\",\"mixins\",\"implements\",\"body\"],\"InterfaceTypeAnnotation\":[\"extends\",\"body\"],\"IntersectionTypeAnno
    [\"types\"],\"MixedTypeAnnotation\":[],\"EmptyTypeAnnotation\":[],\"NullableTypeAnnotation\":[\"typeAnnotation\"],\"NumberLiteralTypeAnnotation\":[],\"NumberTypeAnnotation\":[],\"ObjectTypeAnno
    [\"properties\",\"indexers\",\"callProperties\",\"internalSlots\"],\"ObjectTypeInternalSlot\":[\"id\",\"value\",\"optional\",\"static\",\"method\"],\"ObjectTypeCallProperty\":[\"value\"],
    \"ObjectTypeIndexer\":[\"id\",\"key\",\"value\",\"variance\"],\"ObjectTypeProperty\":[\"key\",\"value\",\"variance\"],\"ObjectTypeSpreadProperty\":[\"argument\"],\"OpaqueType\":[\"id\",\"typePa
    \"supertype\",\"impltype\"],\"QualifiedTypeIdentifier\":[\"id\",\"qualification\"],\"StringLiteralTypeAnnotation\":[],\"StringTypeAnnotation\":[],\"ThisTypeAnnotation\":[],\"TupleTypeAnnotation
    [\"types\"],\"TypeofTypeAnnotation\":[\"argument\"],\"TypeAlias\":[\"id\",\"typeParameters\",\"right\"],\"TypeAnnotation\":[\"typeAnnotation\"],\"TypeCastExpression\":[\"expression\",\"typeAnno
    \"TypeParameter\":[\"bound\",\"default\",\"variance\"],\"TypeParameterDeclaration\":[\"params\"],\"TypeParameterInstantiation\":[\"params\"],\"UnionTypeAnnotation\":[\"types\"],\"Variance\":[],
    \"VoidTypeAnnotation\":[],\"JSXAttribute\":[\"name\",\"value\"],\"JSXClosingElement\":[\"name\"],\"JSXElement\":[\"openingElement\",\"children\",\"closingElement\"],\"JSXEmptyExpression\":[],
    \"JSXExpressionContainer\":[\"expression\"],\"JSXSpreadChild\":[\"expression\"],\"JSXIdentifier\":[],\"JSXMemberExpression\":[\"object\",\"property\"],\"JSXNamespacedName\":[\"namespace\",\"nam
    \"JSXOpeningElement\":[\"name\",\"attributes\"],\"JSXSpreadAttribute\":[\"argument\"],\"JSXText\":[],\"JSXFragment\":[\"openingFragment\",\"children\",\"closingFragment\"],\"JSXOpeningFragment\
    \"JSXClosingFragment\":[],\"Noop\":[],\"ParenthesizedExpression\":[\"expression\"],\"AwaitExpression\":[\"argument\"],\"BindExpression\":[\"object\",\"callee\"],\"ClassProperty\":[\"key\",\"val
    \"typeAnnotation\",\"decorators\"],\"OptionalMemberExpression\":[\"object\",\"property\"],\"PipelineTopicExpression\":[\"expression\"],\"PipelineBareFunction\":[\"callee\"],
    \"PipelinePrimaryTopicReference\":[],\"OptionalCallExpression\":[\"callee\",\"arguments\",\"typeParameters\",\"typeArguments\"],\"ClassPrivateProperty\":[\"key\",\"value\"],\"ClassPrivateMethod
    [\"key\",\"params\",\"body\",\"decorators\",\"returnType\",\"typeParameters\"],\"Import\":[],\"Decorator\":[\"expression\"],\"DoExpression\":[\"body\"],\"ExportDefaultSpecifier\":[\"exported\"]
    \"ExportNamespaceSpecifier\":[\"exported\"],\"PrivateName\":[\"id\"],\"BigIntLiteral\":[],\"TSParameterProperty\":[\"parameter\"],\"TSDeclareFunction\":[\"id\",\"typeParameters\",\"params\",
    \"returnType\"],\"TSDeclareMethod\":[\"decorators\",\"key\",\"typeParameters\",\"params\",\"returnType\"],\"TSQualifiedName\":[\"left\",\"right\"],\"TSCallSignatureDeclaration\":[\"typeParamete
    \"parameters\",\"typeAnnotation\"],\"TSConstructSignatureDeclaration\":[\"typeParameters\",\"parameters\",\"typeAnnotation\"],\"TSPropertySignature\":[\"key\",\"typeAnnotation\",\"initializer\"
    \"TSMethodSignature\":[\"key\",\"typeParameters\",\"parameters\",\"typeAnnotation\"],\"TSIndexSignature\":[\"parameters\",\"typeAnnotation\"],\"TSAnyKeyword\":[],\"TSUnknownKeyword\":[],
    \"TSNumberKeyword\":[],\"TSObjectKeyword\":[],\"TSBooleanKeyword\":[],\"TSStringKeyword\":[],\"TSSymbolKeyword\":[],\"TSVoidKeyword\":[],\"TSUndefinedKeyword\":[],\"TSNullKeyword\":[],\"TSNever
    [],\"TSThisType\":[],\"TSFunctionType\":[\"typeParameters\",\"typeAnnotation\"],\"TSConstructorType\":[\"typeParameters\",\"typeAnnotation\"],\"TSTypeReference\":[\"typeName\",\"typeParameters\
    \"TSTypePredicate\":[\"parameterName\",\"typeAnnotation\"],\"TSTypeQuery\":[\"exprName\"],\"TSTypeLiteral\":[\"members\"],\"TSArrayType\":[\"elementType\"],\"TSTupleType\":[\"elementTypes\"],
    \"TSOptionalType\":[\"typeAnnotation\"],\"TSRestType\":[\"typeAnnotation\"],\"TSUnionType\":[\"types\"],\"TSIntersectionType\":[\"types\"],\"TSConditionalType\":[\"checkType\",\"extendsType\",
    \"trueType\",\"falseType\"],\"TSInferType\":[\"typeParameter\"],\"TSParenthesizedType\":[\"typeAnnotation\"],\"TSTypeOperator\":[\"typeAnnotation\"],\"TSIndexedAccessType\":[\"objectType\",\"in
    \"TSMappedType\":[\"typeParameter\",\"typeAnnotation\"],\"TSLiteralType\":[\"literal\"],\"TSExpressionWithTypeArguments\":[\"expression\",\"typeParameters\"],\"TSInterfaceDeclaration\":[\"id\",
    \"typeParameters\",\"extends\",\"body\"],\"TSInterfaceBody\":[\"body\"],\"TSTypeAliasDeclaration\":[\"id\",\"typeParameters\",\"typeAnnotation\"],\"TSAsExpression\":[\"expression\",\"typeAnnota
    \"TSTypeAssertion\":[\"typeAnnotation\",\"expression\"],\"TSEnumDeclaration\":[\"id\",\"members\"],\"TSEnumMember\":[\"id\",\"initializer\"],\"TSModuleDeclaration\":[\"id\",\"body\"],\"TSModule
    [\"body\"],\"TSImportEqualsDeclaration\":[\"id\",\"moduleReference\"],\"TSExternalModuleReference\":[\"expression\"],\"TSNonNullExpression\":[\"expression\"],\"TSExportAssignment\":[\"expressio
    \"TSNamespaceExportDeclaration\":[\"id\"],\"TSTypeAnnotation\":[\"typeAnnotation\"],\"TSTypeParameterInstantiation\":[\"params\"],\"TSTypeParameterDeclaration\":[\"params\"],\"TSTypeParameter\"
    [\"constraint\",\"default\"]}";




    (0, _powerAssert.default)(_rec8._expr(_rec8._capt(_rec8._capt(_rec8._capt(_rec8._capt((0, _enzyme.mount)(_react.default.createElement(_Foo.default, null)), "arguments/0/left/object/callee
    object").find('.foo'), "arguments/0/left/object").length, "arguments/0/left") === 1, "arguments/0"), {


    content: "assert(mount().find('.foo').length === 1)",


    filepath: "test/fixtures/React/fixture.js",


    line: 60,


    ast: "{\"type\":\"CallExpression\",\"callee\":{\"type\":\"Identifier\",\"name\":\"assert\",\"range\":[0,6]},\"arguments\":[{\"type\":\"BinaryExpression\",\"operator\":\"===\",\"left\":{
    \"MemberExpression\",\"object\":{\"type\":\"CallExpression\",\"callee\":{\"type\":\"MemberExpression\",\"object\":{\"type\":\"CallExpression\",\"callee\":{\"type\":\"Identifier\",\"name\":\"mou
    \"range\":[7,12]},\"arguments\":[{\"type\":\"JSXElement\",\"openingElement\":{\"type\":\"JSXOpeningElement\",\"name\":{\"type\":\"JSXIdentifier\",\"name\":\"Foo\",\"range\":[14,17]},\"attribute
    \"selfClosing\":true,\"range\":[13,20]},\"closingElement\":null,\"children\":[],\"range\":[13,20]}],\"range\":[7,21]},\"property\":{\"type\":\"Identifier\",\"name\":\"find\",\"range\":[22,26]},
    \"computed\":false,\"range\":[7,26]},\"arguments\":[{\"type\":\"StringLiteral\",\"value\":\".foo\",\"range\":[27,33]}],\"range\":[7,34]},\"property\":{\"type\":\"Identifier\",\"name\":\"length\
    \"range\":[35,41]},\"computed\":false,\"range\":[7,41]},\"right\":{\"type\":\"NumericLiteral\",\"value\":1,\"range\":[46,47]},\"range\":[7,47]}],\"range\":[0,48]}",


    tokens: "[{\"type\":{\"label\":\"name\"},\"value\":\"assert\",\"range\":[0,6]},{\"type\":{\"label\":\"(\"},\"range\":[6,7]},{\"type\":{\"label\":\"name\"},\"value\":\"mount\",\"range\":
    {\"type\":{\"label\":\"(\"},\"range\":[12,13]},{\"type\":{\"label\":\"jsxTagStart\"},\"range\":[13,14]},{\"type\":{\"label\":\"jsxName\"},\"value\":\"Foo\",\"range\":[14,17]},{\"type\":{\"label
    \"value\":\"/\",\"range\":[18,19]},{\"type\":{\"label\":\"jsxTagEnd\"},\"range\":[19,20]},{\"type\":{\"label\":\")\"},\"range\":[20,21]},{\"type\":{\"label\":\".\"},\"range\":[21,22]},{\"type\"
    {\"label\":\"name\"},\"value\":\"find\",\"range\":[22,26]},{\"type\":{\"label\":\"(\"},\"range\":[26,27]},{\"type\":{\"label\":\"string\"},\"value\":\".foo\",\"range\":[27,33]},{\"type\":{\"lab
    \"},\"range\":[33,34]},{\"type\":{\"label\":\".\"},\"range\":[34,35]},{\"type\":{\"label\":\"name\"},\"value\":\"length\",\"range\":[35,41]},{\"type\":{\"label\":\"==/!=\"},\"value\":\"===\",\"


    *UXPSLT CVU

    View Slide

  20. $BTF4UVEZTUSJOHXJEUI

    View Slide

  21. $BTFTUVEZ4USJOHXJEUI
    const truthy = '真理';


    const falsy = 0;


    assert(truthy === falsy);

    View Slide

  22. $BTFTUVEZ4USJOHXJEUI
    const truthy = '真理';


    const falsy = 0;


    assert(truthy === falsy);
    assert(truthy === falsy)


    | | |


    | | 0


    "真理" false


    (BQ

    View Slide

  23. 2)PXEPZPVDBMDVMBUFTUSJOHXJEUIXIFOUIFDBQUVSFEWBSJBCMFDPOUBJOTGVMM
    XJEUITUSJOHT GPSFYBNQMF ,BOKJDIBSBDUFST
    2Ωϟϓνϟͨ͠ม਺͕ྫ͑͹׽ࣈͷΑ͏ͳશ֯จࣈྻΛؚΜͰ͍Δ৔߹ͷจࣈ෯ܭࢉΛ
    Ͳ͏͠·͔͢ʁ
    "6TF&BTU"TJBO$IBSBDUFS8JEUIGPSDBMDVMBUJPO&BTU"TJBO8JEUIJTPOFPG
    UIF6OJDPEF4UBOEBSE"OOFYFT XIJDIEF
    fi
    OFTUIFA&BTU@"TJBO@8JEUIAJOGPSNBUJWF
    QSPQFSUZUIBUHJWFTIJOUTBCPVUUIFDIBSBDUFSXJEUIPGFBDIDIBSBDUFSJOUIF
    6OJDPEF4UBOEBSE
    "ʮ౦ΞδΞͷจࣈ෯ʯΛܭࢉʹ࢖͍·͢ɻʮ౦ΞδΞͷจࣈ෯ʯ͸ɺ6OJDPEFඪ४ͷෟ
    ଐॻͷҰͭͰɺ6OJDPEFʹऩ࿥͞Ε͍ͯΔ֤จࣈͷจࣈ෯ʹؔ͢ΔώϯτΛ༩͑Δ
    A&BTU@"TJBO@8JEUIAࢀߟಛੑΛఆΊ͍ͯ·͢ɻ

    View Slide

  24. -PPLTHPPE
    const truthy = '真理';


    const falsy = 0;


    assert(truthy === falsy);
    assert(truthy === falsy)


    | | |


    | | 0


    "真理" false


    (PPE

    View Slide

  25. 😺)FSFDPNFTUIF&NPKJT👻

    View Slide

  26. &NPKJT
    const family = '👨';


    const falsy = 0;


    assert(family === falsy);

    View Slide

  27. 2)PXEPZPVDBMDVMBUFTUSJOHXJEUIXIFOUIFDBQUVSFEWBSJBCMF
    DPOUBJOTFNPKJT
    2Ωϟϓνϟͨ͠ม਺͕ֆจࣈΛؚΜͰ͍Δ৔߹ͷจࣈྻ෯ܭࢉΛͲ͏͠
    ·͔͢ʁ
    "6TFFNPKJSFHFYQBDLBHFUPJEFOUJGZFNPKJTBOEUSFBUUIFNBT
    GVMMXJEUITUSJOHT
    "ʮFNPKJSFHFYʯύοέʔδΛ࢖ͬͯֆจࣈΛࣝผ͠ɺશ֯จࣈྻͱ͠
    ͯѻ͍·͠ΐ͏ɻ

    View Slide

  28. -PPLTHPPE
    const family = '👨';


    const falsy = 0;


    assert(family === falsy);
    assert(family === falsy)


    | | |


    | | 0


    "👨" false


    View Slide

  29. )FSFDPNFTUIF&NPKJ;8+ ;FSP8JEUI+PJOFS

    👁🗨 = 👁+🗨
    👨
    👨 = 👱+❤+💋+👱
    👪 = 👱+👩+👧+👦

    View Slide

  30. FYQFDUFE
    const family = '👨👩';


    const falsy = 0;


    assert(family === falsy);
    assert(family === falsy)


    | | |


    | | 0


    "👨👩" false


    View Slide

  31. 8SFTUMJOHXJUIFNPKJTBOEBNCJHVPVTDIBSBDUFST
    export function widthOf (str: string): KnownWidth | UnknownWidth {


    const segmenter = new Intl.Segmenter();


    const emojiRe = emojiRegex();


    let width = 0;


    let unknown = false;


    let emoji = 0;


    let ambiguous = 0;


    let neutral = 0;


    for (const { segment: seg } of segmenter.segment(str)) {


    const code = easta(seg);


    switch (code) {


    case 'F':


    width += 2;


    break;


    case 'H':


    width += 1;


    break;


    case 'A':


    unknown = true;


    ambiguous += 1;


    width += 2;


    break;


    case 'W':


    if (emojiRe.test(seg)) {


    unknown = true;


    emoji += 1;


    }


    width += 2;


    break;


    case 'Na':


    width += 1;


    break;


    case 'N':


    unknown = true;




    View Slide

  32. 4UJMMCSPLFO
    const family = '👨👩';


    const falsy = 0;


    assert(family === falsy);

    View Slide

  33. )FSFDPNFTUIF5ZQF4DSJQU
    )FSFDPNFTUIF#BCFMPS
    )PXBCPVUTVQQPSUJOH999

    View Slide

  34. IUUQDBUCPSHKBSHPOIUNMJOEFYIUNM

    View Slide

  35. 8IFOPOFJTEFTJHOJOHUIFTVDDFTTPSUPBSFMBUJWFMZTNBMM FMFHBOU BOE
    TVDDFTTGVMTZTUFN UIFSFJTBUFOEFODZUPCFDPNFHSBOEJPTFJOPOFT
    TVDDFTTBOEEFTJHOBOFMFQIBOUJOFGFBUVSFMBEFONPOTUSPTJUZ
    5IFUFSNXBT
    fi
    STUVTFECZ'SFE#SPPLTJOIJTDMBTTJD5IF.ZUIJDBM.BO
    .POUI&TTBZTPO4PGUXBSF&OHJOFFSJOH "EEJTPO8FTMFZ

    ൺֱతখ͘͞ΤϨΨϯτͰ੒ޭΛऩΊͨγεςϜͷޙܧγεςϜΛઃܭ͢Δ৔߹
    ʹɺ΋ͬͱ੒ޭ͠Α͏ͱࢥͬͯɺ৅ฒʢFMFQIBOUJOFʣͰػೳ͕੝Γͩ͘͞Μͷ
    Խ͚෺Λઃܭͯ͠͠·͏৔߹͕͋Δɻ
    ͜ͷ༻ޠ͸ɺ'SFE#SPPLTͷ໊ஶʰਓ݄ͷਆ࿩ʱͰॳΊͯ࢖ΘΕͨɻ
    IUUQDBUCPSHKBSHPOIUNM4TFDPOETZTUFNF
    ff
    FDUIUNM
    TFDPOETZTUFNF
    ff
    FDU TZOESPNF
    O

    View Slide

  36. IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXNZUIJDBMNBONPOUIUIF

    View Slide

  37. "OBSDIJUFDUT
    fi
    STUXPSLJTBQUUPCFTQBSFBOEDMFBO)FLOPXTIFEPFTOULOPXXIBUIFTEPJOH
    TPIFEPFTJUDBSFGVMMZBOEXJUIHSFBUSFTUSBJOU"TIFEFTJHOTUIF
    fi
    STUXPSL GSJMMBGUFSGSJMMBOE
    FNCFMMJTINFOUBGUFSFNCFMMJTINFOUPDDVSUPIJN5IFTFHFUTUPSFEBXBZUPCFVTFEOFYUUJNF
    ΞʔΩςΫτ͸ɺ࠷ॳͷ࢓ࣄͰ͸ɺ੍ࣗͯ͠ա৒ͳ΋ͷΛ෇͚Ճ͑ͳ͍͜ͱ͕ଟ͍ɻࣗ෼ͰԿΛ͍ͯ͠Δͷ
    ͔͕෼͔Βͳ͍͜ͱΛೝ͍ࣝͯ͠ΔͷͰɺԿࣄ΋৻ॏ͔ͭे෼ͳઅ౓Λ΋ͬͯߦ͏ɻ࠷ॳͷ࢓ࣄΛσβΠϯ
    ͍ͯ͘͠ͱ͖ɺ͔࣍Β࣍΁ͱϑϦϧ΍Β০Γ΍Β༨ܭͳ΋ͷ͕ࢥ͍ු͔ΜͰ͘Δͷ͕ͩɺͦΕ͸ʮ࣍ճʯ࢖
    ͓͏ͱऔ͓ͬͯ͘ɻ
    4PPOFSPSMBUFSUIF
    fi
    STUTZTUFNJT
    fi
    OJTIFE BOEUIFBSDIJUFDU XJUI
    fi
    SNDPO
    fi
    EFODFBOEB
    EFNPOTUSBUFENBTUFSZPGUIBUDMBTTPGTZTUFNT JTSFBEZUPCVJMEBTFDPOETZTUFN
    ͦ͏͜͏͢Δ͏ͪʹ࠷ॳͷγεςϜ͕׬੒ͯ͠ɺΞʔΩςΫτʹ͸֬ݻͨΔࣗ৴ͱͦͷखͷΫϥεͷγες
    Ϝʹର͢Δܦݧ͕උΘΓɺೋ౓໨ͷγεςϜͷ։ൃͷ४උ͕Ͱ͖Δɻ
    IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXNZUIJDBMNBONPOUIUIF
    fi
    STUXPSLJTBQUUPCFTQBSFBOEDMFBO

    View Slide

  38. 5IJTTFDPOEJTUIFNPTUEBOHFSPVTTZTUFNBNBOFWFSEFTJHOT
    ͜ͷೋ౓໨ͷγεςϜͦ͜ɺσβΠϯ͢Δ΋ͷͷ͏ͪͰ࠷΋ةݥͳ΋ͷͰ͋Δɻ
    5IFHFOFSBMUFOEFODZJTUPPWFSEFTJHOUIFTFDPOETZTUFN VTJOHBMMUIF
    JEFBTBOEGSJMMTUIBUXFSFDBVUJPVTMZTJEFUSBDLFEPOUIF
    fi
    STUPOF5IF
    SFTVMU BT0WJETBZT JTBCJHQJMF
    Ұൠతʹɺೋ౓໨ͷγεςϜΛσβΠϯ͠ա͗Δ܏޲͕͋Δɻ͜ͷͱ͖ɺ࠷ॳͷ
    γεςϜσβΠϯͰ͸஫ҙਂ͘֎ͨ͋͠ΒΏΔΞΠσΞͱ૷০Λ࢖͏ɻ݁Ռ͸Φ
    ϏσΟ΢εͷݴͬͨΑ͏ʹʮࢁʯͱͳΔɻ
    IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXNZUIJDBMNBONPOUIUIF
    5IFHFOFSBMUFOEFODZJTUPPWFSEFTJHOUIFTFDPOETZTUFN

    View Slide

  39. View Slide

  40. *GUIFSFJTO`UBTJNQMFTPMVUJPOUPBQSPCMFN JOUFSSPHBUFUIFQSPCMFN
    CFGPSFZPVBDDFQUBDPNQMJDBUFETPMVUJPO*TUIFQSPCMFNZPV`SFUSZJOH
    UPTPMWFBDUVBMMZUIFQSPCMFNUIBUOFFETTPMWJOH 0SBSFZPVNBLJOH
    VOOFDFTTBSZBTTVNQUJPOTBCPVUUIFQSPCMFNUIBUBSFDPNQMJDBUJOH
    ZPVSTPMVUJPO
    ໰୊ʹ୯७ͳղ๏͕ଘࡏ͠ͳ͍ΜͩͬͨΒɺෳࡶͳղ๏Λड͚ೖΕΔલʹɺ
    ໰୊ʹର͠ɺ໰͍Λ౤͔͚͛ͯݕ౼ͯ͠ΈΔ΂͖ͩɻղ͜͏ͱ͍ͯ͠Δͦͷ໰
    ୊͸ɺຊ౰ʹղ͘΂͖໰୊ͳΜͩΖ͏͔ɻ͋Δ͍͸ɺղ๏Λෳࡶʹ͢ΔΑ͏
    ͳɺ໰୊ʹؔ͢ΔෆཁͳԾఆΛઃ͚ͯ͠·͍ͬͯͳ͍ͩΖ͏͔ɻ
    IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXUIFSVMFTPG
    4PNFUJNFT*U`T#FUUFSUP4JNQMJGZUIF1SPCMFN3BUIFSUIBOUIF4PMVUJPO

    View Slide

  41. -FUTSFEFTJHOUIFUIJSETZTUFN

    View Slide

  42. #MBOLTJOUIFBTTFSUJPOFYQSFTTJPO
    assert(truthy === falsy);

    View Slide

  43. .BLFUIFGPMMPXJOHTJNQMFBTTVNQUJPOT
    Լهͷ؆୯ͳલఏΛ͓͘
    w5SBOTQJMFSTIBWFBDDFTTUPUIFDPEFJUTFMG
    w.PTUBTTFSUJPOTBSFXSJUUFOPOBTJOHMFMJOF
    wτϥϯεύΠϥ͸ίʔυͦͷ΋ͷʹΞΫηεͰ͖Δ
    w΄ͱΜͲͷBTTFSUJPO͸ҰߦͰॻ͔Ε͍ͯΔ
    #MBOLTJOUIFBTTFSUJPOFYQSFTTJPO"5IJSE4ZTUFN4PMVUJPO

    View Slide

  44. 5IFBTTFSUJPOMJOFDBOCFDVUPVUPGUIFDPEF
    5IFQPTJUJPODBOCFEFUFSNJOFEBUUSBOTQJMFUJNF
    5IFDBQUVSFEQPTJUJPOJTUIFQPTJUJPOJOUIFBTTFSUJPOTUSJOH TPOPOFFEUP
    QBSTFPSUSBWFSTFBUSVOUJNF
    BTTFSUJPOߦ͸ίʔυ͔Β੾Γग़ͤ͹ྑ͍
    Ґஔ͸τϥϯεύΠϧ࣌ʹ֬ఆͰ͖Δ
    Ωϟϓνϟ͞ΕͨҐஔ͸͢ͳΘͪද໌ࣜจࣈྻͷதͷҐஔʹͳΔͷͰɺ࣮ߦ࣌ʹ
    QBSTF΍USBWFSTF͸ෆཁʹͳΔ
    #MBOLTJOUIFBTTFSUJPOFYQSFTTJPO"5IJSE4ZTUFN4PMVUJPO

    View Slide

  45. .VMUJMJOFBTTFSUJPOFYQSFTTJPOT
    assert(truthy


    ===


    falsy);

    View Slide

  46. 4UPQDBOPOJDBMJ[JOHBTTFSUJPOFYQSFTTJPOTUIBUTQBOTNVMUJQMFMJOFT
    *OTUFBE QBTTDBQUVSFEWBMVFTUPUIFUFTUSVOOFSBTBDUVBMFYQFDUFE
    ෳ਺ߦʹ·͕ͨΔද໌ࣜͷਖ਼نԽΛ΍ΊΔ
    ͦͷ͔ΘΓʹɺΩϟϓνϟͨ͠஋ΛBDUVBMFYQFDUFEͱͯ͠ςετϥϯ
    φʔʹ౉͢
    .VMUJMJOFBTTFSUJPOFYQSFTTJPOT"5IJSE4ZTUFN4PMVUJPO

    View Slide

  47. 4USJOHXJEUIPG&NPKJT
    const family = '👨👩';


    const falsy = 0;


    assert(family === falsy);

    View Slide

  48. *UJTEJ
    ff i
    DVMUUPBDDVSBUFMZDBMDVMBUFUIFXJEUIPGBTUSJOH
    +VTUVTFPOFMJOFGPSFBDITUSJOH
    จࣈྻͷ෯Λਖ਼֬ʹܭࢉ͢Δͷ͸೉͍͠
    จࣈྻͻͱͭຖʹҰߦ࢖͑͹ྑ͍
    4USJOHXJEUIPG&NPKJT"5IJSE4ZTUFN4PMVUJPO

    View Slide

  49. 8IZOPUKVTUVTFUIJTEFTJHOGSPNUIFCFHJOOJOH
    ࠷ॳ͔Β͜ͷઃܭʹ͢Ε͹ྑ͔ͬͨͷͰ͸ʁ

    View Slide

  50. )PXEPFTUIFBSDIJUFDUBWPJEUIFTFDPOETZTUFNF
    ff
    FDU 8FMM PCWJPVTMZIFDBOU
    TLJQIJTTFDPOETZTUFN#VUIFDBOCFDPOTDJPVTPGUIFQFDVMJBSIB[BSETPGUIBU
    TZTUFN BOEFYFSUFYUSBTFMGEJTDJQMJOFUPBWPJEGVODUJPOBMPSOBNFOUBUJPOBOEUP
    BWPJEFYUSBQPMBUJPOPGGVODUJPOTUIBUBSFPCWJBUFECZDIBOHFTJOBTTVNQUJPOTBOE
    QVSQPTFT
    ΞʔΩςΫτ͸ɺͲͷΑ͏ʹͯ͠ηΧϯυγεςϜ঱ީ܈Λճආ͢Ε͹Α͍ͩΖ͏͔ɻ

    ͱ΋͔͘ɺೋ౓໨ͷγεςϜΛεΩοϓ͢Δ͜ͱ͸Ͱ͖ͳ͍ɻ͕ɺ

    ηΧϯυγεςϜݻ༗ͷةݥੑʹ஫ҙͯ͠ɺػೳΛ০Γ෇͚ͨΓɺ

    લఏ΍໨తͷมԽʹΑͬͯෆཁʹͳͬͯ͠·͏ػೳΛิͬͨΓ͠ͳ͍Α͏ɺ

    े෼੍ࣗ৺Λ஁͑Δ͜ͱ͸ՄೳͰ͋Δɻ
    IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXNZUIJDBMNBONPOUIUIF
    $BOUTLJQTFDPOETZTUFN

    View Slide

  51. )PXEPZPVCVJMEUIF5IJSE4ZTUFN
    ͲͷΑ͏ʹ͢Ε͹ɺୈࡾͷγεςϜΛ࡞ΕΔͷͩΖ͏͔ʁ
    :PVCVJMEUIFPUIFSUXPTZTUFNT
    fi
    STU5IFSFJTOPPUIFSXBZ
    ࠷ॳʹଞͷೋͭͷγεςϜΛ࡞ΔͷͩɻͦΕҎ֎ͷํ๏͸ͳ͍ɻ
    IUUQTXXXBNB[PODPKQ6/*91IJMPTPQIZ.JLF(BODBS[EQ
    )PXEPZPVCVJMEUIF5IJSE4ZTUFN

    View Slide

  52. 5IFNPTUJNQPSUBOUBOEFMVTJWFTLJMMJTEFWFMPQJOHKVEHFNFOUBCPVU
    TZTUFNEFTJHOTPZPVDBODIPPTFTPMVUJPOTUIBUBSFBTTJNQMFBT
    QPTTJCMF CVUOPTJNQMFS5IJTJTWFSZIBSEUPUFBDIBOEMFBSOFE
    NPTUMZUISPVHIFYQFSJFODF
    Ұ൪ॏཁͰҰ൪΍͔͍ͬͳεΩϧ͸γεςϜΛઃܭ͢ΔͨΊͷ൑அྗͩɻ
    ݶΓͳ͘γϯϓϧ͕ͩγϯϓϧ͗͢ͳ͍σβΠϯ BTTJNQMFBTQPTTJCMF
    CVUOPTJNQMFS
    ͱ͍͏ͷ͸ͳ͔ͳ͔ڭ͑ΒΕΔ΋ͷͰ͸ͳ͘ɺ

    େํܦݧΛॏͶ֮ͯ͑Δ΋ͷͩɻ
    BTTJNQMFBTQPTTJCMF CVUOPTJNQMFS
    IUUQTXXXRVPSBDPN)PXEJE&WBO1SJFTUMFZMFBSOUPQSPHSBN

    View Slide

  53. 0OFNPSFUIJOH

    View Slide

  54. View Slide

  55. ᦲ஍*OUFSTFDUJOH)JHIXBZ
    (SPVOEXIJDIGPSNTUIFLFZUPUISFFDPOUJHVPVTTUBUFT TPUIBUIF
    XIPPDDVQJFTJU
    fi
    STUIBTNPTUPGUIF&NQJSFBUIJTDPNNBOE JTB
    HSPVOEPGJOUFSTFDUJOHIJHIXBZT
    ॾިͷྖ஍ʹࡾํͰ௨͍ͯͯ͡ɺͦ͜ʹઌʹԡ͑͞Ε͹ॾࠃͱ௨ͯ͡ࢧ࣋
    ࢧԉΛಘΒΕΔ৔ॴ͕ʮᦲ஍ʢͪ͘ʣʯͰ͋Δɻ

    View Slide

  56. IUUQT[FOOEFWOBLBBLJTUBSUJDMFTCG
    8IFSFJTUIFJOUFSTFDUJOHIJHIXBZ

    View Slide

  57. IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXQSPHSBNNJOHSVTUOE
    &OUFSUIF3VTUXPSME

    View Slide

  58. IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXQSPHSBNNJOHSVTUOE
    1SPHSBNNJOH3VTU OE&EJUJPO
    0VSHPBMXBTUPUBDLMFUIFCJH OFXDPODFQUTJO3VTUVQGSPOUBOE
    IFBEPO QSFTFOUJOHUIFNDMFBSMZBOEJOEFQUITPBTUPNJOJNJ[F
    MFBSOJOHCZUSJBMBOEFSSPS
    ΘΕΘΕͷ໨త͸ɺ3VTUͷେ͖ͯ͘৽͍͠ίϯηϓτʹ

    ਖ਼໘͔ΒऔΓ૊Έɺ໌շʹɺͦͯ͠ৄࡉʹઆ໌͢Δ͜ͱͰɺ

    ࢼߦࡨޡͰͷֶशΛ࠷খݶʹ͢Δ͜ͱͩɻ

    View Slide

  59. 0OFNPSFUIJOH

    View Slide

  60. *TV
    ff
    FSFEGSPNUIFUZQJDBMTFDPOETZTUFNTZOESPNFJOUIFEFWFMPQNFOUPGNZPXO
    044QSPEVDUT FTQFDJBMMZQPXFSBTTFSU
    *XJMMFYQMBJOXIBUTFDPOETZTUFNTZOESPNFJTBOEIPXUPSFDPWFSGSPNJU CBTFEPONZ
    PXOFYQFSJFODF
    ࣗ࡞044ϓϩμΫτɺಛʹQPXFSBTTFSUͷ։ൃʹ͓͍ͯయܕతͳʮηΧϯυγεςϜγϯυ
    ϩʔϜʯʹጶױ͠·ͨ͠ɻʮηΧϯυγεςϜγϯυϩʔϜʯͱ͸Կ͔ɺͲ͏΍͔ͬͯͦ͜ΒϦΧ
    όϦʔ͢Δ͔ɺࣗ෼ͷମݧΛϕʔεʹઆ໌͠·͢ɻ
    *OBEEJUJPO BOFXWFSTJPOXJMMCFSFMFBTFEPOUIFTBNFEBZ
    ͋Θͤͯɺ౰೔৽͍͠όʔδϣϯΛϦϦʔε͢Δ༧ఆͰ͢
    BCTUSBDU

    View Slide

  61. *TV
    ff
    FSFEGSPNUIFUZQJDBMTFDPOETZTUFNTZOESPNFJOUIFEFWFMPQNFOUPGNZPXO
    044QSPEVDUT FTQFDJBMMZQPXFSBTTFSU
    *XJMMFYQMBJOXIBUTFDPOETZTUFNTZOESPNFJTBOEIPXUPSFDPWFSGSPNJU CBTFEPONZ
    PXOFYQFSJFODF
    ࣗ࡞044ϓϩμΫτɺಛʹQPXFSBTTFSUͷ։ൃʹ͓͍ͯయܕతͳʮηΧϯυγεςϜγϯυ
    ϩʔϜʯʹጶױ͠·ͨ͠ɻʮηΧϯυγεςϜγϯυϩʔϜʯͱ͸Կ͔ɺͲ͏΍͔ͬͯͦ͜ΒϦΧ
    όϦʔ͢Δ͔ɺࣗ෼ͷମݧΛϕʔεʹઆ໌͠·͢ɻ
    *OBEEJUJPO BOFXWFSTJPOXJMMCFSFMFBTFEPOUIFTBNFEBZ
    ͋Θͤͯɺ౰೔৽͍͠όʔδϣϯΛϦϦʔε͢Δ༧ఆͰ͢
    BCTUSBDU

    View Slide

  62. Available Today

    View Slide

  63. OQNJOTUBMM%!QPXFSBTTFSUFTN
    PS
    OQNJOTUBMM%TXDQMVHJOQPXFSBTTFSU
    5IBOLZPV

    View Slide

  64. 5IBOLZPV

    View Slide