Vol.2017-SE-195 No.8
2017/3/12৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Reportϋογϡ஋ൺֱʹΑΔ Java όΠτίʔυʹ‫·ؚ‬ΕΔϥΠϒϥϦͷ‫ݕ‬ग़ख๏໼໺ ༟‫و‬1,a)

Raula Gaikovina Kula1,b)ੴඌ ོ1,c)Ҫ্ ࠀ࿠1,d)֓ཁɿιϑτ΢ΣΞ։ൃͰ͸ɼ։ൃίετͷ࡟‫ݮ‬ͷͨΊʹϥΠϒϥϦͷར༻͕ҰൠతʹߦΘΕ͍ͯΔɽιϑτ΢ΣΞͷதʹ͸ɼϥΠϒϥϦͷίʔυΛίϐʔͯ͠಺෦ʹ‫ؚ‬ΜͰ͍Δ΋ͷ͕ଘࡏ͢Δ͕ɼ͜ͷΑ͏ͳ࠶ར༻ํ๏͕औΒΕ͍ͯΔ৔߹ɼར༻தͷϥΠϒϥϦʹؔ͢Δ৘ใͷ؅ཧ͕೉͘͠ͳΓ͕ͪͰ͋Δɽͦ͜Ͱຊ‫Ͱڀݚ‬͸ɼJava ͷιϑτ΢ΣΞͷ಺෦ʹ‫·ؚ‬ΕΔϥΠϒϥϦΛ‫ݕ‬ग़͢Δख๏ΛఏҊ͢ΔɽJava ʹ͓͍ͯ͸ɼιʔείʔυͰ͸ͳ͘ɼιʔείʔυ͔ΒίϯύΠϥʹΑͬͯੜ੒͞ΕͨɼΫϥεϑΝΠϧͱ‫ݺ‬͹ΕΔ Java όΠτίʔυΛ‫ؚ‬ΉϑΝΠϧͷ࠶ར༻͕ओྲྀͰ͋Δɽͦ͜Ͱຊख๏Ͱ͸ɼόΠτίʔυ͔Βநग़ͨ͠৘ใΛ΋ͱʹ‫ͨ͠ࢉܭ‬ϋογϡ஋ͷൺֱʹ‫͖ͮج‬ɼϥΠϒϥϦͷ࠶ར༻Λ‫ݕ‬ग़͢Δɽ·ͨɼόΠτίʔυ͔Β৘ใΛநग़͢Δࡍʹύοέʔδ໊ʹؔ͢Δ৘ใΛऔΓআ͘͜ͱʹΑͬͯɼύοέʔδϦωʔϜͷ‫ݕ‬ग़ΛՄೳʹͨ͠ɽΩʔϫʔυɿιϑτ΢ΣΞ࠶ར༻ɼJava όΠτίʔυɼґଘؔ܎Λ‫ؚ‬Ή JAR

1. ·͕͖͑Λಛఆ͢Δ‫ط‬ଘ‫ڀݚ‬͸਺ଟ͘ଘࡏ͠ɼྫ͑͹ιʔείʔυ͕ར༻Մೳͳ৔߹ʹ͸ɼίʔυͷҰ෦ͳͲΛೖྗ͢Δ͜ͱιϑτ΢ΣΞ։ൃʹ͓͍ͯɼ֎෦ͷϓϩδΣΫτ͔ΒʹΑͬͯҰக͢ΔίʔυยΛ‫ؚ‬ΉιʔείʔυΛ‫͢ࡧݕ‬ίʔυΛ࠶ར༻͢Δ͜ͱ͕ҰൠతʹߦΘΕ͍ͯΔɽ·ͨɼ

Δ Inoue Βͷ Ichi Tracker[2] ΍ɼ࠶ར༻͞ΕͨͱࢥΘΕΔϥΠϒϥϦͱ‫ݺ‬͹ΕΔ࠶ར༻Λߦ͏ͨΊͷίʔυ΋੝ΜʹϑΝΠϧΛೖྗͱ͠ɼιʔείʔυͷྨࣅ౓ʹΑͬͯग़ࣗ։ൃ͕ߦΘΕ͓ͯΓɼ਺ଟ͘ͷΦʔϓϯιʔεϥΠϒϥϦΛߴ଎ʹ‫͢ࡧݕ‬Δ઒ຬΒͷख๏ [3] ͳͲΛར༻͢Δ͜ͱ͕

(OSS ϥΠϒϥϦ) ͕഑෍͞Ε͍ͯΔɽϥΠϒϥϦͷར༻ՄೳͰ͋ΔɼͳͲʹΑΔίʔυͷ࠶ར༻ʹΑͬͯɼιϑτ΢ΣΞͷ։ൃຊ‫ڀݚ‬ͷର৅ͱ͍ͯ͠Δ Java Ͱ͸ɼιʔείʔυͰ͸ίετΛେ෯ʹ࡟‫͢ݮ‬Δ͜ͱ͕ՄೳʹͳΔҰํͰɼ࠶ར༻ͳ͘ΫϥεϑΝΠϧͱ‫ݺ‬͹ΕΔόΠτίʔυΛ࠶ར༻͢‫ʹݩ‬όά΍੬ऑੑ͕‫·ؚ‬Ε͍ͯͨ৔߹ɼ։ൃதͷϓϩδΣΔ͜ͱ͕ՄೳͰ͋Δɽ࣮ࡍʹɼHeinemann Β͕ΦʔϓϯΫτʹ΋ಉ༷ͷෆ۩߹ΛऔΓࠐΜͰ͠·͏‫ݥة‬ੑ͕ଘࡏ͢ιʔεͷ Java ͷϓϩδΣΫτʹରͯ͠ߦͬͨௐࠪʹΑΔΔɽ͜ͷΑ͏ͳ৔߹ɼར༻ͷதࢭ΍मਖ਼൛΁ͷΞοϓσʔͱɼιʔείʔυͷ࠶ར༻ΑΓ΋όΠτίʔυͷ࠶ར༻͕τͳͲͷରԠΛऔΔ͜ͱͰෆ۩߹ΛऔΓআ͔ͳͯ͘͸ͳΒଟ͘ߦΘΕ͍ͯΔ͜ͱ͕൑໌͍ͯ͠Δ [4]ɽ͜ͷΑ͏ͳ৔߹ͳ͍ɽͦͷͨΊʹ͸࠶ར༻‫ݩ‬ͷϓϩδΣΫτ໊ͱͦͷόʔʹ͸ɼDavice Βͷ Software Bertillonage[5] ͷΑ͏ͳ JARδϣϯ൪߸Λਖ਼͘͠೺Ѳ͠ɼ؅ཧ͓ͯ͘͜͠ͱ͕ॏཁͱͳʢJava ΞʔΧΠϒ) ͷൺֱख๏͕ग़ࣗ‫ʹࡧݕ‬ར༻ՄೳͰ͋Δɽ͔͠͠ɼ࣮ࡍʹ͸࠶ར༻͍ͯ͠ΔϥΠϒϥϦʹؔ͢ΔΔɽ͔͠͠ɼJava Ͱ͸༷ʑͳϥΠϒϥϦʹ༝དྷ͢Δෳ਺৘ใ͕ద੾ʹ؅ཧ͞Ε͍ͯͳ͍ϓϩδΣΫτ΍ɼ࠶ར༻͠

ͷϑΝΠϧΛɼjar ϑΝΠϧͱͯ͠·ͱΊͨ΋ͷΛ഑෍͍ͯ͢ΔϥΠϒϥϦ͕੬ऑੑΛ‫ؚ‬ΜͰ͍ΔϓϩδΣΫτ͕ଟΔ͜ͱ͕ҰൠతʹߦΘΕ͍ͯΔɽ͜ͷΑ͏ͳ৔߹ʹ͸ɼͲ਺ଘࡏ͍ͯ͠Δ͜ͱ͕Θ͔͍ͬͯΔ [1]ɽͷϑΝΠϧ͕࠶ར༻͞Εͨ΋ͷͳͷ͔ಛఆ͢Δ͜ͱ͕೉͠࠶ར༻‫͕ݩ‬Θ͔Βͳ͘ͳͬͯ͠·ͬͨίʔυͷ࠶ར༻‫ݩ‬1a)b)c)d)େࡕେֶOsaka University, Suita, Osaka 565-0871, Japany-yano@ist.osaka-u.ac.jp
raula-k@ist.osaka-u.ac.jp
ishio@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jpⓒ 2017 Information Processing Society of Japan

͘ɼDavice Βͷख๏͸ར༻͢Δ͜ͱ͕Ͱ͖ͳ͍ɽෳ਺ͷϥΠϒϥϦ͕‫·ؚ‬ΕΔ jar ϑΝΠϧ͔ΒɼόΠτίʔυͷൺֱʹ‫࠶͍ͯͮج‬ར༻‫ݩ‬Λಛఆ͢Δख๏ͱͯ͠͸ɼIshio Βͷ Software Ingredients[6] ͕ଘࡏ͢Δɽ͜ͷख๏Λ༻͍Δ͜ͱͰɼྫ͑͹ɼJava ͷιϑτ΢ΣΞͷ಺෦͔1

Vol.2017-SE-195 No.8
2017/3/12

৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportΒ੬ऑੑ͕‫·ؚ‬ΕΔϥΠϒϥϦ͕‫ݕ‬ग़͞Εͨ৔߹ɼར༻Λࡍʹ͸ιʔείʔυ΍όΠφϦΛίϐʔ͢Δ͜ͱͰ಺෦ʹ΍ΊΔͳͲͷରॲΛͱΔ͜ͱ͕ՄೳͱͳΔɽ͔͠͠ɼ͜ͷऔΓࠐΜͰ͍Διϑτ΢ΣΞ (ϥΠϒϥϦ) ͕਺ଟ͘ଘࡏ͢ख๏ʹ͸όΠτίʔυͷ࠶ར༻Λߦ͏ࡍʹɼύοέʔδ໊ΔͨΊɼઃఆϑΝΠϧ͔Β͸औಘෆՄೳͳ࠶ར༻৘ใ΋ߟ͕มߋ͞Ε͍ͯͨ৔߹ʹ͸‫ݕ‬ग़͢Δ͜ͱ͕Ͱ͖ͳ͍ͱ͍͏ྀ͢Δ͜ͱ͕๬·͍͠ɽͦͷͨΊɼιϑτ΢ΣΞͷ಺෦ʹ໰୊఺͕͋Δɽ༷ʑͳཧ༝ʹΑͬͯύοέʔδͷϦωʔϜ‫·ؚ‬ΕΔίʔυͷ৘ใΛ༻͍ͯɼ࠶ར༻ͷ‫ݕ‬ग़Λߦ͏‫ڀݚ‬͸ߦΘΕɼ͞ΒʹͦͷΑ͏ͳίϯϙʔωϯτ͸࠶ར༻‫ݩ‬৘ͱ૊Έ߹ΘͤΔ͜ͱ͕ඞཁͰ͋Δͱߟ͑ΒΕΔɽใͷ؅ཧ͕೉͘͠ͳΔͱߟ͑ΒΕΔɽ࠶ར༻‫ݩ‬ͷ‫ݕ‬ग़Λߦ͏‫ͯ͠ͱڀݚ‬͸ɼιʔείʔυ͕ೖຊ‫Ͱڀݚ‬͸ɼೖྗ͞Εͨ Java ιϑτ΢ΣΞΛ͋Β͔͡ΊखՄೳͳ৔߹ʹ͸ɼίʔυͷҰ෦ͳͲΛೖྗ͢Δ͜ͱʹ࡞੒͓͍ͯͨ͠σʔλϕʔεͱൺֱ͢Δ͜ͱʹΑͬͯɼ಺ΑͬͯҰக͢ΔίʔυยΛ‫ؚ‬ΉιʔείʔυΛ‫͢ࡧݕ‬Δ෦ʹ‫·ؚ‬ΕΔϥΠϒϥϦΛ‫ݕ‬ग़͢Δख๏ΛఏҊ͢ΔɽఏҊ

Inoue Βͷ Ichi Tracker[2] ΍ɼLSH ΞϧΰϦζϜΛར༻͠ख๏Ͱ͸ɼΫϥεϑΝΠϧ (Java όΠτίʔυΛ‫ؚ‬ΉϑΝιʔεϑΝΠϧؒͷྨࣅ౓Λߴ଎Ͱਪఆ͢Δ઒ຬΒͷπʔΠϧ) ͝ͱʹಛ௃ͱͳΔΑ͏ͳ৘ใΛநग़͠ɼͦΕΛ༻͍

ϧ [3] ͳͲ͕࠶ར༻ͷ෼ੳʹར༻ՄೳͰ͋Δɽͯ‫ͨ͠ࢉܭ‬ϋογϡ஋Λൺֱʹ༻͍Δɽϋογϡ஋ͷ‫ࢉܭ‬ιʔείʔυ͕ར༻Ͱ͖ͳ͍৔߹ʹ͸ɼόΠφϦϑΝΠʹύοέʔδ໊ͷ৘ใΛ༻͍ͳ͍͜ͱʹΑͬͯɼύοέʔϧ΍ͦͷଞͷ৘ใΛ༻͍ͯ࠶ར༻෼ੳΛߦ͏ɽTeyton Βδ͕ϦωʔϜ͞Ε͍ͯͯ΋ग़͕ࣗಉ͡ΫϥεϑΝΠϧͰ͋͸ jar ϑΝΠϧʹ‫·ؚ‬ΕΔύοέʔδͷ໊લΛ༻͍ͯϥΠΕ͹ಉ͡ϋογϡ஋ͱͳΔΑ͏ʹ͍ͯ͠ΔɽͦΕΛ༻͍ͯϒϥϦ໊Λಛఆ͢Δ͜ͱʹΑͬͯɼJava ͷιϑτ΢ΣΞʹൺֱΛߦ͏͜ͱʹΑͬͯύοέʔδͷϦωʔϜΛ‫ݕ‬ग़͢Δ͓͚Δར༻ϥΠϒϥϦͷҠߦΛ‫ݕ‬ग़͢Δख๏ΛఏҊ͍ͯ͜͠ͱΛՄೳͱ͢Δɽ

Δ [10]ɽ͜ͷख๏Λ༻͍Δ͜ͱͰιϑτ΢ΣΞ಺෦ʹ‫·ؚ‬Ҏ߱ɼ2 ষͰ͸ຊ‫ڀݚ‬ͷഎ‫͍ͯͭʹܠ‬ड़΂Δɽ3 ষͰ͸ఏҊख๏ʹ͍ͭͯड़΂Δɽ4 ষͰ͸ΦʔϓϯιʔειϑτΕΔϥΠϒϥϦ໊ͷҰཡͷಛఆ͕ՄೳͰ͋Δ͕ɼόʔδϣϯ൪߸·Ͱ͸ಛఆ͢Δ͜ͱ͕Ͱ͖ͳ͍ɽ

΢ΣΞʹ‫·ؚ‬ΕΔϥΠϒϥϦͷ࠶ར༻Λ‫ݕ‬ग़͢ΔέʔεεDavice Βͷ Software Bertillonage[5] Ͱ͸ɼjar ϑΝΠϧλσΟʹ͍ͭͯड़΂Δɽ5 ষͰ͸ຊ‫ڀݚ‬ͷ·ͱΊͱࠓ‫ޙ‬ͷ಺෦ʹ‫·ؚ‬ΕΔΫϥεϑΝΠϧ (όΠφϦϑΝΠϧ) ʹ‫·ؚ‬՝୊Λड़΂ΔɽΕΔγάωνϟʹؔ͢Δ৘ใΛநग़͠ɼൺֱΛߦ͏͜ͱʹΑͬͯɼjar ϑΝΠϧؒͷྨࣅ౓Λఆ͍ٛͯ͠Δɽ͜ͷख

2. എ‫ܠ‬๏Λ༻͍Δͱɼೖྗιϑτ΢ΣΞͱྨࣅ౓͕࠷΋ߴ͍ιϑ

2.1 ࠶ར༻෼ੳτ΢ΣΞɼͭ·Γ࠶ར༻‫͑ߟͱݩ‬ΒΕΔιϑτ΢ΣΞͷ໊Java Ͱ͸ϥΠϒϥϦʹΑΔίʔυͷ࠶ར༻͕ओྲྀͰ͋લͱόʔδϣϯΛಛఆ͢Δ͜ͱ͕ՄೳͰ͋ΔɽͦͷͨΊɼΔɽ࣮ࡍʹɼBavota Βͷௐࠪ [7] ʹΑͬͯ Java ͷϓϩδΣϥΠϒϥϦΛར༻͢Δࡍʹ jar ϑΝΠϧͷ‫ܗ‬ͷ··Ͱར༻Ϋτ͕ར༻͢ΔϥΠϒϥϦͷ਺͸։ൃ͕ਐΉʹͭΕͯ૿Ճ͍ͯ͠Δ৔߹ʹ͸ɼͦͷόʔδϣϯΛಛఆ͢Δํ๏ͱ͍ͯͯ͘͜͠͠ͱ͕൑໌͍ͯ͠ΔɽϥΠϒϥϦͷར༻ͷ෼ੳΛ

Software Bertillonage ͸༏Ε͍ͯΔɽ͔͠͠ɼશͯͷར༻ߦ͏͜ͱʹΑͬͯɼޮ཰తͰ҆શͳϥΠϒϥϦͷར༻͕ՄதͷϥΠϒϥϦͷ jar ϑΝΠϧΛల։͠ɼιϑτ΢ΣΞ‫ݻ‬ೳʹͳΓɼιϑτ΢ΣΞ։ൃͷॿ͚ʹͳΔͱߟ͑ΒΕΔɽ༗ͷϑΝΠϧͱͱ΋ʹ 1 ͭͷ jar ϑΝΠϧʹ·ͱΊ͍ͯΔKula Β͸ϓϩδΣΫτʹ͓͚Δར༻தͷϥΠϒϥϦͷ

ιϑτ΢ΣΞ΋ଘࡏ͢Δɽ͜ͷΑ͏ͳϑΝΠϧ͸ fat jarΞοϓσʔτཤྺΛՄࢹԽ͢Δख๏ΛఏҊͨ͠ [8]ɽMaven΍ jar with dependencies ͳͲͱ‫ݺ‬͹ΕɼMaven AssemblyϦϙδτϦʔʹ͓͚ΔϥΠϒϥϦͷར༻ঢ়‫گ‬ͷ౷‫ܭ‬৘ใͱ

plug-in*1 ΍ eclipse*2 ͷ࣮ߦՄೳ jar ϑΝΠϧΛ࡞੒͢Δ૊Έ߹Θͤͯ࢖༻͢Δ͜ͱͰɼΞοϓσʔτΛߦ͏΂͖ί‫ػ‬ೳͳͲͱ͍ͬͨҰൠతͳखஈʹΑͬͯ؆୯ʹੜ੒͢Δ͜ϯϙʔωϯτΛಛఆ͢Δ͜ͱ͕ՄೳʹͳΔͱ͞Ε͍ͯΔɽͱ͕ՄೳͰ͋ΔɽͦͷͨΊɼෳ਺ϥΠϒϥϦʹ༝དྷ͢ΔΫؔ࿈ͯ͠զʑͷ‫ڀݚ‬άϧʔϓͰ͸ɼϥΠϒϥϦͷར༻ঢ়ϥεϑΝΠϧ͕ࠞͬͨ͟ jar ϑΝΠϧ͕ग़ճΔ͜ͱ͸௝͠‫گ‬ͷ౷‫ܭ‬৘ใΛ૊Έ߹ΘͤͰ‫ࡧݕ‬ՄೳͳπʔϧΛఏҊ͘͠ͳ͍ɽ

ͨ [9]ɽ͋ΔϥΠϒϥϦΛΞοϓσʔτ͠Α͏ͱ͢Δͱ͖ʹ

Ishio Βͷ Software Ingredients[6] ͸ίϯϙʔωϯτ͕͸ϥΠϒϥϦͷ‫׵ޓํޙ‬ੑͷ໰୊ʹΑΓɼଞͷϥΠϒϥϦjar ϑΝΠϧʹ·ͱΊΒΕ͍ͯͳ͍৔߹Ͱ΋ಉ༷ʹιϑτ͕ಈ࡞͠ͳ͘ͳͬͯ͠·͏‫ݥة‬ੑ͕͋Δɽར༻࣮੷ͷ͋Δ

΢ΣΞ಺෦ʹ‫·ؚ‬ΕΔϥΠϒϥϦͷҰཡͷ‫ݕ‬ग़͕Մೳͳ૊Έ߹ΘͤΛఏࣔ͠ɼͦΕʹैͬͯଞͷϥΠϒϥϦͷΞοπʔϧͰ͋ΔɽSoftware Bertillonage ͱಉ༷ʹΫϥεϑΝϓσʔτ΋ߟྀ͢Δ͜ͱʹΑͬͯ‫׵ޓ‬ੑʹΑΔ໰୊͕ൃੜΠϧ͔Βநग़ͨ͠γάωνϟͷ৘ใΛ༻͍ͯ jar ϑΝΠϧ͢ΔϦεΫΛ௿‫ͤ͞ݮ‬Δ͜ͱ͕ՄೳʹͳΔͱߟ͑ΒΕΔɽͷൺֱΛߦ͍ɼҰக͢ΔΫϥε਺ͷׂ߹Λ‫ޙͨ͠ࢉܭ‬ɼͦ͜ΕΒͷ‫Ͱڀݚ‬͸ɼϥΠϒϥϦͷར༻ঢ়‫ؔ͢ʹگ‬Δ৘ใͷ஋͕େ͖͍ॱʹ༏ઌ౓Λ͚ͭΔᩦཉ๏ͱ‫ݺ‬͹ΕΔΞϧΰΛ Maven ͱ͍͏ϓϩδΣΫτ؅ཧπʔϧͷ POM ϑΝΠϧͱ‫ݺ‬͹ΕΔઃఆϑΝΠϧ͔Βऔಘ͍ͯ͠Δɽ͔͠͠ɼ࣮ⓒ 2017 Information Processing Society of Japan*1*2

http://maven.apache.org/plugins/maven-assembly-plugin/https://eclipse.org/

2Vol.2017-SE-195 No.8
2017/3/12৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Report(. ΫϥεϑΝΠϧ) ͷൺֱʹΑͬͯ࠶ར༻ͷ‫ݕ‬ग़Λߦ͏ɽ͔͠͠ɼσʔλϕʔεʹ‫·ؚ‬ΕΔଟ਺ͷϥΠϒϥϦΛର৅ʹɼೖྗιϑτ΢ΣΞͱόΠτίʔυͷ௚઀ൺֱΛߦ͏ͱ๲େͳ‫ࢉܭ‬ίετ͕͔͔ΔɽͦͷͨΊɼόΠτίʔυ͔ΒಘΔ͜ͱ͕Ͱ͖Δ৘ใ͔Βϋογϡ஋Λ‫͠ࢉܭ‬ɼͦΕΛ༻͍ͯൺֱΛߦ͏͜ͱͰߴ଎ԽΛਤ͍ͬͯΔɽҰൠతʹɼ

MD5 ΍ SHA-1 ͳͲʹΑΔϑΝΠϧϋογϡ͕ϑΝΠϧ͕ਤ 1Ұக͢Δ͔Ͳ͏͔ͷ൑ఆʹ༻͍ΒΕ͍ͯΔɽ͔͠͠ಉ͡ख๏ͷ֓ཁιʔείʔυ͔Βੜ੒͞ΕͨΫϥεϑΝΠϧͰ͋ͬͯ΋ɼϦζϜʹΑͬͯ࠶ར༻‫ݩ‬Λਪఆ͢Δɽ͜ͷπʔϧ͸࠶ར༻ίϯύΠϧ࣌ͷ‫ʹڥ؀‬Αͬͯҧ͏όΠτίʔυྻΛ࣋ͭ͜‫ݩ‬ͷϥΠϒϥϦ͔Βύοέʔδ໊͕มߋ͞Ε͍ͯͨ৔߹ͱ͕͋ΓɼϑΝΠϧ͔Β௚઀‫͞ࢉܭ‬Εͨϋογϡ஋ʹΑΔʹ͸‫ݕ‬ग़͢Δ͜ͱ͕ෆՄೳͰ͋Δɽຊ‫Ͱڀݚ‬͸ SoftwareൺֱͰ͸ਖ਼֬ʹ࠶ར༻Λ‫ݕ‬ग़Ͱ͖ͳ͍‫ڪ‬Ε͕͋Δɽͦͷͨ

Ingredients Ͱ༻͍ΒΕ͍ͯͨํ๏ΛϕʔεʹɼύοέʔδΊɼίϯύΠϧ‫ڥ؀‬ͷӨ‫ڹ‬Λड͚ͳ͍ͱࢥΘΕΔ৘ใΛΫ͕ϦωʔϜ͞Ε͍ͯͯ΋࠶ར༻͞Εͨίϯϙʔωϯτͱ͠ϥεϑΝΠϧʹ‫·ؚ‬ΕΔόΠτίʔυྻ͔Βநग़͠ɼ࿈݁ͯ‫ݕ‬ग़Մೳͳख๏ΛఏҊ͢Δɽͨ͠จࣈྻ͔Βϋογϡ஋ͷ‫ࢉܭ‬Λߦ͏ɽϋογϡ஋ͷ‫͍༻ʹࢉܭ‬Δ৘ใ͸ɼDavice Βͷ Software

Bertillonage[5] ΍ Ishio Βͷ Software Ingredients[6] Ͱ΋༻

2.2 ύοέʔδͷϦωʔϜϥΠϒϥϦΛར༻͢Δʹ͋ͨͬͯɼͦͷύοέʔδ໊Λม͍ΒΕ͍ͯͨΫϥε໊΍ɼϝιου໊ͳͲͷ৘ใʹՃ͑ͯɼ*3Java όΠτίʔυ໋ྩͷࢉज़ɼ࿦ཧԋࢉͷճ਺Λ༻͍͍ͯ΍ɼJar Jar Links*4 ͱ͍ͬͨɼར༻͢ΔϥΠϒϥϦʹ‫·ؚ‬Δɽͨͩ͜͠ͷࡍʹύοέʔδ໊ʹؔ͢Δ৘ใΛ࢖༻͠ͳΕ͍ͯΔύοέʔδͷ໊લΛࣗಈͰมߋͰ͖Δπʔϧ΋։͍Α͏ʹ͢Δ͜ͱʹΑͬͯɼΫϥεϑΝΠϧ͕ଐ͢Δύοൃ͞Ε͍ͯΔɽύοέʔδ໊ͷϦωʔϜʹΑͬͯɼϥΠϒέʔδ໊͕ҧ͍ͬͯͯ΋ಉ͡ϑΝΠϧͰ͋Δͱ൑ఆ͞ΕΔϥϦͷόʔδϣϯͷ‫ʹ߹ڝ‬ΑΔϓϩάϥϜಈ࡞ͷมԽΛ๷Α͏ʹ͍ͯ͠Δɽ͜ΕʹΑͬͯɼύοέʔδͷϦωʔϜͷ͙͜ͱ͕ՄೳͱͳΔ͕ɼར༻தͷϥΠϒϥϦ͕೺Ѳͮ͠Β‫ݕ‬ग़ΛՄೳʹ͍ͯ͠Δɽߋ͢ΔΑ͏ͳ৔߹͕͋Δɽ࣮ࡍʹɼMaven Shade Plugin͘ͳΔ͜ͱʹΑΓɼϥΠϒϥϦͷ؅ཧʹѱӨ‫ڹ‬Λ‫ة͢΅ٴ‬‫ݥ‬ੑ͕ଘࡏ͢Δɽ

3. ఏҊख๏ຊ‫Ͱڀݚ‬͸ɼJava ͷόΠτίʔυʹ‫·ؚ‬ΕΔ֎෦ϥΠϒϥϦΛ‫ݕ‬ग़͢Δख๏ΛఏҊ͢Δɽख๏ͷ֓ཁ͸ਤ 1 ͷΑ͏ʹͳΔɽೖྗͱͯ͠༩͑ΒΕͨιϑτ΢ΣΞ (.jar ϑΝΠϧ) Λɼ͋Β͔͡Ί༻ҙ͓͍ͯͨ͠σʔλϕʔε಺ʹ‫·ؚ‬Ε۩ମతʹ͸ҎԼͷ৘ใΛ࿈݁ͨ͠จࣈྻ͔Βϋογϡ஋Λ‫͍ͯ͠ࢉܭ‬Δɽ• Ϋϥε໊• ਌Ϋϥε໊• ࣮૷͍ͯ͠ΔΠϯλʔϑΣʔε (ॱෆಉ)• ϑΟʔϧυએ‫ॱ( ݴ‬ෆಉ)֤ϑΟʔϧυએ‫ʹݴ‬ରͯ͠͸ҎԼͷ৘ใΛར༻͢Δɽ– ϑΟʔϧυ໊ΔϥΠϒϥϦ (.jar ϑΝΠϧ) ͱൺֱ͢Δ͜ͱʹΑͬͯɼೖ– ϑΟʔϧυͷ‫ܕ‬ྗ͞Εͨιϑτ΢ΣΞͷ಺෦ʹ‫·ؚ‬ΕΔͱਪఆ͞ΕΔϥΠ• ϝιουએ‫ॱ( ݴ‬ෆಉ)ϒϥϦͷҰཡΛಘΔɽ·ͨɼͲͷΫϥε͕ͲͷϥΠϒϥϦΫϥε಺Ͱએ‫͞ݴ‬Ε͍ͯΔϝιουʹ͍ͭͯ͸ҎԼͷ͔Β࠶ར༻͞Ε͔ͨʹ͍ͭͯͷ৘ใ΋ಘΔ͜ͱ͕Ͱ͖Δɽ৘ใΛར༻͢Δɽjar ϑΝΠϧʹ͸ɼίϯύΠϧ͞Εͨෳ਺ͷ Java όΠτ– ϝιου໊ίʔυ΍ͦΕ͕࢖༻͢Δը૾ͳͲͷϦιʔε͕‫·ؚ‬ΕΔ– ΞΫηεम০ࢠ͕ɼຊख๏Ͱ͸಺෦ʹ‫·ؚ‬ΕΔΫϥεϑΝΠϧͷΈΛൺֱ– Ҿ਺ͷ‫ܕ‬ʹར༻͢Δɽ·ͨɼ௚઀ΫϥεϑΝΠϧΛൺֱ͢ΔͷͰ͸– ฦΓ஋ͷ‫ܕ‬ͳ͘ɼΫϥεϑΝΠϧຖʹϋογϡ஋Λ‫͠ࢉܭ‬ɼൺֱʹ༻– ϝιου‫ͼݺ‬ग़໋͠ྩ (ॱෆಉ)͍Δ͜ͱͰ‫ྔࢉܭ‬Λ࡟‫͍ͯ͠ݮ‬ΔɽຊষͰ͸ɼख๏ͷ۩ମ– ࢉज़ɼ࿦ཧԋࢉ໋ྩͷճ਺తͳखॱʹ͍ͭͯઆ໌͢ΔɽΫϥεϑΝΠϧ͝ͱʹ‫͞ࢉܭ‬Εͨϋογϡ஋͕Ұக͢Δ৔߹ɼ͢ͳΘ্ͪʹࣔͨ͠Α͏ͳ৘ใ͕͢΂ͯҰக͢Δ

3.1 ΫϥεϑΝΠϧຖͷϋογϡ஋ͷ‫ࢉܭ‬*3*4ϑΝΠϧಉ࢜Λɼຊख๏Ͱ͸ಉ͡ΫϥεϑΝΠϧͰ͋Δͱຊख๏Ͱ͸ιϑτ΢ΣΞͷ಺෦ʹ‫·ؚ‬ΕΔόΠτίʔυͯ͠ѻ͏ɽ

https://maven.apache.org/plugins/maven-shade-plugin/https://code.google.com/archive/p/jarjar/஋Λ‫݁ͨ͠ࢉܭ‬Ռɼϋογϡ஋ͷଟॏू߹ͱͯ͠ jar ϑΝⓒ 2017 Information Processing Society of Japanjar ϑΝΠϧ಺෦ʹ‫·ؚ‬ΕΔΫϥεϑΝΠϧຖʹϋογϡ

3

Vol.2017-SE-195 No.8
2017/3/12

৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportΠϧΛѻ͏͜ͱ͕Ͱ͖Δɽ͜͜Ͱू߹Ͱ͸ͳ͘ଟॏू߹ͱ

Algorithm 1 ࠶ར༻‫ݩ‬ͷਪఆΞϧΰϦζϜ

͍ͯ͠Δͷ͸ɼύοέʔδ໊ͷΈ͕ҟͳΔΫϥεϑΝΠϧ

INPUT: t : target jar ﬁle, R = {r1 , r2 , ..., rn } : Database(Setof Library)OUTPUT: Result: Subset of Repository(and overlappedclasses)
1: A ← Classes(t)  ೖྗϑΝΠϧʹ‫·ؚ‬Ε͍ͯΔΫϥεͰ࠶ར༻‫͕ݩ‬ະ֬ఆͷ΋ͷ
2: Result ← {}3: i ∈ [i, |R|], ri = r  ri ʹ͓͚Δ A ͱͷ‫ڞ‬௨෦෼ΛೖΕΔม਺
4: loop5:
for i = 1 to |R| do
6:
if ri ∈ Result then7:
continue8:
end if9:ri ← A ∩ Classes(ri )10:
end for|ri |11:m ← maxi∈[i,|R|]
|ri |
12:
if m < threshold then13:
break  Φʔόʔϥοϓͷ࠷େ஋͕ᮢ஋ҎԼͳΒΞϧΰϦζϜΛऴྃ͢Δ
14:
end if |r  |
← rn| n =m
15:
Rmax
|rn |

16:
J ⊆ Rmax∧ Classes(J) ⊆ A Λຬͨ͠ɼ|Classes(J)| ͕࠷େͱͳΔΑ͏ͳ J Λબ୒
17:Result ← Result ∪ J
18:A← A\J
19: end loop
20: return Result͕ಉҰ jar ϑΝΠϧ಺ʹ‫·ؚ‬Ε͍ͯΔΑ͏ͳ৔߹ʹɼϋογϡ஋ͷিಥ͕‫͜ى‬Γ͏Δ͔ΒͰ͋Δɽিಥ͕‫ͨͬ͜ى‬৔߹ʹ͸ཁૉ͕ॏෳͯ͠ଘࡏ͢Δ͜ͱʹͳΔɽҎ߱ɼຊ࿦จͰѻ͏શͯͷू߹͸ଟॏू߹Ͱ͋Δͱ͢Δɽ
·ͨɼҎ߱ϋογϡ஋ͷଟॏू߹Λϋογϡ஋ू߹ͱද‫ه‬
͢Δ͜ͱ͕͋Δɽ

3.2 ࠶ར༻‫ݩ‬ͷਪఆલઅͷํ๏Ͱ‫ͨ͠ࢉܭ‬ϋογϡ஋ͷଟॏू߹Λ༻͍ͯɼೖྗ͞Εͨ jar ϑΝΠϧͱσʔλϕʔε಺ͷ jar ϑΝΠϧΛൺֱ͢Δ͜ͱʹΑͬͯ࠶ར༻‫ݩ‬Λਪఆ͢Δɽ‫ج‬ຊతʹɼϥΠϒϥϦͷ࠶ར༻͸ jar ϑΝΠϧ୯ҐͰ·ͱΊͯߦΘΕΔ͜ͱ͕ଟ͍ɽ·ͨɼϋογϡ஋ू߹ͷ‫ݻ‬༗ੑʹΑΔϥΠϒϥϦ໊ͱόʔδϣϯͷಛఆਫ਼౓΋ߴ͘ͳΔͱߟ͑ΒΕΔɽͦͷͨΊɼຊख๏Ͱ͸‫׬‬શͳ‫Ͱܗ‬ίϐʔ͞ΕͨϥΠϒϥϦΛ༏ઌతʹ‫ݕ‬ग़͢Δɽ

3.2.1 ࠶ར༻‫ݩ‬ਪఆΞϧΰϦζϜͷ֓ཁ࠶ར༻‫ݩ‬Λਪఆ͢ΔΞϧΰϦζϜΛ Algorithm1 ʹࣔ͢ɽ͜ͷΞϧΰϦζϜ͸‫ݕ‬ग़ର৅ͱͳΔιϑτ΢ΣΞ (jar ϑΝΠϧ) t ͱൺֱର৅ͱͳΔෳ਺ͷϥΠϒϥϦ (jar ϑΝΠϧ)Λ‫ؚ‬Ήσʔλϕʔε R Λೖྗͱͯ͠ɼR ͔Β t ʹ࠶ར༻͞Εͨͱਪఆ͞ΕΔϥΠϒϥϦ‫ͱ܈‬ɼͦͷΫϥεϑΝΠϧͷϋογϡ஋ͷҰཡΛग़ྗͱͯ͠ಘΔɽͳ͓ɼೖྗσʔλϕʔεʹ͓͍ͯɼϋογϡ஋ू߹ͷશཁૉ͕‫׬‬શʹҰகͭ͢·Γ࠶ར༻͞ΕͨՄೳੑͷ͋ΔΫϥεϑΝΠϧͷ਺ͷׂΔΑ͏ͳϥΠϒϥϦͷ૊͸͋Β͔͡ΊऔΓআ͔Ε͍ͯΔͱ߹Λද͢ɽ͢Δɽ·ͨɼClasses(x) ͸ x ͷ಺෦ʹ‫·ؚ‬ΕΔΫϥεϑΝ

σʔλϕʔε಺ͷશϥΠϒϥϦʹରͯ͠ΦʔόʔϥοϓΠϧͷϋογϡ஋ू߹Λฦؔ͢਺Ͱ͋Δɽx ͕ෳ਺ͷ jar஋ͷ‫͕ࢉܭ‬ऴΘͬͨ‫ޙ‬ɼΦʔόʔϥοϓ஋͕࠷େͷϥΠϒϑΝΠϧ͔ΒͳΔ৔߹ʹ͸ͦΕΒͷ࿨ू߹Λฦ͢ɽϥϦΛશͯબ୒͠ɼ࣍ͷεςοϓʹೖྗ͢Δ͜ͱͰ࠶ར༻͜ͷΞϧΰϦζϜ͸ҎԼͷ 2 εςοϓͷ‫܁‬Γฦ͠ʹΑͬͯߏ੒͞ΕΔɽ‫ݩ‬Λ֬ఆ͢Δɽͨͩ͠ɼ࠷େͷΦʔόʔϥοϓ஋͕ᮢ஋ΑΓ΋খ͘͞ͳͬͨ৔߹ɼσʔλϕʔε಺ʹ࠶ར༻͞Εͨϥ( 1 ) ‫ڞ‬௨෦෼ͷ‫ʹࢉܭ‬ΑΔ࠶ར༻‫ิީݩ‬ͷܾఆ (4-14 ߦ໨)ΠϒϥϦ͸࢒͍ͬͯͳ͍ͱ൑ఆ͠ɼ݁Ռ Result Λग़ྗ͠ɼ( 2 ) ࠶ར༻‫ݩ‬ͷ֬ఆ (15-17 ߦ໨)ΞϧΰϦζϜΛऴྃ͢ΔɽҎ߱ɼ֤εςοϓʹ͍ͭͯઆ໌͢Δɽ

3.2.2 ‫ڞ‬௨෦෼ͷ‫ʹࢉܭ‬ΑΔ࠶ར༻‫ิީݩ‬ͷܾఆྫ͑͹ɼਤ 2 ͷΑ͏ͳೖྗ͕ͳ͞Εͨ৔߹Λߟ͑ΔɽਤͰ͸ɼσʔλϕʔε಺ͷϥΠϒϥϦʹ‫·ؚ‬ΕΔϋογϡ஋͜ͷεςοϓͰ͸·ͣɼೖྗ t ͕࣋ͭ࠶ར༻‫͕֬ݩ‬ఆ͠ͷ͏ͪɼ੺͘දࣔ͞Ε͍ͯΔ෦෼͕ೖྗϑΝΠϧ Target.jar͍ͯͳ͍ΫϥεϑΝΠϧʹରԠ͢Δϋογϡ஋ू߹ A ͱͱͷ‫ڞ‬௨෦෼ͱͳ͍ͬͯΔɽ͜ͷ৔߹ʹ Target.jar ʹର͢ϥΠϒϥϦ͕࣋ͭϋογϡ஋ू߹ͱͷൺֱʹΑͬͯɼR ʹΔσʔλϕʔε಺ͷϥΠϒϥϦͷΦʔόʔϥοϓ஋Λ‫ࢉܭ‬‫·ؚ‬ΕΔ r1 , r2 , ..., rn ͦΕͧΕʹରͯ͠ A ͱͷ‫ڞ‬௨෦෼

͢ΔͱɼA-1.0.jar ͷ৔߹͸ཁૉ਺ 2 ʹରͯ͠ Target.jar ͱr 1, r 2, ..., rn ΛಘΔɽ͜ͷ‫ڞ‬௨෦෼Λ༻͍ͯɼ֤ϥΠϒϥͷ‫ڞ‬௨ཁૉ਺͕ 2 Ͱ͋ΔͨΊ 2/2 = 1.0ɼA-2.0.jar ͷ৔߹Ϧ͕࣋ͭΫϥεϑΝΠϧͷ͏ͪ A ͱͷ‫ڞ‬௨෦෼͕ͲΕ͚ͩ͸ཁૉ਺ 2 ʹରͯ͠‫ڞ‬௨ཁૉ਺͕ 1 Ͱ͋ΔͨΊ 1/2 = 0.50

͋Δ͔ͷׂ߹ʢҎ߱ɼΦʔόʔϥοϓ஋ͱ‫ )Ϳݺ‬Λ‫͢ࢉܭ‬

ͱͳΔɽಉ༷ʹ‫͢ࢉܭ‬ΔͱɼC-1.0.jarɼB-1.0.jarɼD-1.0.jarΔɽΦʔόʔϥοϓ஋͸ɼʹରͯ͠͸ 1.0ɼB-2.0.jar ʹରͯ͠͸ 0.67 ͕ಘΒΕΔɽ

|A ∩ r||r |=|r||r|ϓ஋͕࠷େͷ΋ͷΛબ୒͢ΔɽΦʔόʔϥοϓ஋ 1.0 ͕࠷ʹΑͬͯಘΒΕɼϥΠϒϥϦ r ͕࣋ͭΫϥεϑΝΠϧͷ͏

େͱͳΔͨΊɼA-1.0.jarɼC-1.0.jarɼB-1.0.jarɼD-1.0.jar

ͪɼt ʹ‫·ؚ‬ΕΔΫϥεϑΝΠϧͱϋογϡ஋͕Ұக͢Δɼ͕࠶ར༻‫ݩ‬ͷީิͱͯ࣍͠ͷεςοϓʹೖྗ͞ΕΔɽ

ⓒ 2017 Information Processing Society of Japanͦͷ‫ޙ‬ɼ֤ϥΠϒϥϦʹରͯ͠‫͞ࢉܭ‬ΕͨΦʔόʔϥο

4

Vol.2017-SE-195 No.8
2017/3/12৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Reportਤ 2 ΞϧΰϦζϜ΁ͷೖྗྫ

3.2.3 ࠶ར༻‫ݩ‬ͷ֬ఆ͕ɼ‫ݮ࡟ྔࢉܭ‬ͷͨΊʹɼଞͷϥΠϒϥϦͷબ୒ʹӨ͜ͷεςοϓͰ͸ɼલεςοϓʹΑͬͯಘΒΕͨ࠷େͷ‫ڹ‬Λ༩͑ͳ͍ϥΠϒϥϦΛ‫ݻ‬ఆͰબ୒͢ΔΑ͏ʹ͢Φʔόʔϥοϓ஋Λ࣋ͭϥΠϒϥϦΛީิͱ͠ɼͲΕ͕

Δɽ۩ମతʹ͸ɼީิ಺Ͱ‫ݻ‬༗ͷϋογϡ஋ͷΈ͕ A࠶ར༻͕ߦΘΕ͔ͨͷਪఆΛߦ͏ɽຊख๏Ͱ͸ɼೖྗ jarͱͷ‫ڞ‬௨෦෼ʹͳ͍ͬͯΔΑ͏ͳϥΠϒϥϦΛ࠶ར༻ϑΝΠϧʹ‫·ؚ‬ΕΔ 1 ͭͷΫϥεϑΝΠϧ͸ɼ1 ͭͷϥΠ‫֬ͯ͠ͱݩ‬ఆ͢ΔɽϒϥϦ͔ΒͷΈ࠶ར༻͞Εͨ΋ͷͰ͋Δͱ͍ͯ͠Δɽͦͷ( 2 ) ৚݅Λຬͨ͢ϥΠϒϥϦͷ૊Έ߹ΘͤΛਂ͞༏ઌ୳ࡧͨΊɼ͋ΔΫϥεϑΝΠϧʹରͯ͠ಉ͡ϋογϡ஋ͷΫϥʹΑͬͯ‫ٻ‬ΊΔεϑΝΠϧΛ࣋ͭϥΠϒϥϦ͕ީิ಺ʹෳ਺ଘࡏ͢Δ৔લखॱʹΑͬͯ֬ఆ͞ΕͨϥΠϒϥϦͱ߹ΘͤͯɼA߹ʹ͸ɼ࠶ར༻‫ͨͬͳͱݩ‬΋ͷ͕ͲΕͳͷ͔Λಛఆ͢Δඞͱͷ‫ڞ‬௨෦෼ͷ࿨͕ A ͷ෦෼ू߹ͱͰ͋Δͱ͍͏৚݅ཁ͕͋Δɽྫ͑͹ɼਤ 3 ͷΑ͏ʹɼΦʔόʔϥοϓ஋ 1.0Λຬͨ͢Α͏ͳϥΠϒϥϦͷ૊Έ߹ΘͤΛਂ͞༏ઌ୳

Λ࣋ͭ 4 ͭͷϥΠϒϥϦ͕࠶ར༻‫͢ͱͨͬ͋Ͱิީݩ‬ΔɽࡧʹΑͬͯશ௨Γྻ‫͢ڍ‬Δɽਂ͞༏ઌ୳ࡧͱ͸ɺ͋Δ͜ΕΒͷϥΠϒϥϦதͰɼϋογϡ஋’af3bc...’ Λ࣋ͭϥϊʔυ͔Βࢠͷͳ͍ϊʔυʹߦ͖ண͘·ͰਐΜͰ͍ͬΠϒϥϦ͕ A-1.0.jar ͱ D-1.0.jar ͷ 2 ͭ͋Δͷʹରͯ͠ɼͨ‫ޙ‬ɼ࠷΋ۙ͘ͷ୳ࡧͷऴΘ͍ͬͯͳ͍ϊʔυ·Ͱ໭

Target.jar ʹ͸ಉ͡ϋογϡ஋͕ 1 ͔ͭ͠‫·ؚ‬Ε͍ͯͳ͍ɽ

Δ͜ͱΛ‫܁‬Γฦ͢Α͏ͳ୳ࡧํ๏Ͱ͋Δɽ͜ͷ৔߹ʹ͜ͷΑ͏ͳ৔߹ʹɼϋογϡ஋’af3bc...’ ʹରԠ͢ΔΫϥε͸ϊʔυ͕બ୒͞ΕͨϥΠϒϥϦͱͳΓɼͦͷࢠϊʔϑΝΠϧ͕ A-1.0.jar ͱ D-1.0.jar ͷͲͪΒ͔Β࠶ར༻͞Ευ͸‫ڞ‬௨෦෼ͷ࿨͕ A ͷ෦෼ू߹ͱͳΔͱ͍͏৚݅ͷ͔ͨΛಛఆ͢Δඞཁ͕͋Δɽ΋ͱͰબ୒ՄೳͳϥΠϒϥϦͱͳΔɽຊεςοϓͰ͸ೖྗιϑτ΢ΣΞʹ‫·ؚ‬ΕΔΫϥεϑΝ

( 3 ) ࠶ར༻‫ݩ‬ͷ֬ఆΠϧͦΕͧΕΛ 1 ͭͷ࠶ར༻‫ʹݩ‬ରԠ෇͚ΔͨΊɼAlgo-શखॱʹΑͬͯ‫ٻ‬ΊͨϥΠϒϥϦͷ૊Έ߹Θͤͷத͔

rithm1 ͷ 9 ߦ໨ͷ৚݅ͷ௨Γɼ֤ީิϥΠϒϥϦͷத͔Βɼ‫·ؚ‬ΕΔϋογϡ஋ͷཁૉ਺͕࠷େͱͳΔΑ͏ͳΒɼA ͱͷ‫ڞ‬௨෦෼ͷ࿨͕ A ͷ෦෼ू߹ͱͳΔΑ͏ͳϥΠ૊Έ߹ΘͤΛબ୒͢Δɽͦͷ‫ޙ‬ɼબ୒ͨ͠ϥΠϒϥϦϒϥϦͷ૊Έ߹Θͤʹରͯ͠୳ࡧΛߦ͏ɽͦͷࡍɼຊख๏தʹ‫·ؚ‬ΕΔϋογϡ஋Λ A ͔ΒऔΓআ͖ɼεςοϓʹ͓͍ͯ͸ɼ‫׬‬શʹ͍ۙ‫࠶Ͱܗ‬ར༻͞Ε͍ͯΔϥΠϒϥϦ

1 ͷ࠶ར༻‫ิީݩ‬ͷܾఆʹ໭Δɽ͕࠶ར༻‫͋Ͱݩ‬Δͱ͍ͯ͠ΔͨΊɼલड़ͨ͠৚݅ͷ΋ͱͰ

ਤ 3 ͸ɼຊख๏ʹਤ 2 ͷΑ͏ͳೖྗ͕ͳ͞Εͨ৔߹ͷɼཁૉ਺ͷ߹‫࠷͕ܭ‬େͱͳΔΑ͏ͳϥΠϒϥϦͷ૊Έ߹Θͤ

1 ճ໨ͷϧʔϓʹ͓͚Δ࠶ར༻‫͕֬ݩ‬ఆ͍ͯ͠ͳ͍ΫϥεΛ‫ٻ‬ΊΔ૊Έ߹Θͤ࠷దԽ໰୊Λղ͘͜ͱʹΑͬͯ࠶ར༻ϑΝΠϧʹରԠ͢Δϋογϡ஋ͷଟॏू߹ A ͱɼεςοϓ‫ݩ‬ͷਪఆΛߦ͏ɽ͜ͷεςοϓ͸ҎԼͷΑ͏ͳखॱʹ෼͚

1 Ͱ‫ٻ‬ΊΒΕͨ࠶ར༻‫ิީݩ‬ͷਤͱͳ͍ͬͯΔɽ࠶ར༻‫ݩ‬Δ͜ͱ͕Ͱ͖Δɽ

ީิͱͳ͍ͬͯΔ 4 ͭͷϥΠϒϥϦ͸Φʔόʔϥοϓ஋͕( 1 ) ީิ಺Ͱ‫ݻ‬༗ͷϋογϡ஋͔࣋ͨ͠ͳ͍΋ͷΛ࠶ར༻1.0 Ͱ͋ΔͨΊɼશཁૉ͕ೖྗιϑτ΢ΣΞͱͷ‫ڞ‬௨෦෼‫֬ͯ͠ͱݩ‬ఆͱͳΔɽ͜ͷΑ͏ͳ৔߹ͷ‫ݕ‬ग़ྫΛࣔ͢ɽ‫ج‬ຊతʹ͸৚݅Λຬͨ͢૊Έ߹ΘͤΛશ௨Γ୳ࡧ͢Δ·ͣɼ͜ΕΒ 4 ͭͷϥΠϒϥϦΛൺֱ͢ΔͱɼC-1.0.jar͜ͱʹΑͬͯཁૉ਺͕࠷େͱͳΔ΋ͷΛಛఆ͢Δͷͩ͸ީิ಺ͷଞͷϥΠϒϥϦʹ͸‫·ؚ‬Ε͍ͯͳ͍ɼϋογϡⓒ 2017 Information Processing Society of Japan5

Vol.2017-SE-195 No.8
2017/3/12

৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Reportਤ 3ϧʔϓ 1 ճ໨ͷ࠶ར༻‫ิީݩ‬

஋’e2cdb’ ͷΫϥεϑΝΠϧ 1 ͭͷΈΛ͍࣋ͬͯΔ͜ͱ͕

Maven Shade Plugin Λ༻͍ͯ 9 ͭͷϥΠϒϥϦʹ‫·ؚ‬ΕΘ͔ΔɽͦͷͨΊɼTarget.jar ʹ͸ C-1.0.jar ͕࠶ར༻͞ΕΔϑΝΠϧΛ಺෦ʹల։ͯ͠ར༻͍ͯ͠Δ͜ͱ͕൑໌͍ͯͯ͠Δͱ൑அ͠ɼ‫ݕ‬ग़݁Ռͱͯ֬͠ఆ͢Δɽ͍ΔɽͦΕΒͷϥΠϒϥϦ͕࢖༻͍ͯ͠ΔͱࢥΘΕΔύο࣍ʹ৚݅Λຬͨ͢ϥΠϒϥϦͷ૊Έ߹ΘͤΛྻ‫͢ڍ‬Δɽέʔδ໊ͷมߋઃఆ΋‫ه‬ड़͞Ε͍ͯͨɽ·ͨɼੜ੒͢Δ Jarͦͷ݁Ռɼ৚݅Λຬͨ͠ɼཁૉ਺ͷ࿨͕ 5 Ͱ࠷େͱͳΔΑʹ‫ؚ‬ΊΔΫϥεϑΝΠϧʹؔ͢ΔઃఆͰ͋ΔɼMinimizeJar͏ͳϥΠϒϥϦͷ૊Έ߹Θͤ {C-1.0,A-1.0,B-1.0} ͕ಛఆ͕࢖༻͞Ε͍ͯͨɽ͞ΕΔɽ͜ΕʹΑͬͯɼA ʹ‫·ؚ‬ΕΔ 6 ͭͷΫϥεϑΝΠ

Maven Shade Plugin Ͱ͸ɼMinimizeJar Φϓγϣϯʹ

ϧͷ͏ͪ 5 ͭͷ࠶ར༻‫͕ݩ‬ಛఆ͞ΕͨͨΊɼରԠ͢ΔϋοΑͬͯɼಈ࡞͕Մೳͳ࠷খͷ Jar ϑΝΠϧΛੜ੒͢Δ͜ͱγϡ஋ΛऔΓআ͘ɽ͕ՄೳͰ͋Δɽ௨ৗ͸ੜ੒ Jar ϑΝΠϧதʹɼબ୒ͨ͠ϥͦͷ‫ޙ‬͸εςοϓ 1 ͷ࠶ར༻‫ܾิީݩ‬ఆʹ໭Δ͜ͱ

ΠϒϥϦʹ‫·ؚ‬ΕΔશͯͷΫϥεϑΝΠϧ͕ίϐʔ͞ΕΔʹͳΔɽ2 ճ໨ͷϧʔϓͰ A ʹ‫·ؚ‬ΕΔͷ͸ɼϋογϡ͕ɼ͜ͷΦϓγϣϯΛ࢖༻ͨ͠৔߹ɼ࣮ࡍʹ࢖༻͞Ε͍ͯ

஋’f47ca...’ ͷΈͱͳΔ͕ɼಉ͡ϋογϡ஋ͷΫϥεϑΝΠ

ΔΫϥεϑΝΠϧͷΈΛੜ੒ Jar ϑΝΠϧʹ‫ؚ‬ΊΔΑ͏ͳϧΛ࣋ͭϥΠϒϥϦ͸σʔλϕʔε಺ʹଘࡏ͠ͳ͍ɽͦͷ࢓૊Έʹͳ͍ͬͯΔɽͦͷͨΊɼElastic Search ͷ jar ϑΝͨΊɼ֤ϥΠϒϥϦͷΦʔόʔϥοϓ஋͸ 0 ͱͳΓɼΞϧΰΠϧதʹ͸ɼ9 ͭͷϥΠϒϥϦʹ‫·ؚ‬ΕΔΫϥεϑΝΠϧ

ϦζϜΛऴྃ͢ΔɽҎ্ʹΑΓɼ‫ݕ‬ग़݁Ռͱͯ͠ A.1.0.jarͷҰ෦͕‫·ؚ‬Ε͍ͯΔ͜ͱʹͳΔɽ

ͷ 2 ͭͷΫϥεϑΝΠϧɼB-1.0.jar ͷ 2 ͭͷΫϥεϑΝΠ
ϧ C-1.0.jar ͷ 1 ͭͷΫϥεϑΝΠϧ͕ಘΒΕΔɽ

4. έʔεελσΟຊষͰ͸ɼఏҊख๏ͷπʔϧ͕ύοέʔδͷϦωʔϜΛ࠶ར༻͞Ε͍ͯΔϥΠϒϥϦͷҰཡͱͦͷύοέʔδ໊Λද 1 ʹࣔͨ͠ɽͳ͓ɼ͜ΕΒͷϥΠϒϥϦͷόʔδϣϯʹؔ͢Δ‫ه‬ड़͸ൃ‫͢ݟ‬Δ͜ͱ͕Ͱ͖ͳ͔ͬͨɽ

4.2 ݁Ռ

‫ݕ‬ग़Ͱ͖Δͷ͔Ͳ͏͔ௐ΂ΔͨΊʹɼ࣮ࡍʹϥΠϒϥϦΛ

ఏҊख๏Λ࣮૷ͨ͠πʔϧʹ͓͍ͯɼ‫ࡧݕ‬ऴྃͷᮢ஋Λ࠶ར༻͢ΔࡍʹύοέʔδͷϦωʔϜΛߦ͍ͬͯΔ java ͷ0.1 ʹઃఆ͠ɼelasticsearch-0.90.5.jar ʹରͯ͠಺෦ʹ‫·ؚ‬ιϑτ΢ΣΞʹରͯ͠ఏҊख๏Λద༻͢ΔͱͲͷΑ͏ͳ݁ΕΔϥΠϒϥϦͷ‫ݕ‬ग़Λߦͬͨɽ݁Ռͱͯ͠ग़ྗ͞ΕͨϥՌ͕ಘΒΕΔ͔Λௐ΂ͨɽΠϒϥϦͷϦετΛද 2 ʹࣔ͢ɽද 2 ͷ֤ྻ͸ࠨ͔Βॱʹɼ‫ݕ‬ग़͞ΕͨϥΠϒϥϦ໊ɼόʔδϣϯɼ‫·ؚ‬ΕΔΫϥ

4.1 ௐࠪର৅εϑΝΠϧ਺ɼͦͷதͰೖྗιϑτ΢ΣΞ಺ʹ࠶ར༻͞Ε

Elastic Search*5 ͷόʔδϣϯ 0.90.5 ʹରͯ͠ௐࠪΛߦͬ

͍ͯΔͱ൑ఆ͞ΕͨΫϥεϑΝΠϧͷ਺ɼʹͦΕͧΕରԠͨɽSoftwareIngredients ʹ͜ͷϥΠϒϥϦͷ jar ϑΝΠϧ͍ͯ͠Δɽόʔδϣϯ൪߸ʹ͍ͭͯ͸ɼϋογϡ஋ू߹͕Λೖྗͨ݁͠ՌɼϥΠϒϥϦͷ࠶ར༻͸‫ݕ‬ग़͞Εͳ͔ͬͨɽ

౳͍͠όʔδϣϯ͕ෳ਺͋Δ৔߹ʹ͸ෳ਺ͷީิΛࣔͯ͠Elastic Search0.90.5 Ͱ͸ɼϓϩδΣΫτʹؔ͢Δઃఆ

͍Δɽྫ͑͹ɼreader-ﬁles ͷόʔδϣϯ 1.1.2 ʹ͸ɼ31 ‫ݸ‬ͳͲ͕‫ه‬ड़͞Ε͍ͯΔϑΝΠϧ (pom.xml) தͷ‫ه‬ड़͔Βɼϋογϡ஋ू߹͕౳͍͠όʔδϣϯ͕ଘࡏ͢ΔͨΊɼදதʹͦΕΛ‫͍ͯ͠ࡌه‬Δɽ

*5https://www.elastic.co/products/elasticsearchⓒ 2017 Information Processing Society of Japan

6

Vol.2017-SE-195 No.8
2017/3/12৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportϥΠϒϥϦ໊ද 1 Elastic Search 0.90.5 ʹ‫·ؚ‬ΕΔϥΠϒϥϦมߋલύοέʔδ໊มߋ‫ޙ‬ύοέʔδ໊

guava

com.google.commonorg.elasticsearch.common

trove4j

gnu.troveorg.elasticsearch.common.trove

mvel2

org.mvel2

org.elasticsearch.common.mvel2

jackson-corecom.fasterxml.jacksonorg.elasticsearch.common.jackson

jackson-dataformat-smilecom.fasterxml.jacksonorg.elasticsearch.common.jackson

jackson-dataformat-yaml

com.fasterxml.jacksonorg.elasticsearch.common.jackson

joda-timeorg.joda

org.elasticsearch.common.joda

nettyorg.jboss.netty

org.elasticsearch.common.netty

compress-lzf

com.ning.compress

org.elasticsearch.common.compress

ද 2 Elastic Search 0.90.5 ͔Β‫ݕ‬ग़͞ΕͨϥΠϒϥϦҰཡϥΠϒϥϦ໊όʔδϣϯΫϥε਺‫ݕ‬ग़Ϋϥε਺guava-annotations

r03

4

4

guice-multibindings

2.0

4

4

guice-annotations

2.0.1

10

10

joda-time

2.3

157

144

jackson-core

2.2.3

69

63
253

mvel2

2.1.5.Final349

guice-assisted-inject

2.0

7

5

guice

2.0-no aop

184

123

jackson-dataformat-smile

2.2.2

12

8

2.2.3
jackson-dataformat-yaml

2.2.2

112

70

reader-ﬁles

1.1.2 and 31 versions

2

1

hadoop-job-builder

1.0

6

3

guava

15.0

453

205

15.0-rc1
15.0-cdi1.0
jsr166y

1.7.0

9

4

netty

3.7.0546

239

compress-lzf

0.9.6

26

10

jellydoc-annotations

1.0 and 4 versions

3

1

trove4j

3.0.3

691

98

Elastic Search ɹ 0.90.5 ʹ͓͍ͯ࠶ར༻͞Εͨͱ͞Εͯͨͱ൑ఆ͞Εͨ΋ͷ͕ଘࡏ͠ͳ͍ͨΊɼ͜ΕΒͷόʔδϣ

͍Δ 9 ͭͷϥΠϒϥϦ͸ɼද 2 தʹଠࣈͰࣔͨ͠௨Γ͢΂ϯ൪߸͸Ұக͢ΔΫϥεϑΝΠϧͷ਺Λ‫ʹݩ‬σʔλϕʔεͯ‫ݕ‬ग़݁ՌʹදΕ͍ͯΔ͜ͱ͕Θ͔ΔɽTrove4j ͳͲ͸ɼϥ಺ͰҰ൪͍ۙ΋ͷΛબ୒ͨ͠ਪఆ஋ͱͳΔɽjoda-time ΍ΠϒϥϦ͕࣋ͭΫϥεϑΝΠϧ਺ʹରͯ͠‫ݕ‬ग़͞ΕͨΫϥ

jackson-core ͸େ෦෼ͷΫϥεϑΝΠϧ͕Ұக͍ͯ͠Δͨ

εϑΝΠϧ਺͕গͳ͘ͳ͍ͬͯΔɽ͔͠͠ɼೖྗ jar ϑΝΠΊൺֱతόʔδϣϯ൪߸ͷಛఆਫ਼౓΋ߴ͍ͱࢥΘΕΔ͕ɼϧதͷσΟϨΫτϦ org/elasticsearch/common/trove ʹtrove4j ͷΑ͏ʹϥΠϒϥϦதͷΫϥεϑΝΠϧͷ͏ͪͷ‫·ؚ‬ΕΔΫϥεϑΝΠϧ਺Λ֬ೝͨ݁͠Ռɼ103 ‫ݸ‬ͷϑΝ͘͝Ұ෦͔͠Ұக͍ͯ͠ͳ͍΋ͷ͸ਖ਼͍͠όʔδϣϯ൪߸Πϧ͕‫·ؚ‬Ε͍ͯΔ͜ͱ͕֬ೝͰ͖ͨɽͦͷͨΊɼ103 ‫ݸ‬͕ಛఆ͞Ε͍ͯΔՄೳੑ͸௿͍ɽͷ͏ͪ 98 ‫ݸ‬ͷΫϥεϑΝΠϧΛ࠶ར༻‫ʹݩ‬ରԠ෇͚Δ͜‫ݕ‬ग़݁Ռͱͯ͠ɼ࠶ར༻͞Εͨͱͷ‫ه‬ड़͕ͳ͞Ε͍ͯͨͱ͕Ͱ͖͓ͯΓɼ࠶ར༻͞Εͨ΋ͷͷେ෦෼Λ‫ݕ‬ग़͢Δ͜

9 ‫ݸ‬ͷϥΠϒϥϦͷଞʹɼguice ͱͦͷؔ࿈ϥΠϒϥϦ͕ͱʹ੒ޭ͍ͯ͠Δͱ͍͑Δɽ͜ͷσΟϨΫτϦʹ‫·ؚ‬ΕΔଟ͘දΕ͍ͯΔɽ͜ΕΒͷϥΠϒϥϦΛൺֱର৅͔Βআ֎࢒Γ 5 ϑΝΠϧʹؔͯ͠͸࠶ར༻‫͕ݩ‬ಛఆͰ͖ͳ͔ͬͨɽͯ͠࠶‫ࡧݕ‬Λߦ͏ͱɼguice ͔Β࠶ར༻͞Ε͍ͯͨͱ൑ఆ‫ݪ‬Ҽͱͯ͠͸ɼ࠶ར༻͞Εͨ trove4j ͷόʔδϣϯ͕σʔ͞Ε͍ͯͨΫϥεϑΝΠϧͷ࠶ར༻‫͔ͭݟ͕ݩ‬Βͳ͘ͳͬλϕʔε಺ʹ‫·ؚ‬Ε͍ͯͳ͔ͬͨ͜ͱ͕ߟ͑ΒΕΔɽ

ͨɽͭ·Γɼguice ͕ઃఆϑΝΠϧதʹ‫ه‬ड़͞Ε͍ͯͨ 9֤ϥΠϒϥϦʹ͍ͭͯఏҊπʔϧʹΑͬͯόʔδϣϯ൪‫ݸ‬ͷϥΠϒϥϦʹ‫·ؚ‬Ε͍ͯͨՄೳੑ͸௿͍ɽͦͷͨΊɼ߸͕ࣔ͞Ε͍ͯΔ͕ɼશͯͷΫϥεϑΝΠϧ͕࠶ར༻͞Ε͜ͷϥΠϒϥϦ͸ઃఆϑΝΠϧதʹ͸‫͞ࡌه‬Ε͍ͯͳ͔ͬ

ⓒ 2017 Information Processing Society of Japan7

Vol.2017-SE-195 No.8
2017/3/12৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Report͕ͨɼ࣮ࡍʹ͸࠶ར༻͕ߦΘΕ͍ͯΔՄೳੑ͕ߴ͍ɽ͜ͷέʔεελσΟʹΑͬͯɼ‫ݕޡ‬ग़͕ߦΘΕΔΑ͏ͳ[3]

ྫ΋ൃ‫͢ݟ‬Δ͜ͱ͕Ͱ͖ͨɽશͯͷΫϥεϑΝΠϧ͕Ұக͢Δͱͯ͠ guava-annotation ͕‫ݕ‬ग़͞Ε͍ͯΔ͕ɼ͜Ε͸[4]guava ͷҰ෦‫ػ‬ೳͷΈΛ࣋ͭϥΠϒϥϦͰ͋ΔɽఏҊख๏Ͱ͸ΫϥεϑΝΠϧͷҰக͢Δׂ߹ʹΑͬͯ‫ݕ‬ग़ͷ༏ઌ౓ΛఆΊ͍ͯΔͨΊɼࠓճͷΑ͏ʹ͋ΔϥΠϒϥϦͷҰ෦ͷΈͷ࠶ར༻͕ߦΘΕ͍ͯΔ৔߹ɼಛఆ‫ػ‬ೳͷΈ͕࣮૷͞Ε[5]͍ͯΔΫϥεϑΝΠϧ਺ͷগͳ͍ϥΠϒϥϦ͕σʔλϕʔ
εʹొ࿥͞Ε͍ͯͨ৔߹ʹɼ‫ݕޡ‬ग़ͯ͠͠·͏͜ͱ͕൑໌
ͨ͠ɽ

[6]

5. ·ͱΊͱࠓ‫ޙ‬ͷ՝୊ຊ‫Ͱڀݚ‬͸ɼJava όΠτίʔυ͔Βநग़ͨ͠৘ใ͔Β‫ܭ‬ࢉͨ͠ϋογϡ஋ͷൺֱʹΑͬͯɼJava ͷιϑτ΢ΣΞ[7]಺෦ʹ‫·ؚ‬ΕΔϥΠϒϥϦͷ࠶ར༻Λ‫ݕ‬ग़͢Δख๏ΛఏҊͨ͠ɽఏҊख๏Ͱ͸ɼόΠτίʔυͷൺֱΛߦ͏ࡍʹύοέʔδ໊ʹؔ͢Δ৘ใΛऔΓআ͘͜ͱʹΑͬͯɼύοέʔδͷϦωʔϜ͕ߦΘΕ͍ͯͨ৔߹Ͱ΋࠶ར༻ͷ‫ݕ‬ग़ΛՄೳ

[8]ʹͨ͠ɽ·ͨɼఏҊख๏Λ࣮૷ͨ͠πʔϧʹෳ਺‫ݸ‬ͷϥΠϒϥϦΛ‫ؚ‬Ή jar ϑΝΠϧΛೖྗ͢Δ͜ͱʹΑͬͯɼ࠶ར༻‫ݩ‬Λಛఆ͢Δ͜ͱ͕ՄೳͰ͋Δ͔Ͳ͏͔ɼ‫ط‬ଘ‫ͱڀݚ‬ͷൺֱ࣮[9]‫ݧ‬Λߦͬͨɽͦͷ݁Ռɼ‫ݕ‬ग़ਫ਼౓͕޲্͍ͯ͠Δ͜ͱ͕֬ೝͰ͖ͨɽҰํͰɼ‫͔͔ʹࡧݕ‬Δ࣌ؒʹ͍ͭͯ͸‫ط‬ଘ‫ڀݚ‬ΑΓ΋૿Ճ͍ͯ͠Δ͜ͱ͕൑໌ͨ͠ɽࠓ‫ޙ‬ͷ՝୊ͱͯ͠͸ɼ‫ݕ‬ग़ΞϧΰϦζϜͷվળ͕‫͛ڍ‬ΒΕΔɽఏҊख๏Ͱ͸ɼҰக͢ΔΫϥεϑΝΠϧͷׂ߹͕େ͖͍ϥΠϒϥϦΛ࠶ར༻‫ͯ͠ͱݩ‬༏ઌతʹ‫ݕ‬ग़͢ΔΞϧΰ[10]

DOI: 10.1109/ICSE.2012.6227181 (2012).
઒ຬ௚߂ɼɹੴඌོɼҪ্ࠀ࿠΄͔ɿLSH ΞϧΰϦζϜΛར༻ͨ͠ྨࣅιʔείʔυͷ‫ࡧݕ‬ɼ‫ڀݚ‬ใࠂιϑτ΢Σ
Ξ޻ֶ (SE)ɼVol. 2016, No. 7, pp. 1–8 (2016).
Heinemann, L., Deissenboeck, F., Gleirscher, M., Hummel, B. and Irlbeck, M.: On the Extent and Nature ofSoftware Reuse in Open Source Java Projects, Proceedings of the 12th International Conference on Software
Reuse, Lecture Notes in Computer Science, Vol. 6727,
pp. 207–222 (2011).
Davies, J., German, D. M., Godfrey, M. W. and Hindle,A.: Software Bertillonage: Finding the Provenance of an
Entity, Proceedings of the 8th Working Conference onMining Software Repositories, pp. 183–192 (2011).
Ishio, T., Kula, R. G., Kanda, T., German, D. M. andInoue, K.: Software ingredients: detection of third-party
component reuse in Java software release, Proceedings ofthe 13th International Conference on Mining Software
Repositories, ACM, pp. 339–350 (2016).
Bavota, G., Canfora, G., Penta, M. D., Oliveto, R.
and Panichella, S.: The Evolution of Project Interdependencies in a Software Ecosystem: The Case ofApache, Proceedings of the 29th IEEE International
Conference on Software Maintenance, pp. 280–289 (online), DOI: 10.1109/ICSM.2013.39 (2013).
Kula, R. G., De Roover, C., German, D., Ishio, T.
and Inoue, K.: Visualizing the Evolution of Systems
and their Library Dependencies, Proceedings of the 2ndIEEE Working Conference on Software Visualization,
pp. 127–136 (2014).
Yano, Y., Kula, R. G., Ishio, T. and Inoue, K.: VerXCombo: An interactive data visualization of popularlibrary version combinations, Proceedings of the 23rdIEEE International Conference on Program Comprehension, pp. 291–294 (2015).
Teyton, C., Falleri, J.-R., Palyart, M. and Blanc, X.: Astudy of library migrations in Java, Journal of Software:
Evolution and Process, Vol. 26, No. 11, pp. 1030–1052(2014).

ϦζϜΛ࠾༻͍ͯ͠Δɽ͔͠͠ɼ࣮ࡍʹ jar ϑΝΠϧΛੜ
੒͢Δࡍʹ͸ɼϑΝΠϧαΠζͷ࡟‫ݮ‬ͷͨΊʹϥΠϒϥϦͷҰ෦ͷΈΛ࠶ར༻͍ͯ͠ΔΑ͏ͳྫ͕ଘࡏ͢Δɽͦͷ݁Ռɼ͋ΔϥΠϒϥϦͷҰ෦‫ػ‬ೳͷΈΛ࣮૷ͨ͠ϥΠϒϥϦͳͲͷɼ‫ن‬໛ͷখ͍͞ϥΠϒϥϦ͕‫݁ࡧݕͯͬޡ‬Ռͱͯ͠൑ఆ͞Εͯ͠·͏Α͏ͳྫ͕‫ݟ‬ΒΕͨɽ‫ݕ‬ग़Λߦ͏ࡍʹϥΠϒϥϦؒͷแ‫܎ؚؔ‬Λߟྀ͢Δ͜ͱʹΑͬͯ͜ͷΑ͏ͳ‫ݕޡ‬ग़Λ‫ݮ‬Β͢͜ͱ͕ՄೳͱͳΔՄೳੑ͕͋Δɽँࣙຊ‫ڀݚ‬͸ JSPS Պ‫ݚ‬අʢ՝୊൪߸ JP25220003ɼ

JP26280021ʣͷॿ੒Λड͚ͨ΋ͷͰ͢ɽࢀߟจ‫ݙ‬[1][2]

Xia, P., Matsushita, M., Yoshida, N. and Inoue, K.:
Studying Reuse of Out-dated Third-party Code in Open
Source Projects, JSSST Computer Software, Vol. 30,
No. 4, pp. 98–104 (2013).
Inoue, K., Sasaki, Y., Xia, P. and Manabe, Y.: Where
does this code come from and where does it go? – Integrated code history tracker for open source systems –,Proceedings of the 34th IEEE/ACM International Conference on Software Engineering, pp. 331–341 (online),ⓒ 2017 Information Processing Society of Japan8