{"id":270655,"date":"2015-12-18T13:51:02","date_gmt":"2015-12-18T10:51:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=270655"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=270655","title":{"rendered":"\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0441 Scala \u043d\u0430 Future \u0438 Actor"},"content":{"rendered":"<p>       \u0420\u0435\u0448\u0438\u043b \u0442\u0443\u0442 \u044f \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0430\u0441. \u042f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0417\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u0433\u0435\u0439\u043c\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435. \u041b\u0438\u0441\u0442\u043e\u0447\u0435\u043a \u0431\u0443\u043c\u0430\u0433\u0438 \u0433\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0435\u0439 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0418 \u0443\u0447\u0438\u043c \u0435\u0433\u043e \u0443\u0447\u0438\u043c. \u0418 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a \u044f \u0443\u0447\u0438\u043b \u044d\u0442\u043e \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435. <\/p>\n<p>  \u041f\u0440\u043e\u0441\u043b\u044b\u0448\u0430\u043b \u044f \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3000 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0432, \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 OxfordDictionary \u0441\u0430\u0439\u0442\u0435. \u0412\u043e\u0442 \u0442\u0443\u0442 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432: <a href=\"http:\/\/www.oxfordlearnersdictionaries.com\/wordlist\/english\/oxford3000\/Oxford3000_A-B\/\">www.oxfordlearnersdictionaries.com\/wordlist\/english\/oxford3000\/Oxford3000_A-B<\/a> \u041d\u0443 \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f \u0440\u0435\u0448\u0438\u043b \u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0441\u044e\u0434\u0430: <a href=\"http:\/\/www.translate.ru\/dictionary\/en-ru\/\">www.translate.ru\/dictionary\/en-ru<\/a> \u041e\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u0441\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u0438\u0445 \u0441\u0430\u0439\u0442\u0430\u0445 \u043d\u0443 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432 \u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0438 \u0443\u0447\u0438\u0442\u044c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u044d\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0430 \u0432\u0441\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0438\u0442\u044c. \u0427\u0442\u043e \u0431\u044b \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0432 \u0437\u0430\u043d\u044f\u043b \u043d\u0435 (3000 \u0441\u043b\u043e\u0432 * 2 \u0441\u0430\u0439\u0442\u0430) \/ 60 \u0441\u0435\u043a\u0443\u043d\u0434 = 100 \u043c\u0438\u043d\u0443\u0442. \u042d\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0435 \u043d\u0430 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0443\u043c\u0430\u044e \u044d\u0442\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0434\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u043c, \u043f\u043e\u043a\u0430 \u0437\u0430\u043a\u0440\u043e\u0435\u043c \u0438 \u0442\u0434 \u0438 \u0442\u043f). <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4bc\/eae\/7ea\/4bceae7ea882594409931ec9c01da0eb.jpg\" alt=\"image\"\/><br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u0417\u0430\u0434\u0430\u0447\u0443 \u044f \u0440\u0430\u0437\u0431\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u0434\u0432\u0430 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u043b\u043e\u043a, \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u2014 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0441\u0430\u0439\u0442\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u043e\u043a, \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435, \u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0435 CPU: \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. <\/p>\n<p>  \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0443\u043b\u0435 \u043d\u0438\u0442\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Future \u043e\u0442 Scala. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0430 3 \u0430\u043a\u0442\u0435\u0440\u0430 Akka. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443 TDD, c\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0442\u0435\u0441\u0442 \u043a \u0441\u0432\u043e\u0438\u043c \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u0430\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"scala\">class Test extends FlatSpec with Matchers {    &quot;Table Of Content extractor&quot; should &quot;download and extract content from Oxford Site&quot; in {     val content:List[String] = OxfordSite.getTableOfContent     content.size should be (10)     content.find(_ == &quot;A-B&quot;) should be (Some(&quot;A-B&quot;))     content.find(_ == &quot;U-Z&quot;) should be (Some(&quot;U-Z&quot;))   }    &quot;Words list extractor&quot; should &quot;download words from page&quot; in {     val future: Future[Try[Option[List[String]]]] = OxfordSite.getWordsFromPage(&quot;A-B&quot;, 1)     val wordsTry:Try[Option[List[String]]] = Await.result(future,60 seconds)     wordsTry should be a 'success     val words = wordsTry.get     words.get.find(_ == &quot;abandon&quot;) should be (Some(&quot;abandon&quot;))    }   &quot;Words list extractor&quot; should &quot;return None from empty page&quot; in {     val future: Future[Try[Option[List[String]]]] = OxfordSite.getWordsFromPage(&quot;A-B&quot;, 999)     val wordsTry:Try[Option[List[String]]] = Await.result(future,60 seconds)     wordsTry should be a 'success     val words = wordsTry.get     words should be(None)    }    &quot;Russian Translation&quot; should &quot;download translation and parse&quot; in {     val page: Future[Try[String]] =  LingvoSite.getPage(&quot;test&quot;)     val pageResultTry: Try[String]= Await.result(page,60 seconds)     pageResultTry should be a 'success     val pageResult = pageResultTry.get     pageResult.contains(&quot;\u0442\u0435\u0441\u0442&quot;) should be(true)     LingvoSite.parseTranslation(pageResult).get should be(&quot;\u0442\u0435\u0441\u0442&quot;)   }      &quot;English Translation&quot; should &quot;download translation and parse&quot; in {     val page: Future[Try[String]] =  OxfordSite.getPage(&quot;test&quot;)     val pageResultTry: Try[String] = Await.result(page,60 seconds)     pageResultTry should be a 'success     val pageResult = pageResultTry.get     pageResult.contains(&quot;examination&quot;) should be(true)     OxfordSite.parseTranslation(pageResult).get should be((&quot;test&quot;, &quot;an examination of somebody\u2019s knowledge or ability, consisting of questions for them to answer or activities for them to perform&quot;))    }  } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u044e\u0442 Try[\u2026]. \u0422\u0435 \u043b\u0438\u0431\u043e Success \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043b\u0438 Failure \u0438 \u044d\u043a\u0441\u0435\u043f\u0448\u0435\u043d. \u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u0438\u043c\u0435\u044e\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 i\/o \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u0430\u043a Future[Try[\u2026]]. \u0422\u0435 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f Future \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0434\u0443\u0442 \u0434\u043e\u043b\u0433\u0438\u0435 i\/o \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u0440\u0438\u0442\u043e\u043c \u043e\u043d\u0438 \u0438\u0434\u0443\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Try \u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043e\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0432\u0430\u043b\u043e\u0441\u044c).<\/p>\n<p>  \u0421\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 Top3000WordsApp.scala. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u0435\u0440\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u043a\u0442\u0435\u0440\u044b. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0438 \u0440\u0443\u0441\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0435\u0439 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u043a\u0430\u0447\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0430\u043a\u0442\u0435\u0440\u0430\u043c \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u044e. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0430\u043a\u0442\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0430\u043a\u0442\u0435\u0440\u0443-\u0441\u043b\u043e\u0432\u0430\u0440\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0430\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0418 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e enter, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u0435\u0440\u043e\u0432 \u0438\u0434\u0435\u0442 \u0432 shutdown. \u0418 \u0430\u043a\u0442\u0435\u0440 DictionaryActor, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0431 \u044d\u0442\u043e\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u0444\u0430\u0439\u043b dictionaty.txt<\/p>\n<pre><code class=\"scala\">object Top3000WordsApp extends App {     val system = ActorSystem(&quot;Top3000Words&quot;)   val dictionatyActor = system.actorOf(Props[DictionaryActor], &quot;dictionatyActor&quot;)   val englishTranslationActor = system.actorOf(Props(classOf[EnglishTranslationActor], dictionatyActor), &quot;englishTranslationActor&quot;)   val russianTranslationActor = system.actorOf(Props(classOf[RussianTranslationActor], dictionatyActor), &quot;russianTranslationActor&quot;)   val mapGetPageThreadExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(16))   val mapGetWordsThreadExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(16))     start()    scala.io.StdIn.readLine()   system.terminate()   def start() = {      import concurrent.ExecutionContext.Implicits.global      Future {       OxfordSite.getTableOfContent.par.foreach(letterGroup =&gt; {         getWords(letterGroup, 1)       })      }   }     def getWords(letterGroup: String, pageNum: Int): Unit = {     implicit val executor = mapGetWordsThreadExecutionContext      OxfordSite.getWordsFromPage(letterGroup, pageNum).map(tryWords =&gt; {       tryWords match {         case Success(Some(words)) =&gt; words.par.foreach(word =&gt; {             parse(word,letterGroup,pageNum)         })         case Success(None) =&gt; Unit         case Failure(ex) =&gt; println(ex.getMessage)       }     })    }     def parse(word: String, letterGroup: String, pageNum: Int)= {      implicit val executor = mapGetPageThreadExecutionContext     OxfordSite.getPage(word).map(tryEnglishPage =&gt; {       tryEnglishPage match {         case Success(englishPage) =&gt; {           englishTranslationActor ! (word, englishPage)           getWords(letterGroup, pageNum + 1)         }         case Failure(ex) =&gt; println(ex.getMessage)       }     })     LingvoSite.getPage(word).map(_ match {       case Success(russianPage) =&gt; {         russianTranslationActor !(word, russianPage)       }       case Failure(ex) =&gt; println(ex.getMessage)     })   }  }  <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 start, getWords, parse \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0430\u0437\u044b \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u043f\u0443\u043b \u043d\u0438\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u044f\u0432\u043d\u043e, \u043a\u0430\u043a ThreadExecutionContext. \u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f getWords, \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0436\u0438\u0440\u0430\u043b\u043e \u0432\u0435\u0441\u044c \u043f\u0443\u043b \u043d\u0438\u0442\u0435\u0439 \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0437\u0443 \u0431\u044b\u043b\u0438 \u0432\u0435\u0447\u043d\u044b\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0436\u0435 \u043c\u043d\u0435 \u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0410 \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u043d\u0438\u0437\u0443 \u0441\u0430\u043c\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0412\u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441 \u0441\u0430\u0439\u0442\u043e\u0432.<\/p>\n<pre><code class=\"scala\">object OxfordSite {    val getPageThreadExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(16))    def parseTranslation(content: String): Try[(String, String)] = {     Try {       val browser = new Browser       val doc = browser.parseString(content)       val spanElement: Element = doc &gt;&gt; element(&quot;.phon&quot;)       val str = Jsoup.parse(spanElement.toString).text()       val transcription = str.stripPrefix(&quot;BrE\/\/&quot;).stripSuffix(&quot;\/\/&quot;).trim       val translation = doc &gt;&gt; text(&quot;.def&quot;)       (transcription,translation)     }   }    def getPage(word: String): Future[Try[String]] = {     implicit val executor = getPageThreadExecutionContext     Future {       Try {         val html = Source.fromURL(&quot;http:\/\/www.oxfordlearnersdictionaries.com\/definition\/english\/&quot; + (word.replace(' ','-')) + &quot;_1&quot;)         html.mkString       }     }   }    def getWordsFromPage(letterGroup: String, pageNum: Int): Future[Try[Option[List[String]]]] = {     import ExecutionContext.Implicits.global      Future {       Try {         val html = Source.fromURL(&quot;http:\/\/www.oxfordlearnersdictionaries.com&quot; +           &quot;\/wordlist\/english\/oxford3000\/Oxford3000_&quot; + letterGroup + &quot;\/?page=&quot; + pageNum)         val page = html.mkString         val browser = new Browser         val doc = browser.parseString(page)         val ulElement: Element = doc &gt;&gt; element(&quot;.wordlist-oxford3000&quot;)         val liElements: List[Element] = ulElement &gt;&gt; elementList(&quot;li&quot;)         if (liElements.size &gt; 0) Some(liElements.map(_ &gt;&gt; text(&quot;a&quot;)))         else None       }     }   }    def getTableOfContent: List[String] = {      val html = Source.fromURL(&quot;http:\/\/www.oxfordlearnersdictionaries.com\/wordlist\/english\/oxford3000\/Oxford3000_A-B\/&quot;)     val page = html.mkString     val browser = new Browser     val doc = browser.parseString(page)     val ulElement: Element = doc &gt;&gt; element(&quot;.hide_phone&quot;)     val liElements: List[Element] = ulElement &gt;&gt; elementList(&quot;li&quot;)     List(liElements.head &gt;&gt; text(&quot;span&quot;)) ++ liElements.tail.map(_ &gt;&gt; text(&quot;a&quot;))   }  }   object LingvoSite {   val getPageThreadExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(16))     def parseTranslation(content: String): Try[String] = {     Try {        val browser = new Browser       val doc = browser.parseString(content)       val spanElement: Element = doc &gt;&gt; element(&quot;.r_rs&quot;)       spanElement &gt;&gt; text(&quot;a&quot;)     }   }    def getPage(word: String): Future[Try[String]] = {     implicit val executor = getPageThreadExecutionContext      Future {       Try {          val html = Source.fromURL(&quot;http:\/\/www.translate.ru\/dictionary\/en-ru\/&quot; + java.net.URLEncoder.encode(word,&quot;UTF-8&quot;))         html.mkString       }     }   }  }  <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0430\u043a\u0442\u0435\u0440\u044b.<\/p>\n<pre><code class=\"scala\">case class Word (word: String, transcription: Option[String] = None, russianTranslation:Option[String] = None, englishTranslation: Option[String] = None) case class RussianTranslation(word:String, translation: String) case class EnglishTranslation(word:String, translation: String) case class Transcription(word:String, transcription: String)  <\/code><\/pre>\n<p>  \u0410\u043a\u0442\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0438 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u044e \u0430\u043a\u0442\u0435\u0440\u0443 DictionaryActor<\/p>\n<pre><code class=\"scala\">class EnglishTranslationActor (dictionaryActor: ActorRef) extends Actor {   println(&quot;EnglishTranslationActor&quot;)     def receive = {     case (word: String, englishPage: String) =&gt; {       OxfordSite.parseTranslation(englishPage) match {         case Success((transcription, translation)) =&gt; {           dictionaryActor ! EnglishTranslation(word,translation)           dictionaryActor ! Transcription(word,transcription)         }         case Failure(ex) =&gt; {           println(ex.getMessage)         }       }     }   }  }   class RussianTranslationActor  (dictionaryActor: ActorRef) extends Actor {   println(&quot;RussianTranslationActor&quot;)     def receive = {     case (word: String, russianPage: String) =&gt; {       LingvoSite.parseTranslation(russianPage) match {         case Success(translation) =&gt; {             dictionaryActor ! RussianTranslation(word, translation)         }         case Failure(ex) =&gt; {           println(ex.getMessage)         }       }     }   }    }  <\/code><\/pre>\n<p>  \u0410\u043a\u0442\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0435\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435 shutdown \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u043a\u0442\u0435\u0440\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 dictionary.txt<\/p>\n<pre><code class=\"scala\">class DictionaryActor extends Actor {   println(&quot;DictionaryActor&quot;)     override def postStop(): Unit = {     println(&quot;DictionaryActor postStop&quot;)     val fileText = DictionaryActor.words.map{case (_, someWord)=&gt; {       val transcription = someWord.transcription.getOrElse(&quot; &quot;)       val russianTranslation = someWord.russianTranslation.getOrElse(&quot; &quot;)       val englishTranslation = someWord.englishTranslation.getOrElse(&quot; &quot;)       List(someWord.word, transcription , russianTranslation , englishTranslation).mkString(&quot;|&quot;)     }}.mkString(&quot;\\n&quot;)     scala.tools.nsc.io.File(&quot;dictionary.txt&quot;).writeAll(fileText)     println(&quot;dictionary.txt saved&quot;)     System.exit(0)    }    def receive = {     case Transcription(wordName, transcription) =&gt; {       val newElement = DictionaryActor.words.get(wordName) match {         case Some(word) =&gt; word.copy(transcription = Some(transcription))         case None =&gt;  Word(wordName,transcription = Some(transcription))       }       DictionaryActor.words += wordName -&gt; newElement       println(newElement)     }     case RussianTranslation(wordName, translation) =&gt; {       val newElement = DictionaryActor.words.get(wordName) match {         case Some(word) =&gt; word.copy(russianTranslation = Some(translation))         case None =&gt;  Word(wordName,russianTranslation = Some(translation))       }       DictionaryActor.words += wordName -&gt; newElement       println(newElement)     }     case EnglishTranslation(wordName, translation) =&gt; {       val newElement = DictionaryActor.words.get(wordName) match {         case Some(word) =&gt; word.copy(englishTranslation = Some(translation))         case None =&gt;  Word(wordName,englishTranslation = Some(translation))       }       DictionaryActor.words += wordName -&gt; newElement       println(newElement)     }   } }   object DictionaryActor {   var words = scala.collection.mutable.Map[String, Word]() } <\/code><\/pre>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b? \u041d\u0430 \u043c\u043e\u0435\u043c Mac Book Pro \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 1 \u0447\u0430\u0441\u0430, \u043f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u042f \u0435\u0433\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u043b \u043d\u0430\u0436\u0430\u0432 enter \u0438 \u0432\u043e\u0442 \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"bash\">bash-3.2$ cat .\/dictionary.txt |wc -l     1809 <\/code><\/pre>\n<p>  \u041f\u043e\u0442\u043e\u043c, \u044f \u0435\u0449\u0435 \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f, \u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d 100% \u0438 \u0431\u044b\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u043f\u0440\u043e \u0433\u0430\u0440\u0431\u0430\u0436 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440, \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 enter \u043c\u043e\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0444\u0430\u0439\u043b. \u0414\u0438\u0430\u0433\u043d\u043e\u0437 \u0442\u0430\u043a\u043e\u0439, \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Future \u0438 par.map \u0438\u043b\u0438 par.foreach, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0442\u044f\u0436\u0435\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043d\u0438\u0442\u0435\u0439 \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0433\u0434\u0435 \u0436\u0435 \u0443\u0437\u043a\u043e\u0435 \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e \u0431\u0443\u0442\u044b\u043b\u043a\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0430\u043a\u0442\u0435\u0440\u044b. \u041f\u0440\u0438\u0442\u043e\u043c, \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043b\u044b \u0430\u043a\u0442\u0435\u0440\u043e\u0432. \u0427\u0442\u043e \u0431\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 4 \u0430\u043a\u0442\u0435\u0440\u0430 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043b\u043e \u0438 \u043f\u0430\u0440\u0441\u0438\u043b\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0441\u043b\u043e\u0432, 18 \u0430\u043a\u0442\u0435\u0440\u043e\u0432 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043b\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438, 4 \u0430\u043a\u0442\u0435\u0440\u0430 \u043f\u0430\u0440\u0441\u0438\u043b\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u044e, \u043d\u0443 \u0438 1 \u0430\u043a\u0442\u0435\u0440 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b \u0432\u0441\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c. <\/p>\n<p>  \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0431\u0440\u0430\u043d\u0447\u0435 v0.1 <a href=\"https:\/\/github.com\/evgenyigumnov\/top3000words\/tree\/v0.1\">github.com\/evgenyigumnov\/top3000words\/tree\/v0.1<\/a> \u0412\u0435\u0440\u0441\u0438\u044f \u0433\u0434\u0435 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0430\u043a\u0442\u0435\u0440\u044b \u0441 \u043f\u0443\u043b\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0431\u0440\u0430\u043d\u0447\u0435 v0.2, \u043d\u0443 \u0438 \u0432 master, \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u041c\u043e\u0436\u0435\u0442 \u0435\u0441\u0442\u044c \u0443 \u043a\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u043b \u043d\u0435 \u0442\u0430\u043a, \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438? \u041d\u0443 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e\u0434\u043a\u0438\u043d\u0438\u0442\u0435 \u043f\u043e \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438?<\/p>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d: <a href=\"https:\/\/github.com\/evgenyigumnov\/top3000words\">github.com\/evgenyigumnov\/top3000words<\/a><\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430: sbt test<br \/>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: sbt run <br \/>  \u041d\u0443 \u0438 \u043a\u0430\u043a \u043d\u0430\u0434\u043e\u0435\u0441\u0442 \u0436\u0434\u0430\u0442\u044c, \u043d\u0430\u0436\u0430\u0442\u044c enter \u0438 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u0430 dectionary.txt \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u0430\u043f\u043a\u0435               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/273431\/\"> http:\/\/habrahabr.ru\/post\/273431\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0420\u0435\u0448\u0438\u043b \u0442\u0443\u0442 \u044f \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0430\u0441. \u042f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0417\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u0433\u0435\u0439\u043c\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435. \u041b\u0438\u0441\u0442\u043e\u0447\u0435\u043a \u0431\u0443\u043c\u0430\u0433\u0438 \u0433\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0435\u0439 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0418 \u0443\u0447\u0438\u043c \u0435\u0433\u043e \u0443\u0447\u0438\u043c. \u0418 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a \u044f \u0443\u0447\u0438\u043b \u044d\u0442\u043e \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435. <\/p>\n<p>  \u041f\u0440\u043e\u0441\u043b\u044b\u0448\u0430\u043b \u044f \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3000 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0432, \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 OxfordDictionary \u0441\u0430\u0439\u0442\u0435. \u0412\u043e\u0442 \u0442\u0443\u0442 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432: <a href=\"http:\/\/www.oxfordlearnersdictionaries.com\/wordlist\/english\/oxford3000\/Oxford3000_A-B\/\">www.oxfordlearnersdictionaries.com\/wordlist\/english\/oxford3000\/Oxford3000_A-B<\/a> \u041d\u0443 \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f \u0440\u0435\u0448\u0438\u043b \u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0441\u044e\u0434\u0430: <a href=\"http:\/\/www.translate.ru\/dictionary\/en-ru\/\">www.translate.ru\/dictionary\/en-ru<\/a> \u041e\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u0441\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u0438\u0445 \u0441\u0430\u0439\u0442\u0430\u0445 \u043d\u0443 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432 \u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0438 \u0443\u0447\u0438\u0442\u044c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u044d\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0430 \u0432\u0441\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0438\u0442\u044c. \u0427\u0442\u043e \u0431\u044b \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0432 \u0437\u0430\u043d\u044f\u043b \u043d\u0435 (3000 \u0441\u043b\u043e\u0432 * 2 \u0441\u0430\u0439\u0442\u0430) \/ 60 \u0441\u0435\u043a\u0443\u043d\u0434 = 100 \u043c\u0438\u043d\u0443\u0442. \u042d\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0435 \u043d\u0430 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0443\u043c\u0430\u044e \u044d\u0442\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0434\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u043c, \u043f\u043e\u043a\u0430 \u0437\u0430\u043a\u0440\u043e\u0435\u043c \u0438 \u0442\u0434 \u0438 \u0442\u043f). <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4bc\/eae\/7ea\/4bceae7ea882594409931ec9c01da0eb.jpg\" alt=\"image\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-270655","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/270655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=270655"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/270655\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=270655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=270655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=270655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}