
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

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 в каком-то месте - можно получить случайно выход там, где не ждешь