Skip to content

Instantly share code, notes, and snippets.

@namreg
Created August 13, 2015 10:12
Show Gist options
  • Save namreg/6d7b449457d1a03155ed to your computer and use it in GitHub Desktop.
Save namreg/6d7b449457d1a03155ed to your computer and use it in GitHub Desktop.
про функциональный подход и стейты.
sumyuga [7:57 PM] вот такой вопрос меня последние два дня волнует:
а пишут ли веб в функциональном стиле? читал что Lisp используют для веба и даже в продакшене он себя хорошо чувствует.
просто на мой взгляд это скорее эзотерика, хотя с приходом reactjs может многое изменится, кто что думает?
kirill.mokevnin [8:05 PM]
В функциональном стиле пишут функции, а не веб
когда в любом языке программирования вы используете функцию map, вы пишите этот кусочек программы в функциональном стиле
sumyuga [8:06 PM]
ну в общем вы меня поняли )) да, есть же clojure, совсем забыл ))
kirill.mokevnin [8:06 PM]
как раз не очень понял, потому что непонятно что вы имеете ввиду
использование функциональных языков в вебе
sumyuga [8:06 PM]
ну я скорее имел ввиду технологии для веба, всякие там фреймворки и пр
kirill.mokevnin [8:07 PM]
этого добра немерянно
erlang
clojure
даже хаскель используют в вебе
я уж не говорю что практически любая программа на любом языке содержит функциональный код
sumyuga [8:09 PM]
а во фронтенде что? там ведь один js, ну вот реакт появился, а что ещё есть функционального?
kirill.mokevnin [8:10 PM]
jquery
внезапно да? :wink:
на самом деле любой dsl это декларативный подход (edited)
html
ivanlemeshev [8:11 PM]
да, jquery очень функционален))
kirill.mokevnin [8:11 PM]
это декларативный подход
kirill.mokevnin [8:11 PM]
xml
kirill.mokevnin [8:14 PM]
“да, jquery очень функционален))” это не шутка, когда вы использете такой интерфейс method.method.method
kirill.mokevnin [8:14 PM]
то это декларативный способ
kirill.mokevnin [8:14 PM]
так же в руби array.map.map.reduce.filter ...
kirill.mokevnin [8:14 PM]
другое дело что его не корректно называть функциональным конечно же, там есть побочные эффекты и скрытый стейт.
kirill.mokevnin [8:14 PM]
в случае с jquery
kirill.mokevnin [8:15 PM]
но принцип построения цепочек на jquery это декларативный стиль а не императивный
evsign [8:16 PM]
чёт я запутался... декларативный значит функциональный?
kirill.mokevnin [8:16 PM]
часто ставят равенство
kirill.mokevnin [8:17 PM]
но реальность чуть сложнее)
kirill.mokevnin [8:17 PM]
есть еще понятие чисто функциональные языки
evsign [8:21 PM]
я думал, что декларативным всё становится просто когда появляются ф-ции. И работа программы выглядит как совокупность ф-ций с данными. А ф-ный это уже когда всё по полной программе, типо неизменности состояний, лямбд и т.д. Т.е. в каком-то смысле правила написания этих ф-ций. Т.е. если мы пишем ф-ции в функциональном стиле, то мы функциональные программисты, а когда просто пишем ф-ции как хотим, то это декларативное программирование. (edited)
v.kolesnikov [8:41 PM]
а еще внезапно декларативно (функцинально) можно писать в С++ с Qt, а язык QML (как часть Qt фреймворка) так и определяется - декларативный язык для разработки пользовательского интерфейса.
kirill.mokevnin [8:44 PM]
sql это яркий пример декларативного подхода
v.kolesnikov [8:44 PM]
Я начал своё знакомсвтво с декларативным подходом именно с QML, и знать не знал до последнего времени что во всех остальных языках такая большая сложность с декларативностью, т.е. не много где она удачно реализована. А выступление настоящего программиста я смотрел 2 года назад и не мог оторваться, при том что ни к фронтенду ни к вебу ни имел никакого отношения, писал на asm и C\C++
kirill.mokevnin [8:44 PM]
regexp
kirill.mokevnin [8:44 PM]
xslt
kirill.mokevnin [8:46 PM]
да кстати, ocaml часто используется в game деве
kirill.mokevnin [8:46 PM]
“Однако, такие примечательные языки как Erlang, OCaml, Haskell, Scheme (после 1986) а также специфические R (статистика), Wolfram (символьная математика), J и K (финансовый анализ), и XSLT (XML) находили применение в индустрии коммерческого программирования. Такие широко распространенные декларативные языки как SQL и Lex/Yacc содержат некоторые элементы функционального программирования, например, они остерегаются использовать переменные. Языки работы с электронными таблицами также можно рассматривать как функциональные, потому что в ячейках электронных таблиц задаётся массив функций, как правило зависящих лишь от других ячеек, а при желании смоделировать переменные приходится прибегать к возможностям императивного языка макросов."
kirill.mokevnin [8:46 PM]
кстати! самый крутой пример функционального да и еще визуального программирования это эксель
v.kolesnikov [8:46 PM]
недавно по работе столкнулся с xslt - никогда особо не думал что xsl настолько широко используется и на нем столько всяких технологий построено.
kirill.mokevnin [8:47 PM]
у яндекса раньше все генерилось на xslt
kirill.mokevnin [8:47 PM]
щас не знаю
kirill.mokevnin [8:48 PM]
@evsign: декларативный это описательный подход, который отвечает на вопрос что, а императивный это ответ на вопрос как
kirill.mokevnin [8:48 PM]
в sql мы описываем какие данные нам нужны (что), а не то как их извлечь (собственно как).
kirill.mokevnin [8:49 PM]
А вот планировщик уже готовит план запроса и дальше понеслось, прочитали даные отсюда, сделали merge join, тут прошлись по индексу и так далее
kirill.mokevnin [8:50 PM]
http://www.ozon.ru/context/detail/id/6967089/ рекомендую фаулера на эту тему
harry.frese [9:45 PM]
@kirill.mokevnin: Если DSL это язык под конкретную задачу, то какое отношение это имеет к декларативному и функциональному программированию?
kirill.mokevnin [10:00 PM]
вы сейчас два понятия смешали
kirill.mokevnin [10:00 PM]
полнота по тьюрингу и язык
kirill.mokevnin [10:02 PM]
например рочти любая серьезная либа на лиспе это dsl
kirill.mokevnin [10:03 PM]
вообще лисп это язык для создание dsl
kirill.mokevnin [10:03 PM]
посмотрите например core.match core.async
kirill.mokevnin [10:04 PM]
они вам не просто дают апи в виде вызова функций
kirill.mokevnin [10:04 PM]
а определяют микроязык
kirill.mokevnin [10:04 PM]
не тьюринг полный
kirill.mokevnin [10:06 PM]
кстати раньше часть хекслета была написана на clojurescript
kirill.mokevnin [10:07 PM]
но выкинули, причины сугубо утилитарные, незрелые средства отладки, сырость местами, обертки над js либами постоянно устаревают
kirill.mokevnin [10:07 PM]
и много interop
kirill.mokevnin [10:08 PM]
но сам язык сказка, я бы не возвращался на js с него
harry.frese [10:20 PM]
Я не пойму почему dsl находится в контексте декларативного программирования
harry.frese [10:20 PM]10:20
пример из википедии, Perl для манипулирования текстами какое отношение он имеет к декларативному программированию?
kirill.mokevnin [10:23 PM]
вы можете писать код декларативно в любом языке
kirill.mokevnin [10:24 PM]
хотите пример на яве?
gnev [10:26 PM]
конечно
kirill.mokevnin [10:26 PM]
http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/
evsign [10:28 PM]
я тоже не много не понимаю про дсл и декларативное. Дсл это же вообще из другой оперы вроде. Dsl можно как и в функциональном стиле, так и в декларативном, так и в ооп написать.
kirill.mokevnin [10:28 PM]
есть шутка про яву. Лямбда функции есть во всех языках, даже если их нет обычно к восьмой версии они появляется)
kirill.mokevnin [10:29 PM]
нет ооп
kirill.mokevnin [10:29 PM]
есть императивный и декларативный
kirill.mokevnin [10:29 PM]
ооп это императивщина
kirill.mokevnin [10:30 PM]
функциональный стиль это всегда декларативный
kirill.mokevnin [10:31 PM]
обратное верно не всегда
kirill.mokevnin [10:32 PM]
вся математика это декларативный стиль описания
harry.frese [10:38 PM]
А вот касаясь functional dsl для веб, как например Clojure с его стеком, Erlang & Nitrogen, Ocaml & Ocsigen, F# & Websharper и прочих, имеет ли смысл такой подход, использовать функциональный язык и фреймворки позволяющие писать веб полностью в функциональном стиле с компиляцией в Javascript, базы данных и все остальное
kirill.mokevnin [10:39 PM]
все зависит от задачи
kirill.mokevnin [10:40 PM]
если у вас система массового обслуживания где много постоянных коннектов (вебсокеты) и шаред стейт, то эрланг кладет всех на лопатки одной левой
kirill.mokevnin [10:40 PM]
он заточен под это
kirill.mokevnin [10:41 PM]
clojure хороша для работы с языками, у нас на ней небольшой компилятор написан, правда тупой как дрова
kirill.mokevnin [10:42 PM]
https://github.com/mokevnin/multicode вот он кстати
если мы говорим про сайты аля много форм куча стандартных вещей типа авторизация, корзины и тому подобное, то это фреймворки на вашем любимом языке
kirill.mokevnin [10:44 PM]
чем популярнее тем больше там всего
harry.frese [10:44 PM]
а в общем это облегчает жизнь или нет? или же все же лучше использовать что-то стандартное типа Ruby & Rails и т.д. я пока ничего такого не юзал
kirill.mokevnin [10:45 PM]
кстати в андеве у нас был написан поисковый сервис вокруг люсены (поисковый движок) на clojure (edited)
kirill.mokevnin [10:45 PM]
как вы на рельсах напишите сервис который обслуживает сотни тысяч одновремееных коннектов?
kirill.mokevnin [10:46 PM]
это ведь совершенно ортогональные задачи
kirill.mokevnin [10:50 PM]
смотрите еще крутой пример, надо было еще в вебинаре про него поговорить
kirill.mokevnin [10:50 PM]
параллельные вычисления
kirill.mokevnin [10:51 PM]
кто нибудь сталкивался или может слышал что потоки это сложно?
harry.frese [10:51 PM]
основной мой вопрос имеет ли смысл использовать функциональные языки и подход везде, есть ли какие-то преимущества
harry.frese [10:51 PM]
я не сталкивался
kirill.mokevnin [10:51 PM]
мой ответ каждый оаз, зависит от задачи
harry.frese [10:52 PM]
ну какие задачи допустим легче решать на Кложур?
kirill.mokevnin [10:52 PM]
вы читаете что я пишу?)
evsign [10:52 PM]
я ща с этими потоками, процессами разбираюсь) Дедлоки, семафоры, ipc и т.д. В голове такая каша ща...
kirill.mokevnin [10:52 PM]
я выше написал про кложу конкретно
harry.frese [10:53 PM]
многопоточность?
kirill.mokevnin [10:53 PM]
вооо
kirill.mokevnin [10:53 PM]
нет
kirill.mokevnin [10:53 PM]
clojure хороша для работы с языками, у нас на ней небольшой компилятор написан, правда тупой как дрова
kirill.mokevnin [10:53 PM]
это цитата
harry.frese [10:53 PM]
возможно не уловил мысль
kirill.mokevnin [10:54 PM]
вы пропустили где я прямо конкретно писал про технологии
kirill.mokevnin [10:54 PM]
выше
kirill.mokevnin [10:54 PM]
так вот про паралелльные вычисления
evsign [10:54 PM]
> как вы на рельсах напишите сервис который обслуживает сотни тысяч одновремееных коннектов?
ну теоретически это возможно)
kirill.mokevnin [10:54 PM]
вас понятно почему это сложно?
harry.frese [10:54 PM]
вроде
kirill.mokevnin [10:55 PM]
сорои за ошибки я с телефона
kirill.mokevnin [10:55 PM]
почему нужны все эти примитивы синхронизации, и что нельзя было проще?
kirill.mokevnin [10:56 PM]
я щас пищу про параллельные вычисления)
evsign [10:56 PM]
> как вы на рельсах напишите сервис который обслуживает сотни тысяч одновремееных коннектов?
>ну теоретически это возможно)
фак, не заметил что речь про рельсы) Я про руби подумал
evsign [10:57 PM]
>почему нужны все эти примитивы синхронизации, и что нельзя было проще?
что бы не пытаться изменять один объект в одно и тоже время, т.к. состояние будет неопределённое. Что бы избежать ситуации гонки
kirill.mokevnin [10:57 PM]
это немного меняет дело, да?)
kirill.mokevnin [10:57 PM]
воот состояние
kirill.mokevnin [10:58 PM]
есть ли такие проблемы в функциональных языках?
evsign [10:59 PM]
вот это для меня пока загадка) неоднократно слышал, что нету, но пока даже не представляю как вообще этих проблем может не быть)
kirill.mokevnin [10:59 PM]
у вас нет тзменяемого состояния
kirill.mokevnin [11:00 PM]
"нет человека нет проблем"
harry.frese [11:00 PM]
тогда вопрос, почему вы пишите на Rails?
kirill.mokevnin [11:00 PM]
ну вот вы готовы узнать мощь эрланга
kirill.mokevnin [11:00 PM]11:00
https://ru.m.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2
kirill.mokevnin [11:14 PM]
@harry.frese: у меня складывается ощущение что вы меня тролите, я вам расписываю что да как, после этого абсолютно те же вопросы только с другого бока)
kirill.mokevnin [11:15 PM]
я же выше написал для какой задачи что лучше подходит
evsign [11:15 PM]
@harry.frese:
>тогда вопрос, почему вы пишите на Rails?
так речь о другом совсем идёт. Приложения на рейсл - на каждый запрос оживает и умирает, stateless называется вроде. Оживает, генерируются данные в зависимости от запроса, данные отправляются, приложение умирает.
А мы говорили о параллельности.
kirill.mokevnin [11:15 PM]
Чем заинтриговал?
kirill.mokevnin [11:16 PM]
а мне показалось что вопрос о том “раз вы хотите все функционально, то почему используете рельсы” %)
kirill.mokevnin [11:16 PM]
хотя я этого не утверждал никогда
kirill.mokevnin [11:16 PM]
я там с параллельностью не вижу связи честно говоря
evsign [11:17 PM]
Ну эт когда про одновременные и постоянные коннекты говорили
kirill.mokevnin [11:17 PM]
так я же и написал что рельсы для этого не подходят
kirill.mokevnin [11:18 PM]
и для этой задачи подходит эрланг очень хорошо
kirill.mokevnin [11:18 PM]
ну да ладно в общем действительно, функциональные языки в отношении параллельности очень круты по своей природе
kirill.mokevnin [11:18 PM]
нет изменяемого стейта (почти), всегда все безопасно (почти)
kirill.mokevnin [11:18 PM]
паралелься сколько влезет
kirill.mokevnin [11:18 PM]
map/reduce пресловутый это обычный функциональный код
harry.frese [11:20 PM]
и не собирался троллить, просто не понял
harry.frese [11:21 PM]
мне еще учиться и учиться
tuscen [11:21 PM]
@evsign разве приложение на Rails умирает? Я Rails не пользовался ни разу, но из того, что читал, понял, что сам процесс висит в памяти постоянно, так как процесс запуска Rails-приложения достаточно долгий. А stateless это о том, что состояние между разными запросами в самом приложении не сохраняется. Разве не так? Вот PHP умирает между запросами.
kirill.mokevnin [11:22 PM]
ну это на самом деле не так важно
kirill.mokevnin [11:22 PM]
прикол в том что по настоящему умирает только php
kirill.mokevnin [11:22 PM]
все остальные языки живут в памяти
kirill.mokevnin [11:22 PM]
и это проблема php, а не других языков)
kirill.mokevnin [11:22 PM]
а так да stateless
kirill.mokevnin [11:22 PM]
запрос ответ
evsign [11:23 PM]
Да эт детали реализации по идее. Пхп же тоже может не умирать, а к примеру кешироваться там как-нибудь)
kirill.mokevnin [11:23 PM]
и кстати, несмотря на то что между запросами типа все умирает
kirill.mokevnin [11:23 PM]
не забывайте, это императивные языки и получить там зависимые запросы проще простого
kirill.mokevnin [11:23 PM]
я навскидку могу назвать 2 примера когда мы несколько дней на отладку тратилии
kirill.mokevnin [11:23 PM]
из за кеша вот в этой штуке например @@class_variable (edited)
kirill.mokevnin [11:24 PM]
"Пхп же тоже может не умирать, а к примеру кешироваться там как-нибудь)” эт не то), мы говорим про постоянный процесс в памти
plugin73 [11:26 PM]
@kirill.mokevnin: I18n.locale не так давно у нас рандомно менялся, помнишь?)
kirill.mokevnin [11:26 PM]
дааа!
evsign [11:26 PM]
Я прост думал, что это выглядит как постоянный процесс пхп в памяти с скомпилированными классами какими-нибудь. А на каждый запрос прост происходит создание и инициализация всех объектов по новой, или как-нить в этом роде) (edited)
kirill.mokevnin [11:26 PM]
в php этого нет по историческим причинам
tuscen [11:27 PM]
Вроде же есть реализация неумирающего php, phpdaemon или как-то так называется.
kirill.mokevnin [11:27 PM]
в итоге имеем специфичные проблемы с одной стороны, и с другой стороны он круто подходит для шаред хостингов
kirill.mokevnin [11:27 PM]
ибо между запросами память не жрет
kirill.mokevnin [11:27 PM]
поэтому можно тыщи сайтов на один еле живой сервак положить
kirill.mokevnin [11:27 PM]
а нормальный рейлс проект в памяти 200 мегов раз и съел
kirill.mokevnin [11:28 PM]
Саш, сколько у нас хекслет кушает щас?
plugin73 [11:28 PM]
200 мегов это чистый скаффолд, наверн)
kirill.mokevnin [11:28 PM]
ну по меньше)
plugin73 [11:28 PM]
ну где-то метров 500 у нас жрет
kirill.mokevnin [11:29 PM]
0_o
kirill.mokevnin [11:29 PM]
например в php фреймворках есть встроеные средства для кеширования классов, конфигов и прочего добра, в других языках это просто не надо
kirill.mokevnin [11:29 PM]
после первогго запуска все в памяти
plugin73 [11:32 PM]
а ну поменьше - 400) у рубей же еще в чем прикол - они память выделили под себя, а потом в операционку ее не вернули
на ruby 2 с этим получше стало, но все равно утекает
kirill.mokevnin [11:32 PM]
еще кому интересно про параллельные вычисления и всякие крутые штуки, прочитайте про транзакционную память
kirill.mokevnin [11:32 PM]
которая используется в хаскеле в clojure
kirill.mokevnin [11:32 PM]
в ocaml если мне не изменяет память
kirill.mokevnin [11:33 PM]
и еще одна крутейшая вещь это персистентные структуры данных
kirill.mokevnin [11:33 PM]
мы вот говорим про неизменяемость, а кто нибудь задумывался про то что если все время копировать данные, то мы съедим адовое количество места
kirill.mokevnin [11:33 PM]
и все это будет еще не быстро мягко говоря
evsign [11:33 PM]
> А stateless это о том, что состояние между разными запросами в самом приложении не сохраняется. Разве не так? Вот PHP умирает между запросами.
Кста, я вот задумался... А приложение, которое сохраняет сессию в куках - это stateless или statefull? Т.е. со стороны пользователя это получается statefull, а со стороны самого приложения stateless? но в контексте пользователя эти понятия не используются?
kirill.mokevnin [11:34 PM]
это клевый вопрос, я его ждал)
kirill.mokevnin [11:34 PM]
вы ведь знаете что такое rest?
evsign [11:34 PM]
ес)
tuscen [11:34 PM]
Представляю )
kirill.mokevnin [11:34 PM]
http://habrahabr.ru/post/113585/ вот про персистентные структурыё
так вот, как вы думаете, если мы используем сессии, это рест или не рест?)
tuscen [11:35 PM]
Получается что не рест, ведь состояние сохраняется.
kirill.mokevnin [11:35 PM]
http://www.restapitutorial.com/lessons/whatisrest.html#
evsign [11:36 PM]
амм.. это вообще к ресту не относится же. Сессии мне кажется это что-то из разряда бизнеслогики.
kirill.mokevnin [11:36 PM]
это как раз относится
kirill.mokevnin [11:36 PM]
rest это передача состояния
kirill.mokevnin [11:36 PM]
собственно
kirill.mokevnin [11:36 PM]
вы обязаны его передавать целиком и полностью
evsign [11:37 PM]
я представлял, что рест эт прост удобная группировка урлов для рационального использования http запросов)
kirill.mokevnin [11:37 PM]
:smile:
kirill.mokevnin [11:37 PM]
это вообще не имеет отношения к делу
kirill.mokevnin [11:37 PM]
парни, вы когда уже запомните что все о чем стоит говорить в программировании и то что действительно фундаментально это состояние? :wink: (edited)
kirill.mokevnin [11:37 PM]
потому что сложность в нем и все строится вокруг него (edited)
kirill.mokevnin [11:39 PM]
распределенные системы, параллельные вычисления, игры whatever
kirill.mokevnin [11:40 PM]
вообще в этом отношении у веб девелоперов все хуже чем у остальных
kirill.mokevnin [11:40 PM]
ибо “жизни не видели"
kirill.mokevnin [11:40 PM]
я про программирование в стиле запрос ответ
kirill.mokevnin [11:40 PM]
и хранения стейта в базе
kirill.mokevnin [11:40 PM]
вы не представляете насколько это упрощенно
kirill.mokevnin [11:40 PM]
и это программированием назвать то нельзя по сути
evsign [11:41 PM]
>rest это передача состояния
так вообще любой http запрос это передача состояния, по идее.
kirill.mokevnin [11:41 PM]
вот только богатый фронтенд немного сложности привнес
evsign [11:41 PM]
хотя не
evsign [11:41 PM]
да блин, 50 на 50
kirill.mokevnin [11:41 PM]
тогда еще вопрос, возможен ли рест без http?
evsign [11:43 PM]
хз)
Хочется сказать нет
kirill.mokevnin [11:44 PM]
https://gist.github.com/chrisnicola/1502400 вот рассуждение на эту тему
tuscen [11:44 PM]
Я бы ответил, что да. REST это же паттерн разработки. (edited)
kirill.mokevnin [11:45 PM]
вот тут я вообще связи не вижу)
kirill.mokevnin [11:45 PM]
“паттерн разработки” это эфимерное понятие, а не формальное, и из него невозможно выводить такие следствия, как “значит рест только с http"
kirill.mokevnin [11:46 PM]
не смотря на то что рест определен в эпоху http это не значит что он не подходит для других протоколов
kirill.mokevnin [11:46 PM]
http это не венец творения и единственный в своем роде
evsign [11:47 PM]
Мне кажется эт такой более философский вопрос.
С начала стоит определиться каким образом мы будем различать один запрос от другого, т.е. должен быть определённый протокол. Если в протоколе предусмотрены какие-то другие способы различия кроме различия по uri, то рест и нафиг не нужен.
Но рест это уже такая философия, которая сформировалась поверх http. Как оптимально этот http использовать, так сказать (edited)
kirill.mokevnin [11:47 PM]
я это сказал вот к этому
kirill.mokevnin [11:47 PM]
evsign [4:41 PM]
>rest это передача состояния
так вообще любой http запрос это передача состояния, по идее."
tuscen [11:47 PM]
Я имел в виду, что никто же не запрещает использовать идею передачи состояния с каждым запросом, будь то http-запрос, или запрос посредством любого другого протокола,
kirill.mokevnin [11:48 PM]
то что сравниваются вещи разных порядков
aderyabin [11:48 PM]
стоп. понятие REST это и есть передача состояния
aderyabin [11:48 PM]
по определению
aderyabin [11:49 PM]
а то как ты передаешь это уже твое личное дело
kirill.mokevnin [11:49 PM]
Ладно, кажется не все улавливают связь. Мы уже определились с тем что состояние это проблема, без него никуда но чем его больше тем больше проблем
kirill.mokevnin [11:49 PM]
особенно когда его могут вот так удаленно менять
kirill.mokevnin [11:49 PM]
так вот рест по сути это движение в сторону “нет состояния на сервере”, а это? :wink:
kirill.mokevnin [11:50 PM]
я не люблю говорить функциональный подход, потому что люди видят в этом религию, я хочу чтобы вы осознали роль состояния (edited)
kirill.mokevnin [11:50 PM]
и его боль
kirill.mokevnin [11:51 PM]
Если кто не знаком с понятием идемпотентность то самое время его выучить
kirill.mokevnin [11:51 PM]
оно очень важное
tuscen [11:51 PM]
То есть REST это то, как функциональный подход применили к вебу?
kirill.mokevnin [11:52 PM]
я бы не стал так говорить, но рест по сути пытается это состояние изолировать и упростить работу с ним
evsign [11:52 PM]
блин, во что ща превратилось то, что я считал прикольным способом использования http запросиков)
kirill.mokevnin [11:52 PM]
ну вот смотрите
kirill.mokevnin [11:52 PM]
банально
kirill.mokevnin [11:52 PM]
GET запрос
kirill.mokevnin [11:52 PM]
он обязан быть идемпотентным
kirill.mokevnin [11:52 PM]
это написано в RFC
kirill.mokevnin [11:53 PM]
по идее те кто его читали, у них как бы рест частично сам собой получается)
kirill.mokevnin [11:54 PM]
банальный пример того как делают люди которые слабо вот эти штуки понимают, ссылку на удаление делают обычным гет запросом
kirill.mokevnin [11:54 PM]
я знаю случаи когда в такие части системы попадали поисковые роботы
evsign [11:54 PM]
:smile:
kirill.mokevnin [11:55 PM]
“As on the World Wide Web, clients can cache responses. Responses must therefore, implicitly or explicitly, define themselves as cacheable, or not, to prevent clients reusing stale or inappropriate data in response to further requests. Well-managed caching partially or completely eliminates some client–server interactions, further improving scalability and performance."
kirill.mokevnin [11:55 PM]
это из описание реста
kirill.mokevnin [11:55 PM]
и это тоже про то как проще работать со стейтом
kirill.mokevnin [11:55 PM]
если get идемпотентный то его можно кешировать
kirill.mokevnin [11:56 PM]
соответственно если вы каждый раз передаете состояние, то это похоже на чистую функцию
kirill.mokevnin [11:56 PM]
она зависит только от аргументов
kirill.mokevnin [11:56 PM]
и вы всегда получаете детерменированное поведение
kirill.mokevnin [11:56 PM]
а значит ваши программы надежнее
evsign [11:57 PM]
но ведь get не всегда идемпотентный, на динамических сайтах например
kirill.mokevnin [11:57 PM]
это проблема распределенных систем
kirill.mokevnin [11:57 PM]
читаем про CAP теорему)
kirill.mokevnin [11:57 PM]
он относительно идемпотентный
kirill.mokevnin [11:58 PM]
ну нельзя сущность удалять по гет запросу
kirill.mokevnin [11:58 PM]
вот о чем речь
kirill.mokevnin [11:58 PM]
или нельзя делать фильтр в поиске через пост
kirill.mokevnin [11:58 PM]
без передачи параметров в гет запросе
kirill.mokevnin [11:58 PM]
я такое часто вижу
kirill.mokevnin [11:58 PM]
это ахтунг
kirill.mokevnin [11:58 PM]
особенно какие нибудь олдскульные банковские системы
kirill.mokevnin [11:59 PM]
https://en.wikipedia.org/wiki/Eventual_consistency вот очень важное понятие в распределенных системах
а еще сразу наброшу, это должны все знать, оптимистические и пессимистические блокировки
kirill.mokevnin [12:00 AM]
нормально сегодня просветились?)
tuscen [12:01 AM]
А как же быть, например, с такой ситуацией: получить n последних записей. Между двумя одинаковыми запросами записей может стать больше. И ответ будет разным.
evsign [12:01 AM]
ваще не просветился) всё разрушилось только)
kirill.mokevnin [12:01 AM]
@channel: тут кто нибудь еще смотрит читает кроме тех кто пишет?))) Хочется верить что наши разговоры доходят до большого числа людей
:+1:30 :sleeping:1
evsign [12:01 AM]
и усложнилось)
pgavrilov [12:02 AM]
я читаю) все нормально, аудитория есть
tuscen [12:02 AM]
Я даже если не пишу, читаю практически все ) Возможно другие так же.
tuscen [12:02 AM]
Я даже если не пишу, читаю практически все ) Возможно другие так же.
kirill.mokevnin [12:02 AM]
отлично)
zelark [12:02 AM]
Читаю но не всё.
kirill.mokevnin [12:03 AM]
“ как же быть, например, с такой ситуацией: получить n последних записей. Между двумя одинаковыми запросами записей может стать больше. И ответ будет разным.” никита клевую статью писал на эту тему
evsign [12:03 AM]
>А как же быть, например, с такой ситуацией: получить n последних записей. Между двумя одинаковыми запросами записей может стать больше. И ответ будет разным.
Я вот это и имел ввиду, когда говорил, что гет не идемпотентный на дин сайтах (edited)
dmglazunov [12:03 AM]
Голосуем, товарищи!
kirill.mokevnin [12:03 AM]
идемпотентность это не только “не изменилось где то там”, а так же о том что ваш запрос не изменяет ответ
kirill.mokevnin [12:04 AM]
вот это мега важно
kirill.mokevnin [12:04 AM]
а то что в бекенде может поменться, ну так а где по другому?
thohoh [12:04 AM]
Там читаем , но не хватает базы чтобы понимать о чем вы :simple_smile:
kirill.mokevnin [12:04 AM]
главное что у вас просто изменилось число записей, семантика та же, а не то что вы по этому же запросу получили 404 вторым запросом
kirill.mokevnin [12:04 AM]
потому что первый удалил страницу :smile:
kirill.mokevnin [12:05 AM]
щас еще один важный принцип разработки накину
evsign [12:05 AM]
ну эт если строгопо определению рассматривать, то о не идемпотный, а если семантически, то идемпотный)
evsign [12:05 AM]
я понял)
kirill.mokevnin [12:05 AM]
https://en.wikipedia.org/wiki/Command%E2%80%93query_separation
kirill.mokevnin [12:07 AM]
https://ru.wikipedia.org/wiki/CQRS вот русская альтернатива
kirill.mokevnin [12:07 AM]
пока время есть еще могу одну интересную штуку рассказать
kirill.mokevnin [12:07 AM]
я думаю для большинства это будет открытием, а для многих надеюсь упростит жизнь
kirill.mokevnin [12:08 AM]
владение базой еще хорошо потому, что вы можете заранее многие вещи предвидеть и знать результат, например что то невозможно физически, или на какие придется пойти уступки при определенных обстоятельствах
kirill.mokevnin [12:08 AM]
при этом те кто не владеют, часто борются с ветряными мельницами
kirill.mokevnin [12:09 AM]
давайте представим что у вас одна система собирает данные
kirill.mokevnin [12:09 AM]
и отдает в другую систему
kirill.mokevnin [12:09 AM]
есть такая задача в больших проектах это логгирование
kirill.mokevnin [12:09 AM]
на сервера не ходят в таких случаях, все логи сливаются в одно место
kirill.mokevnin [12:09 AM]
и дальше уже как то с этим работают
kirill.mokevnin [12:10 AM]
итого есть две части, одна на сервере собирает логи и передает их другой
kirill.mokevnin [12:10 AM]
по http предположим
kirill.mokevnin [12:10 AM]
вопрос
kirill.mokevnin [12:11 AM]
Можете ли вы гарантировать что агрегатор получит ваш мессадж?
kirill.mokevnin [12:11 AM]
(это наводящий вопрос, так что дискас велкам)
kirill.mokevnin [12:11 AM]
там дальше будет мясо)
thohoh [12:12 AM]
Ну вот , на агригаторе я завис ( что это ?)
thohoh [12:12 AM]
Рано мне в таких дискуссиях участвовать :simple_smile:
evsign [12:13 AM]
агрегатор логов имеется ввиду?
kirill.mokevnin [12:14 AM]
Агрегатор (от лат. Aggregatio — «накопление») — тот, кто агрегирует, собирает, группирует объекты в категорию более высокого уровня:
kirill.mokevnin [12:14 AM]
яндекс новости это агрегатор
evsign [12:14 AM]
Так а почему агрегатор может не получить наш запрос)
evsign [12:14 AM]
Мы его по хттп отправили, отправили)
kirill.mokevnin [12:14 AM]
ну здрасте
kirill.mokevnin [12:14 AM]
у нас сеть
kirill.mokevnin [12:14 AM]
P из CAP
kirill.mokevnin [12:15 AM]
если есть сеть значит все, нет надежности
kirill.mokevnin [12:15 AM]
все может упасть в любой момент
evsign [12:15 AM]
ааа, блин) (edited)
evsign [12:16 AM]
ну знач надо писать в логгере логику, который в зависимости от ответа агрегатора будет отправлять данные заново (edited)
kirill.mokevnin [12:16 AM]
какого ответа?
kirill.mokevnin [12:16 AM]
если есть упала то ответа нет (edited)
kirill.mokevnin [12:16 AM]
таймаут
evsign [12:16 AM]
репит пока не будет
kirill.mokevnin [12:17 AM]
а если мы данные отправили (а мы это точно знаем что отправили), но не получили в ответ http response?
kirill.mokevnin [12:17 AM]
то что тогда?
kirill.mokevnin [12:17 AM]
данные дошли гарантированно ведь
kirill.mokevnin [12:17 AM]
или нет?)
kirill.mokevnin [12:17 AM]
или мы уже начали получать ответ но на середине упали
kirill.mokevnin [12:17 AM]
:wink:
kirill.mokevnin [12:18 AM]
как минимум вы обратили внимание что это уже чуть сложнее чем странички отдавать?)
evsign [12:18 AM]
конечно))
evsign [12:19 AM]
Вот ситуация когда на середине упали, сложнее в разы. Подписывать данные хешем тогда надо
evsign [12:20 AM]
блин, тут надо подумать вообще)
b0noi [12:21 AM]
@kirill.mokevnin:
b0noi [12:23 AM]
@kirill.mokevnin: это просто шикарная тема, жаль что на сон очень клонет а то б похоливарили :smiley:
ИМХО описання проблема в общем касается гарантии доставки сообщения, если из места А доставляют сообщение в В то все сегодняшние решения делятьс на две группы:
- гарантия того что сообщение будет доставлено 0 или 1
- гарантия того что сообщение будет доставлено 1 или более раз
kirill.mokevnin [12:24 AM]
ааа, ты чего палишь контору ? :smile:
kirill.mokevnin [12:25 AM]
да это просто семантика rpc call
kirill.mokevnin [12:25 AM]
всего три возможных варианта с определенными плюсами и минусами
evsign [12:32 AM]
Я всё представляю так. Если через хттп.
Отправляем запрос с кипэлайвом, если получаем ответ ок, то передаём данные кусками, после каждого ответа должен вернуться ок. Если не возвращается, то знач в следующий раз отправляем этот кусок. В конце делаем запрос на хэшсумму данных, если сошлось, то конец, если нет, то всё запускаем заново.
Чёт какой-то изврат походу (edited)
evsign [12:34 AM]
Как работает фишка докачки в браузерах, даунлоадменеджерах?
evrial [12:36 AM]
```curl --header "Range: bytes=0-20000" http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part1
curl --header "Range: bytes=20001-36907" http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part2
cat part1 part2 >> test1.png
gnome-open test1.png```
evsign [12:36 AM]
>данные дошли гарантированно ведь
>или нет?)
Если получили ответ, то да.
Ответ же отправляется, когда данные получены.
evsign [12:37 AM]
Т.е. когда заголовок с телом получен.
b0noi [12:40 AM]
@evgeniy: прям думаю где начать :smiley: а что если у Вас не логи а банковская система, worker получил запрос на снятие денег, деньги снял но в момент отправки подтверждения что-то сломалось в сети, что делать? Исходя из описанной логики нужно второй раз команду отправлять? Если б проблема была еще ТОЛЬКО передать данные/таску то тут еще хоть как то можно решать, а вот когда со стороны куда шлешь удаленный вызов/таску еще нужно выполнить какую либо работу вот тут гайки и начинаються
kirill.mokevnin [12:43 AM]
ага, тут еще сразу пессимистическая блокировка встает во весь рост часто
b0noi [12:43 AM]
описанный процесс с хешами еще кое как спасает для просто передачи таски, можно устроить карусель подобно HTTP hand-shake и условно гарантировать что таска дошла и получена на той стороне, но проблема ж начинается дальше, воркеру ж нужно что-то начать с этими данными делать
b0noi [12:43 AM]
о да
b0noi [12:43 AM]
тут надо подкаст делать :smiley:
b0noi [12:44 AM]
еще раз простите что вклинился, я спать) всем всех благ!
kirill.mokevnin [12:44 AM]
да все ок)
evsign [12:45 AM]
@b0noi: спокойной) По чаще вклинивайтесь) (edited)
kirill.mokevnin [12:45 AM]
я думаю можно на этом остановится, там очень нетривиальные истории дальше, ну и достаточно поговорили в целом)
kirill.mokevnin [12:45 AM]
я жду когда кто нибудь напишет что он познал силу, но пока кажется больше каши добавляется)
kirill.mokevnin [12:59 AM]
а вы слышали про лисп машины?
quantizer [1:00 AM]
не
kirill.mokevnin [1:02 AM]
http://habrahabr.ru/post/190082/ это очень интересно
kirill.mokevnin [2:43 AM]
суперкомпиляция сейчас используется не только для оптмизации алгоритмов
kirill.mokevnin [2:44 AM]
как оказалось с помощью нее можно находить проблемы в коде
kirill.mokevnin [2:44 AM]
например в последние версии интелиджи для явы встроены спец проверки
kirill.mokevnin [2:44 AM]
которые используя техники суперкомпиляции находят кучу возможных ошибок
kirill.mokevnin [2:44 AM]
связанные с null например
kirill.mokevnin [2:44 AM]
которые компилятор не способен отловить
kirill.mokevnin [2:45 AM]
вот тут можно послушать об этом у Ильи http://eax.me/eaxcast-s02e09/
Темы выпуска: суперкомпиляция и её приложения, model checking, верификация. Предыдущие выпуски: пятнадцатый, четырнадцатый, тринадцатый, двенадцатый.   Ска
evsign [2:46 AM]
т.е. это когда интелиджи мне к примеру скажет, что вот тут
```(var i = 0, i < a.Hundred; i++)
```
лучше сделать так
```var k = a.Hundred;
(var i = 0, i < k; i++)
```
evsign [2:46 AM]
это суперкомпиляция?)
evrial [2:48 AM]
нет
kirill.mokevnin [2:49 AM]
И: В «Идее» это используется немного для другого. В «Идее», 12 числа сентября будет превью новой «Идеи» и там это используется для автоматического вывода по байт-коду некоторых контрактов. В мире Java идея поддерживать такого рода контракты, как nullable, not null, аннотацию contracts; но, если кратко говорить, то вы можете проаннотировать параметр как not null. Это значит, что вы не ожидаете, что кто-то сюда сунет null в качестве аргумента. Или, если вы аннотируете метод как nullable, то вполне можете ожидать, что данный метод сможет вернуть null результат и ожидаете, что клиент к этому должен быть готов и перед тем как попытаться у возвращаемого значения, допустим, вызвать метод, в общем случае нужно это проверить это на null. «Идея» поддерживает аннотирование библиотек как бы ручками, таким образом, что вы берете некоторый метод и говорите: хочу его проаннотировать и там записываете в некоторый xml-файл. Это помогает потом, когда вы используете метод библиотек, помогает идеевскому анализу, чтобы он был более глубоким и больше понимал семантику библиотеки.
В общем случае, аннотировать такие библиотеки ручками – не очень приятное занятие и то, чем я занимался последние несколько месяцев – это автоматический вывод таких аннотаций просто по байт-коду. Вы подключаете библиотеку, она индексируется и у вас достаточно большое количество таких аннотаций появляется в редакторе автоматически, где он их понимает и использует при анализе кода. Внутри это происходит таким образом, что есть некоторый метод, которым нужно проаннотировать и я его как бы суперкомпилирую, но суперкомпилирую с целью анализа этого байт-кода. У меня внутри некоторые такие значения, которые, грубо говоря, делят объект на null, not null, nullable и так далее, строятся графы конфигурации, а потом из этих графов конфигураций вытаскиваются эти аннотации. Вот это примеры суперкомпиляций для анализа программ. На ближайшем превью «Идеи» это можно будет посмотреть.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment