?

Log in

Previous Entry | Next Entry

Перед тем, как превратить Сервер Роботов в полноценную облачную систему управления электронными устройствами (т.е. в контрольный узел персонального интернета вещей) добавлением к нему веб-интерфейса, отойдем немного в сторону познакомиться с интрументами, с помощью которых будем создавать наше управляющее роботами веб-приложение.

Лично я - стандартный программист на Яве, в своё время для веб-разработки приноровился к JSP+Tomcat, с тех пор для для небольших эпизодических задач мне их вполне хватало. Но т.к. Сервер Роботов не просто крутится где-то в облаке, но и публикуется с исходным кодом в виде уроков, я не хотел использовать для него совсем уж откровенное (хотя и вполне актуальное) старьё, поэтому решил попробовать что-нибудь современное ультра-модное, но чтобы не совсем маргинальное. В этом смысле я уже давно посматривал в сторону функционального программирования вообще и Скалы в частности, теперь появился повод попробовать ее на практике конкретно в области веб-разработки.

А вообще в области программирования для веба существует большое количество разнообразных платформ, языков и фреймворков; по быстрому и углубленному знакомству с ними написано и напечатано большое количество разнообразных статей, постов и книг. Поэтому на основах Скалы и веб-разработки подробно останавливаться не буду; основной интерес для меня в конечном итоге будут представлять подключенные к серверу роботы, а на чем написан вспомогательный веб-интерфейс - вопрос второстепенный, при желании Скалу можно всегда можно заменить на любимый Раби или ПоХаПэ.

Почему Скала

очевидно из трейлера:



Скалу часто представляют как улучшенную Яву и говорят о том, что на неё довольно просто будет перейти Ява-программистам. Действительно, программы, написанные на Скале, компилируются в классы, которые работают поверх обычной глобальной и надёжной Ява-машины. В программе на Скале можно использовать любые библиотеки, написанные для обычной Явы (пожалуй, это важнейшее преимущество). Скала также является объектно-ориентированным языком, хотя точнее она одновременно включает объектно-ориентированные и функциональные парадигмы программирования.

Однако, для того, чтобы легко понимать программы, написанные на Скале (не говоря о том, чтобы писать), знания одной Явы может быть недостаточно. Множество новаций в Скале касаются именно синтаксиса. По моим первым впечатлениям, она старается быть настолько лаконичной, насколько это возможно. Программист может опускать разнообразные ключевые слова (например, не указывать тип данных при инициализации переменных, или даже не писать ключевое слово "return") - что именно имелось ввиду в каждом случае, будет пытаться понять из контекста компилятор. Явный плюс такого подхода - программы действительно получаются очень лаконичными, их (как я постепенно начал ощущать) довольно приятно писать, т.к. в коде можно набирать только то, что действительно важно. Побочный эффект такой лаконичности - при чтении чужого кода (примера из интернета или кода библиотеки) работу компилятора приходится осуществлять читающему человеку.

Лично у меня сходу не получилось вникнуть в смысл некоторых примеров кода на Скале, которые я рассматривал на старте, ни с первого, ни со второго раза, как это часто прокатывало с другими языками. Поэтому если вы начнете ощущать накатывающееся раздражение при просмотре некоторых фрагментов кода на Скале, которые будут приведены далее, из-за того, что вы непрерывно смотрите на эти три строчки уже восемнадцать минут и все равно не понимаете, что там, блин, написано, настоятельно рекомендую предварительно прочитать какую-нибудь вводную книгу по основам языка. Хороший вариант - «Функциональное программирование. SCALA для нетерпеливых.», Кей Хорстман (Cay Horstmann).


«Функциональное программирование. SCALA для нетерпеливых» Кей Хорстман

Или просто перепишите всё на своём любимом языке программирования.



Инструменты для разработки веб-приложений на Скала

Также, как для других языков, для Скалы создали целую кучу разнообразных инструментов для разработки веб-приложений.

Несколько инструментов навскидку (вообще их конечно намного больше): веб-фреймворк Play (монстр типа Grails или Ruby on Rails), веб-фреймворк полегче Lift (Обзор фреймворка Lift на Scala), тулкит для REST/HTTP Spray, тулкит для обслуживания HTTP-запросов Unfiltered (Реализуем RESTful Web Service на Scala), работа с базами данных ORM-фреймворк SORM (SORM. Новый элегантный и масштабируемый ORM фреймворк для Scala).


Лично я остановился на простом тулките (наборе инструментов) для обслуживания HTTP-запросов Unfiltered. Хотя он в первую очередь предназначен для обслуживания HTTP-запросов в веб-приложениях, его вполне можно использовать для генерации и отдачи статических и динамических HTML-страниц, т.е. с его помощью можно создать и запустить полноценное веб-приложение.

Хорошее введение в философию Unfiltered (компактные модульные тулкиты против перегруженных фреймворков) и демонстрация его основных возможностей на слайдах:



Из моего личного опыта, обычно между написанием кода и развертыванием веб-приложения на сервере (быстрый запуск из среды разработки не в счет) существует некоторое количество промежуточных шагов, не слишком сложных и вполне механических, но часто утомляющих и не всегда очевидных (скопировать архив в определенное место в файловой системе, убедиться, что в конфигурационном файле прописаны нужные значения, проверить работу сервиса и т.п.). В случае с Unfiltered я впервые увидел, что разработка и запуск веб-приложения может выглядеть точно также, как разработка и запуск самого простого консольного приложения, только вместо System.in и System.out и окошка с чОрной консолью, для ввода-вывода здесь используется любой интернет-браузер со всей мощью HTML, JavaScript и CSS. Т.е. буквально, приложение стартует из милой сердцу main через "java -jar", далее ввод-вывод в любимом браузере на localhost:8080; только это и больше ничего. Дополнительные фичи и навороты (типа ORM или работы с шаблонами) подключаются к приложению по мере необходимости из сторонних библиотек, как это всегда происходило с любыми другими сторонними библиотеками.

Но, как уже было сказано выше, можно выбрать любую комбинацию инструментов по своему усмотрению или вообще не использовать Скалу, а любой другой язык программирования. Интернет давно переполнен как всевозможными сервисами, так и инструментами для их разработки; эталона, который бы устраивал всех или во всем превосходил конкурентов, не существует, поэтому я решил остановиться на комбинации Scala+Unfiltered только потому, что мне так захотелось.

Среда разработки

В Скале решили сделать инновационным не только сам язык, но и процесс разработки приложений. Я ожидал увидеть просто дополнительный плагин к Эклипсу или Нетбинзу, но вместо него в литературе и разных интернет-ресурсах подразумевается, что работа ведется в специальном консольном Интерпретаторе Скала, который может компилировать и запускать код строка за строкой прямо в процессе набора или типа того. Плагины для Эклипса (на Эклипсе основана среда Scala IDE) и НетбинзаIntelliJ IDEA) тоже есть.

Я люблю комбинацию среды Netbeans с проектами в формате Maven (теоретически их можно попробовать открыть и в Эклипсе с плагином Maven или вообще собирать без IDE через консольные инструменты Maven), поэтому попробовал сохранить ее и для Скалы.

Итого, нужно скачать Netbeans (вариант как минимум для Java SE). Плагин для поддержки проектов Maven должен входить в стандартный комплект (если нет, то его всегда можно установить из среды через меню Сервис/Подключаемые модули).

Дальше скачать с Гитхаба (спешите видеть, пока его опять не заблокировал Роскомнадзор) и открыть в Нетбинзе проект snippets/scala-web/ScalaUnfilteredBasicDemo.

Сразу после первого открытия на иконке проекта повиснет небольшой желтый треугольничек с восклицательным знаком, символизирующий проблему с зависимостями. Правой кнопкой мыши кликаем на проекте, выбираем меню "Решить проблемы с проектом..." и в открывшемся окне "Решить проблемы с проектом" на строчке "Некоторые артефакты зависимости расположены не в локальном репозитории" нажимаем кнопку "Разрешить...".

scala-netbeans-01.png

Ссылки на все необходимые инструменты и зависимости для сборки проекта компилятором Скала с библиотеками Unfiltered при помощи средств Maven уже прописаны в файле проекта ScalaUnfilteredBasicDemo/pom.xml, в том числе там указаны адреса необходимых репозиториев (https://oss.sonatype.org/content/repositories/releases/ - и для Скалы и для Unfiltered), этот диалог выкачивает их оттуда (нужен интернет и место на диске).

scala-netbeans-02.png

Поэтому после автоматической загрузки и установки всех необходимых библиотек, проект уже можно компилировать: опять правой кнопкой мыши на проекте, меню "Собрать" или "Очистить и собрать"

scala-netbeans-05.png

Если в коде не будет найдено ошибок, в окне вывода можно будет увидеть зеленое сообщение BUILD SUCCESS. Это значит, что классы и исполняемые файлы уже готовы, их можно найти в каталоге проекта scala-web/ScalaUnfilteredBasicDemo/target.

В частности, там лежит исполняемый jar-файл scala-unfiltered-basic-demo-1.0-SNAPSHOT и рядом в каталоге lib находятся все необходимые для его запуска jar-библиотеки (их туда заботливо положил Maven, следуя инструкциям, прописанным во все том же pom.xml: плагины maven-jar-plugin и maven-dependency-plugin).

В целом, на этом этапе уже худо-бедно можно работать - редактировать код на Скале, компилировать его в jar-файлы и запускать их на сервере в облаке - это всё осуществляет Maven, а всё, что ему нужно - это правильный pom.xml. Но для более комфортной работы с исходниками на Скале (подсветка синтаксиса, автодополнение, запуск приложения из среды и т.п.) лучше поставить дополнительных плагинов. Для этого идем в меню "Сервис/Подключаемые модули", на вкладке "Доступные подключаемые модули" делаем поиск по ключевому слову "scala" и устанавливаем всё, что найдется.

scala-netbeans-06.png

После этого редактор кода начнет подсвечивать синтаксис в файлах *.scala.

scala-netbeans-07.png

Автодополнение тоже работает:

scala-netbeans-17.png

Запуск исполняемого главного класса (содержит функцию "def main(args: Array[String])") из среды разработки при помощи предназначенной для этого большой зелёной стрелочки на панели инструментов не работает, среда почему-то не может найти в проекте главный класс:

scala-netbeans-08.png

Может быть эту проблему исправят в будущих версиях плагинов Scala для Netbeans, пока что пришлось с этим смириться. Тем более, что есть рабочий обходной вариант: кликнуть правой кнопкой мыши на файле scala, в котором определена функция main, и выбрать меню "Отладка файла".

scala-netbeans-19.png

Проект запустится в режиме отладки, меня это вполне устраивает.



Вторая часть: пишем веб-приложение на Scala+Unfiltered.



исходники занятия, подсветка синтаксиса.

Tags:

Profile

programmist
Программист программистович

Latest Month

November 2016
S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930   
Powered by LiveJournal.com
Designed by Tiffany Chow