Size: a a a

Scala User Group

2021 March 22

v

vaan in Scala User Group
Alexandr Myshansky
Мне вот интересно в чем смысл этих ботов. Они ведь ничего не рекламят как обычные надоедливые боты. Сканят группы чтобы профили пользователей составлять что ли?
Может собирают инфу для рекламных рассылок.
Спамеры в тлг умеют в личку писать.
источник

DS

Dimas Shakhtarin in Scala User Group
Что-то не получается справиться с функцией writeAll в fs2. Я даю на вход список файлов (List[File]) и ожидаю, что после фильтрации у меня запишутся только те файлы, который соблюдают условие. Но создаются у меня абсолютно все файлы.
(for {
     file <- files
     name = file.getName
   } yield Files[IO]
     .readAll(file.toPath, 4096)
     .through(text.utf8Decode)
     .map {
       case "some" ⇒
         Some("some")
       case _ ⇒
         None
     }
     .collect { case Some(s) => s }
     .through(text.utf8Encode)
     .through(Files[IO].writeAll(outputDir.resolve(name + ".result")))
     .compile
     .drain).sequence
writeAll не лениво создаёт файл, а при создании пайпа? что-то это странно как-то
источник

EK

Evgenii Kuznetcov in Scala User Group
Dimas Shakhtarin
Что-то не получается справиться с функцией writeAll в fs2. Я даю на вход список файлов (List[File]) и ожидаю, что после фильтрации у меня запишутся только те файлы, который соблюдают условие. Но создаются у меня абсолютно все файлы.
(for {
     file <- files
     name = file.getName
   } yield Files[IO]
     .readAll(file.toPath, 4096)
     .through(text.utf8Decode)
     .map {
       case "some" ⇒
         Some("some")
       case _ ⇒
         None
     }
     .collect { case Some(s) => s }
     .through(text.utf8Encode)
     .through(Files[IO].writeAll(outputDir.resolve(name + ".result")))
     .compile
     .drain).sequence
writeAll не лениво создаёт файл, а при создании пайпа? что-то это странно как-то
Ну это ИМО не более странно, чем попросить создать файл с определенным контентом, а потом не найти этот файл.
источник

DS

Dimas Shakhtarin in Scala User Group
Evgenii Kuznetcov
Ну это ИМО не более странно, чем попросить создать файл с определенным контентом, а потом не найти этот файл.
я не понял мысль. Я беру список файлов, фильтрую по какому-то условию, обрабатываю и пишу потом только те, которые мне нужны. Что в этом странного
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
Dimas Shakhtarin
Что-то не получается справиться с функцией writeAll в fs2. Я даю на вход список файлов (List[File]) и ожидаю, что после фильтрации у меня запишутся только те файлы, который соблюдают условие. Но создаются у меня абсолютно все файлы.
(for {
     file <- files
     name = file.getName
   } yield Files[IO]
     .readAll(file.toPath, 4096)
     .through(text.utf8Decode)
     .map {
       case "some" ⇒
         Some("some")
       case _ ⇒
         None
     }
     .collect { case Some(s) => s }
     .through(text.utf8Encode)
     .through(Files[IO].writeAll(outputDir.resolve(name + ".result")))
     .compile
     .drain).sequence
writeAll не лениво создаёт файл, а при создании пайпа? что-то это странно как-то
так у вас Files[IO].writeAll(outputDir.resolve(name + ".result") вот тут используется name из фора, нет?
источник

DS

Dimas Shakhtarin in Scala User Group
ну да, а как это влияет на что-то?
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
ну вот Files[IO]
     .readAll(file.toPath, 4096)
читает стрим каких-то элементов, дальше этот стрим как-то преобразуется, фильтруется, а потом этот стрим пишется в файлик, даже если в нем отфильтровалось все
Ну и так для каждого file в files. Где тут не должен файл создаваться?
источник

EK

Evgenii Kuznetcov in Scala User Group
Dimas Shakhtarin
я не понял мысль. Я беру список файлов, фильтрую по какому-то условию, обрабатываю и пишу потом только те, которые мне нужны. Что в этом странного
Вы не хотите создавать файл, если стрим пустой. Это не странное желание.
Но writeAll - это библиотечная функция. Вы удивляетесь, что она работает не так. Ну я утверждаю, что создавать пустой файл для нее - нормальное поведение. Если его изменить, то удивленных людей будет не меньше, а больше.
источник

DS

Dimas Shakhtarin in Scala User Group
ну то есть при компиляции этого стрима оно заранее создаёт все файлы, ясно
источник

f

folex in Scala User Group
то есть не смотря на `.collect { case Some(s) => s }` выполнение всё равно пройдет в through? Ого
источник

DS

Dimas Shakhtarin in Scala User Group
folex
то есть не смотря на `.collect { case Some(s) => s }` выполнение всё равно пройдет в through? Ого
ну как я понимаю, выполнение не пройдёт, но создание файла идёт в рамках создания самого стрима. Хотя я могу ошибаться конечно
источник

DS

Dimas Shakhtarin in Scala User Group
но лично мне это не выглядит логичным
источник

M

Mikhail in Scala User Group
folex
то есть не смотря на `.collect { case Some(s) => s }` выполнение всё равно пройдет в through? Ого
источник

f

folex in Scala User Group
м? Стоит обернуть весь стрим в resource чтобы отложить создание файла?
источник

EK

Evgenii Kuznetcov in Scala User Group
Dimas Shakhtarin
но лично мне это не выглядит логичным
write(stuff, fileName)
val data = read(fileName)
assert(data == stuff)

- это довольно приятное свойство. Оно не будет выполняться, если не создавать файл, когда stuff пустой
источник

DS

Dimas Shakhtarin in Scala User Group
ну в моём стриме как бы до write вообще не доходит по идее
источник

M

Mikhail in Scala User Group
folex
м? Стоит обернуть весь стрим в resource чтобы отложить создание файла?
я не использую фс2, не знаю как именно он устроен и могу ошибаться, но writeAll генерирует Stream.resource и в доках есть такая строчка
FS2 takes care to guarantee that any resources allocated by the Pull are released when the stream completes
- посему я делаю вывод, что данный этап работает по принципу пулл - значит, что он сам спрашивает нет ли там новых данных и логика fs2 такова, что ресурс  инициализируется через уже привычный паттерн брекетов до того как спросить и убедиться есть ли там чего.
источник

EK

Evgenii Kuznetcov in Scala User Group
Dimas Shakhtarin
ну в моём стриме как бы до write вообще не доходит по идее
В каком смысле не доходит?
Код делает files.map(file => ...)
Для каждого файла (пустого или нет) создается стрим (возможно пустой) и записывается в соответствующий файл
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Dimas Shakhtarin
ну как я понимаю, выполнение не пройдёт, но создание файла идёт в рамках создания самого стрима. Хотя я могу ошибаться конечно
выполнение пройдёт же, просто в файл поступит 0 байт
источник

DS

Dimas Shakhtarin in Scala User Group
Oleg ℕizhnik
выполнение пройдёт же, просто в файл поступит 0 байт
понятно. спасибо
источник