
åã®èšäº
Scalatestã䜿çšããæ
å ±ã·ã¹ãã ã®ç£èŠãšçµ±åãã¹ãã®å®è£
ã§ãIdeaã§ã®ãããžã§ã¯ãã®äœæãšç°¡åãªãã¹ãã®äœæã«ã€ããŠèª¬æããŸããã ãã®ããŒãã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®ããã€ãã®æ©èœãšããã¹ãã®äœæäžã«çºçããåé¡ã解決ããããã®ãã¯ããã¯ãæ€èšããŸãã
ãã¹ãã®å®è¡ã®è©³çŽ°ã«ã€ããŠè©³ãã説æããã¬ããŒãã®è©³çŽ°ãSeleniumã䜿çšããæ©èœãåæããã¿ã€ã ã¢ãŠããæåŸ
ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã³ãã³ãã®åŒã³åºãããã¹ããå«ãjarãã¡ã€ã«ã®çæã«ã泚æãæããŸãã
å®è¡äžã®ãã¹ãã®æ©èœ
å¥ã®ã¯ã©ã¹ãå®è¡ããã«ã¯ãIdeaããå®è¡ããããã³ã³ãœãŒã«ã§ã¯ã©ã¹ã䜿çšããŠtestOnlyã³ãã³ããå®è¡ããŸãã
sbt "testOnly org.example.MyTest1 org.example.MyTest2"
ããšãã°ãèšå·*ã䜿çšã§ããŸãã
sbt "testOnly *MyTest*"
ãMyTestããšããååãå«ããã¹ãŠã®ãã¹ããå®è¡ããŸã
ããã©ã«ãã§ã¯ããã¹ãŠã®ã¯ã©ã¹ã¯äžŠè¡ããŠå®è¡ãããŸãã build.sbtã§ãªãã·ã§ã³ã䜿çšã§ããŸã
parallelExecution in Test := false
ããã«ãããå®è¡ã®äžè²«æ§ãä¿ãããŸãã
詳现ã«ã€ããŠã¯ã
www.scala-sbt.org / 0.13 / docs / Testing.htmlãã芧ãã ããã
ã¬ããŒããã¡ã€ã«ã®äœæ
ãã¹ãã«åæ ŒããåŸã«ã¬ããŒããçæããã«ã¯ããã¹ããå®è¡ããããã®åŒæ°ãè¿œå ããå¿
èŠããããŸãã åŒæ°ã¯
scalatest.org/user_guide/using_the_runnerã«ãããŸãã ãããã®ãã¹ãŠãsbtããå®è¡ã§ããããã§ã¯ãªãã®ã§ãå®éšããå¿
èŠããããŸãã
ã©ã€ãã©ãªãŒscalatestïŒ
"test-> *"ã®ãã©ã¡ãŒã¿ãŒbuild.sbtã§è£è¶³ããŸãã
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.6" % "test->*"
ãã©ã¡ãŒã¿ãŒãå«ãè¡ãè¿œå ããŸã
(testOptionsinTest) += Tests.Argument(TestFrameworks.ScalaTest, "-hD", "report", "-fW", "report.txt")
ãã®å Žåããã¹ããéå§ãããšããreportããã©ã«ããŒå
ã®å®è¡æéïŒãDãïŒã瀺ãhtmlïŒã-hãïŒã¬ããŒããšãè²ïŒãWããæå®ããã«ããã¹ãã¬ããŒããã¡ã€ã«ïŒãfãïŒ ããã¡ã€ã«å
ã®ANSIã«ã©ãŒã³ãŒãã¯Linuxã·ã¹ãã ã§ã¯æ£ãã衚瀺ãããŸãããWindowsã§ã¯æŸèæãå¿
èŠã§ãïŒ
ã¬ããŒããUTF8ãšã³ã³ãŒãã§çæããã«ã¯ãWindowsã®ãã·ã¢èªã®æåã«åé¡ã¯ãããŸãããsbt\ conf \ sbtconfig.txtã«ãªãã·ã§ã³ãè¿œå ããããšããå§ãããŸã
-Dfile.encoding=UTF8

ã¬ããŒããã©ã«ããŒã«ã¯ãindex.htmlãã¡ã€ã«ãšãåã¯ã©ã¹ã«1ã€ãã€ã®è€æ°ã®.htmlãã¡ã€ã«ãå«ãŸããŸãã çè«çã«ã¯ãã¯ã©ã¹åã«ãã·ã¢èªã®æåã䜿çšã§ããŸããããã¡ã€ã«<RussianTestClassName> .htmlãéããšãã«åé¡ãçºçããå ŽåããããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãããä¿åããŠã¬ããŒãã«è²Œãä»ããã¡ãœãããè¿œå ããŠãGetTestã¯ã©ã¹ãå°ãå€æŽããŸãããã
import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.scalatest.selenium.WebBrowser import org.scalatest.{Matchers, FreeSpec} import scala.io.Source class GetTest extends FreeSpec with Matchers with WebBrowser{ val pageURL = "http://scalatest.org/about" def get(url: String) = Source.fromURL(url, "UTF-8").mkString implicit val webDriver: WebDriver = new FirefoxDriver()
ã³ã³ãœãŒã«ã§å®è¡ããŸã
sbt "testOnly GetTest"
ãã¹ãã«åæ Œãããšããããžã§ã¯ãã¬ããŒãã®ã«ãŒãã«ãreport.txtããã¡ã€ã«ãçæãããHTMLã¬ããŒãã®ãã¡ã€ã«ãå«ããã¬ããŒãããã©ã«ããŒãçæãããŸãã

ã¹ã¯ãªããã®ã¹ãããã®çµæã¯ã³ã³ãœãŒã«ã«è¡šç€ºããããçµæã®ã¿ã衚瀺ãããããšãæ確ã«ããå¿
èŠããããŸãã
ã¬ããŒããéããšãããŒãžã®ã¹ã¯ãªãŒã³ã·ã§ããã衚瀺ãããŸã

ãã®äŸããã³Seleniumã®ãã®ä»ã®äŸã§ã¯ããã©ãŠã¶ãŒãéããããšã¯å¥ã®ã¹ãããã«ãªããŸã
" " in { quit() }
ã¹ãããã¯æåŸã«å®äºããå¿
èŠããããŸãã ã¯ã©ã¹æ¬äœã«closeã³ãã³ããèšè¿°ãããšãã¹ãããã®éå§åã«å®è¡ããããšã©ãŒãçºçããŸãã å°ãåŸããã¹ãŠã®ã¹ããããå®äºããåŸãã³ãã³ãã®å®è¡æ¹æ³ãæ€èšããŸãã
æåŸ
æ€èšŒãªããžã§ã¯ãããªãããã«ãã¹ããã¯ã©ãã·ã¥ããç¶æ³ããããŸã...ããšãã°ãããŒã¿ããŒã¹ã®ã¬ã³ãŒãã¯ãã€ãã³ããŸãã¯WebããŒãžã®èŠçŽ ãããã«è¡šç€ºãããªãæ°ç§åŸã«è¡šç€ºãããŸãããã¯ã©ã€ã¢ã³ãã§ã¹ã¯ãªãããåŠçãããåŸã§ãã
ãã®å Žåãäžæåæ¢ã䜿çšã§ããŸãïŒããšãã°ãThread.sleepïŒ1000ïŒã³ãã³ãã¯ã³ãŒãã®å®è¡ã1ç§éäžæåæ¢ããŸãïŒããæçµçã«ã¯äœ¿çšããããšããå§ãããŸãã
æçµçã«-ééãæåãããã¿ã€ã ã¢ãŠãã«ãªããŸã§ãå®æçã«æäœã®ãããã¯ãå®è¡ã§ããŸãã
äŸãèããŠã¿ãŸãããïŒ
class OpenScalatest extends FreeSpec with WebBrowser{ implicit val webDriver: WebDriver = new FirefoxDriver() val pageURL = "https://www.google.ru/" " ScalaTest" in { go to pageURL textField("q").value = "ScalaTest" clickOn("btnG") } " 'ScalaTest'" in { click on partialLinkText("ScalaTest") } " " in { quit() } }
ãã®äŸã§ã¯ãGoogleã§ScalaTestããŒãžãæ€çŽ¢ãããã®ããŒãžã«ç§»åããŸãã
ãã¹ãã¯ããWebElement 'ScalaTest' not foundãããšãããšã©ãŒã§å€±æããŸãã
åé¡ã¯ããã¹ãŠã®ãªãœãŒã¹ãããŒããããåŸããã©ã€ããŒãããŒãžãããŒããããšèŠãªãããšã§ãã ãã ããããŒãžãèªã¿èŸŒãŸããåŸã«ã¯ã©ã€ã¢ã³ãäžã§èŠçŽ ã圢æã§ãããšããäºå®ã¯èæ
®ãããŠããŸããã
æçµçã«ãããã¯å
ã®ãªã³ã¯ãã¯ãªãã¯ããã¹ããããã©ããããŸãã ãããè¡ãã«ã¯ãç¹æ§ãã¯ã©ã¹å®çŸ©ã«æ··ããŸã
ããããŠã
æéãæäœããããã®ã³ã³ããŒãã³ãã®ã€ã³ããŒã
Import org.scalatest.time.SpanSugar._
æçµçã«åå®çŸ©
implicit override val patienceConfig = PatienceConfig(timeout = (2 seconds), interval = (250 millis))
ãããŠãåŸ
æ©ã¹ããããçµäºããŸã
eventually{clickonpartialLinkText("ScalaTest")}
çµæãšããŠã
class OpenScalatest extends FreeSpec with WebBrowser with Eventually{ implicit val webDriver: WebDriver = new FirefoxDriver() val pageURL = "https://www.google.ru/" implicit override val patienceConfig = PatienceConfig(timeout = (2 seconds), interval = (250 millis)) " ScalaTest" in { go to pageURL textField("q").value = "ScalaTest" clickOn("btnG") } " 'ScalaTest'" in { eventually{click on partialLinkText("ScalaTest")} } " " in { quit() } }
ãã®ãããæºåã確èªããããã«ãªãœãŒã¹ã®å®æçãªèª¿æ»ã§ããããŒãªã³ã°ãå®è£
ããŸãã
çŸåšã250ããªç§ããšã«èŠçŽ ã®å¯çšæ§ããã§ãã¯ããã2ç§ä»¥å
ã«è¡šç€ºãããªãå Žåããã¹ãã¯å€±æããŸãã
詳现ïŒ
doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Eventuallyã³ãŒãã®ãããã¯ãéåžžã«é·ãæéå®è¡ã§ããå Žåããããå®è¡æéãå¶éããå¿
èŠããããŸãã failAfterã³ãã³ããšcancelAfterã³ãã³ããå«ãTimeoutsãã¬ã€ãã䜿çšããŸãã
ããšãã°ãããŒãžã5ç§ä»¥äžèªã¿èŸŒãŸããå Žåããšã©ãŒãçºçãããšèããããŸãã
class DevianArt extends FreeSpec with WebBrowser with Timeouts { implicit val webDriver: WebDriver = new FirefoxDriver() val pageURL = "http://www.deviantart.com/" " %sc ".format(pageURL) in { failAfter(5 seconds){ go to (pageURL)} } " " in { quit() } }
ããŒãžã®è©³çŽ°
doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Timeoutsãããã£ãŠãå¿çã®åŸ
æ©æéãå¶éããããšãã§ããŸãã
ãã¹ãã¹ãããã®ååŸã«ã¢ã¯ã·ã§ã³ãå®è¡ãã
å Žåã«ãã£ãŠã¯ããã¹ãã¹ããããå®äºããåããã¹ãã¹ããããå®äºããåŸãåã¹ãããã®ååŸã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ãBeforeAndAfterAllããã³BeforeAndAfterç¹æ§ã䜿çšããŸãã
ãã¹ãã®åã¹ãããã®åŸã«ã¹ã¯ãªãŒã³ã·ã§ãããæ®ããããã¹ãŠã®ã¹ãããã®åŸã«ãã©ãŠã¶ãŒãéããããäŸãèããŠã¿ãŸããã
class CreateScalatestCaptures extends FreeSpec with WebBrowser with BeforeAndAfter with BeforeAndAfterAll{ implicit val webDriver: WebDriver = new FirefoxDriver() val pageURL = "http://www.scalatest.org/" setCaptureDir("report")
ã»ã¬ã³ã«é¢ããå°ããªè¿œå
scalatestã«ã¯SeleniumDSLãå«ãŸããŠããããã®é©çšäŸã¯äžèšã§èª¬æããŸããã ããŒãžã§
scalatest.org/user_guide/using_seleniumããªãè¯ã説æãå«ãŸããŠããŸãããããã«çºèšã§ããç¹ãããã€ããããŸãã
å Žåã«ãã£ãŠã¯ããã©ãŠã¶ãŠã£ã³ããŠã®ãµã€ãºãå¶åŸ¡ããå¿
èŠããããŸãã ããã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠè¡ãããŸãã
webDriver.manage().window()
äŸãã°
webDriver.manage().window().maximize()
ãŠã£ã³ããŠãæ倧åããïŒããã©ã«ãã§ã¯ããã©ãŠã¶ã¯ãŠã£ã³ããŠã¢ãŒãã§ãã£ãŸã«ãããŸãïŒããŸãã¯
val browserDimension = new org.openqa.selenium.Dimension(1920,2160) webDriver.manage().window().setSize(browserDimension)
ãµã€ãº1920 * 2160ã®ãŠã£ã³ããŠã圢æããŸã
ãŠã£ã³ããŠãåãæ¿ããã«ã¯ãã³ãŒãã䜿çšããŸã
val arr = windowHandles.toArray switch to window(arr(1))
ã³ã³ãœãŒã«ã§å®è¡ããåŸã2ã€ã®ã¹ã¯ãªãŒã³ã·ã§ãããå«ãçŸããã¬ããŒããååŸããŸãã
äžæã®ååãæã€ç»åãçæãããšãåéå§æã«ãã¡ã€ã«ãçæãããããšã«æ³šæããŠãã ããã ãããæ€èšãã䟡å€ãããããã¡ã€ã«ã䜿çšããŠãã£ã¬ã¯ããªãå®æçã«ã¯ãªãŒã³ã¢ããããŸãã
ãã©ãŠã¶ã³ã³ãœãŒã«ã§ãšã©ãŒã远跡ããããšãã§ããŸãã
ã€ã³ããŒãããå¿
èŠããããŸã
import org.openqa.selenium.logging.{LogType, LoggingPreferences} import org.openqa.selenium.remote.{CapabilityType, DesiredCapabilities}
ãã©ãŠã¶ã宣èšããå Žæã«ã次ã®è¡ãè¿œå ããŸã
var logPref: LoggingPreferences = new LoggingPreferences() logPref.enable(LogType.BROWSER, Level.SEVERE)
ã¹ãããã³ãŒãã§ã¯ãã¬ããŒãã«ãã°ã衚瀺ããããã«èšè¿°ããŸã
val browserLogs = webDriver.manage().logs().get(LogType.BROWSER).getAll.toArray browserLogs.foreach(x=> markup("<q>%s</q>".format(x)))
ãã°ã«ãšã©ãŒããããšãã«ã¹ãããã倱æãããå Žå-è¿œå
browserLogs.size should be (0)
OSã³ãã³ãã®å®è¡
ãã¹ããå®è¡ããOSã³ãã³ããå®è¡ããå¿
èŠãããå ŽåããããŸãã
次ã®äŸã¯ã空ããã£ã¹ã¯é åã®éã確èªããæ¹æ³ãšãpingã³ãã³ãã§ãã¹ãã®å¯çšæ§ã確èªããæ¹æ³ã瀺ããŠããŸãã
ãã®ããã«ãå¥åã®CMDUtilsãªããžã§ã¯ããäœæãããOSã決å®ãããã³ãã³ãã
import scala.math._ import scala.sys.process._ object CMDUtils extends Exception{ val os = System.getProperty("os.name").substring(0,3) def freeSpace: Long = { var cmd: Seq[String] = null
次ã«ããªããžã§ã¯ãã®ã¡ãœããããã¹ãããåŒã³åºãããŸã
class CMDExecute extends FreeSpec with Matchers{ val limit: Long = 10
OSã³ãã³ãã䜿çšããŠzabbix_senderãŠãŒãã£ãªãã£ã䜿çšããŠããã¹ãçµæãzabbixãµãŒããŒã«éä¿¡ããããšãã§ããŸã
è€éãªæäœïŒããŒã¿ããŒã¹ã®ã¯ãšãªããã¥ãŒãããŒãžã£ãŒããã®ã¡ãã»ãŒãžã®éåä¿¡ãXMLã®è§£æãŸãã¯çæïŒãå®è¡ããã«ã¯ããã¹ãã§ã¡ãœãããåŒã³åºãããå¥ã®ãªããžã§ã¯ããŸãã¯ã¯ã©ã¹ãäœæããŸãã
å®è¡å¯èœjarãã¡ã€ã«ã®äœæ
å Žåã«ãã£ãŠã¯ããããžã§ã¯ãããã§ã¯ãªãããã¹ãŠã®äŸåé¢ä¿ãå«ãå¥åã®jarãã¡ã€ã«ãšããŠãã¹ããå®è¡ããã®ãçã«ããªã£ãŠããŸãã sbt testã³ãã³ããå®è¡ãããã³ã«ããããžã§ã¯ããã¡ã€ã«ãã³ã³ãã€ã«ãããŸãã å€æŽããªãã£ãå Žåãããã確èªããã«ã¯æéãããããŸãã ãã«ãjarã䜿çšãããšããã¹ãã®åå®è¡ã®ã³ã³ãã€ã«/ã¢ã»ã³ãã«ã«æéãè²»ããããšãªããjarã®åœ¢æãå®è¡ããã³ã³ãã€ã«ãªãã§æ¯åãã¹ããå®è¡ã§ããŸãã ãã¡ã€ã«ã«å«ãŸããäŸåé¢ä¿ã«ãããJavaãååšããä»»æã®ãã·ã³ã§ãã¹ããå®è¡ã§ããŸãã
ããã©ã«ãã§ã¯ããã¹ãã¯jarãã¡ã€ã«ã«å«ãŸããŠããªãããããã¹ãã¯ã©ã¹ãã¡ã€ã³ã³ãŒãããå®è¡ãããããã«ããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ãã©ã€ãã©ãªã®ã¹ã³ãŒããå€æŽãããtest-> *ãã®è¡šç€ºãåé€ããŸã
libraryDependencies += "org.scalatest" %% "scalatest_2.11" % "2.2.6"
æ瀺çãªæ瀺ããªãå Žåãããã¯ãã³ã³ãã€ã«ãæ§æã§ãã
詳现ã«ã€ããŠã¯ã
maven.apache.org / guides / introduction / introduction-to-dependency-mechanism.htmlãã芧
ãã ãããäŸåé¢ä¿ãè¿œå ããå¿
èŠããããŸããããããªãã§ã¯HTMLã¬ããŒããäœæã§ããŸãã
libraryDependencies += "org.pegdown" % "pegdown" % "1.6.0"
次ã«ããã¹ãã¯ã©ã¹ã®ãã¡ã€ã«ãsrc / test / scalaãã©ã«ããŒããsrc / main / scalaãã©ã«ããŒã«ç§»åããå¿
èŠããããŸã
ãã®åŸããªããžã§ã¯ããäœæããMainAppãšããååã§ãã¹ããå®è¡ããŸãã
import org.scalatest.tools.Runner object MainApp extends App{ Runner.run(Array("-s", "TestClass", "-h", "report")) }
ã¯ã©ã¹ã¯ããã©ã¡ãŒã¿ãæž¡ãããRunnerãªããžã§ã¯ãã®runã¡ãœãããéå§ããŸã
-sã¯ãå®è¡ãããã¹ãã¯ã©ã¹ã®ååã§ãã
-h-htmlã¬ããŒãã®ãã©ã«ããŒ
ä»ã®ãªãã·ã§ã³ã«ã€ããŠã¯ã
httpïŒ //www.scalatest.org/user_guide/using_the_runnerã
åç
§ããŠãã ããããã®åŸãsbt runãå®è¡ããŸããã¯ã©ã¹ããã®ãã¹ãã¯ãã¹ããã¬ããŒããå«ããã©ã«ããŒãšã¬ããŒããå«ããã¡ã€ã«ãäœæããå¿
èŠããããŸãã
runã³ãã³ãã§ãã¹ããå®è¡ããåŸãäŸåé¢ä¿ã䜿çšããŠjarãã¡ã€ã«ãã³ã³ãã€ã«ã§ããŸãã
ãããè¡ãã«ã¯ããã©ã°ã€ã³
github.com/sbt/sbt-assemblyãè¿œå ããŸã
ãã¡ã€ã«project / plugins.sbtã«æ¬¡ã®è¡ãè¿œå ããŸã
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.1")
ã³ãã³ãå®è¡æã«ãããžã§ã¯ããæŽæ°ããåŸ
sbt assembly
jarãã¡ã€ã«ãtarget / scala-2.11ãã£ã¬ã¯ããªã«çæãããŸã
java -jar .jarã³ãã³ãã䜿çšããŠå®è¡ãããšããã¹ãã®å®è¡ãšã¬ããŒãã®çæãåŸãããŸãã
build.sbtã§æå®ããããšã«ããããããžã§ã¯ãã«ãŒãã«ãã¡ã€ã«ãäœæããããšãã§ããŸãã
assemblyOutputPath in assembly := baseDirectory.value / "tests.jar"
ãã®ã¢ãããŒãã®é©çšã¯ãã¢ã»ã³ããªãé »ç¹ã«èµ·åããããã£ãã«å€æŽãããªãå ŽåããŸãã¯ã¢ã»ã³ããªã®äŸåé¢ä¿ãããªãã®æéããŠã³ããŒããããããã€ã³ã¿ãŒããããååšããªãå¥ã®ãã·ã³ã§ãã¹ãããã°ããå®è¡ããå¿
èŠãããå Žåã«åãå
¥ããããŸãã ãã€ãã¹ã®ãã¡ã倧ããªãã¡ã€ã«ãµã€ãºã«æ³šæããããšãã§ããŸãã ïŒããšãã°ãFirefoxãã©ã€ããŒã䜿çšãããã¹ãã®å Žåã¯40 mbïŒãjarãã¡ã€ã«ããã«ãããããã®æéã
ãã¹ãã倱æãããšãã«ç¹å¥ãªçµäºã³ãŒããå¿
èŠãªå ŽåïŒããšãã°ãã¢ã»ã³ããªãCIãµãŒããŒã«è©²åœããå ŽåïŒãã©ã³ããŒããè¿ãããå€ã確èªããŠã³ãŒããã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
object MainApp extends App{ val res = Runner.run(Array("-s", "TestClass", "-h", "report")) if (!res) sys.exit(1) }
ãŸãããã¹ãã«ã¯ã³ãŒããåå©çšããæ©èœããããŸãã ããšãã°ããã©ãŠã¶ã€ã³ã¹ã¿ã³ã¹ãäœæãããã¹ãã«åæ ŒããåŸã«éããšããµã€ãã§ã®æ¿èªã¯ããã¹ãã¯ã©ã¹ãç¶æ¿ãããå¥ã®ç¹æ§ã«åé¢ã§ããŸãã
æ§æã«ã¯ãtypesafeïŒ
https://github.com/typesafehub/config ïŒã®æ§æã³ã³ããŒãã³ãã䜿çšã§ããŸã
ãããã£ãŠãã©ã€ãã©ãªãæäœããåºæ¬çãªæ¹æ³ãèæ
®ãããããã䟿å©ã§æ±çšçãªèªåãã¹ããäœæã§ããŸãã
å€ã«ã¯ããã£ã¯ã¹ãã£ãã¢ãã¯ãªããžã§ã¯ããããããã£ããŒã¹ã®ãã¹ããããŒãã«é§åãã¹ããSikuliã®äœ¿çšãUIãã¹ããèªååããjavaããããããã®ä»å€ãã®ãããããã®ããããŸããã
ãã®ãã¬ãŒã ã¯ãŒã¯ã®äž»ãªå©ç¹ã®1ã€ã¯ãé«å質ã®ããã¥ã¡ã³ããšãµã³ãã«ãå©çšã§ããããšã§ãã ããã«ããããã¬ãŒã ã¯ãŒã¯ã®åŠç¿ãšäœ¿çšã楜ããå¹æçã«ãªããŸãã
ãã®æè¡ã¹ã¿ãã¯ã®å©ç¹ã¯ãåœç€Ÿã§ã®æåãã䜿çšçµéšã«ãã£ãŠç¢ºèªãããŠããŸãã