@scala_ru

Страница 47 из 1499
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 немного спасает

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
А если метод возвращает еще какой-нибудь Future[Option[Set[MySuperModel]]] так вообще "волшебно"( Народ, как вы работаете с Future ?
напиши логику работы с содержимым, потом либо весь вызов во фьючу, либо лифти функцию можно еще акторы (но там другие противности будут) или стримы последнее, имхо, один из лучших вариантов, можно организовать наиболее читаемо (весь бизнес процесс в одном месте) и выполнение будет максимально простым с минимумом переключений между потоками

Alexey
08.08.2016
05:00:00
Изначально стоит задача написать таску, положить ее в динамически создаваемый скоуп и адаптировать зависимости таски на зависимости внутри этого скоупа

Чтобы не писать в таске someSetting.all(...).value, а просто использовать someSetting.value

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

Alexey
08.08.2016
05:01:31
типа, используйте ребята := и .value макрос, и всё
В том то и дело что .value нельзя :)

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

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

может он таки нашел, как это обойти

Daniel
08.08.2016
05:03:36
отлично...akka уже есть, возьму их.
http://doc.akka.io/docs/akka/2.4/scala/stream/stream-parallelism.html возможно это стоит прочесть, чтобы понять какпроцессы строить

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

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

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 и юзер хочет то чего нет, это и есть исключение

Vladimir
08.08.2016
06:24:05
Admin
ERROR: S client not available

Sovent
08.08.2016
06:38:48
не понимаю зачем тут использовать исключения, если это не исключительная ситуация, ну нету просто данных и все.
Ну за транзакцию 6 раз не будет данных, все 6 кейсов по спецификации вашего API мапятся в разные HTTP-ответы, ну и как с одним безмолвным None что-то понять?

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

Dim
08.08.2016
06:40:00
Ну за транзакцию 6 раз не будет данных, все 6 кейсов по спецификации вашего API мапятся в разные HTTP-ответы, ну и как с одним безмолвным None что-то понять?
Ну нет, если там возникла действительно исключительная ситуация то юзать Either или бросать исключение, но если просто нет данных, все хорошо, но данных нет, то зачем исключения?

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

невозможности по техническим причинам

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

Ну нет, если там возникла действительно исключительная ситуация то юзать Either или бросать исключение, но если просто нет данных, все хорошо, но данных нет, то зачем исключения?
Так изначально же обсуждение пошло именно с ситуации, когда тебе нужно по всему стеку таскать связку Future-option, когда её можно упростить до одного Future

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 } }

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
ну и остается вариант лифтить композицию функций

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 преобразований...

он оставит для работы Option[T]
Цепочка из двух трех зависимых походов в базу как будет написан? стрим внтури стрима? :)

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
Цепочка из двух трех зависимых походов в базу как будет написан? стрим внтури стрима? :)
Этот кусок я бы объединил цепочкой и засунул потом в mapAsync. Раз это слик, то jdbc и все равно там блокировки, переключение контеста погоды не сделает. Я со сликом давно не сталкивался, но разве в 3ьем не всунули стримы?

Aleksey
08.08.2016
08:20:16
Да я чисто во имя науки) понятно что обычный мутирующий лист круче в сто раз. Дык как можно, есть идеи?
А какая тут наука? tailrec тот же цикл записанный рекурсиво. Вводи i, бери slice (что бы с двух сторон от i брать) и все будет иммутабельно и рекурсивно.

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

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

Страница 47 из 1499