DroidKaigi 2018でプレゼンさせていただいたスライドです。
.FEJB$PEFDͰಈըฤूΛͯ͠ΈΑ͏%SPJE,BJHJEBBTVV
View Slide
ॳొஃʂʂ
ࣗݾհ$$IBOOFMגࣜձࣾ"OESPJE&OHJOFFS݉1.ਢాխ೭ʮNZTUBʯΤϯλϝಈըΞϓϦʮ4PEBʯಈըฤूΞϓϦ.BTBZVLJ4VEBEBBTVV
ࠓͷΰʔϧ"OESPJEΞϓϦΛ࡞ΕΔਓ͕ɺ.FEJB$PEFDͰϑΟϧλʔ͕͔͔ͬͨΓɺΥʔλʔϚʔΫΛ͚ͭͨಈըΛ࡞ΕΔͷʹඞཁͳٕज़Λཧղ͢Δɻ
.Q$PNQPTFSBOESPJEɾ؆୯ʹ.QʹϑΟϧλʔΥʔλʔϚʔΫɹ͕͚ͭΒΕΔɾຊͨ͠༰ͷಈ͘αϯϓϧʹIUUQTHJUIVCDPN.BTBZVLJ4VEB.Q$PNQPTFSBOESPJE
// ΥʔλʔϚʔΫnew Mp4Composer(srcMp4Path, destMp4Path).filter(new GlWatermarkFilter(watermarkBitmap, Position.RIGHT_BOTTOM)).start();// ηϐΞϑΟϧλʔnew Mp4Composer(srcMp4Path, destMp4Path).filter(new GlSepiaFilter()).start();.Q$PNQPTFSBOESPJEIUUQTHJUIVCDPN.BTBZVLJ4VEB.Q$PNQPTFSBOESPJE
࣍ᶃಈըͱᶄಈըฤूͷجૅࣝᶅ.FEJB$PEFDͷϙΠϯτᶆ0QFO(-&4ͷϙΠϯτᶇಈըʹϑΟϧλʔΛ͔͚ΔᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔᶉ࠷ޙʹ
ಈըͱԻʴө૾ᶃಈըͱը૾ग़యɹ"WJ6UJMͷқ͍͍͠ํ ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOB
ө૾ͱը૾ͷू߹ମը૾ग़యɹ"WJ6UJMͷқ͍͍͠ํ ɹIUUQBWJVUMJOGPEPVHBLFJTJLJLPOOUFOBᶃಈըͱ
ᶄಈըฤूͷجૅࣝಈըฤूͰ͓͍͑ͨ͞༻ޠͭᶃ&ODPEFᶄ$PEFDɹᶅ%FDPEFᶆ.VYFS
ɾѹॖΛͯ͠ɺಈըϑΝΠϧΛখ͘͢͞Δߦҝɻɾө૾ը૾ͷू߹ମɻGQTͰͷಈըͩͱຕͷը૾ʹͳΔɻ୯७ʹͦͷ··ॲཧΛͯ͠͠·͏ͱɺେͳ༰ྔʹͳͬͯ͠·͏ɻͦΕΛ͙ಈըฤूͰͷ༻ޠͭᶃ&ODPEFᶄಈըฤूͷجૅࣝ
ᶄ$PEFDɾ&ODPEF ѹॖ͢ΔࡍͷΞϧΰϦζϜɾ).1&("7$ͷ͜ͱΛࢦ͢ɾ"OESPJEҎ߱ɺ.FEJB$PEFD)ɹʹ΄΅શରԠಈըฤूͰͷ༻ޠͭᶄಈըฤूͷجૅࣝ
ಈըฤूͰͷ༻ޠᶅ%FDPEFɾ&ODPEF ѹॖ͞ΕͨಈըΛ෮ݩ͢Δߦҝɾಈը࠶ੜಈըϑΝΠϧΛ%FDPEFΛɹ͞Εͯ࠶ੜ͞Ε͍ͯΔᶄಈըฤूͷجૅࣝ
ಈըฤूͰͷ༻ޠᶆ.VYFSɾΤϯίʔυͨ͠ʮө૾ʯͱʮԻʯΛͭͷɹಈըϑΝΠϧͱͯ͠·ͱΊΔᶄಈըฤूͷجૅࣝ
ɾಈըΛ%FDPEF͢Δɺը૾ʹల։͢Δɻɹˣɾల։ͨ͠ը૾ʹϑΟϧλʔΛ͔͚Δɹˣɾฤूͨ͠ը૾Λ&ODPEF ѹॖͯ͠ө૾ʹ͢Δɹˣɾ&ODPEFͨ͠ө૾ͱԻΛಈըϑΝΠϧʹ͢Δɹ .VYFSಈըʹϑΟϧλʔΛ͔͚ΔTUFQᶄಈըฤूͷجૅࣝ
ᶃ.FEJB&YUSBDUPSͰը૾Λ̍ຕ̍ຕऔΓग़͢ᶄ.FEJB&YUSBDUPS͔Βड͚औͬͨσʔλΛ%FDPEFSͰ4VSGBDF5FYUVSFʹ͠ɺͦ͜ʹϑΟϧλʔΛ͔͚Δɻ&ODPEFSͰ༻ҙͨ͠(-$POUFYUʹඳըɻᶅ.FEJB.VYFSͰ.1ϑΝΠϧʹ͢Δɻᶅ.FEJB$PEFDͷϙΠϯτը૾࡞ࢀߟݩɹ"OESPJEͰ.FEJB$PEFDΛ͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣɹ[email protected].1 .FEJB&YUSBDUPS.FEJB$PEFD%FDPEFS0QFO(-&4$POUFYU'JMUFS%FDPEFS4VSGBDF&ODPEFS4VSGBDF.FEJB$PEFD&ODPEFS.FEJB.VYFS.14VSGBDF5FYUVSF4XBQ#V⒎FSESBX#ZUF#V⒎FS #ZUF#V⒎FS.Q$PNQPTFSͷΞʔΩςΫνϟ
ᶅ.FEJB$PEFDͷϙΠϯτͭͷओཁ$MBTTΛΈ߹ΘͤͯಈըฤूΛߦ͏ɾ.FEJB&YUSBDUPSɾ.FEJB$PEFDɾ.FEJB.VYFS
ᶅ.FEJB$PEFDͷϙΠϯτɾ.FEJB&YUSBDUPSɹׂͱͯ͠%FDPEFͷҰ෦Λ୲͏ɻɹɹฤूݩͷಈը͔ΒԻσʔλͱө૾ຕຕΛ#ZUF#V⒎FSͰ.FEJB$PEFDʹ͢ɻɹ.FEJB$PEFDͰѻ͑ΔҰ୯Ґ TBNQMFͣͭ͠·͢ɻ
ᶅ.FEJB$PEFDͷϙΠϯτɾ.FEJB$PEFDɹׂͱͯ͠%FDPEFͷҰ෦ͱ&ODPEFΛ୲͏ɹ%FDPEFͱ&ODPEFͦΕͧΕผͷΠϯελϯεͰ୲͏ɻɹɹ.FEJB&YUSBDUPS͔Βड͚औͬͨ#ZUF#V⒎FSΛɹ%FDPEF͢ΔΠϯελϯεͰडऔɺ0QFO(-&45FYUVSF 4VSGBDF5FYUVSFͱͯ͠ల։͢Δɻɹ&ODPEF͢ΔΠϯελϯεͰ༻ҙͨ͠(-$POUFYUͰɹ5FYUVSFΛඳը͢Δɻ
ᶅ.FEJB$PEFDͷϙΠϯτɾ.FEJB.VYFS.FEJB$PEFD͔Βฤू͞ΕͨԻɺө૾Λ#ZUF#V⒎FSͰɹडऔɺҰͭͷϑΝΠϧίϯςφΛੜ͢Δɻɹ
.FEJB&YUSBDUPSͷେࡶͳίʔυͷྲྀΕ// ΠϯελϯεੜmediaExtractor = new MediaExtractor();// ಈըฤूݩͷϑΝΠϧΛFileDescriptorܗࣜͰηοτ͢ΔɻmediaExtractor.setDataSource(inputFileDescriptor);// Decoder(MediaCodec)ͷ࡞MediaFormat inputFormat = mediaExtractor.getTrackFormat(trackIndex);decoder = MediaCodec.createDecoderByType(inputFormat.getString(MediaFormat.KEY_MIME));// Decoderʹ͢ByteBufferΛ࡞decoderInputBuffers = decoder.getInputBuffers();// sample (MediaCodecͰѻ͑Δ1୯Ґ)ͷαΠζΛऔಘint result = decoder.dequeueInputBuffer(0);int sampleSize = mediaExtractor.readSampleData(decoderInputBuffers[result], 0);// DecoderʹDataΛ͢boolean isKeyFrame = (mediaExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;decoder.queueInputBuffer(result, 0, sampleSize, mediaExtractor.getSampleTime(),isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);// ࣍ͷsampleσʔλʹਐΉmediaExtractor.advance();ᶅ.FEJB$PEFDͷϙΠϯτ
// MediaExtractor͔ΒडऔɺॲཧࡁΈͷOutput BufferΛऔಘint result = decoder.dequeueOutputBuffer(bufferInfo, 0);// 2ͭΊͷҾSurfaceʹtextureΛඳը͢Δ͔Ͳ͏͔decoder.releaseOutputBuffer(result, true);// ඳը͞Εͨtextureͷ౸ணͪdecoderSurface.awaitNewImage();// textureΛOpenGLͰඳըdecoderSurface.drawImage();// ඳը͞ΕΔ࣌ؒΛࢦఆencoderSurface.setPresentationTime(bufferInfo.presentationTimeUs * 1000);// ݱࡏඳը͞Ε͍ͯΔ༰ΛEncoderʹૹ৴encoderSurface.swapBuffers();// encoderͰඳըใΛडऔΔencoder.dequeueOutputBuffer(bufferInfo, 0);encoderOutputBuffers = encoder.getOutputBuffers();// encoderͷoutputBufferΛMediaMuxerʹͯ͠ɺmp4ϑΝΠϧʹ͢ΔmuxRender.writeSampleData(MuxRender.SampleType.VIDEO, encoderOutputBuffers[result], bufferInfo);ᶅ.FEJB$PEFDͷϙΠϯτ.FEJB$PEFDɹ.FEJB.VYFSͷେࡶͳίʔυͷྲྀΕ
.1 .FEJB&YUSBDUPS.FEJB$PEFD%FDPEFS0QFO(-&4$POUFYU'JMUFS%FDPEFS4VSGBDF&ODPEFS4VSGBDF.FEJB$PEFD&ODPEFS.FEJB.VYFS.14VSGBDF5FYUVSF4XBQ#V⒎FSESBX#ZUF#V⒎FS #ZUF#V⒎FSᶆ0QFO(-&4ͷϙΠϯτ
ᶆ0QFO(-&4ͷϙΠϯτɾ0QFO(-&4ͱɺ0QFO(-ͷܞଳ͚ͷαϒηοτ൛ɻ,ISPOPT(SPVQ͕༷ࡦఆɾ(16ͷ֤ԋࢉϢχοτશ͘ಉ͡ϓϩάϥϜΛҟͳΔσʔλʹରͯ͠ฒྻ࣮ߦ͠·͢ɻɾෳࡶͳӄӨॲཧඳըΤϑΣΫτͷࡍɺ(16ͷࢧԉʹΑͬͯɹ࣮ߦ͍ͯͨ͘͠ΊɺϚϧνίΞ$16ΑΓ༏ΕͨɹύϑΥʔϚϯεΛൃش
ᶆ0QFO(-&4ͷϙΠϯτϑΟϧλʔΛ͔͚ΔશͯͷϐΫηϧʹॲཧΛՃ͑Δ
ᶆ0QFO(-&4ͷϙΠϯτը૾ग़యɹϚΠφϏχϡʔε %άϥϑΟοΫɾϚχΞοΫε ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT0QFO(-&4Ͱͷඳը·ͰͷྲྀΕใΛ༻ҙ%σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ֤ϐΫηϧຖͷ৭Λܾఆ
ᶆ0QFO(-&4ͷϙΠϯτ0QFO(-&4Ͱͷඳը·ͰͷྲྀΕใΛ༻ҙprivate final float[] triangleVerticesData = {// X, Y, Z, U, V-1.0f, -1.0f, 0, 0.f, 0.f,1.0f, -1.0f, 0, 1.f, 0.f,-1.0f, 1.0f, 0, 0.f, 1.f,1.0f, 1.0f, 0, 1.f, 1.f,};
(-1,1,0)+y+x(1,1,0)(1,-1,0)(-1,-1,0)+z(0,0) (1,0)(0,1)67࠲ඪ ࠲ඪᶆ0QFO(-&4ͷϙΠϯτ0QFO(-&4Ͱͷඳը·ͰͷྲྀΕใΛ༻ҙը૾࡞ࢀߟݩɹ͚Μ͝ͷ͓ෑɹςΫενϟϚοϐϯάIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶆ0QFO(-&4ͷϙΠϯτ7FSUFY4IBEFSͰߦ͏0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ%σΟεϓϨΠͷͲ͜ʹඳը͢ΔҐஔͷܾఆ
7FSUFY4IBEFSVOJGPSNNBUV.71.BUSJY֦େճసͳͲͷม࠲ඪVOJGPSNNBUV45.BUSJYσίʔυͨ͠ςΫενϟͷߦྻBUUSJCVUFWFDB1PTJUJPOY Z [ͷ࠲ඪBUUSJCVUFWFDB5FYUVSF$PPSEV W࠲ඪWBSZJOHWFDW5FYUVSF$PPSE'SBHNFOU4IBEFSʹ͢࠲ඪWPJENBJO \[email protected]W5FYUVSF$PPSE V45.BUSJYB5FYUVSF$PPSEYZ^ᶆ0QFO(-&4ͷϙΠϯτɾมߦྻͱ࠲ඪΛܭࢉ͠ɺҐஔΛܾఆɾςΫενϟͷ67࠲ඪͷܾఆΛ'SBHNFOU4IBEFS͢
ᶆ0QFO(-&4ͷϙΠϯτมߦྻͱը૾ग़య͚Μ͝ͷ͓ෑɹόʔςοΫεγΣʔμʹΑΔ࠲ඪܥมɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶆ0QFO(-&4ͷϙΠϯτมߦྻͱprivate float[] MVPMatrix = new float[16];// ୯ҐߦྻͷੜMatrix.setIdentityM(MVPMatrix, 0);// ฒߦҠಈMatrix.translateM(MVPMatrix, 0, x:0, y:0, z:0f);// ֦େɾॖখMatrix.scaleM(MVPMatrix, 0, x:1, y:1, z:1);// ճసMatrix.rotateM(MVPMatrix, 0, rotation:0, x:0.f, y:0.f, z:1.f);
ᶆ0QFO(-&4ͷϙΠϯτ'SBHNFOU4IBEFS৭Λมߋ͢ΔϑΟϧλʔɺΥʔλʔϚʔΫ͜͜Ͱͷॲཧ͢Δ͕伴ʹͳΔɻ֤ϐΫηϧຖͷ৭Λܾఆ0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
'SBHNFOU4IBEFSFYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSFQSFDJTJPONFEJVNQqPBUWBSZJOHWFDW5FYUVSF$PPSEWFSUFYTIBEFSVOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFಈը͔Βσίʔυ͞Εͨը૾WPJENBJO \[email protected]'SBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE^ᶆ0QFO(-&4ͷϙΠϯτɾ͖ͬͯͨ67࠲ඪʹ5FYUVSF͔Β5FYFMΛऔΓग़͠ɺɹϥελϥΠζิ͞Εͨ৭Λඳը͢Δ
ᶆ0QFO(-&4ͷϙΠϯτใΛ৭ใʹ͢ڮ͠ɻҙࣝ͠ͳͯ͘ϓϩάϥϛϯάͰ͖ΔɻϥελϥΠζը૾ग़యɹϚΠφϏχϡʔε %άϥϑΟοΫɾϚχΞοΫε ɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT0QFO(-&4Ͱͷඳը·ͰͷྲྀΕ
.1 .FEJB&YUSBDUPS.FEJB$PEFD%FDPEFS0QFO(-&4$POUFYU'JMUFS%FDPEFS4VSGBDF&ODPEFS4VSGBDF.FEJB$PEFD&ODPEFS.FEJB.VYFS.14VSGBDF5FYUVSF4XBQ#V⒎FSESBX#ZUF#V⒎FS #ZUF#V⒎FSᶆ0QFO(-&4ͷϙΠϯτᶃ%FDPEFS4VSGBDFͰ4VSGBDF5FYUVSFͱͯ͠ը૾Λड͚औΔɻ4DBMFճస༻ͷมߦྻΛཧɻᶄ'JMUFSͰ4VSGBDF5FYUVSFʹ৭Λ͚ͭͨΓɺΥʔλʔϚʔΫΛ͚ͭͨΓ͢Δᶅ&ODPEFS4VSGBDFͰ.FEJB$PEFDͷ&ODPEFʹॻ͖ࠐΈΛߦ͏
// ඳը͞Εͨtextureͷ౸ணͪdecoderSurface.awaitNewImage();// textureΛOpenGLͰඳը ෦ͰFilter͕drawΛߦͬͯ·͢ɻdecoderSurface.drawImage();// ඳը͞ΕΔ࣌ؒΛࢦఆencoderSurface.setPresentationTime(bufferInfo.presentationTimeUs * 1000);// ݱࡏඳը͞Ε͍ͯΔ༰ΛEncoderʹૹ৴encoderSurface.swapBuffers();// encoderͰඳըใΛडऔΔencoder.dequeueOutputBuffer(bufferInfo, 0);encoderOutputBuffers = encoder.getOutputBuffers();// encoderͷoutputBufferΛMediaMuxerʹͯ͠ɺmp4ϑΝΠϧʹ͢ΔmuxRender.writeSampleData(MuxRender.SampleType.VIDEO, encoderOutputBuffers[result], bufferInfo);ᶆ0QFO(-&4ͷϙΠϯτ%FDPEFS4VSGBDFͱ&ODPEFS4VSGBDFͷେࡶͳίʔυͷྲྀΕ
4VSGBDF5FYUVSFͱᶆ0QFO(-&4ͷϙΠϯτɾ%FDPEF͞Εͨը૾Λ0QFO(-&4ςΫενϟɹͱͯ͠ϑϨʔϜΛΩϟϓνϟ͠·͢ɻɾ"OESPJEͷ4VSGBDF5FYUVSF%ςΫενϟͰͳ͍ɾΧϝϥϓϨϏϡʔͷετϦʔϜͰ༻͞Ε͍ͯΔ
ᶇಈըʹϑΟϧλʔΛ͔͚ΔಈըʹϑΟϧλʔΛ͔͚ΔˣQJYFM͝ͱͷ৭Λ'SBHNFOU4IBEFSͰมߋ͢Δ
(MBZ4DBMFͷ'SBHNFOU4IBEFSFYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSFQSFDJTJPONFEJVNQqPBUWBSZJOHWFDW5FYUVSF$PPSEVOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFDPOTUIJHIQWFDXFJHIUWFD WPJENBJO \qPBUMVNJOBODFEPU UFYUVSF% T5FYUVSF W5FYUVSF$PPSESHC XFJHIU[email protected]'SBH$PMPSWFD WFD MVNJOBODF ^ᶇಈըʹϑΟϧλʔΛ͔͚Δ
4FQJBͷ'SBHNFOU4IBEFSFYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSFQSFDJTJPONFEJVNQqPBUWBSZJOHWFDW5FYUVSF$PPSEVOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFWPJENBJO \WFDGSBH$PMPSUFYUVSF% T5FYUVSF W5FYUVSF$PPSE[email protected]'SBH$PMPSSEPU GSBH$PMPSSHC WFD [email protected]'SBH$PMPSHEPU GSBH$PMPSSHC WFD [email protected]'SBH$PMPSCEPU GSBH$PMPSSHC WFD ^ᶇಈըʹϑΟϧλʔΛ͔͚Δ
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔɾΥʔλʔϚʔΫͷ#JUNBQΛ0QFO(-ʹૹΔɾ'SBHNFOU4IBEFSͰBMQIB߹Λߦ͏
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ#JUNBQΛ0QFO(-ʹૹΔը૾ग़య͚Μ͝ͷ͓ෑɹςΫενϟϚοϐϯάɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔը૾ग़య͚Μ͝ͷ͓ෑɹςΫενϟϚοϐϯάɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHF
'SBHNFOU4IBEFSͰΞϧϑΝ߹FYUFOTJPO([email protected]&[email protected]&([email protected]@FYUFSOBMSFRVJSFQSFDJTJPONFEJVNQqPBUWBSZJOHWFDW5FYUVSF$PPSEVOJGPSNTBNQMFS&YUFSOBM0&4T5FYUVSFVOJGPSNMPXQTBNQMFS%P5FYUVSFΞοϓϩʔυͨ͠UFYUVSFWPJENBJO \MPXQWFDDUFYUVSF% T5FYUVSF W5FYUVSF$PPSEMPXQWFDDUFYUVSF% P5FYUVSF W5FYUVSF$PPSEMPXQWFDPVUQVU$PMPSPVUQVU$PMPSSDSDSDB DBPVUQVU$PMPSHDHDHDB DBPVUQVU$PMPSCDCDCDB DBPVUQVU$PMPSBDBDB DB[email protected]'SBH$PMPSPVUQVU$PMPS^ᶈಈըʹΥʔλʔϚʔΫΛ͚ͭΔ
ᶉ࠷ޙʹɾ"OESPJEͰಈըฤू.FEJB$PEFDͱ0QFO(-&4ɹͷ߹Θٕͤɾ0QFO(-&4ྗ্͕͕Δͱදݱͷ෯͕Δɾ4FSWJDFͰ࣮ߦ͢Δ͜ͱΛΦεεϝ͠·͢ɻɾJ04ʹൺΔͱɺഒಈըੜͷ͕͔͔࣌ؒɹͬͯ͠·͏ͨΊɺ69Λߟྀ͢Δඞཁ͋Γɻ
ᶉ࠷ޙʹ&YP1MBZFS'JMUFSIUUQTHJUIVCDPN.BTBZVLJ4VEB&YP1MBZFS'JMUFSɾಈըϓϨϏϡʔதʹϑΟϧλʔΛ͔͚Δɹฤू݁ՌΛίʔσοΫͨͣʹ͔֬ΊΒΕΔ
ᶉ࠷ޙʹࢀߟϦϯΫհɾ"OESPJEͰ.FEJB$PEFDΛ͍''NQFHͳ͠ͰಈըΛѹॖ͢Δํ๏ʢϥΠϒϥϦ͋Γʣɹ .FEJB$PEFDͷΈʹେมࢀߟʹͳΓ·͢ɹ[email protected]ɾ͚Μ͝ͷ͓ෑ 0QFO(-ͷΈʹେมࢀߟʹͳΓ·͢ɹIUUQULFOHPHJUIVCJPCMPHPQFOHMFTELOPXMFEHFɾϚΠφϏχϡʔεɹ%άϥϑΟοΫεͷ֓೦ͱϨϯμϦϯάύΠϓϥΠϯɹIUUQTOFXTNZOBWJKQBSUJDMFHSBQIJDT
ᶉ࠷ޙʹ41&$*"-5)"/,4:VZB5BOBLBIUUQTHJUIVCDPNZQSFTUP[email protected][email protected],FOHP5BUFJTIJIUUQULFOHPHJUIVCJPIUUQTHJUIVCDPNULFOHPIUUQTUXJUUFSDPNULFOHP
͓·͚(-&4HM6OJGPSNGWؔΛ࣮ߦ͢Δͱͳ͔ͥ(BMBYZγϦʔζͷܥҎ্ͰTJHOBM 4*(4&(7 DPEF 4&([email protected]"1&33Ͱམͪ·ͨ͠
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠