Друзья, давайте поговорим о Java! 😎 Это не просто скучное кодирование, это настоящее приключение в мире Java-волшебства! 🚀 Мы, как Java-маги, используем высокоуровневую абстракцию, исследуем глубины кода, и умеем оптимизировать его до невероятных высот! Мы - высокоуровневые жонглёры абстракции ☝, которые находят общие черты в данных, как настоящие детективы, и призывают оптимизацию в свои заклинания! Наши клавиши клавиатуры как волшебные палочки, создающие чудеса в мире Java! 😜💻✨ Это как звездный корабль, мчащийся сквозь бескрайние просторы Java-галактики, и каждая строчка кода - это наша звездная пыльца! ✨💻🌟🪄
Наконец-то, спустя долгие годы ожидания, сегодня, 19 сентября, выходит Java 21, в которой наши мечты были исполнены, а обещания от оракла выполнены. Такого масштабного обновления не было со времён Java 8.
Итак, в релиз выходят и запускаются без всякой ебли с --enable-preview, а значит вы сможете всё это потрогать в реальной работе:
— LOOM!!! — Pattern Matching: технически это несколько JEP и несколько фич, но логически это одно цельное изменение языка, которое добавляет возможность гораздо более удобно сравнивать данные с образцом; — вместе со всем сахаром, что так и напрашивается в сырых конструкциях сопоставления. На выходе мы имеем instanceof Integer integer, его навороченный брат instanceof Point(A x, B y) и новый switch с красивым java-style синтаксисом, который может проходиться по всему, что душе угодно: по иерархии наследования, по строкам, числам и енумам, но блядь не но булинам, с оптимизациями до O(1) и отдельным синтаксисом для частных случаев типа рекордов. — Мало кто знает, но наши мольбы о .getLast() в List<T> были услышаны. Это JEP-433: Sequenced Collections, и реализован он был так, как завещали прародители Java в своих идеалах — основательно, абстрактно и продуманно: нам не просто сделали .getLast() в один-единственный List<T>, нам запилили целый интерфейс SequencedCollections, который добавляет целых 7 новых методов во все последовательные коллекции в Java, такие как ArrayDeque или, например, LinkedHashSet.
Но это ещё не всё! Следующие фичи выходят в превью:
— Structured Concurrency — новый способ асинхронного выполнения задач, с гораздо большим контролем над ходом выполнения, чем в стандартной неструктурированной java.util.concurrent. Нельзя не упомянуть async-await из других языков: вместе с Loom, Structured Concurrency решает примерно похожие задачи. Однако в Java решили не мешать мух с котлетами, отдельно решив проблему оптимизации, и отдельно закрыв потребность в готовых инструментах для работы с асинхронностью, благодаря чему мы получили гораздо более гибкие решения обоих проблем. — Scoped Value — более гибкий и удобный ThreadLocal. Можно настраивать время жизни, принадлежность к потокам, разграничивать изменяемость, и ещё туева хуча примочек. Вместе со структурированным параллелизмом и Loom изменяет до неузнаваемости модель многопоточности в Java, выводя её на новый уровень. И всё это возможно благодаря тому, что разработчики Java не бегают за модными трендами, а основательно подходят к каждому вопросу. — String Interpolation. Да, теперь можно вставлять переменные (и не только, всё что угодно!) внутрь строк. И это сделано безопасно, с гарантиями сохранения обратной совместимости и с заделом на улучшение в будущем. Аналогов в других языках тоже нет. — Unnamed Classes and Instance Main Methods — Брайану Гетцу принесли распечатанный на бумажке мем со сравнением Hello World в петухоне и в джаве, и 10 лет у него горел с этого пердак, пока он не придумал гениальное решение — сделать бесполезный синтаксис для хелло-ворлда, чтобы показать петухоноблядям, чьё место у параши. Теперь можно писать хелло-ворлд в однутри строчки.
>>2847379 Опа! Друзья, сегодня наша долгожданная Java 21 вот-вот выходит на свет! 🎉😎
Что тут у нас:
🔮 LOOM: Потоки без швов, словно магия! 🧩 Pattern Matching: Проверки данных на стероидах. 📚 Sequenced Collections: Теперь .getLast() доступен всем! В превью: Structured Concurrency - контроль над асинхронностью. В превью: Scoped Value - гибкий ThreadLocal. В превью: String Interpolation - вставка переменных просто как ABC. В превью: Unnamed Classes и Instance Main Methods - для хелло-ворлда в одну строчку! Java 21 - как праздник для программистов, только без торта (но с мороженным)! 🍰🍦💻
>>2847395 Я сегодня уже перекатил всё на 21 жабу (использовал релиз-кандидата, не дотерпел до релиза). Потребовалось немного больше времени, чем обычно, потому что перекатывал в этот раз я очень рано и много чего ещё не поддерживало её. Пришлось включать javac вместо собственного компилятора в maven-compile-plugin и обновлять ломбок до edge-релиза. Ну и по старинке бампнуть maven-shade-plugin, тут без приколов было, просто версию поднял. Ну и ещё новую версию идеи поставил, но это скорее в рамках перекатывания своего пк, а не проектов, туда же установка новой jdk.
>>2847398 А с вектор апи ничего нового. Он как был в инкубаторе, так и остался. Про превью можно и нужно рассказывать, чтобы люди узнавали про --enable-preview и было меньше проблем с использованием превью-фич в разработке.
>>2847406 Их же не используют в проде. Так в чем смысл.. К слову, а паттерн матчинг не поощрение для говнокодинга? Типа скрытый instanceof, не так костыльно выглядит. Честно говоря, кроме вот таких сценариев, когда есть общий обжект и нужно не полиморфно совершить даункаст, пока не придумал где он ещё прям ебет
Объясните тупому ждуну на пальцах как вы достаёте данные из БД, когда объекты могут быть вложенными. Я просто тупо не понимаю что есть в spring-data/jpa что может мне нормально мапить. Я пытался в projection, POJO с конструкторами и тд и везде я шел нахуй. Вот есть у меня десяток таблиц. Есть очень простая кверя в которой единственная сложность это десяток джоинов, всё. Возвращаемые ряды из БД должны быть замаплены в объекты, которые внутри имеют объекты и внутри которых самих так же могут быть объекты. Неужели единственный вариант это делать Object[] и лично проходить ручками?
>>2847906 Не мысли в терминах таблиц, это table driven development, прошлый век. Мысли агрегатами доменной модели. И все у тебя будет заебись. Поблагодари меня за совет мимо сенька
>>2847906 >Объясните тупому ждуну на пальцах как вы достаёте данные из БД, когда объекты могут быть вложенными.
Мозги включи. Как ты собрался маппить кортежи данных из бд, которые априори плоские, на какие то манявложенные структуры?
На вложенные структуры маппятся отношения, а не данные. И в JPA для отношений есть вполне себе четкие и понятные аннотации - ManyToOne, OneToOne, и.т.д, по которым есть куча гайдов.
>>2847916 У орм и реляционных таблиц фундаментальные несоответствия и куча проблем из-за этого. Просто закрыть на них глазки - ахуенный совет, ниче не скажешь.
>У орм и реляционных таблиц фундаментальные несоответствия и куча проблем из-за этого
Поэтому ОРМы как концеапцию уже много лет называют говном. И опций у тебя никаких - либо учишься худо-бедно жрать говно, либо жрешь красную таблетку, прозреваешь и ебешься со скулем. Других опций нет. Deal with it.
>>2847916 Ниче не понял, но спасибо за держание в курсе. >>2847917 И как это делать? Вот из каждой таблицы в которой по 100 строк мне нужно 5-10 строчек. Мне не нужно всё что тащит хибер. >>2847923 А нахуя тогда нужны вот эти все приблуды? https://thorben-janssen.com/spring-data-jpa-query-projections/ Мне не нужны всратые OneToOne, которые без байткод оптимизации всё равно делают селект даже с fetchType.LAZY. Мне не нужны все отношения которые может хранить энтитя. Так же не нужны все данные и ключи которые там могут быть в таблице. У меня задача взять пару полей из каждой таблицы по специальным критериям, спамить возвращаемый лист данных в требуемый джсон и выплюнуть во фронтенд. У меня просто read из БД и у меня рвётся жопа что я не могу найти нормальной поддержки в спринге. >>2847926 Ну как я и говорю, самый последний вариант, которым я не хочу заниматься, просто брать Object[] и руками делать это дело.
>>2847936 Да, ты прав, я ошибся и написал строки вместо столбцов. Из всей этой сотни штук мне нужно от 5 до 10 в зависимости от таблицы. Тащить всё тупо нерационально и DBA пошлёт меня нахуй. Граф говоришь? Пасибо, гляну что такое. Про байткод оптимизация - надо было на англюсике написать bytecode enhancement. Там у нас стоит biderctional во многих местах, насколько я прочитал https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/ >Bytecode enhancement is the only viable workaround. However, it only works if the parent side is annotated with @LazyToOne(LazyToOneOption.NO_PROXY).
>>2847940 Скажи своим пупуням лиду и дба что надо подгонять модель данных под твою системную операцию. Пусть рожают рид модель, делают кастомную вьюху, что угодно, но чтобы у тебя все читалось !!!
>>2848026 Пупуни добрые и хорошие,они выполняют свою работу и не тратят время на злюк в интернете. Поэтому все так любят пупунь и поэтому на джаве так много работы
>>2848072 Это, было бы здорово, напрячь кого-то другого чтобы мне сделать getЗаебись() и всё получилось, но боюсь придётся объяснять что у меня не получается. Я пока не успел чекнуть с чем графы едят, другие таски горят, но кроме графов в жабе нет никакого другого варианта вот такого вот кастомного селекта, который я хочу сделать?
Кто подскажет, почему с полями length строк, нельзя проводить обычные математические операции? Скажем, есть код: int numerator = input[0].length - input[1].length; Вроде как, обычная математическая операция с целочисленными полями. А Java орет: Exception has occurred: java.lang.Error "java.lang.Error: Unresolved compilation problems: length cannot be resolved or is not a field length cannot be resolved or is not a field length cannot be resolved or is not a field Type mismatch: cannot convert from char to String
Короче, я немного изменил код: int a = input[0].length(); int b = input[1].length(); int numerator = a - b; Теперь математика с полями работает нормально. Но теперь Java ругается, когда я пытаюсь сделать что-то с полученным числовым значением: for (int i = numerator; i < input[0].length; i++) Exception has occurred: java.lang.Error "java.lang.Error: Unresolved compilation problems: length cannot be resolved or is not a field Type mismatch: cannot convert from char to String "
Честно говоря уже не помню в чем там изменения состояли с прошлого раза. Еще за все это время накопилось куча долгов, надеюсь смогу решить, конечно. Впрочем к делу не относится.
Самое главное: я благодарен за поддержку от вас, няшек. Столько прозвищ мне еще нигде не давали. Всех бы обнял... Держать вас в курсе больше не буду, надеюсь не будете скучать, воот.
>>2848656 >О, в жаве мощная шиза? Пофиксил тебя, не благодари. >>2848657 >Ну с другой стороны как нормально чар в стринг конвертнуть. Какой char, какой String, долбоеб? Я РАБОТАЮ С ПОЛЕМ LENGTH, С ЦЕЛОЧИСЛЕННЫМ ЗНАЧЕНИЕМ.
>>2848674 Ну точно)) Самый прикол в том, что айтишники абсолютно не разбираются в собственной же области компетенции. Бабушка-чайник лучше соображает в компьютерах, чем эта публика. Одно непонятно: за что вам 300 000 платят? Как по мне, для вас даже пачка доширака в месяц - завышенная зарплата.
>>2848724 Если серьёзно, крайне паршивый сайт. Постоянно вверху выдачи. Благо есть и хуже, гикфоргик и совсем идиотизм по типу табнайна. Паршивые они ровно потому, что показывают вырванные из контекста примеры, применять их без понимания, что в них происходит, идея ну такая себе.
>>2848742 Да там все подряд. И все по верхам. А в многопоточке что проходишь? Про AQS в курсе? 4 семантики там(plain, opaque, acquire-release, volatile)? >>2848740 Как бы не продешивить... Оценишь у меня проектик?
>>2848754 >А в многопоточке что проходишь? Да саму многопоточку пока и прохожу. Видел однажды слово Volatile, но я пока что ещё на Runnable Thread'ах, на основах.
>>2848695 Так это всё одна хуйня, гринтреды. Виртуальные потоки, крутятся в рантайме, динамически цепляются шедулером ко свободным потокам выполнения, чтобы на логических ядрах чирикать код параллельно
>>2848677 Ебанько, тебе сразу ответили >>2848597 Но ты оказался слишком тупым. И даже когда исправил ошибку >>2848655 ты все равно не понял ее. Скачай себе ИДЕ что ли, чтоб тебе прям в коде тыкали где ты обосрался.
>>2848897 Я бы микросервисы больше как архитектурный паттерн воспринимал (не в ООП-залупном смысле архитектурный а в плане инфраструктуры системы). Он ассоциируется с гринтредами постольку-поскольу видимо из-за Go. А так в отдельных случаях можно вообще при желании спокойно написать код с корутинами который работает медленнее чем без них лол
>>2848897 Ну и если более прямо отвечать на твой вопрос -- нет, не работает. Максимально возможный прирост производительности очевидно кратен количеству имеющихся в распоряжении системы ядер
>>2848977 Сайт спринга, плюс гит какой-то с примером был. И вообще я и сам там что-то дополнял. Так что сложно сказать источник, но помню наебався я знатно. А что по поводу проекта в общем скажешь...?
Чел - айти это не твое. Ты даже вопросы задавать не умеешь, неудивительно что тебя хуями кладут. И это твое копротивление за length выше... кого то забавляет, кого то раздражает, но в обоих случаях выставляет идиотом в первую очередь тебя.
Приведи полный код. Из твоего туалетного обрывка анону остается только гадать, какого типа элементы массива input
Приведи полный текст ошибки. Обрати внимание на то что у тебя косяк компиляции. Обычно в нем четко указан номер строки, где компиляция не сошлась. Уже по номеру строки до тебя по совести должно было дойти где ошибка, а ты мало того что сам ее распарсить не можешь, так еще и людям мозги компостируешь, недодавая инфу.
>>2848887 Перестань пожалуйста, называть себя программистом. >>2849082 >Чел - айти это не твое. IT это и не твое тоже, но ты же почему-то здесь сидишь. >Приведи полный код. Из твоего туалетного обрывка анону остается только гадать, какого типа элементы массива input
>Приведи полный текст ошибки. Обрати внимание на то что у тебя косяк компиляции. Обычно в нем четко указан номер строки, где компиляция не сошлась. Уже по номеру строки до тебя по совести должно было дойти где ошибка, а ты мало того что сам ее распарсить не можешь, так еще и людям мозги компостируешь, недодавая инфу.
Ты еблан или да? Вот в этом посте: >>2848655 я подробно все расписал. Если некомпетентен, то так и скажи.
>>2849726 Ничего нового. К примеру, здесь можно каждый день писать о превосходстве великого шарпа над ничтожной джавой, и каждый раз будут на это отвечать.
Нихуя не понятно, но очень интересно. Комментов напиши к коду, а в ридми напиши - че это за слот машина и как ей пользоваться. Можешь вместо ридми дать пояснения прям в гуях приложения.
Сделай скорость и периодичность спиннера конфет конфигурируемой, и на своем тестовом окружении спецом сделай ее маленькой. По 5сек. Заебался ждать пока крутил этот спиннер...
В заголовке где имя пользователя и его баланс показывается рядом с кнопкой "выход" - баланс всегда по нулям. Бага.
>>2849735 >Комментов напиши к коду Комменты потом напишу может, сам код-то не сложный нифига. Я вроде через аннотации намерения документировал, дальше хз. >а в ридми напиши Надо будет заняться, как фантазия появится... >спиннера конфет конфигурируемой Уже конфигурируемая. Я просто хуй забил это вставлять непосредственно в ui. > баланс всегда по нулям Не очень понял.
Конфигурируемая - это когда вот эта вот опция сидит не в каком то там JSе на фронте, а в опцией спринг-конфиге, и эту опцию можно заоверрайдить при развертывании - через переменную окружения, через командную строку, через spring config server и. т. д.
>Не очень понял.
степс ту репродьюс
1. Зарегался, залогинился 2. Кручу конфетный. Получаю конфету 3. Кликаю Ок, попадаю на титульный экран 4. Зырю в заголовок
Вот именно поэтому тебе и нужно написать ридми и пояснения. Если б твое резюме со ссылкой на проект попало ко мне на стол, с ненулевой вероятностью я бы мог уже сдаться и дропнуть пет уже на этом этапе.
>>2849745 >Ясно, перенесу. Правда хз пока как, ну придумаю, штож
И когда переносить будешь, проверь что эти вот твои лимиты на накрутку спиннера валидируются сервер-сайд, а не тупо во фронте. А то к тебе придет кулхацкер и устроит девальвацию конфет.
>>2849753 Это все обертка же. По сути результат уже известен, а все вот эти спинеры нахер не нужны, можно просто f5 сделать. На пике реальный алгоритм.
>>2849793 Я случайно в одном случае. В других же спросили - ответил... Да и оценка нужна очень, воот. >>2849785 Наверное, это слишком сильное ограничения для абстрактной жвм. Или оно уже есть, но как и перегрузка операторов недоступна.
>>2849724 Да нихуя ты там не расписал, порватка. О чем и речь. Судя по тому что даже на конструктивную критику ты способен реагировать лишь залезанием в залупу и отзеркаливанием, ты похоже еще и шкальник-малолетка. Выйди, повзрослей и только тогда заходи обратно.
>>2849756 Смотря какая задача стоит. Если задача - не давать пользователю накручивать фантики миллионами, дудося твой РЕСТ в обход фронта (что какбэ кажется логичным), проверки таймаута на фронте мало.
>>2849737 Че это за параша? ${var} - нотация, понятная всем кто когда либо писал скрипты или темплейты. А эта твоя залупа со слешами обьектом доллара выглядит как регэксп ебаный.
Ну а че еще следовало ожидать от пориджей? Ты абажжи - щас они еще откроют для себя что паттерн матчинг люто урезанный по функционалу, и начнут стенать что опять хуйню завезли.
>>2849955 Мне приходится ими пользоваться из-за даунов, которые их кидают, и оборачивать их в RuntimeException. Обратная совместимость вообще никак ни на йоту не сломается.
Вопрос по спрингу и идее. Есть два бина. Между ними десятки других бинов. Причем есть несколько путей. Есть функционал, как отобразить диаграмму со связью двух бинов?
>>2849969 Я пока вглубь не залезал, по вершкам чекал. Просто ты скинул скрин JSника, из чего сложилось впечатление что вся рулетка с кулдаунами у тебя - на фронте.
НО, если Name1 встречается несколько раз в этом конфигурационном файле, а мне нужно его изменить только в том случае, когда он встречается в первый раз.
Этой "новой" парадигме лет столько же, сколько функциональному программированию и ADT. Там жен и примеры.
Суть в том, чтобы не теряя профитов от полиморфизма, раздуплить ООП обратно в ФП, и иметь возможность моделировать систему не из зашоренных наглухо обьектов с сокрытыми мутабельными свойствами (которыми все равно никто никогда не пользовался), а из иммутабельных открытых структурок-рекордов, которые в сочетании с sealed-фичей и новыми свичами косплеят ADT на минималках.
>>2850082 А я тебя обниму в ответ. Дальше что? Если говорить про бут, он снизу вверх исчет конфигурации от @SpringBootApplication Потом и чёт все @Component и разрешает wired. А так, конкретный пример бы, абстрактно-то мало что можно сказать..
>>2850122 Ну ты епта скажи в чем я неправ. Сам хуй пойми как сформулировал вопрос и что-то ожидаешь. Что-то уровня: как jvm оптимизирует хвостовую рекурсию.
И я не вижу ни единой причины считать, что эта фича не будет работать на контроллерах.
>Хибер наверняка.
Ему и не нужно, не для него рекорды и дизайнились. Как ты даже в теории себе представляешь поддержку иммутабельных рекордов для JPA, где Entity мутабельны априори?
А вот с Jooq рекорды вполне себе зайдут, особенно если поддержку рекордов в генераторе запилят.
>>2850127 > Сам хуй пойми как сформулировал вопрос и что-то ожидаешь. Процитировал дефолтный вопрос, который задают на интервью, хули не понятно? А, что? Не знаешь потому что никогда не приходилось работать с жизненным циклом контекста? Ну пошел ты нахуй, это знать надо.
>>2850135 Блять, если ты спрашиваешь за лайфцикл так и надо говорить. Говорю ж хуевая формулировка. Помню там целая вереница, сначала интерфейсы по типу бин намед, потом преконстракт, интерфейс, а потом аннотация связанная с инит. Потом пост констракт. В конце пре дестрой интерфейс, а потом метод. Ещё важно понимать, что если это был @Bean, то состоянием управляет спринг. >>2850132 Ни ебу, он у меня требовал ноарг конструктор. Попробуй сам, расскажешь.
>>2850150 Хз, не смотрел я ниче, чтобы ответить тебе. Вон даже название интерфейсов не помню. А так, вместе с двачеком читал же https://2ch.hk/pr/res/2730933.html#2749089 И вообще я просто обнимашек хотел.
>>2848655 Как мне кажется, во-первых, лучше брать модуль разности для int numerator, если ты не хочешь сделать цикл длиннее в случает отрицательного значения в numerator и во-вторых, тебе надо понять разницу между полями и методами, содержащими/возвращающими размер, для разным структур данных (коллекции, массивы)
Но я не думаю, что могу это хоть куда-то впихнуть, типа вот у пет клиника есть сайт, который тырк тырк и оценил. А вот либу... Как ты блятб её оценишь? Или потенциальным жунам время будут уделять на ревью... Так и поверил. Кидаю же ровно затем, чтобы узнать свои проебы.
>>2850190 Это вот эта борисовская мудотень про бинпостпроцессоры? Ее реально нужно запоминать и еще помнить как с ними работают автоконфигурации спрингбута?
>>2850502 А че еще анонам в тред кинать? Опостылевшее нытье вкатунов на стадии от торга до депрессии? Или на брыли шарпеев смотреть? Чел хоть чето делает и чето спрашивает: можно ему говна за панамку по существу и со смыслом накидать, а не просто так, как обычно. Все какое никакое веселье.
>>2850520 Тогда про какой жизненный цикл спрингового контекста мы говорим? Гугл по запросу spring appliction contect lifecycle вообще ничего вразумительного не выдает.
а вообще ну как бы это база это знать надо. может ты еще не знаешь как работают аннотации спринга? как работает проксирование в спринге? и прочую базу.
это все в документации самого спринга хорошо описано, но искать лень
>>2850531 Ну так в статье и есть про бинфакторипостпроцессоры и прочую дичь. Я все это читал, когда 2 года назад вкатывался. И про аннотации и проксирование тоже. Тогда не спросили почему то за 7 собесов.
>>2850526 По положняку джавового коммьюнити, в JPAйные Entity логику класть - не лучшая идея, по целому ряду причин.
Лично я нахожу это потешным, ибо нахуя нужна концепция ORM как средство маппинга кортежей в обьекты, если по факту люди хибером маппят кортежи в кортежи. Но хули делать - так устроено сообщество.
>>2850545 ну например потому что на модели для орма и прочие дтошки никто не пишет тестов. и обычно это закреплено в тех практиках и в сисд закреплено.
а с его кодом в модели - нужно писать тест. а как я уже писал выше - на модели тесты не пишут обычно.
>>2850540 Тебе в ридми нужно доку юзкейсов описать, можно юзкейс-диаграмму. И потом уже ссылки на доку апи, с описанием что каждая ручка делает Я залез. Смотрю в ридми, а там ер диаграмма на 10 сущностей. А все описание бизнес-логики на твоем скрине. Сиди и угадывай, как экстрасенс. На проектах без доки хотя бы на созвоне тебе кто-то что-то объяснит. А тут какая-то хтонь. При том, что это не легаси какиш, а поделка пет-проект.
Мне стыдно врать на дейли что я все еще занимаюсь задачей. На самом деле я ее сделал,она была очень легкая,я просто пушу по частям. Я мудак? Мне очень стыдно,но ничего не могу с этим поделать
Ну в общем-то там из существенных только 4 сервиса. Они не внесены в директорию managers. По сути вся логика приложения описывается ими. В манагерс же сервисы для круда. Так, приложение создаёт общий аккаунт, потом счёт и инвентарь к нему. Потом за деньги из счета ты покупаешь возможность что-то получить в инвентарь: item. Этий айьемы могут продаваться. По сути копишь предметы, продаёшь, преумножаешь денюжки.
>>2850561 Ты не слой сервисов описывай, а доку с пользовательской стороны, с ссылками на доку апихи. И как и зачем с апихой взаимодействовать. Почитай как выглядит дока к публичным всяким апихам. К ютубовской там или вкашной.
>>2850561 >Да, надо бы. > >Ну в общем-то там из существенных только 4 сервиса. Они не внесены в директорию managers. По сути вся логика приложения описывается ими. >В манагерс же сервисы для круда. >Так, приложение создаёт общий аккаунт, потом счёт и инвентарь к нему. Потом за деньги из счета ты покупаешь возможность что-то получить в инвентарь: item. Этий айьемы могут продаваться. >По сути копишь предметы, продаёшь, преумножаешь денюжки.
На будущее.
Если ты когда нибудь трудоустроишься, твой код попадет на ревью, и тебе дадут ремарку, где тебя просят задокументировать чето - никогда в ответ на ремарку не пиши такое вот полотнище как ты щас расписал. Просто отвечаешь "да, конечно", идешь документировать, и когда закончил - отвечаешь "готово".
>>2850569 Я не иду трудоустраиваться. И как уже говорил нет фантазии, чтобы прям сейчас документировать... Для меня это правда сложно. >>2850568 Но она же не для публичного пользования... Тебе необходим client id и key, а кто тебе его интересно даст?
>>2850580 >Для меня это правда сложно. Ну а прикинь как сложно тем кто пытается твой код читать и угадать, что у тебя в голове и какую задачу ты этим кодом хочешь решить.
>>2850580 >Я не иду трудоустраиваться. а чего ради тогда делаешь это все?
я лично в нерабочее время если и пишу в опенсорс то только под настроение, которое у меня редко выдается. да и коммичу я в лютое нишевое говно о котором тут даже и не слышали скорее всего
>>2850591 Имею ввиду не сейчас. Меня здесь никто не возьмет на работу. И никто здесь не является моим начальством. >>2850588 Это странно. Ты говоришь не документировать уровень сервиса, но теперь сам спускаешься на этот уровень. >>2850589 Блин, ну глянул я апи вк. У меня нет бля столько времени и ресурсов такое написать. Максимум, можно сваггер впихнуть, показать мол вот то принимается, это возвращается. Кратенько некоторые методы описать... Но не хочеца мне тратить кучу времени на то, что никто даже глядеть не будет...
>>2850619 >Никто тебя тут не заставит Надо сделать, а то глупость какая-то, критика есть, а фидбека нет. Правда доки от меня паршивого качества будут, но как могу впрочем.
>>2850625 Чел, тока не делай это из под палки как одолжение. Если ты хочешь чтобы твой проект посмотрели и дали конструктив, качественные доки - это маст-хэв, а не опционал.
Если ты просто зашел поделиться радостью и не ждешь обратного ревью - то не надо доков-из-под-палки, мы значит неправильно тя поняли.
Ты мож и не устраиваешься, но по сути 90% вкатунов вкатиться сейчас не могут не из-за того что по опыту или стажу не выкупают (это все эмулируется при желании), а в первую очередь из-за того что неспособны твердо и чотко выражать мысли, как словами так и текстом. К софт скиллам требования сегодня выше, чем к хардовым.
>>2850655 Без понятия насчет генерации в хибере. Айдишники и так генерирует. А зачем генерировать что-то кроме айдишников на уровне хибера? Почему просто в сервисах не генерировать поля? Или наоборот функциями в базе.
>>2850674 >А зачем генерировать что-то кроме айдишников на уровне хибера? Ну тип пост запрос. В вк вот есть же idXXX >Почему просто в сервисах не генерировать поля? Каким образом интересно? Мне нужно гарантировать, что этого поля нет в бд, а также дать возможность пользователю самому вписать значение. По моему пять табличек чисто для sequenced и генератор самописный небольшая издержка.
>>2850694 >Мне нужно гарантировать, что этого поля нет в бд, а также дать возможность пользователю самому вписать значение. Я такое постгревыми дефолтами генерирую.
Какая же джава продвинутая. Лучший язык программирования. Вот бы еще джаваскрипт заменить джавой в браузере, вообще супер было бы. Один язык для всего.
>>2850724 Что значит ограничен? У тебя вот миграции ликвидбейза есть. В них просто добавляешь дефолты и все. Триггер, как тригер. Как ты этот эксепшон потом обрабатывать будешь в коде?
>>2850734 >Что значит ограничен? Выталкивание контекста будет через одно место идти. Мне эти имена нужны до создания энтити. >Как ты этот эксепшон потом обрабатывать будешь в коде? Он никогда не случится. А так транзакция слетит и слава бгу. Пользователю 500 отобразится, мол что-то пошло не так. Надо оборачивать как-то?
>>2850724 AFTER DELETE FOR EACH ROW у тебя new.case_id будет NULL и как следствие WHERE всегда будет FALSE и как следствие выборка всегда будет пустая и как следствие значение 0 in () всегда будет FALSE и как следствие он при удалении не будет проверять у тебя даже нихуя Мимокрок
>>2850786 Алсо если ты агрегируешь уже по одному ключу case_id определённому то делать IF 0 IN (CASE) это лишние действия совершенно потому что если в IN что-то будет то это будет одно значение и можно его на 100 сравнивать просто. Проще будет
>>2850786 Если попонятнее, то напиши там не IF 0 IN (...) THEN, а IF 100 = (SELECT SUM(percentage_wining) FROM case_slots WHERE case_id = new.case_id) THEN. Реально переусложнил
>>2850796 Это все я... Но до 1000 далеко, конечно. >>2850790 >>2850794 Я равно как и null не знал как бы сравнить то, что возвращает select со значением. Вот in ебнул. Круто если можно сделать как последнее, пасиб.
>>2850797 И тебе не надо индусить два триггера. Зная, что AFTER DELETE у тебя NEW.case_id IS NULL и зная, что AFTER INSERT у тебя OLD.case_id IS NULL ты можешь в WHERE брать тот, какой есть, и проверять: IF 100 = (SELECT SUM(percentage_wining) FROM case_slots WHERE case_id = COALESCE(NEW.case_id, OLD.case_id) THEN Всё пока
>>2850809 А ещё не percentage_wining лучше назвать а winning_percentage или ещё лучше winrate. Ещё я скобку проебал тут >>2850809 перед THEN одну правую. Всё прости если трахнул
>>2850814 Ещё я не знаю какая там ситуация но ты видимо в бизнеслогике считаешь проценты которые в записи запихиваешь. Вместо того чтобы в тригере чекать проценты проще было бы в самом триггере проценты пересчитывать. Проценты это математическая хуйня и вряд ли они будут считаться как-то там по-другому ближайшие много лет
>>2850809 Этот запрос не покрывает правда кейс когда ты меняешь значение FK на другое, он в старые не будет смотреть. Но дальше сам я и так на РАБоте заебался
>>2850819 Да вроде нормально все. >>2850814 >winrate Реально... >>2850809 Ясно, там еще OLD есть. Ну тогда круто, что не надо индусить. >>2850817 Не, эти проценты вводит пользователь апишки. Я же просто проверяю, что он не запихал 146% в сумме. >>2850839 Какой ты заботливый... Спасибо большое.
>>2850844 Если это валидация хуйни которую юзер вводит всю единократно и ты её за раз получаешь всю то ты вообще должен это где-то на уровне DTO валидировать а не на уровне базы
>>2850850 Я вообще жс не знаю. Для меня просто нет существенной разницы мужду пиком, и что было ранее. Вроде в компаниях есть четкие регламенты по этому поводу, с ними проще.
>>2850779 Тригер твой это бизнес-логика. А ошибки бизнес-логики это явно не 500. А если в SQLException база отъебнула или пул конекшонов потек - то это вполне себе пятисотка. Хз как это в хибере решается, я с ним почти не работал, но в жуке мы прокидываем и сообщения констрейнтов и тригеров.
>>2850941 Не это не хибер. Просто вот среди потока сообщений ошибок искать, что же там триггер выкинул... Ну и воообще, воон пишут, что просто сделайте общую ошибку и хуй с ним.
Так-то не просто так конструкторы не наследуются. Просто у квадрата сделать всего один конструктор с width и всё. Деды из оракла всё это продумали ещё 30 лет назад.
>>2850959 Ну оба аргумента какие-то ниочемные. Мы ведь все равно используем тригеры или констрейнты. Если мы их используем, значит нормальная валидация на уровне приложения уже по каким-то причинам не подходит. Почему мы не должны информировать пользователя апишки что у нас случилось? Про единицу работы это вообще какая то хуита. Для этого есть всякие 422 ошибки и куча других способов. Короче очередная попытка все подтянуть под то, как удобнее хиберу, а не разработчику или пользователю. Что это за книжка? java persistence api и hibernate?
>>2850977 >Если мы их используем, значит нормальная валидация на уровне приложения уже по каким-то причинам не подходит. Ну вообще не значит. Это просто гарантия, что данные вот точно консистентные будут. >Почему мы не должны информировать пользователя апишки что у нас случилось? Хз, мы же информируем. Мол у нас валидация пошла по пизде, пж сообщите.
>>2850989 Что за просто гарантия? Допустим у меня в бд куча ограничений. Как я на них провалидирую? Только предварительным селектом в той же транзакции. А если я в одной транзакции несколько таблиц изменяю? Мне все их тащить предварительно каждый раз? И почему я не должен просто полагаться на констрейнт и срабатывании отдавать его сообщение?
>>2850997 >Как я на них провалидирую? Аннотациями. Единственное, что тебе надо ручками чекать - это unique. Остальное перед выталкиванием контекста проверится. Ну и когда юзер данные в контроллер передаст. >И почему я не должен просто полагаться на констрейнт и срабатывании отдавать его сообщение? Бд плохо стать может, хз. Нашел конечно у кого спрашивать.
>>2851054 Нинужна хуёвый аргумент только тогда, когда это на самом деле нужно. Ты бы ещё начал ныть, что в джаве нельзя быстро и безболезненно каждый 0 в куче превратить в 1, а каждый 1 в 0.
>>2851055 >Нинужна хуёвый аргумент только тогда, когда это на самом деле нужно. Ну т.е. писать 8 блять ифов нормальная схема? Вообще заебись. Обжект вместо массива вообще часто принимают методы ждк. Вот ты уверен, что они не применяют эти методы? >Ты бы ещё начал ныть, что в джаве нельзя быстро и безболезненно каждый 0 в куче превратить в 1, а каждый 1 в 0. Че... >>2851056 В плане? Поправили что ли?
>>2851057 >Ну т.е. писать 8 блять ифов нормальная схема? Вообще заебись. Ебанидзе, никто это не пишет, это автор этой наркоманской иссуи предложил сделать вместо нативного метода.
>>2851057 Уебан блядь. Ты этот ишью искал сортировкой по дате создания? Так вот уебище, он потому и валяется с нулем реакции на него, что содержит тупорылый бессмысленный высер. Как и твои посты в треде. Сьеби нахуй.
>>2849737 $"\{x} plus \{y} equals \{x + y}" $(RAW)"\{x} plus \{y} equals \{x + y}" $(SQL)"\{x} plus \{y} equals \{x + y}" или нахуй r"\{x} plus \{y} equals \{x + y}" sql"\{x} plus \{y} equals \{x + y}" все лучше чем сейчас
Всем ку, подсобите плиз. Есть несколько тредов, которые в одной транзакции делают сохранение или обновление данных в нескольких таблицах. Столкнулся с проблемой, что два потока могут сделать селект на строку до того, как один из них вставит ее в бд и из-это этого происходит дублирование в таблице (а в моем случае вообще ошибка с уникальными констрейнтами). Как правильнее всего будет решить эту проблему? Вешать сериалайзбл не хочется, сильно деградирует производительность, нашел еще способ с insert on conflict do nothing, если ничего не найду буду с помощью этого способа делать, но может есть еще идеи?
Наследование выражает сабтайпинг в ООП. Поэтому с 99% вероятности (в зависимости от публичного контракта и смысла прямоугольника и квадрата) неправильно ни наследовать квадрат от прямоугольника, ни прямоугольник от квадрата, и правильней наследовать обоих от некоего абстрактного типа "фигура".
>>2851199 Спасибо, полезный доклад, натыкался на него, но все откладывал просмотр. Но мне кажется не совсем моя проблема рассматривается, у меня же косяк при вставках происходит, а локи блокируют/версионируют строки, которой еще как бы нет на момент селекта в параллельных транзакциях… Пришла в голову идея навешать ретраи на метод, где вызываются сохрание и обновление, вроде должно помочь
>>2851173 О, а я хуйнул подобное. И это происходит если предмета не существует. put if absent. Если потом запросить данные и сделать апдейт один из тредов будет на локе.
>>2851527 Да. Хотя вряд ли это поможет. Врочем если два одновременно запишут один из них по unique упадет. Надо или локу брать каким-то образом перед записью или еще как. Например как liquebase, у нее там есть bool столбец lock.
>>2851375 Не надо ничего наследовать, это для пидоров Делаем класс Figure, в нём свойство planeArity=n (2D, 3D, etc.) и свойство points -- массив n-мерных массивов, и по необходимости делаем методы isSquare() isTriangle() и с ними работаем уже. Если что-то медленно то денормализуем добавляя свойство (напр. figureType в нашем случае)
>if(width != length) throw new IllegalArgumentException(...);
Вот эта хуйня - это прецедент, при котором программа, работающая с прямоугольниками, не работает для всего множества квадратов-наследников от прямоугольника. Наличие такого прецедента - прямое доказательство того факта, что тип-квадрат - не подтип прямоугольника. Фактически эта залупа - расписка в том, что LSP для такого квадрата-наследника-прямоугольника сознательно пущена по пизде.
Впрочем, пример притянут за уши еще этим аноном >>2850958. Потому что конструкторы не наследуются, и в квадрате можно просто объявить единственный конструктор Square(a) {super(a, a)}. Тем не менее если бы прямоугольник был DTOшкой с сеттерами длины и ширины, квадрат от нее наследовать было бы таким же нарушением, так как возникла бы похожая дилемма: что делать с программой вида...
>>2852039 Язык программирования сложно сравнивать с языком запросов. Но мне недавно пришлось знатно поебаться с PL/SQL, и он мне почему-то зашёл, несмотря на ещё более громоздкие конструкции, чем в жабе.
Когда актуальные обзоры на лум? Я посмотрел тред варс годовалой давности и на том этапе лум говорит не выносить код который сильно нагружает цпу в виртуальные потоки. Пофиксили они эту хуйню или нет?
>>2852153 >Я посмотрел тред варс годовалой давности и на том этапе лум говорит не выносить код который сильно нагружает цпу в виртуальные потоки. Пофиксили они эту хуйню или нет? Виртуальные треды не могут дать тебе больше CPU. Нужно делать CPU intencive вычисления, юзай обычный ForkJoinPool.
>>2852173 Да делать мне больше нехуй епты,я сейчас самую тяжелую логику помечаю @Async и заебись. Нахуя мне многопоточность если я не могу исполнять тяжелую логику многопоточно? Олсо,ты выражаешь свое мнение или создателей лума на сегодняшний день?
>>2852176 >Нахуя мне многопоточность если я не могу исполнять тяжелую логику многопоточно Ты долбоеб? Сам не паралелишь и жалуется, что поток занят. Там джин что ли должен за тебя паралелить?
>>2852241 Не ебу где ты это начитался, но такой цели в джепах нет. Пока не покажешь - ты пиздло. А разработчик как и раньше сам должен заботиться о прерываниях и законе амдала.
>>2852153 Смотрел в книгу, увидел фигу блять. Если смотрел доклад, должен был понять, почему виртуальные треды по определению никогда и ни при каких условиях не дадут производительность выше обычных. Зеленые потоки никогда и не проектировались для CPU-intensive кода, равно как никакойц прирост в производительности на CPU-intensive коде никогда не дадут реактивные стримы и прочая асинхронщина.
>>2852176 >Нахуя мне многопоточность если я не могу исполнять тяжелую логику многопоточно? >>2852241 >Да блядь,смысл лума именно в том чтобы я писал обычный код а джин из проекта лум превращал его в многопоточный
Апеллировать к евклидовой геометрии в данном случае - ошибка. Приложения бывают разные, и могут спокойно оперировать такими предметными областями, где квадрат либо вообще не будет подтипом прямоугольника (пример выше с DTOшками), либо такое отношение будет неэффективно и бессмысленно (например, вычисляя площади разных фигур, нахрена городить наследника "квадрат" от прямоугольника с двумя числовыми аттрибутами "длина"-"ширина", если можно сымплементировать "квадрат implements фигура" с одним полем "сторона", который будет лучше наследника от прямоугольника во всем - меньше каплинга, меньше полей в обьекте, ниже дерево наследования, итд.).
>>2852408 Ты чет нервный какой то. Говоришь так, как будто я твой кабан, который на тебя давит из-за поджымающихся сроков. Расслабься. Все что я хотел тебе сказать - это то, что ты не первый столкнулся с CORSом в сваггере, и это решаемо. Вот и все. Будешь ты делать или не будешь - дело твое.
Мужики, че-то я не догоняю кое-что. С 2020 не прикасался толком к Спрингу, щас решил освежить знания, забубенил простенький круд. А он хуй чего.
Запускаю приложуху, все dispatcherServlet регистрируются и видят свои контроллеры, что видно по логированию в конструкторах этих контроллеров. Но при этом на любой запрос мне кидает следующее: >org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping for GET /test/aaaaa/
В браузере 404. Я думал, может @EnableWebMvc не отрабатывает, скопипастил весь класс WebMvcConfigurationSupport и заинжектил его в корневой контекст. Всё равно ничё не работает, одни 404 повсюду. Подскажите, куда можно поглядеть? Че-то всю голову сломал уже.
>>2852519 А зачем несколько диспатч серверлетов, если у мвц он один? Пока я вижу это как ты к какому-то левому серврлету маппинги добавляешь и все. Да и зачем вообще руками их добавлять...
Идея умеет генерировать геттеры и сеттеры исходя из полей класса. Можно ли как то добавлять свои темплейты для генерации подобного кода (не Live Templates)? Проблема: лобок какает в штаны когда имеем дело с подклассом и нужна аннотация @With, так как он ожидает конструктор со всеми полями подкласса, но естественно ничего не знает о суперклассе. Было бы неплохо таким же образом генерить витеры.
>>2852704 Я думал об этом. Я предпочитаю юзать статические конструкторы вместо билдеров. То что лобок так себя ведёт конечно не конец света, но чуть чуть подгорело.
>>2852618 Спасибо, выглядит действительно несложно.
Но мне бы щас с основной проблемой разобраться - почему он у меня не видит маппингов. Или может есть какие-то способы дебага спринговского мвц-конвейера, о которых я не знаю. Чтобы я сам допёр.
Господа джависты, поясните причину тряски. Бамплимит на доске 500 постов, перекат был 504, дубля у треда переката нет, почему гул стоит такой? Чем не нравятся перекаты до тысячи? Тред-то тонет.
>>2852508 В общем доделаль. Теперь вики небольшая есть, опенапишка рабочая. Еще разделил ридми. https://github.com/anywaythanks/Twister Правда вот пришлось вот эту не няшную штуку добавить. Ну вот теперь точно, наверное, пока все...
Вангую что популярным на собесах вопросом первое время будет такой: "нахрена виртуальным тредам экзекутор, если их и так можно создавать миллионами без видимого ущерба быстродействию и потреблению ресурсов".
>>2854852 А нахера везде спрашивают про реактивщину/асинхронщину, когда в 95% проектах нагрузка - в полторы престарелые тетки на сервис в день, и обычные SpringMVC- или JaxRS-ресты на сервлетах?
>>2853430 Убрал @EnableWebMvc и свой псевдокласс WebMvcConfigurationSupport, скопипащенный из сорсов спринга. В результате всё завелось и ответы пошли.
Как это объяснить? Я же по сути не заинжектил какую-то важную рассыпуху, всякие там конвертеры, мапперы и т.д?
>>2856071 Бля, я даже не знаю бут у тебя или просто спринг, какие конфиги еще существуют... Не научився читать мысли или моском ртпшить к пк, к сожалению.
>>2856100 Ммм, я вот чет подобное делал, тут и вебмвц и конфег. А еще целых два контекста. Если ты все как в доках делал, то отсюда подтянул контроллеры.
Мне вот челик-ментор сказал, что на мидла джависта гоняют по 4 дисциплинам: - спринг - хибер - докер - кафка Ну и жабакор и sql у же само собой. Вы что думаете? Как стать залететь мидлом в большую команду на не самом легаси стеке. Из всего перечисленного мне больше всего западло дрочить хибер. Потому что я на жуке уже полтора года пишу.
>>2856563 Не попытался, потому что дрочу кафку, кролика и докер. Еще книжку по микросервисам читаю. А хибер только до вката дрочил. Помню меня попустили на этих методах энтитименеджера и на жизненном цикле энтити. Прям на зубок нужно было помнить как, откуда и куда что переходит. Как вспомню эти всратые схемы, так вздрогну.
>>2856575 Чел, нужно знать наизусть все кишки спринга, сприг-бута, спринг-мвц, спринг-секурити и спринг-тестов. У каждого из них свой контекст. А еще хибер тоже на зубок, у него тоже свой контекст.
>>2856588 Да только начал курсец. На работе докер проблем не вызывал. Нагуглил нужный композ, подставил свои значения и все. Ну еще подрубился к тачке, залез внутрь контейнера и лог файл оттуда почитал. Тут из нового для меня именно конфиги - хосты, порты, мосты. Как шарить всякое говно между друг другом в компосе. Иногда нужно, но лень было. Чисто копипастил. Еще вот плагины всякие для мавена/градла. Мне там подрочить немного надо по объему. Кишки и всякие сетевые штуки, типа настройки регистри это пусть действительно только девопсы делают.
Так что нужно, чтобы в крупную компанию взяли спринг-конфигуратором, лепилой крудов? На микрочелики на последнем спринге желательно, а не на вебсферу под 5 джавой.
Если я создаю объект var poopoonyaFactory = new PoopoonyaFactory(); Потом сохраняю куда-то Supplier<Poopoonya> p = poopoonyaFactory::create; Может быть такое что poopoonyaFactory был собран гц и сапплаер сломался? Если нет, то чем это гарантируется? Метод референс захватывает ссылку на объект?
>>2856652 Потому что: 1. с докером я кое как работал все это время. С кафкой и кроликом у меня таски кабана есть связанные. 2. нужный мне объем хибера в разы больше, чем нужный мне объем докера. 3. просто не хочется лезть в хибер. Особенно в чистый без спрингдатовских примочек. Там хоть query-dsl есть. Но учить нужно скорее критерию и hql. И сиди запоминай что и как из этого аффектит состояние энтити и кеша хибера.
>>2856674 Да мне похуй чел, просто ты столько ноешь уже здесь, а теперь вот назвав причину начал оправдываться. Просто прекращай ныть. >>2856673 Он поместит константу в метод же саплаера. Каким образом ты заставишь Гц его собрать? Ансейфом?
>>2857654 Чел, тред - он как вино. Перекаченный тред надо выдержать пароу недель, чтобы из него шарпеи выветрились. Ты вот гришь - "шарпобляди не хотят" - кому не похуй че они хотят? Они - чмо, хотят одно а делают другое. Хотят они или нет, тред анон все равно перекатят - это данность. А вот то, что первое время в новом треду делать особо нечего - это факт.
>>2857688 Первый раз идею открыл? Тебе же предложили upgrade language level. Открываешь project settings и там меняешь jdk на твою новую джаву, и уровень языка ставишь 21.
>>2857697 Хотел помочь долбоёбу, а он ко мне жопой, а лицом к шарпобляди, в одиночку загнавшей весь джаватред под шконку, запретив появляться на нулевой.
>>2857685 Чел - какой развод, о чем ты? Ты какую то ебанутую теорию заговора на ровном месте построил, ведешь себя так, будто тебя шарпей выебал втемную и ты теперь ищешь - "а кто же мне очко по пьяни разворотил?".
Все давно уже, ведомые двачевым UI/UX , идут в тред через закреп в /pr и в ус не дуют, и твой перекат там - первый в списке, они твои призывы не увидят даже. Не выдумывай смешных теорий.
Ну-с, поздравляю вас, мои дорогие джависты, с получением ещё одного напоминания о том, на какой борде сидим. Мочух удаляет перекаты по причине ШИТПОСТИНГ. Джаве теперь запрещено быть на нулевой, там место для петухона и петушарпа.
>>2857846 > место для петухона и петушарпа Ты сам ответил на свой высер, так было всегда, пока ты не объявился. Уважающие себя джейвисты брезгуют находиться рядом с подобными помойками и не пытаются быть на их уровне, потому что это даунгрейд.
>>2857852 Как минимум джава должна иметь на это право. Как максимум сейчас тред 21 джавы на порядок адекватнее этого, который намеренно засирали шарпобляди-копротивленцы за сгноение джаватреда.
>>2857864 >ниеееет три весёлых поста разбавляющие скучную атмосферу это то жи самое што постинг выдуманных вопросов про уровень языка от человека, до этого написавшего десяток проектов, обсуждение переката и десятки мвпарашных постов