>Что имеем: +Современный синтаксис (реально удобный). +Совместимость со всей jvm инфраструктурой. +Возможность писать статический DSL прямо на самом языке. +Удобные лямбды и наличие простых функции. +Удобный тулинг в том числе и на бесплатной IDE (комьюнити версии) +Возможность нативной сборки, сборки в js, андроид и ios. +Корутины
>IDE - среда разработки. Бесплатная community edition - обычно более чем достаточно (и работает шустро), но можете попробовать триал-версию. https://www.jetbrains.com/idea/download/
>>3105288 (OP) >+Современный синтаксис (реально удобный). >+Совместимость со всей jvm инфраструктурой. >+Возможность писать статический DSL прямо на самом языке. >+Удобные лямбды и наличие простых функции. >+Удобный тулинг в том числе и на бесплатной IDE (комьюнити версии) >+Возможность нативной сборки, сборки в js, андроид и ios. >+Корутины +Вендорлок от жыдбрейнс +Работает поверх джавы, можно легко пересесть с игрушечного языка на нормальный
>>3105288 (OP) >Современный синтаксис (реально удобный). Groovy. >Совместимость со всей jvm инфраструктурой. Groovy. >DSL прямо на самом языке Groovy. >Удобные лямбды Groovy. >Удобный тулинг в том числе и на бесплатной IDE Groovy. >Возможность нативной сборки GraalVM. >сборки в js ClojureScript. >андроид и ios Flutter. >>3105760 >Вендорлок Это окончательно перечёркивает всё перечисленное автором.
>>3106072 >Но на картинке джавист притворяется котлом Вот, начинает доходить потихоньку. Вы по сути те же джависты, только синтаксический сахар поверх прикрутили, гордо именуя крутым языком, волосы покрасили и тыквенный раф пить начали, но основная суть не изменилась
>>3105288 (OP) >котлин Как-бы нахуй не нужен. Тем более елизаров и жемеров свалили, а поддержка в IDE не дотягивает и даже до сотой части того, что предлагает джава плагин в IDEA. Был бум котлина где-то 2-3 года назад и даже в сбере (сбербучую, кста) писали что-то на котле, но ныне все переписали на последнюю джэву, т.к. там уже есть все нужные фитчи и не нужно ебаться с корутинами, которые все равно почти никто не умеет правильно готовить
>>3106076 >>3105760 > вендорлок На их оф. сайте написано, что это опен-соурс под лицензией Apache 2.0 , разве это не означает, что я могу взять котлин и сделать с ним что захочу? При чем тут жедбрейнс?
>>3106042 Там у них отладчик проприетарный и прибит гвоздями к обоим visual studio (code). Что как бы намекает на лукавость кроссплатформенной разработки и честного попенсорса
>>3106044 Но плачет джавист? Типа, за эти годы он пытался подрожать котлину, но так и остался позади? Или что?
Кстати, с появлением котлина, джава стала сдавать позиции в tiobe. То есть, забрав рынок мобилок, джава оказалось тырпрайзной, никому не нужной пустышкой? Теперь я стал понимать параллель с коболом.
Честно не понимаю какой смысл писать на джаве, когда есть котлин, это как писать на вижуал бейсеке вместо шарпа. Или на объектив-си вместо свифта.
>>3106132 Жабаскуф, спок. Тут аргументация даже не нужна, когда от жабы буквально рвотный рефлекс. Не трясись, твой язык морально устарел, гибкие зумеры - синьеры скоро забудут о твоем языке, т.к. все новые проекты пишут на go/c#/kotlin/python/elixir/rust, что угодно, только не джава. мимо KMP господин
>>3106295 Не думаю, что c# кому-то нужен, тоже старое перепичканное говно, где дефолто-стантарт это только либы мс, а вне этого мало кто пишет попенсорсное.
Хотел скачать старую комьюнити версию вижлы для старого ноута чтобы в дороге потыкать, но был послан нахер за 7 винду.
>>3106584 Экзотические помои в том числе и раздутый питон.
JVM мир богат и вокруг него много корпораций, в этом мире никогда никто не возьмет верх и не начнет доить юзеров, jvm языки так же свободны и сильны как и С/С++.
Хера у жабадауна бомбит, если котлин делает его jvm сильнее.
>>3106805 >котлин делает его jvm сильнее На самом деле нет. Это как со скэйлой, которая померла. Но она хотя бы после себя оставила тормозной спарк и кафку. Спарк еще где-то используют, а кафку переписали на джэву, лол
>>3105288 (OP) >>Что имеем: >+Современный синтаксис (реально удобный). Обмазываться сокращениями, неявностями и лишними вскукареками аля def это удобно? >+Совместимость со всей jvm инфраструктурой. Ну нихуя удивили, впервые в мире такое сделали. Скалы не существует. >+Возможность писать статический DSL прямо на самом языке. Ну нихуя удивили, впервые в мире такое сделали. Груви не существует. >+Удобные лямбды и наличие простых функции. Ну нихуя удивили, впервые в мире такое сделали. Джавы 8 не существует. >+Удобный тулинг в том числе и на бесплатной IDE (комьюнити версии) Ну нихуя удивили, впервые в мире такое сделали. Интеллиж идея ведь с самой джавой-то не работает. >+Возможность нативной сборки, сборки в js, андроид и ios. Ну нихуя удивили, впервые в мире такое сделали. Грааль вм (натив, жс) и jvm (кроссплатформенность)-то не существует. >+Корутины Это та хуйня что в 10 раз код замедляет? Какая от неё польза, если на редком процессоре больше 10 ядер?
> Обмазываться сокращениями, неявностями и лишними вскукареками аля def это удобно?
хуй его знает, где ты нашёл лишние вскукареки и неявности, болезный, хоть показал бы, а то может они только у тебя в кукушке есть
> Ну нихуя удивили, впервые в мире такое сделали. Скалы не существует. >Ну нихуя удивили, впервые в мире такое сделали. Груви не существует. >Ну нихуя удивили, впервые в мире такое сделали. Джавы 8 не существует. >Ну нихуя удивили, впервые в мире такое сделали. Грааль вм (натив, жс) и jvm (кроссплатформенность)-то не существует.
И правда, хуйня какая-то: юзать один язык вместо целого вороха языков и технологий. Во-дурачки-то
>Это та хуйня что в 10 раз код замедляет? Какая от неё польза, если на редком процессоре больше 10 ядер?
Ну если ты васян из подзалупинского ПТУ и тычешь их повсюду, то да, они код замедляют, но вангую, что у тебя всё код замедляет, кроме твоих кривых ручёнок. Так-то их не везде пихать надо, мань.
Ну и вообще, ты бы каждый свой вскукарек подтверждал хоть какими-то пруфами. Ну или пиздовал бы к себе в курятник.
>>3107861 > хуй его знает, где ты нашёл лишние вскукареки и неявности, болезный, хоть показал бы, а то может они только у тебя в кукушке есть > def Совсем слепой?
> И правда, хуйня какая-то: юзать один язык вместо целого вороха языков и технологий. Во-дурачки-то В прошлом треде уже обоссали. Всё это есть в самой джаве, за исключением разве что дсл, отсутствие которого на джаве не мешает использовать для этих целей груви вместе с джавой или боже упаси даже петухлин.
> Ну если ты васян из подзалупинского ПТУ и тычешь их повсюду, то да, они код замедляют, но вангую, что у тебя всё код замедляет, кроме твоих кривых ручёнок. Так-то их не везде пихать надо, мань. То есть ты на полном серьёзе рекомендуешь меньше пользоваться фичей чтобы меньше была заметна деградация перформанса, что является смыслом многопоточности? Лул.
>>3107866 > совсем слепой? Где ты def нашел в котлине? Скидывай ссылку на документацию, а не на лекцию про виртуальные потоки. > всё это есть в жабе Ну, так иди и программируя на жабе. Сюда то ты зачем пришел?
>>3106076 Двачую тебя, братишка. Вот прям Groovy реально недооценён. В последнее время его даже принято обсирать почём зря. А он хороший. Как дополнение к Java он прекрасен, да и самостоятельно тоже.
>>3108062 >В последнее время его даже принято обсирать почём зря. А он хороший. Потому что динамо дристня уровня ЖС. Но в ЖС это поняли давно и начали делать статическую типизацию. А вот говноедов которые любят груви понять невозможно.
>>3109193 Ты же не удивляешься, что кто-то на петухоне хуярит? А Groovy вполне можно компилировать статически при желании, в производительности будет на уровне Java при той же лаконичности.
>>3109349 >Ты же не удивляешься, что кто-то на петухоне хуярит? Вопрос не в том, кто и как хуярит, а в best practices. Для фронта сейчас best practices использовать TypeScript, для питона 484.
>А Groovy вполне можно компилировать статически при желании, в производительности будет на уровне Java при той же лаконичности. И как мне сделать так, чтобы в грейдл скриптах нормально работали подсказки по коду?
Так, я чет не понимаю? Почему идея говорит Redundant 'asSequence' call Мне говорили, что для последовательных преобразований надо последовательность использовать, которая как stream в жабе работает.
>>3112482 Только потому что какие-то "персонажи" сделали тот или иной язык популярным и теперь тот же питон стандарт в научной среде. Новичок не выбирает на чем ему писать, долго пишет, привыкает что говнокод это норма, что баги это норма, что проще написать самому, чем разобраться в чужом и он начинает это говно ещё другим предлагать ведь раз он ест значит и другим нужно попробовать.
>>3112471 Груви - это язык со статической типизацией, ты не можешь переменной присвоить значение другого типа. Это так же язык с неявной типизацией, так же как и Котлин, где можно все на варах сделать, кроме разве что возвращаемого значения функции.
>>3113035 Точнее он "optionally typed", как и джава, как и котлин Через defы можешь инту присвоить строку, но это все равно что в джаве писать на обджектах, а в котлине на эни.
Этот код рабочий в котлине: var b: Any = 2; b = "adwd" А этот в джаве: Object a = 2; a = "adawd";
Но если ты явно задаешь тип переменной, то груви так же выдаст тебе ошибку компиляции
>>3113086 Полиморфизм, все наследуются от одного родителя и к нему могут быть приведены. У котлина есть еще специальный нижний по наследованию тип, там есть кейсы, но без гугла не вспомню.
>>3116461 Ты проверил на тип и работаешь с ним, динамикодрисни не случилось, а если случиться, то мистер эксепшен тебе объяснит почему ты не развиваешься как программист и путаешь полиморфизм и динамикодресню.
А вот в квази-кроссплатформеном шарпе есть тип дайнемик, видимо кейсы бывают
Даже если спуститься до уровня твоего интеллекта и попробовать использовать как динамикодресню, то лучше когда есть такая возможность в типизированном языке, чем будет симуляция типов в динамикодресне.
>>3116622 >Так в питоне ты тоже можешь проверить тип переменной Но не можешь ограничить тип переменной. Т.е. в джава/котлин ты говоришь, что тип Iterator и компилятор с рантамом тебе это гарантируют. А в питоне, у тебя только хинты.
>>3116622 Там проверка и приведение типа, котлин просто сахарит это место. Кстати, поймал очень приятных трах на час в питоне, когда по ошибке присвоил в существующую переменную и динамикодрисня вежливо это съела, создав плавающую ошибку.
В старой жабе тебя хотя бы отругали за другой тип, но в современных языках или практиках, переменные делают иммутабельными.
Типизация, даже кривая как в го, будет куда лучше потому, как проверка на этапе компиляции, а не в рантайме, в ветке if'ов, где крашится в лунную ночь, когда цветет сакура.
>>3116806 Писал промышленный код, с phpdoc для типизации (давно еще), все равно заставляли тесты писать и получалось, что ты и в функции чекаешь чтобы лишнее гавно не прошло, потом еще тесты пишешь и тоже по кругу одно и тоже проверяешь и это затрахивает. Так что можно, но нафиг.
>>3117374 >но ведь пишут на них что удивительно. Питон повсюду Смысл в том, чтобы нормально писать на динамикодрисне, нужно три раза делать одно и тоже. а не про покрытие тестов
>>3129989 > Геймдев на котлине Без шансов. Уже есть C# для Unity и Blueprints/C++ для Unreal Engine. Остальные движки представлены на рынке в виде нескольких процентов.
>>3130244 Открой любой сайт с вакансиями и обнаружишь, что 60 % это юнити и 35 % это анриал. Потом открой стим дб и отфильтруй игры с 10 000 отзывами по движку и увидишь аналогичные результаты. Игры с 10 000 отзывами это успешно-коммерческие игры.
>>3130341 Но если ты спрашиваешь в разрезе геймдева - учти что в юнити неполный С#, насколько я знаю он не поддерживает некоторые фишки как LINQ например. Но имхо, если ты идёшь в геймдев, то язык очень сильно теряет значение, в том смысле что тебе все языки геймдева так сильно интегрированы с движками, что это по сути свои отдельные диалекты, где есть правила что и как нужно делать конкретно в этом движке. Так что я бы на переиспользование опыта сильно не рассчитывал.
>>3129989 Сам /зк сдох, там топовые темы ели живые, я сам отсюда ливнул, ибо моча трет посты и банит просто от фазы луны, (кстати, особенно в жабо треде). Теперь это раздел двача напоминает шизо-загон из 1,5 инвалида пытающиеся вечно вкатиться.
>>3130239 Шарп там на правах скрипта не боле, есть плагины и на котлин, просто вкатываться, возможно, будет проблемно, а так без разницы чем апи дергать, там вообще древний дотнет и шарп.
>>3131744 Ну я недавно нашел https://github.com/anilbeesetti/nextlib библиотеку. Подключает ffmpeg к андройдовскому media 3. Очень удобно, теперь можно не искать, как бы hevc запускать на андройде
>>3132346 Я накачал тонну видосов, а 98% из них в hevc.... Надо сделать свой плеер под это дело т.к. надо еще доп.инфу выводить. Вес хз, пока не смотрел. Тупо нашел, завтра смотреть буду и тыкаться
>>3132365 Я думал, что они обратно совместимы с h.264. Просто не забывай про размер, а то мы также всякого добавили в ЛИБУ, а потом нервно убирали когда заказчик захо ел размер дистрибутива в 10 раз меньше
Доброй ночи, коллеги-красноглазики. Какой опыт работы с Ktor-server у вас? Хотелось бы послушать байки, да с какими багами вы столкнулись во время перехода со spring
>>3133348 Там вроде обертка над нетти, ничего проблемного не ожидается. По гига-чад тестам не так все быстро, но зато даже сорцы нетти читаемы (оч давно в это долбился, никакого говно-магического бинаря, а если читаемо, то все гибко).
Кто-нибудь игрался с вебассембле на котле? Что там на нем есть, какие впечатления? хотел говноигрушку для браузера сделать, дергать DOM как-то напрягает
>>3133884 Спасибо, как раз хотел начать пилить свой стартап. А то, что он не blazing fast пофиг. Лучше стабильность и читаемость, чем выжигать глаза об rust/c++.
Делаю приложение для телефонов на складе. Старая приложуха написана коллегами на киви(из питухона в апк). Производительность хромает, ну и обновление многочисленных зависимостей сборочницы это особый адок. Переезжаем на котлин+компоуз. Сразу появились подводные камни: 1) Получаю, например, от сервера описание 250 товаров в json. У каждого товара все описание в строках, одна из которых URL картинки. Без кэширование пикч бессмысленно работать. Пока единственная идея это хранить скаченые пикчи файлами в отдельной папке, и проверять наличие пикчи перед скаичванием по URL. Вообще я в правильном направлении иду? 2) Как хранить данные json от запроса? Я пока сложил их так (Item одна единица, Items массив данных): >sealed interface Data { >data class Item(a: String, b: String, URL: String) >object class Items () { var elements = MutableListOf<Item>() } <} 3) Зачем передавать данные для отрисовки через Flow, если я могу просто передать данные в аргументе функции компоуз? Не осилил философию флоу, ибо он показался мне оверхедом. >@Composable >fun Draw(arr: Items()) { >LazyColumn() {} >} 4) Есть в сети годные гайды как увеличить производительность кода? Сеть хромает, телефоны средние, и работе будут до 300-1000 сложных элементов в списках, так что каждый мегабайт важен. То что надо где можно использовать val вместо var, object вместо class, Imutable и Stable, это я понял. Нужна аналитика по тому насколько одни способы хранения данные эффективнее других, и какие объекты, в частности канвасы, в байткоде быстрее исполняются.
Делаю приложение для телефонов на складе. Старая приложуха написана коллегами на киви(из питухона в апк). Производительность хромает, ну и обновление многочисленных зависимостей сборочницы это особый адок. Переезжаем на котлин+компоуз. Сразу появились подводные камни: 1) Получаю, например, от сервера описание 250 товаров в json. У каждого товара все описание в строках, одна из которых URL картинки. Без кэширование пикч бессмысленно работать. Пока единственная идея это хранить скаченые пикчи файлами в отдельной папке, и проверять наличие пикчи перед скаичванием по URL. Вообще я в правильном направлении иду? 2) Как хранить данные json от запроса? Я пока сложил их так (Item одна единица, Items массив данных): >sealed interface Data { >data class Item(a: String, b: String, URL: String) >object class Items () { var elements = MutableListOf<Item>() } <} 3) Зачем передавать данные для отрисовки через Flow, если я могу просто передать данные в аргументе функции компоуз? Не осилил философию флоу, ибо он показался мне оверхедом. >@Composable >fun Draw(arr: Items()) { >LazyColumn() {} >} 4) Есть в сети годные гайды как увеличить производительность кода? Сеть хромает, телефоны средние, и работе будут до 300-1000 сложных элементов в списках, так что каждый мегабайт важен. То что надо где можно использовать val вместо var, object вместо class, Imutable и Stable, это я понял. Нужна аналитика по тому насколько одни способы хранения данные эффективнее других, и какие объекты, в частности канвасы, в байткоде быстрее исполняются.
>>3145015 1. Для кеширования пикч и прочих манипуляций с фото можешь юзать https://coil-kt.github.io/coil/ Coil (он работает с Compose, в доке есть отдельное под это)
2. Если ты говоришь про хранение в UI, то там юзают UiState. Я бы разделил на Item и ItemsList, чтобы не путать, где список и где отдельный объект.
3. Флоу это горячий поток, который позволяет менять данные даже после отрисовки UI. Он автоматом обновит нужный тебе Ui объект (у нас же компоуз, а он как конструктор) и даже юзера уведомлять об "новых данных" не надо, чтобы он обновил Ui. Он уже сразу увидит их.
>>3145067 >Coil Какая годная штука! >UIState и Флоу В виду простоты приложения использую более простой подход. Сделал простой класс для навигации и имею функцию, которая через when вызывает конкретный экран/функцию. Данные у меня не мутабельные, и хранятся вне компоуза, просто в массиве дата классов. Правда пока решил слепить в кучу класс навигации, название экрана, и placeholder для данных. Это чистый анти-паттерн, от которого многие начнут хмурить брови, но я вам скажу что если вы будете писать по 50+ экранов так как доки завещали, то вы быстро устанете fun Draw(nav :Navigator, data: Models(), screenTitle: String) Пока у меня все в одном fun Draw(meta: MetaClass) И данные в placeholder я не чищу, а просто перезаписываю на новые когда получаю новый json. Это бизнес логика, требующая быстрой расширяемости при максимально примитивной архитектуре, и чтобы за пару минут объяснить коллегам питонистам свои магические пассы в приложении. >https://www.youtube.com/@PhilippLackner Буду смотреть
>>3145015 >Пока единственная идея это хранить скаченые пикчи файлами в отдельной папке, и проверять наличие пикчи перед скаичванием по URL. Андроид? Там же у каждого приложения своя база есть, в ней и храни. >4) Есть в сети годные гайды как увеличить производительность кода? Тебе сначала нужно померить где именно производительность страдает, а не вслепую оптимизировать. Если сеть хромает - и большие списки, логично асинхронно подгружать данные только для тех элементов списка что юзер видит. Ну и пережать картинки на сервере/сделать отдельные превью картинки, чтобы меньше загружать. а вот это >val вместо var, object вместо class, Imutable и Stable в твоём случае ничего не сделает, я вообще не уверен в каком случае это хоть что-то сделает иммутаблы - так это точно просадка производительности, но наверное все же не на твоих объемах
>>3145330 Спасибо! Все что сложнее формошлепства на компоузе не без подводных. Неспешно прощупываю кэширование пикч. Бодался с Койлом пока не обнаружил что начиная с 28 (вроде) сдк http уже не работает, и требуются https ссылки. Койл, самая популярная библиотека по кэшированию пикч из сети котлина, тупо игнорирует неприятное и работает не возвращая ошибки при сетевых ошибках. "Нет файла по адресу в сети, да и хуй с ним", решили разрабы. Аж самописный костыль вкрутить захотелось!
>3145970 >Андроид? Там же у каждого приложения своя база есть, в ней и храни. На этот функционал с БД нужно время и причина. Достаточно скачать пикчу по URL, если она еще не скачивалась в R.drawable. Некоторые пикчи так сурово зашакалены, что запись в БД будет есть в разы больше места чем сама пикча весит. Зачем тогда БД? Чтобы что? >нужно померить где именно производительность страдает, а не вслепую оптимизировать. Пока получилось написать как получилось, плохенько, а потом уже стал урезать избыточную мутабельность и наследование. Как ни странно, увеличение количество классов и их инстансов заметно снижает скорость кода. То же самое можно сказать о стейтах. Обвесил функции @Stable и @Immutable где возможно, но не знаю что поменялось лол. >иммутаблы - так это точно просадка производительности, но наверное все же не на твоих объемах Есть данные по иммутаблам? Пока что я нахожу в интернете только инфоциганские методички без бенчмарков или отсылок к докам явамашины. То-есть буквально аргументация "траст ми бро".
>>3146678 1. https://android.libhunt.com/coil-alternatives 2. Какой дебил будет грузить картинки в базу данных? Используй кеш приложения (папка data в android) в качестве хранилища и просто храни в бд ссылки на эти самые картинки, лол.
>>3146678 >Есть данные по иммутаблам? Пока что я нахожу в интернете только инфоциганские методички без бенчмарков или отсылок к докам явамашины. То-есть буквально аргументация "траст ми бро". По пробуй в цикле создавать Integer`ы, а потом int`ы, и сравни разницу. Вот Integer`ы как раз иммутабельны. Тут суть не в иммьютаблах как таковых, а в том что они порождают большой поток аллокаций/мусора (но на болшом объеме данных конечно). А это всегда хуже чем не аллоцировать. Но заметно только на сильной нагрузке.
>На этот функционал с БД нужно время и причина. Достаточно скачать пикчу по URL, если она еще не скачивалась в R.drawable. Некоторые пикчи так сурово зашакалены, что запись в БД будет есть в разы больше места чем сама пикча весит. Зачем тогда БД? Чтобы что? Я тебя не пойму - делаешь микрооптимизации, которые тебе ничего не дадут, а на самые мощные оптимизации времени нет? Тебе это странным не кажется? Что значит пикчи зашакалены? Вы архивируете картинки чтоли? Иначе запись в БД не будет больше чем пикча весит. Да даже в этом случае можно писать архивированную.
>>3146678 >>3146932 Еще кстати мощная оптимизация, которую ты вероятно с коилом не получишь - упаковать все картинки в 1 файл и скачать разом, обычно это быстрее чем по одной качать (но нужно проверять). Делаешь архив с превьюшками и архив с нормальными, быстрое качаешь превьюшки, в фоне качаешь нормальные, если долго качается и юзер запрашивает в этом время картинку - подтянуть одну отдельную в фоне. Скорее всего юзер успеет кликнуть максимум на 1-2 картинки пока полный пак не скачается.
>>3146721 Оказалось что Coil это "Glide у нас дома" (в Котлине). В плане синтаксиса 1 в 1 местами. Еще не подключал глайд к проекту. Папка data не была доступна так как я решил скачивать медиа через DownloadManager, который относительно несложно вкручивается в приложение копипастом, живет отдельной жизнью в системе, не настаивает на https, и в ресурсы приложений доступа не имеет. Это очень странный и тупой инструмент, который подписывается на приложение и живет системе отдельно, сбрасывая медиа в Download (легко посмотреть скаченное из приложения загрузки). Все неплохо, только почему-то файлы виснут в очереди на скачку, а не качаются. Очевидно где-то не проверил настройки сети. От коила и глайда не отказываюсь. Надо же с чем-то сравнивать. >>3146932 БД тема непростая. Знаний у меня в этом мало. Поэтому рискую надолго завязнуть в болоте "просчитался, но где?". Орнул с твоего подхода "прост заведи БД, делов-то на пять минут". >>3146937 Бэкенд с данными не у меня, так что мою идею с упаковкой данных встретили без энтузиазма. Пикчи в основном все по http. Json'ы большие как и запросы из трех джоинов, так что рабочую бизнес логику я не могу поменять. Хочу сделать основу приложения относительно шуструю и расширяемую. А потом уже буду скучать делая 50+ экранов по побразцу, наводя всякую красоту для конечных пользователей.
>>3147541 Если ты привык работать с ORM, но тебе чужда Room, то используй Realm. Выглядит как Exposed, но намного проще и имеются сдк под андройд (exposed еще к проекту подключать минут 10 надо, а тебе так вообще часов 50)
>>3147541 >Орнул с твоего подхода "прост заведи БД, делов-то на пять минут". Ну вообще на уровне записать/считать из одной таблицы данные БД тема очень простая. И не нужно ничего заводить, она есть в каждом Андроид телефоне. https://developer.android.com/training/data-storage/room
>Json'ы большие как и запросы из трех джоинов, так что рабочую бизнес логику я не могу поменять. Это я не понял вообще к чему? Что за джейсоны? Что не можешь изменить алгоритм показа картинок? Ну смотри сам, экономия на спичках тебе сильно много не даст. В любом приложении основные узкие места - это IO, объем передаваемых по сети данных, работа с базой. Чем больше из этого уберешь, тем быстрее будет. Судя по твоему описанию, проще всего будет на первом старте показывать лоадинг скрин и грузить все картинки в кэш - уж через фреймворки или нет - это тебе видней. Но если у тебя на бэкэнде скуфы, которым похуй на оптимизацию - это пиздец, тут только сложнее и сложнее кэширование на твоей стороне делать. Кэшировать входищие данные, асинхронно отправлять запросы на бэк, перепосылки, и т.д.
>>3147589 >>3147593 >>3147849 Ух я постыню накатал конечно Ты описываешь архитетуру вк или ватсаппа, записывающих в БД гигабайты мусора, которые потом надо в фоне апдейтить, пытаясь хоть как-то сохранить актуальность данных. Да, когда у тебя 2 диалога вк, и через стенку стоит хороший роутер, то все это работает как часы. Я все понимаю, что ты начитался инфоциган на хабре, поставил им лайк, и даже подписался на их телеграмм канал, но не все разработчики вокруг тебя делают мобильные казино и мессенджеры, где с БД только в путь.
У нас тонкий клиент с простым кэшем, то-есть приложение, которое скачивает данные по товарам JSON (нестабильные и изменяемые) и картинки (условно неизменяемые). Данные актуальны до тех пор пока мы не ушли с экрана. А картинки часто повторяются. Бэкенд лежит на плечах скуфов, и что REST сервер, что его запросы, не особо оптимизированы. Все пикчи в рабочем хранилище расшарены по http (скуфы не хотят учить сертификаты), а резервный сервер с бэкапами пикч отдает их по https (через load balancer для e-shop). В сумме на серверах около полумиллиона картинок, из которых на телефоне используются несколько сотен пикч в день, условно до 2000 за неделю на устройстве.
Пока что я знатно соснул с реализацией кэширования в памяти приложения, и вынужден отложить ее. Возможно дейтвительно придется пересесть на БД, где будет одна таблица с двумя полями: ключ и блоб. Современный апи андроида пытаются превратиться в вендорлочное анально огороженное говно. Каждые несколько релизов апи все меньше директорий доступны, и все больше ограничений, например использование алиасов вместо явных указаний директории. http пока еще разрешают включать отдельной опцией, но это только пока. Библиотеки с пикчами на котлине вообще не в курсе что существует http, например. Загрузка скаченных в памяти/ассетов файлов это чистокровные костыли от гугла. Пока я ебался с этим, у меня аж натуральная тряска с аутичным тиком началясь. А подгрузка ресурсов (вшитых в апк строк/пикч, в режиме ридонли) наоборот работает на изи.
То-есть глобохомо гугл видит идеальное приложение так: на старте в приложении есть только 5 иконок навигации, а остальные 99% процентов приложения скачивается через https в неэффекивную БД написанную индусами, которая по каждому пуку апдейтится чтобы ресурс ссд и внутрення память максимально страдали. В оперативке крутятся только телеметрические зонды, а placeholder для хранения изменяемых данных это в вовсе утерянная технология древних, запрещенная самим гуглом. Так как бд приложения это вечнорастущий файл без бэкапа, то он со временем вероятность словить фейл стремительно растет, и никакой рут не поможет среднему юзеру вытащить свои файлы когда будет краш, так что лох в панике побежит покупать новый телефон, да подписываться на платные облака чтобы больше не терять свои картинки с котиками, еот, или гомониграми (на случай важных переговоров в авточате). Работу с файлами приложенями полностью запретят и назовут опасным антипаттерном.
>>3149477 Ну если ты лучше знаешь как надо делать - то чего здесь спрашиваешь?
И что это за биполярочка - сначала база - это мусор и инфоцыгане, а потом ой никак, придется с базой делать. Там разные люди твой пост что-ли писали.
>>3149477 >Загрузка скаченных в памяти/ассетов файлов это чистокровные костыли от гугла. Опять же знаешь как правильно - делай как правильно, только зачем тогда за советом приходить?
Возник вопрос про DI. А стоит ли оно того? Думаю игру сделать и вот встрял "нужен ли DI в принципе?". Помимо di реквестирую какую архитектуру/структуру файлов строить (может что новомодное есть) Мимо мобайл дев
>>3152494 В случае игр может иметь смысл. Я не игродел, и больших приложений не делал, но предполагаю что можно делить модули так: логин/юзердата/сессия, оффлайн фичи, онлайн фичи, донат/магазин/оплата. На счет структуры скажу что андроид студио сама тебе сделает дефолтную структуру. В каталоге res (ресурсы) уже есть места куда добавить строковые константы (полезно для локализации), изображения, анимации и шрифты. Еще есть папка ассетов, которая не создается по дефолту в проекте.
>>3152494 Хотел спросить пару вещей у мобайл дева: 1) Как из эмулятора АС стучаться в локалку? Не получаю ответ от сервера хоста 10.0.2.2 (апи 34, таргет 24, все сетевые штуки разрешил). 2) Как внутри приложения запускать http сервер чтобы с него брать данные (для теста пока нет нормального сервера)? 3) Почему при скачивании файла обычно возращается его id, по которому мы обращаемся к нему, а вызов напрямую в доках стараются лишний раз не упоминать даже?
>>3152544 А вообще, я предполагаю, что в андройде сделано для какой-то йоба абстракции и чтобы при смене локации файлов, апи не сломалось. Ну и как отмечал выше - безопасность тоже.
Андройд слишком сильно завязан на всяких избыточных абстракциях и сильная фрагментация была на ранних этапах
>>3152564 Посмотри, здесь описывается архитектура что ты ищешь. Активити+Сервис. В схеме много андроидовских абстракций вызывающих друг друга, и эта лапша из взаимных коллбэков отлично работает на андроиде. Как я понял, сервисы придумали для того чтобы даже после закрытия или краша активити апдейт бд и хитровыебанные запросы на сервер не прерывались неожиданно. Не знаю, три в ряд или мобильную дрочильню с анальной слежкой за сессиями китов ты проектируешь. Очень разные проекты. https://www.pvsm.ru/android-development/8030
>>3153115 О, спасибо, анончик, пойду читать сейчас. Хочу сделать 2d гача дрочильню с онлайн чатом и боями, вот такие вот дела... Надеюсь продать этот проект кабан-кабанычу и уйти в закат
>>3153129 У меня есть мечта взять старое приложение (chan burauza, для форчана), и скопипастить функционал для ридонли в компоузе. Приложуха старая под старый телефон, и она на новье скорее всего откажется работать.
>>3153410 >>3153604 Чет-т взглянул на примеры рест апи в котлине и го. В основном их сетевые фреймворки это какая-то утомительная хуйня как паскале, где синтаксического сахара около нуля, и надо всякую типовую ебалу бойлерплейты и роуты прописывать каждый раз. Ненавижу большие бойлерплейты в типовых задачах. На питоне сетевой стек уже тянет на 21 век, уже освоил нормальные декораторы, да еще и разными фреймворками позволяет обмазаться.
В общем, опять выхожу на связь. Еще на той неделе заборол кэширование по http на помпоуз. Так как на работе никто настраивать https не будет, и новомодный coil работает как-то изотерично и без http, решил вопрос максимально примитивно. Инет легко взлетел когда я заменил помойный эмулятор android studio на физическое устройство и сделал проброс на локалхост компа.
С сетью работа идет через httpok3, и битмап из body сохраняется в кэш. Подводный в том что в случае когда body NULL (нет инета, неверный адрес), запрос крашит приложение. В хеллоуворлдах не пишут как обработать ошибку, но в гите есть нужная строка (достаточно закрыть body в конце запроса). Писатели библиотеки для языка, главная фишка которого это элегантная обработка NULL, насрали себе в шаровары при получении NULL в body.
В общем, приходит JSON со строковыми данными и ссылками, после чего делаются запросы в корутинах чтобы загрузить пикчи в кэш. Затем sleep 300ms чтобы данные точно успели сохраниться. И рисуем пикчи в ленивом списке. Когда файла нет, ставится заглушка. Обрывы связи на 3 секунды (переход между роутерами) бывают часто (из-за чего и началась эпопея с кэшированием). Как делать повторное скачивание, еще не продумал.
Понемногу освоил события физических клавиш (стрелки, сканер, назначаемые ф1-ф4, прочее). Не очень весело дела с обработкой событий клавиш в компоуз: 1 в 1 как в дельфи, будто тщательно списывали. Вешаются только на элементы гуи, и только когда элементы в фокусе. Да еще и зависимости очень фрагментированы. Чтобы обработать события нажатий, надо почти 10 импортов сделать. Не очень круто что стрелки работают по умолчанию, и есть ровно 1 глобальная обработчик, это backspace. Хочется сделать глобальный обработчик по клавишам, и переназначить стрелки, но на компоузе решили не заморачиваться. Придется забыть о планах и ограничиться малым.
>>3164343 >Затем sleep 300ms чтобы данные точно успели сохраниться Зачем при такой охуенной синхранизации что-то оптимизировать было? Что значит "данные точно успели сохраниться"?
Сделать котлин презентабельнее
Аноним21/05/24 Втр 20:50:34№3164599148
Была проблема парни что в линуксе не было иконки котлина для .kt, а у джавы была, то есть котлин отображался как текстовый документ, не солидно!!! Я порешал вопрос, в убунту добавили, в поп! ос добавили, в линукс минт добавили, единственное где не удалось мне, это чтобы добавили в Ubuntu Kylin (китайская убунта), потому что там перекати поле в гите. Везде где надо в популярных добавили, моя миссия с иконкой котлина закончена. Самое странное почему это должен был делать именно я? Всем котлинистам было настолько пофиг?
>>3164554 Взял много для запаса. Буду понемногу уменьшать во время теста в проде. Надо замерять время обработки запросов при высокой нагрузке, а это еще в будущем
>>3164905 Ну вот ты сам и ввел наибольшую проблему, которую тебе предстоит оптимизировать. Даже две в одной - тут тебе и гонка потоков и тормоза уровня лишнего запроса в базу.
>>3149477 >At first I was like >инфоцыгане, гугол, антипаттерны, мусор, архитектура, тонкий клиент, неэффективно! >>3164343 >but then >коллеги, жду в слипе 300 мс, авось данные придут чет прямо с подливой кекнул с этого архитектора
>>3165357 >ColdStorage Спасибо. Описание заинтриговало. Прям та идея которую я описывал. Впервый раз вообще вижу упоминание проекта, да и в гугле около нуля информации кроме гитхаба. Видимо как обычно шиз одиночка написал, возможно даже гениальный шиз. Последний коммит был в 2020, когда компоуз еще у гугла в яйцах плескался, но надеюсь к современому котлину с компоузом получится подключить.
Нашел фреймворк рест котлин похожий на типичный рест фреймворк на питоне. Quarkus. Вид похож на человеческий:
@Path("/application-info") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) class ApplicationInfoResource( @Inject private val applicationInfoService: ApplicationInfoService ) {
@GET fun get(@QueryParam("request-to") requestTo: String?): Response = Response.ok(applicationInfoService.get(requestTo)).build()
@GET @Path("/logo") @Produces("image/png") fun logo(): Response = Response.ok(applicationInfoService.getLogo()).build() }
Как в питоне, только питон уже по дефолту в дистрах, и окруженение за минуту делается, пока котлин с градлом надо настраивать, а потом собирать в uber jar. В общем нельзя в натив котлин собрать и запустить в kts, так что смысла в этом фреймворке мало.
>>3165949 Красиво. Так я не понял, жавалин в первую очередь для явы делали или для котлина? Почему в гибабе несколько языков? Я, вот, яву только читать умею, и если подавляющее большинство ответов в мануалах и стаковерфлоу будет на яве, то не осилю.
>>3165953 ColdStorage в двух местах очень близок к тому что я пишу, только на других зависимостях (более актуальных по моему мнению, ибо автор писал код в 2020), так что буду оттуда активно взаимствовать, посматривая в исходники. Ну и там автор заболел класической питоньей болезнью - клать класс в класс чтобы вызвать объект из объекта, и складывать в другой объект, при том что кода меньше 1000 строк.
>>3165578 Не, я о том что питон почти всегда по дефолту предустаовлен. Достаточно запакетировать сервер с зависимостями, и в таком виде распостранять по локалке. Клиент буквально одной командой поставит не вспотев. На го еще пизже, что даже в голый контейнер можно поставить без рантайми (правда язык ГОвно).
>>3166819 >Красиво. Так я не понял, жавалин в первую очередь для явы делали или для котлина? Почему в гибабе несколько языков? Я, вот, яву только читать умею, и если подавляющее большинство ответов в мануалах и стаковерфлоу будет на яве, то не осилю. Вообще для Явы , закос под котлиновский ктор. А какое это значение имеет?
>>3166819 >Не, я о том что питон почти всегда по дефолту предустаовлен. На линуксе разве что, на Винде нет. В любом случае ты и джаву одной командой поставить можешь, через вингет или аптгет
>>3167047 Ну технически я начинаю теряться когда импортирую ява зависимость и понимаю что не могу сходу сразу сказать, нужно ли создавать nullable переменную/объек или нет. Если бы либа была полностью в котлине, так мы сразу а гайдах написали что тут используем ?. там !!. Соотв буду попадать на null pointer exception по невнимательности.
>>3164775 Ничего особенно интересного нет, увы. Просто улучшили то, что есть. Хотя я хз что нового можно добавить для котлина. Я бы хотел какой-нибудь синтаксис прикольный, который ещё больше позволит сокращать код. Мб функциональщины побольше
Вышел котлин 2.0 и теперь улучшена поддержка Java кода, особенно Null.
Теперь try-catch адекватно редактирует на Null и если раньше внутри try приходилось вызывать var?.let {}, даже если catch(e: NPE), то теперь не надо! Можно говнокодить теперь так: var a : String? = null ; try { println(a.lenght) } catch(e: NPE) {}
Room, Jetpack ViewModel, Jetpack navigation (вроде он тоже) становиться мультиплатформенным решением. Теперь проще переводить с android в kmp свои приложения!
Ktor 2.3.11 стал последним ktor 2 релизом, уже есть первые беты ktor 3.
ТАКЖЕ Jetbrains представили свою языковую модель для написания кода. Пока-что она работает только с kotlin кодом, но результаты неплохо так удивляют. По их словам, GPT4 может выдавать только 40% работающего kotlin кода, а их модель под 60-70%. Вы можете протестировать её бесплатно, она является open source и находится на huggingface.
>>3169520 Да не за что. Думаю делать такую выжимку, когда выходит несколько интересных обновлений и рассказывать общее. Может по ктору и exposed буду пилить т.к. очень интересный стек.
>>3169423 Вроде навигацию, лайфсайкл и ресурсы доступны на большем числе платформ (меньше платформозависимых костылей). Правда такое чувство на данный момент на мультиплатформе пишут 3,5 энтузиаста в надежде на скорую декостылизацию. Житбрейнс и Гугл делают ставку на то что те апи что есть на андроид будут работать везде, и им похуй на рефакторинг на данный момент. Целятся в вебе и айос взлететь залететь, но это пока только на слайдах. В чате в телеге почти все мультиплатформеры пишут в связке андроид+пк, и то часто обмениваются костылями для пк.
>>3170101 Я не понимаю этот дрочь к мультиплатформе. Это преподносится как киллерфича, но на деле просто группировка кода и все же?
Куда там все силы идут, на что? Полгода назад нужен был десктоп, вспомнил про шум мультикомпоза, думал наверну, а на деле ни доков, ни примеров, понюхал бибу и ушел
Или там финансирование жестко свернули или кто-то жестко стал пилить бабло. Даже вот этот котлин 2.0, стыдно показывать, ноль реальных технологий, сахара и либ.
>>3170113 Там даже сравнение типа есть, мол флаттер против мультиплатформы. Я так понимаю это рабочий кросс флатер против пустого котлин-нейтив? Или что? Может кто объяснит, реально не в теме.
А можно ли как-то в init-блоке получить поля класса в том же порядке, в котором они вызывались в конструкторе? Звучит как шиза, но ине нужно чтобы data class хранил в себе порядок переданных полей.
Чтобы для объектов Person(name="John", age="20", citizenship="US") и Person(age="22", citizenship="CA", name="Michael") можно было бы написать функцию которая бы возвращала ["John", "20", "US"] в первом случае и ["22", "CA", "Michael"] во втором, как пример?
>>3170113 Вопрос мультиплатформы у Котлина это вопрос жизни и смерти: либо сосать+лежать под сапогом у гугла с явой на андроиде, изредка поглядывая на мертвый сектор дестктопа (расклад на сегодняшний день), либо наобещать золотые горы вебмакакам и нищукам без макбука (айос разработка это обязательно мак), и пустить корни везде.
>>3170115 Посмотрел эти дебаты флаттера с котлином. В общем флаттер это огромные всратые портянки кода, благодаря которым можно делать сложнейшие анимации и все что угодно на любой платформе при предсказуемом результате. Котлин локаничен и прост для вката, но красивых анимаций с виджетами и образцовой мультиплатформеностью от него ждать рано. То-есть флаттер это стабильное могучее кровавое легаси, которое могет в любое ебанутое "сделайте так чтобы красиво было", и писать на нем это наверное полный пиздец, а котлин уже сейчас используется для не особо сложных приложений, и только разрастается до размеров флаттера.
>>3170113 В мультиплатформе используется обычный компоуз, но специфичная документация находится здесь. Кстати, не вся т.к. большая часть API строится на swing/awt и тебе требуется писать swing объекты и связывать с компоузом, если не найдешь специфическую фигню под десктоп. https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/README.md (вообще не пойму, почему они туда запихали...)
Кстати, а давно foreach разный в котлине и джаве? Сейчас попробовал пройтись foreach по мапе и вышло, что
map.forEach { key, value -> // код } это джавовая версия, а map.forEach { (key, value) -> // код} это котлиновская версия
>>3170120 Я тут использовал некий класс Person, но вообще идея была в том чтобы хранить URL-параметры для API где их порядок важен. Чтобы в одном классе инкапсулировать всю тайпчеки и преобразования и не таскать мапу из функции в функции. Но альтернатив, видимо, нет.
>>3170321 Тебе по факту джаву знать на уровне синтаксиса надо, а это 6 часовой курс на ютубе от условного индуса.
А в целом да, смысл есть, если для себя учишь. Большинство крупных либ по типу gui, ORM, backend web уже есть на чистом котлине (compose/korge, exposed/ktorm/sqldelight, ktor/javalin) Если язык понравится и захочешь больше углубиться, то джава необходима т.к. слишком много документации написано на чистой джаве, без упоминания котлина. Хотя данный код может запускаться (и тебе придется это делать) и на котлине
Я не могу добиться нормального объяснения от чатжпт потому что у него тупо нет данных чтобы объяснить такую тему, он начинает нести пургу.
Почему говорят что в котлине нет подстановочных знаков? Есть же вариативность. Это потому что это как-то концептуально другое или это надо воспринимать буквально что нет знака "?", поэтому wildcard собственно нет.
>>3170321 Если у тебя вкат с нуля, то стоит, просто потому что там база си-синтаксиса. А так не нужно, большую часть времени там API либ дергается, ровно как и в котлине и в других языках.
>>3170321 Стоит в первую очередь учить котлин. А жабакод достаточно подтянуть до уровня "умею читать". Причины: - чистая ява вызывает непреодолимую тягу писать абстрактными классами, а так же сеттерами и геттерами - на яве много годных статей, которые не всегда есть в котлине - в доступе тонны примеров на яве, который можно копипастить в андроид студио, и он будет сам конвертироваться в котлиновский - знание жабы сейчас нужно только чтобы пройти интервью, а на работе уже будет переписывание на котлин либо поддержка жабы - на андроид есть библиотеки на яве, которые не портированы на котлин, но достаточно лишь создать экземпляр класса явы не вдаваясь в детали
>>3170982 >в доступе тонны примеров на яве, Ох уж эти легаси примеры, вкатывался давно в джаву, по рекомендациям поиска начал вкатываться в стек EE. Оказалось он не нужен, а если юзается то только контейнер сервлетов, да и это уже моветон. Такие открытие ненужны вообще.
Зная котлин ты будешь знать джаву, если прям надо будет читать сорцы, подтянешь походу.
Это начинать с нуля не очень, котлин специфичен по синтаксису, все другое будет непривычно. Как и котлин после джавы.
>>3170960 Если это действительно одно и тоже, то документацию делал какой-то недалекий красноглазик.
Интересные библиотекифреймворкиETC
Аноним28/05/24 Втр 16:59:32№3172064194
Решил бампнуть тред интересными библиотеками для Kotlin (пока-что только KMP / UI решения. В будущем будет всё больше и шире общий спектр).
KorGE ( https://korge.org/ ) мультиплатформенный 2D / 3D игровой движок написанный на kotlin для kotlin. Есть собственные библиотеки-дополнения для работы с временем/ DI / прочее.
Realm ( https://github.com/realm/realm-kotlin ) новая ORM библиотека для работы с БД от создателей MongoDB. Есть официальные SDK для android / KMP / swift / .NET
Kottage ( https://github.com/irgaly/kottage ) Key-Value хранилище для сохранения данных. Есть поддержка KMP проектов. Нужна для сохранения настроек пользователя.
Coil ( https://github.com/coil-kt/coil ) библиотека для отображения и автокеширования картинок. Пока-что android-only, но уже готовиться версия 3, которая будет поддерживать KMP.
PreCompose ( https://github.com/Tlaster/PreCompose ) KMP библиотека для навигации между экранами. Есть собственная реализация ViewModel прямо как в android и поддержка Koin.
>>3171046 >Ох уж эти легаси примеры Ты удивишься, но примеры из явы 1.8 до сих пор везде работают, а с тех пор не поменялось примерно нихуя. Буквально копипащу рандомный ответ из стаковерфлоу и жду пока ИДЕ соберет код в котлин. Работает в 90% случаев кроме тех 10% когда надо правильно nullable типы переопределить. Жаба - рай для легаси кодера. Обратка даже пизже чем у дельфи, хотя это тот еще некроязык (там придумали диалекты чтобы ухудшить совместимость кода, чем как обычно навалили себе в штаны в стиле дельфи).
>>3172064 >Coil Насосался с ним, и больше не хочу его трогать даже палкой. Работает как черная коробка, которую почти невозможно отдебажить или проверить на ошибки без прыжков над головой. Не работает в эмуляторе потому что так захотели разрабы. Даже повторного запроса при неудачном подключении и нормального stack trace нет, какой уж там production-ready. Вечная бета. Я просто делаю запрос okhttp3, сохраняю через context и показываю обычным Image, что полностью исключает обосрамсы и позволяет обрабтать любую внештатную ситуацию. Используй такой же костылек, и вернешься к койлу лет через 5-10 когда его допилят. >PreCompose Скоро библиотеки с навигацией будут выходить каждый месяц. Опенпосусники обезумели в соревновании кто больше создаст одинаково кривых навигаторов по примеру гугла. Даже я свой навигатор написал (не либа, а стейт + класс навигатор) для внутренних нужд.
Да, есть такое, ведь гуглы педики и сразу после выхода беты compose multiplatform не удосужились сделать хотя бы альфу jetpack navigate. Только спустя 4 года всё же начали пилить. Как и typesafe navigation
При передаче метода, может ли быть вызван метод N раз? Где N - сколько раз был передан вызов метода.
У меня есть приложение, где из API слоя метод передается в репозиторий метод и потом уже в usecase, который передает контрллеру. Получается примерно так:
Api fun getById(id)
Repository fun getById(id) { return api.getById(id) }
Usecase fun invoke(id) { return repository.getById(id) }
Controller fun getUserInfoById(id) { val info = usecase.getById(id) }
В логах ktor насрал 4-мя вызавами API с разными воркерами. Версия ктора 2.3.11, движок cio
По хорошему так не должно быть и там должен бфть единый запрос, но походу либо неправильно сделал и надо фиксить, либо просто сломан cio как всегда
>>3173124 Я не понимаю просто, это прикол от разрабов? Я провёл мини тест системы и понял, что запросов не чётко 4 или 3, а вариативно от 3 до 8 где-то. Какого... ну не может же быть это из-за того, что я криво объект сериализации написал и он не работает? Хммм
>>3173294 Да уже посмотрел. Оказывается, что у меня объект не успевал сериализоваться и тут же шел за "новой" порцией. Зачем? Да хз вообще. Сейчас просто удалил весь код, буду с нуля переписывать. Эх...
Зато возникла другая проблема: kotlinx.serialization умеет в парсинг parent-child нормально? Просто один мудак сделал апи на уровне { "status": { "string": "завершено", "code": 2 } } И теперь для сериализации приходится создавать доп. Объект или же писать мапу. Прим. для сериализации этой же параши data class Test( val status: Status ) data class Status( val string: String ) Да и бог бы с ним, если бы такие были объекты, так они еще вложены друг в друга... Знаю про ignoreUnknownKeys, но все равно проблему не решает. Помогите, анончики!
>>3173382 А, плохо спросил, я имел в виду "сериализация вложенного объекта без создания parent объекта. Чтоб { "list": { "episode": {} } } Было вот так в коде @SerialName("list.episode") data class Episode()
>>3174674 Вроде там джвм подписывается на событие разыменования нулевого указателя, типа page fault exception. У всех остальных указателей этой проверки нет Так что это далеко не одно и то же
>>3174708 А какая разница? Ну типа так и так есть где-то под капотом действие, которое определяет что "ты" есть на самом деле (нулл или не нулл).
Та же беда с проверкой индексов массива, вроде простая вещь, поставь ты эту проверку и лишишь просто пласта проблем (одни из популярных уязвимостей), но в реале эта хрень миллионами и миллиардами раз может дергаться (как у тебя), что делает раст с нулевой абстракцией просто наябом, если сравнивать с си.
Я не удивлюсь что проверку делает котлин и где-то под копотом еще VM повторяет это.
>>3174721 Хотя может я и не прав, просто это фундаментальная проблема. Я не знаю можно ли это сделать бесплатно на системном уровне и почему тогда котлин не решает эту проблему как решает VM
>>3174721 >А какая разница? По перформансу как видишь огромная. Что у тебя проц железом обрабатывает, а что джава функция с ветвлением постоянно вызывается
>>3174725 Я хз как там сделано, я к тому, что там под капотом есть оверхед, иначе давно бы стерлась грань между управляемыми и не управляемыми языками, просто ты этот оверхед не видишь в статистике.
А может там правда работает через событие системы, но это может стоит настолько дорого, что решили проще if подергать, чем давать генерировать эту ситуацию.
Не факт даже, что нуллабилити можно сделать проще, даже со своей VM.
Dataarg - спасение перегрузки. Добавили новое ключевое слово - dataarg. Применяется к классам/аргументам и синтаксис такой: > dataarg class MyClass (аргументы) > fun say(dataarg myArgs: MyClass) Нужен для работы с повторяющимися аргументами. Как пример, есть функция LazyList. У нее 2 перегрузки, которые отличаются тем, что у первой content: RowScope.() -> Unit, а у другой ColumnScope.() -> Unit. В kotlin 1 нам надо было либо делать дата класс с кучей аргументов и передавать как аргумент в функции или же копировать/вставить одни и те же аргументы из одной перегрузки в другую. Теперь можно сделать так, как описал выше и использовать такие функции как обычные перегруженные функции.
Private mutable/Public immutable field. Если кто то программирует под android, то точно сталкивался с таким кодом: private val _uiState = MutableStateFlow(MyUiState()) val uiState = _uiState.asStateFlow() Теперь этот бойлерплейт можно удалять! Добавили удобный способ сократить этот код и вот как: val uiState: StateFlow<MyUiState> field = MutableStateFlow(MyUiState()) field по умолчанию является приватным полем, а uiState публичным.
Типы ошибок. Теперь тип ошибки и тип объекта можно кастовать вместе. Пример: private error object NotFoundError
// тут функция по поиску объекта в списке, но она сама нам не так важна fun searchObject(): T { val foundObject: T | NotFoundError = NotFoundError // идет поиск объекта в списке и если есть, возыращаем, иначе ошибка if (foundObject is NotFoundObject) { // кидаем ошибку } else { return foundObject } } Сам NotFoundObject является объектом ошибки, но не самой ошибкой. Нельзя прописать throw NotFoundError, но можно кастовать его как второй возможный тип переменной, вместо T?
Мелочь, а приятно Тройные строки (начинаются и заканчиваются тремя кавычками) улучшили. Теперь они тоже имеют вставку переменных прямо в строку. Пример: Kt2 $$""" Yaml: $version Web: $domain """ K1 (тот же результат) $Yaml: ${version}\nWeb: $domain"
Го это вообще просто звездос, вроде норм асинхронный рантайм, но столько подводных камней, даже на элементарных слайсях есть места отстрела ног, как будто студенты язык делали. Там реально есть книга 100 ошибок го.
С шарпами мутная херня, вроде опенсорс и язык неплох, и тут же закрытый отладчик онли под вижлы. Какие-то страдания у линуксоидов. В общем в жопу эти корпаративные языки и игру мягких в EEE.
Раст вроде по началу норм, а потом такая шляпа начинается, что ну его нахер, проще на сях (или новом зиге) писать чем в эти ограничения и лайвтаймы дрочиться. Он просто неудобный, ни какого чуда не случиться просто вката, будет только медленная разработка.
Динамикодресня идет лесом, как только код становится больше 1000 строк, начинается страдания, да всякие jsdoc и хинты могут помочь, но проще взять статик язык, там хоть в производительности выигрышь
Жаба после котлина противна, ну вот я писал и понял что мне бы тут просто не помешал сейчас этот сахар из котлина и везде думаешь как хорошо было бы тут котлин итд, проще котлин взять.
>>3175753 Лично мне в джаве не нравится синтаксис (слегка специфичный, скажем так), что лямбды вне функции нельзя вынести, нет нулл сафети, нет лямбд let, apply, also, нет компоуза, нет удобного дсл
Это то, что я за 10 минут вспомнил
Но это не значит, что я вообще не люблю джаву. Я на ней пишу и мне нормально впринципе, просто слегка неудобно. Всё таки котлин сделал своё дело и 98% времени пишу на котлине Мимо
>>3173124 >>3173382 >>3173394 Обвешай реквест самописными коллбэками и не выполняй вызов повторно пока не получил нормальный ответ. Ожидай до таймаута, либо обвешай все слипами в when до победного, либо крути while с прерыванием до достижения нужного значения каунта. Первый раз реквесты пишешь что-ли? Твой незаурядный план без костылинга не исполнишь.
>>3175753 Как можно зарекаться о производительности, когда вы пишите на срыге? Взяв джаву и срыг, ты буквально поделил где-то на 10-15. да мой сладких, все уже знают о techempower
>>3175502 >Го это вообще просто звездос Для меня главным красным флагом в этом языке является то как на хабре пишут о нем в статьях. В стиле сначало было очень неудобно от горячего баттплага, а потом гомосексуализм стал приносить удовольствие, даже не знаю как описать почему полюбил гомогейский синтаксис, в общем стал ценить говно.
>>3175805 не, я про то, что условный Runnable надо писать так new Thread(() -> { // code } ), когда как на котлине это Thread { // code } и никаких скобочек не надо
>>3175792 да я вроде всё сделал, теперь не срабатывает ложных вызовов. Я просто сильно удивился, что ктор шлёт запросы БЕСКОНЕЧНОЕ КОЛИЧЕСТВО, пока не сможет получить/сериализовать объект.
Ну как избавился... я надеюсь, что теперь не будет такого. Всё таки ктор это та еще чёрная магия, надо тестить его работу более подробно. В данный момент лень, потом займусь.