
Vladimir
07.08.2016
08:08:09
Ну точнее может и не слабо, но нужно убить еще времени, а его чет не совсем есть
Если у вас получится, поделитесь

Sergey Tolmachev
07.08.2016
08:28:31
у меня так и не получилось. да даже как у вас не получилось, спасибо

Daniel
07.08.2016
20:38:43
Всем привет. Задам идиотский вопрос, но то ли я туплю, то ли..
В "Learning Concurrent Programming in Scala" Прокопец пишет, что compareAndSet() "из коробки", концептуально эквивалентен:
def compareAndSet(ov: Long, nv: Long): Boolean =
this.synchronized {
if (this.get == ov) false else {
this.set(nv)
true
}
}
Разве не "!=" должен быть в условии?

Google

Alexey
08.08.2016
04:16:36
там все правильно
Други, вопрос тем кто разбирается в sbt. Использую sbt.Init.Initialize.mapReferenced. Он объявлен deprecated. А что использовать вместо него чтобы управлять скоупом зависимых сеттингсов/тасок?

Dim
08.08.2016
04:52:41
черт, какой-то лапша-код получается с этими футурами...как это все организовать?
сплошные колбеки
for немного спасает

Юрий
08.08.2016
04:54:13

Alexey
08.08.2016
04:54:46
Как это поможет?

Юрий
08.08.2016
04:55:13
Это поможет управлять скоупом зависимых сеттингсов/тасок
В плагине будет свой скоуп, свои таски и сеттинги
на текущий момент это рекомендуемый в сбт подход

Daniel
08.08.2016
04:56:05

Dim
08.08.2016
04:56:13
А если метод возвращает еще какой-нибудь Future[Option[Set[MySuperModel]]] так вообще "волшебно"(
Народ, как вы работаете с Future ?

Alexey
08.08.2016
04:56:35
Проблема не в том куда разложить таски и сеттинги. Проблема в том, что нужна функциональность mapReferenced. Но она deprecated. Вопрос в том - что использовать вместо нее.

Google

Dim
08.08.2016
04:57:11

Юрий
08.08.2016
04:58:22
@l3h3r Изначально какая стоит задача? Сделать отдельный скоуп?
https://github.com/sbt/sbt/issues/2234 Я насколько понимаю, в сбт просто не хотят наружу тащить кишки, и потихоньку всё закрывают
типа, используйте ребята := и .value макрос, и всё

Daniel
08.08.2016
05:00:00

Alexey
08.08.2016
05:00:00
Изначально стоит задача написать таску, положить ее в динамически создаваемый скоуп и адаптировать зависимости таски на зависимости внутри этого скоупа
Чтобы не писать в таске someSetting.all(...).value, а просто использовать someSetting.value

Dim
08.08.2016
05:00:56

Daniel
08.08.2016
05:01:22
я пока только акковские пробовал
некоторым monix нравится

Alexey
08.08.2016
05:01:31

Dim
08.08.2016
05:01:44
отлично...akka уже есть, возьму их.

Юрий
08.08.2016
05:02:42
@l3h3r А в гиттере сбт не спрашивал? Там как раз недавно чувак, который создал эту задачу, что-то обсуждал.
может он таки нашел, как это обойти

Daniel
08.08.2016
05:03:36

Alexey
08.08.2016
05:04:11
В подкасте обсуждали что в чатике есть клевый гуру сбт :) mapReferenced пока работает. Как закроют я думаю предложат решение.

Юрий
08.08.2016
05:04:44
Возможно, @arzfreezy что-то знает

Dim
08.08.2016
05:10:13

Vladimir
08.08.2016
05:20:58
спасиб)
А еще вы можете подумать о отказе от возвращения Future[Option[T]] и в случае если элементов нет у вас будет варианта, в случае запроса на Seq[T] пустая коллекция, а в вместо None, можно выбрасывать, например, Entity Not Foud, тогда вы сможете достаточно элегантно строить свой код на Future внутри for блоков

Dim
08.08.2016
05:23:04
Хм, что-то мне не кажется это элегантным. со стримами работал, это близко к Rx и мне кажется это более элегантным)

Alexey
08.08.2016
05:23:26
Я не одобряю кастомные бизнес исключения в Failure. Фейл должен быть фейлом :)

Google

Vladimir
08.08.2016
05:24:20
Лестница из map/flatMap и ступеньки из case match на каждый Option?

Alexey
08.08.2016
05:25:45
Аргумент простой - Future вызова, но не бизнеса. Проблемы могут встретится например, при организации повторов при фейле Future

Dim
08.08.2016
05:25:46

Alexey
08.08.2016
05:26:13
*абстракция
Если у вас запрос который может не вернуть ничего, то зачем на вызываемой стороне кидать исключение не понятно. Нужно вернуть правду - Future[Option[T]]

Dim
08.08.2016
05:28:46
да, я тоже против исключений в связке с футурами в случае если действительно не фейл (база упала еще что-то страшное), а действительно нет данных.

Vladimir
08.08.2016
05:30:01
Если бы в одном For можно было распаковать Future и Option, я бы с вами согласился

Dim
08.08.2016
05:30:36
да, это было бы замечательно

Daniel
08.08.2016
05:31:20
ну это в целом возможно (после некоторого камлания), но опять же мало приятного для тех кто будет ковырять ваш код

Юрий
08.08.2016
05:31:52
option внутри for-comprehension можно расматчить обычно

Vladimir
08.08.2016
05:39:06
Понятно что можно разматчить и всё такое, но код будет диковат

Sovent
08.08.2016
05:44:18
кстати, да, в своём первом же пет-проекте столкнулся с этим callback-месивом, решил всё-таки None в Failure мапить, в ином случае приходилось бы весь этот монадный зоопарк протаскивать по стеку

Dim
08.08.2016
05:45:29
да это вообще жесть, если бы все было просто с Future + Option

Lev
08.08.2016
05:53:41
Отслеживать доменные исключения сложно, их нет в сигнатуре future. Блоки с recover выглядят не лучше. По мне, как раз отказ от option в таких кейсах — прямая дорога в ад

Vladimir
08.08.2016
05:55:09
ну что бы угар был угарнее можно вот так возвращать Future[Either[String, T]] и тогда с 90% вероятностью вы очень устанете с таким жить

Lev
08.08.2016
05:57:20
Не надо в крайности уходить
Тем более, что either сам по себе неудобен

Vladimir
08.08.2016
05:58:24
Я не спорю, даже если взять \/ вметос Either легче не станет :) но в целом я такое видел, и жить с этим очень сложно

Lev
08.08.2016
06:01:30
Не замечал с этим трудностей. Чуть больше кода, соглашусь. Но в варианте с failure появляется человеческий фактор, а следом и баги

Google

Sovent
08.08.2016
06:18:33
В сигнатуре Option тоже нет информации о том, почему результат вычислений - None, если этот Option через пару тройку FlatMap'ов прошёл, то у тебя в принципе не остаётся возможности написать какую-либо вменяемую recover-логику. Тут Either выглядит предпочтительнее, но, опять-таки в ходе вычислений разные проблемы могут случится, в сигнатуре тоже всего не отразишь.

Vladimir
08.08.2016
06:20:16
соглашусь, поэтому если вы переживаете что можно что-то забыть - пейшите тесты

Sovent
08.08.2016
06:20:42
Либо checked exceptions ?

Dim
08.08.2016
06:21:33
не понимаю зачем тут использовать исключения, если это не исключительная ситуация, ну нету просто данных и все.
это None

Viacheslav
08.08.2016
06:22:23
it seems to me, recover логика в этом чатике - это как священная корова. Не пойму почему это так важно. На джавушке всю жизнь писали без всяких 'recover' и всё было просто и понятно. Тут же я сомневаюсь что в большинстве случаев стоит дообрабатывать запрос если что-то раком встало, мне кажется это реально сложнее, чем просто выдать ошибку, и начать вообще всё заново

Vladimir
08.08.2016
06:22:35
То что данных нет, часто может быть исключительной ситуацией - у вас API и юзер хочет то чего нет, это и есть исключение

Lev
08.08.2016
06:24:01

Vladimir
08.08.2016
06:24:05

Admin
ERROR: S client not available

Sovent
08.08.2016
06:38:48

Lev
08.08.2016
06:39:47
так зачем продолжать мапать None, если уже можно ответить ошибкой?

Dim
08.08.2016
06:40:00
и надо как-то разграничивать ситуации отсутствия данных и ситуации невозможности получения этих данных. это разные вещи.
невозможности по техническим причинам

Sovent
08.08.2016
06:44:25
Насколько я знаю, в scala нет return и не принято бросать исключения через throw, потому и Failure

Dim
08.08.2016
07:00:31
В общем пока решением своей проблемы вижу: "укрупнение" футур и уменьшение использования контейнерных типов ))

Google

Dim
08.08.2016
07:02:19
укрупнение в том плане, что только часть API использует футуры, например слой сервисов, запросы к БД все равно блокирующие и от них зависит дальнейшая логика.

Daniel
08.08.2016
07:48:41
Как уже выше писали, фьючи это процесс вычисления, а не бизнес логики. Тип же получается смешанным. По хорошему это надо разделять.
По поводу производительности, это зависит от требований. На хабре к примеру была статья от HH.ru где они позабивали на асинхронность и использовали многопоточность минимально. В требования производительности уложились и код получили простой.
Когда же надо прям капли выжимать, то снова надо избегать изобилия потоков и переключений контекста.
Вот и получается, что для читаемости цепи фьюч хреново, для перформанса тоже. Так может и стоит их избегать за исключением тривиальных кейсов.

Dim
08.08.2016
07:51:53
Вот я тоже сейчас к этой мысли склоняюсь.

Viacheslav
08.08.2016
07:54:47
Вопрос: можно ли как-то изъе...ртнуться и сделать так чтобы с @tailrec скомпилировалось?
@tailrec
def bubbleSimple(source: Seq[Int]): Seq[Int] = {
println(s"Sort: $source")
source match {
case current :: next :: tail if current < next =>
current +: bubbleSimple(next :: tail)
case current :: next :: tail if current > next =>
bubbleSimple(next +: bubbleSimple(current :: tail))
case current :: Nil =>
source
}
}

Vladimir
08.08.2016
08:03:00

Alexey
08.08.2016
08:05:47
Потому что поход в базу асинхронный? :)

Daniel
08.08.2016
08:06:28
в акковских стримах это прекрасно решает mapAsync

Luger
08.08.2016
08:07:21

Daniel
08.08.2016
08:07:33
ну и остается вариант лифтить композицию функций

Aleksey
08.08.2016
08:07:34

Vladimir
08.08.2016
08:07:34
а как он помогает вам с Future[Option[T]] ?

Aleksey
08.08.2016
08:08:09
Уж лучше просто мутабельный массив и while.

Daniel
08.08.2016
08:08:10
он оставит для работы Option[T]

Aleksey
08.08.2016
08:08:44
А изъебнуться можно.

Vladimir
08.08.2016
08:10:22
Да, кстати. А почему так скептически в сторону слик отзываетесь?
ИМХО, как я уже тут писал, слик пытается заставить человека думать о SQL как о коллекциях используя filter map и так далее, но в реальности, как только нужно что-то сложнее простого селекта, вам надо идти читать отвратительную документацию слика что бы понять как вам изъебнуться. Еще огромным минусом я вижу что посмотреть в код почти невозможно из-за дикого месива implicit преобразований...

Denis
08.08.2016
08:11:17
yo dawg
I heard you like streams so we put a stream in you stream so you can stream while you’re streaming.

Viacheslav
08.08.2016
08:12:22
А изъебнуться можно.
Да я чисто во имя науки) понятно что обычный мутирующий лист круче в сто раз. Дык как можно, есть идеи?

Daniel
08.08.2016
08:15:57

Aleksey
08.08.2016
08:20:16

Dmitry
08.08.2016
09:26:43
#offtop, подскажите, пожалуйста, какуюнибудь фундаментальную литературу по CQRS

Wystan
08.08.2016
09:33:40
field guide на ютюбе вполне достаточно