Это копия, сохраненная 30 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Вики по вкатыванию в джаву: https://github.com/java2ch/java-thread/wiki
Пять вопросов из предыдущего треда:
1. Самая базовая и мастхев библиотека/фреймворк джавы, без которой джава вообще не джава (за исключением стандартной библиотеки)?
2. Сап джавовый! Я тот неугомонный который копается в JVM. Хочу сделать следующее, написать приложуху на джабе, прикрутить мониторинг и начать насиловать JVM. Когда найду потолок, начать опциями комбинировать чтобы повысить производительность. Подскажите как это сделать с технической точки зрения. Вижу следующий вариант:
На спринг буте делаю рест хуйню с одним эндпоинтом, когда буду дергать его, спринг будет в цикле создавать n количество объектов (в классе которого ещё будут статические поля).
Норм тема или херню придумал?
3. >https://github.com/neo4j/neo4j/blob/c082e80b792d46ad1b342fbf7f1facb2028344c6/community/kernel/src/main/java/org/neo4j/kernel/info/JvmChecker.java#L33
>Ахахах, реально. Пометил себе neo4j как неюзабельное говно.
Оооо, а вот на хуя они так делают то?
4. Чё нового в мавене 4.0.0?
5. Если без приколов, 8к строк на джаве - это какой проект, маленький, средний или большой?
Предыдущий: >>2574557 (OP)
шарполахта, сьеби
Бампну, может кто дельный совет даст.
Надо хранить в разных модулях. А лучше в разных проектах.
Извини пожалуйста
Что значит "там"?
Вызванный через рефлексию метод вызовется так же, как и вызванный напрямую. В том же треду, на том же стеке вызовов. Единственное отличие - для java.lang.Method можно задать обьект-инстанс, на котором этот метод будет вызван. Ну и с точки зрения производительности может быть просадка, ибо рефлексия дороже обычного вызова (особенно если работать с рефлексией по тупому).
Как там в вашем тестконтейнере почистить все данные в БД после каждого теста? Перезапускать контейнер или дрочить репозитории руками не предлагать.
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
https://dev.to/henrykeys/don-t-use-transactional-in-tests-40eb
>>586334
>@Sql
Это еще что такое? Ну и это снова руками придется скрипт каждый раз править
С ликвибейз и флайвей можно дропать все и перенакатывать схему
Да, каждый раз когда добавляешь или удаляешь таблицу меняешь клин-скрипт.
Способ не очень подходит, если ты через свою приложуху динамически меняешь схему.
Поищи по гитхабу, как используется Sql.ExecutionPhase.AFTER_TEST_METHOD для очистки базы.
Это если ты не накатываешь схему на каждый тестовый метод. Миграции по умолчанию накатываются на каждый тестовый класс, потому что каждый раз переподнимается контекст.
>Самая базовая и мастхев библиотека/фреймворк джавы, без которой джава вообще не джава (за исключением стандартной библиотеки)?
Конечно же ЖИДБРЕЙНС АННОТАЦИИ. Ебало тех, кто пишет @NonNull и Validate.nonNull(obj) представили?
Вопрос по существу - как открыть файловое дерево (то, что слева всегда) в идее 2017?
>Вопрос по существу - как открыть файловое дерево (то, что слева всегда) в идее 2017?
Где то в менюшке window должно быть, по логике, не?
В том то и юмор, что нихуя.
Спасибо, нашёл!
Попробуй запустить на 8 джаве.
И заменить на Blazor.
Какая версия ваадина?
В ебаной магии спрингбута.
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
Но класс имеется. Смотрел через winrar.
Можно хотя бы как-то класс подгрузить из непосредственно файла .class, если JVM серет и не может?
Ебать, делать нехуй? Я завожу пакеты dto и entity
Использую аннотации спринга и в хуй не дую. Javax превратился в jakarta? Да и в рот оно ебись! У меня есть спринг, идея провалидирует все параметры.
На ютубе только гайды от индусов, в которых делается непонятная не нужна мне поебень, которая даже отдаленно не помогает сформировать хоть какой-либо псевдокод у себя в голове. Вся надежда на вас, анончики, прошу любой помощи
Бамп
Я один такой еблан, который не может понять принципиальную разницу между Factory Method и Abstract Factory?
Вот два примера:
https://refactoring.guru/design-patterns/abstract-factory/java/example#lang-features
https://refactoring.guru/design-patterns/factory-method/java/example#lang-features
И там, и там есть абстракция - у метода абстрактный класс, у абстрактной фабрики интерфей. И уже конкретный сабкласс создает конретные объекты. Какого хуя?
Получается, ключевое отличие в том, что в случае с Abstract Factory, клиент не знает, какую фабрику получает и какие объекты будут созданы?
Там еще говорится, что Abstract Factory может создавать семейства объектов. А че, разве я не могу создание нескольких объектов засунуть в фабрику, используя Factory Method?
Вот здесь, например, иначе объясняется:
https://www.javatpoint.com/factory-method-design-pattern
https://www.javatpoint.com/abstract-factory-pattern
Грубо говоря, с Factory Method мы имеем одну фабрику, которая на основе какой-то переданной переменной будет создавать нужный объект. А c Abstract Factory мы имеем фабрику фабрик.
Так как правльно-то?
Потому что вопросы задавать не умеешь, вот почему.
Ни предыстории, ни внятного эксепшена, нихуя не дал, и бампает сидит - ну умора. Тут не чат экстрасенсов. По той инфе что ты дал, однозначно сказать можно только одно - у тебя SLF4Jя в класспафе нет. Помогло тебе это? Нет? Ну и хуй с тобой.
Причем тут паттерны и структуры данных? У меня проблема с пососом JVM, а не высших абстракций.
Ты слишком критичен к себе, и слишком много придаешь значения паттернам. Паттерны это хуйня... Ну то есть как хуйня... На полшишечки хуйня. Ща обьясню.
Просто жили-были банда четырех, писали программульки на плюсах. Собрали пучок граблей, сьели пуд соли, но преуспели в этом деле. А потом смотрят такие - "йоу, а у нас вот такая вот конструкция повторяется в нескольких проектах, и в целом роляет". Взяли с пару десятков таких конструкций, назвали паттернами да и собрали их в книгу.
По сути паттерны это просто юз-кейсы, оторванные от базы, ни больше ни меньше. Без базы паттерны - каргокульт. Зубрить различия между ними имеет смысл только чтобы иметь возможность ответить какому нибудь тупорылому уебку на собесе, если он своим скудным мозгом додумается спросить об этом. На практике знание паттернов назубок не дает никакого преимущества, а иногда может навредить. Про фабрику достаточно знать лишь что она позволяет отвязать объект(ы) от процедуры его/их сборки. А уж как это делается - методом или классов - так ли уж важно?
Я портирую мод для копрокубов с 1.7.10 на 1.12.2. Это в целом большое приключение из-за говнистости форджа и градла, и мне пришлось уже разрешить (но в основном обойти) дохуя проблем.
Самой серьёзной проблемой на моём пути оказалось добавление библиотек в джарник. Видимо, это происходит из-за того, что фордж как-то анально залезает в процесс сборки градла и ломает там чё-то (скорее всего, эта поломка очень глубокая, плавающая, редкая и платформо-зависимая, потому что починить её у меня не удалось, даже скачав готовый проект мода на 1.12.2).
Я пытался использовать различные версии форджеградла, пользовался разными плагинами для шейдинга, перепробовал с десяток разных способов с стаковерфлоу и вики форджа, мне даже приходилось скачивать идею 2017 года. Всё бестолку. Самое большое, что мне удалось добиться от дегенерадла - добавить все библиотеки вместе с майнкрафтом в итоговый джарник.
В один момент я плюнул и решил добавить библиотеки напрямую в .jar. Я сделал проект на мавене с этими библиотеками, открыл итоговый джарник с библиотеками в винраре, мод без библиотек, и перекинул из библиотечного всё в модовый.
Запускаю я значит этот мод, и вижу следующую проблему - мод успешно вызывает HikariCP, который был добавлен путём копипасты, а тот пытается получить доступ к LoggerFactory из SLF4J, который тоже был закопипасчен, и это уже не получается. Вылетает java.lang.ClassNotFoundException: org.slf4j.LoggerFactory. Я предположил, что дело в том, что по какой-то причине закопипасченные классы не могут получить доступ к закопипасченным, но написанный в основном коде мода Class.class.getClassLoader().loadClass("org.slf4j.LoggerFactory"); тоже выдаёт NullPointerException.
Вот полный эксепшен со стактрейсом: https://pastebin.com/9dmATw8r
Аноны, прошу, не будьте такими же пидарасами, как стековерфловщики, которые минусуют и удаляют все вопросы сложнее "что такое Class".
>Видимо, это происходит из-за того, что фордж как-то анально залезает в процесс сборки градла и ломает там чё-то
Наврядли.
>В один момент я плюнул и решил добавить библиотеки напрямую в .jar
Как конкретно добавлял?
1. Открываю джарник с библиотеками, собранными через мавен, и мод, собранный градлом в винраре
2. Выделяю пакеты с библиотеками (в моём случае org и com)
3. Перетягиваю их в окно мода и нажимаю "ОК" в открывшемся окне
4. Запускаю получившегося франкенштейна сервером форджа
Ок, с форжем я почти не знаком, ибо в майнкампф не шпилю. Скорее всего ты впоролся в класслодеры, и SLF4J у тебя грузится не-пойми чем.
На твоем месте я б забил на затею с винраром и все таки разобрался бы с добавлением зависимостей в мод. Я чекнул мельком mdk-проект с форжа - выглядит так, будто все должно решаться обыкновенным добавлением зависимостей в dependencies.
Ну а так ты еще 500 часов убьешь на то, чтобы понять, как форж класслодерами ворочает. И все равно нихуя работать не будет.
Да, спасибо. Ты все верно написал, я со всем согласен.
Хочу именно в самом стандартном классическом их виде разобрать паттерны, чтобы дать четкий ожидаемый ответ на собесе.
Чел, ты щас на третьей стадии принятия - торг. Давай сразу к принятию.
Отвечая на вопрос: гугли джава класслодинг. Стандартный сет класслодеров подразумевает цепочку "бутстрап класслодер" -> "класслодер расширений" -> "системный класслодер". Последний ищет и грузит классы из класспафа (надеюсь - что такое класспаф не надо обьяснять?) когда ты делаешь класслодер.loadClass().
Но это все стандартная схема. Что у тебя там нахуеверчено - одному богу известно. К примеру, вот этот вот кусок стектрейса:
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101) ~[launchwrapper-1.12.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_352]
По нему видно что произошла делегация к какому то хуй пойми какому класслодеру net.minecraft.launchwrapper.LaunchClassLoader, который хуй пойми как работает и хуй пойми откуда классы берет. Ты серьезно щас хочешь лезть в кишку? Просто поверь - разобраться с твоими терками к градлу скорее всего будет проще.
Паттерны - антипаттерн, так как подразумевают в себе нарушение принципа DRY.
Бамп вопросу
ниче я не проебал. надо было просто обновить мавен проджект
Объясните по простому что такое forkjoinpool и как его использовать
блядь как же мне хуево чисто физически
я не привык, когда происходят в коде вещи, о которых я ничего не знаю
эта залупа сама что-то делает, я даже не понимаю что ей для этого надо
тонны блядь каких-то методов хуй пойми для чего
обертка над оберткой над оберткой над апи фреймвокра
Обычные пулы исполняют монолитные раннаблы и коллаблы. А форкджойн пул, помимо раннаблов и коллаблов, умеет выполнять forkjointaskи. А форкджойн таски имеют уникальную особенность - их можно не только выполнить (compute), но и побить на подтаски (createSubtasks), этой особенностью форкджойн пул активно и пользуется. Там есть еще всякие внутренние нюансы работы этого пула типа job-спиздинга, но ты просил по вершкам. За деталями иди к Шипилеву в блог.
Напрямую его обычно редко используют. Он сидит под капотом у комплитабл фьюч.
Исходники диспетчер сервлета и реквестмаппингхэндлера лежат в открытом доступе, бери читай.
да я не про это даже
почему я нигде не создаю объекты, но это говно знает какой и где объект создать?
а если она однажды не тот объект мне создаст?
как использовать разные конструкторы?
я не понимаю как это все там внутри работает
а смотреть исходники проекта этого я ебал того в рот
кто в здравом уме туда полезет? чтобы скакать от одной зависимости к другой часами?
ты сам можешь вообще имагинировать такое?
а вот если ты EntityModel<Employee> возвращаешь, то это REST
ахуенное блядь объяснение, я теперь пытаюсь про это жижу нагуглить что-то получше, но нигде не упоминают подобное - про все эти линки блядь какие-то
ахуенно, хочешь разобраться в чем-то - тебя только запутывают больше и говна за шиворот накидывают
я всегда блядь раньше считал, что REST это обычный подход к менеджеру какими-то ресурсами, которые могут быть запакованы в условный жсон
но теперь я блядь не уверен и не могу больше ничего подобного нагуглить, что в той статье сказано
(а как же не гуглить? ведь это сами разрабы спринга меня запутали. они то дядьки умные. это я хуй с горы не понял их гениальную идею просто)
спасибо дядя спрыня покодил блядь
лучше в питон буду вкатываться снова
>а если джава однажды неправильно мне память аллоцирует и память мне не так освободит?
>кто в здравом уме в код jvm полезет?
Нахуя тебе петухон? Вкатывайся в шарп.
Ок, спасибо за объяснение
Про spring data rest почитай, уже давно все решено и сделано за тебя, попроще к этому относись и не заморачивайся надо всем. я хз как ты вообще в проге двигаешься без умения делать что-то не понимая (по крайней мере первое время)
Блин(
Доделываешь, а говнохибернейт понадобился только сейчас, значит, его не было.
На собеседованиях спрашивают ?
Да бля, в чём вопрос вообще, этому за пару часов можно научиться по первой попавшейся мурзилке.
Спрашивают. Полезно знать, что такое persistence unit и context, как оное связано в entity manager'ом и сущностями, какие состояния бывают у сущностей (transient, persisted, detached, removed) и что они означают в контексте разговора о persistence context'е.
Если на этом этапе ты понял что в гробу видел все это знать - поздравляю. Ты теперь стал чуть ближе к ORM-скептикам.
Че хоть за ошибка то?
Плюсую.
Я тоже сперва радовался. А потом заставили писать километровые выборки с 5+ джойнами, динамическими фильтрами и рекурсивными cte.
Лол, ты буквально повторяешь то, что уже было сделано. Надо не повторять, а писать код, который заменит паттерн.
.id("loan_qualifier")
.name("Loan qualifier")
.hitPolicy(HitPolicy.COLLECT)
.expressionType(ExpressionType.FEEL)
.withInput(in -> in
.name("age")
.type(ValueType.INTEGER)
.build())
.withInput(in -> in
.name("activeLoansNumber")
.description("Number of active loans on user's account")
.type(ValueType.INTEGER)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.build())
.build())
.withInput(in -> in
.name("startDate")
.type(ValueType.DATE)
.build())
.withOutput(out -> out
.name("loanAmount")
.description("Loan amount in Euro")
.type(ValueType.DOUBLE)
.build())
.withOutput(out -> out
.name("loanTerm")
.description("Loan term in months")
.type(ValueType.INTEGER)
.build())
.withRule(rule -> rule
.description("Loan for 18 years")
.withInputEntry(in -> in
.name("age")
.evaluationMode(EvaluationMode.INPUT_COMPARISON)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(18)
.build())
.build())
.withInputEntry(in -> in
.name("activeLoansNumber")
.evaluationMode(EvaluationMode.INPUT_COMPARISON)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(0)
.build())
.build())
.withInputEntry(in -> in
.name("startDate")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value("[date and time("2019-01-01T12:00:00")..date and time("2019-12-31T12:00:00")]")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(10000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(12)
.build())
.build())
.build())
.withRule(rule -> rule
.withInputEntry(in -> in
.name("age")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value(18)
.build())
.build())
.withInputEntry(in -> in
.name("startDate")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value("[date and time("2019-03-01T12:00:00")..date and time("2019-03-31T12:00:00")]")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(15000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(6)
.build())
.build())
.build())
.withRule(rule -> rule
.withInputEntry(in -> in
.name("age")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value(">18")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(20000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(12)
.build())
.build())
.build())
.build();
.id("loan_qualifier")
.name("Loan qualifier")
.hitPolicy(HitPolicy.COLLECT)
.expressionType(ExpressionType.FEEL)
.withInput(in -> in
.name("age")
.type(ValueType.INTEGER)
.build())
.withInput(in -> in
.name("activeLoansNumber")
.description("Number of active loans on user's account")
.type(ValueType.INTEGER)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.build())
.build())
.withInput(in -> in
.name("startDate")
.type(ValueType.DATE)
.build())
.withOutput(out -> out
.name("loanAmount")
.description("Loan amount in Euro")
.type(ValueType.DOUBLE)
.build())
.withOutput(out -> out
.name("loanTerm")
.description("Loan term in months")
.type(ValueType.INTEGER)
.build())
.withRule(rule -> rule
.description("Loan for 18 years")
.withInputEntry(in -> in
.name("age")
.evaluationMode(EvaluationMode.INPUT_COMPARISON)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(18)
.build())
.build())
.withInputEntry(in -> in
.name("activeLoansNumber")
.evaluationMode(EvaluationMode.INPUT_COMPARISON)
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(0)
.build())
.build())
.withInputEntry(in -> in
.name("startDate")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value("[date and time("2019-01-01T12:00:00")..date and time("2019-12-31T12:00:00")]")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(10000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(12)
.build())
.build())
.build())
.withRule(rule -> rule
.withInputEntry(in -> in
.name("age")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value(18)
.build())
.build())
.withInputEntry(in -> in
.name("startDate")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value("[date and time("2019-03-01T12:00:00")..date and time("2019-03-31T12:00:00")]")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(15000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(6)
.build())
.build())
.build())
.withRule(rule -> rule
.withInputEntry(in -> in
.name("age")
.withExpression(ex -> ex
.type(ExpressionType.FEEL)
.value(">18")
.build())
.build())
.withOutputEntry(out -> out
.name("loanAmount")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(20000)
.build())
.build())
.withOutputEntry(out -> out
.name("loanTerm")
.withExpression(ex -> ex
.type(ExpressionType.LITERAL)
.value(12)
.build())
.build())
.build())
.build();
Кек.
Окей, два вопроса.
1. Но ведь dry - don't repeat Yourself. Паттерны жеж не твои, ты не себя повторяешь
2. А что делать если ты такой пишешь код, никого не трогаешь и БАЦ - случайно переизобрел один из паттернов? Переписывать?
>Кек
Хотелось перестать читать, но всё же обоссу порриджа.
>1. Но ведь dry - don't repeat Yourself. Паттерны жеж не твои, ты не себя повторяешь
Ты еблан? Доебался до хуйни. Очевидно речь идёт о в принципе отсутствии повторений. Да и к тому же если ты паттерны не один раз используешь, то ты принцип нарушаешь.
>2. А что делать если ты такой пишешь код, никого не трогаешь и БАЦ - случайно переизобрел один из паттернов?
Перефразировать ещё хуже чем повторять себя, потому что сложнее сделать абстракцию над этим. Это максимально хуёво, потому что ты в угоду визуальному ненарушению DRY ухудшаешь качество кода.
>Переписывать?
Как я уже говорил, сделать запрограммированную абстракцию, которая бы включала в себя этот паттерн, а не повторять код.
Причина анальной боли?
Твою мамку в помойку высрал.
Ты че порвался то? Высрал полотно так, будто я какой то защитник паттерного мышления, бля. Выше я уже пояснил что паттерны хуйня, поэтому я в душе не ебу, охоту на каких ведьм ты тут развёл.
Просто я первый раз слышу чтоб паттерны обсирали именно через драй. Попросил пояснить. И пока что твоя аргументация звучит так, что хочется сидеть и дальше тебя подьебывать тупыми вопросами на генерацию паст, лол.
ЯОБЯЗАТЕЛЬНОВКАЧУСЬ
Да вроде джаву учил со спрингом до этого, но если че без рофлов, я пока так и не устроился
а представь что надо было бы добиваться этого от хибера через знание его кишочков. Чтобы он не 100500 запросов лепил, а один с 5 джойнами
учить спрингу не на своем проекте не интересно
хочу попробовать сделать небольшой аналог кинопоиска
накидал структуру на пике
планирую с этим проектом потом идти на собес
база или кринж?
юзеры и мувисы это разные микросервисы? Как юзеры будут знать про мувисы? Что делать если мувис надо удалить? Что насчёт тракзакций? Что делать если умрут мувисы при живых юзерсах?
забыл про консистентность бд
"Паттерн представляет собой не какой-то конкретный код, а общую
концепцию или пример решения той или иной проблемы.
Паттерн — это высокоуровневое описание решения, реализация
которого может отличаться в двух разных программах."
В этом значении паттерн - абстракция.
есть 2 микросервиса REST API (RestController), каждый из которых управляет своей базой данных
1 база - фильмы
2 база - клиенты
есть 3 микросервис, который при обращении клиента (4 микросервис) к REST API клиентов, получает запрос регистрации/аутентификации клиента и отправляет ему ответ
если клиенты отвалятся - можно будет смотреть только какие фильмы есть
если отвалятся фильмы, то только регистрироваться/логиниться
юзеры про мувисы знать не будут (я чет даже и не задумывался об этом, не хотел чтобы юзер мог давать даже оценку фильмам, лол)
получается не особо аналог КП, да?
ну хз, а как можно связать две независимые БД между собой?
Я не тот же анон, если че
> Как юзеры будут знать про мувисы?
А зачем им знать про них? Допустим можно сложить мувисы против айди юзера в другой бд
> Что делать если мувис надо удалить?
А что мешает это сделать в микросервисе мувисов по айди юзера и айди мувиса
> Что насчёт тракзакций?
Разбивать на несколько в пределах одного микросервиса или есть что-то типо распределенных, на сколько я знаб
> Что делать если умрут мувисы при живых юзерсах?
Выдавать сообщение об ошибке при неудачном запросе
я думал кинопоиск это поиск подходящих фильмов для каждого юзера. Типа ластфм.
Это чо, теперь ещё нужен третий микросервис, хранить связи юзеров и мувисов?
И это надо ещё прикручивать кафку - чтобы мувисы и юзеры могли подписаться на события изменений
Единственная по настоящему работающая архитектура - иерархический монолит.
Нечего читать, это когда ядро зависит от каких-то либ, эти либы от чего то ещё, и так до фундаментальных ни от чего не зависящих.
Ну я скорее рассуждаю с позиции, работоспособно ли это, а оптимальность архитектуры, это уже следующий вопрос, тут я с тобой не могу не согласиться
>А зачем им знать про них? Допустим можно сложить мувисы против айди юзера в другой бд
ты имеешь ввиду создать 3 БД, которая была бы связана со всеми REST API? пик
Почитай книгу microservices in action, там все разжевано для полных ебанатов.
Я думаю, нет смысла продолжать с этой архитектурой изощряться, иначе говоря: хуйня, переделывай
Это класс помеченный аннотацией @Entity с обязательным полем айди, представляющий собой обьектное представление таблицы в твоей субд
Спасибо.
Скажите, на spring только сайты пишут ? Или можно лаунчер для майнкрафта написать ?
По итогу я сделал патч, который прямо в ядро инжектит либы и исправил эту хуйню.
Урааааа, собеееесы
На спринге не пишут "сайты". Вообще забудь это слово.
а че так можно было в 2014? а я в 2015 только поступил в вуз, но пузырек освоил уже на 3 занятии по информатике. получается я мог уже тогда искать работу?
Да, вполне можно было.
Тоже хотел пройти его курс, но у меня нет идеи ультимейт
Там это нереально, особенно сте. Просто бы посетовал на ограничения платформы и не делал бы.
Открывай рот.
а мне вон там показывают ролики по 10 минут я че зря курс купил? меня че не возьмут
Насколько я понимаю, в OneToMany родитель использует Коллекцию с дженерик типом класса дочернего. В методе main(); создаем обьект класса родителя и дочернего, устанавливаем через конструкторы значения. А затем просто добавляем в коллекцию наш дочерний класс и всо. Зачем только ?
мне дошло, спс
>ну хз, а как можно связать две независимые БД между собой?
А в этом и фокус, чел. По сути, разбитие на микросервисы в конечном счете и сводится к разбитию единой модели данных (именно модели - здесь речь еще даже не о конкретных СУБД идет) на контексты. Но разбивается она не совсем на независимые БД. Физически БДшки независимые, но пересматриваются связи между ними.
То, что реляционки - одни из первых кандидатов на звание бутылочного горлышка в системе, люди понимали еще в эпоху хайпа по nosql. Тогда и пришло понимание что какими то гарантиями консистенции данных в модели можно пожертвовать в угоду масштабируемости. Так популяризировалось понятие eventually-consistent - мы допускаем что данные в двух физически независимых БД придут в согласованность не прямщаснахуй, а рано или поздно. И методы обеспечения такой консистентности получаются более щадящие - вместо анального foreign key constraintа ты можешь для согласования моделей использовать, например, event sourcing средствами кафки.
Ну а дальше, можно бить монолит так, что те же юзеры дублируются в разных моделях разных микросервисов и существуют в этих моделях в разной роли. При этом eventually согласовываются между собой. Например, в сервисе авторизации юзер будет из себя представлять табличку с логином и инфой для сверки креденшелов. В сервисе "клиенты" юзер будет существовать как сущность с перечнем закладок и предпочтений, и. т. д. В мире микросервисов такое зовут "разделением доменной области на ограниченные контексты (bounded context)".
И кстати - ментальность типа "юзеры про мувисы знать ничего не будут" - типичная и часто распространенная ошибка при проектировании микросервисов. Много контор, угоревших по микросервисному хайпу, зафакапилось на этом.
В смысле? Это именно то, что он должен делать - копировать ресурсы в корень класспатха.
Ну так пусть он в джарник их копирует, а не сурцы засоряет.
хуй знает что за кафка, мне бы спринг освоить сначала епта
у меня была идея просто добавить в бд с пользователями нужные столбцы (в зависимости от функционала) и хранить в них айдишник фильма
например: фэворит пул фильмов для пользователя
пользователь жмет на звездочку, имея уже на клиенте id фильма (потому что если он его видит, значит запрос уже был отправлен на бд с фильмами и фильм был дернут за анус от туда)
так вот, когда он это делает, этот id просто посылается в нужный столбец БД с юзерами
и если я захочу глянуть любимые фильмы, то я:
1. отправляю запрос на БД юзера, получаю id от туда
2. затем делаю второй запрос на БД фильмов и получаю уже по этим айдишникам названия фильмов
минус в том, что запрос выходит долгим, через клиента
какие есть еще минусы в моем варианте? (я еще пока ничего не пишу, думаю над архитектурой + спринг учу)
> угоревших по микросервисному хайпу
и еще, мне на микросервисы вообще похуй, я не хайпую. мне просто один знакомый сказал, что запилить микросервис в качестве пет проекта - это норм, аргументируя тем, что за этим будущее.
но похуй за чем там будущее, мне просто деньги платите я буду писать вам любой кал
вы больше не нужны
ХАХА
>минус в том, что запрос выходит долгим, через клиента
Все правильно, это - минус. Это как раз тот кейс, когда сервисы мы развили, но толку от этого хер да маленько, ибо в одну бизнес-транзакцию "добавление фаворита" вовлечено два реста, которые даже не гарантируют ни атомарность, ни консистентность. Такие случаи называют "распределенным монолитом" и считают за антипаттерн.
Пойди от фильмов. На клиенте у тебя уже известен юзер, так как ты авторизован. На стороне фильмов заводишь табличку "юзер" и связанную с ней табличку "фавориты". В табличке "юзер" у тебя - айди. В табличке "фавориты" - фильмы, которые юзер отметил для себя.
А дальше, нажатие на звездочку обрабатывается ОДНИМ запросом к "фильмам" типа "добавь фаворида для юзера А", который под капотом просто инсертит новый фаворит в табличку. И тогда тебе останется лишь решить для себя, как юзер попадет в табличку "юзер" на стороне "фильмов". Если не хочется связываться на первых порах с эвент сорсингом, можешь просто условиться, что юзер попадает в базу фаворитов при первом добавлении фаворита.
И еще раз - тот факт что "фильмы" теперь имеют на своей стороне "юзеров" - это нормально. Это делает сервис фаворитов самодостаточным: он останется рабочим даже если ты положишь все остальное. Для его работы у него есть все что ему нужно.
ну давай мне один вопрос хотя бы который сюрпризом для меня окажется на себе. че мне твои пуканья в лужу
Ну расскажи мне на основе курса про лецзиинит эксепшн, из-за чего он возникает и как его избежать на примере например сущностей Доска,Тред и Ответ
Хуй знает братан,я сам недоджун,но это вообще изи вопрос на понимание хибернейта. Также как вопрос про бинфактори и бин пост процессоры
когда есть связанная сущность не загруженная, и из кода идёт обращение к ней за пределами транзакции
какой хибернейт епта я спринг учу
до хибернейта я еще не дошел
у меня чичас мвц, жэпэа, рэстфул
вот седня узнал что есть томкат который в спринг бут входит
поставить аннотацию игер - хибер будет делать отдельный запрос для получения этой сущности каждый раз.
Ещё хибер может игнорировать лейзи и упорно загружать сущность если посчитает нужным
Как бы вы объяснили почему из postProcessBeforeInit возвращается бин,а из postProcessAfterInit возвращается прокси? Можно ли из метода before вернуть не бин,а например нулл или прокси? Что тогда будет?
@
НЕСКОЛЬКО КОНТЕКСТОВ
эти методы могут возвращать любой тип, но получить их значения нельзя. поэтмоу используют void
прокси возвращается тому що после вызовов пост существующие бины не сразу уничтожаются. там че-то с транзакциями прикол какой-то.
я принят?
> хибер будет делать отдельный запрос
Получается при загрузки доски с 10 тредами и 50 ответами в каждом мы сделаем 500 запросов? Можно это как-то оптимизировать или все что нам остаётся это отказаться от хибера?
> Ещё хибер может игнорировать лейзи и упорно загружать сущность если посчитает нужным
То есть если я укажу коллекцию вложенных сущностей как ленивую хибернейт все равно загрузит их как жадные? И исходя из вашего ответа сделает кучу доп запросов? Получается lazy всегда игнорируется или есть нюансы?
> эти методы могут возвращать любой тип, но получить их значения нельзя. поэтмоу используют void
Как понять любой тип?
Допустим у нас есть threadBeanPostProcessor ,у него есть метод
public Object postProcessBeforeInitialization(Object bean, String beanName)
Мы можем отсюда вернуть null или обернуть наш бин в прокси и вернуть уже его?
> прокси возвращается тому що после вызовов пост существующие бины не сразу уничтожаются. там че-то с транзакциями прикол какой-то.
Как связано уничтожение бинов и прокси? То есть если бы они уничтожались сразу мы могли бы вернуть просто бин? Зачем если они бы сразу уничтожались?
>Получается при загрузки доски с 10 тредами и 50 ответами в каждом мы сделаем 500 запросов?
нет, в худшем случае мы сделаем 1 запрос тредов + 10 запросов ответов. Если тредов будет 20 - то 20 запросов ответов.
Хибер умеет делать джойны, но это анальная магия с кишочками, не всегда срабатывает. Надо будет поковырять на эту тему
>То есть если я укажу коллекцию вложенных сущностей как ленивую хибернейт все равно загрузит их как жадные?
у меня было что указывал как ленивые, а хибер загружал как жадые
>Получается lazy всегда игнорируется или есть нюансы?
предположу что если он может делать джойн то он его делает и сразу загружает данные. А если джойн не выходит - то оставляет лейзи
ты душный не понюхать тебе писечки
>Мы можем отсюда вернуть null
да
>обернуть наш бин в прокси
нет
>Как связано уничтожение бинов и прокси?
как-то
>То есть если бы они уничтожались сразу мы могли бы вернуть просто бин?
нет
>Зачем если они бы сразу уничтожались?
затем
Отвечу сам,lazy на коллекциях отрабатывает отлично. Подгружаться сущности будут только при попытке обратиться к их полям. Касательно твоего случая возможно ты обращался к полям вложенной сущности в сервисном слое или в мапере. Пример:
Сущность Доска и коллекцией Тредов.
До тех пор пока ты не сделаешь Доска.getТреды() треды не будут загружены,до этого момента у тебя хранится прокси,при обращении к которому будет загружена целевая сущность. Объект называется persistentBag если я правильно помню. То есть если у тебя жадно загружаются ленивые коллекции то ставлю 90% что ты обратился к их поляи,например при маппинге в дто
> >Мы можем отсюда вернуть null
> да
Не можем,так как после postProcessBeforeInitialization вызывается инит метод
> >обернуть наш бин в прокси
> нет
Верно,по той же причине
> >Как связано уничтожение бинов и прокси?
> как-то
Не связано
> >То есть если бы они уничтожались сразу мы могли бы вернуть просто бин?
> нет
> >Зачем если они бы сразу уничтожались?
> затем
Вопросы задал чтобы показать неправильных ход рассуждений
>Не можем,так как после postProcessBeforeInitialization вызывается инит метод
вообще не понял про что ты
я тебе про лайфцикл бина
у которого можно вызывать инит/пост методы помечая их аннотациями @PostConstruct и @PreDestroy
о каком ините после уничтожения речь?
Сначала вызывает BPPbeforeInitialization потом вызывается инит метод, тот самый который ты пометил @PostConstruct если ты вернёшь из первого метода null то в пост констракт у тебя придет нулл и ничего создать не получится
хорошо. посоветуй тогда где можно посмотреть/почитать про спринг, чтобы на всю эту хуйню знать ответы? и вообще мне кажется ты меня специально пугаешь только, чтобы я отказался от затеи идти в жава энтэрпрайз
Я лично читал spring in action т смотрел доклады Евгения Борисова. Также полезно копаться в дебагере. Про персистант баг я например узнал оттуда. Вот тебе лайфсайкл как шпаргалка
На практике спрашивали плюс минус. Я так долго сижу без работы что успел и докер поковырять и кафку немного. А вакансий с февраля в моем регионе ноль. Так что если ты не из дс судьба может быть к тебе жестока. Будешь как я своими знаниями на дваче выебываться
так найди удаленную блядь хули ты как этот
у тебя знания есть по сравнению со мной
я нахуй 4 года на шее у мамки после вуза висел
ни опыта блядь ни знаний нихуя нет по сути
весь вуз блядь лаба1 лаба 2 лаба3 писал в консольке блядской
пока я сидел дрочил и прокрастинировал стек вырос так блядь что я ахуеваю буквально
а теперь добавь к этому то что если за месяц не освою спринг, не освою жава ЕЕ, не освою хибернейт, не напишу свой маленький микросервис для резюме (мне буквально не хуй показать работадателю, весь мой опыт это лаба 1 на шарпе, лаба2 на кутэ, лаба3 на с++, лаба4 на прологе, лаба5 на ассемблере, лаба6 на андроид, вот и думай бля), не найду работу, то неиронично рискую из КЗ упиздовать в окоп
я даже инглишь не знаю толком, могу только документацию читать и то с переводчиком под рукой
Я откликался удаленно,все отказы, даже до собеса не дошло. Некоторые жирным шрифтом пишут тип удаленки нет или джуны только очно. При том что гит с петами имеется
Я тоже рискую умирать поехать,че поделаешь
Датаарт теперь айтентика,я проходил у них джава школу лол. У них там три собеса тупо чтобы лекции послушать. При том одно это диалог на английском с носителем,ебать я там пропотел
Есть варинт перекатиться на жава-спринг-хибернейт разраба в кровавом тырпрайзе. Либо пойти дальше по автотестерской стезе развиваться.
Какой стул выбрать?
Ну, в перспективе, да. Но поначалу не уверен.
То есть, я могу стать синиор атомейшеном. Либо перекатиться на джун-мидл разраба. И мидл вероятно будет мой потолок на ближайший год-полтора. И еще надо учитывать, что это галера. Так что по деньгам, в короткой-средней перспективе, мне кажется, лучше автоматизатором быть.
Но тут не только в деньгах вопрос. Мне нравится кодить. Был проект, где было много свободы. И я пилил всякие тулзы по автоматизации, изучал что-то постоянно и т.д.
Ну, представь, что будет через 5 лет, а не в короткой-средней перспективе. В любом случае, разрабом до миддла-сеньора дорастёшь быстрее, чем кажется, и там и там одно и то же программирование, просто вместо тестирования надо будет погружаться в предметную область и бизнес-требования, разница не так уж и велика.
Те в целом самому как тестировщиком, нормально? К чему душа больше лежит?
Вроде как есть мнение что тестировщикам больше всех на орехи достается от чужого долбоебизма. Ситуация, когда на QA спускается невнятная параша от говнокодеров, которую не пойми как вообще тестировать, довольно распространена. Разрабам в целом немного чиловее живется (что на мой взгляд несправедливо, но похуй). Плюс, по моим наблюдениям, лучшие разрабы получаются именно из бывших тестировщиков: наверное потому что тестировщики знают толк в контроле качества, в отличие от среднестатистических долбоебов.
А разве на этапе пост процесс афтер еще не факт, что бин будет запроксирован т.к по сути там и создается прокси? Чтобы произвести какие-то манипуляции именно с прокси обьектом правильнее наверн будет написать эвентлисеннер на контекст рефрешед, где уже точно контекст поднят, все бины настроены и запроксированы
Плюсую, я уже кубер ковыряю во всю последний месяц, а все без работы, надеюсь, когда разберусь и поставлю еще один кейворд в резюме, офферы, наконец, повалятся
Хотя кого я обманываю…
Бтв, скажите плиз, пример дефолт таски с кубером, может мне уже его достаточно и пора переходить к чему-то другому
Всегда казалось, что между мидл разрабом и сеньором прям серьезная пропасть. И, если в тестировании сеньора можно как-то относительно легко залететь, то будучи разрабом надо прям серьезно попыхтеть и прям дофига чего знать. Типа начиная от того, как на базовом уровне устроен язык, заканчивая всеми нюанасми технологии в с которой работаешь (спринг и т.д.).
>>590268
Мне норм. Но душа лежит больше к разрабству. Был проект, где я чисто пилил тестовый фреймворк. Раширял, добавлял новые фичи, фиксил баги. По сути можно сказать был разрабом. Никаких вооще тестов, регрессий, прочей херни. И это было прям круто и интересно. Сейчас пилю автотестики и это скучновато. Хоть и ненапряжно. Но ощущение, что занимаешься какой-то бесполезной хуитой.
У меня вот не то чтобы обратное ощущение. Но вижу часто, что разрабы пыхтят, тужатся, постоянно преодолевают какие-то траблы. А я сижу себе да тестики попиливаю. Поэтому еще и стремаюсь немного - вдруг я слишком тупой и не потяну.
Между мидлом и синьором вполне себе осязаемая пропасть - мидл от синьора отличается тем, что мидл имеет достаточный набор компетенций чтобы принимать решения в рамках отдельно взятой бизнес-фичи или компонента. Синьор - человек, способный с нуля стартануть продукт. Синьорность это не совсем про технологии, хотя общая эрудиция тут роляет, да. Синьорность скорее - про вес твоего экспертного мнения и стоимость твоих ошибок.
> Был проект, где я чисто пилил тестовый фреймворк
В какой то мере для меня например эта вот фраза - индикатор того, что твои компетенции вполне могут быть как минимум выше джуниорских. Если ты пилил этот фреймворк с нуля под ключ не в стол, а для реальных стейкхолдеров, реальных пользователей которые им пользовались, ты уже не можешь быть джуном. Даже если до этого ты владел другим стеком, ты уже либо мидл, либо синьор, в зависимости от того, насколько осознанно ты владел этим продуктом. Даунгрейд на джуна станет тупо топливом для твоего выгорания, потому что джун в этом анал-карнавале - фактически подсос. Шестерка. Вне зависимости от рода деятельности.
Поэтому не прибедняйся, не считай себя тупым по сравнению с разрабами (ибо это - навязанный разрабами тестерам стереотип, который тупо ложь: как разраб с многолетним опытом говорю), учи новые штуки и пробуй себя, адекватно оценивая свои возможности. Если ты - на галере, и эта галера дает тебе возможность сделать внутренний переход с тестировщика на разраба - пользуйся этой возможностью: пройти этим путем кратно проще чем искать работу вхолодную.
При чем тут вэб, в хибернейте есть свои сессии
и как относитесь к тем, к кому относится все тоже самое, что и выше, но только теперь он понял: времени было проебано и так много, поэтому надо брать любой популярный стек и учить уже хоть что-то, даже если оно тебе не нравится и по тебе это видно?
Нормально относимся.
Мы не любим скакунов, у которых стаж весь - в лоскутах по три месяца длиной. А дальше надо разбираться, что ты имел ввиду под "открытыми" проектами.
Опенсорц? Опенсорц - преимущество, но его отсутствие на самом деле вообще не дилбрекер, всем похуй в подавляющем большинстве случаев. Неумение доводить дела до конца? Ну это означает просто что тебе рано лычку синьора давать, но этож не конец света.
>учить уже хоть что-то, даже если оно тебе не нравится и по тебе это видно?
Бесполезно. Выгоришь, будет еще хуже.
Тут надо просто пересматривать свои ценности. В идеале самое здоровое отношение к стеку и технологиям - чисто утилитарное. Когда ты, поинмая все его достоинства и недостатки, даже отдавая себе отчет что стек по сути - говно, знаешь как его эффективнее всего применять для достижения целей. А кайф получаешь именно от решения задач и своей роста компетенции.
>Неумение доводить дела до конца?
разве это не говорит о программисте, что он ленивый хуй и будет только вам палки в колеса вставлять? постоянно за ним присматривать придется, подгонять. оно же нахуй не нужно никому?
>Бесполезно. Выгоришь, будет еще хуже.
в длительной перспективе, возможно. но сейчас я готов писать любую хуйню на любом языке (ну я уже решил в жаву вкатиться, вот сижу учу ее, хотя, всегда хотел писать игоры на плюсах, но я понимаю, что это более долгий путь и сложный, особенно, когда цель не найти гейдев контору, а стать успешным инди)
>у которых стаж весь - в лоскутах по три месяца длиной
что это значит? разве это не
>"потрогал то, это, пятое, десятое, но нихуя не разобрался досконально в чем-то одном"
о чем я писал ранее?
>разве это не говорит о программисте, что он ленивый хуй
Ну ленивый хуй разумеется никому не нужен. Но из твоего описания проблемы я понял что речь не об этом же, так? Насколько я понял, ты просто jack of all trades и никак не остановишься на прокачке в чем то конкретном. И как результат, не можешь растить грейд.
>что это значит? разве это не то о чем я писал ранее?
Трогать пятое-десятое - это не просто нормально, это хорошо. А вот что плохо, так это бросать свои обязательства (которые у тебя неизбежно появляются как только ты трудоустраиваешься). Если ты меняешь работу как носки, это для интервьюеров как раз звоночек, что не имеет смысла в тебя инвестировать свое время и деньги.
>ты просто jack of all trades и никак не остановишься на прокачке в чем то конкретном
не, скорее я не знаю что мне нравится, я что-то нахожу новое, щупаю, мне не нравится через какое-то время, я бросаю. если бы можно было говорить об этом, как о том, что я могу взять любой язык, который раньше использовал и написать на нем что-то рабочее, то это не так. все что становится мне не интересно или не нужно - просто забывается. и не смотря на то, что я раньше мог на этом даже что-то написать рабочее, пусть и не завершенное до конца, то сейчас я даже условно хелоу ворлд не выведу в консольку на том языке без гугла и вспоминания синтаксиса.
вот например, я помню как делал дипломную работу на реакте, при чем я тогда даже не был особо знаком с клиент-сервер приложениями, но за пару недель смог разобраться и написать дипломную. но если сейчас меня попросить на нем что-то написать, то я даже и близко не помню его синтаксис. помню только общую идею этой библиотеки и для чего она, но не более.
на qt помню формошлепил, еще когда учился, курсовую. написал готовое приложение с весьма объемной базой данных, которая управлялась этим франкенштейном на qt. но сейчас я даже не смогу создать виджет с одной кнопкой.
и я вот как представлю, что после изучении жавы иду на собес, меня там спрашивают про мой опыт, и я отвечаю на каждый вопрос "ну опыт был, да, только сейчас ничего не смогу сделать". мне аж хуево становится и кринжово со всего этого интервью. но в то же время вспоминать это все, чисто чтобы покозырять на собесе, как-то и нахуй не хочется, когда ты пришел на позицию жава девелопера собеседоваться...
Ненене, давай разделять вопросы.
Сначала ты спрашивал "как мы относимся к таким". Ответ: нормально относимся.
Теперь ты уже задаешь другой вопрос: "насколько ценен твой позабытый опыт". И ответ уже будет другим. Ну... сам понимаешь - каким. Какой ценностью впринципе может обладать позабытый опыт? Ценностью обладают твои скиллы и навыки решения задач, а окончательно роляет ситуация, когда твои скиллы закрывают потребности потенциального работодателя. Те же скиллы определяют и твой грейд. Если твои скиллы - на уровне джуниора, значит и отношение будет на уровне джуниора.
так я вкладывал этот же смысл про позабытый опыт еще сюда
>"потрогал то, это, пятое, десятое, но нихуя не разобрался досконально в чем-то одном"
ты это понял по своему
>ты просто jack of all trades и никак не остановишься на прокачке в чем то конкретном
я не спорю, что не совсем верно сформулировал свои мысли изначально.
>Какой ценностью впринципе может обладать позабытый опыт?
а разве это не говорит о человеке, что он как минимум способен к обучению? единственное, ему для этого нужно просто определенное количество времени. я лишь хочу понять: стоит ли это хоть чего-то? или лучше потратить еще пол года практики на жаве, написать 5-10 проектов и идти на собес, даже не упоминая о старом позабытом опыте?
ты душный, чел
>я не спорю, что не совсем верно сформулировал свои мысли изначально.
Сорян тогда. Если че, я не подразумевал под этим чето обидное.
>а разве это не говорит о человеке, что он как минимум способен к обучению?
Это здорово, но этого работодатель в первую очередь ожидает от вкатунов, стажеров, интернов и джунов. Так называемые "горящие глаза". Им готовы простить незнание каких то вещей и отсутствие навыков, так как все рассматривают их скорее как инвестицию.
Миддлы и синьоры - другая история. Это - бойцы, выполняющие поставленную задачу. Им наоборот готовы простить отсутствие "горящих глаз" и потерпеть их душнину, взамен за их опыт и результативность.
>лучше потратить еще пол года практики на жаве, написать 5-10 проектов и идти на собес
ИМХО при любом раскладе лучше идти на собес как можно раньше. Да, первые собесы ты завалишь, но получишь понимание - чего вообще ждать на собесах (и как результат, чего учить). А иначе ты можешь угрохать кучу времени на этих 5-10 петах, выучить хуй пойми что и все равно не пройти.
>даже не упоминая о старом позабытом опыте
Если не хочешь чтобы тебя спрашивали о позабытом опыте, лучше убрать. Но ты подумай - может он не настолько уж и позабытый?
>Это здорово, но этого работодатель в первую очередь ожидает от вкатунов, стажеров, интернов и джунов.
а я и не претендую на что-то выше джуна. какое-то время думал вообще уйти тестировщиком куда-нибудь (представлял это нечто более простым, чем писать по). да и кто лучше протестирует программу, чем сам программист?
>Но ты подумай - может он не настолько уж и позабытый?
на уровне синтаксиса точно. да и что вообще можно рассказать об этом? как создавал виджет через Qt4:: обращаясь к объекту <name>? разве что помню основы плюсов, потому что сложнее консольного приложения на них не писал. даже STL далеко не весь потрогал, не говоря уже о boost. козырнуть явно не чем, но и приходить и говорить "здравствуйте, я программист, пишу на жава 1 месяц, вот мой пет проект" как-то тоже...
>да и кто лучше протестирует программу, чем сам программист?
Спорно. Программисты - те еще проебаторы. Сам факт, что программисты по прежнему не любят и не умеют писать юнит тесты, уже говорит о том, что они не умеют нихуя тестировать свое дерьмо.
>а я и не претендую на что-то выше джуна.
Ну тогда я думаю вопрос исчерпан. Добро пожаловать в реалии джуна 2022 года.
хз, когда программист пишет приложение, сил писать юниты уже не остается. я и сам не люблю распыляться. если я пишу и сконцентрирован на чем-то, то я и хочу писать это.
но когда у тебя работа основана на тестировании и твоя задача заниматься непосредственно тестированием, то и потратить свое время на написание юнита не сложно. наоборот даже, появляется некоторое желание сломать чужой код, чтобы нормально сделали.
я не работал тестировщиком, это мои представления только. но я действительно считаю, что программисты не должны покрывать код тестами.
под программистом я подразумевал человека, который знает как работают программы/код, как там все устроено, потенциально шаткие места и т.д.
>когда программист пишет приложение, сил писать юниты уже не остается
Потому что надо делать наоборот.
Был период когда я так же думал. Сейчас я считаю иначе.
Цимес в том, что хорошие юнит тесты на самом деле пишутся просто, и сил отнимают в разы меньше, чем ковыряние сорцов дебагом, когда случится бага. А если юнит тесты написать на какую то хуйню тяжело настолько, что сил на это не хватает, значит либо эта хуйня написана говенно (закон юнит-тестирования: когда тестируемый юнит написан хуево, юнит тест со стопроцентной гарантией будет тоже бесполезным куском говна), либо эта хуйня должна покрываться другого уровня тестами (интеграционными).
Ну а дальше весь вопрос сводится к тому, как писать юниты хорошо. И вот здесь у программистов все совсем плохо. Часть пытается каким то образом купировать свою некомпетентность посредством введения дополнительных ритуалов, aka test-driven development. По слухам - кому то оно даже помогло (но в основном - нет). Другая часть тупо забила на юнит тесты, и по старинке хайрят QA-команду, которая мейнтейнит высокоуровневый тест-сьют.
Я пишу интеграционные тесты на все эндпоинты своего сервиса и считаю их очень полезными. Очень часто на этапе написания теста понимаю, что эндпоинт работает неверно.
С другой стороны не очень представляю, как можно писать по tdd в test-first стилистике. Это надо заранее на 100% понимать, как будет работать твоя апишка на вход и выход и припоминать все сайд-эффекты.
Типа вот есть такой пост запрос - вот три валидных запроса, 5 невалидных, вот ответы на это все, вот такое изменение в базе произойдет, вот тут вызов внешнего сервиса в таком формате, вот тут пук в кафку в таком формате, вот здесь обращение к серверу авторизации в таком формате. После написания эндпоинта я это сделать могу, хоть и времени на все это уходит раза в 2 больше, чем на написание самого эндпоинта. А заранее написать тест - это анрил.
джун+ спринг-крудошлеп
>пилил этот фреймворк с нуля под ключ не в стол
Пилил не с нуля, конечно. Пришел, когда уже база была. Но добавлял какие-то новые фичи.
Спасибо за поддержку и советы.
Сколько денег, что делать надо, какие технологии?
Если про деньги не хочешь тут отвечать, расскажи про остальное.
@ancap_kun
Никак.
Репорт.
Юниты запускаются на всяких ин-мемори HSQLDB/H2
Автотесты подключаются к полноценной СУБД, аналогичной обычной работе приложения. Ну какие там могут быть инструменты? CI-агент запускает приложение, оно подключается к отдельному серверу с СУБД, и всё.
>там есть какие-то инструменты, которые поднимут контейнер с чем угодно? Если есть то какие?
testcontainers.org
>>ин-мемори HSQLDB/H2
в них синтаксис будет отличаться и под них нужны свои скрипты миграции, лучше использовать testcontainer
Я просто терминально ебанутый!!!!!!!!!!!!!!!!!!!!!!!!
уже шестой есть
К счастью вкатился в golang, на работе пишем сервисы на chi, никакой магии энтерпрайз фреймворков и вообще привкуса энтерпрайза, хорошо...
Маркет практически целиком на жабе написан, еще некоторые части клауда, толока, бизнес да и много где по мелочи.
Но в основном сейчас Go/C++/Python используют.
Посоветуйте, пожалуйста, хорошую книгу, чтобы понять ООП и объектный дизайн.
Любопытно, жаль в слив репозитория Яндекса это не попало.
>>591893
Мне понравилась эта
https://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551X/
Плюс книги по шаблонам. На русском есть "Погружение в паттерны проектирования" Швец А. 2021 Страниц: 400
Что не так?
Почему так ? Теперь всё переделывать...
Идея не поддерживает Swing.
Хватит. Но что, только им пользуются? Не держат открытыми сессии, не велосипедят хэшмапы <String, CachedInstance>?
>жаль в слив репозитория Яндекса это не попало
Где-то уже есть подробный разбор этого говнокода?
Кафка уже научилась подключаться напрямую к постгресу?
шина данных с писателями/читателями и всевозможными настройками этого процесса
>>592420
Хорошо, понял, спасибо. Но всё-таки интересует момент с использованием кэша сессии в Хибернейте. Я щас на работе имею дело с проектом, там вообще никакого кэширования нет, есть только некий Tapestry Hibernate SessionManager, из которого всё время берётся сессия, которая никогда не закрывается. Я так понимаю, она вместо кэша и используется.
это внутренний хибернейтовский в попытке снизить количество операций с бд.
Кеш обычно нужен когда например есть дорогие обращения к внешним сервисам, и ты кешируешь возвращаемое ими значение
Ну вот меня как раз и интересует: можно ли в приложении, которое активно обращается к БД, кэшировать через Хибернейт таким вот образом? Так ещё и искать удобнее.
нет смысла кешировать бд. Оно слишком быстрое (если правильное). Либо тебе нужна некая потокобезопасная мапа, куда ты срёшь из всех потоков
Окатышу.
ничего.
это тебе надо девопса изображать.
то есть, ты спрашиваешь штуку, которая зависит от особенностей деплоя в кубер. А с точки зрения Jenkins тут абсолютно нечего изучать. Ты как запускал команды через sh, так и будешь запускать всю жизнь.
Джуну надо знать о существовании дженкинса. Миддлу надо уметь нажимать на кнопку "Build Now". Есть ещё кнопка "Build with Parameters", но это уже уровень сеньора.
И я блять серьёзно. Ты разраб, а не девопс, к написанию пайплайнов тебя и на километр не подпустят.
>>592550
Просто, почему я решил вообще начать изучать кубер, а теперь дженкинс, периодически видел тут от анонов посты о том, что разраб должен все равно что-то уметь показать в работе с этими вещами, у девопса много своих головняков по администрированию виртуалок изнутри, написанию каких-то скриптов и еще чего-то, чего я пока не знаю, тк не интересовался особо их профессией, или девопса может вообще не быть на проекте, будут говорить что-то про ю билд энд ю ран, да и наверное, с этими знаниями больше шансов пройти собес, чем без них, очень много на ждунов в требованиях пишут кубернетис же
> видел тут от анонов посты о том, что разраб должен все равно что-то уметь показать в работе с этими вещами
Ещё здесь были посты, что айти всё, и нет смысла вкатываться. Почему одним мимокрокодилам ты веришь на слово, а другим нет?
> у девопса много своих головняков по администрированию виртуалок изнутри
Для этого есть админ, который и делает всю ручную работу с заведением заявок, разовой настройкой серверов, мониторингом, сбросом забившихся кешей и прочим.
> девопса может вообще не быть на проекте
Даже в таких случаях роль девопса берёт на себя тот, кто хоть что-то в этом понимает, а не все подряд. Обычно это один из разрабов, которому приходится жертвовать кучу своего времени на решение проблем со свалившимися сборками и выдачей доступов.
> с этими знаниями больше шансов пройти собес, чем без них, очень много на ждунов в требованиях пишут кубернетис же
В требованиях это пишут, потому что разрабам приходится минимально в этом разбираться, чтобы локально развернуть сервер. Минимально - это значит знать пару-тройку команд и уметь гуглить, а не писать джобы и пушить образы в registry. Если на собесе один разраб говорит, что разбирается в девопсе, но хуёво решил задачу с алгоритмами, а другой ни черта не смыслит в девопсе, но задачу решил хорошо, возьмут скорее второго, чем первого.
>>один разраб говорит, что разбирается в девопсе, но хуёво решил задачу с алгоритмами, а другой ни черта не смыслит в девопсе, но задачу решил хорошо, возьмут
Того кто попросил меньше сотыг, ведь код они писать будут одинаково хуево.
Возьмут того, кто хорошо решил задачу, потому что он будет лучше писать код. Запрошенные сотыги роли не играют, потому что вкатыши часто просят намного меньше, чем установлена вилка, в итоге пришлют оффер ровно на столько, сколько стоит кандидат, ему остаётся лишь согласиться или отказаться.
>>хорошо решил задачу, потому что он будет лучше писать код
С чего ты это взял? Как решение алгосов проецируется на решение реальных задач? Или тебя не было в треде последние несколько дней и говнокод компании эталонных алгосодрочеров ты не видел?
>>сколько стоит кандидат
Вкатун умеющий кое-как писать код гораздо ценнее студента олимпиадника не знающего нихуя кроме синтаксиса языка (да и то очень ограниченно).
Первый может уже через месяц потихоньку пользу приносить и пилить простенькие фичи.
Второй будет просто начинать учить фреймворки и доучивать язык еще 3 месяца.
>>ровно на столько, сколько стоит кандидат
Оффер будет ровно на столько сколько он попросит, если это не выше определенной суммы. Готовы дать сотыгу, но попросил 30к - получит 30к.
>попросил 30к - получит 30к
Не, нихуя, на собственном примере знаю, когда устраивался на первую работу, просил сотку, а оффер дали на 130
Реально.
Я думал, что на мою пасту никто не откликнется, но раз такое дело, тогда контакт свой оставлю и лично расскажу, если кому интересно >
А что тут рассказать не можешь? Мне твоя вакансия неинтересна, а что за проект с майнкрафтом - любопытно.
Моментальный подрыв тупоголового неосилившего ООП.
Да не гори ты так.
Сначала они наёбывают тебя.
Дык я ж академий не кончал
Не ЦА
bump
Я не следил за историей дальше раздачи.
версии вверху, в пропертисах. Сами зависимости стараются делить по блокам, но в итоге всё смешивается
ПООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООХУЙ.
Мавен не градлопараша. Как ни набросай - всё понятно.
В родительском поме - все плагин-биндинги, организованные по профайлам + dependencyManagement и pluginManagement. В дочерних помах - зависимости и только зависимости.
Активация у профайлов настраивается таким образом, чтобы профайл активировался по умолчанию ровно на тех подпроектах, где он нужен. Например, сборка докер образа активируется только в проектах с Dockerfile.
>>593004
А, и еще. Самый главный, можно сказать мастхэвный плагин: это maven-flatten-plugin. Он после билда вычищает из помника все что не зависимости, инлайнит все паренты и деливерит такой помник в реп, вместо оригинального. Это устраняет множество корнер-кейсов, в которые можно впороться в вышеописанной мной схеме
POST /resource/{id}
?
Создавать ресурс с заданным айди? Обновлять ресурс? Запускать какую-то операцию на ресурсе?
>Активация у профайлов настраивается таким образом, чтобы профайл активировался по умолчанию ровно на тех подпроектах, где он нужен. Например, сборка докер образа активируется только в проектах с Dockerfile.
Дай пример. Мне по документации показалось что там толком ничего не настроить.
Спроси у того кто его написал.
При создании id не указывается - его генерирует приложение/бд.
всё что угодно. Скажи спасибо рест сектантам
Ебать твою сестру id раз.
bump
У каждого профайла есть секция активейшн, через которую можнро сказать, при каких условиях этот профайл должен запускаться. И ее можно по всякиому эксплуатировать если проявить фантазию и придрочиться. Например, можно настроить профайл на проекты с тестами, проверив на существование src/test/java. Или сделать профайл который запускается для всех проектов, проверив на существование pom.xml. Помимо файлов, профайлы можно активировать пропертями, или в зависимости от операционки.
Но есть нюансы. Например, активация activeByDefault - не то, чем оно кажется на первый взгляд: https://maven.apache.org/guides/introduction/introduction-to-profiles.html
>All profiles that are active by default are automatically deactivated when a profile in the POM is activated on the command line or through its activation config.
Дженерики не сошлись.
Плюсы слишком больно пиздят за ошибки. Джава в самом начале как раз и вывозила за счет трейдоффа - ты жертвуешь производительностью, получая взамен гарантии безопасности. В начале трейдофф был прям пиздецовый (мемы про хеллоу ворлд за 67 гигабайт - как раз с тех времен), но с введением JITа и современных GC трейдофф выровнялся. Ну и сролял тот факт, что в определенный момент железр стало стоить кратно меньше разработчиков.
а что пробывать тут? берешь и пишешь. если команда красноглазиков есть вообще супер, взяли, сели и написали. кабаны просто тупые не согласятся свои легаси менять на не понятно что. а так в теории можно было бы рыночек за 1 день перезагрузить и жава больше не нужна нигде никому кек
>Плюсы слишком больно пиздят за ошибки
>В чем проблема написать идеальные отдебаженные и быстрые либы, с которыми было бы удобно и быстро работать?
просто сесть, написать все четко, покрыть тестами каждый пук, архитектуру выстроить так, чтобы пользователям не пришлось даже думать о выделении памяти чему-либо. условно аналог спринга можно сделать, где под капотом будут все эти страшные вещи происходить, а ты только как макака вызывать статичные методы
На плюсах сделать все вышеперечисленное тупо дороже чем на джаве, вот и все. Не забывай - время разработчика кратно дороже железа (за редкими исключениями в лице эмбеддед, где по железу иной раз тупо альтернативы нет).
какая разница будешь ты вызывать метод контроллера на жава или на плюсах. я же сказал, сделать архитектуру библиотеки, похожую на спринг, только со своими нюансами, но не ведущими к увеличению кода.
Мне вот интересно если я скачал Идею с торрента, активировал по инструкции, она заработала то могут ли как-то узнать что я ее пизднул например когда через нее будут коммиты в профиль гитхаба? Короче сулит ли это проблемами в будущем?
Как себя представить в линкедине и гитхабе чтоб это было правильно, ну в смысл мне какой-то никнейм себе придумывать рядом с моим именем и фамилией?
Моя основная почта должна быть с моей фамилией или же с никнеймом?
Очень хочу все сделать правильно, чтоб это не сыграло против меня когда начну рассылать резюме. Умудренные опытом аноны, помогите молодому и неопытному советом.
А поддерживать эту библиотеку, фичи пилить, интеграции новые, аннотации - по твоему забесплатно будут?
Кроме того, ты упускаешь тот факт, что потребители этой библиотеки - человеки, делающие человеческие ошибки. За которые плюсы будут также пиздить. Пиздить больнее, чем джава.
Или ты что думаешь - коли есть спринг, человеки ограничиваются лишь шлепаньем аннотаций? Есть стопятцот способов и спринг сломать, так то.
>А поддерживать эту библиотеку, фичи пилить, интеграции новые, аннотации - по твоему забесплатно будут?
можно изначально сделать собственную либу для разработки основного фреймворка. лезть в сами кишки придется только, если понадобится добавить что-то абсолютно новое
>можно изначально сделать собственную либу для разработки основного фреймворка.
Ну вот считай - джавовый хотспот и есть такая либа. Он аккурат на плюсах и написан.
Никто этого и не знает. Есть основные общеиспользуемые классы. Многопоточку даже далеко не все знают, но вот коллекции надо знать короче, не только как с ними работать, но и как они устроены под капотом. Лямды глупо не знать, потому что что там знать вообще?
>Лямды глупо не знать, потому что что там знать вообще
Метафактори, бутстрап методы, invokedynamic :)
Нет, не меняют.
LinkedList был и остается связным списком, ArrayList был и остается списком на основе массивов, HashMap был и остается хэш-бэйзд мапой. Они могут фиксить там баги и тюнить оптимизацию, но суть их внутреннего устройства была и остается прежней.
блядь, что учить из этого? нахуя так много одного и того же?
Можно. Но скорее всего хахуй пошлют
Это легаси, чел... Если тебе на собеседовании говорят, что они используют хубирнейт, то это легаси без каких-либо перспектив
Фильтр по определению при прочих равных не может быть безопасней сервисного слоя: оба они - часть одного процесса.
Если юзаешь spring security, то следуй докам: там есть такое понятие как PasswordEncoder, с помощью него и шифруется пароль при добавлении юзера.
Если нет, то все равно как сделаешь.
Нахуя ныть об одном и том же? Не интересно учиться, вьеби пива. Хули тебе еще посоветовать.
Ну я так и делаю сейчас, инжекчу пассворд энкодер в сервис и делаю энкод пароля перед сохранением. Просто, что мешает при таком исполнении какому-нибудь разрабу написать какой-нибудь аспект, который будет дтошку с незахэшированным паролем отправлять ему на почту?
Ничто не мешает. А что мешает разработчику написать фильтр поверх твоего фильтра, и соскрябать пароль до того как ты его заэнкодишь? Что мешает ему впринципе выкинуть твой фильтр?
Ты этому разрабу ничего особо не противопоставишь, кроме пиздюлей на кодревью. Ну может archunitом еще можно запретить менять сорцы определенным образом. Или выделить все сисурити в отдельный модуль, доступ к сорцам которого не давать всем подряд, но это тоже скорее организационные решения проблемы, нежели технические.
Учишь вот это : jdbc(учить не так и много, глубоко не надо, можно и вовсе пропустить) -> hibernate(придется поебаться) -> spring data jpa(тут объем тоже небольшой). Каждое последующее - обертка над предыдущим.
Spring Data JBDC - не нужен от слова вообще.
jdbcTemplate - встречается, но не так чтобы много давал поверх голого jdbc.
Еще есть jooq и mybatis.
На собесах надо будет отвечать про устройство хибера, а в тестовых писать на spring data jpa.
Ну про фильтр я скорее вкладывал то, что пароль так меньше времени будет находиться незахэшированныи в памяти, тк фильтры идут раньше контроллеров и сервисов. Так же я читал, что пароли полагается хранить в массиве чаров, чтобы потом его можно было пофасту заклирить, в отличие от стринги, до которой гк хуй знает когда доберется. А это означает, что к памяти как-то можно получить доступ и оттуда пароль как-то считать, получается фильтр все-таки чуть лучше будет.
Ну или это все хуйня и похуй, где хранить
Я хз насчет того хуйня это или нет, но на твоем месте я б забил и сделал по гайдам, или как получится.
>hibernate(придется поебаться)
Еще бы, ведь нормальных книг нет, а документация говна.
>spring data jpa(тут объем тоже небольшой)
Минимум книга на 600 страниц, которую нужно будет проработать в течении полугода.
о чем ныть шиз я не помню когда тут ныл последний раз
вы знаете программирование (язык не важен)
вам нужна работа, но вас не берут никуда
но вам предлагают поработать преподавателем программирования в онлайн школе для детей
вы бы согласились?
алсо, есть у кого опыт работы преподавателем в этих школах? какие плюсы/минусы? сильно напрягает сидеть в конфе с микро челами, да еще и с вебкой?
Книга по хиберу есть. Ей лет 10, но устраела она совсем немного. Причем то что там есть, это оверкил для новичка, хватит десяток статей про основные апихи жизненный цикл энтити, методы энтитиМенеджера и кеши. jpql, лейзи инициализация, entity graph. Поебаться придется скорее на практике.
Спринг дату учить почти не надо, тупо открываешь хеловорд на баелдунге и пользуешься. Ну и доку открыть можно. Там дока - 50 страниц из которой половина не нужна.
Не согласился бы. А если с дуру согласился, то выгорел бы.
На меня джуно-стажера скинули и когда он тупит - меня это бесит неимоверно. Хотя тупит не то чтобы прям очень.
Просто умение преподавать это отдельный скилл, для которого нужны задатки и который надо качать. Задатков у меня нет, а тратить время на прокачку мне не хочется.
а как у тебя с боязнью аудитории? как по мне, это самый главный камень преткновения... я например понимаю, что у меня нет педагогического, и в роли преподавателя я ни разу не был, но я бы согласился попробовать, если бы не знал, что я туплю во время любых выступлений, меян накрывает ебейшее волнение, из-за этого в голове полный крах. как вспомню как диплом защищал, это вообще пиздец тушите свет. казалось бы, тут дети и с ними проще, но нихуя...
Ну бывают небольшие коммуникативные проблемы. Если надо что-то коллегам рассказать, моя и так неидеальная речь становится еще немного хуже. Начинаю заикаться и запинаться. Замечания никто не делал, но я по записи и сам слышу.
Но чтобы боязнь и прям жесткое волнение - нет. Мне просто трудно выступать и от этого неприятно это делать. Думаю это все опять же прокачивается. Но я бы не очень хотел на это время тратить.
>>школе для детей
Для этого мало знать программирование, надо еще и базовыми навыками дрессировки животных владеть.
лол
>>Или логирование используется исключительно во время разработки для дебага, а затем удаляется ?
При разработке для дебага ты можешь и в консольку пукать, а логи нужны на проде, когда ты не можешь просто подключится к нужному сервису и пишешь логи, чтоб понять, что пошло не так.
>>вместе с логированием заливать ?
Если ты про конфиг логбэка - то да, с ним.
Вопрос.
Как создать проект?
То что в консоль пукает, оставлять иди удалить ?
Ну а чем легаси 25-летнее будет отличаться от 10-летнего?
Если там версия языка 25-летняя или библиотек, значит это или какой-то совсем кал, что не смогли найти человекочасы на миграцию или изменения вносятся раз в несколько лет.
Это шарпоблядь местная срет.
Если ты там через system.out выводишь - то не надо такого в коде.
800 страниц, из которых треть это перечисление бесконечных пропертей. Зачем ты врешь?
Тем, что тогда про код стайл мало кто знал. Либы олдовые с приколами своими, о которых ты даже подумать не мог. Сидишь и представляешь, как кто-то сидел это 20 лет назад писал. Булка хлеба 7 рублей стоила, сникерс 10 рублей. Программирование не было мейнстримом.
10 лет назад уже каждая юристо-блядь знала, что надо в ойти вкатываца за баблом.
Нет, я 10 лет назад закончил юридический и не было хайпа.
Мои одноклассники, закончившие мухгу на кодеров больше года не могли найти работу. Устраивались тестировщиками, в техподдержку, аналитиками, чтобы им через годик дали перебраться в кодеры.
Двое знакомых пошли на завод. Один дико выебывался, когда через год дошел до 2.5 мрот, когда все остальные получали полтора.
Хайп лет 7 назад начался, а вот прямо нормально лет 5 назад. Тогда очень многие знакомые юристы, экономисты, филологи и журналисты стали вкатываться один за другим.
>Тогда очень многие знакомые юристы, экономисты, филологи и >журналисты стали вкатываться один за другим за баблом
Звучит отвратительно ...
и жутко ._. Реально вот...
Только смежники, там сидят деды предпенсионного возраста, вкатившиеся ещё в те времена, новичков не берут. Романтики на самом деле никакой, один говнокод, который и не развивают даже, а просто поддерживают, чтобы продолжал работать. Хотя та, был одно время восторг от забытых технологий предков.
У самих легаси 2006 года, получилось как ответвление более древней системы, написанной в 90-х. Там и от джавы были только обёртки над веб-сервисами с RPC, вся логика была на PL/SQL, никакой веб-разработки, одни десктопные клиенты на плюсах, делфи и вижуалбейсике. Сейчас уже почти всё переписали на джаву, но с древнего десктопного клиента так и не слезли.
1. Не должно, но лучше просто активируй триалки.
2. Как хочешь.
3. Как хочешь.
4. Это заметно, этап отбора через тухлодырую хр не пройдёшь.
К чему ты вообще высрал это?
Нашел на что порваться. Лишний раз энтер жмакнуть не судьба? Эта ссаная строчка - самое малое из говнищ идейки. У них до сих пор переименование и удаление модулей в проекте не работает нихуя, а ты на какую то строчку бомбишь.
> Сделать фасад,в который собирать все данные и раскидывать по сервисам сохранения
Ну конечно. Принимаешь одну родительскую DTO-ху с инфой о юзере и вложенными DTO-хами с документами, на уровне сервисов/DAO просто распихиваешь всё по таблицам.
> заставить пользователя заполнить все эти документы и вручную передовать айдишники при создании записи о сотруднике?
Сам потом пожалеешь об этом. Это бесконтрольный нетранзакционный процесс, клиенту надо будет слать несколько запросов с риском, что что-то на полпути пойдёт не так, и надо будет всё откатывать вручную или смириться с тем, что в БД будет копиться мусор. Да и очень сложно уследить за хитрыми пользователями, которые подставят чужие ID и привяжут документы другим пользователям.
Понял спасибо,были сомнения не считается ли говнокодом хуячить одну мега дтошку и потом разбирать на сущности
Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
com.intellij.diagnostic.PluginException: Fatal error initializing '
com.github.kennedyoliveira.ultimatepastebin.component.UltimatePasteBin
' [Plugin: com.github.kennedyoliveira.ultimatepastebin]
Чё делать в таком случае? Я даже удалить плагин не могу.
Сносить идею, накатывать новую.
class Student {
int ticket;
String firstname;
String lastname ;
int studing;
int math;
int economic;
int lang ;
String course ;
Student (int t1 , String firstname1 , String lastname1 , int studing1 , int math1 , int eco1 , int lang1, String course1 ) {
int ticket = t1 ;
String firstname = firstname1 ;
String lastname = lastname1 ;
int studing = studing1 ;
int math = math1 ;
int economic = eco1 ;
int lang = lang1 ;
String course = course1;
}
Student (int t2 , String firstname2 , String lastname2 ,String course2 ) {
this (t2 , firstname2 , lastname2 , 0, 0 , 0, 0, course2 ) ;
}
}
public class StudentTest {
public static void main(String[] args ) {
Student student1 = new Student (1 , "petr" , "iriiri" , 45 , 5, 5 , 8, "hhjL" );
Student student2 = new Student (2 , "ivan", "kokokoko" , 0, 0, 0, 0 , "literatura") ;
System.out.println(student2.firstname) ;
}
}
Почему компилятор вдаёт null ? когда должен выдавать ivan.
компилятор также не выдаёт никакой ошибки ю нихуя не понятно
class Student {
int ticket;
String firstname;
String lastname ;
int studing;
int math;
int economic;
int lang ;
String course ;
Student (int t1 , String firstname1 , String lastname1 , int studing1 , int math1 , int eco1 , int lang1, String course1 ) {
int ticket = t1 ;
String firstname = firstname1 ;
String lastname = lastname1 ;
int studing = studing1 ;
int math = math1 ;
int economic = eco1 ;
int lang = lang1 ;
String course = course1;
}
Student (int t2 , String firstname2 , String lastname2 ,String course2 ) {
this (t2 , firstname2 , lastname2 , 0, 0 , 0, 0, course2 ) ;
}
}
public class StudentTest {
public static void main(String[] args ) {
Student student1 = new Student (1 , "petr" , "iriiri" , 45 , 5, 5 , 8, "hhjL" );
Student student2 = new Student (2 , "ivan", "kokokoko" , 0, 0, 0, 0 , "literatura") ;
System.out.println(student2.firstname) ;
}
}
Почему компилятор вдаёт null ? когда должен выдавать ivan.
компилятор также не выдаёт никакой ошибки ю нихуя не понятно
Вообще не сейм. Вкатился в джаву, потому что не хочу на фронт.
Правда не три года, а полтора.
Хотел петик написать, чтобы потрогать кое-какие технологии на джаве. Но потом понял, что нормальному пету нужен фронт, а я пиздец как его не хочу писать.
>в европе
Правда, что в европе джава это не второй язык на беке, после пхп, как в рф? Тут кто-то приносил, что джаву и шарпы и нода и питон обгоняют.
bump
Как организовать лучше ветки в учёбном репозитории гита?
У меня два источника задачек(курсы/книги) которые я решаю и хочу закидывать в две разные папки в один реп.. Все просто скидывать в мейн? Или для каждой папки создать свою ветку, а потом, когда все задачки решу, слить в мейн? Как правильнее или лучше не заморачиваться?
мастер - то что сейчас на БОЕВОМ сервере
девелоп - главная ветка разработки
release/1.0 - релизы
feature/..
bugfix/... - ветки по таскам
Так я и хотел именно что-то такое и сделать. На с 3-4 сервиса, с кафкой, дискавери сервисом, апи гейтвеем, секурити провайдером, метриками в прометеусе, логами в эластике, трейсами в зипкине и распределенными кешами в редисе, потом кубер подрубить. Но с фронтом на сваггере это уныло очень. Нужно хотя бы пару табличек, три кнопочки и формочка. И с этого надо начинать.
Наверно начну и без фронта, как засяду за книжку по спринг секурити.
Так я и хотел именно что-то такое и сделать. На с 3-4 сервиса, с кафкой, дискавери сервисом, апи гейтвеем, секурити провайдером, метриками в прометеусе, логами в эластике, трейсами в зипкине и распределенными кешами в редисе, потом кубер подрубить. Но с фронтом на сваггере это уныло очень. Нужно хотя бы пару табличек, три кнопочки и формочка. И с этого надо начинать.
Наверно начну и без фронта, как засяду за книжку по спринг секурити.
Понятно. Значит непринципиально т-к. решённую задачу можно как "боевую". Но чисто ради посмотреть как работает/попрактиковаться, можно считать, что решённой задачей считается прохождение всей книги.
Думал мб там с коммитами какая путаница
Мастер - прод ветка. Там рабочий и протестированный код.
Дев - ветка разработки там код тоже рабочий, но не протестированный и возможны баги.
Некоторые шизы вроде этого >>594525 угорают по гитфлоу, остальные просто делают ветку от дева на каждую фичу и вливают ее в дев.
На учебном можешь оставить мастер, делать отдельные ветки на фичу и мержить их в мастер. Тогда и CI себе настроишь минимальный, и ебаться с ветками не придется.
>Student (int t1 , String firstname1 , String lastname1 , int studing1 , int math1 , int eco1 , int lang1, String course1 ) {
>
>int ticket = t1 ;
>String firstname = firstname1 ;
>String lastname = lastname1 ;
>int studing = studing1 ;
>int math = math1 ;
>int economic = eco1 ;
>int lang = lang1 ;
>String course = course1;
>}
Потому что ты в конструкторе наобьявлял бессмысленных локальных переменных, а в аттрибуты класса нихуя не присвоил. Переписывай.
В пет-проекте ничего не является обязательным.
Я пару раз в предыдущих проектах написал и забил, в новых петах скипаю написание этих тестов унылых, пиздец можно со скуки сдохнуть пока этим занимаешься. На каждый метод по несколько сценариев, умножить это на количество классов, потом еще апишку протестить, базу и это минимум, пиздец короче.
Я другой анон
Для пета который будешь демонстрировать они нужны, хотя бы для виду. Чтоб показать что хуе-мое чистый код, идеальная архитектура.
На реальном проекте то конечно похуй на них - только если заставляют писать. Да и то я ебал все кейсы покрывать - 100% покрытие есть и ладно, дальше пускай тестировщики ебутся и все проверяют.
С таким отношением только Эклипс!
Какие у меня шансы?
Java Core,
PostgreSQL,
HIbernate
Spring ( MVC, Boot ) - Security в процессе, REST еще не начал.
Что еще надо обязательно выдрочить, чтоб на собес идти?
Java 8-17 (Collections, Stream API, Concurrent)
Maven/Gradle
JUnit, Mockito
Git
SQL
JDBC
POSTGRES
JDBC Template
Lombok
Hibernate
DB Migration (Liquibase, Flyway)
Spring Framework (Core, MVC, Boot, Data, Security (oAuth2), Test, Validation, AOP)
OpenAPI (API First)
Docker (Testcontainers)
K8ts
MB (Kafka)
И это я только технологии перечислил, еще надо знать паттерны и алгоритмы (хотя бы на базовом уровне).
Еще в обязательных забыл Jackson
А в найс ту хэв добавил Jooq и MapStruct
если че, дополняйте список аноны, может что-то забыл вписать
Ну меня как-то спрашивали про то, как он работает под капотом и некоторые редкоиспользуемые аннотации
Еще один раз спросили как его тестировать, лол
Устройство сетей и монга
Ну его можно и не выделять, это основная библиотека с которой работаешь при работе с Spring MVC.
Ну и по моему для сваггера скорее не api-first, а springdoc-openapi. api-first это типо круто и хороший тон, но с помощью аннотаций к готовому контроллеру сваггер прикручивают чаще.
Ну и кубер нужен не везде.
Чат гпт ответил.
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long unixTime = calendar.getTimeInMillis() / 1000;
System.out.println("Unix time of today at 5 o'clock: " + unixTime);
Пиздец, я же с этой хуйнёй совсем думать разучусь.
>с помощью аннотаций к готовому контроллеру сваггер прикручивают чаще
Не спорю, но я сам сталкивался с тем, что меня спрашивали мол делал ли ты такую штуку и в чем преимущества такого подхода
>кубер нужен не везде
Ну и не требуется знать его на уровне девопса и уметь по памяти написать любой манифест, я думаю достаточно посмотреть курс от адвита на ютубе и задеплоить свой пет в кубер хотя бы локально.
Хотя для меня интереснее было в клауде, у мэила вроде неплохой клауд, только там регистрация 500р, у яндекса вообще интерфейс не понравился и гайды хуевые хуй знает для кого делались, но там регистрация бесплатная и он в целом дешевле.
Зачем он вообще нужен? Он только тормозит и баги всякие из-за него. Неужели так сложно сгенерировать геттеры и сеттеры!?
>>595574
Ну кубер я бы из обязательного убрал, на совсем последнем месте поставил в твоем списке. И если нужны хотя бы поверхностные знания кубера, значит нужно еще понимание вообще микросервисной архитектуры и ее паттерны(service discovery, circuit breaker, распределенные транзации) - ну и пользоваться всякими штуками - например в api-gateway эндпоинты знать как и зачем прокидывать.
Spring Security может или не быть(вместо него какой-нибудь keycloak) или он есть, но к нему новичка не допустят. А если на тестовом будет авторизация, то хватит и http basic.
Concurrent в жава-коре не мастхевная тема, много где не спрашивают. Мастхев к коллекциям и стримам это иерархия исключений.
JDBC Template это тонкая обертка над jdbc, я бы не стал отдельно выделять.
Ломбок дает тот сахар, который не хотят дать разработчики языка. Как видишь, раз ломбок так популярен, значит спрос на этот сахар имеется.
>вместо него какой-нибудь keycloak
Так для того, чтоб понять как там все работает, надо бы сначала с ауфом в спринге посидеть и разобраться, настроить не дефолтный аусентикейшн провайдер, вк например, там ебли достаточно будет, чтоб начать в этом немного шарить. Я кейклок тоже вертел, но вот именно его можно опустить, он реально ненужон вкатышу. Ну и жвт простейший настроить будет не лишним перед всем вышеперечисленным для хоть какого-то понимания основных принципов.
На счет кубера не согласен, на поверхностном уровне лучше знать, как и то, что ты написал далее, давно уже мода на микросервисы, не стоит отсеивать немалую часть проектов, потому что лень почитать книгу по ним и покрутить кубер месяц максимум.
Что вообще про секьюрити нужно знать?
Тестировать тул?
Вау.
Ну что тут сказать... Если сами джависты тулу не доверяют, это говорит многое о его качестве.
Ну конечно совсем лишним не будет, но это с одной стороны будет увеличивать time to vkat. А с другой стороны отнимет время у выучивания наизусть устройства хешмапы, принципов ооп, уровней изоляции транзакций, жизненных циклов бина и энтити хибера. И у написания петов.
Челика без опыта по куберу и микросервисным паттернам гонять не будут, даже если они на проекте во все поля. А вот по ооп в джаве и гоф-патернам - вполне.
Твой список скорее для собеседующегося на мидла, который до этого на легаси сидел или писал бек на другом языке.
Ну много же челов ноют про баги при использовании лобка, может у тех накипело.
Ну или я вопрос не так понял, хотя вроде переспрашивал.
Или мб вообще вопрос с подвохом.
ответом на него был харчок в камеру и дисконект из конфы, в последствии дают оффер сразу на мидла
>ответом на него был харчок в камеру и дисконект из конфы, в последствии дают оффер сразу на мидла
Как было на самом деле: ты промямлил "эээ ну а зачем тестировать ломбок? эээ ну не знаю ээээ" и тебе пообещали перезвонить.
Блядь чел, если тебе не лень поднимать всю описанную тобой парашу ради круда, то не найти силенок накидать простейший фронт - ну это хуй знает кем надо быть.
Ну да, я имел ввиду, каким был правильный
Не, ну ты понимаешь курьез ситуации? Тестировать. Тул. Внешний. Не свой. Тул, которому ты делегируешь поставленную перед ним задачу. Но при этом не можешь ему доверять, из-за чего тратишь время и тестируешь его высер. Но в то же время не можешь и выкинуть этот негодный тул потому что "ну еба, вы че, этож ломбок, ну как это можно - без ломбока в 2023м, пацаны ж засмеют".
Ебаный в рот, как же я порой кринжую с айтишки.
А почему ненавистники сахара не пишут на голом си?
Лобок есть в большинстве проектов на жабе. Это просто данность. И это не такой уж сахарный сахар, как в котлине.
Потому что это петушиное недоработкосодержащее поделие "Язык программирования".
Потому что Си - не ООП язык и сложно писать большие программы, а также не кроссплатформенный, нет сборщика мусора и безопасности при работе с памятью.
>>595991
Странное сравнение вообще, может и сайты на ассемблере писать?
Си и жаба - языки для разных областей применений.
Си хорош для низкоуровневых вещей, для небольших библиотек, которые должны быть быстрыми, для системного программирования, вроде WinAPI или системных вызовов POSIX.
На жабе пишут крупные системы, где важнее поддерживаемый код, чем скорость.
Когда необходимо, си легко подключается к жабе через JNI.
Вот C++ непонятно зачем нужен - никто его толком не знает, по сравнению с сишкой много оверхеда, а по сравнению с жабой/шарпом недостаточно прост.
Зачем убогий котлин, если есть Scala со всем необходимым?
В общих чертах круды умеешь писать - значит годен на ждуна. Дальше зависит от степени ебанутости собеседующего и качества конкурентов. Чем больше ты знаешь - тем выше шансы.
Вместо изучения новых слов, лучше углуби знания в перечисленном тобой. А то окажется что твой постгрес - это селект с джойном написать, а спринг - 3 аннотации поставить.
Какой смысл об этом спрашивать на двощах? Сходи на собес, да узнай, будь мужиком блять.
Те щас один портянку по рофлу выкатит такую что охуеешь учить, второй скажет "намана, бля" и ты потом все равно проебешься и разочаруешься.
Еще можно добавить grpc и soap сервисы сюда же, но это опционально уже, но повысят шансы прилично.
Еще периодически спрашивают про планировщик запросов, я сам его скипнул пока, так что хз, какой там обьем инфы надо знать, может аноны, которые с этим знакомы подскажут
Active Record что ли???
кеш
Ты безусловно прав.
Если чувствуешь уверенность, что понял основные принципы и можешь без особых трудностей закончить. Смысл написания такого пет-проекта в том, чтобы закрепить знания на практике, и не более.
Значит FetchType.LAZY. Загружать связанные сущности в тот момент, когда обратишься к списку, а не сразу при загрузке основной сущности.
А вообще ебать,я так подумал,я же могу всегда держать специальность нулевой,не запрашивать ее у пользователя и тупо брать с военника,все равно в базу за ним лезть. Че скажете?
Что понимается под специальностью? Только военно-учётная специальность, или может быть учебная или какая-нибудь рабочая в зависимости от должности? Может ли быть специальность при отсутствии военного билета? В любом случае ссылки могут быть разные, ещё и специальностей может быть несколько, может же человек два образования получить (хотя насчёт военно-учётной хз, может ли их быть несколько), но для такого случая лучше сделать таблицу связок (многие ко многим) с ID сотрудника и ID специальности.
Скажем, что нужно больше инфы о контексте. Что конкретно разрабатываешь, какую задачу твоя система будет решать? Пока нет ответа на этот вопрос, любые предположения - твои и анонов - будут гаданием на кофейной гуще.
Любая модель данных всегда строится от бизнеса. Нефункциональные требоваения, вроде производительности выборок, имеют определенную свою роль в моделировании, но без биснес-контекста нет смысла даже начинать рассуждать.
Гражданская специальность. Табличка с айди и названием пока.О ее отсутствии не подумал. Будет null по дефолту
>Но тогда возникает проблема что у сотрудника может быть ссылка на одну специальность,а в военном билете ссылка на другую. Как бы вы разрешили эту ситуацию?
Если ты уже постановкой вопроса определил условие своей задачи, и специальность сотрудника всегда должна быть равна специальности в военном билете, то в тот момент когда ты специальность решил продублировать у сотрудника, ты получил не до конца нормализованные данные. Согласно правилам нормализации, дублирование данных не допускается, твердо и четко. Как результат, твоя идея дублировать специальность в таблице сотрудников не имеет смысла с точки зрения реляционной модели. Специальность по сотруднику ты всегда можешь получить через селект с джойном к военным билетам без всякого дублирования. В теории.
На практике, иногда от нормализации отходят в угоду производительности, а консистентность (твой констрейнт, что специальность сотрудника должна быть равна специальности в военном билете) гарантируют иными средствами (или забивают и не гарантирують вовсе). Но денормализацию делают когда налицо пиздец с производительностью. Заранее ее делать - плохая идея.
Ну так коли у тебя есть "военник" с ВУС, может имеет смысл пойти в том же направлении, и добавить "диплом" с гражданской специальностью?
В любом случае,
>Я считаю что нелогично хранить ссылку на специальность только в военном билете и подумываю добавить ссылку на специальность напрямую в сотрудника
...пока что в этой идее не просматривается ничего логичного.
Бля точняк, гражданская специальность и военная это ведь не одно и то же. Короче думаю да,добавлю еще одну сущность отдельно для военной специальности
По всякому.
>На фронте ведь все равно дернут эндпоинт и им прилетит сущность с айди,откуда они сами по имени в реквест воткнут айдишник
Лично я думаю что терпимо, хотя знаю мнение что айдишник сущностей в БД через АПИ палить некошерно, и нужно вдовесок к первичному плодить еще и суррогатный ключ.
>Или нужно принимать что-то более человекочитаемое? Например имея сущности книги и авторы
С человекочитаемыми ключами есть одна засада: рано или поздно этот человекочитаемый ключ тебе придется использовать в запросах к БД. И может так оказаться, что индекс на этот человекочитаемый аттриут будет отрабатывать в разы говенней или занимать в разы больше места, чем на какой нить числовой айдишник. Проебешь производительность.
Плюс - никто ж тебе не гарантирует что этот человекочитаемый аттрибут у тебя не изменят из под ног в какой нить параллельной транзакции.
Вот и я также подумал,во первых доп обработку этой хуйни делать,во вторых хуй знает сколько по этому имени будет результатов,в третьих эти пидоры и так нихуя там не делают,аниме смотрят и капчу двачуют суки
Смотря как клиент эти данные использует.
Если дочерние сущности клиенту нужны сразу, а не при нажатии на какую-нибудь кнопку, я бы их сразу в ДТО передал. А то клиент при открытии страницы будет отправлять кучу запросов, в итоге и страница будет медленнее грузиться, и нагрузка на сервер возрастёт. Ещё можно передавать не всю дочернюю сущность, а добавить в ДТО нужные поля и заполнять их в конвертере при формировании ответа, к примеру, не класть AuthorDTO в BookDTO, а просто добавить в BookDTO поля authorId (для последующих запросов при нажатии на кнопки) и authorName (для отображения имени автора рядом с книгой). Но это только один из вариантов.
Бывает
1. В энтити 50 полей, а нужно только три
2. Несколько разных потребителей - веб-клиент, мобилка, интеграции с другими системами.
Пришел на проект, а там дтошки гоняются туда-сюда. И ладно на выход просто передаются id связанных сущностей, а вот на вход прилетают эти же id и там в маппере начинается анал-карнавал с обращением в базу по каждому id, чтобы собрать объект воедино со всеми его полями/объектами. Это вообще норм? Как такую проблему решают?
Это норма
Чееееееееееел.... Никто на новом проекте не будет использовать хубирнейт. Сейчас эра микросервисов и клауд-нейтив приложений
Чтобы было кому поддерживать легаси.
Книг нет, поэтому приходится курсы смотреть.
Причем тут гит вообще? Я про неперенесённую на новую строку скобку с точкой с запятой.
>норм?
Ебанистика какая то, как по мне. Звучит как та ситуация, где программисту хотелось срать монадами во что бы то ни стало, а на базу данных ему было похуй.
>как решают?
Грамотным построением sql запросов.
а че в гит блейм зайти посмотреть нельзя??? и спросить у автора по почте???
что значит надстройка? ты хочешь сказать spring jpa использует под капотом hibernate?
сладкий шлебушек для автогенерации запросов по названию методов
getOrderByIdSortedByName - и оно это автоматом преобразует в hql
зумеры от этого прутся, по мне это чушь и говно
т.е. если я подключаю spring jpa, мне hibernate не надо подключать? а зачем тогда hibernate нужен?
я на петушарпе не пишу, я пишу на ява
Заебали со своей мантрой "магия". Никакой магии не существует. Существует только работающий код и не работающий.
спринг это элементарное управление зависимостями и всё. Можно и на фабриках сделать, ничего страшного.
А что это хуйня сгенерирует - хуй его знает
Что написано в названии метода - то и сгенерирует.
обфусцированный, и то только если специально настроишь логирование
>спринг это элементарное управление зависимостями и всё
Нет. На изучение всех особенных случаев и кишочков уйдет несколько лет. Если ты не понимаешь глубоко как работает он под капотом и как инициализирует бины, то тебя даже близко нельзя подпускать к разработке на спрэнг фримверке.
Я надеюсь, твое кресло когда нибудь сломается и ты повторишь судьбу сидящего на кресле с пикрила.
Шарпоблядь обнаружена.
)));
Ураааа
Spring Data JPA автоматически конфигурирует и настраивает JPA за тебя.
Писал как-то проект без Spring (десктопное JavaFX приложение), так заебался просто подключать там JPA, миграции Flyway просто не брались.
В Spring просто прописал в пропертях пару строк, и все работает.
>>596468
Spring не просто так используется - сравни сколько кода получается с ним, и сколько без него.
Можно, конечно, REST сервисы писать чисто на Empedded Jetty + Jersey JAX-RS, самому настраивать Hibernate и т.д.
Но заебешься с этим всем.
Для мазохистов-пердоликов существует C++, а в Java должно быть все просто и понятно, чтобы было легко поддерживать.
Пошел нахуй
- - - - 3. Аноны, есть две @Entity, скажем Person, с полями name и age, Payment с полями employeeName и amount. Как мне через JPA получить третий объект, представляющий джоин этих двух энтити?
Заинжекти ссылки на соответствующие репозитории в сервисный бин и используй булеву алгебру над элементами множеств для объединения, пересечения, вычитания и дополнения. Всякие предикаты помимо фильтрации по значениям сделают обходы коллекций допустимыми для лямбд и стрим апи. В теории можно сервис данных, выступающий издателем в реактивных взаимоотношениях с его клиентом запилить с целью перейти от транзакционной конкурентности к реактивности. В теории бля меня, находязегося в стадии обучения.
Это копия, сохраненная 30 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.