18 February 2019
Ruslan Ibragimov converted a basic group to this supergroup «Kotlin Start»
RI
15:46
Ruslan Ibragimov
Ruslan Ibragimov pinned this message
V
20:39
Vitaliy
Здравствуйте и привет ссылка на сайт непривет) Скажите, а в кторе Clients, это для фронтенд?
AM
20:39
Andrew Mikhaylov
В точку.
A
20:39
Alex
In reply to this message
Не обязательно. Ты же на сервере можешь куда посылать хттп запросы ещё
20:39
In reply to this message
Мимо
RI
20:40
Ruslan Ibragimov
Ну Clients тут имеет смысл Http Server/Client. А вот Client уже может быть и на сервере, и на мобильном телефоне и на страничке на фронте
AM
20:40
Andrew Mikhaylov
In reply to this message
Я не думаю, что человека сильно интересует коммуникация между сервисами в рамках кластера, но в целом неправ, согласен.
V
20:42
Vitaliy
Так то прочёл со своим плохеньким английским, что то про сторонние сервисы, но зачем разделено на серверс и клиентс, не въехал.
AM
20:42
Andrew Mikhaylov
In reply to this message
Клиент -- штукая которая умеет делать хттп запросы, сервер -- отвечать на них.
A
20:46
Alex
In reply to this message
Почему в рамках кластера то? Куча бекендов делают запросы во вне, это очень распространенная практика
20:46
Ну там поступаться в АПИ Амазона/ВКонтакте/Гугла и ТД
AM
20:47
Andrew Mikhaylov
Ладно, сдаюсь, я совсем уже к вечеру сварился и несу чушь.
A
20:47
Alex
In reply to this message
Надо отложить телегу в сторону 😀👍🏻
AM
20:47
Andrew Mikhaylov
In reply to this message
Однозначно.
19 February 2019
ВК
11:13
Вячеслав Колесников
Всем привет

companion object {
const val EXTRA_MESSAGE = "message"
}

Тут нужно писать const или так как и так static + val - уже все хорошо?
11:13
Работает и так и так
RI
11:15
Ruslan Ibragimov
Зависит от определения "все хорошо". То что код компилируется и работает вполне подходит под это определение.
AM
11:16
Andrew Mikhaylov
Разница в том, что если есть const, то строка подставится во всех местах, где к ней обращение идёт, если нету, то так и останется ссылка на переменную. На программу это почти не влияет, но хорошим тоном будет поставить const, если не требуется трогать поле рефлексией.
ВК
11:16
Вячеслав Колесников
Понял, спасибо
SG
11:21
Stan Glickman 🅴
val client: HttpClient = HttpClient {
install(JsonFeature) {
serializer = KotlinxSerializer(Json.nonstrict).ignoreOutgoingContent()
}
}

Вызываю client.get (в ktor) и получаю

I/System.out: Strict JSON encountered unknown key: exception
You can disable strict mode to skip unknown keys
RI
11:23
Ruslan Ibragimov
Попробуй сделать get<String> , там скорее всего JSON который ты не ожидаешь
AM
11:23
Andrew Mikhaylov
С вопросами по bleeding edge вещам типа сериализации я бы точно в основу ходил, вряд ли тут многие с этим работали :) Но выглядит странно, при учёте, что ты явно взял nonstrict.
SG
11:24
Stan Glickman 🅴
In reply to this message
итак уже
client.get<String>
11:24
¯\_(ツ)_/¯
11:24
In reply to this message
ок, спс
AM
11:25
Andrew Mikhaylov
А что там вообще в респонсе приходит? Если попробовать вытянуть респонс и в отрыве от ктора его десериализовать, будет та же картина?
SG
11:25
Stan Glickman 🅴
Ну в респонсе есть вещи, которые мне не нужно десериализовывать)
11:25
Если я буду все десериализовывать, у меня дата класс будет огромный
AM
11:26
Andrew Mikhaylov
Ну эт я понял. Просто интересно, может ли ктор на это влиять или это исключительно с сериализацией странности.
11:27
Как минимум поможет в правильную репу багрепорт написать, если до этого дойдёт :)
SG
11:31
Stan Glickman 🅴
О, сорри за беспокойство, разобрался, мой косяк был

Я сначала распарсил все верно, а потом как раз-таки в отрыве от Ktor десерализовывал ЕЩЕ РАЗ из стринги, то есть потом еще вызывал
val json = Json.nonstrict.parse(
deserializer = RoomModel.serializer().list,
string = result
)

println(json)

callback.invoke(json)
AM
11:31
Andrew Mikhaylov
Хорошо, что решилось :)
SG
12:53
Stan Glickman 🅴
Так, вот сейчас снова вопрос уровня /b/

Нужен Serializable data class, который наследуется (!) от интерфейса (протокола?)

Такая запись не срабатывает:

@Serializable
data class User: RoomProfile(
@SerialName("id")
val userID: String,
) {
override val profileID: String
get() = userID
}
13:02
разобрался, спс
A
13:20
Alex
In reply to this message
Ну так и спрашивай в б 😀
13:24
In reply to this message
ну и кстати как решилось?
SG
13:25
Stan Glickman 🅴
In reply to this message
@Serializable
data class User(
@SerialName("id")
val userID: String,
): RoomProfile {
override val profileID: String
get() = userID
}
A
13:33
Alex
In reply to this message
а ну конечно, предудущий вариант у тебя даже не скомпилируется - некорректный синтаксис
В
15:41
Вафель
In reply to this message
А тут не нужно указать чтобы profileID не сериализовался?...
SG
16:24
Stan Glickman 🅴
In reply to this message
так, дошел до запуска, а как это сделать?)
OY
16:26
Oleg Yukhnevich
@Transient что ли
16:28
In reply to this message
и есть предположение, что проперти с гетерами не сереализуются, но нет возможности проверить сейчас
В
16:30
Вафель
In reply to this message
Тоже об этом подумал
SG
16:33
Stan Glickman 🅴
In reply to this message
Field 'profileID' is required, but it was missing
16:38
In reply to this message
мерси
SS
22:22
Sergey Sverdlov
Вот пишу я плагин для Photoshop'a на C++. Фотошоп предоставляет плагину ссылку на начало массива, содержащего исходное изображение и ссылку на начало выходного изображения. Картинка хранится в памяти "плоско". Как-то так: RGBRGBRGB...RGB. R, G и B бывают 8-разрядными, а бывают 16-разрядными. Присваиваю эти ссылку "типизированным" указателям, которые определены так:

struct tRGB { // для 8-битного представления
uint8 R, G, B;
};

struct tRGB16 { // для 16-битного
uint16 R, G, B;
};

struct tRGB *inDataRGB, *outDataRGB; //указатели для 8 бит
struct tRGB16 *inDataRGB16, *outDataRGB16; //указатели для 16 бит

// Присваиваем
inDataRGB = (tRGB*)param->inData;
outDataRGB = (tRGB*)param->outData;
inDataRGB16 = (tRGB16*)param->inData;
outDataRGB16 = (tRGB16*)param->outData;

Обработка для 16-битной картинки идля 8-битной совершенно одинакова и выполняются функцией

template <typename tData>
void Process(tData inData, tData outData)

и вызывается так

Process(inDataRGB, outDataRGB); // для 8-битной картинки

или так:

Process(inDataRGB16, outDataRGB16); // для 16-битной картинки

Я так понимаю, что в Котлине так не сделать. Потому что:
1. Не может быть массива структур (а не массива указателей на...)
2. generic с ByteArray, ShortArray не работает и придется писать два одинаковых варианта обработки для 8 и 16 бит.

Возможен вариант с Array<Byte>, Array<Short> или чем-то вроде Array<RGB>, но это все будет массив из ссылок и будет неэффективно. Вопрос, разумеется, не о том, что собрался на Котлине плагин писать. А возник вопрос потому, что неожиданно обнаружил, что generic в Си++ и Котлине это совсем не одно и то же.
AM
22:28
Andrew Mikhaylov
In reply to this message
В Java NIO есть ByteBuffer, из которого можно читать и в который можно писать примитивы разного размера, плюс в Котлине планируется нечто похожее в рамках kotlinx-io, насколько мне известно, но это ещё в разработке.
Дженерики Kotlin выросли из дженериков JVM, которые действительно отличаются от шаблонов C++. C++ на каждый новый набор шаблонных параметров инстанции унт совершенно новый тип, JVM же имеет один тип, не зависящий от параметров дженерика, причём в рантайме информация о типе дженерика стирается. У обоих решений есть свои плюсы и минусы.
22:31
С одной стороны, partial specialization шаблонов даёт огромную гибкость в сравнении с дженериками, с другой именно из-за такой реализации ещё ни один язык не обеспечил человеческий интероп с C++.
SS
22:33
Sergey Sverdlov
In reply to this message
Ок. Много незнакомых слов. Но, вроде, я ситуацию понял правильно.
22:34
Вчера нечаянно заглянул в реализацию sort. Оказалось, что для всех примитивных типов сортировки выписаны индивидуально!
В
22:34
Вафель
In reply to this message
Я возможно не в теме, но разве дженерики в C# не работают примерно также как шаблоны в C++? На каждый вариант генерируется свой класс...
Вроде шарписты не жалуются на них...
AM
22:42
Andrew Mikhaylov
In reply to this message
Да, это отдельное увлекательное место джавы и котлина. Там и массивы примитивов реализованы такой копипастой, и стримы (есть просто Stream<T>, а есть IntStream, FloatStream и т.д.). Ограничения платформы есть ограничения платформы, к сожалению.
22:45
In reply to this message
Дженерики в C# работают так же, просто в них нет type erasure. Когда в джаву добавляли в 1.5 дженерики, ради совместимости со старым кодом решили оставить старые коллекции, которые в то время работали с Object, потому, собственно, типы и стираются, а в C# завели совершенно новый набор типов на коллекции, деприкейтнув старый.
SS
22:46
Sergey Sverdlov
In reply to this message
И что любопытно - для примитивных типов там QuickSort, а для ссылочных - нет. Потому что для примитивных устойчивость сортировки не важна, а для ссылочных - важна.
22:49
Я правильно понимаю, что функции высшего порядка в Котлине - это переменные процедурного типа, как это называется, например, в Виртовских языках?
AM
22:51
Andrew Mikhaylov
In reply to this message
Ну если я правильно нагуглил, что такое переменные процедурного типа, то да. Для любой функции можно взять ссылку на неё, сохранить в переменную, передать её в другую функцию и вызвать её по ссылке.
SS
22:52
Sergey Sverdlov
А ведь как понятно "процедурный тип" и как туманно "функции высшего порядка"
22:54
А лямбды - это как бы литералы процедурного типа?
AM
22:54
Andrew Mikhaylov
В котлине это называется функциональный тип (function type). Понятие "функции высшего порядка" -- это общепринятый термин, не связанный исключительно с котлином.
22:54
In reply to this message
Именно.
SS
22:57
Sergey Sverdlov
In reply to this message
Про общепринятый догадываюсь. Хотя такая терминология мне непривычна.
22:58
In reply to this message
Вот Вы меня реально порадовали. Значит, все правильно понимаю. :)
В
23:04
Вафель
In reply to this message
Лол, а мне шарпист затирал что дженерики в шарпе — компайл тайм... но в доке вроде написанно что они таки рантайм.
AM
23:04
Andrew Mikhaylov
In reply to this message
В целом если в языке есть функциональные типы, то всё остальное вокруг них будет реализовано походим образом, именование -- дело третье. Показательным примером был C++ до 11-го стандарта. Вроде и ссылки на функции были, но полноценных функциональных типов не было, а захватывать значения приходилось классами-функторами, явно передавая их в конструктор. В общем, решение просилось, но возможностей язык не предоставлял. Лямбды из этого вырасли довольно органично :)
В
23:05
Вафель
Функции вышего порядка это функции оперирующие над функциями, т.е. функции принимающие одним из параметров другую функцию (функциональный тип), имхо, достаточно безполезный термин
AM
23:08
Andrew Mikhaylov
Джаве, кстати, "расти" до лямбд было проще, потому что анонимные классы и так уже умели захватывать переменные из внешней области видимости. Потому лямбды в ней -- синтаксический сахар над анонимными классами.
23:10
А вот котлин со своими инлайн-функциями сделал большой шаг вперёд, сохраняя семантику, но заметно улучшая производительность за счёт уменьшения количества создаваемых объектов.
23:16
In reply to this message
При описании функциональной парадигмы надо же одним словом как-то назвать все эти map, flatmap, reduce и иже с ними, вот и придумали общий термин. :)
SS
23:21
Sergey Sverdlov
In reply to this message
Это, в общем, нехитрая ситуация. Возможность процедуре (или функции) иметь параметром процедуру или функцию была еще в исходном виртовском Паскале (что-то около 1970 года). И даже вспоминается передача параметров "по наименованию", которая была в Алголе-60, но потом от этого отказались. Которая что-то сильно мне напоминает лямбды.
AM
23:27
Andrew Mikhaylov
In reply to this message
Неподкреплённая догадка, но вряд ли тогда речь шла о замыканиях. Всё же лямбды в подавляющем большинстве нынешних языков могут зависеть не только от прямо объявленных формальных параметров, но и от значений в своём лексическом контексте, что заметно отличает их от обычных функций, ссылки на которые можно передавать в другие функции.
23:29
Эта разница очень хорошо видна в процедурных API, где происходит работа с коллбеками. Часто коллбек принимает дополнительный условный void*, в который окольными путями можно передать дополнительные данные. Это как раз то, чего позволяют избежать замыкания.
SS
23:29
Sergey Sverdlov
Меняем тему. В чем отличие run от with? Пишу пограмму, вдруг IDE предлагает run употребить. Я понятия не имею,что это. Но соглашаюсь. Ага, теперь можно не писать много раз имя одного и того же объекта. Потом читаю документацию, оказывается, что и with имеется. Знакомое слово. Меняем run на with - все как работало, так и работает.
23:30
In reply to this message
Не возьмусь что-то конкретное сказать, но вспоминается, что про вызов по наименованию была дискуссия по поводу контекстов.
AM
23:32
Andrew Mikhaylov
In reply to this message
Технически разница лишь в способе вызова -- obj.run { this.action() } против with(obj) { this.action() }. Дальше семантика, но я не берусь сейчас приводить примеры, когда логичнее писать одно, когда -- другое, всё же смартфон накладывает определённые ограничения.
В
23:32
Вафель
In reply to this message
Самое простое с with/let/run/also/etc это нажать ^B и пойти в исходники, они все очень простые
AM
23:33
Andrew Mikhaylov
Ну и да, run позволяет делать nullableObj?.run { ... }, что вызовет блок, только когда значение не null.
23:34
In reply to this message
Спорно, по одним исходникам непросто понять, когда что применять, функции очень похожи всё-таки. Была пара хороших шпаргалок в сети, надо поискать.
SS
23:35
Sergey Sverdlov
In reply to this message
Не люблю ходить в исходники. Предпочитаю что-то прочитать на естественном языке. К тому же, в этих исходниках (кажется, я там даже бывал) наверняка на всю мощь задействованы все средства языка, которые я не все понимаю.
AM
23:36
Andrew Mikhaylov
Вот тут есть дерево решений, помогающее на первых порах в выборе.
23:36
В
23:36
Вафель
In reply to this message
Ну хз, если мне надо понять как работают подобные штуки я сразу бегу в исходники, мне так тупо проще ¯\_(ツ)_/¯

Правда у меня обычно обратная проблема — вспомнить какое слово было выбранно для вызова который мне нужен
AM
23:38
Andrew Mikhaylov
In reply to this message
Когда ты их уже несколько раз потыкал и надо вспомнить -- это удобно, когда раньше в глаза не видел -- хрен ты там что поймёшь :)
В
23:39
Вафель
Возможно.
23:39
In reply to this message
Картинка классная 👍 Именно то что я искал (точнее не искал, но хотел)
21 February 2019
RR
10:44
Roman Roman
Как в IntelliJ idea скомпилировать .kt файл без main функции?
AM
10:45
Andrew Mikhaylov
А какую цель преследуете?
RR
10:45
Roman Roman
Сервлет хочу поробовать
10:46
Написал класс, хотел скомпилить, но у мня в classpath не находит "java.io"
AM
10:46
Andrew Mikhaylov
Кнопка с зелёным молотком собирает проект без запуска, дальше в build/output или out можно забрать собранный проект.
RR
10:47
Roman Roman
Так вот build не строит
AM
10:48
Andrew Mikhaylov
В чём это выражается? Gradle используете или нет?
RR
10:48
Roman Roman
Создавал "Новый проект - maven"
AM
10:48
Andrew Mikhaylov
Ага, мавен
10:48
А из терминала мавеном без идеи собрать получается?
RR
10:49
Roman Roman
не пробовал
10:52
почему через javac находится все, а через kotlin нет, это нормально?
AM
10:55
Andrew Mikhaylov
Нет, конечно же. Но без структуры проекта и команд, которые вы выполняете, трудно гадать, что идёт не так.
RR
10:56
Roman Roman
В общем через gradle собрал)
AM
10:56
Andrew Mikhaylov
Окей, тоже выход.
10:57
Я просто привык, что если люди создают мавен-проект, им гредл не по душе)
RR
11:01
Roman Roman
Мне консоль по душе) но что то с ней не все работают
AM
11:05
Andrew Mikhaylov
Дык Gradle тоже спокойно можно из терминальчика использовать.
RR
11:35
Roman Roman
TestingServlet.kt
Not included, change data exporting settings to download.
689 B
Пишу один и тот же код(с поправками на синтаксис) на java и kotlin. Но на kotlin вылетает ошибка
11:37
In reply to this message
RI
11:37
Ruslan Ibragimov
Видимо Kotlin Stdlib не попадает в war
11:37
Проверь как деплоится приложение
11:38
Да и честно говоря посоветовал бы не тратить время на application server/container, особенно сервлеты. А учить ktor/spring mvc
RR
11:40
Roman Roman
In reply to this message
Это считается багом?)
RI
11:41
Ruslan Ibragimov
Тут нет бага, ты просто неправильно деплоишь
RR
11:41
Roman Roman
In reply to this message
Да я так и сделаю, по нему документация в порядке для новечка?
11:42
In reply to this message
Я должен это где-то в gradle указывать?
RI
11:43
Ruslan Ibragimov
In reply to this message
Я сам war давно не собирал, но да, там вроде war плагин нужно подключить, еще что. Поищи туториалы, их полно должно быть для java, тут kotlin никак не отличается, просто еще одна зависимость в класспасе
11:43
In reply to this message
Для новичка не уверен, но документации по spring и ktor достаточно много
В
11:56
Вафель
Хм, такой вопрос по ktor'у: как можно установить ssl-сертификат для вебсервара?
Некоторое время назад искал про это инфу, но ничего не нашёл...
AM
11:59
Andrew Mikhaylov
RR
12:01
Roman Roman
Раз тут Kotlin Start)
При создании нового проекта "Kotlin" or "java" не создаются gradle файлы, как я понимаю, idea использует всю информацию из настроек проекта.
12:01
Ktor на kts пишут?
В
12:04
Вафель
In reply to this message
О, наверное это то что нужно, спасибо
AM
12:08
Andrew Mikhaylov
Либо, если это делоится куда-нибудь на AWS / DO / Azure etc, там везде есть load balancer, который умеет делать https termination, а уже по приватной сети от себя к твоему серверу гнать траффик по http. Сертификат в таком случае живёт в самом балансировщике, и как минимум DigitalOcean умеет самостоятельно запрашивать и renew-ить сертификат Let's Encrypt, если домен припаркован у них же. Может, и другие умеют, не проверял. Это настроить попроще, чем руками всё делать, но придётся доплачивать немного за балансировщик :)
12:08
In reply to this message
Там есть Gradle слева, а в нём уже можно выбирать Kotlin (JVM), к примеру.
12:10
In reply to this message
Kts -- это об интеграции Gradle + Kotlin Script речь или вообще о скриптах? Если первое -- то индифферентно, можно и груви, и котлин использовать, если второе -- то нет, сервер, написанный с применением Ktor -- это обычное JVM-приложение.
RR
12:14
Roman Roman
Второе) когда создаешь "Проект Котлин" можно по щелчку добавить файл kt, создал проект "Gradle" - можно только kts добавить, вот и вопрос был
AM
12:16
Andrew Mikhaylov
Потому что создавать надо гредл-проект. Выбор kts там -- это как раз переключалка между груви и котлином для гредла, и тут можно и то, и то использовать (новичку должно быть проще вкатываться с груви за счёт того, что с ним примеров в сети не счесть).
RR
12:22
Roman Roman
In reply to this message
Спасибо)
В
15:10
Вафель
In reply to this message
Хм, а если мне надо подцепить уже существующий, а не новый сгенерить?...

И как ктор понимает какой сертификат надо юзать, если мы только генерим его?...
15:11
In reply to this message
Да это понятно, можно хоть в nginx ssl поставить )
15:14
Btw, там в примере лишнее file.parentFile.mkdirs()
т.к. дериктории создаются в generateCertificate...
DY
15:17
Danil Y.
https://ktor.io/quickstart/guides/ssl.html думаю тут получше будет описание
15:18
если кратко, то надо сгенерить JKS файл из имеющегося сертификата, и его уже подусунуть ктору
AM
15:21
Andrew Mikhaylov
In reply to this message
Тогда можешь этот код вообще выбросить, сам конфиг, использующий сертификат, отвисает в application.conf
В
15:22
Вафель
Ага, тоесть задать ssl можно только через application.conf? Ясно.

А если я разрабатываю либу, ктор подхватит пользовательский application.conf?
RR
15:39
Roman Roman
Каким образом разворачивать ktor на сарвере,можно в общих чертах?
Возможно ли это упаковать в jar и запустить на бесплатном хосте(с минимальным доступом)?
AM
15:44
Andrew Mikhaylov
In reply to this message
Добавляйте плагин application и используйте таск distZip. На выходе получите архив, в котором в папке bin будет скрипт, запускающий приложение.
RR
15:46
Roman Roman
In reply to this message
Спасибо, буду пробовать
15:47
Нашёл хост, там через git требует загрузки. Так везде это принято?
AM
15:49
Andrew Mikhaylov
Без руля, я сто лет с таким не работал. А собирает оно само или через гит туда надо бинарники вываливать?
15:50
Не о хероку речь случаем? Я краем уха слышал, что они таким промышляют
RR
15:50
Roman Roman
Да да
15:50
Этот хост
A
15:52
Alex
In reply to this message
Есть ещё вариант shadowjar - все пакуется в один Джар и просто запускается
RR
15:52
Roman Roman
Даже и не думал, что бинарники надо, я так указывал. Залил на гитхаб проект который у меня работает и указал ссылку хосту.
AM
15:54
Andrew Mikhaylov
Мне тут рассказывали, что на shadow есть риск нагреться на проблемы
AM
15:54
Andrew Mikhaylov
AN
Alexander Nozik 04.01.2019 14:19:07
shadow - специфичная штука. Я бы не стал ее использовать в продакшене если нет жесткого ограничения по сингл джару. Лучше обычный distribution
15:54
AM
Andrew Mikhaylov 04.01.2019 14:20:26
А какие могут быть проблемы? Поставлять те же десктопные утилитки одним джарником заметно удобнее, чем архивом.
15:54
AN
Alexander Nozik 04.01.2019 14:32:19
Проблемы возникают с библиотеками, а конкретно с ресурс файлами. Скажем, если есть сервислоадеры, их надо не просто в одну кучу складывать, а умный мердж делать. Ну еще если хитрая борода из зависимостей.
RR
16:00
Roman Roman
In reply to this message
Ничего себе там наворотили)
А если не через git, то просто архив ставишь на хост?
16:03
Варианты гуглятся без особых проблем, было бы желание :)
RR
16:08
Roman Roman
Да есть желание, большое терпения бы ещё)
16:08
Дальше уж сам буду гулить😊
A
16:13
Alex
In reply to this message
ну это возможно да наверное, по обстоятельствам, для всяких микросервисов если ничего не мешает норм
22 February 2019
13:13
получается функция вне класса сразу статическая
13:13
так?
(
13:13
(
Да
AR
13:14
Andrei Ruban
In reply to this message
и получается пространство имен шире? то есть можно дергать ее откуда угодно или почти?
(
13:15
(
Все точно так же, как со статическими методами в джаве, просто для топ-левел функции в котлине пространством имен является файл
13:15
Статические методы тоже можно дергать откуда угодно
AR
13:16
Andrei Ruban
In reply to this message
спасибо!
В
14:30
Вафель
Хм, глупый вопрос, нельзя же заставить data class'ы, не принтить null значения?

Т.е.
data class A(val f1: Int, val fn: Int? = null)

fun main() {
println(A(1))
}


выводило не A(f1=1, fn=null), а A(f1=1) ?

А то когда много (10+) не обязательных полей, это превращается в боль...
AM
14:31
Andrew Mikhaylov
Нет, только оверрайд toString. Но можно написать плагин к компилятору :D
В
14:34
Вафель
Ужас какой... Оверрайдить toString(), это совсем ужас, а плагин к компилятору я наверное не осилю 🤔
14:34
Придётся пожить с таким :D
I
14:35
Ilmir
In reply to this message
Почему оверрайд toString'а - ужас?
AM
14:35
Andrew Mikhaylov
Увы. Помог бы pretty printing с отступами, но его тоже нету.
В
14:39
Вафель
In reply to this message
Очень много кода.
Примерно 70 классов, в некоторых по 44 поля (из которых 3 - обязательные)
AG
14:41
Anton Gushcha
In reply to this message
а запарится, настроить один раз темплейт и генерить как удобно?
В
14:43
Вафель
In reply to this message
А каких именно темплайтах вы говорите? Но вообще, если писать toString(), то конечно не руками (в данном случае)
I
14:43
Ilmir
Ну тогда работать с выходной строкой (не рекомендую, это очень похоже на хак, но для быстрого решения должно помочь): println(dataClass.toString().replaceAll(", [a-zA-Z]+=null", ""))
AG
14:43
Anton Gushcha
In reply to this message
если Idea то об этих
14:44
In reply to this message
Если нет, то незнаю но выход должен быть
В
14:46
Вафель
In reply to this message
спасибо
14:52
In reply to this message
Я уж тогда лучше просто сериалазнул в json, хотя бы понятнее будет что происходит 😀 kotlinx.serialization умеет игнорить дефолты. Правда на фоне того что конкретно это сообщение получается сразу после после десериализации, такое поведение будет очень странным...
SS
14:57
Sergey Sverdlov
In reply to this message
Не пакет?
В
14:57
Вафель
Тогда ещё вопрос:

Почему если принтить
val response = client.post<HttpResponse> {
... }
response.receive<String>()
(ktor), то вместо русских букв \uXXXX? При том что если десериализовать в обьект, то всё выглядит нормально?
SS
14:59
Sergey Sverdlov
In reply to this message
Я чего такого ужасного. Раз есть свои пожелания к выводу, то это очень естественно, мне кажется
В
15:00
Вафель
In reply to this message
выше уже писал, очень много кода, в самом оверрайде нет ничего плохого.
(
15:00
(
In reply to this message
Да, точно, пакет, прошу прощения
В
15:15
Вафель
In reply to this message
Я, если что, про такое
OY
15:29
Oleg Yukhnevich
In reply to this message
это проблема ктора вроде
такое же было
Сейчас скину, как обойти
15:34
suspend inline fun PipelineContext<*, ApplicationCall>.receiveUTF8Text(): String =
call.receiveChannel().toByteArray().toString(Charsets.UTF_8)

вот такой экстеншн для сервера
15:35
для клиента наверно что-то похожее
15:38
In reply to this message
response.content.toByteArray().toString(Charsets.UTF_8)
- вот для клиента
SG
15:45
Stan Glickman 🅴
Почему

sortedRoomList = value.sortedWith(
compareBy ({
it.pin
}, {
it.updatedAt
})
)

работает, а compareByDescending нет?
В
15:46
Вафель
In reply to this message
Ничего не меняет
I
16:13
Igor
Ребят, кто знает почему такая конструкция не печатает значения, вроде должно быть 10 нулей)) val list: List<Int> = List(10) {0}
list.forEach { println(it) }
AL
16:15
Alexander Levin
In reply to this message
?
I
16:16
Igor
In reply to this message
спасибо значит у меня где-то глюк при выдаче
AR
17:53
Andrei Ruban
Всем привет! Где можно почитать на тему нижних подчеркиваний ? ну вот типа таких
jdbcTemplate.query(queryProvider.getSQL(sql), params) { rs, _ -> mapper.invoke(rs) }
A
17:53
Alex
In reply to this message
это просто что бы инспекции не ругались на неиспользуемый параметр
17:53
в нейминг конвенциях читать
AR
17:54
Andrei Ruban
In reply to this message
спасибо!
17:55
Это не совсем нейминг конвенция, ибо несколько переменных можно "назвать" _.
AR
18:02
Andrei Ruban
val intPlus: Int.(Int) -> Int = Int::plus
и
@RunWith(SpringRunner::class)
- второе это тоже метод референс ?
RI
18:25
Ruslan Ibragimov
In reply to this message
первое - да, второе это получение KClass, как в Java получение Class это SpringRunner.class.
18:26
А чтобы метод референс на конструктор сделать, нужно перед именем класса писать: ::SpringRunner
RR
23:31
Roman Roman
Запуска "hello world" от Ktor - работает.
Пытаюсь собрать для хостинг heroku
вот тут примеры сборки:
https://devcenter.heroku.com/articles/deploying-gradle-apps-on-heroku
при вызове "heroku local web" выдает "no main manifest attribute, in build/libs/KtorGet-0.0.1.jar". Залез в "KtorGet-0.0.1.jar" там в манифесте нет главного класса. попытался указать на ApplicationKt(класс который писал я, и его же запускал), но выдал "Error: Could not find or load main class ApplicationKt".
Должен ли я указывать на какой-либо класс Ktor в качестве главного? Или я то-то не понимаю..?
23:31
In reply to this message
tree.png
Not included, change data exporting settings to download.
16.7 KB
AM
23:32
Andrew Mikhaylov
In reply to this message
А у тебя есть fun main(...) или ты используешь EngineMain кторовский?
23:33
При запуске из IDE, имею ввиду
RR
23:33
Roman Roman
"fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
"
23:34
Есть
23:34
Или это как раз можно сказать, что ее нет?
AM
23:34
Andrew Mikhaylov
Ну в таком виде она нафиг не нужна и в качестве точки входа смело можно писать ktor.server.netty.EngineMain
23:35
Она технически есть, но можно смело убирать :)
23:35
Равно как и в Run configuration в самой идее можно спокойно этот класс использовать вместо своего
RR
23:36
Roman Roman
а ты на heroku, как я помню, не работал?
AM
23:36
Andrew Mikhaylov
Верно. Но пока это хероку не касается.
RR
23:38
Roman Roman
Там есть Procfile и в нем есть вроде "точки входа", в нем прописывается web: java -jar build/libs/KtorGet-0.0.1.jar , должен ли я тут что-то менять?
23:38
KtorGet - это мой главный файл
AM
23:39
Andrew Mikhaylov
То есть гредл именно по этому пути файл укладывает, верно?
RR
23:39
Roman Roman
да
AM
23:40
Andrew Mikhaylov
Вероятно, надо ещё в самом гредл-конфиге добавить application-плагин и указать mainClassName = ktor.servet.netty.EngineMain
23:40
В общем, добейся, чтобы выполнение этой команды у тебя локально запускалось сервер, а потом уже о хероку парься
RR
23:40
Roman Roman
Я должен в манифесте к KtorGet.jar указывать точку старта`ktor.server.netty.EngineMain`?
23:40
секунду
23:40
все есть
ع
23:41
عالم
Heroku - Servers - Ktor
ktor.io
> heroku --version heroku-cli/6.15.36 (darwin-x64) node-v9.9.0. You will also need an app.json file describing your projects and your dependencies: { "name": "Start on Heroku: Kotlin", "description": "A barebones Kotlin app, which can easily be deployed to Heroku.", "image": "heroku/java", "addons"...
AM
23:41
Andrew Mikhaylov
In reply to this message
Да, именно это надо сделать, чтобы java -jar my.jar работало, и именно об этом было сообщение об ошибке, с которого ты начал :)
ع
23:41
عالم
In reply to this message
Чекни ссыль
AM
23:42
Andrew Mikhaylov
Нихрена себе, нужен такой же бот для lmgtfy :D
RR
23:42
Roman Roman
In reply to this message
Т.е. только по этому пути можно пойти?
ع
23:43
عالم
In reply to this message
Прочти это ( по-русски )
RR
23:52
Roman Roman
In reply to this message
Окей, я указал Main-Class:ktor.servet.netty.EngineMain вылетело no main manifest attribute. Тоже что и было изначально.
Буду пробовать по ссылке
AM
23:53
Andrew Mikhaylov
AM
Andrew Mikhaylov 22.02.2019 23:40:01
Вероятно, надо ещё в самом гредл-конфиге добавить application-плагин и указать mainClassName = ktor.servet.netty.EngineMain
RR
23:54
Roman Roman
это все есть
AM
23:54
Andrew Mikhaylov
А ошибка при попытке локально java -jar my.jar запустить?
RR
23:55
Roman Roman
да запускается локально
23:56
тут даже не хероку дела
23:56
это я чего-то напутал
AM
23:57
Andrew Mikhaylov
Ну если джарник запускается локально, но аналогичная команда на хероку не взлетает, то явно какая-то проблема с конфигом под хероку. Тут я уже не советчик.
RR
23:57
Roman Roman
А чере IDEA запускает
AM
23:59
Andrew Mikhaylov
Ну IDEA -- не показатель, она джарник запускает не через -jar, а добавляя его в classpath и указывая точку входа явно.
23 February 2019
RR
00:00
Roman Roman
значит мне как-то с этой точкой фхода надо разобраться..щас пробую
AM
00:01
Andrew Mikhaylov
Я бы таки взял туториал и пробежался по нему от начала и до конца шаг за шагом. Нельзя просто так взять и с наскока соединить несколько инструментов, не имея опыта ни с одним из них. А тут и гредл, и хероку, и ктор, и всё сразу.
В
00:07
Вафель
In reply to this message
Их было, но чёт посдыхали, допишу либу и займусь :D
00:08
Если допишу конечно...
RR
00:13
Roman Roman
Этот канал сделали не просто так,а что бы мы, кто мало опыта имеет, могли задовать вопросы живому сообществу.+не задовали в общем чате.. Вот там и пихайте его, и пусть перенаправляют вот на этот канал.
00:14
Спасибо за понимание 😊
AM
00:16
Andrew Mikhaylov
Ну я этим ботом бы пользовался по большей части не тут как раз :D
RR
00:17
Roman Roman
Я хз, на свой счёт принял
В
01:34
Вафель
image_2019-02-23_01-34-54.png
Not included, change data exporting settings to download.
22.0 KB
Почему так нельзя, и что делать если хочется?
01:47
Хм, можно заюзать @Suppress("BOUNDS_NOT_ALLOWED_IF_BOUNDED_BY_TYPE_PARAMETER", "INCONSISTENT_TYPE_PARAMETER_BOUNDS")
Но есть подозрение что это отстрел ноги на пустом месте....
AM
02:15
Andrew Mikhaylov
Мне кажется, почти со всеми вопросами по варианту и баундам в дженериках можно смело топать в основной чат :)
В
02:16
Вафель
Окей :)
RI
13:33
Ruslan Ibragimov
Скорее всего ты зависимости в проект подключил через IDEA, и Gradle соответсвенно ничего про твои либы не знает
13:33
Покажи build.gradle
13:36
вот этой либы нет
A
13:45
Andrey
О, спасибо большое. Дописал всё недостающее, и эти ошибки ушли. Интересно, как оно ральше работало, если я jar файлы вручную не подключал? Теперь осталось только это. Почему-то не видит метод readNBytes. В чем может быть дело?
RI
13:52
Ruslan Ibragimov
У меня под рукой ide нет, но кажется это jdk11
13:52
Посмотри в idea в документацию к методу
A
14:23
Andrey
Действительно, указал путь к нужному jdk, и всё заработало. Наверное последний вопрос. Как работать с файлами, что бы после сборки в jar с ними можно быть работать?
RI
14:24
Ruslan Ibragimov
Не понял про какие файлы речь, и как с ними работать планируется
A
14:28
Andrey
Я сейчас вот так нахожу этот файл. Соответственно, при сборке по этому пути его не получается найти. Как правильно с ним работать?
RI
14:28
Ruslan Ibragimov
через класслоадер
A
14:29
Andrey
Спасибо, сейчас попробую
14:39
Все работает, большое спасибо
24 February 2019
RR
14:40
Roman Roman
Запускаю Ktor на localhost:8080, все работает. Отправляю на heroky хостинг(установка успешно проходит).Запускаю отладку через "heroku logs --tail" - выдает ошибку "web process failed to bind to $PORT within 90 seconds of launch", при переходе на страницу на из браузера в "heroku logs" выдает "process exited with status 137". (Скриншоты кину на всякий случай)
Откуда он вообще берет значение " $PORT" - нашел такое значение в application.conf для Ktor?
14:40
14:40
AM
14:44
Andrew Mikhaylov
Попробуй в application.conf указать порт вот так:

ktor {
deployment {
port = ${PORT}
}
}
RR
14:45
Roman Roman
Так и стоит
14:45
port = 8080
port = ${?PORT}
AM
14:45
Andrew Mikhaylov
Скорее всего, сам хероку назначает, на каком порту должно слушать приложение, и передаёт этот порт приложению в качестве переменной среды
RR
14:46
Roman Roman
И как приложению принять назначенный порт?
AM
14:46
Andrew Mikhaylov
In reply to this message
Вот так :)
14:48
Можете проверить, что переменная среды точно цепляется, указав PORT = 8095 в environment в Run configuration в идее и проверив, что сервер повесился на указанный порт
14:48
И если так и сработает, то это опять ковырять в сторону конкретно конфига хероку
RR
14:49
Roman Roman
In reply to this message
не понял, я не через IDEA запускаю
AM
14:50
Andrew Mikhaylov
А как, из терминальчика?
Тогда
PORT=8095 ./gradlew :myruntask
RR
14:52
Roman Roman
Нет, на heroku заливаю, а там он стартуется.
AM
14:52
Andrew Mikhaylov
Дык проверь локально
RR
14:52
Roman Roman
Или че то я не понимаю вас😁
14:52
локально на 8080 работает
AM
14:53
Andrew Mikhaylov
Дык проверь локально, что при передаче через переменную окружения другого порта сервер поднимется на этом порту
RR
14:54
Roman Roman
окей, через 8095?
AM
14:54
Andrew Mikhaylov
Да любой на своё усмотрение
RR
14:57
Roman Roman
Я в конфигах задал 8095....НО `2019-02-24 18:56:29.262 [main] INFO ktor.application - No ktor.deployment.watch patterns specified, automatic reload is not active
2019-02-24 18:56:29.326 [main] INFO ktor.application - Responding at http://0.0.0.0:8080`
14:57
Но работает все равно на 8080
AM
14:58
Andrew Mikhaylov
Ну вот потому и не работает :)
Линкую на репу в студию, мне уже надоело на кофейной гуще гадать.
RR
14:58
Roman Roman
Вот
14:59
Там в самом коде указан четкий порт
15:00
Ktor.7z
Not included, change data exporting settings to download.
50.7 MB
AM
15:26
Andrew Mikhaylov
build.mustRunAfter clean
жестоко :D
15:27
mainClassName по идее убирает необходимость в attributes "Main-Class" в jar.manifest
RR
15:29
Roman Roman
In reply to this message
Без этого не записывал в манифест(
15:29
In reply to this message
В плане чего жестко?
AM
15:30
Andrew Mikhaylov
Дык вы в fun main перебиваете порт
RR
15:31
Roman Roman
In reply to this message
Да, я пытался его убрать, но нужно как то тогда его получить
15:33
он ставит на порт 80
15:34
[main] INFO ktor.application - Responding at http://0.0.0.0:80
15:36
Кажись
AM
15:36
Andrew Mikhaylov
А если попробоать embeddedServer(Netty, commandLineEnvironment(args)) {?
15:36
Вместо порта
RR
15:36
Roman Roman
Default port может?
15:37
а тоже будет
15:37
щас попробую дефаулт
AM
15:38
Andrew Mikhaylov
Если вы используете перегрузку, которая принимает порт параметром функции, вы руками из окружения должны достать порт. Это будет чёт вроде embeddedServer(Netty, port = System.getenv("PORT")?.toInt() ?: 8080). Если вы хотите использовать порт, указанный в application.conf, вам нужно не использовать перегрузку embeddedServer, которая принимает порт параметром. Пример выше.
15:39
Один из способов решить проблему — сделать таки модуль, как советуют в документации по ктору, и перестать использовать свой main.
RR
15:39
Roman Roman
А heroku передает порт в main?
AM
15:40
Andrew Mikhaylov
Вы в курсе, что такое переменные окружения?
RR
15:40
Roman Roman
Да знаком
AM
15:41
Andrew Mikhaylov
AM
Andrew Mikhaylov 24.02.2019 14:45:39
Скорее всего, сам хероку назначает, на каком порту должно слушать приложение, и передаёт этот порт приложению в качестве переменной среды
RR
15:41
Roman Roman
Так, это значит System.getenv("PORT")
15:41
Верно понял?
AM
15:42
Andrew Mikhaylov
Либо ${PORT} в application.conf
15:42
Но та перегрузка embeddedServer, которую используете вы, порт из конфига не читает.
RR
15:43
Roman Roman
Кажется понимаю вас)
AM
15:44
Andrew Mikhaylov
Мой совет: сделать модуль (https://ktor.io/servers/application.html#modules), заткнуть его в application.conf (https://ktor.io/servers/configuration.html#hocon-file) и перестать воевать с настройкой сервера из кода, оставив это одному источнику правды — конфигу.
RR
15:46
Roman Roman
ура, от души)
15:47
убрал перегрузку, и вытащил из переменной окружения port, все заработало)
AM
15:51
Andrew Mikhaylov
👍
Вы заведите себе аккаунт на гитхабе / гитлабе, добавьте второй remote и отправляйте периодически код и в гитхаб / гитлаб на хранение, и в хероку на деплоймент. Во-первых, будут бекапы, во-вторых, шарить код с помощью этих сервисов намнооого удобнее, чем архивами. Залили изменения, и можно сразу ссылку давать, в том числе на конкретный файл и строку при надобности.
RR
15:52
Roman Roman
Да так и буду делать) действительно удобно)
ЕС
17:12
Ерасыл Сейтханов
добрый вечер
17:15
я задал этот вопрос в другом чате!но там посоветовали мне эту группу
17:16
так как я новичок
17:17
У меня такой вопрос!Моя функция на вход принимает строку.я должен проверить уникальность букв строки.
17:18
мне надо возвращать true если буквы уникальны
17:18
fun uniqueLetter(str: String):Boolean {
val charStr = str.toCharArray()
var countChar = 0
for (i in charStr){
if(charStr.contains(i)){
countChar++
}

}
return countChar == 1
}
17:18
написал вот так но говорит ошибка
AM
17:19
Andrew Mikhaylov
In reply to this message
Кто говорит? Текст ошибки в студию.
ЕС
17:22
Ерасыл Сейтханов
на вход передал строку с уникальными буквами.но в результате вводит false.хотя все буквы уникальные
AM
17:29
Andrew Mikhaylov
Ну значит, наверное, алгоритм неправильно написан :) Мы тут вроде не бюро решения домашних заданий, но давайте я вам просто словами опишу ваш алгоритм, а вы уже подумаете, что в нём не так, и сами пойдёте исправлять. Договорились? :)

Для каждого символа из строки проверяем, есть ли такой символ в строке, если да -- увеличиваем счётчик. Считаем, что все символы уникальны, если на выходе счётчик равен единице.

Подумайте, найдётся ли в строке такой символ, которого в строке нету, и что вы на самом деле проверили :)

Не стесняйтесь в процессе решения задачи пользоваться отладчиком: ставьте breakpoint на первой строке функции и пошагово её выполняйте, поглядывая на значения всех переменных. Следя за ними, вы сможете понять, почему реализованный алгоритм делает не совсем то, чего вы от него ожидали.
ЕС
17:32
Ерасыл Сейтханов
хорошо!спасибо!
RR
17:57
Roman Roman
In reply to this message
fun uniqueLetter(str: String):Boolean {
val charStr = str.toCharArray()
for (i in charStr){
if(charStr.count{it==i}>1){
return false
}

}
return true
}
ЕС
17:57
Ерасыл Сейтханов
In reply to this message
👍
17:59
спасибо!
SS
20:27
Sergey Sverdlov
In reply to this message
А зачем toCharArray?
ЕС
20:30
Ерасыл Сейтханов
чтобы строку делать массивом символов
AM
20:33
Andrew Mikhaylov
На самом деле и .iterator(), и .count(...) определены для CharSequence, потому работало бы и без этого преобразования, но на время обучения полезно, ИМО, не мешать строку с массивом символов в одно понятие.
ЕС
20:34
Ерасыл Сейтханов
ааа ок !я об этом не знал
RR
20:36
Roman Roman
Я без idea не в курсе был, будет ли работать для String или нет
SS
20:37
Sergey Sverdlov
In reply to this message
Зачем строку делать массивом символов?
20:37
fun uniqueLetter(str: String): Boolean {
for (i in str.indices) {
if (str.substring(i + 1).contains(str[i]))
return false
}
return true
}
ЕС
20:39
Ерасыл Сейтханов
у меня тут еще вопрос есть!здесь .count{it==i} .count с фигурной скобкой когда используется?а it это каждый элемент charStr?просто в гугле не нашел об этом инфу
SS
20:39
Sergey Sverdlov
fun uniqueLetter(str: String): Boolean {
for (i in 0 until str.length-1) {
if (str.substring(i + 1).contains(str[i]))
return false
}
return true
}
RR
20:42
Roman Roman
count принимает лямбду в качестве параметра
20:44
Да, it это "каждый элемент")
ЕС
20:45
Ерасыл Сейтханов
👌
SS
20:45
Sergey Sverdlov
In reply to this message
Считать, сколько раз символ встретился - лишнее.
AM
20:46
Andrew Mikhaylov
Да и даже если алгоритмическую сложность отбросить в сторону, решение Сергея заметно проще понять.
RR
20:47
Roman Roman
Возможно, я не притендую на идеальный ответ. Зато код рабочий)
ЕС
20:47
Ерасыл Сейтханов
спасибо большое!
RR
20:47
Roman Roman
Substring что делает?
AM
20:47
Andrew Mikhaylov
In reply to this message
Ерасылу этот код ещё преподавателю объяснять придётся, возможно. :)
ЕС
20:48
Ерасыл Сейтханов
In reply to this message
возвращает все символы с указанного индекса
RR
20:48
Roman Roman
In reply to this message
Да я бы сам с радостью объяснял преподу код, но я менеджер😕
AM
20:48
Andrew Mikhaylov
In reply to this message
Подстроку из строки берёт, очевидно, начиная с указанного индекса и до конца / до индекса из второго параметра.
ЕС
20:50
Ерасыл Сейтханов
я могу объяснять преподу
AM
20:50
Andrew Mikhaylov
In reply to this message
Ух ты. А кейтор в свете прямых обязанностей осваиваете, или разработчики достали тем, что сами нихрена не делают?))
RR
20:50
Roman Roman
Кейтор, это ktor?
AM
20:51
Andrew Mikhaylov
In reply to this message
Ну если так -- это здорово, тогда бери любое из решений на своё усмотрение. Хотя я бы впредь постарался сначала сам решить задачу, а потом уже в чатики топал.
20:51
In reply to this message
Да.
RR
20:51
Roman Roman
А мне покайфу это😊
AM
20:52
Andrew Mikhaylov
Похвально :)
RR
20:52
Roman Roman
Особенно когда есть те кто могут помочь, да подсказать
SS
20:52
Sergey Sverdlov
А вообще-то нафиг все эти готовые методы, проще всего все сделать своими руками:
fun uniqueLetter(str: String): Boolean {
for (i in 0 until str.length - 1) {
for (j in i + 1 until str.length)
if (str[i] == str[j])
return false
}
return true
}
RR
20:53
Roman Roman
In reply to this message
На ассемблере умеешь писать, там ещё лучше будет😁
SS
20:53
Sergey Sverdlov
In reply to this message
Почему мы на "ты"?
RR
20:54
Roman Roman
Да,действительно 😊... Вы умеете писать...
AM
20:54
Andrew Mikhaylov
In reply to this message
Ну не скажи, для студентоты вот такие вот решения -- самое оно. Если бы я преподавал котлин и принимал по нему лабы, я бы код с экстеншнами на коллекциях принимал бы только если был бы уверен, что человек в состоянии при мне эти экстеншны руками повторить :)
RR
20:55
Roman Roman
In reply to this message
Интересно что в английском вообще ни ты, ни вы нет верно?
ЕС
20:56
Ерасыл Сейтханов
Что можете посоветовать чтобы хорошо освоить котлин? я вот читаю документацию котлин. для меня там некоторые вещи сложновато понять
SS
20:57
Sergey Sverdlov
In reply to this message
Писать программы, решать задачи
RR
20:57
Roman Roman
Да я вот сам с Котлина начал, первый язык)
ЕС
20:57
Ерасыл Сейтханов
In reply to this message
kotlin koans?
RR
20:58
Roman Roman
По мне так, ставь задачку себе и пытайся решить, по ходу ищи ответы да запоминаю, что и как работает
AM
20:58
Andrew Mikhaylov
In reply to this message
Совсем с нуля как первый язык пока, увы, готовых материалов нет, насколько я знаю. В разработке книжечка Atomic Kotlin, так что как выйдет, можно будет её приобрести.
RR
21:00
Roman Roman
Kotlin вроде как в Питере преподают, будет в России в массу уходить(в плане обучания), какое ваше мнение?)
ЕС
21:00
Ерасыл Сейтханов
Слышал есть книга Котлин в действии. для новичков это или продвинутым
RR
21:00
Roman Roman
In reply to this message
Она для java разработчиков вроде)
ЕС
21:00
Ерасыл Сейтханов
ааа понятно
SS
21:03
Sergey Sverdlov
In reply to this message
21:04
In reply to this message
Не для новичков
RR
23:11
Roman Roman
У Котлина кодировка utf8?
A
23:28
Anton
Если под андроид котлин учить, то есть парочка легких для понимания книг
25 February 2019
SS
00:08
Sergey Sverdlov
Нехитрая задача, а сколько вариантов решения... Вот, если в самом деле речь о буквах (латинских), очень быстрый вариант:

val b = BooleanArray(256)
fun uniqueLetter(str: String): Boolean {
b.fill(false)
for (ch in str) {
val ord = ch.toInt()
if (b[ord])
return false
else
b[ord] = true
}
return true
}
Линейная сложность
В
00:11
Вафель
In reply to this message
.toInt() так не работает
RR
00:12
Roman Roman
S - это же char)
SS
00:14
Sergey Sverdlov
In reply to this message
Как у Вас не работает. А как у меня - работает. И да s тут Char. И там уже не s, a ch
В
00:15
Вафель
А, тогда извиняюсь, упустил этот момент
RR
00:18
Roman Roman
Не понимаю что значит b[ord], можно объяснить?
SS
00:18
Sergey Sverdlov
In reply to this message
b - логический массив. Соответственно, b[ord] - истина или ложь.
RR
00:18
Roman Roman
b.fill - устанавливает все значение в false, верно?
SS
00:19
Sergey Sverdlov
Да
RR
00:20
Roman Roman
А разве b[ord] не в любом случае вернет false?
00:21
Если он весь забит false-ами, при получении b[ord] он выведит false же,нет?
SS
00:22
Sergey Sverdlov
См. else
b[ord] = true
Rl
00:29
Ru l
Вы по курсам на курсере учитесь?
RR
00:29
Roman Roman
Понял, интересный подход😊
00:30
In reply to this message
Просто, скачал ролики, и просмотрел. Там мало информации
Rl
00:30
Ru l
In reply to this message
Аа,
00:30
Офлайн курсов я не нашёл :(
KT
15:30
Koba Trader
Посчитать количество гласных
val vowel="aeiu";
fun getCount10(str:String):Int=str
.filter { it.toLowerCase() in vowel }
.count()
тут два раза идем по циклу сначала фильтруем, а потом считаем количество, а как сделать в одном цикле?
В
15:34
Вафель
In reply to this message
str.toLowerCase().count { it in vowel }

К примеру
15:35
А можно сделать просто обычным циклом ¯\_(ツ)_/¯
AM
15:35
Andrew Mikhaylov
Или .count { it.toLowerCase() in vowel }. И да, ты "o" упустил.
KT
15:36
Koba Trader
Вафель Лапкин спасибо
Andrew Mikhaylov я уже сам догаался, но тоже спасибо
I
15:36
Ilmir
In reply to this message
val vowel="aeiu";
fun getCount10(str:String):Int {
tailrec fun getCount10Rec(str: String, count: Int): Int {
return if (str.isEmpty()) count else getCount10Rec(str.substring(1), count + if (str[0] in vowel) 1 else 0)
}
return getCount10Rec(str, 0)
}
AM
15:36
Andrew Mikhaylov
👍
KT
16:27
Koba Trader
//Все нечетные числа возводим в куб, а потом подсчитываешь сумму.
println (cubeOdd10(intArrayOf(1,2,3,4)))
// результат:28
fun cubeOdd10(array:IntArray)=array
.sumBy { if(it%2!=0) cub(it) else 0 }

fun cub(number:Int):Int{
var result = 1
for(n in 1..3) result*=number
return result
}
решил не пользоваться функцией Math, так как нужно пребразовывать в дробный тип, а потом обратом.
Как записать функцию cub в виде лямбы?
Нужно использоваться reduce
AM
16:29
Andrew Mikhaylov
Преобразования Int <> Float достаточно дешёвые, чтобы на них не экономить.
Домашние задания / задания к курсам / etc мы тут всё-таки не решаем.
KT
16:32
Koba Trader
Andrew Mikhaylov Вопросы про оптимизацию, это не не домашнее заание, я самостоятельно изучаю и пытаюсь оптимизировать
В универах не занимаются оптимизацией, пишут как попало
AM
16:35
Andrew Mikhaylov
Если вы считаете, что самопальное возведение в третью степень, тем более на цикле вместо it * it * it -- это не "как попало", то боюсь вас огорчить. .fold / .reduce -- это тоже не об оптимизации вопрос. Вам достаточно сходить в Гугл по запросу "kotlin reduce example" и по паре ссылок там взять примеры, на основании которых сделать своё решение.
16:36
Для заворачивания этого решения в собственную функцию дополнительно к этому стоит сходить в документацию и почитать об extension functions.
AZ
16:37
Alexander Zapevalov
смысл в том, что эти вопросы немного не в чат. Даже не в гугол, а больше в учебник по Котлину
KT
16:42
Koba Trader
Оптимальный вариант
fun cubeOdd10(array:IntArray)=array
.sumBy { if(it%2!=0) it*it*it else 0 }
AM
16:43
Andrew Mikhaylov
Seems legit.
KT
16:47
Koba Trader
Вот таким образом я раньше писал, страшно смотреть, целых 3 раза бегал по циклу и еще типы даных два раза преобразовывал.
fun cubeOdd10(array:IntArray)=array
.filter { it%2!=0 }
.map { Math.pow(it.toDouble(),3.0) }
.sum()
RR
16:47
Roman Roman
Можете объяснит суть inline функций? Или в гугл отправляться?
Пару дней назад пытался разобраться.. Написал функцию и пометил как инлайн. Вызывал её в цикле for(i in 0..100). Так вот заинлайнинная функция напорядок медленнее чем тот же вызов в цикле без пометки инлайн. (функция большая)
16:48
Точнее не функции медленнее, а цикл больше времени тратит. Мерил через measureTimeMillis
AM
16:49
Andrew Mikhaylov
In reply to this message
Для массива на 3 элемента в этом ничего страшного нету, честно-честно. В остальных случаях у вас почти наверняка будет List<T>, у которого есть волшебный метод .asSequence(), быстро решающий вопрос с уймой копирований.
16:51
In reply to this message
Это очень странная фигня. Инлайн может не дать бонуса к перформансу -- да, а вот понизить его -- звучит странненько.
AZ
16:52
Alexander Zapevalov
почему ? если даже в офф. доке написано, что
Использование функций высшего порядка влечёт за собой снижение производительности:
RR
16:53
Roman Roman
Но так и было, цифры не обманывают
16:54
В функции был вызов winapi,циклы и преобразования типов
AM
16:54
Andrew Mikhaylov
In reply to this message
Ну дык если речь исключительно о наличии инлайна, то код выполняется один и тот же, просто при наличии инлайна прямо в теле цикла, при отсутствии -- за дополнительным вызовом метода.
16:57
In reply to this message
Ну верить цифрам, полученным измерением перформанса с помощью measureTimeMillis -- то ещё удовольствие, люди для этих целей вооружаются целыми фреймворками вроде JMH, которые позволяют минимизировать влияние окружения на измерения. Возможно, дело именно в этой неточности. Сравните байт-код, если сомневаетесь.
RR
16:58
Roman Roman
Через intellij это вроде просто делается, верно?
AM
17:00
Andrew Mikhaylov
Ctrl+Shift+A, "Show Kotlin bytecode", если я правильно понял, что "это".
RR
17:01
Roman Roman
Будет idea под рукой посмотрю, что там происходит)
17:41
Бесплатный курс по котлину
17:41
Мб кому-то понадобится
KT
17:43
Koba Trader
Антон а на русском языке есть курсы?
КБ
17:43
Константин Буланов
In reply to this message
Спасибо
A
17:43
Anton
А тут я хз, честно говоря, на юдеми точно нет.А так, все которые находил, то платные
AR
19:14
Andrei Ruban
Всем привет! никто не сталкивался с таким при выполнении NamedQuery
Type mismatch: inferred type is List<Item>? but MutableList<Item>? was expected
?
19:15
запрос выполняется, данные возвращаются но если в дебаге открываешь и хочешь посмотреть на объект то просиходит вот такая шняга)
В
19:19
Вафель
In reply to this message
А что за библиотека?
AR
19:21
Andrei Ruban
org.springframework.jdbc.core.namedparam
19:22
конкретно класс - NamedParameterJdbcTemplate
19:23
println(retrievedItems.toString()) - вот так четенько) а в дебаге Evaluate Expression нет
19:23
может это баг идеи?
AM
19:24
Andrew Mikhaylov
Я бы в @kotlin_lang с таким вопросом сходил, там больше специалистов по спрингу :)
19:25
Возможно, кто-то сталкивался и сможет подсказать, нормально ли это.
AR
19:25
Andrei Ruban
In reply to this message
ок, спасибо
В
19:40
Вафель
Можете обьяснить почему тут может не работать smart cast? 🤔
19:43
19:43
19:43
Чяднт?
19:44
Если сделать as MultipartRequest<Any> — жалуется на unchecked cast...
I
19:46
Ilmir
In reply to this message
s/Any/*/
AM
19:46
Andrew Mikhaylov
Попробуй is MultipartRequest<*>
19:46
Так как типы дженериков стираются, параметр дженерика проверить вот так вот не выйдет
I
19:47
Ilmir
In reply to this message
Нет, там обьявление функции надо поменять.
В
19:49
Вафель
19:50
In reply to this message
Какой именно функции?
A
19:50
Alex
In reply to this message
prepare call?
В
19:51
Вафель
In reply to this message
Так я принимаю Request<T>, кроме как MultipartRequest<T> и SimpleRequest<T> там ничего не может быть...
I
19:51
Ilmir
In reply to this message
А это что?
A
19:51
Alex
In reply to this message
prepareCall принимает не Request<T> а Request<Any>
19:52
а ну и да у тебя два prepareCall, тоесть вообще несвязанные куски кода нам присылаешь 🙂
В
19:54
Вафель
In reply to this message
Хотелось бы сделать подобное:
interface KtorCallFactory<RB: Request<*>> {
suspend fun <R, T: Any> prepareCall(client: HttpClient, baseUrl: String, request: R) : HttpClientCall where R: Request<T>, R: RB
}


Но так, увы, нельзя :(
19:54
In reply to this message
Один в интерфейсе, другой в классе...
AM
19:55
Andrew Mikhaylov
In reply to this message
Ага, то есть если был базовый A<T>, то is сможет проверить дочерний B<T>, и смарт-каст до него успешно уточнит? Я смотрю, любые другие проверки ожидаемо не работают, только тот же T и *, они по сути своей одно и то же?
A
19:56
Alex
In reply to this message
а ок, посыпаю голову пеплом, ktor не пользовал никогда
В
19:57
Вафель
In reply to this message
С ктором на прямую проблема не свзанна, тут просто путаница в дженериках...
A
19:57
Alex
In reply to this message
ну ктор тут запутал только, дженерики вообще дело не самое приятное когда начинаются сложные иерархии
I
19:58
Ilmir
In reply to this message
Нет, '*' означает 'любой тип'. А 'T' - 'один конкретный тип, пусть пока и неизвестный'.
В
19:59
Вафель
Попытаюсь обьяснить что я хочу:
Есть sealed class Request<T> { ... } у него соответственно наследники SimpleRequest и MultipartRequest. Интерфейс KtorCallFactory<R: Request<*>> описывает фабрику запросов R к апи...

Видимо слишком многово хочу, буду переосмысливать архетектуру :)
20:02
In reply to this message
Не знаю, на мой взгляд дженерики не такие и сложные. У меня проблемы чисто из-за стирания...
A
20:02
Alex
In reply to this message
ну да, не такие сложные, что приходится аж в чат лезть 🙂
AM
20:03
Andrew Mikhaylov
In reply to this message
Но при этом если A<T: X>, то даже проверка на is A<X> не срабатывает из-за стирания, а вот is A<T> пропускается наряду с is A<*>. Как работает последнее -- вопросов нет, а как работает проверка на A<T>, я пока не понял. Исключительно потому, что больше ничего и не могло быть передано, верно же?

Собственно, да, в байткоде на оба варианта генерируется INSTANCEOF A.
В
20:04
Вафель
In reply to this message
Странно что is A<X> не работает, если мы уверенны что T is X...
I
20:04
Ilmir
In reply to this message
Ага, проверка типов дженериков - это особая магия.
AM
20:06
Andrew Mikhaylov
In reply to this message
Даже страшно себе представлять, насколько сильная. :) Спасибо!
I
20:08
Ilmir
In reply to this message
Это как раз логично. List<String> не наследует List<Object>. Чтобы все было правильно, надо подсыпать в нужные места in и out: https://kotlinlang.org/docs/reference/generics.html
В
20:11
Вафель
In reply to this message
А, тогда всё логично, да
AM
20:18
Andrew Mikhaylov
https://pl.kotl.in/S153zib8V
После добавления <in T> отвалилось даже is X<T>.
Когда-нибудь до меня дойдут ковариантность с контрвариантностью полностью. :)
20:19
Я таки слишком много хочу в этом примере, да?
I
20:24
Ilmir
In reply to this message
А Request обязательно должен быть дженериком? Типовые параметры можно же отдать детям.
В
20:26
Вафель
In reply to this message
Увы — должен быть, от дженерика зависит возвращаемый тип...
20:28
Можно наверное вместо when сделать 2 перегрузки...
I
20:32
Ilmir
Что-то типа такого сработает:
sealed class Request<out T> {
class ARequest<out T>
class BRequest<out T>
}

interface KtorCallFactory<out T, RB: Request<T>> {
fun <R: RB> prepareCall(baseUrl: String, request: R): T = TODO()
}

fun <T: Any> makeRequest(r: Request<T>, factory: KtorCallFactory<T, Request<T>>) = when (r) {
is Request.ARequest<*> -> factory.prepareCall("a", r)
is Request.BRequest<*> -> factory.prepareCall("b", r)
}

?
20:34
Забыл отнаследовать :(
sealed class Request<out T> {
class ARequest<out T>: Request<T>()
class BRequest<out T>: Request<T>()
}
26 February 2019
AA
15:00
Aleksey Antonov
Здрасти. Очень нубский вопрос. Используя котлин в андройде, стоит ли пользоваться AsyncTask'ом или можно обходится корутинами🙄
15:03
ᅠonmyway
Всем привет, еще более нубский вопрос, чтобы начать изучение котлина, надо сначала стать джуниором по джаве? или если прочту пару книг и пару курсов, то этого достаточно?
AM
15:09
Andrew Mikhaylov
In reply to this message
Можно, конечно, но ими придётся научиться пользоваться.
15:10
In reply to this message
Сложно сказать, всё зависит от того, насколько вы хорошо воспринимаете информацию и на какой уровень метите. Вряд ли вам готовый рецепт подскажут, дерзайте!
AA
15:11
Aleksey Antonov
Я просто поигрался с корутинами. Сейчас учусь андройду, дошёл до сервисов и встал вопрос. В примерах везде асинктаск, просто подумал я ведь ничего не теряю если заменю на корутины
15:12
ᅠonmyway
In reply to this message
Спасибо)
AM
15:14
Andrew Mikhaylov
In reply to this message
Даже приобретаете, потому что скоуп, если вы по примерам делаете, закроется при необходимости, и утечки не будет, в отличие от.
AA
15:16
Aleksey Antonov
In reply to this message
Спасибо большое
A
15:35
Alex
In reply to this message
Один раз для прикола можешь забрать. Но в целом это древний проблемный и немодны1 инструмент
RR
22:18
Roman Roman
Что делаю:
Отправляю через libcurl Get-запрос в виде htps://site.heroku.com/?password=0000, обрабатываю используя Ktor:
`get("/") {
val out = BufferedWriter(
OutputStreamWriter(
FileOutputStream("PassList.txt", true),
charset("UTF-8")
)
)

try {
out.write(call.request.queryParameters["password"] + "\r\n")


} finally {
out.close()
}

}`
Проблема:
Записывает значение(`русские буквы`) из queryParameters["password"] в файл Кракозяброй.

Определил, что если вводить запрос в строку браузера вручную, то обрабатываются все символы правильно(читаются из строки запроса, записываются в файл).
Использую команду heroku logs --tail изучал,что происходит на сервере и заметил, что ручной запрос имеет вид %22%Do....`(картинка `Get.png - сверху), а отправленный через libcurl выглядит точно в таком виде, в каком его отправил (картинка `Get.png - снизу)
P.S. на хосте с PHP тот же запрос отрабатывает без нареканий.
22:19
Get.png
Not included, change data exporting settings to download.
28.0 KB
A
22:21
Alex
In reply to this message
буэээ, blocking io
22:21
(не обращайте внимания)
22:22
All other characters are encoded as %HH hex representation with any non-ASCII characters first encoded as UTF-8 (or other specified encoding)
RR
22:27
Roman Roman
In reply to this message
Т.е. я должен сам преобразовать строку в удобный для url формат?
A
22:28
Alex
In reply to this message
http клиенты и серверы как правило справляются отлично с encoding’ом, в том числе ktor как сервер у тебя нормально преобразовал из закодированного вида в кириллицу
22:29
с libcurl я не работал, судя по всему он не занимается encoding’ом квери параметров, а полагается на то что пользователь понимает что он делает
RR
22:30
Roman Roman
Да из закодированного(в формате под url) , нормально расшифровал
A
22:30
Alex
In reply to this message
я как будто бы знал 🙂
RR
22:31
Roman Roman
Но когда отправляю запрос через libcurl, прилетает в url не зашифрованая строка под url формат строка
22:31
На картинке посмотрите(снизу из запроса libcurl)
22:32
Момент в том, что тот же запрос на PHP-хост отрабатывает.
A
22:34
Alex
In reply to this message
ну хз что там пхп колдует (там и 1 это true и наоборот)
22:34
tg_image_414773806.jpeg
Not included, change data exporting settings to download.
7.3 KB
главное что не надо слать http запросы с таким path
RR
22:34
Roman Roman
In reply to this message
Я не могу кодировать строку в url формат использую java библиотеки, та часть с curl запросом написана на Kotlin native
A
22:35
Alex
In reply to this message
вы полезли в котлин.нейтив, никто не говорил что будет легко 🙂 я бы написал свой енкодер, не должно быть сложно
RR
22:35
Roman Roman
In reply to this message
Это учебный пример)
A
22:35
Alex
In reply to this message
нет, я про то что незакодировано значение
22:36
либо как вариант уйти от этой проблемы - посылать body в json
RR
22:37
Roman Roman
In reply to this message
Т.е. мне нужно, отправлять строку в уже отфармотированном виде?
A
22:37
Alex
In reply to this message
да
RR
22:38
Roman Roman
In reply to this message
Это отдельный пункт, еще не разбирался с json)
A
22:39
Alex
In reply to this message
советую отложить в сторону нейтив, писать на обычном котлине и радоваться жизни\познавать принятые в индустрии подходы
22:40
In reply to this message
И в body не обязательно слать json. Можно plain text в юникоде
28 February 2019
A
11:13
Alexander
Ребят кто может помочь с realm?
В
11:21
Вафель
In reply to this message
Лучше задавайте сразу вопрос, который вас интересует. nometa.xyz
A
11:23
Alexander
вопрос в следующем, в моделе определил primary key и хочу сделать проверку если ключ с именем существует то его обновить если нет то создать объект
AM
11:24
Andrew Mikhaylov
Вы уверены, что ваш вопрос касается конкретно котлина?
A
11:25
Alexander
реализую это на котлине
AM
11:26
Andrew Mikhaylov
Это здорово, но если заменить котлин на джаву и вопрос сохраняется, то вам стоит поискать более подходящее сообщество. Отдельно о реалме я групп не знаю, но, возможно, вам смогут помочь в @android_ru.
1 March 2019
SS
14:37
Sergey Sverdlov
Можно как-то узнать текущий размер кучи (свободного места в куче) во время выполнения программы? И если можно, то как? Задача - следить за тем, как программа использует кучу, сколько мусора порождает...
A
16:08
Alexander
Ребят есть активность на первом жкране в нее грузится фрагмент из первого фрагмента перехожу на второй, как изменить бургер на стрелку назад и по ней вернуться в первый фрагмент?
AM
16:08
Andrew Mikhaylov
A
16:08
Alexander
In reply to this message
для чего эта группа?
AM
16:09
Andrew Mikhaylov
Эта? Для вопросов о Котлине.
16:09
Ваш вопрос о Котлине?
A
16:09
Alexander
да
AM
16:09
Andrew Mikhaylov
Аргументируйте
A
16:09
Alexander
ктлин это язык?
AM
16:10
Andrew Mikhaylov
Я аргументы попросил, а не вопросы пространные.
A
16:10
Alexander
я подвожу к моему ответу
16:10
тут сидит 100 человек какой смысл группы вообще тогда
AM
16:10
Andrew Mikhaylov
Мне подводки не нужны. Пишете ответ, читаете правила, в которых даже пункт следующий есть:

> Спросите себя, относится ли ваш вопрос к Kotlin. Если тот факт, что вы решаете задачу на Kotlin, является единственной причиной обратиться в группу, и для Java этот вопрос всё ещё актуален, то есть вероятность, что вам стоит написать в другое тематическое сообщество.

И идёте в @android_ru.
16:11
Смысл группы — помогать новичкам разбираться в языке. Не в Android.
A
16:11
Alexander
бред
16:11
что акое переменная?
AM
16:13
Andrew Mikhaylov
У нас есть правила. Мы либо играем по ним, либо ищем другое место для своих вопросов. Всё просто. А за вашу неудачную попытку позадавать дурацкие вопросы о том, что такое переменная, вы получаете предупреждение.
16:14
Сходите-таки почитать правила, чтобы понять, почему?
2 March 2019
К
12:41
Кузя
Доброго времени суток, у меня возник вопрос, можно ли использовать json вместо базы данных?
AK
12:44
Anton Kazakov
Можно но зачем?
АО
13:09
Алексей Овсянников
In reply to this message
Можно посмотреть в сторону NoSQL хранилищ
К
13:28
Кузя
In reply to this message
Что подразумевается под NoSQL?
АО
13:35
Алексей Овсянников
In reply to this message
Тип хранилищ данных
RR
21:15
Roman Roman
Нужно реализовать чтение .txt файла и запись в него вот таким путем BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/mytextfile.txt"))), этот способ не проходи в IDE getClass().getResourceAsStream, как можно его заменить?
RI
21:19
Ruslan Ibragimov
In reply to this message
Вот тут можно подсмотреть как пути до ресурсов указывать
A
21:24
Alex
In reply to this message
можно ли использовать красивое вместо соленого?
21:24
это я к тому что абсолютно не валидный ответ 🙂
AK
21:26
Anton Kazakov
Почему?
BV
21:28
Boris Vanin
In reply to this message
Запись в файл из класспаса? 😱
AM
21:30
Andrew Mikhaylov
Ну кстати да, за запись в лучшем случае по рукам даёт ОС, потому что исполняемый код обычно в рид-онли папочках живёт, в худшем -- ревьювер / пользователи, потому что в подавляющем большинстве случаев конфигурация должна жить отдельно от исполняемого кода.
RR
21:31
Roman Roman
Но с записью проблемки, нет такой возможности
AM
21:32
Andrew Mikhaylov
Ну это, сторого говоря, не в 100% случаев, пока класс-файлы не уложены в jar-ник, шанс записать есть, но это уже детали.
RR
21:40
Roman Roman
MySpec::class.java.getResource - это коревой каталог jar-ника?
21:41
In reply to this message
Я не понял пока класс-файлы не уложены, но скорее всего запущенный jar файл не может открывать на запись свои ресурсы?😊
AM
21:44
Andrew Mikhaylov
In reply to this message
Если у вас там не со слеша путь начинается -- то нет, это каталог, соответствующий пакету класса. Ща, я когда-то на стеке видел пояснение адекватное...
21:44
In reply to this message
Не может, верно.
21:46
Можно забрать файл из ресурсов, куда-то его распаковать и работать дальше с распакованным вариантом. Либо сначала проверять наличие файла в ФС по оговоренному пути, если его там нет -- читать из ресурсов.
RR
21:49
Roman Roman
У меня суть проблемы вообще в чем: heroku(хостинг) раз в сутки отправляет сигнал заснуть. И при этом он подчищает мой файл(*.txt) - все данные накопленные теряются.
Я думал засунуть тхт внутрь jar и тогда бы он был в сохранности)
21:53
In reply to this message
21:54
Как можно получить путь к ресурсам, если я не знаю абсолютный путь, т.е. на пк я могу это сделать, но я фиг знает как это указать путь если я отправил на сервер
21:55
Относительный путь указывается от текущей папки. Может можно через него укащать мол сделай "CD..")
AM
21:56
Andrew Mikhaylov
In reply to this message
Это успех, конечно. Даже если бы можно было каким-то образом править jar, после перезапуска машины разворачивается, похоже, собранный вариант, потому вам бы это всё равно не помогло.
BV
21:56
Boris Vanin
In reply to this message
На чтение: через класслоадер
RR
21:57
Roman Roman
In reply to this message
Спасибо, щас буду смотреть)
AM
21:57
Andrew Mikhaylov
In reply to this message
А я уже ругаться хотел, что ссылка выше была.
RR
21:58
Roman Roman
In reply to this message
Т.е. собирается проект заного?
AM
22:06
Andrew Mikhaylov
In reply to this message
Да нет, гугл подсказывает, что после сборки создаётся снэпшот виртуальной машины, и каждый новый инстанс стартует с этого снэпшота.
Но это уже очень мимо темы чата.
RR
22:10
Roman Roman
И значит, если я езменю тхт файл в ресурсах, то он всеравно должен вернуть первоначальный? Хотя может если он смотрит только по количеству файлов и именам, то можно в него что-то дописать же)
В общем спасибо, щас буду разбираться как записать в ресурсы)
AM
22:11
Andrew Mikhaylov
Вы его не измените. Этого нельзя делать. Технически. Точка.
BV
22:20
Boris Vanin
In reply to this message
Просто не надо этого делать, это как спрашивать какой пилой лучше пилить свой сук
22:21
Если хочешь менять, создай файл рядом и меняй его сколько угодно
AM
22:23
Andrew Mikhaylov
In reply to this message
У человека беда в том, что его приложение живёт как бы в контейнере, потому после остановки сервера всё, что лежало рядом, делает вжух вникуда. Вот и пытается безуспешно обойти (и не сможет, да).
RR
22:23
Roman Roman
In reply to this message
Это не решение проблемы, но я уже понял, что тут все уверяю, что нельзя записывать в папку ресурсов)
22:24
И внутрь jar файла тоже)
A
22:39
Alex
In reply to this message
Потому что json и база данных это совершенно разного класса вещи и не могут быть другом другом заменены
AK
22:42
Anton Kazakov
Хочу хранить простые key value пары. Что лучше бд или джсон/хмл и тп?
BV
22:43
Boris Vanin
Ну как, у контейнера тоже вольюмы бывают, если повезёт даже персистентные
22:44
Если совсем никак, то бд или файловое хранилище
22:45
Или nosql
22:45
Много вариантов
ع
22:45
عالم
sqlite норм будет
BV
22:46
Boris Vanin
Зависит от того какую проблему решаем
AM
22:46
Andrew Mikhaylov
In reply to this message
А где хранить файл БД, если локальная ФС не персистится?
ع
22:46
عالم
Для мелких пойдёт
22:46
In reply to this message
Костыли
AM
22:47
Andrew Mikhaylov
In reply to this message
В целом если хоть немного погуглить, чем топикстартер, наверное, таки должен был бы позаниматься, сразу же можно наткнуться на упоминания AWS S3 или hosted SQL. Было бы желание разбираться :)
BV
22:47
Boris Vanin
Нет смысла предлагать решение, если неясно что решаем
ع
22:48
عالم
Ну мож есть що универсальное тип pg
BV
22:49
Boris Vanin
In reply to this message
Есть, но к нашей теме это вроде отношения не имеет
ع
22:50
عالم
In reply to this message
Redis чекни
22:50
Кст
22:50
Redis
ru.wikipedia.org
Резидентная система управления базами данных класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ - значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений.
BV
22:51
Boris Vanin
In reply to this message
Для этого есть специализированные хранилища
AK
22:51
Anton Kazakov
Да я к тому что в каком то кейсе можно писать в файл( тот же джсон) и не брать бд
BV
22:53
Boris Vanin
In reply to this message
Можно, без проблем, тем более, что некоторые из них умеют работать локально
22:53
Но это если ты не в стейтлес контейнере работаешь
A
23:08
Alex
In reply to this message
да неправильный вопрос
23:08
тут либо хочу хранить в бд или хочу хранить в файлике
23:08
а формат это совершенно другой вопрос
джсон\хмл можно и в sql базе хранить
AK
23:11
Anton Kazakov
Человек спросил можно ли в каких то кейсах вместо бд писать в джсон файл - ответ да можно. Что тебе не нравится?
A
23:11
Alex
ну а ответ на вопрос что лучше зависит от ответов на многие другие вопросы:
тебе это вообще зачем? очевидно продакшен проект ты не пишешь, так что в принципе вообще все равно, бери то с чем сможешь разобраться, потом когда несколько раз подобную задачу решишь разными способами или почитаешь умных книженк - придет понимание
23:11
In reply to this message
про “файл” вроде не было упоминаний
A
23:12
Alex
К
Кузя 02.03.2019 12:41:17
Доброго времени суток, у меня возник вопрос, можно ли использовать json вместо базы данных?
23:12
AK
Anton Kazakov 02.03.2019 22:42:17
Хочу хранить простые key value пары. Что лучше бд или джсон/хмл и тп?
AK
23:13
Anton Kazakov
Ну по моему очевидно что он имел ввиду джсон файл
A
23:16
Alex
In reply to this message
а помоему нет, у людей разное восприятие, хочешь что бы тебе ответили - пиши четче и отвечай на вопросы, человек вон вкинул вопрос и пропал, значит не больно и хотелось, а тут разговоры разошлись 🙂 предлагаю на этом и закончить
AK
23:17
Anton Kazakov
Пока
3 March 2019
FL
00:16
First Last
Расскажите с чего начать старт перекатывания в бэкенд 🙃
00:16
(Помимо языка естесена)
ع
00:17
عالم
С докера и бд
FL
00:17
First Last
In reply to this message
Перекатывания же :(
00:17
(все не настолько печально)
ع
00:18
عالم
Ssl / tls
FL
00:18
First Last
Ещё дальше
ع
00:18
عالم
Яп
00:18
Машина
FL
00:18
First Last
А теперь если серьёзно? 🙃
ع
00:19
عالم
С чего начинать обучение backend-разработчику... — Toster.ru
toster.ru
С чего начинать обучение backend-разработчику и какой минимум знаний нужен на junior'а в 2016-2017? И само собой главная дилемма для меня на данный момент: с чего начать само обучение. С изучения алгоритмов и дискретки, или архитектуры компьютера.
FL
00:19
First Last
Мне интересны стандарты в котлине
И, возможно, процессы если они в чем то отличаются
A
00:19
Alex
In reply to this message
Изучи клиент серверную архитектуру, напиши свою такую систему. Вопрос слишком общий
FL
00:19
First Last
In reply to this message
Перекатывания х3
00:20
In reply to this message
Чуть выше конкретика
A
00:20
Alex
In reply to this message
Ты что жёлтый колобок?
FL
00:20
First Last
In reply to this message
Зелёный 🙃
A
00:20
Alex
In reply to this message
Какие процессы? Какие стандарты? Http/SQL/json мастхев
FL
00:21
First Last
In reply to this message
Процессы разработки
Стандарты речь про вещи которые в котлине мастхев
A
00:21
Alex
In reply to this message
Котлин коанс мастхев.
FL
00:22
First Last
In reply to this message
Это не аналог рубишному надеюсь?
A
00:22
Alex
Ктор и другие чисто котлин подделия под вопросом
00:22
In reply to this message
Не знаю что там в руби (бог миловал)
FL
00:23
First Last
In reply to this message
Оно 🙃
A
00:23
Alex
In reply to this message
Процесс - берешь и делаешь? Разве не подходит? 😀
FL
00:23
First Last
In reply to this message
Ясненька
A
00:23
Alex
In reply to this message
В руби иначе?
FL
00:23
First Last
Ясненька
00:24
(понятия не имею как в руби)
00:26
In reply to this message
Что по готовым решениям мастхев? 🙃
A
00:27
Alex
In reply to this message
Что значит готовое решение? Интернет блог под ключ? (типо ВордПресс?)
FL
00:27
First Last
In reply to this message
И снова ты не угадал с языком
A
00:28
Alex
In reply to this message
А я разве гадал язык? Я тебя не понимаю
FL
00:28
First Last
In reply to this message
🙃
A
00:28
Alex
Я гадал что ты понимаешь под словами "готовое решение"
FL
00:28
First Last
In reply to this message
Ты пытался
A
00:29
Alex
Ладно, мне сильно начинает казаться что ты меня тупо троллишь
00:29
Спокойной ночи
FL
00:29
First Last
In reply to this message
А мне кажется обратное :)
A
00:29
Alex
In reply to this message
Ок, споки ноки
FL
00:29
First Last
Какой человек будет валить с вордпресса на Котлин?
00:29
🙃
АО
03:17
Алексей Овсянников
In reply to this message
Мне почему-то кажется, что есть некоторое непонимание разницы и того, где можно использовать вордпресс, а где - котлин
Н
03:40
Никита🎄🎄🎄
In reply to this message
Ну чат для начинающих же, вот и не понимают)
03:40
(шутка)
BV
04:39
Boris Vanin
In reply to this message
В смысле, с больной головы на здоровую?
FL
08:25
First Last
In reply to this message
Я сомневаюсь что она вообще существует в таком случае 🙃
08:25
In reply to this message
Тебе кажется :)
TT
21:56
Turalllb Turalll
Кто нибудь читал Kotlin for android developers ? Есть там что то что нельзя уместить в пару статей?
22:08
Как думаете обязательное написание val либо var использовали с целью заставить разделять константы и переменные? В java ведь final не заставляли писать. А тут вот решили что это очень важно заставлять это делать. И есть ли плагин для анд студии, чтобы не писать val? Чтобы он был по дефолту если я не написал var
AM
22:19
Andrew Mikhaylov
In reply to this message
Не обязательно, пишите везде var. Кроме этого, не забудьте везде использовать nullable-типы (в Java же не заставляют аннотацию @NonNull вешать и руками значения на null проверять). Ещё стоит перестать пользоваться дефотлными и именованными параметрами (это опциональная фича в котлине, а в джаве этого вообще нет), перестать писать экстенш-функции, да и много чего ещё выбросить из своего кода.

Плагин, который выбрасывает из котлина ненужные, бесполезные и даже вредные фичи, к сожалению, вам придётся писать самостоятельно, так как вы технически уже для другого языка поддержку просите.
TT
22:26
Turalllb Turalll
И зачем мне писать везде var? Одна из целей котлин лаконичность, так вот хотелось бы не писать лишнее. В данном случае var или val можно заменить на пустое значение, в разработке под андроид заменял бы var на пустоту, т.к . изменяемые ссылки там встречаются чаще.
22:26
Почему такой плагин придется писать самостоятельно, может его уже кто то написал
AM
22:28
Andrew Mikhaylov
Ну а если серьёзно -- это не то, чтобы критически обязательно, но очень удобно. Во-первых, у вас может быть public val, зависящий от private var, и вы тем самым можете продолжать пользоваться проперти-синтаксисом, но ограничивать запись снаружи. Во-вторых, val вместо var позволяет компилятору делать дополнительные выводы о коде, что очень помогает при работе с nullable-типами (smart cast может сработать в рамках блока if(myVal != null), и компилятор будет знать, что это значение снаружи не поменяется). В-третьих, вы сами себе расстановкой val-ов помогаете делать дополнительные выводы о коде -- видя в очередном месте val, вы понимаете, что это поле не предполагается менять. Есть наверняка ещё с десяток причин, которые я не написал спросонья только потому, что это настолько очевидно полезная хрень, что мне даже не приходилось никогда об этом задумываться.
FL
22:29
First Last
In reply to this message
Пробовал хаскель?
22:29
Там вообще нету переменных
22:29
Действуй!
AM
22:30
Andrew Mikhaylov
Жестокий совет андроидщику, который хочет вместо read-only значений переменные везде использовать :)
FL
22:30
First Last
In reply to this message
Он хочет меньше синтаксиса писать
22:31
Что есть полная ересь
TT
22:31
Turalllb Turalll
In reply to this message
Нет, я не программист, я физик. Я только на qbasic полтора года активно писал. И потом на java. И знаю только ооп парадигму, вот пытаюсь понять, в чем идея убирать переменные совсем. Понимаю final для безопасности устанавливать где надо.
FL
22:32
First Last
In reply to this message
Просто пиши 3 лишних буковки и не напрягайся, серьезно :)
TT
22:32
Turalllb Turalll
Сейчас я прочту сообщение выше .. Не торопите)
DC
22:34
Denis Chikanov
In reply to this message
Нет, потому что это очень странные и специфичные требования.
TT
22:36
Turalllb Turalll
In reply to this message
Ни за что. Var в моем коде не будет. Так же как его не было в java. Оно там было по дефолту. Ну или ради того чтобы бить самого по рукам не приходилось когда надо константу, а я ее переменной делаю, ради этого val по дефолту сделаю. Чужая ide будет видеть все как она хочет видеть, а я не хочу видеть одно из этих значений. Я java синтаксис после qbasic с первой строчки понимал, как будто знал его всегда. А тут бесят. Полгода уже смотрю на этот котлин и никак не возьмусь отталкивает синтаксис. А использовать котлин надо, т.к. действительно плюсов много.
FL
22:36
First Last
In reply to this message
Но val ведь тоже 3 буковки :(
RI
22:39
Ruslan Ibragimov
In reply to this message
Если что с java 10:

public static void main(String... cheese) {
var ha = "Hello, Java 10";
}


это валидный синтаксис
22:39
А val в Kotlin это аналог final var в Java
TT
22:40
Turalllb Turalll
In reply to this message
Именно, аналог var где? Он по дефолту
RI
22:41
Ruslan Ibragimov
In reply to this message
// kotlin:

var a = "hello"

// java:

var a = "hello";
AM
22:41
Andrew Mikhaylov
In reply to this message
Давайте так. Вы попросили объяснить, зачем нужно использовать val, я попытался ответить. Конструктивные вопросы будут? Или вы просто планируете рантить по поводу синтаксиса, который вам не нравится? С последним мы вряд ли что-то сделаем.
TT
22:41
Turalllb Turalll
In reply to this message
А теперь нихера не понимаю. Что значит var в ява ?
AM
22:41
Andrew Mikhaylov
In reply to this message
Переменная, тип которой выводится компилятором.
RI
22:42
Ruslan Ibragimov
In reply to this message
Не следите за языком) Там с 10 версии вот такой jep приняли https://openjdk.java.net/jeps/286
TT
22:44
Turalllb Turalll
In reply to this message
Не в этом дело. А в том что смысл var я немного не так понял. Выходит var пишем только когда не пишем тип (когда тип должен сам выводиться). А когда я сам пишу тип , var писать не надо?
RI
22:45
Ruslan Ibragimov
In reply to this message
Ну чаще всего писать тип не нужно, поэтому просто пишем var name = ...
22:46
если нужен тип (что крайне редко в моей практике) то добавляем тип: var name: String? = ...
TT
22:48
Turalllb Turalll
In reply to this message
А var о чем сообщает в таком случае? Тип указан. И без var ясно, что это переменная, а не константа, т.к. если бы это была константа, то было бы написано val.
RI
22:48
Ruslan Ibragimov
о том что мы объявляем в этом месте переменную
FL
22:49
First Last
In reply to this message
var/val не влияют на тип (в том смысле в котором ты сейчас это понимаешь)
22:49
То есть, ты можешь использовать var с указанием типа, а можешь и без указания
Ей плевать
AM
22:51
Andrew Mikhaylov
In reply to this message
Ещё раз: такой у языка синтаксис. Менять его никто не будет.
22:56
Между делом, синтаксис, который вы предлагаете, будет потенциально пересекаться с присваиванием.
Пример:

var a: Int = 5
var b = 5
b = 5
22:57
При учёте, что var и val используются также для локальных переменных, это будет знатный способ отстрелить ногу на уровне golang.
AL
22:57
Alexander Levin
In reply to this message
Котлин не является языком, который поддерживает мутабельность по умолчанию, поскольку он, как и куча современных языков, предлагает юзать больше всего иммутабельного. Хочешь мутировать - скажи явно. Это уже является минимальной причиной, почему концепт var по умолчанию не может существовать.

Другой уже упомянутой причиной будет просто консистентность. Язык пляшет от эффективной возможности делать вывод типов, поэтому более полезной инфой для нас будет факт того, что является ли этот кусок кода константой, переменной или чем-то ещё. Типы это то, что ИНОГДА появляется. Усложнять язык ради относительно редкого кейса довольно странно (да, такой синтаксис ещё банально проще из-за своей консистентности)


Также от обратного - аргументация, что раз вы с QBasic легко перешли на джаву из-за синтаксиса, не делает синтаксис джавы хорошим (как и плохим, это просто ничего не значит)
22:59
In reply to this message
Справедливости ради, он вроде предлагал скорее такое:
b: Int = 5


Тут пересечений особо нет, хотя неконсистентность из джавы появляется, да.
RI
22:59
Ruslan Ibragimov
In reply to this message
ну и такой синтаксис будет странно смотреться, если рядом объявить

val a = "5"
b: Int = 5
AM
22:59
Andrew Mikhaylov
In reply to this message
Ну то есть предлагается писать либо b: Int = 5, либо var b = 5?
23:00
Тогда, конечно, действительно пересечений нету, но выглядит это так себе.
AL
23:01
Alexander Levin
In reply to this message
Да, вроде того, т.е. то, что есть прямо сейчас в джаве, просто тип с другой стороны. Но да, я уже пояснил выше, почему мне лично это не ок :)
TT
23:02
Turalllb Turalll
In reply to this message
В идеале избавиттся от двоеточия, этот символ уж очень неудобно на клаве расположен, уж точно не так легко его писать, как пробел. В идеале Int b = 5 или var b = 5 , хотя что сложного Int писать...
23:04
Зачем заставлять народ привыкать к типу в конце после двоеточия. Чем плох был способ писать его до названия? А я вам скажу, чтобы котлин отличался , чтобы он был не такой как ява. Я читал их книгу, это бля маркетинг сплошной. Они гееиальны во всем. Всех наебали
AM
23:04
Andrew Mikhaylov
@Turalllb отвечая на ваш вопрос из kotlin_jvm: типы справа от переменных и возвращаемые типы справа от функций как раз для того, чтобы их можно было опускать при наличии автоматического вывода типов. В C++, где такую штуку добавили пост-фактум, пришлось перестало звать ключевое слово auto, а для вывода возвращаемого типа на основании параметров -- бадум-тсс -- можно вывернуть это синтаксически и писать (auto a, auto b) -> decl_type(a+b). То есть даже в консервативном языке вроде плюсов от этого не ушли частично.
RI
23:04
Ruslan Ibragimov
In reply to this message
Я думаю стоит остановиться на том, что Kotlin не идеальный язык, и что Kotlin уже в этом плане координально не изменится. Так что лучше начать привыкать :)
TT
23:05
Turalllb Turalll
И еще эти fun , ну нафиг они нужны.
AM
23:06
Andrew Mikhaylov
Да не пишите, ну кто ж вас заставляет. Наверняка есть JVM-язык вроде Цейлона им чего-то другого, где этого нет.
TT
23:06
Turalllb Turalll
А вот то что точку запятой убрали , сократили вроде бы синтаксис, он остался ли он таким же читаемым ? Считаю нет. Но тут надо еще подумать.
AM
23:07
Andrew Mikhaylov
Ой, хватит, я вас прошу. Тут чат для вопросов новичков, а не для страданий по поводу синтаксиса. Синтаксис есть, он консистентный, и большому количеству разработчиков он нравится.
TT
23:07
Turalllb Turalll
In reply to this message
Да..и андроид так то гавно галимое. Везде бизнес рулит. Все упирается в деньги.
AM
23:08
Andrew Mikhaylov
In reply to this message
Пишите своё, я уверен, вы много всего хорошего сделаете, питаясь солнечным светом :)
AL
23:08
Alexander Levin
In reply to this message
1. Ещё раз, в чате есть правила, грубая речь не сильно поможет решению вопроса.

2. Самое ключевое, что нужно уловить - у синтаксиса есть плюсы, некоторые для читателя, некоторые для писателя, некоторые для разработчиков. Они объективные. Язык не обязан совпадать по синтаксису и это не первый язык, который использует такую нотацию. И если такие небольшие изменения в синтаксисе заставляют так страдать - это надо править в голове, а не в языке.
TT
23:08
Turalllb Turalll
In reply to this message
Я надеялся что мне скажут что этот var нужно где то в дебрях котлин для определенного анализа и упрощения и в дальнейшем он даст свой выхлоп..но увы
AL
23:09
Alexander Levin
In reply to this message
Хочешь - ставь, её сделали опциональной, а не убрали.
TT
23:09
Turalllb Turalll
In reply to this message
Хоть что то приятное услышал)
AM
23:10
Andrew Mikhaylov
In reply to this message
Он нужен самому компилятору языка, потому что любое определение переменной начинается либо с var, либо с val, в свете чего исходники парсятся быстро и однозначно.
FL
23:10
First Last
In reply to this message
> в дальнейшем он даст свой выхлоп
Выдаст ведь
AL
23:12
Alexander Levin
In reply to this message
Опять-таки причина похожа - консистентность и последовательность. Это очень важный пункт для языков, которые могут иметь сильный вывод типов.
FL
23:12
First Last
Как начать писать на ktor?
Исключая ответ "начни писать"
Что мастхев попробовать, к примеру?
TT
23:12
Turalllb Turalll
In reply to this message
Ну вот могли бы так ответить сразу. Это уже аргумент, а не то что выше было. Ведь это же всего три буквы. Сейчас эти три буквы дают хоть какую то выгоду и теперь мне стоит подумать Три буквы или быстрый парсинг кода (и дествительно ли он станет быстрее)
В
23:12
Вафель
In reply to this message
А что именно вы хотите? Сайт, апи, что-то клиентское?
DC
23:12
Denis Chikanov
In reply to this message
Мастхев попробовать написать приложение/сервис на ktor, видимо.
FL
23:12
First Last
In reply to this message
Апи
AL
23:13
Alexander Levin
In reply to this message
Ну, из очевидного - https://ktor.io/quickstart/index.html
Далее уже следует из того, зачем это вам :)
DC
23:13
Denis Chikanov
In reply to this message
Из того факта, что эти буквы необходимы, и без них код не компилируется, прямо и однозначно следует, что они необходимы компилятору, это должно было быть понятно с самого начала.
AL
23:14
Alexander Levin
In reply to this message
Ну, тот факт, что такой синтаксис легче для разбора компилятору, выше был :)
AM
23:15
Andrew Mikhaylov
In reply to this message
Ну просто парсер языка можно написать как угодно, и можно спокойно var опустить, и скорость разбиения на лексемы от этого вряд ли сильно упадёт, хотя есть вероятность, что будут какие-то неоднозначности в угловых случаях (а может, и нету). Просто убирание var никакой пользы не несёт, кроме эфемерных -4 нажатий клавиш.
TT
23:19
Turalllb Turalll
In reply to this message
Это не так. Вы не знаете мою ситуацию. Я могу просто не использовать котлин, а продолжать писать на java. А нужные мне плюсы от kotlin добавить в виде биьлиотек. Например мы пишем println , да до коротко, но библиотека для этого в java давно была. Удобно не писать гет , сет методы, опять же юзать либу. В итоге сижу на приятном синтаксисе и имею плюсы. Ну это так грубый пример. Ведь я еще не читал что такое корутины , а их очень хвалят. Мб действительно что то нужное
DC
23:20
Denis Chikanov
In reply to this message
Грамматика, задающая синтаксис языка, совершенно не зависит от вашей ситуации. Как вообще ваш ответ связан с тем, что я написал?
AL
23:20
Alexander Levin
In reply to this message
А в чём проблема знать несколько синтаксисов? Ну т.е. это довольно обычная картина для разработчика.
TT
23:21
Turalllb Turalll
In reply to this message
Да все в итоге опирается в простой вопрос, типа зачем писать fun. Ответ на него и есть ответ на все мои остальные вопросы. Наверно надо было с этого и начать. И мне ответили зачем писать fun
23:22
In reply to this message
В случае когда можно не знать и иметь все плюсы от нового языка , это проблема.
AM
23:22
Andrew Mikhaylov
In reply to this message
А как вы планируете не знать синтаксис языка, но иметь его плюсы?
23:23
Вы ж не всерьёз про свой плагин для андроид студио писали?
TT
23:24
Turalllb Turalll
In reply to this message
Из вашего прошлого сообщения я понял, что вы хотите сказать так: котлин уже написан, так как написан, какая мне разница теперь можно было не писать var или писать.
AL
23:25
Alexander Levin
In reply to this message
И снова справедливости ради, я в какой-то момент думал о похожем плагине, но в другую сторону - выкинуть var'ы вообще и давать возможность не писать слово val. Коллизий нету, синтаксис оправданно немного лаконичнее.
В некоторых случаях такое было бы удобно. Не всегда, конечно.
DC
23:25
Denis Chikanov
In reply to this message
Он действительно написан так, как написан, и дело не в том, что "какая разница", а в том, что вы стоите перед фактом - есть такой язык. Если вы хотите его использовать, вам надо пользоваться его синтакисом. Не хотите - пользуйтесь другим языком.
TT
23:27
Turalllb Turalll
In reply to this message
Нет. Снова не так понимаете. Я через вас, тех кто поклоняется, грубо говоря ,котлин , хочу спросить у jetBrains зачем они измениои расположение типа. Тип был до названия. А тут в конец кинули и двоеточие добавили. Они же хотели совместимый, макстмально удобный переход с java сделать.
AM
23:28
Andrew Mikhaylov
In reply to this message
А, я неправильно понял сообщение, на которое отвечал, прошу прощения.
TT
23:29
Turalllb Turalll
In reply to this message
Ну вы считаете, что статьи на хабре осуждающие синтаксис котлин бессмысленны ? Они так же возмущаются. Увидив это, другие кто будут писать свой язык, примут во внимание. Или же сами jetbrains добавяь плагины
AM
23:29
Andrew Mikhaylov
In reply to this message
Мне почему-то кажется, что минусов у такого решения больше, чем плюсов, хотя звучит и интересно :)
DC
23:30
Denis Chikanov
In reply to this message
1) Да, бессмысленны
2) Нет, не добавят, потому что нет ни одной внятной причины так делать и вставлять самим себе палки в колёса
TT
23:30
Turalllb Turalll
In reply to this message
Охренеть) Ну я с этого вопроса и начал. Я хотел имено такой плагиН
AM
23:30
Andrew Mikhaylov
In reply to this message
Хороших, увы, пока не было. Те, что есть, действительно бессмысленны. Синтаксис -- вторичная штука, а статьи ругают на 95% именно его.
AL
23:30
Alexander Levin
In reply to this message
Переход функциональный, не синтаксический. Программистам в любом случае нужно немного времени, чтобы по-человечески писать на новом языке, а не делать кальки со старого. Не нужно пытаться сделать язык без порога обучения, который пытается делать вещи лучше.

Причин уже не одну назвали и ещё раз, они не первые (собственно это они честно повзаимствовали из Scala, как Бреслав признавался). Если хотите, могу повторить все в одном месте, но чат не настолько велик.
23:32
In reply to this message
Как и сказал, вы просили наоборот - var'ы по умолчанию, а val'ами пренебречь. Это противоречит концепции языка, приводит либо к проблемам с переопределением, либо к неконсистентности.

Оставить только val'ы идейно и идеологически более простая задача.
TT
23:34
Turalllb Turalll
In reply to this message
Я сказал либо то либо другое. А почему убрать var противоречит концепции, не понял. Но писать об этом не нужно, я лучше ближе ознакомлюсь с этим делом и потом поразмыслю.
AL
23:35
Alexander Levin
In reply to this message
Ну, конкретно мне для большинства моих программ на Котлине подошло бы. Проблемы то понятные, часть программ, где мутабельность помогает, будет больно писать. Поэтому это я размышляю об этом чисто как о плагине, а не как стандарте языка (для такого как стандарта уже предложен Хаскель, да)
TT
23:37
Turalllb Turalll
Еще раз пожалуйста объясните в чем смысл fun ? Перечитал сообщения выше, но не въехал
AM
23:38
Andrew Mikhaylov
In reply to this message
По первому hard keyword понять компилятору, определение чего конкретно следует справа. Так же, как и var с val-ом.
TT
23:38
Turalllb Turalll
В javascript вообще function )
AM
23:38
Andrew Mikhaylov
In reply to this message
Ну камон, вы серьёзно продолжаете буквы конкретные обсуждать?
FL
23:39
First Last
In reply to this message
Никто не пишет 🙃
AL
23:39
Alexander Levin
In reply to this message
Аналогично явному написанию val/var - проще для компилятора разбирать, проще для читателя с первого слова понять что к чему (не с середины фразы), можно опустить тип в каких-то случаях без потери читабельности.
AM
23:39
Andrew Mikhaylov
In reply to this message
Дык там же вроде function и не function с разной областью видимости работают, нет? :)
FL
23:40
First Last
In reply to this message
Тебе не всегда нужна стрелочная функция чтобы опустить function слово
AM
23:41
Andrew Mikhaylov
In reply to this message
Вероятно. Я давно на чистом JS писал, потому, вероятно, позабывал детали (каеф).
TT
23:46
Turalllb Turalll
In reply to this message
Ну с первым соглсасен, со вторым отчасти. А как думаете зачем эти товарищи тип переставили в конец после двоеточия? Выше вы сказали, что они позаимствовали это из Scala, но java ведь популярнее scala, и писать до названия тип так приятно.. Эх
23:47
Ладно, спасибо большое за ваши ответы, пойду дочитывать книгу))
RI
23:47
Ruslan Ibragimov
In reply to this message
Перечитайте сообщение реплай к которому вы написали
TT
23:51
Turalllb Turalll
In reply to this message
Если перечитать, то появляется еще вопрос. Там пишут что fun удобен тем что ясен смысл из первого слова. Но тем не менее Тип перенесли в конец. Ну может двоеточие поставили ради читабельности. И кстати хотя бы это вот можно плагином поправить, пусть типы будут написаны там где их пишут в java. Ладно. Я понял многое, спасибо за дискуссию.
AM
23:53
Andrew Mikhaylov
AM
Andrew Mikhaylov 03.03.2019 23:04:31
@Turalllb отвечая на ваш вопрос из kotlin_jvm: типы справа от переменных и возвращаемые типы справа от функций как раз для того, чтобы их можно было опускать при наличии автоматического вывода типов. В C++, где такую штуку добавили пост-фактум, пришлось перестало звать ключевое слово auto, а для вывода возвращаемого типа на основании параметров -- бадум-тсс -- можно вывернуть это синтаксически и писать (auto a, auto b) -> decl_type(a+b). То есть даже в консервативном языке вроде плюсов от этого не ушли частично.
AM
23:53
Andrew Mikhaylov
"перестало звать" -> "переиспользовать".
23:55
Бреслав с командой — прагматичные люди. Поверьте, они не будут что-то добавлять / менять, не имея на то причины.
AL
23:58
Alexander Levin
In reply to this message
Причина простая - тип побочен, с ним справится язык. В джаве не так. Исходя из этой идеи, нам важнее просто понимать, что есть значения, что есть функции и т.д., поэтому они в начале. Тип менее важен, он в конце. Ну и тип в конце это продолжение удобства для компилятора (тут упоминали - https://youtu.be/xH-RZ9YlxH0?t=1025 , таймстэмп примерно)
4 March 2019
TT
00:07
Turalllb Turalll
In reply to this message
Ну я насчет возвращаемого типа. Его же можно было на месте оставить. Ничего не возвзвращаем ставим пустоту (void в java). Но это изменение наверно уже для соответствия стилю. Т.к. при инициализации переменных тип тоже справа от названия. Хотя будь он слева, то его так же можно опускать при использовании автоматического вывода типов
AM
00:08
Andrew Mikhaylov
In reply to this message
Как вы себе это представляете? Java-style, int a = 5 против var a = 5?
TT
00:09
Turalllb Turalll
In reply to this message
Ну var ключевое слово, его итак запомнить придется. А вот при парсинге кода надо будет проверять на месте типа стоит var или нет.
AM
00:10
Andrew Mikhaylov
И в Java, и в C++, где автовывод добавили намного позже момента создания языка, пришлось вводить костыль в виде ключевого слова, которое заменило бы тип, включив его автовывод. В языках, где автовывод есть из коробки, тип указывается справа, для того, чтобы его можно было либо поставить, либо опустить, не думая, что при его опускании нужно сделать какие-то другие телодвижения. В довесок к этому парсеру тоже проще жить.
00:11
Я не знаю, в какой форме мне ещё раз надо эти слова сложить, чтобы мысль стала очевидной, но пишу я её уже раз третий, наверное :)
DC
00:11
Denis Chikanov
In reply to this message
Мне кажется, если человек за те 5+ раз, которые это написали разные люди, не понял, можно перестать объяснять
TT
00:19
Turalllb Turalll
In reply to this message
В этой расстановке слов намнрого понятней)) надо просто на свежую голову с утра перечитать, разница обычно коллоссальная )
00:20
In reply to this message
А мне кажется, что вы не пробовали аргументировать. Готовые ответы(сделанные вами выводы) людям которые учатся пользы не дадут.
AM
00:20
Andrew Mikhaylov
Я вам по секрету скажу, понятнее всего становится, когда начинаешь языком пользоваться. Поначалу получается довольно жуткий код, но со временем проникаешься и понимаешь "фишки". Потому стоит практиковаться, возможно, вопросы и поотпадают.
00:21
И да, книжки — это хорошо, но не решает вопрос практики :)
TT
00:21
Turalllb Turalll
In reply to this message
Окей,спасибо за помощь)
I
11:37
Ilmir
In reply to this message
Язабан
AM
12:59
Andrew Mikhaylov
In reply to this message
Токсично 🌚
SS
17:04
Sergey Sverdlov
Я правильно понимаю, что из коллекций в библиотеке Котлина есть только Array, List, Set и Map c вариантами Mutable? А остальные,типа BitMap, HashMap и пр. из Явы считается, что как бы и не нужны. То есть на "чистом" Котлине лучше обходиться этими четырьмя?
АО
17:06
Алексей Овсянников
In reply to this message
Они являются реализациями
AM
17:06
Andrew Mikhaylov
In reply to this message
Map, ЕМНИП, построен на LinkedHashMap, у Set оттуда же ноги должны расти по идее. Array нужно применять практически никогда. Потому для общих случаев там за абстрактными Set и Map адекватные дефолтные реализации, о которых можно не вспоминать.
АО
17:06
Алексей Овсянников
В коммон версии нет хэшмапов и всего такого, там есть mutableList, внутри которого происходит созлание списка под платформу
SS
17:06
Sergey Sverdlov
Кто они?
AM
17:07
Andrew Mikhaylov
In reply to this message
hasMapOf вроде был, кстати.
АО
17:07
Алексей Овсянников
In reply to this message
HashMap, ArrayList, HashSet
17:07
In reply to this message
Может, не пользовал
SS
17:07
Sergey Sverdlov
In reply to this message
Я не понимаю Ваших ответов
АО
17:08
Алексей Овсянников
In reply to this message
Есть интерфейс, он говорит, что для листа (списка) определен такой вот список методов и параметров (размер, взять элемент, получить итератор). Этот интерфейс общий для всех платформ
17:09
Есть ArrayList - реализация списка на Java, она же реализация котлиновского списка (если утрировать). Когда вы делаете listOf - в джаве будет создан ArrayList, возвращен как List котлиновский
RI
17:09
Ruslan Ibragimov
In reply to this message
Вы не разобрались в коллекциях, из вашего вопроса следует что вот это не скомпилируется:
SS
17:09
Sergey Sverdlov
Уточняю.
1. Правильно ли я перечислил типы коллекций из родной библиотеки (насчитал 4).
2. Значит ли это, что предполагается, что их и достаточно?
3. Мне совершенно понятно, что внутри у этих, что-то из Явы.
АО
17:12
Алексей Овсянников
In reply to this message
1. Возможно, еще есть Queue и пр. стандартные, но основные вы перечислили
2. Думаю, да. Насколько мне известно, котлин стараются не перегружать
SS
17:12
Sergey Sverdlov
In reply to this message
1. Если бы я совсем разобрался, то и не спрашивал бы.
2. Из моего вопроса не следует никаким образом, что не компилируется.
RI
17:13
Ruslan Ibragimov
In reply to this message
2. следует, потому что вы не отличаете интерфейс от реализации
АО
17:13
Алексей Овсянников
In reply to this message
Как раз хотел написать об этом
SS
17:13
Sergey Sverdlov
In reply to this message
Queue, скорее, нет, потому что Stack - точно нет.
RI
17:14
Ruslan Ibragimov
Map -> Java
Map+MutableMap -> Kotlin

Это просто интерфейсы
17:14
HashMap является реализацией всех трех интерфейсов
17:15
Нужна ли котлину зачем-то своя HashMap на JVM? Да нет конечно, можно использовать (и она используется) из Java
SS
17:21
Sergey Sverdlov
In reply to this message
Хорошо. Интерфейсы. Они, однако (4, а не больше), определены в котлиновской библиотеке (в отличие от HashMap) и тем самым, я не должен в своей программе импортировать что-то из Явы.
RI
17:22
Ruslan Ibragimov
In reply to this message
И? В чем собственно проблема импортировать что-то из явы?
SS
17:23
Sergey Sverdlov
In reply to this message
Мне не нравится импортировать что-то и Явы без острой необходимости. Доктор сказал Котлин - значит Котлин
AM
17:23
Andrew Mikhaylov
In reply to this message
Во-первых, котлин про интероп с джавой, потому импортируйте на здоровье.
Во-вторых, в той же stdlib котлина есть функции вроде mutableMapOf<A, B>(...): MutableMap<A, B>, которые под капотом возвращают джавовские LinkedHashMap, тем самым убирая необходимость импортировать джавовые реализации коллекций.
17:24
То есть если вам на самом деле не важно, КАКУЮ реализацию Map использовать — используйте котлиновские mapOf и иже с ними. Если важна конкретная реализация — вперёд, импортируйте и используйте её.
SS
17:24
Sergey Sverdlov
И еще я подумал, что разработчики побеспокоились о том, чтобы я не забивал себе голову лишними словами и оставили только строго необходимое.
RI
17:25
Ruslan Ibragimov
In reply to this message
Кому-то var не нравится писать, но там тяжело что-то исправить. А в данном случае можно писать аналоги всех необходимых классов определенных на языке программирования ява. К сожалению в виду объективных причин у команды котлин не хватает на это времени, но зато вам обеспечена слава если вы перепишете все нужные классы с явы на котлин
AM
17:25
Andrew Mikhaylov
Вот моё последнее сообщение как раз об этом — в отличие от джавы, вам не надо забивать голову тем, какая реализация вам нужна, если в этом нет необходимости.
SS
17:29
Sergey Sverdlov
Чего-то вы тут господа какие-то злые и агресивные. Притащили эту агрессию из основного чата. При том, что на заданные вопросы прямо отвечать не умеете и даже суть вопросов не вполне понимаете. Я сформулировал, по-моему, кратко, конкретно и даже по пунктам. А мне зачем-то про славу... Чисто троллинг и офтоп.
AM
17:30
Andrew Mikhaylov
Позвольте поинтересоваться, чем конкретно мои ответы не угодили?
17:31
Вроде ж стараюсь доходчиво писать, а вы никак не отреагировали, уточняющих вопросов не задали. Хочу понять, как отвечать лучше.
SS
17:35
Sergey Sverdlov
In reply to this message
Все хорошо. Спасибо
AM
17:35
Andrew Mikhaylov
Я могу понять раздражение Руслана, так как вам три человека отвечает на вопросы, а вы лишь отвечаете, что мы ваши вопросы не понимаем и прямо отвечать не умеем. Давайте конкретнее. Мы здесь вроде пытаемся помогать друг другу, но очень хотим диалог, а не битьё с двух сторон о стелко, что сейчас наблюдается — вы игнорируете наши ответы и не уточняете свои вопросы, мы не в состоянии донести мысль так, чтобы она была ясна вам.
SS
17:37
Sergey Sverdlov
SS
Sergey Sverdlov 04.03.2019 17:09:55
Уточняю.
1. Правильно ли я перечислил типы коллекций из родной библиотеки (насчитал 4).
2. Значит ли это, что предполагается, что их и достаточно?
3. Мне совершенно понятно, что внутри у этих, что-то из Явы.
AM
17:37
Andrew Mikhaylov
RI
Ruslan Ibragimov 04.03.2019 17:14:00
Map -> Java
Map+MutableMap -> Kotlin

Это просто интерфейсы
17:37
HashMap является реализацией всех трех интерфейсов
SS
17:38
Sergey Sverdlov
In reply to this message
Извините, но я не спрашивал, что является реализацией этих коллекций.
AM
17:38
Andrew Mikhaylov
Вы поинтересовались изначально, нужны ли джавовские HashMap-ы, вам ответили, что они там под капотом и используются.
17:39
Мы же с этого начинали, верно?
AM
17:39
Andrew Mikhaylov
SS
Sergey Sverdlov 04.03.2019 17:04:14
Я правильно понимаю, что из коллекций в библиотеке Котлина есть только Array, List, Set и Map c вариантами Mutable? А остальные,типа BitMap, HashMap и пр. из Явы считается, что как бы и не нужны. То есть на "чистом" Котлине лучше обходиться этими четырьмя?
AM
17:39
Andrew Mikhaylov
Мысль была в том, что Map и HashMap — это не две штуки, одна из которых нужна, вторая нет.
17:41
Касательно остальных типов структур данных вроде Queue и Stack вы, собственно, сами ответили — их действительно нет. Это не мешает использовать джавовские интерфейсы.
SS
17:43
Sergey Sverdlov
In reply to this message
Вот снова. Вопрос был не в том, что "под капотом". И я видел, что котлиновские - это "псевдонимы" каких-то явовских (не важно каких). Вопрос, в конце концов, просто про слова. Используем слова Map, Set, List и можно про другие слова даже не знать.
17:44
Я пойду домой, пожалуй. Спасибо
AM
17:44
Andrew Mikhaylov
Всего доброго.
DC
17:45
Denis Chikanov
In reply to this message
Так ну ё-моё, сформулируйте вопрос так, чтобы его можно было понять окружающим.
А вы почему-то противопоставляете котлиновский интерфейс Map реализациям аналогичного интерфейса из джавы - HashMap, в том числе.
AM
17:46
Andrew Mikhaylov
Есть подозрение, что тема закрыта.
DC
17:47
Denis Chikanov
In reply to this message
Да я тоже в общем-то закончил, если что. Всем мир.
AM
17:48
Andrew Mikhaylov
Я бы с радостью добавил в правила пункт про необходимость задавать понятные вопросы, но это ж субъективщина и распри о формулировках всё равно никуда не денутся. Я с Денисом согласен, и остальные отвечающие ровно за это зацепились, но уточнение не получилось, получился негатив. Если у кого-то есть предложения, как это улучшать — милости просим.
DC
17:50
Denis Chikanov
In reply to this message
Это понятно, что отрегулировать такое сложно.
SS
17:50
Sergey Sverdlov
In reply to this message
Еще добавьте в правила необходимость на вопросы отвечать прямо, и перед ответом пытаться понять, что спрашивают.
17:51
Bye!
AL
17:56
Alexander Levin
In reply to this message
На всякий случай напоминаю, что помощь в этом чате не является чьей-то оплачиваемой работой, поэтому помогать тут будут ровно в меру своего желания.

Из этого следует, что задающий вопросы будет уважать время участников и пытаться изначально сформулировать вопрос как можно лучше. Если ответили не на то, что вы хотели - ваша задача уточнить вопрос так, чтобы кто-то смог дать нужную вам инфу (неправильно полагать, что отвечающий что-то вам должен)

Также следует, что если кто-то дал правильный ответ, скорее всего мало смысла спорить с теми, кто вас неправильно понял. Опять-таки, им не платят.
RI
18:04
Ruslan Ibragimov
Есть люди которые изучают язык и у них какие-то теоретические вопросы про такие аспекты, что практик вообще не понимает их пока вопрашаюший полностью не опишет свою проблему.

Вот как было с var. Когда пишешь на языке — тебя не волнует факт того, что в теории этот var не нужен. Есть куда более сложные, интересные и важные проблемы и задачи.

А позиция: "мне не нравится в языке X фича/синтаксис/необходимость Y" никак не является конкретикой.

Например:

> Мне не нравится импортировать что-то и Явы

Нужно: Я вижу минус при написании мультиплатформенных проектов, т.к. очень важные интерфейсы Queue и Deque мне придется определять самому.
К
20:15
Кузя
доброго времени суток, у меня возник вопрос как можно отправить 1 сообщение 2 и более пользователям бота
var message_text = "You are disconnected"
val message = SendMessage()
.setChatId(userId )
.setText(message_text)
try {
execute(message)
} catch (e: TelegramApiException) {
e.printStackTrace()
}
20:16
не копируя одну и ту же функцию по несколько раз, так код становиться огромным
20:16
а так же не прибегая к циклу
20:17
можно ли в setChatId как то несколько id запихнуть и он работал как рассылка?
20:17
или он работает только с одним айди?
FL
20:19
First Last
In reply to this message
[usersId].map()
К
20:19
Кузя
In reply to this message
можно поподробней пожалуйста
FL
20:19
First Last
In reply to this message
Глянь доку
20:19
(Можешь сначала просто библиотеку глянуть)
К
20:23
Кузя
что то я ничего толкого найти не могу
В
20:41
Вафель
In reply to this message
А что за библиотека?
К
20:42
Кузя
я уже нашел решения спасибо
В
20:42
Вафель
In reply to this message
forEach тогда уж
FL
20:42
First Last
In reply to this message
Нужно ведь результат возвращать
20:42
🙃
В
20:43
Вафель
In reply to this message
В исходном коде нет возврата результата 🙃
FL
20:43
First Last
In reply to this message
forEach - сайд эффект
В
20:44
Вафель
In reply to this message
Я для себя спрашивал, сейчас пишу библиотеку для тгботов, поэтому меня интересует всё что уже есть :)
20:44
In reply to this message
?
FL
20:44
First Last
In reply to this message
?
В
20:44
Вафель
О каком сайд эффекте тут идёт речь?
FL
20:45
First Last
"Функция" которая возвращает void
О чем речь?
В
20:45
Вафель
Я вас к сожелению не понимаю...
FL
20:45
First Last
🙃
ВС
22:08
Виталий Сердюк
Привет всем. Можно как то ресетнуть первые 6 бит Int`а ?
round(value / 64) * 64
вообщем выполнить это-же но обращаясь к битам, не использую деление/умножение.
Вообще моджно в котлине включать/выключать биты ?
AM
22:09
Andrew Mikhaylov
Вообще есть побитовые and, or и .inv().
ВС
22:13
Виталий Сердюк
In reply to this message
чет не соображу.
подразуемеваю 73.resBits(0b000000)
получить должны 64
AM
22:15
Andrew Mikhaylov
22:16
Сброс битов — это and с битовой маской, где интересующие биты выставлены в 0, остальные — в 1
22:17
Для 6 битов это 0xC0 (0b11000000), дополнять слева единичками (или FF) до нужной битности по вкусу.
22:18
    0011_0110_1001_1100
and 1111_1111_1100_0000
= 0011_0110_1000_0000
ВС
22:25
Виталий Сердюк
In reply to this message
пасиб дошло.
val a = 2175073.and(0b1111111111111111111111111000000)
AM
22:27
Andrew Mikhaylov
Советую таки писать в хэксе, нагляднее. В идеале и левую, и правую сторону.
И да, and -- инфиксная функция, можно просто value and mask без точки и скобочек. Только учтите, что приоритет операций для инфиксных функций надо явно скобками задавать, стандартные правила не работают (т.е. a or b and c != a or (b and c)).
ВС
22:31
Виталий Сердюк
In reply to this message
Спасибо.
SS
23:12
Sergey Sverdlov
In reply to this message
Вы все правильно делаете, только round - лишнее
https://pl.kotl.in/ByGiUZsI4
А деление/умножение на степень двойки любой приличный компилятор оптимизирует.
6 March 2019
FL
07:33
First Last
> Autoreload doesn’t work in Java 9. If you want to use it, please stick to JDK 8 for now.

🙃
07:34
Пописал на ktor 🙃🙃🙃
AM
10:11
Andrew Mikhaylov
In reply to this message
SDKman помогает быстро переключаться между несколькими жвмами на машине, в идее тоже можно ждк менять на лету :)
FL
10:27
First Last
In reply to this message
Да я понимаю, но пасиму(
10:27
jdk говно, да?
TB
10:27
Taras Bezditnyi
In reply to this message
экак провокационно было сначала )
FL
10:27
First Last
:)
10:28
А если серьезно, почему так?
10:28
Лень или все таки говно?
TB
10:28
Taras Bezditnyi
я не отвечу, я еще сам еле-еле лох в котлине
FL
10:29
First Last
А с чего вообще новички в котлине начинают? 🙃
AM
10:33
Andrew Mikhaylov
In reply to this message
Так -- про авторелоад? Потому что с jdk9 появились продвинутые механизмы изоляции отдельных модулей, в том числе модулей jdk, и многие костыли, основанные на хитрожопой рефлексии, которые работали всю жизнь, сломались. Некоторым приватным апишкам публичных альтернатив нету.
RI
10:36
Ruslan Ibragimov
In reply to this message
Купи себе jrebel и будет тебе авторелоад
TB
10:37
Taras Bezditnyi
In reply to this message
я начал с того, что у нас в один прекрасный день пришли и сказали… чуваки, сворачиваем Symfony - разворачиваем все на котлине… у вас месяц на переобучение… кто не справился - мы не виноваты )
FL
10:40
First Last
In reply to this message
Пасиба
АО
10:41
Алексей Овсянников
In reply to this message
ого себе, уже и так делают
TB
10:42
Taras Bezditnyi
In reply to this message
ну так вышло... 🙂
10:42
и оно мине надо было на старости лет?.. но, сцуко, затянуло конкретно… 🙂
AR
11:44
Andrei Ruban
In reply to this message
у меня похожая ситуация, пришел в компанию, открыл репозоторий, а там куча микросервисов на джаве, котлине. Но торопить не стали - это большой плюс
AM
11:47
Andrew Mikhaylov
In reply to this message
Ну "пришёл в контору, где готовят на котлине" и "в текущей конторе внезапно заменили пых на котлин" -- это всё же заметно разные кейсы :)
AR
11:48
Andrei Ruban
In reply to this message
не предупреждали же ) что будет котлин
AM
11:49
Andrew Mikhaylov
In reply to this message
А вакансия что гласила?
TB
11:49
Taras Bezditnyi
In reply to this message
при всем при этом, это уже СОСТОЯВШИЙСЯ проект, и мы на протяжении 8 месяцев переписывали весь проект на котлин
AR
11:51
Andrei Ruban
In reply to this message
в вакансии было написано что то типа нужен бекендщик на хайлоад
11:51
на собеседовании спрашивали джаву ну я и подумал будет джава))
АО
11:52
Алексей Овсянников
In reply to this message
Иногда бизнес смотрит в перспективу (если он большой - всегда)
AR
11:52
Andrei Ruban
в любом случае я рад
AM
11:52
Andrew Mikhaylov
А, вы джаву ожидали. Ну опять же, с джавы на котлин переходить _чуть_ проще, чем с пхп 😆
AR
11:52
Andrei Ruban
я давно хотел взяться за Котлин да руки не доходили
11:53
так что можно сказать это приятный сюрприз был
FL
13:10
First Last
Так это
13:11
In reply to this message
🙃
TB
13:11
Taras Bezditnyi
In reply to this message
Да-да... переворота с головы на ноги
FL
13:11
First Last
Спорно
AM
13:11
Andrew Mikhaylov
In reply to this message
Очевидно, от платформы зависит чуть более чем полностью
TB
13:11
Taras Bezditnyi
Нет, без порно
FL
13:12
First Last
In reply to this message
Сразу на платформу с фреймворком лезть? :)
13:12
А потом будут "котлинисты" которые не умеют в котлин
AM
13:12
Andrew Mikhaylov
Я сомневаюсь, что в андроид и в микросервисы на котлине вкатываются одинаково.
FL
13:13
First Last
Ок, веб
13:13
Андроид у меня с флаттером
AM
13:13
Andrew Mikhaylov
Уже лучше. Но тут уже мои полномочия как бы всё х)
FL
13:13
First Last
:)
13:13
Я еще и не знаком с экосистемой джавы от слова совсем :(
AM
13:14
Andrew Mikhaylov
Справедливости ради, начинал я с JavaFX, потом был андроид, а сейчас на досуге с ктором играюсь.
FL
13:14
First Last
И долго ктор?
AM
13:16
Andrew Mikhaylov
Когда уже есть картина, что такое дсл и как его готовят, понимание, как пользоваться ктором, приходит довольно быстро. С нуля, не зная фишек котлина, он почти наверняка как чёрная магия выглядит. А вот сколько времени проходит до понимания его без базы котлина -- без идей. Корутинки тоже своё влияние на кривую въезда должны обеспечивать, очевидно.
FL
13:20
First Last
In reply to this message
Ну вот, я и хочу базу
13:20
Только как и что делать 🙃
TB
13:21
Taras Bezditnyi
нас просто кинули в спринг и все
AM
13:31
Andrew Mikhaylov
https://kotlinlang.org/docs/books.html
Книжек по котлину уже невменяемое количество написано. Kotlin in Action советуют многие -- она рассчитана на базу в джаве, но, говорят, очень хороша (всё-таки JetBrains писали). Есть курсы по котлину, в том числе JetBrain-овский Atomic Kotlin на степике, на основе которого пишут книгу.
FL
13:31
First Last
Нет нет
13:31
Я про задачи
13:31
Чтобы познавать язык (практика в общем)
TB
13:32
Taras Bezditnyi
я считаю что самое правильное это учить язык прямиком на живом проекте… когда под ж***й горит… тогда хочешь не хочешь - выучишь )
FL
13:32
First Last
In reply to this message
TB
13:32
Taras Bezditnyi
In reply to this message
а какой язык до этого учил или практиковал?
FL
13:33
First Last
In reply to this message
У меня их дофига
АБ
13:33
Александр Бык
In reply to this message
Что если с++?
TB
13:34
Taras Bezditnyi
In reply to this message
С плюсами не подскажу 🙂 Человек спросил на каком проекте попрактиковаться… Если с РНР или четта такого, что более понятное, то взять какой-то тот же wordpress и переписать ядро на котлин в качестве хоум-порно.
AM
13:34
Andrew Mikhaylov
In reply to this message
Вы себе задачу придумать не можете? :) Язык тут постольку поскольку. Берёте и пишете форум, к примеру.
FL
13:35
First Last
In reply to this message
Пагади пагади
13:35
У ktor'a ведь есть свои абстракции, верно?
AM
13:36
Andrew Mikhaylov
Ktor -- это микрофреймворк серверный (ну и клиент). Это не фреймворк в духе спринга, там нет ни баз данных, ни планировщиков, нихрена.
FL
13:36
First Last
То есть, ты не сможешь писать на ktor'e, а потом не осилить писать на kotlin'e? :)
AM
13:37
Andrew Mikhaylov
Потому учить там не то, чтобы сильно много -- откройте доку, освойте реквесты с респонсами, пролистайте список фичей и можете приступать к решению задачи.
FL
13:37
First Last
Тогда легкотня
Пасиба
AM
13:38
Andrew Mikhaylov
In reply to this message
Сможешь. Во избежание, конечно, сначала надо прочитать от начала и до конца документацию по котлину (благо она человеческим языком написана и небольшая) и желательно пройтись по Kotlin Koans
13:39
Идеоматичный код, конечно, будет не сразу получаться, но с базой в джавке опыт, субъективно, набирается относительно быстро.
13:40
Документацию периодически стоит перечитывать, ибо попервой продвинутые фичи не дойдут. Ещё очень полезно раз в месяц просматривать список экстеншн-методов для коллекций, он там неподъёмный с наскока, но порой бывает "ух ты, я это неделю назад руками писал, а тут уже готовое есть".
FL
13:43
First Last
In reply to this message
> попервой продвинутые фичи не дойдут
Например?
AM
14:06
Andrew Mikhaylov
In reply to this message
Делегаты, .let / .run / .also / with, те же DSL-и, Sequence, this в лямбдах с ресиверами, споткнуться есть где, конечно же :)
RR
14:26
Roman Roman
Доброе время суток Как можно ли сделать копию класса, но что бы это была прям копия а не ссылка :
fun main(){
val a=A()
a.x=2
val b =a
b.x=3
println (a.x)
}
class A{
var x=1
}
AM
14:29
Andrew Mikhaylov
In reply to this message
Сделать из A data class и использовать свежесгенерированныц метод copy()
RR
14:30
Roman Roman
В дата можно и методы пилить?
14:31
Ссылку на доки не надо, сам щас прочитаю)
AM
14:38
Andrew Mikhaylov
In reply to this message
Это обычный класс, в котором дополнительно для пропертей из праймэри конструктора генерится указанные в доке методы :)
RR
15:01
Roman Roman
Да спасибо, но у него обязательно должно быть значение в конструкторе
AM
15:02
Andrew Mikhaylov
In reply to this message
Верно, иначе копировать будет нечего. data class не цепляет обычные проперти в сгенерированные методы.
RR
15:06
Roman Roman
А обычный класс скопировать нельзя?
AM
15:08
Andrew Mikhaylov
Руками разве что :)
RR
15:09
Roman Roman
Есть базовый Bmw, его реализация BmwX3, и например я хочу сделать класс BmwX6, но изменить в нем переменную или метод
AM
15:09
Andrew Mikhaylov
С деревом классов ничего хорошего нету на дата-классах, да. Тут только руками.
15:10
Может, конечно, на основе kotlinx.serialization это как-то решаемо, но я такого пока не видел.
RR
15:10
Roman Roman
Т. Е. Сериализовать и дессириализовать в новый класс?
AM
15:11
Andrew Mikhaylov
Да, только в идеале без промежуточного представления бы, но я не уверен, что можно)
RR
15:12
Roman Roman
А сериализация сразу записывает значение в переменную или сразу в файл?
15:12
Или я вообще хрень несу)
AM
15:14
Andrew Mikhaylov
Сериализация записывает значение кодом, который формат конкретный реализует, в соответствующий тип , будь то строка, массив байтов, etc. Есть даже утилитарный класс, который умеет объекты в Map разбирать и обратно. Но это всё равно много лишних телодвижений :)
FL
15:14
First Last
In reply to this message
Все видел
RR
15:14
Roman Roman
Вообще сериализация это трудоёмкий процесс, в плане производительности?
FL
15:15
First Last
Но в котлине оно, скорее всего, работает по другому 🙃
AM
15:15
Andrew Mikhaylov
Сама по себе — нет, это просто сгенерированный код, который по всем полям бежит и куда-то их пишет.
FL
15:15
First Last
In reply to this message
А зачем тебе это?
AM
15:16
Andrew Mikhaylov
In reply to this message
Тогда смело дочитывайте, как это работает в котлине, и можете спокойно браться за конкретные задачки, на которых доучитесь, так сказать, ощущению языка))
FL
15:16
First Last
In reply to this message
Может возьмешь язык с "активным" метаплагламмилованием?)
RR
15:16
Roman Roman
In reply to this message
Изучаю возможности языка
FL
15:16
First Last
Вон, рубисты так делают и не жалуются
AM
15:20
Andrew Mikhaylov
Я хотел заикнуться про перформанс, пошёл хоть какую-нибудь статью в подкрепление своим словам закинуть, прочитал в первой попавшейся статье гениальную фразу и потерял дар речи:
> When checking the Ruby vs. Java performance, the former technology is leading. Ruby is simpler hence faster than Java. The code written in Ruby changes on the fly, while its competitor needs to generate the byte code before it can run.
FL
15:21
First Last
Ну дык
15:21
Ты в рантайме (ахахах) можешь делать все что угодно
AM
15:21
Andrew Mikhaylov
Ну всё, бросаю свою медленную джаву и иду писать на быстрых рубях, которые не надо компилировать, за счёт чего они быстрее
FL
15:21
First Last
Вово
AA
15:21
Andrey Antipov
In reply to this message
Вы имеете ввиду именно копию самого класса, а не экземпляра данного класса?
Что-то вроде открытых классов в ruby?
RR
15:23
Roman Roman
Копию экземпляра имею ввиду
FL
15:23
First Last
In reply to this message
Угробил год на JIT компиляцию, а тут просто нужно было интерпретатор сделать :с
AA
15:25
Andrey Antipov
In reply to this message
А тогда к чему было вот это:
> Есть базовый Bmw, его реализация BmwX3, и например я хочу сделать класс BmwX6, но изменить в нем переменную или метод
RR
15:25
Roman Roman
Наверное плохо вырозился
15:26
Класс бмв, экземпляр бмвХ3, и его копия бмвХ6
FL
15:29
First Last
In reply to this message
Ну, блин
А как ты себя это представляешь

У тебя есть класс который умеет делать что то одно
Бац, появляется его брат двойник который уже умеет делать 2 вещи
15:30
Как же контракты...

Ты можешь сказать зачем тебе это вообще?
AM
15:33
Andrew Mikhaylov

data class Animal(val hasFur: Boolean, val legCount: Int)
val cat = Animal(true, 4)
val turtle = cat.copy(hasFur = false)

Я правильно понял юзкейс?
15:35
Я тоже сначала подумал, что речь об иерархии классов. Если речь об одном классе и нескольких объектах, а также необходимости копирования с заменой части полей -- пример выше.
FL
15:36
First Last
In reply to this message
Нет
RR
15:36
Roman Roman
Мне в общем это просто "интересно" нет никакой задачи.
FL
15:36
First Last
Он хочет иметь возможность динамически расширить объект
15:36
Ему нужна рефлексия
AM
15:36
Andrew Mikhaylov
In reply to this message
Вы ОП? Нет. Вот хотелось услышать автора вопроса.
FL
15:36
First Last
In reply to this message
Не очень хороший язык
15:37
In reply to this message
Он ведь сам сказал
> но изменить в нем переменную или метод
15:37
Читал? Нет, но осуждаю