{"id":197930,"date":"2013-10-17T12:15:03","date_gmt":"2013-10-17T08:15:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=197930"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=197930","title":{"rendered":"<span class=\"post_title\">\u0418\u0433\u0440\u0430\u0435\u043c \u0432 RSS \u0441 PlayFramework 2.2 \u0438 Scala<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" align=\"left\" src=\"http:\/\/habr.habrastorage.org\/post_images\/ff9\/55e\/3fa\/ff955e3fa48672518d5bb089bcf70c7c.png\"\/><\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0445\u0430\u0431\u0440\u0430\u0432\u0447\u0430\u043d\u0435.<\/p>\n<p>  \u041c\u044b, <s>\u043f\u043e\u0433\u0440\u043e\u043c<\/s>\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 X \u0438\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Y \u2014 \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430 Yet Another Hello World? \u0427\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u0447\u0442\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 X\/Y, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u044b \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u041c\u044b \u0441 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u043d\u0430\u043f\u0438\u0448\u0438 RSS \u0447\u0438\u0442\u0430\u043b\u043a\u0443. \u0422\u0443\u0442 \u0442\u0435\u0431\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0438 XML \u043f\u0430\u0440\u0441\u0435\u0440, \u0438 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043f\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440. \u0414\u0430 \u043c\u0430\u043b\u043e \u043b\u0438.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a <b>Play Framework 2.2 + Scala + MongoDB<\/b> \u043d\u0430 \u0431\u044d\u043a\u044d\u043d\u0434\u0435 \u0438 <b>AngularJS + CoffeeScript<\/b> \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TL;DR<\/b><\/p>\n<div class=\"spoiler_text\">\u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 ~250-300 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Scala \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0438 ~150 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 CS. \u041d\u0443 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e HTML. <br \/>  \u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/bitbucket.org\/ImLiar\/playrss\">Bitbucket<\/a><\/div>\n<\/div>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h5>\u0418 \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u043f\u043e\u0447\u0435\u043c\u0443 Scala, \u0430 \u043d\u0435 Java? \u0418 \u043f\u043e\u0447\u0435\u043c\u0443 Play, \u0430 \u043d\u0435 \u0442\u043e\u0442 \u0436\u0435 Lift?<\/h5>\n<p>  \u041e\u0442\u0432\u0435\u0442\u044b \u0434\u043e\u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u044b \u0438 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b.<br \/>  Scala \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0434\u0430 \u0440\u0430\u0434\u0438 \u043a\u043e\u0434\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 <a href=\"http:\/\/www.scala-lang.org\/api\/current\/index.html#scala.collection.immutable.List\">List<\/a> \u0441 \u0435\u0433\u043e 200 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0436\u0438\u0437\u043d\u0438\u2026 \u0421\u0435\u0440\u044c\u0435\u0437\u043d\u043e, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u0438.<br \/>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u2014 \u043d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 Lift&#8217;e \u043e\u0442\u0434\u0430\u043b \u043c\u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u0445\u043e\u0441\u0442\u0435 \u0437\u0430 <b>~150 \u043c\u0441<\/b>, \u0438 \u044d\u0442\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0411\u0414. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 \u0442\u043e\u0439 \u0436\u0435 JVM Play \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0437\u0430 ~5-10 \u043c\u0441. \u041d\u0435 \u0437\u043d\u0430\u044e, \u043c\u043e\u0436\u0435\u0442 \u0437\u0432\u0435\u0437\u0434\u044b \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u0438\u0441\u044c.<br \/>  \u0410 \u0435\u0449\u0435 \u0432 \u043f\u043b\u0435\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043a\u0430 \u043c\u0438\u043b\u0430\u044f.<\/p>\n<p>  \u042f \u0443\u043f\u0443\u0449\u0443 \u0447\u0430\u0441\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Play, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 <a href=\"http:\/\/www.playframework.com\/documentation\/2.2.x\/Installing\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0436\u0435\u0432\u0430\u043d\u043e<\/a> \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 (\u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f <a href=\"http:\/\/www.playframework.com\/documentation\/2.2.x\/IDE\">\u043b\u044e\u0431\u0438\u043c\u043e\u0439 IDE<\/a>), \u0438 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h5>\u041f\u0443\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h5>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0430\u043c\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043e\u043d \u043d\u0430 Netty, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u043f\u0430\u0442\u044c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0433\u043b\u0443\u0431\u043e\u043a\u043e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e \u041a\u0438\u0442\u0430\u044f.<br \/>  \u041a\u0430\u043a \u043a\u0430\u0436\u0434\u0430\u044f \u0440\u0435\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0440\u0443\u0447\u0435\u0439\u043a\u0430, \u0442\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Play \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">conf\/routes<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre> # Routes # This file defines all application routes (Higher priority routes first) # ~~~~  # Get news GET     \/news                       controllers.NewsController.news(tag: String ?= &quot;&quot;, pubDate:Int ?= (System.currentTimeMillis()\/1000).toInt)  # Parse news GET     \/parse                      controllers.NewsController.parseRSS  # Get tags GET     \/tags                       controllers.TagsController.tags  # Map static resources from the \/public folder to the \/assets URL path GET     \/assets\/*file               controllers.Assets.at(path=&quot;\/public&quot;, file)  # Home page GET     \/                           controllers.Application.index  <\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><b>\u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u044f\u0445:<\/b><br \/>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438.<br \/>  \u041a \u0441\u043b\u043e\u0432\u0443, \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0432 Play \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0440\u0435\u0433\u044d\u043a\u0441\u043f\u043e\u0432 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  <\/p><\/blockquote>\n<p>  <\/p>\n<h5>\u041f\u0440\u0435\u0434\u044a\u044f\u0432\u0438\u0442\u0435 \u0431\u0438\u043b\u0435\u0442!<\/h5>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u2014 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438. \u0412 Play \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u043f\u0430\u043a\u0435\u0442 <code>controllers<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u0440\u0435\u0439\u0442 <code>Controller<\/code> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0447\u044c\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u043e\u043c.<br \/>  \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 AJAX, \u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0430\u043d\u0430\u043b\u0435\u043d \u043a\u0430\u043a \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 HTML\/CS\/JS \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435 \u043d\u0430\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438 20 \u0441\u0442\u0440\u043e\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">package controllers  import play.api.mvc._  \/**  * playRSS entry point  *\/ object Application extends Controller {    \/**    * Main page. So it begins...    * @return    *\/   def index = Action {     Ok(views.html.index())   }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <code>Ok<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>play.api.mvc.SimpleResult<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0442\u0435\u043b\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d, \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043e\u0441\u043e\u0431\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435, 200 <code>OK<\/code>.<\/p>\n<blockquote><p><b>\u041e\u0434\u043d\u0430\u043a\u043e<\/b><br \/>  \u0415\u0441\u043b\u0438 \u0432 20 \u0441\u0442\u0440\u043e\u043a \u0432\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 \u0440\u0443\u0431\u0438.  <\/p><\/blockquote>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043d\u0430 AJAX \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, JSON.<br \/>  \u042d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f <code>NewsController<\/code><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">object NewsController<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">package controllers  import play.api.mvc._ import scala.concurrent._ import models.News import play.api.libs.concurrent.Execution.Implicits.defaultContext import models.parsers.Parser import com.mongodb.casbah.Imports._  object NewsController extends Controller {    \/**    * Get news JSON    * @param tag optional tag filter    * @param pubDate optional pubDate filter for loading news before this UNIX timestamp    * @return    *\/   def news(tag: String, pubDate: Int) = Action.async {     val futureNews = Future {       try {         News asJson News.allNews(tag, pubDate)       } catch {         case e: MongoException =&gt; throw e       }     }      futureNews.map {       news =&gt; Ok(news).as(&quot;application\/json&quot;)     }.recover {       case e: MongoException =&gt; InternalServerError(&quot;{error: 'DB Error: &quot; + e.getMessage + &quot;'}&quot;).as(&quot;application\/json&quot;)     }   }    \/**    * Start new RSS parsing and return first N news    * @return    *\/   def parseRSS = Action.async {     val futureParse = scala.concurrent.Future {       try {         Parser.downloadItems(News.addNews(_))         News asJson News.allNews()       } catch {         case e: Exception =&gt; throw e       }     }      futureParse.map(newsJson =&gt; Ok(newsJson).as(&quot;application\/json&quot;)).recover {       case e: MongoException =&gt; InternalServerError(&quot;{error: 'DB Error: &quot; + e.getMessage + &quot;'}&quot;).as(&quot;application\/json&quot;)       case e: Exception =&gt; InternalServerError(&quot;{error: 'Parse Error: &quot; + e.getMessage + &quot;'}&quot;).as(&quot;application\/json&quot;)     }    }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <code>Future<\/code>. <code>Async<\/code>. \u0422\u0443\u0442 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<br \/>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Play \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0435\u043d \u0438 \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0430\u0434\u043e. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e <s>\u0441\u0440\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u03c0<\/s> \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0411\u0414, \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0443\u044e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0443\u044e I\/O \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <code>Future<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>Future<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<br \/>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0436\u0435 \u043d\u0435 <code>SimpleResult<\/code>, \u0430 <code>Future[SimpleResult]<\/code>, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>async<\/code> \u0442\u0440\u0435\u0439\u0442\u0430 <code>ActionBuilder<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Action<\/code>)<\/p>\n<h5>\u041f\u0435\u0439\u0437\u0430\u0436\u044b<\/h5>\n<p>  \u041f\u0440\u0435\u0440\u0432\u0435\u043c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0448\u043c\u0430\u0440\u043e\u043c \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043c\u0438\u043b\u044b\u043c \u043d\u0430\u0448\u0435\u043c\u0443 \u0432\u0437\u0433\u043b\u044f\u0434\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c. Play \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c HTML. \u041e\u0431\u044b\u0447\u043d\u044b\u043c \u0442\u0430\u043a\u0438\u043c HTML \u0441\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 Scala \u043a\u043e\u0434\u0430. \u0428\u0430\u0431\u043b\u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043a\u0430\u043b\u043a\u043e\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c (\u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c) \u0434\u0440\u0443\u0433\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b. \u041a \u0441\u043b\u043e\u0432\u0443, \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435\u0432\u0437\u043b\u044e\u0431\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0438\u0437-\u0437\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e HTML \u0432 \u043a\u043e\u0434. \u0410 \u043c\u043d\u0435 \u043d\u043e\u0440\u043c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">index.scala.html<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"html\">&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt;     &lt;title&gt;         playRSS     &lt;\/title&gt;     &lt;link rel=&quot;shortcut icon&quot; href='@routes.Assets.at(&quot;images\/favicon.png&quot;)' type=&quot;image\/png&quot;&gt;     &lt;link rel=&quot;stylesheet&quot; href=&quot;http:\/\/netdna.bootstrapcdn.com\/bootstrap\/3.0.0\/css\/bootstrap.min.css&quot;\/&gt;     &lt;link rel=&quot;stylesheet&quot; href='@routes.Assets.at(&quot;stylesheets\/main.css&quot;)'&gt;     @helper.requireJs(core = routes.Assets.at(&quot;javascripts\/require.js&quot;).url, module =     routes.Assets.at(&quot;javascripts\/main&quot;).url) &lt;\/head&gt; &lt;body&gt; &lt;div class=&quot;container&quot; id=&quot;container&quot; ng-controller=&quot;MainCtrl&quot;&gt;     &lt;a href=&quot;\/&quot;&gt;&lt;h1&gt;playRSS&lt;\/h1&gt;&lt;\/a&gt;      @control()      &lt;div class=&quot;row&quot;&gt;         &lt;div class=&quot;col-lg-12&quot;&gt;             @news()         &lt;\/div&gt;     &lt;\/div&gt; &lt;\/div&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u2014 \u043c\u0430\u0433\u0438\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e. <code>@helper<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 requireJS, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0441\u0430\u043c\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u0434\u043e main.js, \u0433\u0434\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. <code>@news()<\/code> \u0438 <code>@control()<\/code> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d\u044b news.scala.html \u0438 control.scala.html \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041c\u0438\u043b\u043e.  <\/p>\n<blockquote><p><b>\u0410 \u0435\u0449\u0435<\/b><br \/>  \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0446\u0438\u043a\u043b\u0430\u043c\u0438, if\/else \u0438 \u0442.\u043f. \u0415\u0441\u0442\u044c <a href=\"http:\/\/www.playframework.com\/documentation\/2.2.x\/ScalaTemplates\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>  <\/p><\/blockquote>\n<p>  <\/p>\n<h5>\u0413\u043e\u0440\u0430 \u041a\u0430\u0441\u0431\u0430\u0445<\/h5>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0441 \u0411\u0414. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d Mongo. <s>\u0422\u0430\u043a \u043a\u0430\u043a \u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u0435\u043d\u0438\u0432, \u0447\u0442\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \ud83d\ude42<\/s><br \/>  Casbah \u2014 <a href=\"http:\/\/mongodb.github.io\/casbah\/\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB \u0432 \u0441\u043a\u0430\u043b\u043a\u0435. \u0415\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0410 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e:  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <code>libraryDependencies<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 build.sbt \u0441\u0442\u0440\u043e\u0447\u043a\u0443:<br \/>  <code>&quot;org.mongodb&quot; %% &quot;casbah&quot; % &quot;2.6.3&quot;<\/code><\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0448 \u043a\u043e\u0434:<br \/>  <code>import com.mongodb.casbah.Imports._<\/code><\/li>\n<li>Play \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0430\u043c \u0432\u044b\u043a\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/li>\n<li>???<\/li>\n<li>PROFIT<\/li>\n<\/ul>\n<p>  \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043a\u043e\u0434\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0447\u0438\u0442\u0430\u043b\u043a\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u0434\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0438\u0437 MongoDB. \u041f\u0440\u0430\u0432\u043e \u0434\u0435\u043b\u043e, \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c DAO \u0438\u043b\u0438 DI \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u043b\u0438\u0448\u043d\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">object Database<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">package models  import com.mongodb.casbah.Imports._ import play.api.Play  \/**  * Simple object for DB connection  *\/ object Database {   private val db = MongoClient(       Play.current.configuration.getString(&quot;mongo.host&quot;).get,       Play.current.configuration.getInt(&quot;mongo.port&quot;).get).     getDB(Play.current.configuration.getString(&quot;mongo.db&quot;).get)    \/**    * Get collection by its name    * @param collectionName    * @return    *\/   def collection(collectionName:String) = db(collectionName)    \/**    * Clear collection by its name    * @param collectionName    * @return    *\/   def clearCollection(collectionName:String) = db(collectionName).remove(MongoDBObject())  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><b>\u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u044f\u0445:<\/b><br \/>  \u0412 Scala \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b. \u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0437\u0430\u043d\u0443\u0434\u044b \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 (\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 Java\/JVM). \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0448\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p><\/blockquote>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0430\u0437\u043e\u0439 \u043d\u0430 Scala \u0438 Casbah:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">object News<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">\/**  * Default news container  * @param id MongoID  * @param title  * @param link  * @param content  * @param tags Sequence of tags. Since categories could be joined into one  * @param pubDate  *\/ case class News(val id: String = &quot;0&quot;, val title: String, val link: String, val content: String, val tags: Seq[String], val pubDate: Long)  \/**  * News object allows to operate with news in database. Companion object for News class  *\/ object News {    ....     \/**    * Method to add news to database    * @param news filled News object    * @return    *\/   def addNews(news: News) = {     val toInsert = MongoDBObject(&quot;title&quot; -&gt; news.title, &quot;content&quot; -&gt; news.content, &quot;link&quot; -&gt; news.link, &quot;tags&quot; -&gt; news.tags, &quot;pubDate&quot; -&gt; news.pubDate)     try {       col.insert(toInsert)     } catch {       case e: Exception =&gt;     }   }    ....    \/**    * Get news from DB    * @param filter filter for find() method    * @param sort object for sorting. by default sorts by pubDate    * @param limit limit for news select. by default equals to newsLimit    * @return    *\/   def getNews(filter: MongoDBObject, sort: MongoDBObject = MongoDBObject(&quot;pubDate&quot; -&gt; -1), limit: Int = newsLimit): Array[News] = {     try {       col.find(filter).         sort(sort).         limit(limit).         map((o: DBObject) =&gt; {         new News(           id = o.as[ObjectId](&quot;_id&quot;).toString,           title = o.as[String](&quot;title&quot;),           link = o.as[String](&quot;link&quot;),           content = o.as[String](&quot;content&quot;),           tags = o.as[MongoDBList](&quot;tags&quot;).map(_.toString),           pubDate = o.as[Long](&quot;pubDate&quot;))       }).toArray     } catch {       case e: MongoException =&gt; throw e     }   }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 MongoDB, API \u0438 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 case class News. \u041f\u043e\u043a\u0430 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e. \u0414\u0430\u0436\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c.<br \/>  \u041d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 <a href=\"http:\/\/docs.mongodb.org\/manual\/aggregation\/\">aggregation<\/a>?<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u044f \u0442\u0435\u0433\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">\/**  * News tag container  * @param name  * @param total  *\/ case class Tags(name: String, total: Int)  \/**  * Tags object allows to operate with tags in DB  *\/ object Tags {    \/**    * News collection contains all tag info    *\/   private val col: MongoCollection = Database.collection(&quot;news&quot;)    \/**    * Get all tags as [{name: &quot;&quot;, total: 0}] array of objects    * @return    *\/   def allTags: Array[Tags] = {      val group = MongoDBObject(&quot;$group&quot; -&gt; MongoDBObject(       &quot;_id&quot; -&gt; &quot;$tags&quot;,       &quot;total&quot; -&gt; MongoDBObject(&quot;$sum&quot; -&gt; 1)     ))      val sort = MongoDBObject(&quot;$sort&quot; -&gt; MongoDBObject(&quot;total&quot;-&gt; -1))      try {       col.aggregate(group,sort).results.map((o: DBObject) =&gt; {         val name = o.as[MongoDBList](&quot;_id&quot;).toSeq.mkString(&quot;, &quot;)         val total = o.as[Int](&quot;total&quot;)         Tags(name, total)       }).toArray     } catch {       case e: MongoException =&gt; throw e     }   } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <code>.aggregate<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0447\u0443\u0434\u0435\u0441\u0430 \u0431\u0435\u0437 mapReduce. \u0418 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 Scala \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. \u042d\u0434\u0430\u043a\u0438\u0439 pipeline-way, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e. \u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e \u0442\u0435\u0433\u0430\u043c, \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0432 total \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e. \u041e\u0442\u043b\u0438\u0447\u043d\u043e.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Kasbah\">Casbah \u2014 \u044d\u0442\u043e \u0446\u0438\u0442\u0430\u0434\u0435\u043b\u044c<\/a><\/p>\n<h5>You&#8217;re JSON-XMLed<\/h5>\n<p>  <\/p>\n<blockquote><p><i>Never gonna give you up<br \/>  Never gonna let you down<\/i>  <\/p><\/blockquote>\n<p>  \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 XML\/JSON \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448. \u041f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0442\u043a\u043e.<br \/>  \u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 XML \u0432 Scala \u2014 \u0443\u0441\u043b\u0430\u0434\u0430 \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u0433\u043b\u0430\u0437 (\u043f\u043e\u0441\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0430\u0431\u0440\u0438\u043a \u0444\u0430\u0431\u0440\u0438\u043a \u0432 Java).  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">XML Parser<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">package models.parsers  import scala.xml._ import models.News import java.util.Locale import java.text.{SimpleDateFormat, ParseException} import java.text._ import play.api.Play import collection.JavaConversions._  \/**  * Simple XML parser  *\/ object Parser {    \/**    * RSS urls from application.conf    *\/   val urls = try {     Play.current.configuration.getStringList(&quot;rss.urls&quot;).map(_.toList).getOrElse(List())   } catch {     case e: Throwable =&gt; List()   }    \/**    * Download and parse XML, fill News object and pass it to callback    * @param cb    *\/   def downloadItems(cb: (News) =&gt; Unit) = {     urls.foreach {       (url: String) =&gt;         try {           parseItem(XML.load(url)).foreach(cb(_))         } catch {           case e: Exception =&gt; throw e         }     }   }    \/**    * Parse standart RSS time    * @param s    * @return    *\/   def parseDateTime(s: String): Long = {     try {       new SimpleDateFormat(&quot;EEE, dd MMM yyyy HH:mm:ss zzz&quot;, Locale.ENGLISH).parse(s).getTime \/ 1000     } catch {       case e: ParseException =&gt; 0     }   }    \/**    * For all items in RSS parse its content and return list of News objects    * @param xml    * @return    *\/   def parseItem(xml: Elem): List[News] = (xml \\\\ &quot;item&quot;).map(buildNews(_)).toList    \/**    * Fill and return News object    * @param node    * @return    *\/   def buildNews(node: Node) = new News(     title = (node \\\\ &quot;title&quot;).text,     link = (node \\\\ &quot;link&quot;).text,     content = (node \\\\ &quot;description&quot;).text,     pubDate = parseDateTime((node \\\\ &quot;pubDate&quot;).text),     tags = Seq((node \\\\ &quot;category&quot;).text))  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><b>\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d<\/b> <br \/>  \u041f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0438\u0434\u0430 \\ \u0438\u043b\u0438 \\\\ \u0432\u0433\u043e\u043d\u044f\u044e\u0442 \u0432 \u0441\u0442\u0443\u043f\u043e\u0440. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u043c\u044b\u0441\u043b, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0448\u044c BigInteger \u0438\u0437 Java.<\/p><\/blockquote>\n<p>  \u0410 \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e JSON? \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 JSON \u0432 Scala \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439. \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439.<br \/>  \u0412 \u0442\u0440\u0443\u0434\u043d\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 Play \u0438 \u0435\u0433\u043e Writes\/Reads \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <code>play.api.libs.json<\/code>. \u041a\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>JsonSerializable<\/code> \u0438\u0437 PHP 5.4? \u0422\u0430\u043a \u0432\u043e\u0442 \u0432 Play \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435!<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">JSON Writes<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">case class News(val id: String = &quot;0&quot;, val title: String, val link: String, val content: String, val tags: Seq[String], val pubDate: Long)  \/**  * News object allows to operate with news in database. Companion object for News class  *\/ object News {    \/**    * Play Magic    * @return    *\/   implicit def newsWrites = Json.writes[News]    \/**    * Converts array of news to json    * @param src Array of News instances    * @return JSON string    *\/   def asJson(src: Array[News]) = {     Json.stringify(Json.toJson(src))   }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>someObjectWrites<\/code> \u0432 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041d\u0435\u044f\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Scala \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u0449\u043d\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<br \/>  \u041d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439. \u041a\u043e\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0442\u043e \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 <a href=\"http:\/\/www.playframework.com\/documentation\/2.2.x\/ScalaJsonCombinators\">\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u0449\u0438\u043d\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u044b<\/a>.<\/p>\n<h5>\u0427\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043d\u0438\u0438 \u043a \u0437\u0432\u0435\u0437\u0434\u0430\u043c<\/h5>\n<p>  \u041f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0443\u0447\u0430\u0435\u0442 \u0438 \u0436\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0430\u043d \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c\u2026 \u041f\u043e\u0433\u043e\u0434\u0438\u0442\u0435. \u0415\u0449\u0435 \u0436\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434.<br \/>  \u041a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0449\u0430\u043d\u043e \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f CoffeeScript \u0438 AngularJS. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0432\u044f\u0437\u043a\u0443 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043e\u043b\u0435\u0439 \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0441\u043f\u0438\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e\u0441\u044c \u043d\u0430 78,5% \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u043a \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430.<br \/>  \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0447\u0438\u0442\u0430\u043b\u043a\u0435 \u044d\u0442\u0438 \u0441\u0442\u0438\u043b\u044c\u043d\u044b\u0435, \u043c\u043e\u0434\u043d\u044b\u0435 \u0438 \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0410 \u0435\u0449\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438\u043c\u0435\u0435\u0442 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b CoffeeScript \u0438 LESS.<br \/>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0431\u044b\u0432\u0430\u043b\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435 \u0443\u0437\u043d\u0430\u044e\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432.<\/p>\n<p>  \u0427\u0430\u0441\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438 \u0430\u043d\u0433\u0443\u043b\u0430\u0440\u0430. \u0418 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0449\u0440\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0434\u0443\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0441\u043f\u043e\u0434\u0430 (\u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 localStorage)\u2026<br \/>  \u0410 \u043b\u0430\u0440\u0447\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b<\/b><\/p>\n<div class=\"spoiler_text\"><b>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c<\/b>  <\/p>\n<pre><code class=\"coffeescript\">define [&quot;angular&quot;,&quot;ngInfinite&quot;],(angular,infiniteScroll) -&gt;   newsModule = angular.module(&quot;News&quot;, ['infinite-scroll'])   newsModule.factory 'broadcastService', [&quot;$rootScope&quot;, ($rootScope) -&gt;     broadcastService =       message: {},       broadcast: (sub, msg)-&gt;         if typeof msg == &quot;number&quot; then msg = {}         this.message[sub] = angular.copy msg         $rootScope.$broadcast(sub)   ]   newsModule <\/code><\/pre>\n<p>  <b>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c<\/b>  <\/p>\n<pre><code class=\"coffeescript\">define [&quot;app\/NewsModule&quot;], (newsModule)-&gt;   newsModule.controller &quot;PanelCtrl&quot;, [&quot;$scope&quot;, &quot;$http&quot;, &quot;broadcastService&quot;, ($scope, $http, broadcastService)-&gt;      $scope.loadByTag = (tag) -&gt;       if tag.active         tag.active = false         broadcastService.broadcast(&quot;loadAll&quot;,0)       else         broadcastService.broadcast(&quot;loadByTag&quot;,tag.name)    ] <\/code><\/pre>\n<p>  <b>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c<\/b>  <\/p>\n<pre><code class=\"coffeescript\">define [&quot;app\/NewsModule&quot;,&quot;url&quot;], (newsModule,urlParser)-&gt;   newsModule.controller &quot;NewsCtrl&quot;, [&quot;$scope&quot;, &quot;$http&quot;, &quot;broadcastService&quot;, ($scope, $http, broadcastService)-&gt;      #recieving message       $scope.$on &quot;loadAll&quot;, ()-&gt;           $scope.after = 0           $scope.tag = false           $scope.busy = false           $scope.loadByTag()   ] <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><b>\u0412 Angular<\/b><br \/>  \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u0433\u043e\u043d\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u0443\u0434\u0430 \u0441\u044e\u0434\u0430, \u043d\u0435 \u043f\u043b\u043e\u0434\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432.  <\/p><\/blockquote>\n<p>  <\/p>\n<h5>\u0412\u0441\u0435, \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u0438<\/h5>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u0442\u043e\u043b\u044c \u0441\u0443\u043c\u0431\u0443\u0440\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f \u0432 \u043d\u0435\u0434\u0440\u044b \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0438\u0442\u043e\u0433\u0438. <br \/>  \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0430\u043c. \u041c\u044b \u0432\u0441\u0435 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0430 \u043d\u0435 \u043a\u0443\u043b\u044c\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u0433\u043e, \u043f\u0440\u0430\u0432\u0434\u0430?<\/p>\n<p>  <b>\u041c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c:<\/b>  <\/p>\n<ul>\n<li>\u041a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u044c Scala \u043f\u0435\u0440\u0435\u0434 Java. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043a\u0430\u043a-\u0442\u043e \u043c\u0430\u043b\u043e \u043a\u043e\u0434\u0430, \u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 compile time. \u0427\u0442\u043e \u0431\u044b \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u0440\u043e \u0442\u0435\u0441\u0442\u044b \u0438 \u0442.\u043f., \u0430 \u044f\u0437\u044b\u043a\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0442.<\/li>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043d\u0430\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043c\u0430\u043d\u0435\u0440\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/li>\n<\/ul>\n<p>  <b>\u041d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c:<\/b>  <\/p>\n<ul>\n<li>\u0412\u0441\u0435 \u0436\u0435 hit refresh workflow \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0443\u0433\u043e \u0438\u0437-\u0437\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u041d\u0435 \u0441\u043c\u0435\u0440\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0437\u0430\u0442\u043e\u0440\u043c\u0430\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0442 \u043c\u044b\u0441\u043b\u0438<\/li>\n<li>\u0412\u0438\u043d\u0434\u043e\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\\\\ vs \/) \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 JVM \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u043f\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0434 Win \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 dev \u0440\u0435\u0436\u0438\u043c\u0435. \u0410 \u0442\u0443\u0442 \u043e\u0441\u043e\u0431\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c. \u0411\u043b\u0430\u0433\u043e \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e nix \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/li>\n<li>\u041d\u0435\u0442 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445. \u042f\u043a\u043e\u0431\u044b \u0438\u0437-\u0437\u0430 \u0434\u0438\u043a\u0438\u0445 \u0443\u0442\u0435\u0447\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043b\u043e\u0433\u0433\u0435\u0440\u0435. \u041d\u0443 \u044d\u0442\u043e \u044f \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0438\u0440\u0430\u044e\u0441\u044c.<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u043e\u0438\u0442 \u0431\u044b\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Future. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439. \u0418 \u0445\u043e\u0440\u043e\u0448\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043c\u043d\u043e\u0433\u043e. \u0410 \u0432\u0434\u0440\u0443\u0433? \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Play \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0442\u0435\u0445 \u0436\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. ReactiveMongo \u0432\u043c\u0435\u0441\u0442\u043e Casbah, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u043e\u0440\u044b \u0438 \u0442\u0440\u0435\u0434 \u043f\u0443\u043b\u044b. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u2026<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<p>  P.S.<br \/>  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0439 \u043f\u0438\u0441\u0430\u043d\u0438\u043d\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u0430\u043b\u043e \u2014 \u0432\u043e\u0442 <a href=\"https:\/\/bitbucket.org\/ImLiar\/playrss\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 Bitbucket<\/a>. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/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\/197930\/\"> http:\/\/habrahabr.ru\/post\/197930\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" align=\"left\" src=\"http:\/\/habr.habrastorage.org\/post_images\/ff9\/55e\/3fa\/ff955e3fa48672518d5bb089bcf70c7c.png\"\/><\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0445\u0430\u0431\u0440\u0430\u0432\u0447\u0430\u043d\u0435.<\/p>\n<p>  \u041c\u044b, <s>\u043f\u043e\u0433\u0440\u043e\u043c<\/s>\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 X \u0438\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Y \u2014 \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430 Yet Another Hello World? \u0427\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u0447\u0442\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 X\/Y, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u044b \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u041c\u044b \u0441 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u043d\u0430\u043f\u0438\u0448\u0438 RSS \u0447\u0438\u0442\u0430\u043b\u043a\u0443. \u0422\u0443\u0442 \u0442\u0435\u0431\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0438 XML \u043f\u0430\u0440\u0441\u0435\u0440, \u0438 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043f\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440. \u0414\u0430 \u043c\u0430\u043b\u043e \u043b\u0438.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a <b>Play Framework 2.2 + Scala + MongoDB<\/b> \u043d\u0430 \u0431\u044d\u043a\u044d\u043d\u0434\u0435 \u0438 <b>AngularJS + CoffeeScript<\/b> \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TL;DR<\/b><\/p>\n<div class=\"spoiler_text\">\u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 ~250-300 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Scala \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0438 ~150 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 CS. \u041d\u0443 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e HTML. <br \/>  \u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/bitbucket.org\/ImLiar\/playrss\">Bitbucket<\/a><\/div>\n<\/div>\n<p>  <\/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-197930","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/197930","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=197930"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/197930\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=197930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=197930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=197930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}