• Функциональный подход к транзакциям на Scala или пишем свою полезную монаду

    • Tutorial

    Если вы работаете с одной базой данных которая поддерживает транзакции вы даже не задумываетесь о консистентности — база все делает за вас. Если же у вас несколько баз, распределенная система или даже к примеру MongoDB до 4 версии — все не так радужно.


    Рассмотрим пример — мы хотим сохранить файл в хранилище и добавить ссылку на него в два документа. Конечно же мы хотим атомарности — либо файл сохранен и добавлен в документы либо ни то ни другое (тут и далее используется cats-effects IO):


    saveDataToFile(data) // (1)
      .flatMap { file =>
        addFileRef(documentId, file) // (2)
          .flatMap { result =>
            addFileRef(fileRegistry, file) // (3)
              .flatMap { result =>
                ??? // (4, 5, ...)
              }
              .handleErrorWith { error =>
                // revert (2)
                removeFileRef(documentId, file).attempt >> IO.raiseError(error)
              }
          }
          .handleErrorWith { error =>
            // revert (1)
            removeFile(file).attempt >> IO.raiseError(error)
          }
      }

    Уже непросто? Легко представить как количество операций растет и образуется Pyramid of doom.


    Но мы же программисты! Давайте обобщим проблему и напишем код, который позволит избежать ненужной сложности и возможных ошибок.

    Читать дальше →
  • Как обрабатывать ошибки на JVM быстрее

      Существуют различные способы обработки ошибок в языках программирования:


      • стандартные для многих языков исключения (Java, Scala и прочий JVM, python и многие другие)
      • коды статуса или флаги (Go, bash)
      • различные алгебраические структуры данных, значениями которых могут быть как успешные результаты так и описания ошибок (Scala, haskell и другие функциональные языки)

      Исключения используются очень широко, с другой стороны о них часто говорят, что они медленные. Но и противники функционального подхода часто апеллируют к производительности.


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


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


      UPDATE: к сравнению добавлены исключения без стек-трейсов

      Читать дальше →
    • Функции высших порядков и монады для PHP`шников

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


        Поэтому мы рассмотрим реализацию парсера JSON в виде простейших функций и функций их комбинирующих в более сложные, постепенно дойдя до полноценного парсера JSON формата. Вот пример кода, который мы получим:


        $jNumber = _do(function() {
            $number  = yield literal('-')->orElse( literal('+') )->orElse( just('') );
            $number .= yield takeOf('[0-9]')->onlyIf( notEmpty() );
            if ( yield literal('.')->orElse( just(false) ) ) {
                $number .= '.'. yield takeOf('[0-9]');
            }
            return +$number;
        });

        Кроме собственно функционального подхода можно обратить внимание на использование классов для создания DSL-подобного синтаксиса и на использование генераторов для упрощения синтаксиса комбинаторов.


        UPDATE само-собой парсинг JSON уже давно решенная задача и конечно готовая и протестированная функция на C будет работать лучше. Статья использует эту задачу как пример для объяснения функционального подхода. Так же не пропагандируется использование именно такого кода в продакшене, каждый может почерпнуть себе какие-то идеи, которые могут упростить код и жизнь.


        Полный код находится на github.

        Читать дальше →
      • Еще одна история про домашний сервер, или операция «silence»

          Добрый день, хабраюзеры!

          imageНаверняка каждый разработчик, рано или поздно, сталкивается с проблемой тестового окружения. Не очень удобно держать ПК включенным 24х7, да еще и заваливать его софтом для экспериментов под завязку. С другой стороны найти хостинг по собственному вкусу, да еще и не дорогой — тоже задача не из легких. Что же делать? Выход есть — развернуть песочницу дома. Как я убедился, об этом детальнее ниже, это не дорого, это удобно и очень увлекательно.
          Подробности
        • Динамическое программирование и ленивые вычисления

            Динамическое программирование является довольно важным подходом в решении многих сложных задач, основанным на разбиении задачи на подзадачи и решении этих подзадач единожды, даже если они являются частью нескольких других подзадач. Перед людьми, которые только начинают овладевать функциональным программированием часто возникает вопрос: «как избежать повторного решения подзадач, если не использовать переменные для сохранения результатов?». В этом вопросе одна особенность функционального программирования — отсутствие переменных — мешает кешировать результаты решения подзадач, но другая особенность поможет — ленивые вычисления.
            Читать дальше →
          • Решение загадки Эйнштейна на Haskell

              Прелюдия

              Albert_Einstein
              Не так давно я прочитал на Хабре статью, которая напомнила мне про интересную головоломку, которую называют «Загадкой Эйнштейна» или «Zebra puzzle». Вероятно многие из вас решали эту задачку на листке бумаги и гордились тем, что входят в несколько процентов населения земли, способных на это.

              Прочитав статью, я задумался над программным решением этой задачи. Подход, приведенный в статье был интересен и вполне оправдал название блога, но показался мне не совсем понятным. В данный момент я интересуюсь языком программирования Haskell, который прекрасно подходит и сам по себе для разминки мозгов, решение же головоломки на нем показалось мне прекрасным вызовом.
              Читать дальше →
            • На кого ориентироваться, разрабатывая сайт

                Разрабатываем сайт?


                Итак, вы решили разработать супер-мега-крутой сайт для русскоязычной аудитории. Вы определились с тематикой, дизайном и прочая-прочая. Но вот интересный вопрос — под какие браузеры писать, использовать ли JavaScript и Cookies и т.д. Конечно же для этого есть статистика.
                Вот решил сделать небольшую выборку статистики за последние несколько месяцев, любезно предоставленную SpyLog'ом
                Читать дальше →
              • Разделение вида и контроллера

                  Что это?


                  Думаю многие из программистов понимают необходимость разделять контроллеры (или, как еще говорят, бизнес-логику) от вида (или логики отображения). Это упрощает поддержку, редизайн и реализацию скинов. Реализаций этого безобразия существует огромное количество и я хотел бы и свои пять копеек вставить :)
                  Вы можете найти огромное количество топиков на эту тему, но в основном они касаются «вида», точнее всяческих шаблонизаторов. Я не буду сейчас об этом, иначе это превратится в очередной холивар. Темя этой статьи — контроллер, а точнее моя его реализация, хотя отображения это тоже касается :).
                  Если где-то есть нечто похожее буду благодарен за указание источников.
                  Читать дальше →
                • Идеальный WYSIWYG редактор

                    Практически любому сайту в наше время не обойтись без формы ввода всяческих статей, комментариев и прочего контента. Естественно хочеться, чтобы контент был богатый (форматирование, ссылки, таблицы, картинки, даже видео) и в сети давно уже появилось безумное множество всяческих яваскриптовых он-лайн редакторов, но все они обеспечивают сходный функционал (одни более, другие менее, но принцип один).
                    Но все они похожи на WordPad. Проблема в том, что в основном они ориентированы на визуальное а не смысловое оформление теста да и юзабилити пока еще не на высоте.
                    Вот не так давно я начал пользоваться MS Word'ом 2007, там есть такая фича как панель быстрого доступа к стилям — там сразу видно как выглядят стили и понятно для чего они нужны (Или как в старом ворде — в панели стилей).
                    Мне кажется было бы неплохо сделать такой редактор, чтобы сбоку, например, была панель стилей с их визуальным отображением, причем чтобы там были разделы семантические — например заголовки, цитаты и т.д. Тогда пользователь будет сразу видеть чем он располагает, причем визуально информация усваивается быстрее чем просто текстом.

                    В заключение


                    Хотелось бы также узнать какие javascript WYSIWYG редакторы вы предпочитаете.

                    UPD


                    Набрел тут на сравнительную таблицу некоторых редакторов. Может кому будет интересно ;)
                  • PHP: производлительность шаблонов

                      О чем это я?


                      Ах да, я хотел вам рассказать о небольшом тесте, который я проводил на досуге. Дело в том, что я люблю изобретать велосипеды (не бейте меня ногами за это невинное хобби). Поэтому в бытность программистом-похапешником я думал над реализацией шаблонизатора (а кто не думал — пусть кинет в меня камнем).
                      Если вы хотите сравнения производительности известных шаблонизаторов — простите, в другой раз
                      Темой этой статьи является исследование производительности некоторых частных случаев использования простых шаблонов
                      Читать дальше →
                    • Почему я не люблю PHP

                        Дисклеймер


                        Заранее хочу предупредить что это не тема для очередного холивара — я работаю на PHP уже довольно давно и довольно успешно. Но все это только потому что этот язык очень распространен да и наверное по привычке ;) Но очень часто бывают моменты в моей практике когда понимаешь, что язык этот далеко не совершенен.
                        Так что ждем с нетерпением PHP6 :)
                        Читать дальше →