@scala_ru

Страница 160 из 1499
Mikhail
13.10.2016
18:43:47
мне проще потратиться на десяток таких нод и получить честный канал в 1 гигабит, а потом обрабатывать и крутить данные уже на машинках хороших многоядерных физиках

с каждым десятком соответственно экономия на лицо и хлеб с маслом)

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

Igor
13.10.2016
19:52:03
https://asynchttpclient.github.io/async-http-client/request.html есть API для принятия чанков ответа

Google
Igor
13.10.2016
19:56:48
Некоторые либы (тот же WS) для простоты сохраняют весь респонс в памяти из-за того, что основной юз-кейс работы с ними – это манипуляции с ответом. Но никто не запрещает работать с чанками напрямую, аллоцируете фиксированый байтовый массив, FileOutputStream и погнали

Vladimir
13.10.2016
19:56:49
его в Play в качестве дефолтного клиента запилили, кстати

т.е. под капотом WS вот оно

Igor
13.10.2016
19:57:16
Да я вот как раз смотрю как они соединены

Используется AsyncCompletionHandler который буфферизирует респонс

Есть даже ResumableRandomAccessFileListener, используя который вместе с ResumableAsyncHandler сходу умеет асинхронно почанково сохранять файлы

https://jfarcand.wordpress.com/2011/01/04/going-asynchronous-using-asynchttpclient-the-complex/

CURL'у привет

Mikhail
14.10.2016
05:06:02
тогда уж cURL'у скорее))

Daniel
14.10.2016
10:12:41
на фоне

Alex
14.10.2016
10:14:07
а что этро

Denis
14.10.2016
10:14:30
http://jokerconf.com

Lxk
14.10.2016
12:19:26
коллеги подскажите пожалуйста на сколько это идиотизм или нет

Google
Lxk
14.10.2016
12:19:43
def getResultFields(fieldName: String, qRes: List[SObject]): List[Option[String]] = { qRes match { case Nil => List() case x :: xs => Option(x.getChild(fieldName)) match { case Some(y) => Option[y.getValue.asInstanceOf[String]] :: getResultFields(fieldName, xs) case _ => List() } } }

дело в том что у точно имеет поле getValue

Mikhail
14.10.2016
12:20:46
что такое qRes ?

Lxk
14.10.2016
12:20:49
но компилятор жалуется

Mikhail
14.10.2016
12:21:09
оффтопчик, просто название не о чем)

Lxk
14.10.2016
12:21:09
список обьектов форса

ок ^^

Mikhail
14.10.2016
12:22:35
а что возвращает Option(x.getChild(fieldName))

и первый раз вижу, чтобы писали Option(some)

используют же как Some(value) или None

а еще непонятно про Option[] а внутри ты ему значение вместо типа кидаешь

Lxk
14.10.2016
12:24:23
бля!

Wystan
14.10.2016
12:24:29
Lxk
14.10.2016
12:24:32
спасибо, да в этом дело =)

Wystan
14.10.2016
12:24:39
на правах общего троллинга, конечно.

Dmitry
14.10.2016
12:25:10
Коллеги, есть среди вас знатоки gradle?

Lxk
14.10.2016
12:25:11
не вопрос =)

def getResultFields(fieldName: String, qRes: List[SObject]): List[Option[String]] = { qRes match { case Nil => List() case x :: xs => Option(x.getChild(fieldName)) match { case Some(y) => Option(y.getValue.asInstanceOf[String]) :: getResultFields(fieldName, xs) case _ => List() } } }

вот теперь по стилю троллинг приветствуется

Wystan
14.10.2016
12:25:39
qRes match { case Nil => List() case x ну типа for { head <- qres.headOption; … }

Google
Mikhail
14.10.2016
12:25:50
оказывается у опшина есть апплай, почему-то никогда его не замечал) век живи, век учись)

Wystan
14.10.2016
12:26:33
а там xs тоже используется. надо думать. щааа открою такой воркшит и подумаю еба

Lxk
14.10.2016
12:26:55
гы сорри, нубостайл

как одерский в курсе научил делать все с первых принципов вместа библиотеки так и пишем...

Nikita
14.10.2016
12:27:52
Как минимум хорошо бы хвостовую рекурсию тут использовать def getResultFields(fieldName: String, qRes: List[SObject], acc: List[Option[String]] = Nil): List[Option[String]] = { qRes match { case Nil => Nil case x :: xs => Option(x.getChild(fieldName)) match { case Some(y) => getResultFields(fieldName, xs, Option(y.getValue.asInstanceOf[String]) :: acc) case _ => Nil } } }

Lxk
14.10.2016
12:27:54
дело в том что fieldName и getValue могут вернуть nullpointer

Mikhail
14.10.2016
12:27:59
qRes - что такое q? что такое Res - Response, Resources? - обфусцируй как бог)

Lxk
14.10.2016
12:28:08
queryResponse

там же тип указан, думаю не важно как ее назвать =)

сферический лист с обьектами

Nikita
14.10.2016
12:29:09
btw: А есть ли вообще смысл в List[Option[String]]? Почему не просто Seq[String]?

Lxk
14.10.2016
12:30:15
в результате прилетел null - List(None, Some(Vasiliy Yur), Some(Kirill Avramenko))

Lxk
14.10.2016
12:30:32
я решил засунуть в Option на всякий

там обьекты кастомные - нет на них описания полей

Anatoliy
14.10.2016
12:31:47
А зачем в List[String] пихать None?

Nikita
14.10.2016
12:32:03
Я бы не использовал Option тут, смысла нет def getResultFields(fieldName: String, qRes: List[SObject], acc: List[Option[String]] = Nil): List[String] = { qRes match { case Nil => Nil case x :: xs => Option(x.getChild(fieldName)) match { case Some(y) => getResultFields(fieldName, xs, Option(y.getValue.asInstanceOf[String]),map(v => v:: acc).getOrElse(acc)) case _ => Nil } } }

Lxk
14.10.2016
12:32:52
аа интересно, спасибо

по поводу хвостовой - селект ограничен 100 результатами, но наверное не правильно такие вещи оставлять невявными

потом разограничят и будут думать почему упало =)

Mikhail
14.10.2016
12:34:44
Google
Mikhail
14.10.2016
12:35:23
по поводу хвостовой - селект ограничен 100 результатами, но наверное не правильно такие вещи оставлять невявными
хвостовой рекурсии все равно сколько результатов. на то она и хвостовая, что компилятором раскладывается в обычный цикл

Wystan
14.10.2016
12:35:50
зачем там вообще рекурсия.

Mikhail
14.10.2016
12:36:33
Some ему не подойдет, там нулл же может быть он писал вроде

Lxk
14.10.2016
12:36:43
ага

на getValue

Wystan
14.10.2016
12:36:55
ну поставлю там Option

Option(null) = None

Admin
ERROR: S client not available

Wystan
14.10.2016
12:37:33
Some(null) = смешная скала-шутка

Mikhail
14.10.2016
12:38:02
немного ничего

Lxk
14.10.2016
12:38:26
мб вообще тогда лучше exception ловить и Either?

Nikita
14.10.2016
12:39:44
Тогда уж лучше Try()

Но возвращать придется Seq[Try[String]], что опять же имеет смысл, если ты хочешь эти ошибки как-то обработать

Lxk
14.10.2016
12:41:04
логировать если только

а в чем смысл использовать Seq вместа List в таком случае? он же просто выше

Mikhail
14.10.2016
12:42:46
Option(x.getChild(fieldName)) match { case Some(y) => getResultFields(fieldName, xs, Option(y.getValue.asInstanceOf[String]),map(v => v:: acc).getOrElse(acc)) case _ => Nil } а вобще, меня очень сильно смущает алгоритм который вроде бы выполняет функцию map, но при этом решение о продолжении принимает либо по окончанию входящего списка, либо по другому условию с размером входящего списка не связанному

Nikita
14.10.2016
12:43:40
@theLXK ни в чем на самом деле, по привычке написал :)

Mikhail
14.10.2016
12:44:07
у тебя же Option(x.getChild(fieldName)) - может нулл вернуть и ты выйдешь из функции, хотя во входящем списке еще тонна элементов останется

странно как-то все

Google
Lxk
14.10.2016
12:44:55
ага согласен

вообще наверное проще удалить и писать с нуля мэпом чтоб не зацикливатся

no pun intended

Mikhail
14.10.2016
12:45:41
я бы начал с нормального названия метода, который бы отражал что он в действительности делает

затем переменные и результат на выходе, а потом может и тело метода станет совсем другим)

Wystan
14.10.2016
12:46:10
def chickiBrikiIVDamki(chiki: Briki): Damki

Nikita
14.10.2016
12:46:47
Mikhail поддержу, тут надо с логикой сначала разобраться, а потом уже с кодом

Lxk
14.10.2016
12:46:48
?

Wystan
14.10.2016
12:47:40
прям сразу вспомнились студенческие годы и дебиан на трех дисках

Lxk
14.10.2016
12:48:02
ок, спасибо за идеи

алтернатива вот такой чудесный скала код https://github.com/rajdeepd/force-rest-scala

class Util { def getAccessToken() : String = { val login = "https://login.salesforce.com/services/oauth2/token" var access_token = "" try { val conf = ConfigFactory.load() val UserName = conf.getString("force.UserName") val PassWord = conf.getString("force.PassWord") val LoginURL = conf.getString("force.LoginURL") val GrantService = conf.getString("force.GrantService") val ClientID = conf.getString("force.ClientID") val ClientSecret = conf.getString("force.ClientSecret") val loginURL = LoginURL + GrantService + "&client_id=" + ClientID + "&client_secret=" + ClientSecret + "&username=" + UserName + "&password=" + PassWord val client = new DefaultHttpClient val post = new HttpPost(loginURL) val handler = new BasicResponseHandler(); val response = client.execute(post) println("response:" + response) val body = handler.handleResponse(response); println(response) val gson = new Gson val jsonObject = gson.fromJson(body, classOf[Token]) access_token = jsonObject.access_token println("access_token: " + access_token) } catch { case ioe: java.io.IOException => case ste: java.net.SocketTimeoutException => } return access_token } }

Wystan
14.10.2016
12:53:59
я вдруг понял что SO - это первывй буквы SOAP. прям как на картинках when you understand you shit the brick

Mikhail
14.10.2016
12:55:21
в скале про return вобще лучше забыть

Lxk
14.10.2016
12:55:33
да тав вообще скала

только в название либы

Mikhail
14.10.2016
12:55:42
есть такой нюанс, что оно реализовано через Exception)

Lxk
14.10.2016
12:55:49
;

Mikhail
14.10.2016
12:56:09
и при определенной композиции функции и использовании return в каком-то месте - можно получить случайно выход там, где не ждешь

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