Dap в действии. Пишем TodoMVC. Часть 1

  • Tutorial
Первая статья про dap, очевидно, не стала моим писательским успехом: подавляющее большинство коментов к ней свелись к «ниасилил» и «ниасилил, но осуждаю». А приз за самый единственный конструктивный комментарий верхнего уровня достается OldVitus, за совет продемонстрировать dap на примере TodoMVC, чтобы было с чем сравнить. Чем я в этой статье и займусь.

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

Искать и изучать формальное описание задачи я не стал, а решил просто среверсить один из примеров. Бэкенд в рамках этой статьи нам не интересен, поэтому сами мы его писать не будем, а воспользуемся одним из готовых с сайта www.todobackend.com, оттуда же возьмем и пример клиента и стандартный CSS-файл.

Для использования dap вам не нужно ничего скачивать и устанавливать. Никаких npm install и вот этого всего. Не требуется создавать никаких проектов с определенной структурой каталогов, манифестами и прочей атрибутикой IT-успеха. Достаточно текcтового редактора и браузера. Для отладки XHR-запросов может еще потребоваться веб-сервер — достаточно простейшего, типа вот этого расширения для Chrome. Весь наш фронтенд будет состоять из одного-единственного .html-файла (разумеется, ссылающегося на скрипт dap-движка и на стандартный CSS-файл TodoMVC)

Итак, с чистого листа.

1. Создаем .html файл


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Todo -- dap sample</title>
  <link rel="stylesheet" href="https://www.todobackend.com/client/css/vendor/todomvc-common.css"/>
  <script src="https://dap.js.org/0.4.js"></script>
</head>

<body>
<script>
// здесь будет dap
</script>
</body>

</html>

Обычная html-заготовка, в которой подключаем CSS-файл, любезно предоставляемый сайтом www.todobackend.com и dap-движок, не менее любезно предоставляемый сайтом dap.js.org

2. Копируем DOM-структуру оригинального примера


Чтобы пользоваться стандартным CSS-файлом без переделок, будем придерживаться той же DOM-структуры, что и оригинальный пример. Открываем его в браузере Chrome, жмем Ctr+Shift+I, выбираем вкладку Elements и видим, что собственно приложение находится в элементе section id="todo-app">



Последовательно раскрывая это поддерево, переписываем его структуру в наш .html файл. Сейчас мы просто срисовываем по-быстренькому, а не пишем код, поэтому просто пишем сигнатуры элементов в 'одинарных кавычках', а в скобках их детей. Если детей нет — рисуем пустые скобочки. Следим за индентами и балансом скобок.

// здесь будет dap

'#todoapp'(
  '#header'(
    'H1'()
    'INPUT#new-todo placeholder="What needs to be done?" autofocus'()
  )
  '#main'(
    '#toggle-all type=checkbox'()
    'UL#todo-list'(
      'LI'(
        'INPUT.toggle type=checkbox'()
        'LABEL'()
        'BUTTON.destroy'()
      )
    )
  )
  '#footer'(
    '#todo-count'()
    'UL#filters'(
      'LI'()
    )
    '#clear-completed'()
  )
)

Oбратите внимание: повторяющиеся элементы (например, здесь это элементы LI) мы пишем в структуру по одному разу, даже если в оригинале их несколько; очевидно, что это массивы из одного и того же шаблона.

Формат сигнатур, думаю, понятен любому, кто писал руками HTML и CSS, поэтому останавливаться на нем подробно пока не буду. Скажу лишь, что теги пишутся ЗАГЛАВНЫМИ буквами, а отсутствие тега равносильно наличию тега DIV. Обилие здесь #-элементов (имеющих id) обусловлено спецификой подключаемого CSS-файла, в котором используются в основном как раз id-селекторы.

3. Вспоминаем, что dap-программа — это Javascript


Чтобы избавить нас от лишних скобочек в коде, dap-движок внедряет прямо в String.prototype несколько методов (я в курсе, что внедрять свои методы в стандартные объекты — это айяйяй, но… короче, проехали), которые преобразует строку-сигнатуру в dap-шаблон. Один из таких методов — .d(rule, ...children). Первым аргументом он принимает правило генерации (d-правило), и остальными аргументами — произвольное число чайлдов.

Исходя из этого нового знания, дописываем наш код так, чтобы вместо каждой открывающей скобки у нас была последовательность .d("", а перед каждой открывающей одинарной кавычкой, кроме самой первой, была запятая. Лайфхак: можно воспользоваться автозаменой.

'#todoapp'.d(""
  ,'#header'.d(""
    ,'H1'.d("")
    ,'INPUT#new-todo placeholder="What needs to be done?" autofocus'.d("")
  )
  ,'#main'.d(""
    ,'#toggle-all type=checkbox'.d("")
    ,'UL#todo-list'.d(""
      ,'LI'.d(""
        ,'INPUT.toggle type=checkbox'.d("")
        ,'LABEL'.d("")
        ,'BUTTON.destroy'.d("")
      )
    )
  )
  ,'#footer'.d(""
    ,'#todo-count'.d("")
    ,'UL#filters'.d(""
      ,'LI'.d("")
    )
    ,'#clear-completed'.d("")
  )
)

Вуаля! Мы получили дерево вызовов метода .d, которое уже готово трансформироваться в dap-шаблон. Пустые строки "" — это зародыши будущих d-правил, а чайлды стали перечисленными через запятую аргументами. Формально, это уже валидная dap-программа, хоть пока и не совсем с тем выхлопом, который нам нужен. Но ее уже можно запустить! Для этого после закрывающей корневой скобки дописываем метод .RENDER(). Этот метод, как понятно из его названия, рендерит полученный шаблон.

Итак, на данном этапе имеем .html-файл вот с таким содержанием:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>Todo -- dap sample</title>
  <link rel="stylesheet" href="https://www.todobackend.com/client/css/vendor/todomvc-common.css"/>
  <script src="https://dap.js.org/0.4.js"></script>
  </head>

  <body>
    <script>

'#todoapp'.d(""
  ,'#header'.d(""
    ,'H1'.d("")
    ,'INPUT#new-todo placeholder="What needs to be done?" autofocus'.d("")
  )
  ,'#main'.d(""
    ,'#toggle-all type=checkbox'.d("")
    ,'UL#todo-list'.d(""
      ,'LI'.d(""
        ,'INPUT.toggle type=checkbox'.d("")
        ,'LABEL'.d("")
        ,'BUTTON.destroy'.d("")
      )
    )
  )
  ,'#footer'.d(""
    ,'#todo-count'.d("")
    ,'UL#filters'.d(""
      ,'LI'.d("")
    )
    ,'#clear-completed'.d("")
  )
)

.RENDER() // рендерим полученный dap в документ

    </script>
  </body>
</html>

Можно открыть его в браузере, чтобы убедиться, что DOM-элементы генерятся, CSS-стили применяются, осталось только наполнить этот шаблон данными.

4. Получаем данные


Идем на страничку-оригинал, открываем в инструментах вкладку Network, включаем фильтр XHR, и смотрим, откуда берутся данные, и в каком виде.





Окей, понятненько. Список дел берется прямо из todo-backend-express.herokuapp.com в виде json-массива объектов. Замечательно.

Для получения данных в dap имеется встроенный конвертор :query который асинхронно «конвертирует» URL в данные, с него полученные. Сам URL мы не будем писать прямо в правиле, а обозначим его константой todos; тогда вся конструкция по добыче данных будет выглядеть так:

todos:query

а саму константу todos пропишем словаре — в секции .DICT, прямо перед .RENDER():

'#todoapp'.d(""
  ...
)
.DICT({
  todos  : "https://todo-backend-express.herokuapp.com/"
})
.RENDER()

Получив массив todos, строим из него список дел: для каждого дела берем название из поля .title и пишем его в элемент LABEL, а из поля .completed берем признак «завершенности» — и пишем в свойство checked элемента-чекбокса INPUT.toggle. Делается это так:

    ,'UL#todo-list'.d("*@ todos:query" // Оператор * выполняет повтор для всех элементов массива
      ,'LI'.d(""
        ,'INPUT.toggle type=checkbox'.d("#.checked=.completed") // # обозначает "этот элемент"
        ,'LABEL'.d("! .title") // Оператор ! просто добавляет текст в элемент
        ,'BUTTON.destroy'.d("")
      )
    )

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



Пришло время смотреть нашу страничку через http — с помощью любого локального вебсервера. Ну, или если вы пока не готовы писать dap своими руками, смотрите последовательные версии странички по моим ссылкам (не забывайте смотреть исходники — в Хроме это делается с помощью Ctrl+U)

Итак, заходим на нашу страничку по http:// и видим, что данные приходят, список строится. Отлично! Вы уже освоили операторы * и !, конвертор :query, константы и доступ к полям текущего элемента массива. Посмотрите еще раз на получающийся код. Он вам все еще кажется нечитаемым?

5. Добавляем состояние


Возможно, вы уже попробовали понажимать на галочки в списке дел. Сами галочки меняют цвет, но, в отличие от оригинала, родительский элемент LI не меняет свой стиль («завершенное дело» должно становиться серым и зачеркнутым, но этого не происходит) — дела не меняют свое состояние. А никакого состояния эти элементы пока и не имеют и, соответственно, не могут его менять. Сейчас мы это поправим.

Добавим элементу LI состояние «завершенности». Для этого определим в его d-правиле переменную состояния $completed. Элементу INPUT.toggle, который может это состояние менять, назначим соответствующее правило реакции (ui-правило), которое будет устанавливать переменную $completed в соответствии с собственным признаком checked («галка включена»). В зависимости от состояния $completed элементу LI будем либо включать, либо выключать CSS-класс «completed».

    ,'UL#todo-list'.d("*@ todos:query"
      ,'LI'.d("$completed=.completed"// Переменная состояния, инициализируем из поля .completed
        ,'INPUT.toggle type=checkbox'
          .d("#.checked=.completed") // Начальное состояние галочки берем из данных
          .ui("$completed=#.checked") // при нажатии обновляем $completed
        ,'LABEL'.d("! .title")
        ,'BUTTON.destroy'.d("")
      )
      .a("!? $completed") // в зависимости от значения $completed, включаем или выключаем css-класс completed
    )

Подобные манипуляции с CSS-классами — вещь довольно частая, поэтому для них в dap имеется специальный оператор !?
Обратите внимание, делаем мы это в а-правиле (от слова accumulate). Почему не в d-правиле? Отличие между этими двумя типами правил в том, что d-правило при обновлении полностью перестраивает содержимое элемента, удаляя старое и генеря все заново, тогда как a-правило не трогает имеющееся содержимое элемента, а «дописывает» результат к тому, что уже есть. Смена отдельного атрибута элемента LI не требует перестройки остального его содержимого, поэтому рациональней это делать именно в a-правиле.

Смотрим на результат. Уже лучше: нажатия на галочки меняют состояние соответствующего элемента списка дел, и в соответствии с этим состоянием меняется и визуальный стиль элемента. Но все еще есть проблема: если в списке изначально присутствовали завершенные дела — они не будут серенькими, т. к. по умолчанию a-правило не исполняется при генерации элемента. Чтобы исполнить его и при генерации, допишем в d-правило элемента LI оператор a!

      ,'LI'.d("$completed=.completed; a!" // Сразу же после инициализации переменной $completed используем ее в a-правиле

Смотрим. Окей. С состоянием $completed разобрались. Завершенные дела стилизуются корректно и при начальной загрузке, и при последующих ручных переключениях.

6. Редактирование названий дел


Вернемся к оригиналу. При двойном клике по названию дела включается режим редактирования, в котором это название можно поменять. Там это реализовано так, что шаблон режима просмотра «view» (с галкой, названием и кнопкой удаления) целиком прячется, а показывается элемент INPUT class="edit". Мы сделаем чуть иначе — прятать будем только элемент LABEL, т. к. остальные два элемента нам при редактировании не мешают. Просто допишем класс view элементу LABEL

Для состояния «редактирование» определим в элементе LI переменную $editing. Изначально оно (состояние) сброшено, включается по dblclick на элементе LABEL, а выключается при расфокусе элемента INPUT.edit. Так и запишем:

      ,'LI'.d("$completed=.completed $editing=; a!" // Теперь у нас две переменные состояния
      
        ,'INPUT.toggle type=checkbox'
          .d("#.checked=.completed")
          .ui("$completed=#.checked")
	  
        ,'LABEL.view'
          .d("? $editing:!; ! .title") // Если $editing сброшена, то показываем этот элемент
          .e("dblclick","$editing=`yes") // По dblclick включаем $editing
	  
        ,'INPUT.edit'
          .d("? $editing; !! .title@value") // Если $editing непустой
          .ui(".title=#.value") // обновляем .title по событию change (ui событие по умолчанию для INPUT)
          .e("blur","$editing=") // сбрасываем $editing по событию blur
	  
        ,'BUTTON.destroy'.d("")
      
      ).a("!? $completed $editing") // отображаем состояния $completed и $editing в css-классе элемента 'LI'

Теперь мы можем редактировать названия дел.

7. Отправка данных на сервер


Ок, в браузере мы дела редактировать уже можем, но эти изменения нужно еще и передавать на сервер. Смотрим, как это делает оригинал:



Внесенные изменения отправляются на сервер методом PATCH с неким URL вида http://todo-backend-express.herokuapp.com/28185, который, очевидно, является уникальным для каждого дела. Этот URL указывается сервером в поле .url для каждого дела, присутствующего в списке. То есть все, что от нас требуется для обновления дела на сервере — это отправить PATCH-запрос по адресу, указанному в поле .url, с измененными данными в формате JSON:

        ,'INPUT.edit'
          .d("? $editing; !! .title@value")
          .ui(".title=#.value; (@method`PATCH .url (@Content-type`application/json)@headers (.title):json.encode@body):query")
          .e("blur","$editing=") 

Здесь мы используем все тот же конвертор :query, но в более развернутом варианте. Когда :query применяется к простой строке, эта строка трактуется как URL и выполняется GET-запрос. Если же :query получает сложный объект, как в данном случае, он трактует его как детальное описание запроса, содержащее поля .method, .url, .headers и .body, и выполняет запрос в соответствии с ними. Здесь мы сразу после обновления .title отправляем серверу PATCH-запрос c этим обновленным .title

Но есть нюанс. Поле .url мы получаем от сервера, оно выглядит примерно так: http://todo-backend-express.herokuapp.com/28185, то есть в нем жестко прописан протокол http:// Если наш клиент тоже открыт по http://, то все нормально. Но если клиент открыт по https:// — то возникает проблема: по соображениям безопасности браузер блокирует http-трафик от https-источника.

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

          .ui(".title=#.value; (@method`PATCH .url:dehttp (@Content-type`application/json)@headers (.title):json.encode@body):query")
...
.FUNC({
  convert:{ // конверторы - это функции с одним входом и одним выходом
    dehhtp: url=>url.replace(/^https?\:/,'')// удаляем протокол из URL
  }
})

Еще имеет смысл вынести объект headers в словарь, чтобы использовать его и в других запросах:

          .ui(".title=#.value; (@method`PATCH .url:dehttp headers (.title):json.encode@body):query")
...
.DICT({
  todos  : "//todo-backend-express.herokuapp.com/",
  headers: {"Content-type":"application/json"}
})

Ну и для полного фэншуя воспользуемся еще одним полезным свойством конвертора :query — автоматическим кодированием тела запроса в json в соответствии с заголовком Content-type:application/json. В итоге правило будет выглядеть так:

          .ui(".title=#.value; (@method`PATCH .url:dehttp headers (.title)):query")

Итак, смотрим. Окей, названия дел теперь меняются не только в браузере, но и на сервере. Но! Меняться-то может не только название дела, но и его состояние завершенности — completed. Значит, его тоже нужно отправлять серверу.
Можно элементу INPUT.toggle дописать аналогичный PATCH-запрос, просто вместо (.title) отправлять (.completed):

        ,'INPUT.toggle type=checkbox'
          .d("#.checked=.completed")
          .ui("$completed=#.checked; (@method`PATCH .url:dehttp headers (.completed:?)):query")

А можно вынести этот PATCH-запрос «за скобки»:

      ,'LI'.d("$completed=.completed $editing= $patch=; a!" // $patch - "посылка" для сервера
      
        ,'INPUT.toggle type=checkbox'
          .d("#.checked=.completed")
          .ui("$patch=($completed=#.checked)") // кладем в $patch измененный completed
	  
        ,'LABEL.view'
          .d("? $editing:!; ! .title")
          .e("dblclick","$editing=`yes")
	  
        ,'INPUT.edit'
          .d("? $editing; !! .title@value")
          .ui("$patch=(.title=#.value)") // кладем в $patch измененный title
          .e("blur","$editing=")
	  
        ,'BUTTON.destroy'.d("")
	
      )
      .a("!? $completed $editing")
      
      // если $patch не пустой, отправляем его серверу, потом сбрасываем
      .u("? $patch; (@method`PATCH .url:dehttp headers $patch@):query $patch=")

Тут дело вот в чем. Правила реакции относятся к группе «up-правил», которые исполняются «снизу вверх» — от потомка к родителю, до самого корня (эта последовательность может быть прервана при необходимости). Это чем-то похоже на «всплывающие» события в DOM. Поэтому какие-то фрагменты реакции, общие для нескольких потомков, можно поручить их общему предку.

Конкретно в нашем случае выигрыш от такого делегирования не особо заметный, но если бы редактируемых полей было больше, то вынос этого громоздкого (по меркам dap, конечно) запроса в одно общее правило сильно помог бы сохранять код простым и читабельным. Так что рекомендую.

Смотрим: Теперь на сервер отправляются и изменения названия, и изменения статуса.

В следующей статье, если будет интерес, рассмотрим добавление, удаление и фильтрацию дел. А пока можно посмотреть финальный результат и другие примеры dap-кода на dap.js.org/docs
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

    +8

    image
    Что я только что прочитал?

      –3

      Забей. Это не твое

      –10
      Дисклеймер: если вы зашли в комментарии для того, чтобы сообщить о том, что dap вам не нравится и вы никогда не будете им пользоваться — сначала загляните, пожалуйста сюда. Спасибо за понимание.
      Если у вас вопрос «а как на dap сделать X, да так чтобы Y» или аналогичный — буду рад ответить во всех подробностях.
        +4
        А можно прежде чем посылать на страницу «Всем похуй» на Lurkmore перечитать свой пост? А то выглядит как задел под монетизацию. Или безразличие крайней степени — ваш девиз?
        image
          0

          Про рекламу и монетизацию — идея хорошая, спасибо :)

            0
            Ок, заменил табы на пробелы. Лучше, да.
              0
              Кусок кода на сайте вообще не должен начинаться с какого-либо отступа, ведь это самостоятельный кусок кода.
                +1
                Это как раз не самостоятельные куски кода, а фрагменты, в которые внесены изменения. Если сравнивать эти фрагменты с предыдущими — отступы помогают сориентироваться, какая именно строка изменена. Ну так, по крайней мере, задумывалось. Такое «скользящее окно».
            +1
            Ваша проблема что вы ревниво ассоциируете себя с вашей идеей, поэтому любая негативная реакция воспринимается вами в штыки, предупредительно переходя в агрессивную защиту — нападение. Так вы никогда не продадите вашу идею. Нужно научиться отделять себя от идей.
            Как понимаю в идею вложено не мало сил и поэтому это весьма болезненно бьёт по самолюбию.
            Но от плохих идей надо уметь отказываться, не терять на них своё время и силы, учитывать ошибки и делать по новому более жизнеспособное.
            У вас слишком творческий™ порыв и вы заигрались в идею забыв о практичности.
            Я более чем уверен через пол года посмотрив на этот код вы сами будете недоумевать от того что понаписали. Сейчас вы в «ловушке создателя», когда вам всё понятно и хорошо, но это потому что вы сами написали и всё помните, когда вы на этот код посмотрите с точки зрения человека со стороны ваши розовые очки сломаются.
            Вам нужно выжать максимально идею и сделать максимально просто и удобно для людей.
            Были гораздо более перпективные и дружелюбные для входа фреймворки которые не получилось продвинуть, а у вас с этим куда хуже. Сейчас вы совершаете похожую ошибку как автор фреймворка $mol.
              –1
              Я думаю, в комментариях к следующей статье имеет смысл сразу создать ветку для психоанализа. Чтобы все сообщения добрых людей о моих проблемах были собраны в одном месте и не терялись.
            +1
            Возможно теги Angular, ReactJS, всё таки лишние для этого.
            Получение данных в UI не лучший подход.
            Почему у этого лицензия не MIT, не понятно.
              0

              Получение данных в UI не лучший подход. — это было бы справедливо, если вместо "UI" написать "view".
              Dap — программа это не view.

              +2

              Заголовок кликбейтный. Думал — какой-то маленький движок как альтернатива V8. Оказалось — очередной "гениальный фреймворк".

                0
                Пожалуй, да. Убрал про «js-движок». Теперь просто Dap в действии. Про «гениальный фреймворк» — подумаю… может так и напишу.
                0
                Я поймал себя вот на какой мысли: явно JS это не то, что вам интересно.

                Пойдите другим путём — сделайте отдельный язык, компилируемый в JS. Тогда всё встанет на свои места. Всё это безумие решёток, вопросительных знаков, кавычек и скобочек обретёт смысл, плюс вам не придётся выслушавать от JS-еров вопли «мои глаза». Потому что это будет уже не JS.

                Ну и фраза «Никаких npm install и вот этого всего» это минус, а не плюс. В современной веб-разработке под браузер всё идёт через npm и если вашу либу нельзя проинсталить и скормить в babel/webpack, то никто ею и пользоваться не будет.
                  0

                  Так он же уже есть язык этот. Брэйнфак называется.

                    –1
                    На какой-то странной мысли вы себя поймали. Те, кому не интересен JS, пишут на TS, на JSX и прочих «более интересных» языках, как раз таки компилируемых в JS. Все как вы хотите.
                    А вот dap как раз обходится средствами голого JS. И почему вы думаете, что выслушивать вопли «JS-еров»-неофитов — это что-то плохое? :)
                    Непонятно, что вы называете безумием решеток и кавычек. Обилие решеток здесь — это «безумие» CSS-файла, который писал не я, и который к dap отношения не имеет. Кавычки и скобочки вас пугают? А вы когда на JS/HTML последний раз писали? Сравните, пожалуйста, на количество кавычек и скобочек (и их видов) вот эти два выражения:
                    '#toggle-all type=checkbox'
                    <div id="toggle-all" type=checkbox>
                    

                    Мою либу вы можете проинсталить, просто взяв файл dap.js.org/0.4.js если хотите.
                    Другое дело, что это именно «не нужно», в смысле «не требуется».
                      +1
                      "$completed=#.checked; (@method`PATCH .url:dehttp headers (.completed:?)):query"

                      А, так это CSS. Похоже я сильно отстал от него )))
                        0
                        А, так вы безумием называете вот эту решетку, наличествующую аж в 2-х экземплярах?
                        d("#.checked=.completed") // # обозначает "этот элемент"
                        

                        Похоже, вы не от CSS сильно отстали :)
                          0
                          Вооот, а теперь смотрите:
                          // Оператор * выполняет повтор для всех элементов массива
                          // # обозначает "этот элемент"
                          // Оператор ! просто добавляет текст в элемент
                          "? $editing:!; ! .title"
                          ...
                          "? $editing; !! .title@value"
                          ...
                          ".title=#.value; (@method`PATCH .url:dehttp (@Content-type`application/json)@headers (.title):json.encode@body):query"
                          


                          Очевидно же, что если я хочу писать на dap, JS мне не помощник. Нужно учить особый синтаксис. Так зачем тогда вообще нужен JS, если вся мякотка dap'а — в этих?!!! ` @

                          Избавьтесь от балласта, запилите свой компилятор. Elm, PureScript, ClojureScript, CoffeeScript все пошли этим путём и выйграли.
                            0
                            Если вы хотите писать на dap, то JS — ваш главный помощник, на самом деле. Из второй части этого туториала это будет более понятно.

                            Мякотка dap вовсе не в этих *?!
                            я мог бы их назвать for-each, if, print. Просто зачем? Я вот сейчас реально перечислил все три(!) основных оператора, которые вам нужно «выучить», чтобы начать писать на dap. Выучить три оператора — это сложно, я понимаю, но мы не на ЕГЭ, тут дело добровольное. А, собственно, мякотка dap в том, что он позволяет просто и коротко описывать то, что средствами JS пишется громоздко, муторно и просто некрасиво. При этом dap не пытается лезть туда, где все можно просто и красиво сделать на JS. Дождитесь второй части туториала.

                            Зачем нужен JS — кстати это хороший вопрос, я вам с удовольствием отвечу. Изначально (2008-м году, bankreports.dapmx.org) дап строился на HTML/XML. Правила писались в атрибутах d, u и т.п. В принципе это было вполне удобно (в отличие от js-строк, SGML-атрибуты могут быть многострочными, этого сейчас иногда не хватает) и выглядело в те времена доминирования XML вполне логично (хотя синтаксис самих dap-правил был действительно адский). Но в какой-то момент я подумал: а нахрена? Зачем писать это тегами, потом парсить это все, собирать в объекты, иметь вот этот весь головняк, если все это можно прекрасно сделать средствами самого JS? Так же как сейчас я не понимаю этого прикола JSX писать в JS-коде HTML-теги.

                            Поэтому сейчас dap строится средствами JS, и манипулировать dap-шаблонами можно любыми доступными в JS средствами — это обычные JS объекты из обычных JS-объектов. Смысла городить отдельный язык с компилятором и монадами я просто не вижу.

                            В отличие от помянутых PureScript, ClojureScript, CoffeeScript, которые «вместо» JS, dap не вместо.
                    +5

                    Слоган/девиз фреймворка: HAPPY DEBUGGING MOTHERFUCKER!!!!!

                      0
                      Это очень сильно похоже на то, во что компилируется JSX или шаблоны Vue, только хуже.
                      ru.vuejs.org/v2/guide/render-function.html
                        –2
                        Похоже оно только тем, что и там и там JS. Для некоторых граждан любой JS-код на одно лицо, только хуже.
                          +3

                          Уверенности в себе вам не занимать. )

                            0

                            Просто аналогичные игры в ассоциации уже были в комментах к предыдущей статье. Кто какой js раньше видел, тому то и мерещится. Я думаю, это нормально.

                              0
                              Насколько я вижу js у вас только под капотом. А используя Dap надо писать строки текста на каком-то другом языке и передавать их в функции.
                                +1

                                Да, строки текста на другом языке это и есть дап. С помощью js под капотом эти строки компилируются в шаблоны и реактивные связи между ними. Но js тут не только под капотом. Эти dap правила сами оперируют js-данными и js-функциями. Во второй части туториала это будет подробно. Пока можно посмотреть примеры на dap.js.org если интересно

                        0

                        А зачем в принципе нужен ваш фреймворк? В смысле какие задачи он решает прям на порядки лучше других? В прошлой статье вы написали:


                        dap — интересный и необычный язык реактивных правил для написания, в частности, веб-фронтендов

                        Круто, еще один DSL поможет людям, только вот с какими задачами?
                        В этой статье вы нарисовали пример, это здорово, но вот с мотивацией опять же все очень не ясно.

                          0
                          Мотивация — писать чище, проще, лаконичней и декларативней, без бойлерплейта и ритуалов. Пример нарисован как раз для того, чтобы можно было сравнить код. Зайдите на todomvc.com и покажите мне другой пример с сопоставимым футпринтом (приложение+движок= 15 кб). Для сравнения: Vue 110 кб, Backbone 115, jQuery 140, Ember 165, React 300, Angular 320, и т.д. (все цифры после gzip). Это уже «прям на порядки» или как? Понятное дело, что килобайты нынче дешевы. Но и соотношение сложности кода приложения будет не сильно отличаться от соотношения этих размеров. Возьмите любой кусок моего кода и покажите аналогичный кусок из другого примера, про который вы сможете сказать «вот: здесь написано понятней». Чтобы был предмет разговора.
                          Вы, кстати, вторую часть читали уже?
                            +1
                            Мотивация — писать чище, проще, лаконичней и декларативней, без бойлерплейта и ритуалов.

                            Я вот прям сейчас смотрю на ваши примеры. Чище и проще — это не про них. Если подытожить: ваша мотивация — писать мало и декларативно.


                            За всю свою карьеру я не встречал проектов, в которых объем кода являлся проблемой. Скорее даже наоборот, иногда нужно написать больше, что бы код был поддерживаемым, тестируемым, расширяемым и производительным. Можете привести пример проекта, где критичен именно объем кода?


                            Что касается декларативности — это сама цель, или способ уменьшения объема кода?

                              0
                              Я вот прям сейчас смотрю на ваши примеры. Чище и проще — это не про них. Если подытожить: ваша мотивация — писать мало и декларативно.

                              Ваша (и не только) оценка — из серии: «Я вот прямо сейчас смотрю инструкцию на китайском. Вообще ничего не понимаю. Ели подытожить: мотивация китайцев — писать по-нерусски, и не буквами».

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

                              — сформулируйте, я постараюсь ответить. Возможно, отдельной статьей. Но уж точно, «нужно написать больше» — это не единственный способ :)

                              Декларативность — это способ писать и чище, и проще, и меньше. Я уже это где-то говорил? А, и корректней.
                                +1
                                сформулируйте, я постараюсь ответить. Возможно, отдельной статьей.

                                Чище/проще — это про SOLID, и в принципе направления по разделению кода. У вас же сплошной комок. В php например так не пишут уже лет 10.


                                Декларативность — это способ писать и чище, и проще, и меньше.

                                С чего вы взяли?

                                  –1
                                  В php например так не пишут уже лет 10

                                  Я бы постеснялся приводить php в пример того, «как пишут» что бы то ни было.
                                  Комок — в вашем восприятии, а не у меня в коде. Если вам нравится писать часть логики в одном месте, часть в другом, а потом соединять это системой веревочек — ваше право.
                                  Не относящиеся к логике конкретного приложения вещи — они и в dap отдельно пишутся. Это библиотечные элементы, алгоритмы и модели (.DICT, .FUNC и .USES как раз нужны для подключения внешних модулей) и визуал (это CSS, он и так отдельно). Но структура UI и его логика — в dap это жестко взаимосвязанные вещи, да — это накладывает некоторые ограничения, зато заставляет тщательней относиться к проектированию и писать более корректные приложения.

                                  С чего вы взяли?

                                  Вы спросили — для чего в dap декларативность. Я вам ответил.
                                    +1
                                    Я бы постеснялся приводить php в пример того, «как пишут» что бы то ни было.

                                    Вы явно не в теме))


                                    Комок — в вашем восприятии, а не у меня в коде.

                                    Помесь css, псевдо-html, js и вашего dsl — это и есть комок.


                                    Если вам нравится писать часть логики в одном месте, часть в другом, а потом соединять это системой веревочек — ваше право.

                                    Вы когда нибудь слышали про SOLID?


                                    Но структура UI и его логика — в dap это жестко взаимосвязанные вещи

                                    Именно по этой причине у вас и получается комок. Посмотрите QML на досуге, парни из Qt как раз решили эту проблему.


                                    зато заставляет тщательней относиться к проектированию и писать более корректные приложения.

                                    Ваш dsl усложняет проектирование архитектуры приложения.


                                    Вы спросили — для чего в dap декларативность. Я вам ответил.

                                    Контекст вопроса был, почему вы считаете, что декларативность это способ писать чище, проще и меньше?

                                      –1
                                      почему вы считаете, что декларативность это способ писать чище, проще и меньше?

                                      Потому что 15 кБ это меньше чем 300 кБ. Или вы не про цифры, а так… в общефилософском смысле?

                                      Ваш dsl усложняет проектирование архитектуры приложения.

                                      Сколько приложений на dap вы уже написали, чтобы так авторитетно об этом заявлять?
                                      [печальный вздох и фейспалм]
                                      Я новичок на Хабре. Здесь что, автор фактом написания статьи уже чем-то всем обязан? Вам не нравится dap, а нравится php — ок, я без проблем. Первый мой коммент к этой статье (заминусованный гордыми экспертами) полностью отражает мое отношение к этому вопросу.
                                        0
                                        Сколько приложений на dap вы уже написали, чтобы так авторитетно об этом заявлять?

                                        На вашем детище нисколько, и никогда не напишу. Я спросил вас, какую проблему решает ваш проект. Если убрать субъективщину — это уменьшение объема кода.
                                        Уменьшение объема кода с помощью магии и dsl чаще всего приводит к серьезному удорожанию поддержки, расширения, тестирования. В редких случаях — к упрощению чтения.
                                        Чем больше проект — тем серьезней последствия. Для бложика, или todo листа ваш проект возможно и может экономить время, но для среднего и крупного он его будет наоборот отнимать.


                                        Здесь что, автор фактом написания статьи уже чем-то всем обязан?

                                        Когда вы публикуете что-то новое — будьте готовы к критике, это не только на хабре происходит. Если вы не можете качественно аргументировать те, или иные решения — это печально, особенно в публичном пространстве, типа хабра.


                                        Вам не нравится dap, а нравится php — ок, я без проблем.

                                        php я привел по той причине, что аналогичная проблема существовала довольно длительный период, сообщество ее осознало и решило много лет назад. Ваш dap же эту проблему создает заново.


                                        Первый мой коммент к этой статье (заминусованный гордыми экспертами) полностью отражает мое отношение к этому вопросу.

                                        Тогда зачем вы тратили свое время на написание статьи?))

                                          0
                                          Когда вы публикуете что-то новое — будьте готовы к критике

                                          Я готов к критике. Но я, признаться, рассчитывал все же на уровень повыше, чем «ниасилил, но осуждаю».

                                          зачем вы тратили свое время на написание статьи?

                                          Вот, кстати, времени, потраченного на написание статей — вообще не жалко. Очень полезное занятие, рекомендую. Когда приходится формулировать и обосновывать, вскрываются многие интересные моменты. Дойдет ли это до скучающего критика — вообще десятый вопрос.
                                            +1
                                            Но я, признаться, рассчитывал все же на уровень повыше, чем «ниасилил, но осуждаю».

                                            Интересно, сколько лет вы работаете инженером?


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


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


                                            Если аргументация не достаточно качественная — вы получаете вбросы в комментариях.

                                              0
                                              Где вы увидели в моих постах про «самые правильные и самые лучшие решения»? И тем более «докажи»??? Доказывать тут что-то вдруг требуют все, кроме меня. И при этом считают своим долгом меня жизни поучить. Такая игра в инвесторов :)
                                                0
                                                Где вы увидели в моих постах про «самые правильные и самые лучшие решения»?

                                                Вы воспринимаете все фразы буквально? И даже кавычки вас не смутили?))


                                                Доказывать тут что-то вдруг требуют все, кроме меня.

                                                Если вы пиарите что-то новое, еще раз, у вас должна быть мощная аргументация о том, что вы пиарите. Хабр это не рен.тв, где бабки заряжают воду от dvd дисков, тут не надо верить. Тут вполне мощное сообщество с довольно высокой экспертизой.
                                                Скептицизм — это отличное качество этого сообщества. Если вы хотите, что бы ваш проект восприняли серьезно — потребуется серьезная аргументация, которая переборет этот скептицизм.


                                                И при этом считают своим долгом меня жизни поучить.

                                                Фитбэк — он такой. Иногда жестковытый, но чаще всего по делу. Вот пример:


                                                Слоган/девиз фреймворка: HAPPY DEBUGGING MOTHERFUCKER!!!!!

                                                Как у вас с дебагом дела?

                                                  0
                                                  Как у вас с дебагом дела?

                                                  Лично у меня с дебагом dap-кода дела гораздо лучше, чем у меня же с дебагом JS-кода. Хотя, исходя из комментов тут, возможно, займусь этим поплотней. Сейчас просто ошибки в консоли пишет. Можете зайти на dap.js.org/docs поиграться с кодом и посмотреть на ошибки.
                                                  Если вы пиарите что-то новое, еще раз, у вас должна быть мощная аргументация о том, что вы пиарите.
                                                  Эм… пиарю?
                                                    0
                                                    Сейчас просто ошибки в консоли пишет.

                                                    дебаг — это про брейкпоинты.


                                                    Эм… пиарю?

                                                    Разве нет?

                                                      0
                                                      Поскольку вся императивная жесть происходит в JS-функторах ( в .FUNC ), то там все дебажится обычными средствами (я в хроме дебажу).
                                                      Брейкпоинты в самих правилах обычно не нужны, т.к. там все просто. Но когда надо, я просто ставлю любому аргументу конвертор x=>x и на нем уже js-брейкпоинт. Оттуда все видно.
                                                        0
                                                        Брейкпоинты в самих правилах обычно не нужны, т.к. там все просто.

                                                        "$completed=.completed $editing=; a!"

                                                        Я бы не сказал, что подобные текстовки прям простые. Один символ не на своем месте и поиск ошибки будет очень радостным.

                                                          0
                                                          Верьте мне. Уж в dap у меня точно опыт не сравним с вашим. С этим синтаксисом никогда проблем не возникает. А если возникает, то получаете ошибку компиляции в консоли.
                                                          Кстати, странно, что вы именно эту строчку выцепили. Это ж почти php. Только вместо null «ничто»
                                                            0
                                                            Верьте мне.

                                                            С чего вдруг?


                                                            С этим синтаксисом никогда проблем не возникает.

                                                            Ого, сильное утверждение. Правда ложное, вы следующим предложением его же опровергаете.


                                                            А если возникает, то получаете ошибку компиляции в консоли.

                                                            А что если ошибка не синтаксическая?


                                                            Это ж почти php. Только вместо null «ничто»

                                                            На php совсем не похоже. bash кстати тоже использует $ для переменных, но, на него тоже не похоже.

                                                              –1
                                                              А что если ошибка не синтаксическая?

                                                              А где я написал, что ловятся только синтаксические? Если ошибка есть — вы о ней узнаете из консоли.

                                                              С чего вдруг?

                                                              А что вам остается? Проверять же не будете. Так что либо верить более опытному товарищу, либо продолжать фантазировать.
                                                                +1
                                                                А что вам остается? Проверять же не будете.

                                                                С apk проверил, в отличии от вас (в начале).


                                                                Так что либо верить более опытному товарищу, либо продолжать фантазировать.

                                                                Более опытный — это только ваши слова. Зачем мне им верить? Я использую вполне научный подход. Выдвигаю гипотезу, дальше подтверждаю ее, или опровергаю. Если сталкиваюсь с похожей ситуацией — использую полученный опыт.


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


                                                                Подтверждение 1.


                                                                Интерпретатор js не может связать ваш исходный код на строках с тем, что будет реально выполнено. Брейпоинт ставить в строках нет смысла. Будь это по другому, вы бы указали на использование Source Maps.


                                                                Подтверждение 2.


                                                                Не синтаксические ошибки тяжело найти. Это может быть банальная очепятка, корректная с точки зрения синтаксиса. Например для логического выражения забыл добавить логическое НЕТ, или еще что-то подобное. Что мне покажет консоль? Код работает штатно, но не корректно. В других языках такие ошибки тоже бывает трудно найти. Дебаггер в этом очень помогает, но опять же, у вас он не применим.


                                                                Подтверждение 3.


                                                                Для поиска ошибок часто используется unit тестирование. Штуки типа SOLID очень помогают в этом. У вас же сплошная простыня. Простыню покрывать тестами тяжелее, чем много отдельных компонентов.

                                                                  –1
                                                                  Вы знаете, если переформулировать ваши чересчур самоуверенные утверждения в вопросы:

                                                                  1. Как пошагово дебажить дап-код и ставить брейкпоинты? [знак вопроса]

                                                                  2. Как ловить ошибки (синтаксические и несинтаксические)? [знак вопроса]

                                                                  3. Как разбивать дап-программу на модули, которые можно писать, поддерживать и использовать независимо? [знак вопроса]

                                                                  — то я, пожалуй, признаю этот ваш комментарий самым полезным и конструктивным из имеющихся. Хорошие темы для следующих статей. Подписывайтесь, чтобы не пропустить :)
                                                                    0

                                                                    Если все эти вопросы уже решены, почему вы сразу не написали об этом?))

                                                                      0
                                                                      Вы ведь все равно не поверили бы, правда? Поэтому давайте-ка я напишу об этом всем подробно в статьях. И у вас будет уникальная возможность выражать свой скепсис в коментах к конкретным статьям по теме, а не в этой нашей затянувшейся переписке с конскими отступами слева.
                              –1
                              За всю свою карьеру я не встречал проектов, в которых объем кода являлся проблемой.

                              Мне, например, пришлось поменять несколько телефонов тупо потому, что в 4Гб памяти не помещались одновременно Facebook, WhatsApp, PayPal, Мегафон, Сбербанк и Точка. В игры на телефоне я не играю. Только на телефоне с 128ГБ я могу (пока) расслабится. У вас это не вызывает когнитивного диссонанса? 4ГБ мало для десятка туповатых текстовых приложений.
                              Подозреваю, это как раз благодаря разработчикам, для которых «объем кода не являлся проблемой»
                                +1

                                Вы понимаете, что пишете глупость?)) Объем занимаемой памяти на прямую зависит от количества создаваемых объектов и их взаимосвязей, а не от объема кода.


                                Следующий пример отжирает свыше 400мб, хотя это мелкий однострочник.


                                const arr = new Array(10000000).fill(0).map(() => (Math.floor(10 * Math.random())) + "SOME_DATA_HERE");
                                  –1
                                  Да, расскажите мне, как связан объем установочного файла Сбербанк-онлайн (75МБ) и количество создаваемых им объектов.
                                    +1

                                    Слив засчитан

                                      –1
                                      ЩИТО???
                                        +1

                                        Это Android приложение. Основную часть архива занимают скомпилированные *.so библиотеки, ассеты, ресурсы и dex файлы. Библиотеки, типа libcom.yandex.mapkit.so могут быть подключены, но это вовсе не значит, что вся функциональность из них используется, так же не значит, что все возможные объекты из каждой из библиотек создаются сразу. Так же не значит, что все ассеты подключаются и рендерятся сразу.


                                        А слив засчитан потому, что вы понятия не имеете о чем говорите.

                                          0
                                          Это Android приложение

                                          А, ну тогда другое дело, да.

                                          *.so библиотеки, ассеты, ресурсы и dex файлы

                                          Похоже, вы тоже не сильно в теме. В андроиде уже давно далвика нет, соответственно и dex-файлов, наверно, тоже. Но это не точно.
                                          Так объем кода (в т.ч. библиотечного) имеет значение или нет?

                                          Вы можете засчитывать что угодно, но если вместо положенных 75кБ приложение весит 75 МБ — не надо мне рассказывать, что это так и должно быть, ибо SOLID, и все так пишут, даже на пхп.
                                            0
                                            Похоже, вы тоже не сильно в теме. В андроиде уже давно далвика нет, соответственно и dex-файлов, наверно, тоже.

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


                                            Так объем кода (в т.ч. библиотечного) имеет значение или нет?

                                            Для вас по идее должен и меть.


                                            Вы можете засчитывать что угодно, но если вместо положенных 75кБ приложение весит 75 МБ — не надо мне рассказывать, что это так и должно быть

                                            Мне вот просто интересно, откуда вы взяли 75кб? Пальцем в небо? Или это мистическая цифра, описывающая идеальный размер кода?

                                              0
                                              C влажными фантазиями — это давайте в личку. Желательно не ко мне.
                                              Так вот, скачал-таки сберовский apk. Там действительно dex-файлы (я правда думал, что они сменят расширение, ошибся, ок). Как раз таки 75 мегабайт классов. Кода. Вы считаете это нормальным, ок.

                                              Мне вот просто интересно, откуда вы взяли 75кб?

                                              Взял 75МБ и поделил на 1024. Вы же хотели «прям на порядки»?
                                              Если вам правда интересно (а не просто щеки понадувать) — я могу специально для вас написать на dap приложение со всем функционалом Сберонлайна и уместить его в 75 кБ. Сколько вы готовы проспорить? (я правда им последний раз пользовался лет 5 назад, понятия не имею что там сейчас. и мне понадобятся спеки на их хттп-апи)
                                                0
                                                C влажными фантазиями — это давайте в личку. Желательно не ко мне.

                                                Это оборот речи))


                                                Как раз таки 75 мегабайт классов. Кода. Вы считаете это нормальным, ок.

                                                Большая часть объема архива — это мета данные, статика и внешние либы, а не код непосредственно приложения.


                                                я правда им последний раз пользовался лет 5 назад, понятия не имею что там сейчас. и мне понадобятся спеки на их хттп-апи

                                                т.е. вы не зная что нужно сделать утверждаете, что ваш код будет умещен в 75кб, просто потому что?


                                                я могу специально для вас написать на dap приложение со всем функционалом Сберонлайна и уместить его в 75 кБ.

                                                Очень интересно, как вы в 75кб уместите все окружение, в котором ваш dap выполняется. Так же интересно, куда вы впихнете всю статику, которой довольно много. Так же интересно, как dap поможет в распознавании QR кодов (это есть в оригинальном приложении).


                                                Сколько вы готовы проспорить?

                                                А есть смысл?

                                                  0
                                                  Большая часть объема архива — это мета данные, статика и внешние либы, а не код непосредственно приложения.

                                                  А, то есть это можно не загружать? Или нельзя? :\
                                                  75 МБ в apk сберонлайн — это только dex-файлов. executables.

                                                  Очень интересно, как вы в 75кб уместите все окружение, в котором ваш dap выполняется.

                                                  Вы, может, не знали, но в любом андроиде есть как минимум WebView, а как правило — целый Chrome. Этого для dap достаточно. Сбер же с собой весь андроид не тянет, надеюсь?

                                                  как dap поможет в распознавании QR кодов (это есть в оригинальном приложении)

                                                  В распознавании QR не поможет, но можно воспользоваться сторонним, правда?

                                                  А есть смысл?

                                                  А есть деньги?
                                                    0
                                                    Вы, может, не знали, но в любом андроиде есть как минимум WebView, а как правило — целый Chrome.

                                                    Это замечательно. Только в андроиде я что-то сомневаюсь, что есть:
                                                    yandex mapkit, opencv. Они уже больше 75кб весят. Шрифты и изображения тоже весят больше 75кб.


                                                    В распознавании QR не поможет, но можно воспользоваться сторонним, правда?

                                                    Конечно же можно, но размер из ваших 75кб придется вычесть.


                                                    А есть деньги?

                                                    На ваши глупости нет.

                                                      0
                                                      Только в андроиде я что-то сомневаюсь, что есть:
                                                      yandex mapkit, opencv. Они уже больше 75кб весят

                                                      Банкоматы на карте показывать? yandex mapkit в андроиде может и нет, но у яндекс-карт есть JS API и HTTP API

                                                      Шрифты и изображения тоже весят больше 75кб.
                                                      Шрифты и изображения (и css) в мои 75кБ, разумеется, не входят. Так же как и в сберовские 75МБ dex-файлов.

                                                      Конечно же можно, но размер из ваших 75кб придется вычесть

                                                      С чего бы? Lens в андроиде искаропки есть.
                                                        +1
                                                        Шрифты и изображения (и css) в мои 75кБ, разумеется, не входят.

                                                        Слив засчитан.

                                                          –1
                                                          Слив засчитан.

                                                          Вам сколько лет, стесняюсь спросить? Может, я вообще зря про деньги-то?

                                                            0

                                                            Нет аргументов — переходи на личности, так держать.
                                                            31, web разработкой занимаюсь с 2007-го.

                                                              0
                                                              Нет аргументов — пиши «слив засчитан». Так сойдет.
                                                                0

                                                                Если мои аргументы для вас не понятны, это очень печально.

                                                          0
                                                          Вы готовы ответить за 75кБ, или это фигура речи?

                                                          Если Вы живёте в Москве, могу попробовать организовать Вам встречу, думаю если Вам удастся в одно лицо реализовать весь функционал мобильного приложения Сбербанк-Онлайн для веба в разумные (обозримые) сроки в объёме 75кБ, Вы сможете очень и очень неплохо заработать.

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

                                                          Готовы?
                                                            0

                                                            Меня немного настораживает вот это ваше "весь" жирными буквами. Возможно, я что-то об этом приложении не знаю, т.к. не пользуюсь им особо. Но если говорить о функционале, в принципе реализуемом в рамках браузера и http-протокола — то движок + вся ui-логика, написанная на dap, в 75 КБ я уверен, что влезет. Не считая, конечно, картинок, шрифтов и CSS. Ну и карты/qr и т.п. будут внешние.

                                                              +1
                                                              Прелестно, когда Вы будете готовы с презентацией?
                                                              Я прямо в понедельник начну организовывать для Вас конференцию.
                                                                0

                                                                OldVitus Можете отписать комментарий по результатам?

                                                                  0
                                                                  Вы тоже повелись? Я сначала тоже :) На деле все эти «Вы сможете очень и очень неплохо заработать» и «Я прямо в понедельник начну» оказались… как это?.. фигурами речи. Но я не теряю надежды получить хотя бы список того, что входит в весь функционал.
                                                                    +1

                                                                    Странно, вы ведь мне предлагали то же самое на вполне серьезных щах.


                                                                    Слив засчитан.

                                                                      0
                                                                      Слив засчитан.

                                                                      Так я мог бы вам ответить вот в этом месте нашего диалога:
                                                                      — А есть деньги?
                                                                      — На ваши глупости нет.

                                                                      Если бы я, конечно, был инфантильным неудачником, пытающимся поднять свою самооценку за ваш счет. Я этого не сделал, а вы, видимо, не оценили.
                                                                        0
                                                                        Так я мог бы вам ответить вот в этом месте нашего диалога

                                                                        Вы часто вкладываете деньги в то, что вам ничего не принесет?


                                                                        Если бы я, конечно, был инфантильным неудачником, пытающимся поднять свою самооценку за ваш счет.

                                                                        Ну, это примерно так и выглядело.

                                                                          0
                                                                          Вы часто вкладываете деньги в то, что вам ничего не принесет?


                                                                          Вы часто бросаетесь писать большое приложение (а 75к на dap это довольно много) забесплатно, только потому что некий пхпшник с горы, любитель воображаемых слив, усомнился в вашей способности это сделать? Серьезно? Я вам предложил спор на деньги, вы сморозились. Теперь, кстати, (раз уж в тот раз вы, извиняюсь, зассали, и момент упустили) кроме денег, я еще и апи попрошу, т.к. оказалось, что он закрытый, а реверсить его — это неинтересный совсем головняк, неуместный при живом-то инсайдере, вписавшемся за вас. Ну и ТЗ.
                                                                          Копите. Накопите — пишите.
                                                                            0
                                                                            Вы часто бросаетесь писать большое приложение...

                                                                            Не, я бы это даже не предлагал.


                                                                            Я вам предложил спор на деньги, вы сморозились.

                                                                            О чем спорить то? Вы начали вопросы правильные задавать о том, а что же входит в функциональность сбербанка онлайн когда уже слились.
                                                                            Это ошибка новичка, практически каждый инженер с ней в той, или иной форме сталкивался. Ничего, дорастете до мидла — сразу такие вещи замечать будете.


                                                                            Я вам предложил спор на деньги, вы сморозились.

                                                                            Вы только слились на таком же споре, в чем смысл сейчас то? Сел в лужу — обтекай.

                                                                    0
                                                                    Ну тут дело сложное :) человек не «подписывался» приходить за деньгами сам, отказывается от единственного возможного способа получить доступ к mAPI и прочей документации.

                                                                    Ну я не настолько кровожаден, чтобы настаивать.
                                                                      0
                                                                      Разумеется, я не подписывался пытаться в чем-то убеждать сберовских «архитекторов, аналитиков и разработчиков», находясь в их же логове и в меньшинстве. Я даже у вас наблюдаю некоторый скептицизм (при том, что вы сами, как и я, являетесь автором никому кроме вас не интересного js-фреймворка, то есть тоже в некоторой степени романтиком :), что уж говорить про людей, от которых в сбере что-то зависит, и которым эта возня заведомо не интересна.
                                                                        0
                                                                        Ну а как Вы надеялись «неплохо заработать»?
                                                                        Чтобы неплохо заработать надо для начала слезть со своей голубятни или открыть наконец глаза.

                                                                        Просто интересно, сколько времени Вы готовы потратить на эти 75кБ кода и что для Вас значит «неплохо заработать»
                                                                          0
                                                                          «неплохо заработать» — это ваша фигура речи, я ее просто процитировал. Ваши личные деньги мне не нужны, а к сберовским вы отношения, я подозреваю, не имеете. Я даже апи у вас не прошу. Уже просто список того что вы называете "весь функционал". Он тоже под NDA?
                                                                          Я посмотрю на список и либо скажу — да, могу в 75кБ, либо, как вы просили: извинюсь, посыплю голову пеплом и напишу хвалебную статью про Сберонлайн, про Сбер, про Грефа и про вас лично.

                                                                          UPD:
                                                                          Кстати. Не в качестве хвастовства, а просто забавное совпадение. Я сейчас достаточно неплохо зарабатываю. Правда, не программированием, как вы уже знаете. А с помощью разработанного мною оборудования, которое по странному совпадению, примерно в ту же тысячу раз дешевле общепринятых аналогов, занимает ~10 раз меньшую площадь и потребляет в несколько раз меньше электричества. При этом имея те же производительность и качество продукции, на порядки меньшее время на переналадку, в разы меньшее количество отходов, и позволяя делать то, что аналоги не могут. Правда, тоже требует чуть более высокой квалификации работника. Удивительно, правда?
                                                                            0
                                                                            я могу специально для вас написать на dap приложение со всем функционалом Сберонлайна и уместить его в 75 кБ.

                                                                            Я посмотрю на список и либо скажу — да, могу в 75кБ, либо, как вы просили: извинюсь, посыплю голову пеплом

                                                                            Я смотрю вас уверенности поубавилось, а что так?

                                                                              0
                                                                              Да, чтобы Сберовские получить — надо постараться, я чеки не выписываю.

                                                                              Список того, что я называю "весь фунуционал" распределён между десятками команд, и он постоянно растёт — agile, как ни как :)

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

                                                                              «Да могу в 75кБ» — Вы уже сказали, но это громкое заявление и за него нужно отвечать.

                                                                              Извинений я не просил, а требовал, поскольку Вы не захотели отвечать за свои слова.

                                                                              Пепла на Вашей голове в данный момент вполне достаточно, просто Вы его не в состоянии заметить.

                                                                              Хвалебные статьи Ваши тоже никому не нужны.

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

                                                                              А сейчас Ваш UPD Выглядит как те пресловутые 75кБ.
                                        0
                                          0
                                          как удалить свой пост? написал не в ту ветку

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

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