
Nikolai
11.01.2017
14:25:15
чет я не думаю что иммутабельная мепа будет быстрее мутабельной. А вот мепу на массив заменить - это вот должно помочь

Oleksandr
11.01.2017
14:26:48
угу, массив на 100 элементов, и апдейтить

KrivdaTheTriewe
11.01.2017
14:31:28
ключём является стринг :)

Google

Nikolai
11.01.2017
14:32:35
Нуу тут уж... если этих стрингов заранее известное количество - то проиндексировать и таки свести к массиву

KrivdaTheTriewe
11.01.2017
14:33:08
неизвестно (:

Nikolai
11.01.2017
14:34:28
Ну тогда хз

KrivdaTheTriewe
11.01.2017
14:35:09
Но вообще спасибо, попытаюсь сфолдить нормально

Alexey
11.01.2017
15:15:29

Nikolay
11.01.2017
15:16:06
А для чего запись?


Dmitry
11.01.2017
15:20:37
Нубский вопрос. Только начинаю писать на скале. Делаю проект, в котором нужно что-то типа Jupyter Notebook с фиксированными типами ячеек. Каждый тип ячейки отличается набором входных параметрои и типом результата вычислений. Подскажите, так бы вы смоделировали типы данных в подобной задаче или есть какие-то еще фишки в подобном случае?
/**
* @tparam P parameters type
* @tparam R result type
*/
sealed trait Cell[P, R] {
def id: String
def parameters: P
/**
* Either result or error
*/
def result: Either[R, String]
}
// Cell type A
final case class ParamsA(param1: Long, param2: String)
final case class ResultsA(result: List[Double])
final case class CellTypeA(id: String, parameters: ParamsA, result: Either[ResultsA, String]) extends Cell[ParamsA, ResultsA]
// Cell type B
final case class ParamsB(param1: Double)
final case class ResultsB(result: String)
final case class CellTypeB(id: String, parameters: ParamsB, result: Either[ResultsB, String]) extends Cell[ParamsB, ResultsB]Спасибо.


Andrey
11.01.2017
15:29:41

folex
11.01.2017
15:30:55
Не встречал кода непонятнее чем Twitter FInagle и все связанное. Просто >_<

Andrey
11.01.2017
15:31:33

folex
11.01.2017
15:31:49
Хорошо, кода на Scala.

Nikolay
11.01.2017
15:32:23
А что именно там?

folex
11.01.2017
15:32:34
есть конечно всякие шейплесы, но я о том что черт ногу сломит в этом финагле, и особенно в трифтовых сервисах :(

Google

folex
11.01.2017
15:33:02
@rockjam ну на самом деле тут на каждом шагу всякие сложночитаемые решения
https://gist.github.com/folex/931d6befbf4bbd0bd3051f2aafe37072 вот например то что заставило меня выразить негодование

Andrey
11.01.2017
15:35:37
@krivdathetriewe посмотри на реализацию в спарке. правда там RDD, но идею можно перенести на какой-нибудь стрим или итератор https://github.com/apache/spark/blob/f830bb9170f6b853565d9dd30ca7418b93a54fe3/core/src/main/scala/org/apache/spark/rdd/DoubleRDDFunctions.scala#L123

Nikolay
11.01.2017
15:39:53

folex
11.01.2017
15:40:00
да, там беда
и там везде так

Vadim
11.01.2017
15:41:04
это только на клиентах
ну точнее сервисах

folex
11.01.2017
15:41:49
https://github.com/twitter/finagle/blob/develop/finagle-thrift/src/main/scala/com/twitter/finagle/Thrift.scala

Vadim
11.01.2017
15:41:56
ну по мне это самый страшный кусок, остальное не особо смущает

folex
11.01.2017
15:42:01
не клиентах и на серверах там везде трешак, нет?

Vadim
11.01.2017
15:42:10
угу

Anatoliy
11.01.2017
15:51:30
Народ, а можно глупый вопрос по typesafe config? Что бы в исходники не лезть. Когда я читаю конфиг и пользуюсь полученными значениями, я же всего 1 раз конфиг читаю, так? Или каждый раз идет новое обращение к файлу?

Mikhail
11.01.2017
15:54:56
ConfigFactory.load() - неспроста наверное)

Anatoliy
11.01.2017
16:06:07

KrivdaTheTriewe
11.01.2017
16:12:19
а сталкивались с тем, что идея конфиги кеширует ? и не обновляет?

Oleg
11.01.2017
16:15:58


Vladimir
11.01.2017
16:49:58
Нубский вопрос. Только начинаю писать на скале. Делаю проект, в котором нужно что-то типа Jupyter Notebook с фиксированными типами ячеек. Каждый тип ячейки отличается набором входных параметрои и типом результата вычислений. Подскажите, так бы вы смоделировали типы данных в подобной задаче или есть какие-то еще фишки в подобном случае?
/**
* @tparam P parameters type
* @tparam R result type
*/
sealed trait Cell[P, R] {
def id: String
def parameters: P
/**
* Either result or error
*/
def result: Either[R, String]
}
// Cell type A
final case class ParamsA(param1: Long, param2: String)
final case class ResultsA(result: List[Double])
final case class CellTypeA(id: String, parameters: ParamsA, result: Either[ResultsA, String]) extends Cell[ParamsA, ResultsA]
// Cell type B
final case class ParamsB(param1: Double)
final case class ResultsB(result: String)
final case class CellTypeB(id: String, parameters: ParamsB, result: Either[ResultsB, String]) extends Cell[ParamsB, ResultsB]Спасибо.
Едва ли есть фишки, т.к. по сути получается что ячейка она как функция. Вопрос в том, что с ними будет твориться впоследствие


KrivdaTheTriewe
11.01.2017
16:54:34
https://habrahabr.ru/company/mailru/blog/319194/

Dmitry
11.01.2017
16:56:40

Google

Dmitry
11.01.2017
16:58:26
uPickle у меня вроде с такой структурой пока в лоб работает. Я добавил границы на аргументы типа и общих предков для параметров и результатов. Типа так:
sealed trait CellParameters
sealed trait CellResult
sealed trait Cell[+P <: CellParameters, +R <: CellResult] {
...
И тогда корректно работает:
import upickle.default._
read[Cell[CellParameters, CellResult]](write(someCellInstance))

Vladimir
11.01.2017
17:01:58
Думаю, если конкретный тип ячейки вытаскивать из сериализованных данных не придется, то проблем не будет

Dmitry
11.01.2017
17:04:54
Ок, спасибо! Я чувствую что если реально проблемы будут, то когда это все меняться под действием событий будет (монады - не монады, пока до конца не въехал в это все :) ). А сейчас вроде все понятно, начинает в голове укладываться.

Anatoliy
11.01.2017
17:20:51
Народ, а есть возможность получить ConfigObject не через ConfigFactory.load().root() ?
Оно возвращает еще кучу параметров которые мне не нужны в конфиге, их можно как-то убрать?

Nikolay
11.01.2017
17:23:43
Бери только нужные

Anatoliy
11.01.2017
17:24:49
как? я не хочу всё пихать в какой-либо main общий. Да и если запихнуть - он выдаст то что внутри, а мне надо вместе с ним, я хочу это потом в файл записать..
Т.е. вот у меня есть intVal1 = 3
Я меняю значение на 123, теперь мне надо в конфиг-файле перезаписать это значение. Как взять только те данные что находятся в конфиг-файле по-умолчанию - я не понимаю, есть root(), но он возвращает вообще всё, а мне нужно только то что лежит в конфиге....

Dmitriy
11.01.2017
17:27:53
ты хочешь менять конфиги из кода?

Anatoliy
11.01.2017
17:29:36
ты хочешь менять конфиги из кода?
У меня пользователь должен иметь возможность менять данные в приложении, типа логин, еще всякое разное, но при этом рестартать приложение нельзя. Я могу конечно взять тот же SQLite, но не уверен что это хорошая идея. А заставлять пользователя лезть в сами конфиги - не есть хорошо.
Так что да, хочу менять конфиг из кода.

Anatoliy
11.01.2017
17:30:25
Будет два конфига, внутренний по-умолчанию, и внешний. Если во внешнем что-то не заполнено - берется значение из внутреннего.

Dmitriy
11.01.2017
17:31:15
мы для такого consul kv используем, есть базовый конфиг, а все что может менятся в рантайме - в другой базе\сервисе

Nikolay
11.01.2017
17:31:16
Мне кажется что использовать для этого файловые конфиги - не самое лучшее решение

Anatoliy
11.01.2017
17:32:30

Dmitriy
11.01.2017
17:32:49
локальная БД

Anatoliy
11.01.2017
17:33:32

Dmitriy
11.01.2017
17:34:08
в том что приложение не надо рестартить и ты сможешь перезапрашивать рантайм конфиг в случае изменения данных

Ivan
11.01.2017
17:34:33

Google

Ivan
11.01.2017
17:34:39
бд

Anatoliy
11.01.2017
17:34:51
например h2
чем лучше? с конфига один раз прочитали - и всё, оно в памяти. а с БД читать надо каждый раз. ну или возвращаемся к тому с чего начинали

Dmitriy
11.01.2017
17:36:32
пиши в другой файл тогда, сам будешь его перечитывать периодически
локальная БД это тоже локальный файл но с навернутой абстракцией для удобства работы

Ivan
11.01.2017
17:37:29

Anatoliy
11.01.2017
17:37:35

Dmitriy
11.01.2017
17:37:38
если не хочешь дергать базу каждый раз - закешируй до момента изменения, в чем проблема

Admin
ERROR: S client not available

Nikolay
11.01.2017
17:38:02
То что приложение десктопное и видимо для одного пользователя - хорошее уточнение. Тогда может и конфиг нормально подойдёт.

Anatoliy
11.01.2017
17:38:25

Dmitriy
11.01.2017
17:38:52
http://stackoverflow.com/questions/25280040/what-is-a-good-way-to-implement-reloading-of-a-typesafe-config

Nikolay
11.01.2017
17:40:06
Посмотри функции в духе withFallback в typesafe config - там есть кажется возможность получить данные только из конкретного файла

Anatoliy
11.01.2017
17:40:35
хотя щас смотрю - возможно именно из за него оно и выдает кучу лишних данных, сеёчас буду проверять
Спасибо за подсказку

Ivan
11.01.2017
17:44:09
ты можешь загрузить любой другой конфиг отдельно насколько я помню, там есть другие функции для парсинга конфига не только .load()

Anatoliy
11.01.2017
17:45:22
В общем если кому интересно. Ошибка была в том что ConfigFactore.load возвращает не только значения из конфиг файла, но и еще кучу данных. Соответственно либо не использовать load и грузить конкретно значения из нужного конфига, либо использовать
config.root().withOrigin(defaultConfig.origin()).toConfig
что даст аналогичиный результат

Google

Nikolay
11.01.2017
18:02:38
Ещё кстати ты можешь свой конфиг поместить под namespace "userConfig" например, и делать ConfigFactory.load.getConfig("userConfig")
Тогда тебе будет все равно, какие ещё конфиги были подгружены

Anatoliy
11.01.2017
18:04:28
Это тоже знаю. Сейчас пытаюсь понять как сделать кто бы комментарий оставался если слияние идет двух комментов или если изменяется существующее значение уже имеющее комментарий

Mikhail
11.01.2017
18:53:49
А зачем тебе менять комментарий? Странно как-то. Вобще не трогай дефолтный конфиг. Его используй в фолбеке для ридонли

KrivdaTheTriewe
11.01.2017
18:54:48
Действует ли у вас запрет на использование scalaz в команде?

Mikhail
11.01.2017
18:54:51
Никто не мешает использовать отдельный файл пользовательский который в который ты будешь писать. И есть отдельные методы parseFileOrString ( или как он там), чтобы конкретный файл(текст) парсить в конфиг и фолбеком подключать дефолт

Nikolay
11.01.2017
19:07:24
parseString помнится есть

Nikita
11.01.2017
19:09:16
Ну не то что запрет, но крайне не одобряется
Он только в одном месте используется, для валидации json
Весьма удобно получается кстати

Wystan
11.01.2017
19:10:56
индусы, использующие клейсли

KrivdaTheTriewe
11.01.2017
19:27:19
Ну все таки
Про скалази

Anton
11.01.2017
19:42:05
Как написать реактивный драйвер к бд? )
Хочу попробовать к тарантулу написать, не знаю как подступиться

Andrey
11.01.2017
19:44:34

Michael
11.01.2017
20:09:46
Ну в целом совет рабочий ??

Alex
11.01.2017
20:10:18
рабоче-крестьянский