ãã®ããŒãã®ååã¯ãã»ãšãã©ãã¹ãŠã®ããã°ã©ãã³ã°èšèªãšå®è¡ã·ã¹ãã ã«å
±éã§ãããjvmã«éç¹ã眮ãããŸãã ããã°ã©ã ãå€æŽããã«ã¯ãäž»ã«2ã€ã®ã¢ãããŒããæ€èšããŠãã ããã
- ã³ã³ãã€ã«åŸãŸãã¯ã³ãŒãã®ããŒãäžã«ããã°ã©ã ã®å®è¡å¯èœã³ãŒããæäœããŸãã
- ã³ã³ãã€ã«ããåã«ãœãŒã¹ã³ãŒããå€æŽããŸãã
ã¡ã¢å
ã®
ç»åã«é¢é£ä»ããããŠããã¡ã¿ãã¡ãŒïŒããã°ã©ã ã¯äž»èŠãªå»ºç©ã§ãããããã°ã©ã ã®å€æã®çµæã¯è£å©çãªæ§é ã§ãã
å€æŽããçç±
ããã°ã©ã ãå¥ã®ããã°ã©ã ãå€æŽããå¿
èŠããã
çç±ãå°ãã
ããšããå§ããŸãããã
ã¡ã¿ããã°ã©ãã³ã°ã¯ããããžã§ã¯ãã®å®åã³ãŒããåæžããäž»èŠãªããšã«éäžããã³ãŒãã®èªã¿ããããåäžãããå¥ã®æ¹æ³ã§ã¯è§£æ±ºãå°é£ãªåé¡ã解決ããã®ã«åœ¹ç«ã¡ãŸãã
javaã®æãåçŽãªäŸã¯ãã¯ã©ã¹ã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããã®JavaBeansããã³get / setã¡ãœããã§ããäŸã¯ãã¯ã©ã¹ã®ãã«ããŒã®äœæãIDEã§ã®equals / hashã®å®è£
ãªã©ã§ãã
次ã®äŸã¯ããã®ã³ã°ãèªåãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã§ãã Spring Frameworkã䜿çšãããšãã¯ãã¹ãŠã䜿çšãããã©ã®ããã«å®è£
ããããã«ã€ããŠã¯ã»ãšãã©èããŸããã ããããSpringã§ãããåå¿è
åãã®ãã¬ãŒã ã¯ãŒã¯ã®æ§æãšåæåã«åé¡ãçãããéæ³ã®ã
Spring Boot /
Spring Rooãç»å ŽããŸãã ã ããããããã¯å¥ã®ãããã¯ã§ãããããã°ã©ã ã®ä¿®æ£ã®ãããã¯ã«æ»ããŸãã
é£èªåãšã³ãŒãã®æå°åãèšè£
ããããããã¡ã€ã©ãŒãDevOpsã®äžçã¯ãããã°ã©ã ãå€æŽããå¿
èŠãããçç±ã®3çªç®ã®äŸã§ãã ä»ã®éèŠãªäŸãèŠéãããšæãã®ã§ãã³ã¡ã³ããè¿œå ããŠãã ããã
ã ããããªãããã°ã©ã ãå€æŽããã®ããç§ãã¡ã¯ä»
ã圌ããéåžžãããã©ã®ããã«è¡ãããæ€èš
ããããšã«ããŸãã ã
å®è¡å¯èœããã°ã©ã åœä»€ã®å€æŽ
ããã°ã©ã ã®ãã€ãã³ãŒããå€æŽã§ããŸãããããæãäžè¬çãªæ¹æ³ã§ãã ããã¯ãã³ã³ãã€ã«çŽåŸãjarããã«ãããåãããã³ã¯ã©ã¹ãããŒããããšãã«å®è¡ã§ããŸãã æåã®ã±ãŒã¹ã§ã¯ããããžã§ã¯ããã«ãã·ã¹ãã ã®ãã©ã°ã€ã³ã2çªç®ã®ã±ãŒã¹ã§ã¯ãç¹å¥ãªã¯ã©ã¹ããŒããŒãŸãã¯JavaãšãŒãžã§ã³ãããŸãã¯jvmã®hotswapã¡ã«ããºã ã«ãªããŸãã ãšãŒãžã§ã³ããšã¯ã©ã¹ããŒããŒã䜿çšããã¢ãããŒãã¯ããã·ã³ã³ãŒãããã³ããªã¢ãŒãã£ãã¯ãŠã€ã«ã¹ã®èªå·±å€æŽããã°ã©ã ã«éåžžã«äŒŒãŠããŸãã
jvmãããŒã
ãããã¡ã€ã«
ã®ãã€ãã³ãŒãã®æ§é ã¯
ãã¯ã©ã¹åœ¢åŒã®å
¬åŒããã¥ã¡ã³ãã«èšèŒãããŠã
ãŸãjavapã¢ããªã±ãŒã·ã§ã³ã䜿çš
ãããšãã³ã³ãã€ã«ãããã¯ã©ã¹ã®ãã€ãã³ãŒãã衚瀺ã§ã
ãŸãå
¬åŒããã¥ã¡ã³ãã®äŸã¯ã©ã¹ã®ãœãŒã¹ã³ãŒãïŒ
import java.awt.*; import java.applet.*; public class DocFooter extends Applet { String date; String email; public void init() { resize(500,100); date = getParameter("LAST_UPDATED"); email = getParameter("EMAIL"); } public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15); } }
ãã®ã¯ã©ã¹ã®ãã€ãã³ãŒãã®ã³ã³ãœãŒã«ãžã®JavapåºåïŒ
Compiled from "DocFooter.java" public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); Code: 0: aload_0 1: invokespecial #1
ãããããã€ãã³ãŒããæåã§å€æŽããããšã¯ãæè²ç®çãŸãã¯å°é£ãäœæããŠå
æããã®ã奜ããªå¿è
ã§ããå Žåã«ã®ã¿æå³ããããŸãã
Java Virtual Machine Specificationã¯ããã®æç¹ã§ã»ãšãã©ã®è³ªåã«çããŠããŸãã
ç£æ¥çšããã°ã©ãã³ã°ã§ã¯ã
ASM ã
javassist ã
BCEL ã
CGLIBã©ã€ãã©ãªããã€ãã³ãŒãã§ã®äœæ¥ãç°¡çŽ åããŸãã ãã€ãã³ãŒãã解æããåŸãããã°ã©ãã¯ãåãASMã䜿çšããŠãããªãŒAPIãšããžã¿ãŒãã³ãã¬ãŒãã䜿çšããã€ãã³ãã¢ãã«ã®äž¡æ¹ã§ãã€ãã³ãŒããæäœã§ããŸãã åæã«å ããŠãæ°ããæ瀺ããã£ãŒã«ããã¡ãœãããªã©ãå€æŽãè¿œå ããããšãã§ããŸãã æ¬æ¥ããã€ãã³ãŒããæäœããããã®ã©ã€ãã©ãªã¯ä»ã«ããããŸãããããŸã䜿çšãããŸããã
ASM APIã®äŸ
ãã€ãã³ãŒãåæ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.objectweb.asm.ClassReader; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.IincInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.tree.analysis.Analyzer; import org.objectweb.asm.tree.analysis.BasicValue; import org.objectweb.asm.tree.analysis.BasicVerifier; import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.SourceInterpreter; import org.objectweb.asm.tree.analysis.SourceValue; import org.objectweb.asm.util.TraceMethodVisitor; import org.objectweb.asm.util.Textifier; public class Analysis implements Opcodes { public static void main(final String[] args) throws Exception { ClassReader cr = new ClassReader("Analysis"); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_DEBUG); List<MethodNode> methods = cn.methods; for (int i = 0; i < methods.size(); ++i) { MethodNode method = methods.get(i); if (method.instructions.size() > 0) { if (!analyze(cn, method)) { Analyzer<?> a = new Analyzer<BasicValue>( new BasicVerifier()); try { a.analyze(cn.name, method); } catch (Exception ignored) { } final Frame<?>[] frames = a.getFrames(); Textifier t = new Textifier() { @Override public void visitMaxs(final int maxStack, final int maxLocals) { for (int i = 0; i < text.size(); ++i) { StringBuilder s = new StringBuilder( frames[i] == null ? "null" : frames[i].toString()); while (s.length() < Math.max(20, maxStack + maxLocals + 1)) { s.append(' '); } System.err.print(Integer.toString(i + 1000) .substring(1) + " " + s + " : " + text.get(i)); } System.err.println(); } }; MethodVisitor mv = new TraceMethodVisitor(t); for (int j = 0; j < method.instructions.size(); ++j) { Object insn = method.instructions.get(j); ((AbstractInsnNode) insn).accept(mv); } mv.visitMaxs(0, 0); } } } } public static boolean analyze(final ClassNode c, final MethodNode m) throws Exception { Analyzer<SourceValue> a = new Analyzer<SourceValue>( new SourceInterpreter()); Frame<SourceValue>[] frames = a.analyze(c.name, m);
ã¢ã¹ãã¯ãæåã®ã¢ãããŒãã¯
ãããã°ã©ã ãå€æŽããããã®é«åºŠãªæ¹æ³ãšèããããšãã§ããŸãã ãšãŒãžã§ã³ããã¯ã©ã¹ããŒããŒããŸãã¯ãã©ã°ã€ã³ã¬ãã«ã§ã®AspectJå®è£
ã§ã¯ãAOPã®ãã¹ãŠã®ãéæ³ããã¯ã©ã¹ãã€ãã³ãŒãã®æäœã«å€ãããŸãã ããããããã°ã©ããéçºäžã«ãããèŠããšãåãASMãšBCELã䜿çšããŠãå
éšã§ããã€ãã³ãŒããå€æŽãããæ¹æ³ãšã¯ç°ãªããŸãã AspectJãå®éã«ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã¹ã«è¿œå ãããã®ã«èå³ãããå Žå
ãå€æŽãããã¯ã©ã¹ã®
ãã³ããå«ããŠãããšãã°
Java Decompilerã䜿çšããŠããã®ã³ãŒããã³ã¢ã«å
¥ããããšãã§ã
ãŸã ã
AspectJã§ã¯ãéçºè
ã¯ã¢ã¯ã·ã§ã³ãã¯ã©ã¹ã®åœ¢åŒã§å®çŸ©ããããããã¢ã¹ãã¯ããšããŠæ³šéããããã°ã©ã ã®ã©ã®ãã€ã³ãïŒPointcutïŒã§åŒã³åºãå¿
èŠããããã瀺ããŸãã
ãã€ã³ãã«ããåŒ
ãå®çŸ©ããããã®æ§æãéåžžã«é«åºŠã§ãã ãã€ãã³ãŒãã®å€æŽã«å¯Ÿãããã®ã¢ãããŒãã¯ãããã°ã©ãã«ãšã£ãŠäœ¿ããããã§ãã
habrã«é¢ããåºçç©ã®ãµã€ã¯ã«ã®äŸã«ã€ããŠããã詳现ã«ç€ºããèªã£ã ãã€ãã³ãŒãã®å€æŽã«ããããã°ã©ã ã®å€æã«ã¯ãé·æãšçæããããŸãã
é·æ | çæ |
---|
ãœãŒã¹ã³ãŒãããªããŠãã¢ãããŒãã¯æ©èœããŸã | èªæã§ãªãå€æã䌎ãåæãšä¿®æ£ã®è€éã |
ã³ã³ãã€ã©ã®ç¬ç« | ãœãŒã¹ã³ãŒãã§ã®ã¿å©çšå¯èœãªæ
å ±ã®æ¬ åŠ |
å€æASTãœãŒã¹ã³ãŒããã¡ã¿ããã°ã©ãã³ã°
ãœãŒã¹ã³ãŒãã®å€æã®çè«ãšå®è·µã¯ãããã°ã©ãã³ã°èšèªã®ã¡ã¿ããã°ã©ãã³ã°ãPrologãLispããã¯ããããã³ããªããã»ããµã§é·ãé䜿çšãããŠããŸããã
ãã®ã¢ãããŒãã§ã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒããã³ã³ãã€ã«ãããåã«å¥ã®ããã°ã©ã ã«ãã£ãŠå€æãŸãã¯è£å®ãããã³ã³ãã€ã«ãããŸãã ããã°ã©ã ããã¹ãèªäœã§ã¯ãªããããããæ§ç¯ãããæœè±¡çãªæ§æããªãŒïŒæœè±¡æ§æããªãŒãASTïŒã䜿çšããæ¹ã䟿å©ã§ãã
ç¹°ãè¿ããŸãããã¡ã¿ããã°ã©ãã³ã°ã®å©äŸ¿æ§ã¯ãããã°ã©ãã³ã°èšèªèªäœã§ã®ãµããŒãã«äŸåããŸãã åè«ããããŸã
Lispã§ã¯ãã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ãæ¢ããŠããã®ã§ããã°ãããã€ãã®ãã¯ããèšç»ããã ãã§ååã§ãã Javaã§ã¯ãGregor Kichalesãå¿
èŠã§ãæ°ããäŒç€Ÿãäœããäœã¶æãäœå¹Žããã¹ãŠãæ©èœãããããšããŸãã
ããŒã¿ãŒã»ããŒãŠã£ã°ãããã£ãŠããªãã¬ã¯ã·ã§ã³ã¡ã«ããºã ã¯èšèªã®äžéšã§ããããã©ãããã©ãŒã ã¯ãã€ãã³ãŒããåçã«ããŒãããã³å®è¡ã§ããŸãããjvmã¯ããå°ãè€éã§ãã ã³ãŒãçæã䜿çšãã2ã€ã®æè¡-JPAéçã¡ã¿ã¢ãã«ãžã§ãã¬ãŒã¿ãŒãšjaxbã³ãŒãçæ-ãããã«æãæµ®ãã³ãŸãã ãã1ã€ã®äŸã¯
ãããžã§ã¯ãLombokã§ã ãããã«ãããIDEã«ãã£ãŠä»¥åã«çæããããã®ããŸãã¯æåã§èšè¿°ãããéçºè
ã«ãã£ãŠãµããŒãããããã®ãèªåçã«å®è£
ã§ããŸãã
Lombokãããžã§ã¯ãã®æ³šéval
ã€ãã«ïŒ æéã®ããããªãæçµããŒã«ã«å€æ°ã
@ NonNull
ãŸãã¯ïŒå¿é
ãæ¢ããŠNullPointerExceptionãæããããšãåŠãã æ¹æ³ã
@ã¯ãªãŒã³ã¢ãã
èªåãªãœãŒã¹ç®¡çïŒç°¡åã«closeïŒïŒã¡ãœãããåŒã³åºããŸãã
@ã²ãã¿ãŒ/ @ã»ãã¿ãŒ
public int getFooïŒïŒ{return foo;}ãå床èšè¿°ããªãã§ãã ããã
@ãã¹ããªã³ã°
ãã£ãŒã«ãã確èªããããã«ãããã¬ãèµ·åããå¿
èŠã¯ãããŸããïŒlombokã«toStringãçæãããã ãã§ãïŒ
@ EqualsAndHashCode
ç°¡åãªå¹³çæ§ïŒhashCodeãçæãããªããžã§ã¯ãã®ãã£ãŒã«ãããå®è£
ãåçã«ããŸãã
@ NoArgsConstructorã@ RequiredArgsConstructorãããã³@ AllArgsConstructor
ãªãŒããŒã¡ã€ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒåŒæ°ãæããªãã³ã³ã¹ãã©ã¯ã¿ãŒãæçµ/éNULLãã£ãŒã«ãããšã«1ã€ã®åŒæ°ããŸãã¯ãã¹ãŠã®ãã£ãŒã«ãããšã«1ã€ã®åŒæ°ãçæããŸãã
@ããŒã¿
ãã¹ãŠäžç·ã«ïŒ@ ToStringã@ EqualsAndHashCodeããã¹ãŠã®ãã£ãŒã«ãã®@ Getterãããã³ãã¹ãŠã®éæçµãã£ãŒã«ãã®@ Setterãããã³@ RequiredArgsConstructorã®ã·ã§ãŒãã«ããïŒ
@å€
äžå€ã¯ã©ã¹ãéåžžã«ç°¡åã«ãªããŸããã
@ãã«ããŒ
...ãããŠããã¯ããªãã®ããã§ãïŒãªããžã§ã¯ãäœæã®ããã®é¢åãªåã£ããã³ãAPIã¯ãããŸããïŒ
@SneakyThrows
ãããŸã§èª°ãã¹ããŒããŠããªããã§ãã¯äŸå€ã倧èã«ã¹ããŒããïŒ
@åææžã¿
åæå®äºïŒããã¯ãå
¬éããªãã§ãã ããã
@ GetterïŒlazy = trueïŒ
æ azineã¯çŸåŸ³ã§ãïŒ
@ãã°
è¹é·ã®ãã°ã24435.7ã®æ¥ä»ïŒããã®è¡ã¯äœã§ãããïŒã
ããã¯
ãASTãŠãŒã¶ãŒããã°ã©ã ãšã³ãŒãçæã
å€æŽããããšã§Lombokã«å®è£
ãããŸãã
å¶éä»ãã®åæ§ã®æ©èœã¯ãã¹ã³ãŒãã³ã³ãã€ã«æã®
泚éïŒæ³šéåŠçããŒã«ïŒã® javaã«ããããŸãã
JavaãœãŒã¹ã³ãŒãã解æããå Žåãjavacãeclipse javaã³ã³ãã€ã©ãããé©åã«åŠçã§ããŸãã
Spoonã
JTransformerãªã©ã®ä»£æ¿æ段ããããŸãããããããä»æ§ãšè€éãªã¯ã©ã¹ãã©ã®çšåºŠå®å
šã«ãµããŒãããŠãããã確èªããå¿
èŠãããããŸããã
jvmã«ã€ããŠè©±ããŠãããããGroovyã§ã®ããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®å€æã¯
èšèªèªäœã®äžéšã§ãã ã
Scalaèšèªã«ãåæ§ã®å¯èœæ§ããããŸãã
ãã®ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®å€æŽã«ã¯åŒ±ç¹ãšé·æããããŸãã
é·æ | çæ |
---|
ãã€ãã³ãŒããããå€ãã®æ
å ± | ã³ã³ãã€ã«ãŸãã¯è§£é段éïŒã¡ã¢ãªãæéïŒ |
IDEã®ãªãã¡ã¯ã¿ãªã³ã°ãªã©ã®æ©èœ | ãœãŒã¹ã®å¯çšæ§ã®èŠä»¶ãç¹å®ã®ã¯ã©ã¹/ jarã®ãœãŒã¹ãèªåçã«èŠã€ããæ¹æ³ |
å®è¡æã®ASTã³ãŒãå€æãšåã³ã³ãã€ã«
ãã®æçš¿ã®æãçéå
¥ãã®éšåã¯ãã©ã³ã¿ã€ã ãžã®åã³ã³ãã€ã«ã«ã€ããŠã®èãã§ãã æŸèæãå¿
èŠãªå Žå
ãå®è¡æ ã« AST Java
ã³ãŒãã® å€æŽãšã³ã³ãã€ã«ãå¿
èŠã«ãªãå ŽåããããŸãããããžã§ã¯ããå®å
šã«ã«ãããªããã§ããããç°ãªãããŒãžã§ã³ã®æ°åã®ãã©ãŒã¯ãäœæããŠç¶æããããšãéåžžã«å°é£ã§ããå ŽåããŸãã¯ç®¡çè
ãšéçºè
ããããçæ³çã§èª°ã«ãå€æŽãèš±å¯ããªãå ŽåããœãŒã¹ã³ãŒãã¯ãšã³ã¿ãŒãã©ã€ãºMavenãªããžããªã«ãããŸãã ãããŠããã®ã¢ãããŒããå¿
èŠãªã®
ã¯ãåè¿°ã® 2ã€ã®ã¯ã©ã¹ã®ããã°ã©ã å€æã§
åé¡ã解決ããããšãäžå¯èœãŸãã¯äžäŸ¿ãªå Žåã®ã¿ã§ã ã
ã³ã³ãã€ã«ã¯æ¯èŒçç°¡åã§ãã
JavaCompiler APIã䜿çšãããšãå®è¡æã«ãœãŒã¹ã³ãŒãããããã°ã©ã ãã³ã³ãã€ã«ããå®è£
ã«äŸåããªãã€ã³ã¿ãŒãã§ã€ã¹ãæäŸã§ããŸãã eclipse EJCã³ã³ãã€ã©ãŒã®ãããã§ã¹ããšãœãŒã¹ã³ãŒãã調ã¹ããšãããJavaCompiler APIããµããŒãããŠããããšãããããŸããã
ããããããã°ã©ã ã®ããã¹ããåæãããšããASTã§äœæ¥ããããã®ãããªãã¯ããã³ãŠãããŒãµã«APIã¯ãŸã ãããŸããã ã€ãŸã
com.sun.source.treeã*ãŸãã¯
org.eclipse.jdt.core.domã®ãããããšé£æºããå¿
èŠããã
ãŸããã¯ã©ã¹ã®ãœãŒã¹ããã¹ããèŠã€ããã¿ã¹ã¯ã¯ããããžã§ã¯ãããœãŒã¹ã¿ã€ãã®ã¢ãŒãã£ãã¡ã¯ããšãšãã«mavenãªããžããªã§å
¬éãããã¯ã©ã¹ã®ããjarã«pom.propertiesãŸãã¯pom.xmlãã¡ã€ã«ãããå ŽåããŸãã¯ã¢ãŒãã£ãã¡ã¯ãã®åå/ããã·ã¥ã察å¿ããjarãã¡ã€ã«ã®ãœãŒã¹ã³ãŒãã«äžèŽããããã£ã¯ã·ã§ããªãããå Žåãç°¡åã«è§£æ±ºãããŸãããã°ã©ã ã®å®è¡äžã«ãããã®ãœãŒã¹ãååŸããæ¹æ³ã
é·æ-ãã€ãã³ãŒãã«ãããããå€ãã®æ
å ±ãå€æã«å©çšã§ããã¢ããªã±ãŒã·ã§ã³ã¯ãããžã§ã¯ããåçµã¿ç«ãŠããå¿
èŠããªããAspectJãšãŒãžã§ã³ãã䜿çšããã®ãšã»ãŒåãããã䟿å©ã§ãããåæã«ããã€ãã³ãŒãå€æã䜿çšããŠå€æãå®è¡ããããšã¯ã§ãããéåžžã«æéãããããŸã
çæã¯ã以åã®ã¢ãããŒããšåãã§ãïŒã¡ã¢ãªãæéãããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®èŠä»¶ãããã³ãã®ã¯ã©ã¹ã§ãããèŠã€ããæ¹æ³ã
ejc + mavenã³ãŒãã®åœ¢åŒã§ã®äžèšã®äŸã¯ä»åŸæ°ãæã®ãã¡ã«äºå®ãããŠãããã¿ã¹ã¯ã¯éåžžã«éèŠã§ãã ããã«ééããŸãããïŒ Javaã³ãŒããå€æããå®è¡æã«åã³ã³ãã€ã«ããããšã«ãã£ãŠã®ã¿ãå®è·µã®ã©ã®ã¿ã¹ã¯ããšã¬ã¬ã³ãã«è§£æ±ºã§ããŸããïŒ
ãšããã§ã
TinyCCã³ã³ãã€ã©ã®æ©èœãšãã®ãµã€ãºã¯ããã®ã¢ãããŒããCããã°ã©ã ã§ãå¯èœã§ããããšã蚌æããŠããŸãã

ãã®ããŒãã§ã¯ãããã°ã©ã ãä¿®æ£ããããã®ããã€ãã®ã¢ãããŒãããã®é·æãšçæãæ€èšããŸããã å®è¡å¯èœã³ãŒãã®å€æŽã¯ããäžè¬çã§ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ååšãšãã®åŸã®å€æãªãã«ãã¹ãŠã®ã¿ã¹ã¯ã解決ã§ããããã§ã¯ãããŸããã