• Liftweb ещё жив?

    @a1go1ov
    Scala fan, Java developer
    На счет смысла изучения - если после того как вы разобрались с проектом на lift у вас сохранился интерес к этому framework'у и вы видите, что он позволит успешно решать ваши задачи, то на мой взгляд конечно стоит продолжать с ним работать и изучать его. Мода, понятие относительное, но mailing list вроде активный и на github активность присутствует, учитывая, что lift это один из старейших framework'ов для Scala.
    На счет популярности, самые популярные web framework'и/библиотеки для создания web-приложений, как мне кажется, это Play Framework, /akka-http (spray) и Finatra/Finch. При том, что Play и Finatra это полноценные web-framework'и, а akka-http и finch более минималистичны, поэтому скорее это библиотеки.
    Так вот, немалая доля их популярности, на мой взгляд, проистекает из-за того, какие компании стоят за этими инструментами - Lightbend (бывшая Typesafe), основанная Martin Odersky (создателем Scala) и Jonas Bonér (создателем akka), которая развивает и продвигает Play и Akka, а так же Twitter, где родился Finagle/Finatra. Учитывая, что для Lightbend основной заработок это консультации в том числе по Play и Akka, то понятно, что они заинтересованы в наибольшей популярности этих продуктов и имеют возможности для их продвижения (к слову сказать, я считаю, что популярность вполне заслуженная).
    Интересно, что когда создавалась Typesafe, David Pollak (создатель Lift) отказался от предложения включить lift в качестве web-framwork'а для стека продуктов, который собиралась продвигать Typesafe (на тот момент этот стек в итоге составили Play, Akka, SBT), возможно, что это решение аукнулусь тем, что сейчас lift не особо в тренде.... При прочих равных, я бы выбирал что-либо из трех озвученных выше, ну а вообще изучать нужно то, чем вам будет удобно и приятно пользоваться, но тут уже нужно знать ваши цели, задачи и предпочтения. Посмотрите и на другие варианты, почитайте обзоры и может быть для вас станет более очевидно что использовать и изучать. Для примера посмотрите на framework'и что представлены на scaladex'е:
    https://index.scala-lang.org/search?q=keywords:web...

    P.S. На счет Typesafe, Lift, Play и David Pollak можно почитать в этом вопрсое на Quora (с участим и David Pollak и Jonas Bonner): Why did Typesafe select Play for their stack inste...
    Ответ написан
    Комментировать
  • ORDER с GROUP BY в прикрепленной таблице?

    @a1go1ov
    Scala fan, Java developer
    Я не специалист в MySQL, но вообще по стандарту SQL в блоке select можно указывать только те поля, которые либо указаны в блоке group by (то есть по которым осуществляется группировка), либо передаются в групповую функцию, такую как sum, max и т.д.
    Судя по документации, MySQL позволяет не придерживаться данного правила, но тогда для полей не удовлетворяющих озвученным выше условиям выбирается произвольная строка из группы.
    Для того, чтобы отключить в MySql расширенное трактование GROUP BY, нужно включить режим ONLY_FULL_GROUP_BY

    Относительно вашего запроса, повторная выборка столбца p.post_date, после того как вы указали, что хотите получить записи с последней датой - max(p.post_date), явно не имеет смысла и ломает группировку. Уберите ее, ну и в целом лучше придерживаться стандарта, так ваши запросы будет легче портировать если вы будете мигрировать на другую СУБД, да и недопонимания будет меньше.
    Ответ написан
    Комментировать
  • Выбор средств разработки для серверной части?

    @a1go1ov
    Scala fan, Java developer
    Вообще, конечно, тот факт, что вам интереснее и легче делать проект именно на джава, в данном случае должен быть решающим. Но можно найти и другие причины.
    Для начала тот факт, что в ваших планах разрабатывать клиента под андроид для чего вы наверняка будете использовать java, то есть из очевидных плюсов вам не придется разбираться в двух разных языках для создания обеих частей проекта. Так же это позволяет переиспользовать некоторый код в обеих частях. Дополнительно вы будете использовать одни и те же инструменты для обоих проектов - Android Studio - официальная IDE для создания приложений под android, она основана на IntelliJ IDEA - одной из лучших IDE для java.

    Ну и более стандартные причины для выбора jvm и java:
    - Много качественного и бесплатного инструментария
    - Много качественных библиотек и фреймворков - как старых, проверенных временем, так и новых , реализующих модные веяния
    - Очень много примеров, книг, мануалов, видео докладов и так далее
    - Кроссплатформенность
    - Статическая типизация - меньше шансов выстрелить в ногу
    - Надежная платформа с точки зрения роста проекта
    - и так далее
    Я думаю этого будет достаточно для обяъснения выбора языка для дипломного проекта. Но в реальном проекте, выбор будет зависить еще от многих факторов, от видиния развития проекта, от архитектурно решения, от того на сколько команда готова продуктивно работать с выбранным языком или то на сколько легко будет найти разработчика для данного языка и еще много специфичных нюансов. Ну и не стоит забывать о популярных ныне микросервисах, где различные сервисы могут быть написаны на разных языках.

    В заключении небольшая рекомендация. В качестве инструментов для реализации серверной части присмотритесь к Spark Framework (это микро веб-фреймворк, не путать с Apache Spark) - для создания REST интерфейса и JOOQ для общения с базой.
    Ответ написан
    Комментировать
  • Как сравнить текущее значение COUNT(*) с предыдущим?

    @a1go1ov
    Scala fan, Java developer
    В oracle вашу задачу можно решить при помощи оператора model:

    -- данные для выборки
    with data as (
      select 1 as id, 2009 as year, 3 as month, 50  as count from dual union all
      select 2 as id, 2009 as year, 4 as month, 100 as count from dual union all
      select 3 as id, 2009 as year, 5 as month, 133 as count from dual union all
      select 4 as id, 2009 as year, 7 as month, 2   as count from dual union all
      select 5 as id, 2010 as year, 2 as month, 98  as count from dual union all
      select 6 as id, 2010 as year, 4 as month, 600 as count from dual
    )
    
    -- сам запрос
    select year, month, count, round(result, 2) as increment_rate
    from data
    model
      -- генерируем порядковый номер для строк, 
      -- по которому будем осуществлять доступ к данным
      dimension by (row_number() over (order by year, month) rn)
      -- указываем столбцы, которые будут отображаться/участвовать в расчетах
      -- также добавляем несуществующий столбец result, 
       -- что бы в дальнейшем помещать в него результат вычислений
      measures (count, year, month, 0 result)
      rules (
        -- делаем соответствующие вычисления
        result[any] = greatest(decode(nvl(count[cv(rn)-1],0), 0, 0, count[cv(rn)] / count[cv(rn)-1])*100 - 100, 0)
      )


    Результат:
    +------+-------+-------+---------------+
    | YEAR | MONTH | COUNT | INCREMENT_RATE|
    +------+-------+-------+---------------+
    | 2009 | 3     | 50    |  0            |
    +------+-------+-------+---------------+
    | 2009 | 4     | 100   | 100           |
    +------+-------+-------+---------------+
    | 2009 | 5     | 133   | 33            |
    +------+-------+-------+---------------+
    | 2009 | 7     | 2     | 0             |
    +------+-------+-------+---------------+
    | 2010 | 2     | 98    |  4800         |
    +------+-------+-------+---------------+
    | 2010 | 4     | 600   | 512,24        |
    +------+-------+-------+---------------+

    Пояснения к формуле:
    result[any] = greatest(decode(nvl(count[cv(rn)-1],0), 0, 0, count[cv(rn)] / count[cv(rn)-1])*100 - 100, 0)

    Слева от знака равно мы указываем, что для каждой ячейки (ключевое слово any ) в столбце result в качестве значения мы рассчитываем выражение справа от знака равно.
    Для того, что бы рассчитать величину прироста, необходимо взять значение за текущий временной период, разделить его на значение за предыдущий временной период, затем умножить на 100% и вычесть 100%.
    Но так как у нас для первого периода в таблице (для первой строки), нет предыдущего периода, а также значением в предыдущем периоде может быть 0, то возникает ошибка деления на 0. Поэтому нужно эту ситуацию обработать, для чего в формуле используется decode, который проверяет, если значение предыдущего периода не существует или равно 0, тогда необходимо возвратить 0, если же значение предыдущего периода не равно 0, то рассчитываем отношение. Также используется функция greatest, для того, чтобы вместо отрицательных значений отображать 0 (когда результат предыдущего периода больше текущего, соответственно прироста нет).
    Если вместо прироста необходимо рассчитать процент роста, то вычитание 100% нужно убрать.
    Ответ написан
    Комментировать
  • Как вывести селект и сумму строк в Оракл?

    @a1go1ov
    Scala fan, Java developer
    Это можно сделать при помощи union (как написал @zhainar) или rollup:

    select name, sum(cost)
    from table
    group by rollup(name)


    P.S.
    Вы бы сначала определились, что вам конкретно нужно. А то задаете несколько похожих вопросов. Вам отвечают, а вы испаряетесь и задаете новый похожий вопрос (могли бы пометить ответ как правильный в этом вопросе, даже если вы поняли, что задали неверный вопрос).
    Ответ написан
    2 комментария
  • Как вычислить сумму и разницу значений строк в Oracle?

    @a1go1ov
    Scala fan, Java developer
    with data as (
    select 1 as id, 500 as cost from dual union all
    select 2 as id, 100 as cost from dual union all
    select 3 as id, 300 as cost from dual union all
    select 4 as id, 200 as cost from dual union all
    select 5 as id, 100 as cost from dual union all
    select 6 as id, -800 as cost from dual
    )
    
    select batch, sum(cost) as total
    form (
        select ceil(rownum/3) batch,
                ( case when rownum < max(rownum) over (partition by ceil(rownum/3)) then cost else -cost end ) as cost
        from data
        order by id
    )
    group by batch
    Ответ написан
    Комментировать
  • Изучение программирования путем Скалы?

    @a1go1ov
    Scala fan, Java developer
    Если в программировании вы 0 и хотите начать правильно вникать в программирование, то начните с классики - Structure and Interpretation of Computer Programs (SICP), эта книга закладывает хорошие основы, а так же познакомит вас с функциональным программированием:
    книга:
    web.mit.edu/alexmv/6.037/sicp.pdf
    вспомогательный сайт для самостоятельного изучения книги:
    https://mitpress.mit.edu/sicp
    sicp.sergeykhenkin.com/sicp-exercise-solutions
    перевод книги (не в курсе на счет качества)
    newstar.rinet.ru/~goga/sicp/sicp.pdf
    видео лекций по книге:
    ocw.mit.edu/courses/electrical-engineering-and-com...

    Конкретно по Scala:

    С точки зрения Scala, на мой взгляд самый оптимальный вариант это пройти курсы по Scala на coursera.org. Но ниже будут примеры и ссылки и других источников для иучения программирования на Scala..

    Интерактивные курсы

    cousera.org:
    Специализация по Scala - один из фундаментальных источников знаний о программировании на Scala. В составе - видео лекции, доп. материалы, вопросы на закрепление, задания на программирование, форум для вопросов и обсуждения (все опционально). В принципе можно вместо SICP сразу начинать со специализации на coursera.org, в частности первый курс в специализации как раз таки проектировался Мартином в стиле SICP (по крайней мере до создания специализации программа курса и задания были в духе SICP).

    https://www.coursera.org/specializations/scala

    Ссылки на курсы из специализации по отдельности (для бесплатной регистрации):
    1. Functional Programming in Scala
    2. Functional Program Design in Scala
    3. Parallel programming
    4. Big Data Analysis with Scala and Spark

    Курс стоящий немного в стороне, о reactive programming на scala:
    Принципы реактивного программирования

    ---
    Интерактивные упажнения по Scala от 47 Degrees (на данный момент 6 курсов std lib, cats, shapeless, doobie, scalacheck, FP in Scala)
    https://www.scala-exercises.org

    www.scalakoans.org - небольшие уроки для изучения
    ---
    Big data university (с уклоном в Data Science и Big Data):

    Introduction to Scala
    Scala for Data Science
    Spark Overview for Scala Analytics
    ------------------------------------------

    Если вас больше интересует не интерактивный стиль обучения, а вдумчивое чтение, то можно посоветовать следующие книги:

    Книги:

    На русском,к сожалению, есть только одна книга:
    Scala для нетерпеливых
    но для новичка в программировании она скорее всего не подойдет.

    также в 2016 вышла обновленная версия книги от Martin Odersky, Lex Spoon и Bill Venners, которая покрывает все вопросы связанные со Scala (859 стр), в том числе все нововведения на текущий момент (вплоть до Scala 2.12). Эту книгу можно также читать если вы новичок в программировании. Это наверно самый фундаментальный источник для изучения Scala:
    Programming in Scala, Third Edition

    После ознакомления с основами Scala для углубления именно функциональных аспектов программирования на Scala можно прочитать замечательную книгу от Paul Chiusano и Rúnar Bjarnason:
    Functional Programming in Scala

    Для изучения практических основ проектирования современных приложений с использованием возможностей Scala и ее экосистемы, с применением функциональной парадигмы, рекомендую отличную книгу от Debasish Ghosh
    Functional and Reactive Domain Modeling

    Вообще по Scala и различным инструментам из экосистемы Scala сейчас много разных книг, так что при желании можно найти подходящую по уровню и интересам, стоит также обратить внимание на подборку книг на сайте lightbend (бывшая TypeSafe)

    Также можно почитать перевод уроков Scala от Twitter:
    Scala Школа!
    ------------------------------------------

    Алгоритмы
    На счет алгоритмов, про которые вы упоминали, можете посмотреть прекрасный набор классических алгоритомов и структур данных, реализованных на Scala в чисто функциональном стиле:
    scalacaster от @vkostyukov(Twitter, Finagle)
    или
    scalgos от @pathikrit
    ------------------------------------------

    Остальное
    Ninety-Nine Scala Problems - набор небольших упражнений (с ответами) для изучения Scala

    Hands-on Scala.js - туториал по Scala.js от @lihaoyi

    Type-Level Programming in Scala - серия постов из десяти частей на тему продвинутого использования возможностей системы типов Scala от Rúnar Bjarnason (соавтор Functional Programming in Scala) и Mark Harrah (разработчик sbt)

    Scala Best Practices - колеекция хорощих практик программирования на Scala от Alexandru Nedelcu

    P.S. Также если хочется держать руку на пульсе о том, что происходит в экосистеме и community Scala, то можно посмотреть эту подборку блогов и новостных и видео ресурсов о Scala
    Ответ написан
    Комментировать
  • Насколько подходит Scala как язык для web?

    @a1go1ov
    Scala fan, Java developer
    Если у вас есть солидный опыт java и знание Scala, хоть и без рельного опыта работы - вы будете интересны многим работодателям. Не скажу конкретно за web, тем более фриланс, но вакансии где приемлем небольшой опыт на Scala, при наличии хорошего опыта разработки с использованием java - попадаются довольно часто (среди всех вакансий связанных со Scala)
    Ответ написан
  • На чем писать странички с SQL запросами?

    @a1go1ov
    Scala fan, Java developer
    Поддержу Даша Циклаури.
    Если у вас развернута БД Oracle и есть строгое требование создавать приложения именно на основе этой БД (к примеру в вашей компании ERP-система на базе Oracle), а так же нет опыта в создании веб-приложений, то ничего лучше Oracle Application Express (Apex) вам не найти.
    Это бесплатный фреймверк от самой Oracle для быстрого создания полноценных web-приложений. Сам Apex очень тесно интегрируется с базой и добавляет очень незначительный оверхед к выполнению запроса. По сути, вы все время имеете дело с SQL и PL/SQL и практически не отвлекаетесь на сам "web". Apex предоставляет набор современных тем (обеспечивающих единый дизайн для всего приложения), в том числе адаптированных для мобильных устройств, так что если вам просто нужно выводить определенные отчеты на основе данных в базе, вы за час можете сделать полноценное web-приложение, с аутентификацией/авторизацией (в том числе SSO), современным интерфейсом и богатыми возможностями по выборке/фильтрации данных. Если же в вашем приложении помимо отчетов должна выполняться какая-либо бизнес-логика, то вы просто описываете ее на PL/SQL в соответствующем пакете/пакетах и потом в Apex просто пишите вызов функций из этих пакетов (SQL и PL/SQL - можно писать и в самом Apex, но это плохо с точки зрения дальнейшей поддержки). Если на определенном моменте вам будет не хватать функциональности из коробки, то вы легко можете расширять ее до бесконечности, самостоятельно или же при помощи сторонних дополнений.
    В общем Apex отличный выбор если ваши безнес-процессы завязаны на инфраструктуре Oracle и вам нужно быстро создавать качественные приложения на основе имеющихся данных для использования внутри компании/предприятия.
    Если же ваша цель изучить основы web-разработки на примере текущих задач, то не стоит привязываться к конкретной БД. Сейчас web-приложения должны уметь взаимодействовать с различными системами хранения, за частую с разными видами одновременно. Поэтому обычно персистентный слой прячут за сервисным, который предоставляет единое АПИ для получения данных из различных источников. В данном контексте наиболее разумно на стороне backend'а создавать сервис который будет принимать http-запросы от клиентских приложений и в зависимости от запроса выгружать соответствующие данные из хранилища/хранилищ данных и возвращать в виде http-ответа, например в формате JSON или по WebSocket'ам или SSE (Server-Sent Events). Клиенты же могут быть как JS-приложениями, так и мобильными приложениями или другими сервисами.

    P.S. посмотреть, что из себя представляет Apex и потренироваться в создании приложений вы можете совершенно бесплатно, зарегистрировавшись на https://apex.oracle.com
    Вот здесь можно подобрать книгу для изучения Apex:
    www.oracle.com/technetwork/developer-tools/apex/ap...
    Ответ написан
    Комментировать
  • Какие есть добротные блоги о Scala?

    @a1go1ov
    Scala fan, Java developer
    Еженедельные выпуски новостей связанных со Scala (статьи, обновления ПО, конференции и т.д.):
    www.cakesolutions.net/teamblogs/topic/this-week-in...
    scalatimes.com

    Новости об обновлении библиотек, плагинов и других инструментов из экосистемы Scala:
    notes.implicit.ly

    Блоги:
    russian:
    https://habrahabr.ru/hub/scala/posts/
    ru-scala.livejournal.com
    xeno-by.livejournal.com

    не russian:
    www.scala-lang.org/blog - scala official blog
    letitcrash.com - Akka team
    www.lightbend.com/blog - company behind Scala, Akka, Play

    www.cakesolutions.net/teamblogs
    blog.scalac.io
    www.lihaoyi.com
    debasishg.blogspot.ru
    underscore.io/blog
    typelevel.org/blog
    blog.higher-order.com
    danielwestheide.com
    https://github.com/viktorklang/blog
    https://alexn.org
    krasserm.github.io
    hseeberger.github.io
    pchiusano.github.io
    https://partialflow.wordpress.com
    https://meta.plasm.us
    mariussoutier.com/blog
    https://bionicspirit.com

    Видео конференций и другие видео по Scala:

    ScalaDays:
    https://www.youtube.com/channel/UCOHg8YCiyMVRRxb3m...

    functional.tv

    на Skills Matter:
    конференции

    "SillsCasts"

    На parleys.com:
    Если выбрать channels в фильтре то можно посмотреть каналы конференций
    https://www.parleys.com/search/scala

    https://www.youtube.com/playlist?list=PLndbWGuLoHe...

    Сайты конференций:

    https://scala.world
    https://scaladays.org
    www.nescala.org
    scala.bythebay.io
    typelevel.org/events

    PS: также можно посмотреть эту подборку ресурсов по изучению Scala
    Ответ написан
    Комментировать
  • Scala. Как правильно конкатенировать строки?

    @a1go1ov
    Scala fan, Java developer
    На самом деле действительно не хватает контекста. Возможно в задании были какие-то подробности, указывающие на правильный, с точки зрения задания, способ. Так как строки в Scala это строки из java, то к ним применяются все те же правила.
    Если вы используете `+` то, например вот такое выражение не вызовет ошибки:

    scala> "one" + null + 42
    res0: String = onenull42


    то есть при конкатенации строки с значениями других типов, эти значения за сценой переводятся к строке (вызывается метод toString())

    С другой стороны concat, принимает только строки:

    scala> "" concat null
    java.lang.NullPointerException
      at java.lang.String.concat(String.java:2027)
      ... 33 elided
    
    scala> "" concat 42
    <console>:11: error: type mismatch;
     found   : Int(42)
     required: String
           "" concat 42
                     ^


    С точки зрения производительности, строки в java (и как следствие в Scala) - imutable и оператор + при конкатенации каждый раз создает новую строку, что при конкатенации большого количества строк конечно же не очень эффективно и метод concat будет работать быстрее в такой ситуации. С другой стороны компилятор способен оптимизировать простые случаи использования оператора + и конвертировать их с использованием StringBuilder (который mutable) и он в свою очередь более производительный чем concat.

    В общем и целом, если в задании был намек на необходимость конкатенации большого количества строк и чувствительность к производительности, то необходимо было использовать StringBuilder. Если же необходимо было показать более scala way, то возможно лучшим вариантом было бы использовать интерполяцию:
    scala> val (one, two, three) = (1, "two", null)
    one: Int = 1
    two: String = two
    three: Null = null
    
    scala> s"$one $two $three"
    res11: String = 1 two null
    Ответ написан
    Комментировать