Scala + Processing – интересный способ выучить новый язык

    Недавно мне довелось на собственном опыте убедиться: чтобы научиться применять какие-то новые технологии, недостаточно прочитать пару книг по теме, потому что без практики теория мгновенно улетучивается из головы.

    Но что можно сделать такого интересного на Scala? На самом деле, выбор не слишком большой. Я как-то придумал небольшую тулзу, неспешно написал ее, и «забил». А через несколько месяцев, к своему стыду, гуглил синтаксис «for loop»…

    Я решил, что дальше так дело не пойдет, и нужно найти какие-то небольшие проектики на основные возможности языка. Тут мне и пригодился Processing. Скучные учебные проекты он любому новичку (вроде меня) поможет превратить в визуальные инсталляции. А дальше можно выбрать, что покопать углубленно — например, генерацию фракталов, рендеринг частиц или визуализацию данных.

    Я переписал на Scala и выложил на GitHub парочку примеров. На скрине как раз один из них — MSA Fluids. Заинтересовавшихся прошу под кат.



    Когда-то я познакомился со Scala, и этот язык мне моментально понравился. Я пролистал несколько книг, в том числе и Programming in Scala, которую рекомендую решительно всем. Даже только теория позволила мне по-другому взглянуть на мир программирования. К большому сожалению, моя основная работа со Scala никак не связана, да и вообще язык, которым я лучше всего владею, в некоторых местах довольно сильно от нее отличается. И язык этот не Processing.

    Processing


    Итак, тут как раз отличное время представить Processing, так как мало кто о нем слышал, а уж руками трогали вообще единицы. Processing – это DSL для Java со своим микро IDE и разными библиотеками. Используется так называемыми Visual Artists для генерации всякого красивого трэшака.

    Рекомендую покликать на Vimeo по видео с тэгом processing и посмотреть что народ придумывает. Вот парочка красивых:







    Дабы не повторяться, на Хабре уже публиковались несколько интересных статей о Processing:

    А я лишь кратко резюмирую все в них написанное своими словами. Помните, в детстве учили программированию на Бейсике или Logo, там черепашка линии рисовала? Ясен пень, каждый тут может наворотить еще и не такую красоту на своем любимом языке. Да еще в тридцать слоев абстракции обернет по дороге. А простым людям сложно понять что за ООП, классы, библиотеки такие, да и не нужно это им.

    Вот и решили сделать такой простой язык на базе Java, чтобы помочь обычным Visual Artists воплощать свои идеи в императивном стиле. Мол, нарисуй тут линию, а тут квадратик. И пошло-поехало. Сейчас Processing уже сильно разросся и его сложно игнорировать. Для него написано множество отличных библиотек, а так как по сути это Java, можно использовать и вагон Java библиотек.

    А Scala тоже выполняется на JVM… ну вы поняли, да?

    На самом деле есть целый проект на основе Processing IDE, который позволяет писать на Scala – Spde. И про него уже писали на scala-lang.org. Но IDE этот мне кажется маленьким и несерьезным. Попытайся написать что-то большое и начнутся головняки. Так что давайте остановимся на чем-то более удобном.

    Установка и настройка


    Скорее всего, какой-то IDE для разработки на Scala у Вас уже стоит, так что не буду заострять на этом внимание. Я использую intelliJ IDEA со Scala плагином.

    Сперва нужно скачать и установить Processing.


    Далее в Scala проект подключить основную Processing библиотеку.

    На Windows путь примерно аналогичный.

    Код


    Теперь создаем новый main класс. Я его назвал просто Test.

    import processing.core._
    
    object Test extends PApplet {
    
      private var test:Test = _
    
      def main(args: Array[String]) = {
        test = new Test
        val frame = new javax.swing.JFrame("Test")
        frame.getContentPane().add(test)
        test.init
    
        frame.pack
        frame.setVisible(true)
      }
    
    }
    
    class Test extends PApplet {
    
      override def setup() = {
      }
    
      override def draw() = {
      }
    }


    В Processing большинство функционала зашито в класс PApplet. Его, кстати, запускать можно и AppletViewer'ом, если выставить профиль в Run Configurations. Тогда метод main не нужен.

    Данный код пока мало что делает, но по нему уже видно обычную структуру программ на Processing (которые называются скетчи). Дальше я немного расширю этот код. Он будет чернобелые рандомные цветочки рисовать за курсором. Вот примерно так:

    import processing.core._
    import math._
    import scala.util.Random
    
    object Test extends PApplet {
    
      private var test:Test = _
    
      def main(args: Array[String]) = {
        test = new Test
        val frame = new javax.swing.JFrame("Test")
        frame.getContentPane().add(test)
        test.init
    
        frame.pack
        frame.setVisible(true)
      }
    
    }
    
    class Test extends PApplet {
    
      var angle:Int = 0;
    
      override def setup() = {
        size(640, 360)
        background(102)
        smooth()
        noStroke()
        fill(0, 102)
      }
    
      override def draw() = {
        angle += 10
        var value = cos(toRadians(angle)) * 6.0
        for (a <- 0 to 360 by 75) {
          val xoff = cos(toRadians(a)) * value
          val yoff = sin(toRadians(a)) * value
          fill(Random.nextInt(255))
          ellipse( (mouseX + xoff).toFloat, (mouseY + yoff).toFloat, value.toFloat, value.toFloat );
        }
        fill(255);
        ellipse(mouseX, mouseY, 2, 2)
      }
    }


    Что дальше?


    Я в качестве эксперимента перевел на Scala парочку интересных примеров (в том числе и знаменитые Fluids от MSA Visuals) и выложил их на GitHub: scala-processing-examples. Сейчас там всего два примера, но они довольно интересные.

    Также, Вам наверняка понадобится справка по доступным методам. Ее (и еще множество полезных материалов) всегда можно найти на сайте processing.org.

    Лично мой план — взять книжку, сесть и на каждую тему придумывать небольшой скетч, чтобы эту тему визуализировать и запомнить.

    Еще несколько замечаний.


    Для того, чтобы запустить примеры с GitHub, нужно импортнуть opengl библиотеки.

    И (важно!) разархивировать куда-нибудь содержимое .jar архивов с нативными реализациями этих библиотек

    А потом в Run Configuration прописать до них путь

    Иначе, приложение будет сыпаться с ошибкой, мол, библиотека jogl не найдена.

    Я так и не понял как в IDEA подключить нативные библиотеки более правильно. Возможно, никак.

    И напоследок


    Согласитесь, красивые картинки для изучения интересного языка гораздо лучше, чем унылые текстовые утилиты. Удачных экспериментов!
    Поделиться публикацией

    Комментарии 16

      +2
      Почти любой язык заставляет по-друшому взглянуть на мир прогрммирования. Но ИМХО особенно отличились здесь Common Lisp, Scala, Prolog и Tcl.
      • НЛО прилетело и опубликовало эту надпись здесь
          +3
          ну а я про что (8
          0
          Smalltalk ещё забыли.
            0
            дааа, лисп с прологом выворачивают мозги наизнанку.
            элегантное оружие более цивилизованной эпохи
            +2
            А пост красивый.
              +2
              Что-то удивительное, как раз ищу новый объект для саморазвития.
                0
                а на русском мануалы есть?
                  0
                  вроде тут недавно проскакивала тема про переведенную книжку по процессингу
                  0
                  Сам недавно шерстил гугл по этой теме. Эх, время бы найти на всю эту красоту…
                    0
                    Честно говоря поглядел на синтаксис и не понял, что такое эта скала. Ну вообще все один в один, только for по другому пишется, а так это можно переписать на groovy или java вообще будет одно и то же.
                      0
                      Дело далеко не только в синтаксисе. А переписать можно что угодно на чём угодно, вопрос в соотношении количества кода.
                        +1
                        Рекомендую почитать книжку или www.scala-lang.org. Примеры выше от новичка, не забывайте. Сила, как говорится, within.
                        0
                        Большое спасибо за наводку! :) Прикрутил к ruby, буду учить маленьких программистов :3
                          0
                          JRuby?
                            0
                            Конечно :)

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое